Add perltidy to pre-commit linters 82/111382/4 master
authorguillaume.lambert <guillaume.lambert@orange.com>
Sun, 14 Apr 2024 18:36:35 +0000 (20:36 +0200)
committerGuillaume Lambert <guillaume.lambert@orange.com>
Wed, 17 Apr 2024 07:16:55 +0000 (07:16 +0000)
Signed-off-by: guillaume.lambert <guillaume.lambert@orange.com>
Change-Id: Ie20eb4bc885383deb304363eb8053f8161b3ada1

840 files changed:
.gitignore
.pre-commit-config.yaml
api/pom.xml
api/src/main/yang/gnpy-network-topology@2022-06-15.yang [moved from api/src/main/yang/gnpy-network-topology@2022-02-21.yang with 97% similarity]
api/src/main/yang/gnpy-path-computation-simplified@2022-06-15.yang [moved from api/src/main/yang/gnpy-path-computation-simplified@2022-02-21.yang with 98% similarity]
api/src/main/yang/nbi-notifications@2023-07-28.yang [moved from api/src/main/yang/nbi-notifications@2021-08-13.yang with 57% similarity]
api/src/main/yang/service_path/transportpce-common-service-path-types@2022-01-18.yang
api/src/main/yang/service_path/transportpce-common-types@2023-05-01.yang [moved from api/src/main/yang/service_path/transportpce-common-types@2021-09-30.yang with 85% similarity]
api/src/main/yang/service_path/transportpce-device-renderer@2021-10-04.yang
api/src/main/yang/service_path/transportpce-pathDescription@2023-05-01.yang [moved from api/src/main/yang/service_path/transportpce-pathDescription@2021-07-05.yang with 80% similarity]
api/src/main/yang/service_path/transportpce-pce@2024-02-05.yang [moved from api/src/main/yang/service_path/transportpce-pce@2022-01-18.yang with 77% similarity]
api/src/main/yang/tapi@2023-07-28.yang [moved from api/src/main/yang/tapi@2018-09-28.yang with 90% similarity]
api/src/main/yang/transportpce-networkutils@2022-06-30.yang [moved from api/src/main/yang/transportpce-networkutils@2017-08-18.yang with 57% similarity]
api/src/main/yang/transportpce-portmapping@2023-12-21.yang [moved from api/src/main/yang/transportpce-portmapping@2022-03-16.yang with 93% similarity]
api/src/main/yang/transportpce-stub@2023-02-28.yang [new file with mode: 0644]
api/src/main/yang/transportpce-tapinetworkutils@2023-07-28.yang [moved from api/src/main/yang/transportpce-tapinetworkutils@2021-04-08.yang with 94% similarity]
artifacts/pom.xml [new file with mode: 0644]
common/pom.xml
common/src/main/java/org/opendaylight/transportpce/common/InstanceIdentifiers.java
common/src/main/java/org/opendaylight/transportpce/common/StringConstants.java
common/src/main/java/org/opendaylight/transportpce/common/catalog/CatalogConstant.java [new file with mode: 0644]
common/src/main/java/org/opendaylight/transportpce/common/catalog/CatalogUtils.java [new file with mode: 0644]
common/src/main/java/org/opendaylight/transportpce/common/catalog/PenaltiesComparator.java [new file with mode: 0644]
common/src/main/java/org/opendaylight/transportpce/common/converter/JsonStringConverter.java [changed mode: 0644->0755]
common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnect.java
common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImpl.java
common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImpl121.java
common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImpl221.java
common/src/main/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImpl710.java
common/src/main/java/org/opendaylight/transportpce/common/device/DeviceTransactionManagerImpl.java
common/src/main/java/org/opendaylight/transportpce/common/fixedflex/GridUtils.java
common/src/main/java/org/opendaylight/transportpce/common/mapping/MappingUtils.java
common/src/main/java/org/opendaylight/transportpce/common/mapping/MappingUtilsImpl.java
common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMapping.java
common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingImpl.java
common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion121.java
common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion221.java
common/src/main/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion710.java
common/src/main/java/org/opendaylight/transportpce/common/mapping/SortPort121ByName.java
common/src/main/java/org/opendaylight/transportpce/common/mapping/SortPort221ByName.java
common/src/main/java/org/opendaylight/transportpce/common/mapping/SortPort710ByName.java
common/src/main/java/org/opendaylight/transportpce/common/network/NetworkTransactionImpl.java
common/src/main/java/org/opendaylight/transportpce/common/network/NetworkTransactionService.java
common/src/main/java/org/opendaylight/transportpce/common/network/RequestProcessor.java
common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfaceException.java
common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfacesImpl.java
common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfacesImpl121.java
common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfacesImpl221.java
common/src/main/java/org/opendaylight/transportpce/common/openroadminterfaces/OpenRoadmInterfacesImpl710.java
common/src/main/java/org/opendaylight/transportpce/common/service/ServiceTypes.java
common/src/main/resources/OSGI-INF/blueprint/common-blueprint.xml [deleted file]
common/src/test/java/org/opendaylight/transportpce/common/NodeIdPairTest.java
common/src/test/java/org/opendaylight/transportpce/common/catalog/CatalogUtilsTest.java [new file with mode: 0644]
common/src/test/java/org/opendaylight/transportpce/common/converter/JsonStringConverterTest.java
common/src/test/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImpl121Test.java
common/src/test/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImpl221Test.java
common/src/test/java/org/opendaylight/transportpce/common/crossconnect/CrossConnectImplTest.java
common/src/test/java/org/opendaylight/transportpce/common/device/DeviceTransactionManagerTest.java
common/src/test/java/org/opendaylight/transportpce/common/fixedflex/GridUtilsTest.java
common/src/test/java/org/opendaylight/transportpce/common/mapping/MappingUtilsImplTest.java
common/src/test/java/org/opendaylight/transportpce/common/mapping/PortMappingImplTest.java
common/src/test/java/org/opendaylight/transportpce/common/mapping/PortMappingVersion121Test.java
common/src/test/java/org/opendaylight/transportpce/common/mapping/SortPort121ByNameTest.java
common/src/test/java/org/opendaylight/transportpce/common/mapping/SortPort221ByNameTest.java
common/src/test/java/org/opendaylight/transportpce/common/service/ServiceTypeTest.java
common/src/test/resources/apidocCatalog12_0-OptSpecV5_1.json [new file with mode: 0644]
common/src/test/resources/expected_string.json
common/src/test/resources/gnpy_request.json
debug_tools/netconf_TCP_SSH_hijackingproxy.pl
debug_tools/netconf_terminal.pl
dmaap-client/pom.xml
dmaap-client/src/main/java/org/opendaylight/transportpce/dmaap/client/impl/DmaapClientProvider.java
dmaap-client/src/main/java/org/opendaylight/transportpce/dmaap/client/listener/NbiNotificationsHandler.java [moved from dmaap-client/src/main/java/org/opendaylight/transportpce/dmaap/client/listener/NbiNotificationsListenerImpl.java with 62% similarity]
dmaap-client/src/main/java/org/opendaylight/transportpce/dmaap/client/resource/EventsApi.java
dmaap-client/src/main/java/org/opendaylight/transportpce/dmaap/client/resource/config/LgxSerializer.java
dmaap-client/src/main/java/org/opendaylight/transportpce/dmaap/client/resource/config/PortSerializer.java
dmaap-client/src/main/java/org/opendaylight/transportpce/dmaap/client/resource/config/PublishNotificationProcessServiceModule.java
dmaap-client/src/main/java/org/opendaylight/transportpce/dmaap/client/resource/config/PublishNotificationProcessServiceSerializer.java
dmaap-client/src/main/java/org/opendaylight/transportpce/dmaap/client/resource/config/RxDirectionSerializer.java
dmaap-client/src/main/java/org/opendaylight/transportpce/dmaap/client/resource/config/ServiceAEndSerializer.java
dmaap-client/src/main/java/org/opendaylight/transportpce/dmaap/client/resource/config/ServiceZEndSerializer.java
dmaap-client/src/main/java/org/opendaylight/transportpce/dmaap/client/resource/config/TxDirectionSerializer.java
dmaap-client/src/main/resources/OSGI-INF/blueprint/dmaap-blueprint.xml [deleted file]
dmaap-client/src/main/resources/org.opendaylight.transportpce.dmaap.cfg [moved from features/odl-transportpce-dmaap-client/src/main/resources/org.opendaylight.transportpce.dmaap.cfg with 100% similarity]
dmaap-client/src/test/java/org/opendaylight/transportpce/dmaap/client/impl/DmaapClientProviderTest.java
dmaap-client/src/test/java/org/opendaylight/transportpce/dmaap/client/listener/NbiNotificationsHandlerTest.java [moved from dmaap-client/src/test/java/org/opendaylight/transportpce/dmaap/client/listener/NbiNotificationsListenerImplTest.java with 79% similarity]
docs/conf.py
docs/conf.yaml
docs/developer-guide.rst
docs/images/TransportPCE-Diagram-Sulfur.jpg [new file with mode: 0644]
docs/images/TransportPCE-tapi-nbinotifications-service-example.jpg [new file with mode: 0644]
docs/tox-guide.rst
docs/user-guide.rst
features/features-transportpce/pom.xml [new file with mode: 0644]
features/odl-transportpce-dmaap-client/pom.xml
features/odl-transportpce-dmaap-client/src/main/feature/feature.xml
features/odl-transportpce-inventory/pom.xml
features/odl-transportpce-inventory/src/main/feature/feature.xml
features/odl-transportpce-nbinotifications/pom.xml
features/odl-transportpce-nbinotifications/src/main/feature/feature.xml
features/odl-transportpce-swagger/pom.xml [deleted file]
features/odl-transportpce-tapi/pom.xml
features/odl-transportpce/pom.xml
features/odl-transportpce/src/main/feature/feature.xml
features/pom.xml
inventory/pom.xml
inventory/src/main/java/org/opendaylight/transportpce/inventory/DeviceInventory.java
inventory/src/main/java/org/opendaylight/transportpce/inventory/INode.java
inventory/src/main/java/org/opendaylight/transportpce/inventory/INode121.java
inventory/src/main/java/org/opendaylight/transportpce/inventory/INode221.java
inventory/src/main/java/org/opendaylight/transportpce/inventory/ListenerProvider.java
inventory/src/main/java/org/opendaylight/transportpce/inventory/listener/ClliNetworkChangeListener.java
inventory/src/main/java/org/opendaylight/transportpce/inventory/listener/DeviceConfigListener.java
inventory/src/main/java/org/opendaylight/transportpce/inventory/listener/DeviceListener.java
inventory/src/main/java/org/opendaylight/transportpce/inventory/listener/OverlayNetworkChangeListener.java
inventory/src/main/java/org/opendaylight/transportpce/inventory/listener/UnderlayNetworkChangeListener.java
inventory/src/main/resources/OSGI-INF/blueprint/inventory-blueprint.xml [deleted file]
inventory/src/main/resources/org.opendaylight.transportpce.job.cfg [moved from features/odl-transportpce-inventory/src/main/resources/org.opendaylight.transportpce.job.cfg with 100% similarity]
inventory/src/main/resources/org.ops4j.datasource-transporpce.cfg [moved from features/odl-transportpce-inventory/src/main/resources/org.ops4j.datasource-transporpce.cfg with 76% similarity]
karaf/pom.xml
karaf/src/main/assembly/ressources/post_install_for_tests.sh
lighty/build.sh
lighty/build_lighty_core.sh
lighty/pom.xml
lighty/src/main/assembly/resources/config_template.json
lighty/src/main/java/io/lighty/controllers/tpce/Main.java
lighty/src/main/java/io/lighty/controllers/tpce/exception/TechnicalException.java
lighty/src/main/java/io/lighty/controllers/tpce/module/TransportPCEImpl.java
lighty/src/main/java/io/lighty/controllers/tpce/utils/TPCEUtils.java
lighty/src/test/java/io/lighty/controllers/tpce/MaintTest.java
lighty/src/test/resources/config.json
nbinotifications/pom.xml
nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/consumer/Subscriber.java
nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/NbiNotificationsImpl.java [deleted file]
nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/NbiNotificationsProvider.java
nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/CreateNotificationSubscriptionServiceImpl.java [new file with mode: 0644]
nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/DeleteNotificationSubscriptionServiceImpl.java [new file with mode: 0644]
nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/GetNotificationListImpl.java [new file with mode: 0644]
nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/GetNotificationSubscriptionServiceDetailsImpl.java [new file with mode: 0644]
nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/GetNotificationSubscriptionServiceListImpl.java [new file with mode: 0644]
nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/GetNotificationsAlarmServiceImpl.java [new file with mode: 0644]
nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/GetNotificationsProcessServiceImpl.java [new file with mode: 0644]
nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/GetSupportedNotificationTypesImpl.java [new file with mode: 0644]
nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/listener/NbiNotificationsHandler.java [new file with mode: 0644]
nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/listener/NbiNotificationsListenerImpl.java [deleted file]
nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/serialization/NotificationAlarmServiceDeserializer.java
nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/serialization/NotificationAlarmServiceSerializer.java
nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/serialization/NotificationServiceDeserializer.java
nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/serialization/NotificationServiceSerializer.java
nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/serialization/TapiNotificationDeserializer.java [new file with mode: 0644]
nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/serialization/TapiNotificationSerializer.java [new file with mode: 0644]
nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/utils/NbiNotificationsUtils.java
nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/utils/TopicManager.java [new file with mode: 0644]
nbinotifications/src/main/resources/OSGI-INF/blueprint/nobinotifications-blueprint.xml [deleted file]
nbinotifications/src/main/resources/org.opendaylight.transportpce.nbinotifications.cfg [moved from features/odl-transportpce-nbinotifications/src/main/resources/org.opendaylight.transportpce.nbinotifications.cfg with 100% similarity]
nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/consumer/SubscriberTest.java
nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/impl/NbiNotificationsImplTest.java
nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/impl/NbiNotificationsProviderTest.java
nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/listener/NbiNotificationsHandlerTest.java [new file with mode: 0644]
nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/listener/NbiNotificationsListenerImplTest.java [deleted file]
nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/producer/PublisherTest.java
nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/serialization/NotificationAlarmServiceDeserializerTest.java
nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/serialization/NotificationAlarmServiceSerializerTest.java
nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/serialization/NotificationServiceDeserializerTest.java
nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/serialization/NotificationServiceSerializerTest.java
nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/serialization/NotificationTapiServiceDeserializerTest.java [new file with mode: 0644]
nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/serialization/NotificationTapiServiceSerializerTest.java [new file with mode: 0644]
nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/utils/NotificationServiceDataUtils.java
nbinotifications/src/test/resources/event.json
nbinotifications/src/test/resources/expected_event.json
nbinotifications/src/test/resources/expected_event_alarm_service.json
nbinotifications/src/test/resources/expected_tapi_event.json [new file with mode: 0755]
nbinotifications/src/test/resources/tapi_event.json [new file with mode: 0644]
networkmodel/pom.xml
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListener.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/NetworkModelProvider.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/NetworkUtilsImpl.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/OrdLink.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/R2RLinkDiscovery.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/Rdm2XpdrLink.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/dto/NodeRegistration.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/dto/OtnTopoNode.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/AlarmNotificationListener.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/AlarmNotificationListener221.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/AlarmNotificationListener710.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/DeOperationsListener.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/DeOperationsListener221.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/DeOperationsListener710.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/DeviceListener121.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/DeviceListener221.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/DeviceListener710.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/LldpListener.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/LldpListener221.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/LldpListener710.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/PortMappingListener.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/ServiceHandlerListener.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/TcaListener.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/TcaListener221.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/listeners/TcaListener710.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/FrequenciesService.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/FrequenciesServiceImpl.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelService.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/service/NetworkModelServiceImpl.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/ClliNetwork.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/LinkIdUtil.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmNetwork.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmOtnTopology.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopology.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/TopologyUtils.java
networkmodel/src/main/java/org/opendaylight/transportpce/networkmodel/util/TpceNetwork.java
networkmodel/src/main/resources/OSGI-INF/blueprint/networkmodel-blueprint.xml [deleted file]
networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/NetConfTopologyListenerTest.java
networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/NetworkModelProviderTest.java
networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/NetworkUtilsImplTest.java [new file with mode: 0644]
networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/listeners/DeviceListener121Test.java
networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/listeners/DeviceListener221Test.java
networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/listeners/DeviceListener710Test.java
networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/listeners/PortMappingListenerTest.java [new file with mode: 0644]
networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/service/FrequenciesServiceTest.java
networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/util/ClliNetworkTest.java
networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmNetworkTest.java
networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmOtnTopologyTest.java
networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/util/OpenRoadmTopologyTest.java
networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/util/TpceNetworkTest.java
networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/util/test/JsonUtil.java
networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/util/test/NetworkmodelTestUtil.java
networkmodel/src/test/resources/openroadm-topology.xml
networkmodel/src/test/resources/path_description.json
networkmodel/src/test/resources/portMapping.json
olm/pom.xml
olm/src/main/java/org/opendaylight/transportpce/olm/OlmPowerServiceRpcImpl.java
olm/src/main/java/org/opendaylight/transportpce/olm/OlmProvider.java [deleted file]
olm/src/main/java/org/opendaylight/transportpce/olm/power/PowerMgmtImpl.java
olm/src/main/java/org/opendaylight/transportpce/olm/power/PowerMgmtVersion121.java
olm/src/main/java/org/opendaylight/transportpce/olm/power/PowerMgmtVersion221.java
olm/src/main/java/org/opendaylight/transportpce/olm/power/PowerMgmtVersion710.java
olm/src/main/java/org/opendaylight/transportpce/olm/rpc/impl/CalculateSpanlossBaseImpl.java [new file with mode: 0644]
olm/src/main/java/org/opendaylight/transportpce/olm/rpc/impl/CalculateSpanlossCurrentImpl.java [new file with mode: 0644]
olm/src/main/java/org/opendaylight/transportpce/olm/rpc/impl/GetPmImpl.java [new file with mode: 0644]
olm/src/main/java/org/opendaylight/transportpce/olm/rpc/impl/ServicePowerResetImpl.java [new file with mode: 0644]
olm/src/main/java/org/opendaylight/transportpce/olm/rpc/impl/ServicePowerSetupImpl.java [new file with mode: 0644]
olm/src/main/java/org/opendaylight/transportpce/olm/rpc/impl/ServicePowerTurndownImpl.java [new file with mode: 0644]
olm/src/main/java/org/opendaylight/transportpce/olm/service/OlmPowerServiceImpl.java
olm/src/main/java/org/opendaylight/transportpce/olm/util/OlmUtils.java
olm/src/main/java/org/opendaylight/transportpce/olm/util/OlmUtils121.java
olm/src/main/java/org/opendaylight/transportpce/olm/util/OlmUtils221.java
olm/src/main/java/org/opendaylight/transportpce/olm/util/OlmUtils710.java
olm/src/main/resources/OSGI-INF/blueprint/olm-blueprint.xml [deleted file]
olm/src/main/resources/org.opendaylight.transportpce.cfg [moved from features/odl-transportpce/src/main/resources/org.opendaylight.transportpce.cfg with 100% similarity]
olm/src/test/java/org/opendaylight/transportpce/olm/OlmPowerServiceRpcImplTest.java
olm/src/test/java/org/opendaylight/transportpce/olm/power/PowerMgmtPowerMockTest.java [deleted file]
olm/src/test/java/org/opendaylight/transportpce/olm/power/PowerMgmtTest.java
olm/src/test/java/org/opendaylight/transportpce/olm/service/OlmPowerServiceImplSpanLossBaseTest.java
olm/src/test/java/org/opendaylight/transportpce/olm/service/OlmPowerServiceImplTest.java
olm/src/test/java/org/opendaylight/transportpce/olm/stub/MountPointServiceStub.java [deleted file]
olm/src/test/java/org/opendaylight/transportpce/olm/stub/MountPointStub.java [deleted file]
olm/src/test/java/org/opendaylight/transportpce/olm/stub/OlmServiceStub.java [deleted file]
olm/src/test/java/org/opendaylight/transportpce/olm/util/OlmPowerServiceRpcImplUtil.java
olm/src/test/java/org/opendaylight/transportpce/olm/util/OlmTransactionUtils.java
olm/src/test/java/org/opendaylight/transportpce/olm/util/OtsPmHolderTest.java
olm/src/test/java/org/opendaylight/transportpce/olm/util/TransactionUtils.java
ordmodels/common/pom.xml [deleted file]
ordmodels/common/src/main/resources/NOTICE [deleted file]
ordmodels/common/src/main/yang/org-openroadm-alarm@2016-10-14.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-alarm@2018-10-19.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-alarm@2020-05-29.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-alarm-pm-types@2019-11-29.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-amplifier-types@2018-11-30.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-amplifier-types@2019-11-29.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-attributes@2020-03-27.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-attributes@2021-09-24.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-equipment-types@2018-11-30.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-equipment-types@2019-11-29.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-link-types@2018-11-30.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-link-types@2019-11-29.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-node-types@2018-11-30.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-node-types@2019-11-29.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-node-types@2021-05-28.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-optical-channel-types@2018-11-30.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-optical-channel-types@2019-03-29.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-optical-channel-types@2020-05-29.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-optical-channel-types@2021-12-10.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-phy-codes@2021-05-28.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-state-types@2018-11-30.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-state-types@2019-11-29.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-types@2016-10-14.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-types@2017-09-29.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-types@2018-10-19.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-types@2018-11-30.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-types@2019-05-31.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-types@2020-05-29.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-common-types@2021-12-10.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-equipment-states-types@2016-10-14.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-equipment-states-types@2017-12-15.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-equipment-states-types@2018-11-30.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-equipment-states-types@2019-11-29.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-interfaces@2019-05-31.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-interfaces@2019-11-29.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-layerRate@2016-10-14.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-layerRate@2019-11-29.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-maintenance@2016-10-14.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-maintenance@2018-10-19.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-manifest-file@2020-03-27.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-network-resource@2018-11-30.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-network-resource@2019-11-29.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-otn-common-types@2016-10-14.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-otn-common-types@2017-12-15.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-otn-common-types@2018-11-30.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-otn-common-types@2020-03-27.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-otn-common-types@2021-09-24.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-pm-types@2016-10-14.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-pm-types@2017-12-15.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-pm-types@2020-03-27.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-pm@2016-10-14.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-pm@2018-10-19.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-pm@2020-05-29.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-port-types@2017-09-29.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-port-types@2018-10-19.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-port-types@2018-11-30.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-port-types@2020-03-27.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-port-types@2020-12-11.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-probable-cause@2016-10-14.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-probable-cause@2018-10-19.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-probable-cause@2020-05-29.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-resource-types@2016-10-14.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-resource-types@2018-10-19.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-resource-types@2018-11-30.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-resource-types@2019-11-29.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-resource-types@2021-09-24.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-resource@2016-10-14.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-resource@2018-10-19.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-resource@2019-05-31.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-resource@2020-05-29.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-resource@2021-12-10.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-service-format@2019-05-31.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-service-format@2019-11-29.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-switching-pool-types@2017-12-15.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-switching-pool-types@2018-11-30.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-switching-pool-types@2019-11-29.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-tca@2016-10-14.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-tca@2018-10-19.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-tca@2020-03-27.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-user-mgmt@2016-10-14.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-user-mgmt@2017-12-15.yang [deleted file]
ordmodels/common/src/main/yang/org-openroadm-user-mgmt@2019-11-29.yang [deleted file]
ordmodels/device/pom.xml [deleted file]
ordmodels/device/src/main/resources/NOTICE [deleted file]
ordmodels/device/src/main/resources/openconfig.LICENSE [deleted file]
ordmodels/device/src/main/yang/iana-afn-safi@2013-07-04.yang [deleted file]
ordmodels/device/src/main/yang/openconfig-extensions@2017-04-11.yang [deleted file]
ordmodels/device/src/main/yang/openconfig-telemetry-types@2017-08-24.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-database@2016-10-14.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-database@2018-10-19.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-database@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-de-operations@2016-10-14.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-de-operations@2018-10-19.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-de-operations@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-device-resource-types@2016-10-14.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-device-types@2019-11-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-device@2017-02-06.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-device@2018-10-19.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-device@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-dhcp@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-ethernet-interfaces@2016-10-14.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-ethernet-interfaces@2018-10-19.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-ethernet-interfaces@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-file-transfer@2016-10-14.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-file-transfer@2018-10-19.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-file-transfer@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-fwdl@2016-10-14.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-fwdl@2018-10-19.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-fwdl@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-gcc-interfaces@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-gnmi@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-interfaces@2016-10-14.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-interfaces@2017-06-26.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-ip@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-ipv4-unicast-routing@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-ipv6-unicast-routing@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-key-chain@2019-11-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-lldp@2016-10-14.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-lldp@2018-10-19.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-lldp@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-maintenance-loopback@2016-10-14.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-maintenance-loopback@2017-12-15.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-maintenance-loopback@2019-11-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-maintenance-testsignal@2016-10-14.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-maintenance-testsignal@2017-12-15.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-maintenance-testsignal@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-media-channel-interfaces@2018-10-19.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-media-channel-interfaces@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-network-media-channel-interfaces@2018-10-19.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-network-media-channel-interfaces@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-optical-channel-interfaces@2016-10-14.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-optical-channel-interfaces@2018-10-19.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-optical-channel-interfaces@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-optical-multiplex-interfaces@2016-10-14.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-optical-operational-interfaces@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-optical-transport-interfaces@2016-10-14.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-optical-transport-interfaces@2018-10-19.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-optical-transport-interfaces@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-optical-tributary-signal-interfaces@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-otn-common@2017-06-26.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-otn-common@2020-03-27.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-otn-odu-interfaces@2016-10-14.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-otn-odu-interfaces@2018-10-19.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-otn-odu-interfaces@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-otn-otu-interfaces@2016-10-14.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-otn-otu-interfaces@2018-10-19.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-otn-otu-interfaces@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-otsi-group-interfaces@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-physical-types@2016-10-14.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-physical-types@2018-10-19.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-physical-types@2019-11-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-pluggable-optics-holder-capability@2018-10-19.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-pluggable-optics-holder-capability@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-port-capability@2018-10-19.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-port-capability@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-ppp-interfaces@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-prot-otn-linear-aps@2018-10-19.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-prot-otn-linear-aps@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-routing@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-rstp@2016-10-14.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-rstp@2018-10-19.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-rstp@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-security@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-swdl@2016-10-14.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-swdl@2018-10-19.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-swdl@2020-05-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-syslog@2016-10-14.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-syslog@2017-12-15.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-syslog@2019-11-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-telemetry-types@2019-11-29.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-wavelength-map@2016-10-14.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-wavelength-map@2017-12-15.yang [deleted file]
ordmodels/device/src/main/yang/org-openroadm-wavelength-map@2019-11-29.yang [deleted file]
ordmodels/network/pom.xml [deleted file]
ordmodels/network/src/main/yang/org-openroadm-amplifier@2021-09-24.yang [deleted file]
ordmodels/network/src/main/yang/org-openroadm-clli-network@2019-11-29.yang [deleted file]
ordmodels/network/src/main/yang/org-openroadm-common-network@2021-12-10.yang [deleted file]
ordmodels/network/src/main/yang/org-openroadm-degree@2021-12-10.yang [deleted file]
ordmodels/network/src/main/yang/org-openroadm-external-pluggable@2021-12-10.yang [deleted file]
ordmodels/network/src/main/yang/org-openroadm-link@2021-12-10.yang [deleted file]
ordmodels/network/src/main/yang/org-openroadm-network-topology-types@2020-12-11.yang [deleted file]
ordmodels/network/src/main/yang/org-openroadm-network-topology@2021-12-10.yang [deleted file]
ordmodels/network/src/main/yang/org-openroadm-network-types@2021-12-10.yang [deleted file]
ordmodels/network/src/main/yang/org-openroadm-network@2021-12-10.yang [deleted file]
ordmodels/network/src/main/yang/org-openroadm-otn-network-topology@2021-12-10.yang [deleted file]
ordmodels/network/src/main/yang/org-openroadm-roadm@2019-11-29.yang [deleted file]
ordmodels/network/src/main/yang/org-openroadm-srg@2021-12-10.yang [deleted file]
ordmodels/network/src/main/yang/org-openroadm-xponder@2021-12-10.yang [deleted file]
ordmodels/network/src/main/yang/transportpce-topology@2022-01-23.yang [deleted file]
ordmodels/pom.xml [deleted file]
ordmodels/service/pom.xml [deleted file]
ordmodels/service/src/main/yang/org-openroadm-ber-test@2021-12-10.yang [deleted file]
ordmodels/service/src/main/yang/org-openroadm-common-ber-test@2020-05-29.yang [deleted file]
ordmodels/service/src/main/yang/org-openroadm-common-service-types@2021-12-10.yang [deleted file]
ordmodels/service/src/main/yang/org-openroadm-controller-customization@2021-12-10.yang [deleted file]
ordmodels/service/src/main/yang/org-openroadm-operational-mode-catalog@2021-12-10.yang [deleted file]
ordmodels/service/src/main/yang/org-openroadm-routing-constraints@2021-12-10.yang [deleted file]
ordmodels/service/src/main/yang/org-openroadm-service@2021-12-10.yang [deleted file]
ordmodels/service/src/main/yang/org-openroadm-topology@2021-12-10.yang [deleted file]
pce/pom.xml
pce/src/main/java/org/opendaylight/transportpce/pce/PceComplianceCheck.java
pce/src/main/java/org/opendaylight/transportpce/pce/PcePathDescription.java
pce/src/main/java/org/opendaylight/transportpce/pce/PceSendingPceRPCs.java
pce/src/main/java/org/opendaylight/transportpce/pce/SortPortsByName.java
pce/src/main/java/org/opendaylight/transportpce/pce/constraints/OperatorConstraints.java [new file with mode: 0644]
pce/src/main/java/org/opendaylight/transportpce/pce/constraints/PceConstraints.java
pce/src/main/java/org/opendaylight/transportpce/pce/constraints/PceConstraintsCalc.java
pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/GnpyResult.java
pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/GnpyServiceImpl.java
pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/GnpyTopoImpl.java
pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/GnpyUtilitiesImpl.java
pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/consumer/GnpyApiModule.java [deleted file]
pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/consumer/GnpyConsumer.java
pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/consumer/GnpyConsumerImpl.java
pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/consumer/GnpyResource.java
pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/consumer/JsonConfigurator.java [deleted file]
pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/consumer/RequestMessageBodyWriter.java [new file with mode: 0644]
pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/consumer/RequestSerializer.java [deleted file]
pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/consumer/ResultDeserializer.java [deleted file]
pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/consumer/ResultMessageBodyReader.java [new file with mode: 0644]
pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/utils/AToZComparator.java
pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/utils/ZToAComparator.java
pce/src/main/java/org/opendaylight/transportpce/pce/graph/InAlgoPathValidator.java
pce/src/main/java/org/opendaylight/transportpce/pce/graph/PceGraph.java
pce/src/main/java/org/opendaylight/transportpce/pce/graph/PceGraphEdge.java
pce/src/main/java/org/opendaylight/transportpce/pce/graph/PostAlgoPathValidator.java
pce/src/main/java/org/opendaylight/transportpce/pce/impl/CancelResourceReserveImpl.java [new file with mode: 0644]
pce/src/main/java/org/opendaylight/transportpce/pce/impl/PathComputationRequestImpl.java [new file with mode: 0644]
pce/src/main/java/org/opendaylight/transportpce/pce/impl/PathComputationRerouteRequestImpl.java [new file with mode: 0644]
pce/src/main/java/org/opendaylight/transportpce/pce/impl/PceProvider.java [deleted file]
pce/src/main/java/org/opendaylight/transportpce/pce/impl/PceServiceRPCImpl.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/MapUtils.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceCalculation.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceLink.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceNode.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOpticalNode.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOtnNode.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/PceResult.java
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/port/ClientPreference.java [new file with mode: 0644]
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/port/Factory.java [new file with mode: 0644]
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/port/NoPreference.java [new file with mode: 0644]
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/port/Preference.java [new file with mode: 0644]
pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/port/PreferenceFactory.java [new file with mode: 0644]
pce/src/main/java/org/opendaylight/transportpce/pce/service/PathComputationService.java
pce/src/main/java/org/opendaylight/transportpce/pce/service/PathComputationServiceImpl.java
pce/src/main/resources/OSGI-INF/blueprint/pce-blueprint.xml [deleted file]
pce/src/test/java/org/opendaylight/transportpce/pce/PceComplianceCheckResultTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/PceComplianceCheckTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/PcePathDescriptionTests.java
pce/src/test/java/org/opendaylight/transportpce/pce/PceSendingPceRPCsTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/SortPortsByNameTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/constraints/OperatorConstraintsTest.java [new file with mode: 0644]
pce/src/test/java/org/opendaylight/transportpce/pce/constraints/PceConstraintsCalcTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/constraints/PceConstraintsTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/gnpy/GnpyUtilitiesImplTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/gnpy/consumer/GnpyConsumerTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/gnpy/consumer/GnpyStub.java
pce/src/test/java/org/opendaylight/transportpce/pce/graph/PceGraphEdgeTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/graph/PceGraphTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/impl/PceProviderTest.java [deleted file]
pce/src/test/java/org/opendaylight/transportpce/pce/impl/PceServiceRPCImplTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceCalculationTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceLinkTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOpticalNodeTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceOtnNodeTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/PceResultTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/port/ClientPreferenceTest.java [new file with mode: 0644]
pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/port/PreferenceFactoryTest.java [new file with mode: 0644]
pce/src/test/java/org/opendaylight/transportpce/pce/service/PathComputationServiceImplTest.java
pce/src/test/java/org/opendaylight/transportpce/pce/utils/JsonUtil.java
pce/src/test/java/org/opendaylight/transportpce/pce/utils/NodeUtils.java
pce/src/test/java/org/opendaylight/transportpce/pce/utils/NotificationPublishServiceMock.java
pce/src/test/java/org/opendaylight/transportpce/pce/utils/PceTestData.java
pce/src/test/java/org/opendaylight/transportpce/pce/utils/PceTestUtils.java
pce/src/test/java/org/opendaylight/transportpce/pce/utils/TransactionUtils.java
pce/src/test/resources/apidocCatalog12_0-OptSpecV5_1.json [new file with mode: 0644]
pce/src/test/resources/gnpy/gnpy_request.json
pce/src/test/resources/gnpy/gnpy_result_no_path.json
pce/src/test/resources/gnpy/gnpy_result_with_path.json
pce/src/test/resources/gnpy/gnpy_topology.json
pce/src/test/resources/spectrum-filling-rule1.json [new file with mode: 0644]
pce/src/test/resources/topologyData/or-base-topology.json [new file with mode: 0644]
pce/src/test/resources/topologyData/portMapping2.json [new file with mode: 0644]
pom.xml
renderer/pom.xml
renderer/src/main/java/org/opendaylight/transportpce/renderer/ModelMappingUtils.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/NodeLists.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/RendererProvider.java [deleted file]
renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterface121.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterface221.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterface710.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmInterfaceFactory.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmOtnInterface221.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadmOtnInterface710.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/DeviceRendererService.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/DeviceRendererServiceImpl.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/DeviceRenderingResult.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/OtnDeviceRendererServiceImpl.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/OtnDeviceRenderingResult.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperations.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImpl.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/notification/Notification.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/notification/NotificationSender.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/servicepath/ServiceListTopology.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/tasks/DeviceRenderingRollbackTask.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/tasks/DeviceRenderingTask.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/tasks/NetworkDeviceRenderingRollbackTask.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/tasks/OlmPowerSetupRollbackTask.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/tasks/OlmPowerSetupTask.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/tasks/OlmPowerTurnDownTask.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/tasks/ResultMessage.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/tasks/RollbackResultMessage.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/Connection.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/DeviceInterface.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/Transaction.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/delete/Delete.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/delete/DeleteService.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/delete/DeleteSubscriber.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/delete/FailedRollbackResult.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/delete/Result.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/delete/Subscriber.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/history/History.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/history/NonStickHistoryMemory.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/history/TransactionHistory.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/CreateOtsOmsImpl.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/DeviceRendererRPCImpl.java
renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/OtnServicePathImpl.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/RendererRPCImpl.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/RendererRollbackImpl.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/ServiceDeleteImpl.java [new file with mode: 0644]
renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/ServiceImplementationRequestImpl.java [moved from renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/TransportPCEServicePathRPCImpl.java with 55% similarity]
renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/ServicePathImpl.java [new file with mode: 0644]
renderer/src/main/resources/OSGI-INF/blueprint/renderer-blueprint.xml [deleted file]
renderer/src/test/java/org/opendaylight/transportpce/renderer/RendererProviderTest.java [deleted file]
renderer/src/test/java/org/opendaylight/transportpce/renderer/RollbackProcessorTest.java
renderer/src/test/java/org/opendaylight/transportpce/renderer/openroadminterface/OpenRoadMInterface221Test.java
renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/DeviceRendererServiceImplCreateOtsOmsTest.java
renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImplDeleteTest.java
renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/RendererServiceOperationsImplTest.java
renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/ConnectionTest.java [new file with mode: 0644]
renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/DeviceInterfaceTest.java [new file with mode: 0644]
renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/history/TransactionHistoryTest.java [new file with mode: 0644]
renderer/src/test/java/org/opendaylight/transportpce/renderer/rpcs/DeviceRendererRPCImplTest.java
renderer/src/test/java/org/opendaylight/transportpce/renderer/stub/OlmServiceStub.java [deleted file]
renderer/src/test/java/org/opendaylight/transportpce/renderer/utils/MountPointUtils.java
renderer/src/test/java/org/opendaylight/transportpce/renderer/utils/NotificationPublishServiceMock.java
renderer/src/test/java/org/opendaylight/transportpce/renderer/utils/ServiceDataUtils.java
renderer/src/test/java/org/opendaylight/transportpce/renderer/utils/ServiceDeleteDataUtils.java
renderer/src/test/java/org/opendaylight/transportpce/renderer/utils/TransactionUtils.java
servicehandler/pom.xml
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/CatalogInput.java [new file with mode: 0644]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/DowngradeConstraints.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/ModelMappingUtils.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/ServiceInput.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/catalog/CatalogDataStoreOperations.java [new file with mode: 0644]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/catalog/CatalogDataStoreOperationsImpl.java [new file with mode: 0644]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/catalog/CatalogMapper.java [new file with mode: 0644]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/AddOpenroadmOperationalModesToCatalogImpl.java [new file with mode: 0644]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/AddSpecificOperationalModesToCatalogImpl.java [new file with mode: 0644]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServiceCreateImpl.java [new file with mode: 0644]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServiceDeleteImpl.java [new file with mode: 0644]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServiceFeasibilityCheckImpl.java [new file with mode: 0644]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServiceHandlerProvider.java [new file with mode: 0644]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServiceReconfigureImpl.java [new file with mode: 0644]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServiceRerouteImpl.java [new file with mode: 0644]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServiceRestorationImpl.java [new file with mode: 0644]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerImpl.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerProvider.java [deleted file]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/TempServiceCreateImpl.java [new file with mode: 0644]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/TempServiceDeleteImpl.java [new file with mode: 0644]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/NetworkListener.java [new file with mode: 0644]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/NetworkModelNotificationHandler.java [moved from servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/NetworkModelListenerImpl.java with 61% similarity]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/PceListener.java [new file with mode: 0644]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/PceNotificationHandler.java [moved from servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/PceListenerImpl.java with 77% similarity]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/RendererListener.java [new file with mode: 0644]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/RendererNotificationHandler.java [moved from servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/RendererListenerImpl.java with 61% similarity]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/ServiceListener.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/PCEServiceWrapper.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/RendererServiceWrapper.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperations.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperationsImpl.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/utils/CatalogDataUtils.java [new file with mode: 0644]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/validation/CatalogValidation.java [new file with mode: 0644]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/validation/ServiceCreateValidation.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/validation/checks/CheckCoherencyHardSoft.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/validation/checks/ServicehandlerComplianceCheck.java
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/validation/checks/ServicehandlerServiceResiliencyCheck.java [new file with mode: 0644]
servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/validation/checks/ServicehandlerTxRxCheck.java
servicehandler/src/main/resources/OSGI-INF/blueprint/servicehandler-blueprint.xml [deleted file]
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/DowngradeConstraintsTest.java
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/ModelMappingUtilsTest.java
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/ServiceEndpointTypeTest.java
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/impl/ServiceHandlerProviderTest.java [new file with mode: 0644]
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerImplTest.java
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerProviderTest.java [deleted file]
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/listeners/NetworkModelNotificationHandlerTest.java [new file with mode: 0644]
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/listeners/ServiceListenerTest.java
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/service/PCEServiceWrapperTest.java
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/service/RendererServiceWrapperTest.java
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/service/ServiceDataStoreOperationsImplTest.java
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/utils/ConstraintsUtils.java
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/utils/MockedNotificationServiceWrapper.java
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/utils/ModelMappingUtils.java
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/utils/ServiceDataUtils.java
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/validation/ServiceCreateValidationTest.java
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/validation/checks/CheckCoherencyServiceResiliencyTest.java [new file with mode: 0644]
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/validation/checks/ComplianceCheckResultTest.java
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/validation/checks/ServicehandlerComplianceCheckTest.java
servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/validation/checks/ServicehandlerTxRxCheckTest.java
tapi/pom.xml
tapi/src/main/java/org/opendaylight/transportpce/tapi/R2RTapiLinkDiscovery.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/TapiStringConstants.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/connectivity/ConnectivityUtils.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/connectivity/TapiConnectivityImpl.java [deleted file]
tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/TapiProvider.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/CreateConnectivityServiceImpl.java [new file with mode: 0644]
tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/DeleteConnectivityServiceImpl.java [new file with mode: 0644]
tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/DeleteTapiLinkImpl.java [new file with mode: 0644]
tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetConnectionDetailsImpl.java [new file with mode: 0644]
tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetConnectivityServiceDetailsImpl.java [new file with mode: 0644]
tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetConnectivityServiceListImpl.java [new file with mode: 0644]
tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetLinkDetailsImpl.java [new file with mode: 0644]
tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetNodeDetailsImpl.java [new file with mode: 0644]
tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetNodeEdgePointDetailsImpl.java [new file with mode: 0644]
tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetServiceInterfacePointDetailsImpl.java [new file with mode: 0644]
tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetServiceInterfacePointListImpl.java [new file with mode: 0644]
tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetTopologyDetailsImpl.java [new file with mode: 0644]
tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetTopologyListImpl.java [new file with mode: 0644]
tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/InitRoadmRoadmTapiLinkImpl.java [new file with mode: 0644]
tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/InitXpdrRdmTapiLinkImpl.java [new file with mode: 0644]
tapi/src/main/java/org/opendaylight/transportpce/tapi/listeners/TapiNetworkModelNotificationHandler.java [new file with mode: 0644]
tapi/src/main/java/org/opendaylight/transportpce/tapi/listeners/TapiPceListenerImpl.java [deleted file]
tapi/src/main/java/org/opendaylight/transportpce/tapi/listeners/TapiPceNotificationHandler.java [new file with mode: 0644]
tapi/src/main/java/org/opendaylight/transportpce/tapi/listeners/TapiRendererNotificationHandler.java [moved from tapi/src/main/java/org/opendaylight/transportpce/tapi/listeners/TapiRendererListenerImpl.java with 63% similarity]
tapi/src/main/java/org/opendaylight/transportpce/tapi/listeners/TapiServiceNotificationHandler.java [moved from tapi/src/main/java/org/opendaylight/transportpce/tapi/listeners/TapiServiceHandlerListenerImpl.java with 61% similarity]
tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/ConvertORToTapiTopology.java [new file with mode: 0644]
tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/ConvertORTopoToTapiFullTopo.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/ConvertORTopoToTapiTopo.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/ConvertTapiTopoToAbstracted.java [new file with mode: 0644]
tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TapiNetconfTopologyListener.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TapiNetworkModelService.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TapiNetworkModelServiceImpl.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TapiNetworkUtilsImpl.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TapiOrLinkListener.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TapiPortMappingListener.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TapiTopologyImpl.java [deleted file]
tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TopologyUtils.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/utils/GenericServiceEndpoint.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/utils/MappingUtils.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/utils/TapiContext.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/utils/TapiInitialORMapping.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/utils/TapiLink.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/utils/TapiLinkImpl.java [new file with mode: 0644]
tapi/src/main/java/org/opendaylight/transportpce/tapi/utils/TapiListener.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/validation/CreateConnectivityServiceValidation.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/validation/checks/ConnConstraintCheck.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/validation/checks/EndPointCheck.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/validation/checks/ResilienceConstraintCheck.java
tapi/src/main/java/org/opendaylight/transportpce/tapi/validation/checks/TopoConstraintCheck.java
tapi/src/main/resources/OSGI-INF/blueprint/tapi-blueprint.xml [deleted file]
tapi/src/test/java/org/opendaylight/transportpce/tapi/connectivity/TapiConnectivityImplTest.java
tapi/src/test/java/org/opendaylight/transportpce/tapi/provider/TapiProviderTest.java
tapi/src/test/java/org/opendaylight/transportpce/tapi/topology/ConvertORTopoToFullTapiTopoTest.java
tapi/src/test/java/org/opendaylight/transportpce/tapi/topology/ConvertORTopoToTapiTopoTest.java
tapi/src/test/java/org/opendaylight/transportpce/tapi/topology/TapiTopologyImplExceptionTest.java
tapi/src/test/java/org/opendaylight/transportpce/tapi/topology/TapiTopologyImplTest.java
tapi/src/test/java/org/opendaylight/transportpce/tapi/utils/TapiConnectivityDataUtils.java
tapi/src/test/java/org/opendaylight/transportpce/tapi/utils/TapiTopologyDataUtils.java
tapi/src/test/resources/openroadm-topology.xml
tapi/src/test/resources/otn-topology.xml
tapi/src/test/resources/portmapping.xml
tapimodels/pom.xml [deleted file]
tapimodels/src/main/yang/tapi-common@2018-12-10.yang [deleted file]
tapimodels/src/main/yang/tapi-connectivity@2018-12-10.yang [deleted file]
tapimodels/src/main/yang/tapi-dsr@2018-12-10.yang [deleted file]
tapimodels/src/main/yang/tapi-eth@2018-12-10.yang [deleted file]
tapimodels/src/main/yang/tapi-oam@2018-12-10.yang [deleted file]
tapimodels/src/main/yang/tapi-odu@2018-12-10.yang [deleted file]
tapimodels/src/main/yang/tapi-path-computation@2018-12-10.yang [deleted file]
tapimodels/src/main/yang/tapi-photonic-media@2018-12-10.yang [deleted file]
tapimodels/src/main/yang/tapi-topology@2018-12-10.yang [deleted file]
test-common/pom.xml
test-common/src/main/java/org/opendaylight/transportpce/test/AbstractDeviceTest.java
test-common/src/main/java/org/opendaylight/transportpce/test/DataStoreContextImpl.java
test-common/src/main/java/org/opendaylight/transportpce/test/DeviceWrapper.java
test-common/src/main/java/org/opendaylight/transportpce/test/converter/AbstractDataObjectConverter.java
test-common/src/main/java/org/opendaylight/transportpce/test/converter/DataObjectConverter.java
test-common/src/main/java/org/opendaylight/transportpce/test/converter/JSONDataObjectConverter.java
test-common/src/main/java/org/opendaylight/transportpce/test/converter/XMLDataObjectConverter.java
test-common/src/main/java/org/opendaylight/transportpce/test/stub/MountPointServiceStub.java
test-common/src/main/java/org/opendaylight/transportpce/test/stub/MountPointStub.java
test-common/src/main/java/org/opendaylight/transportpce/test/utils/TopologyDataUtils.java
test-common/src/main/yang/path-description-stub@2020-12-11.yang [deleted file]
tests/Xtesting/Dockerfile [new file with mode: 0644]
tests/Xtesting/INSTALL.txt [new file with mode: 0644]
tests/Xtesting/patch.diff [new file with mode: 0644]
tests/Xtesting/requirements.yml [new file with mode: 0644]
tests/Xtesting/site.yml [new file with mode: 0644]
tests/Xtesting/testcases.yaml [new file with mode: 0644]
tests/add_tapi_feature_to_tests221.sh [new file with mode: 0755]
tests/build_controller.sh
tests/build_karaf_for_tests.sh
tests/installMavenCentOS.sh
tests/install_honeynode.sh
tests/install_lightynode.sh [new file with mode: 0755]
tests/install_sims.sh [new file with mode: 0755]
tests/launch_tests.sh
tests/lightynode/.gitkeep [new file with mode: 0644]
tests/requirements.txt
tests/sample_configs/NW-for-test-5-4.json [new file with mode: 0644]
tests/sample_configs/NW-for-test-5-4.xml [deleted file]
tests/sample_configs/NW-simple-topology.json [new file with mode: 0644]
tests/sample_configs/NW-simple-topology.xml [deleted file]
tests/sample_configs/gnpy/openroadmTopology.json
tests/sample_configs/honeynode-otntopo400G.json
tests/sample_configs/honeynode-otntopo400GwithODUC4.json
tests/sample_configs/honeynode-otntopo400GwithOTUC4.json
tests/sample_configs/honeynode-topo-3-RDM.json [new file with mode: 0644]
tests/sample_configs/honeynode-topo.json [new file with mode: 0644]
tests/sample_configs/honeynode-topo.xml [deleted file]
tests/sample_configs/honeynode-topo400G.json
tests/sample_configs/openroadm/1.2.1/oper-ROADMA-full.xml
tests/sample_configs/openroadm/1.2.1/oper-ROADMA.xml
tests/sample_configs/openroadm/1.2.1/oper-ROADMB.xml
tests/sample_configs/openroadm/1.2.1/oper-ROADMC-full.xml
tests/sample_configs/openroadm/1.2.1/oper-ROADMC.xml
tests/sample_configs/openroadm/2.2.1/oper-ROADMA.xml
tests/sample_configs/openroadm/2.2.1/oper-ROADMB.xml
tests/sample_configs/openroadm/2.2.1/oper-ROADMC.xml
tests/sample_configs/openroadm/7.1/oper-ROADMA.xml
tests/sample_configs/openroadm/7.1/oper-ROADMB.xml
tests/sample_configs/openroadm/7.1/oper-ROADMC.xml
tests/sample_configs/openroadm/7.1/oper-XPDRA2.xml
tests/sample_configs/openroadm/7.1/oper-XPDRC2.xml
tests/sample_configs/pce_portmapping_121.json
tests/sample_configs/pce_portmapping_71.json
tests/sample_configs/portmapping-3-RDM-221.json [new file with mode: 0644]
tests/test-requirements.txt
tests/transportpce_tests/1.2.1/test01_portmapping.py
tests/transportpce_tests/1.2.1/test02_topo_portmapping.py
tests/transportpce_tests/1.2.1/test03_topology.py
tests/transportpce_tests/1.2.1/test04_renderer_service_path_nominal.py
tests/transportpce_tests/1.2.1/test05_olm.py
tests/transportpce_tests/1.2.1/test06_end2end.py
tests/transportpce_tests/2.2.1/test01_portmapping.py
tests/transportpce_tests/2.2.1/test02_topo_portmapping.py
tests/transportpce_tests/2.2.1/test03_topology.py
tests/transportpce_tests/2.2.1/test04_otn_topology.py
tests/transportpce_tests/2.2.1/test05_flex_grid.py
tests/transportpce_tests/2.2.1/test06_renderer_service_path_nominal.py
tests/transportpce_tests/2.2.1/test07_otn_renderer.py
tests/transportpce_tests/2.2.1/test08_otn_sh_renderer.py
tests/transportpce_tests/2.2.1/test09_olm.py
tests/transportpce_tests/2.2.1/test11_otn_end2end.py
tests/transportpce_tests/2.2.1/test12_end2end.py
tests/transportpce_tests/2.2.1/test14_otn_switch_end2end.py
tests/transportpce_tests/2.2.1/test15_otn_end2end_with_intermediate_switch.py
tests/transportpce_tests/7.1/test01_portmapping.py
tests/transportpce_tests/7.1/test02_otn_renderer.py
tests/transportpce_tests/7.1/test03_renderer_or_modes.py [new file with mode: 0644]
tests/transportpce_tests/7.1/test04_renderer_regen_mode.py [new file with mode: 0644]
tests/transportpce_tests/common/simulators.py
tests/transportpce_tests/common/test_utils.py
tests/transportpce_tests/common/test_utils_rfc8040.py [deleted file]
tests/transportpce_tests/hybrid/test01_device_change_notifications.py
tests/transportpce_tests/hybrid/test02_B100G_end2end.py
tests/transportpce_tests/hybrid/test03_autonomous_reroute.py [new file with mode: 0644]
tests/transportpce_tests/pce/test01_pce.py
tests/transportpce_tests/pce/test02_pce_400G.py
tests/transportpce_tests/pce/test03_gnpy.py
tests/transportpce_tests/pce/test04_pce_bug_fix.py [new file with mode: 0644]
tests/transportpce_tests/tapi/test01_abstracted_topology.py
tests/transportpce_tests/tapi/test02_full_topology.py
tests/transportpce_tests/tapi/test03_tapi_device_change_notifications.py [new file with mode: 0644]
tests/transportpce_tests/with_docker/test02_nbinotifications.py
tests/transportpce_tests/with_docker/test03_tapi_nbinotifications.py [new file with mode: 0644]
tox.ini

index 70b203cd9db267d997ef74c669fbb1132387c9ef..cb9c68d78e0d7418340a22203eacc1fdd1113ce4 100644 (file)
@@ -20,9 +20,10 @@ classes
 .DS_STORE
 .metadata
 ordmodels/src/main/java
+tests/allure-report/
 tests/config.xml
 tests/models
-<<<<<<< HEAD
+tests/test-requirements.txt
 *.log
 *.log.*
 __pycache__
index baa871ba7c4d9103d8dd1ce8d6492a577144e5c3..10afcad1105ea8314ae71c9cfde0ef307c02d97d 100644 (file)
@@ -1,28 +1,35 @@
 ---
 repos:
   - repo: https://github.com/pre-commit/pre-commit-hooks
-    rev: v4.0.1
+    rev: v4.3.0
     hooks:
       - id: trailing-whitespace
-        exclude: '^ordmodels/'
+        exclude: '^ordmodels/|.diff$'
         # ordmodels trailing blanks shall preferably be fixed in OpenROADM upstream repo
 
   - repo: https://github.com/jorisroovers/gitlint
-    rev: v0.16.0
+    rev: v0.18.0
     hooks:
       - id: gitlint
         stages: [commit-msg]
+      - id: gitlint-ci
+        stages: [manual]
 
   - repo: https://github.com/Lucas-C/pre-commit-hooks
-    rev: v1.1.10
+    rev: v1.3.1
     hooks:
       - id: remove-tabs
         stages: [commit]
         exclude: '^(.git/|docs/make.bat|docs/Makefile|ordmodels/)'
 
   - repo: https://github.com/pre-commit/mirrors-autopep8
-    rev: v1.5.7
+    rev: v2.0.0
     hooks:
       - id: autopep8
         args: ['--in-place', '--max-line-length=120']
 
+  - repo: https://github.com/perltidy/perltidy
+    rev: '20240202.05'
+    hooks:
+      - id: perltidy
+        stages: [commit]
index 7b0193897237bbac38ee95d6537f1bb80a69806c..954873ca1e9b4109920e852c7012cd2b114f398c 100644 (file)
@@ -12,39 +12,63 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>8.0.11</version>
+    <version>13.0.1</version>
     <relativePath/>
   </parent>
 
   <groupId>org.opendaylight.transportpce</groupId>
   <artifactId>transportpce-api</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
+  <version>10.0.0-SNAPSHOT</version>
   <packaging>bundle</packaging>
 
+  <properties>
+    <transportpce.models.version>20.0.0-SNAPSHOT</transportpce.models.version>
+  </properties>
+
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.opendaylight.transportpce.models</groupId>
+        <artifactId>transportpce-models-artifacts</artifactId>
+        <version>${transportpce.models.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
   <dependencies>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-device</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-1.2.1</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-common</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-2.2.1</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-service</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-7.1.0</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>transportpce-tapimodels</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-13.1.0</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>concepts</artifactId>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-device-7.1.0</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-network-13.1.0</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-service-13.1.0</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>tapi-2.4.0</artifactId>
     </dependency>
     <dependency>
       <groupId>org.opendaylight.yangtools</groupId>
@@ -58,10 +82,18 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
       <artifactId>rfc6991-ietf-yang-types</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+      <artifactId>rfc8345-ietf-network</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
       <artifactId>rfc8345-ietf-network-topology</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>yang-binding</artifactId>
+    </dependency>
     <dependency>
       <groupId>com.google.guava</groupId>
       <artifactId>guava</artifactId>
@@ -87,7 +119,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-javadoc-plugin</artifactId>
         <configuration>
-          <sourcepath>*/target/generated-sources/mdsal-binding/*</sourcepath>
+          <sourcepath>/target/generated-sources/mdsal-binding/</sourcepath>
           <excludePackageNames>*</excludePackageNames>
         </configuration>
       </plugin>
@@ -100,7 +132,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-javadoc-plugin</artifactId>
         <configuration>
-          <sourcepath>*/target/generated-sources/mdsal-binding/*</sourcepath>
+          <sourcepath>/target/generated-sources/mdsal-binding/</sourcepath>
           <excludePackageNames>*</excludePackageNames>
         </configuration>
       </plugin>
similarity index 97%
rename from api/src/main/yang/gnpy-network-topology@2022-02-21.yang
rename to api/src/main/yang/gnpy-network-topology@2022-06-15.yang
index 390831780bd9ac2049ba7be1882a872310281ecf..36db565f273f09762f1ab1201bd36b75c77d5540 100644 (file)
@@ -44,6 +44,13 @@ module gnpy-network-topology {
     OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.";
 
+  revision 2022-06-15 {
+    description
+      "change fraction digits from 2 to 5 for loss_coef leaf";
+    reference
+      "YANG model for api input for path computation with gnpy";
+  }
+
   revision 2022-02-21 {
     description
       "draft for GNPy4TPCE preversion - non official version relevant for v2.4 GNPy file format";
@@ -163,7 +170,7 @@ module gnpy-network-topology {
     }
     leaf loss_coef {
       type decimal64 {
-        fraction-digits 2;
+        fraction-digits 5;
       }
       mandatory true;
       units db/km;
similarity index 98%
rename from api/src/main/yang/gnpy-path-computation-simplified@2022-02-21.yang
rename to api/src/main/yang/gnpy-path-computation-simplified@2022-06-15.yang
index 24f2337572982df48c061ba5f3ba60908ee24a53..abc5b49806910a681b2bdd6b87a9c4fed2fa6840 100644 (file)
@@ -47,6 +47,13 @@ module gnpy-path-computation-simplified {
     OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.";
 
+  revision 2022-06-15 {
+    description
+      "change fraction digits from 2 to 6 for accumulative-value leaf, from 5 to 6 for output-power leaf";
+    reference
+      "YANG model for api input for path computation with gnpy";
+  }
+
   revision 2022-02-21 {
     description
       "draft for GNPy4TPCE preversion - non official version relevant for v2.4 GNPy file format";
@@ -142,7 +149,7 @@ module gnpy-path-computation-simplified {
       }
       leaf output-power{
         type decimal64 {
-          fraction-digits 5;
+          fraction-digits 6;
         }
         units W;
         description "optical power setting to be used for the propagation";
@@ -493,7 +500,7 @@ module gnpy-path-computation-simplified {
     }
     leaf accumulative-value {
       type decimal64 {
-          fraction-digits 2;
+          fraction-digits 6;
       }
       description "TE path metric accumulative value";
     }
similarity index 57%
rename from api/src/main/yang/nbi-notifications@2021-08-13.yang
rename to api/src/main/yang/nbi-notifications@2023-07-28.yang
index b90e196a3219b9334d725d9d1de9fa0c3e453932..b4bf64fa7a3260bee270969741b76899070882a4 100644 (file)
@@ -1,5 +1,5 @@
 module nbi-notifications {
-  yang-version 1;
+  yang-version 1.1;
   namespace "nbi-notifications";
   prefix nbinotifications;
 
@@ -12,6 +12,21 @@ module nbi-notifications {
   import org-openroadm-common-state-types {
     prefix org-openroadm-common-state-types;
   }
+  import org-openroadm-resource {
+    prefix org-openroadm-resource;
+  }
+  import tapi-common {
+    prefix tapi-common;
+    revision-date 2022-11-21;
+   }
+  import tapi-notification {
+    prefix tapi-notification;
+    revision-date 2022-11-21;
+  }
+  import tapi-fm {
+    prefix tapi-fm;
+    revision-date 2022-11-21;
+  }
 
   organization
     "transportPCE";
@@ -21,6 +36,26 @@ module nbi-notifications {
     "YANG definitions for using REST API in NBI notifications module. Copyright
      (c) 2020 ORANGE and others. All rights reserved.";
 
+  revision "2023-07-28" {
+    description
+      "Migration towards TAPI 2.4";
+  }
+
+  revision 2023-07-26 {
+      description
+        "Adding service-rpc-result data details to the publish-notification-process-service";
+  }
+
+  revision 2021-10-13 {
+    description
+      "Implement new models, RPC for TAPI service notification";
+  }
+
+  revision 2023-07-26 {
+      description
+        "Adding service-rpc-result data details to the publish-notification-process-service";
+  }
+
   revision 2021-08-13 {
     description
       "Rename the groupings, containers and RPCs";
@@ -77,8 +112,29 @@ module nbi-notifications {
       description
         "Operational State: Actual state of service";
     }
+    leaf is-temp-service {
+      type boolean;
+      default "false";
+      description
+        "Used to indicate if the it is a temp-service or not";
+    }
+    container aToZ {
+      when "../is-temp-service = 'true'" {
+        description
+            "a-to-z is only used for temp-service-cerate";
+        }
+        uses org-openroadm-resource:common-och-otsi-attributes;
+        uses org-openroadm-resource:path-computation-outputs;
+    }
+    container zToA {
+      when "../is-temp-service = 'true'" {
+        description
+              "a-to-z is only used for temp-service-cerate";
+        }
+      uses org-openroadm-resource:common-och-otsi-attributes;
+      uses org-openroadm-resource:path-computation-outputs;
+    }
   }
-
   grouping notification-alarm-service {
     leaf message {
       type string;
@@ -105,6 +161,78 @@ module nbi-notifications {
     }
   }
 
+  grouping alarm-tca-info {
+    container alarm-info {
+      uses tapi-fm:alarm-info;
+      description "none";
+    }
+    container tca-info {
+      uses tapi-fm:tca-info;
+      description "none";
+    }
+  }
+
+  grouping notification-tapi-service {
+      leaf notification-type {
+        type tapi-notification:notification-type;
+        description "none";
+      }
+      leaf target-object-type {
+        type tapi-common:object-type;
+        description "none";
+      }
+      leaf target-object-identifier {
+        type tapi-common:uuid;
+        description "none";
+      }
+      list target-object-name {
+        key 'value-name';
+        min-elements 1;
+        uses tapi-common:name-and-value;
+        description "none";
+      }
+      leaf event-time-stamp {
+        type tapi-common:date-and-time;
+        description "none";
+      }
+      leaf sequence-number {
+        type uint64;
+        config false;
+        description "A monotonous increasing sequence number associated with the notification.
+            The exact semantics of how this sequence number is assigned (per channel or subscription or source or system) is left undefined.";
+      }
+      leaf source-indicator {
+        type tapi-notification:source-indicator;
+        description "none";
+      }
+      leaf layer-protocol-name {
+        type tapi-common:layer-protocol-name;
+        description "none";
+      }
+      leaf layer-protocol-qualifier {
+        type tapi-common:layer-protocol-qualifier;
+        config false;
+        description "none";
+        }
+      list changed-attributes {
+        key 'value-name';
+        uses tapi-notification:name-and-value-change;
+        description "none";
+      }
+      list additional-info {
+        key 'value-name';
+        uses tapi-common:name-and-value;
+        description "none";
+      }
+      leaf additional-text {
+        type string;
+        description "none";
+      }
+      uses alarm-tca-info;
+      uses tapi-common:global-class;
+      description "none";
+    }
+
   container notification-process-service {
     description
       "Model used to send a notification from a service request";
@@ -117,6 +245,12 @@ module nbi-notifications {
     uses notification-alarm-service;
     }
 
+  container notification-tapi-service {
+      description
+        "Model used to send a tapi notification";
+      uses notification-tapi-service;
+    }
+
   rpc get-notifications-process-service {
     description "Get the notifications service sent by ServiceHandler through filtering connection type";
     input {
@@ -196,4 +330,16 @@ module nbi-notifications {
      }
      uses notification-alarm-service;
   }
+
+  notification publish-tapi-notification-service {
+    description "Publish the TAPI notifications service for topic";
+    leaf topic {
+      type string;
+      mandatory true;
+      description
+        "Topic where to send the notification service";
+    }
+    uses alarm-tca-info;
+    uses tapi-notification:notification;
+  }
 }
index 6b6683c02f616f418f98e17224e5af13f683a578..213e9c22e3c05679abe07a1a462b8ee4b072c260 100644 (file)
@@ -13,7 +13,6 @@ module transportpce-common-service-path-types {
   }
   import org-openroadm-resource-types {
     prefix org-openroadm-resource-types;
-    revision-date 2018-11-30;
   }
   import org-openroadm-common-service-types {
     prefix org-openroadm-common-service-types;
similarity index 85%
rename from api/src/main/yang/service_path/transportpce-common-types@2021-09-30.yang
rename to api/src/main/yang/service_path/transportpce-common-types@2023-05-01.yang
index ccaa6f41f58c0424f6f18f6c9f6b6c94ed0d0b8c..b99be357a098a5ac264236e6b17e278075fcf0d1 100644 (file)
@@ -6,15 +6,24 @@ module transportpce-common-types {
     prefix org-openroadm-resource-types;
     revision-date 2016-10-14;
   }
-  import org-openroadm-pm-types {
-    prefix org-openroadm-pm-types;
-    revision-date 2016-10-14;
-  }
   import org-openroadm-common-types {
     prefix org-openroadm-common-types;
     revision-date 2018-10-19;
   }
+  import org-openroadm-common-link-types {
+      prefix org-openroadm-common-link-types;
+  }
+  import org-openroadm-common-optical-channel-types {
+      prefix org-openroadm-common-optical-channel-types;
+  }
+  import org-openroadm-otn-common-types {
+      prefix org-openroadm-otn-common-types;
+  }
 
+  revision 2022-09-26 {
+    description
+      "add pm-granularity from org-openroadm-pm-types";
+  }
   revision 2021-09-30 {
     description
       "Replace leaf width in optical-renderer-input by mc-width and nmc-width";
@@ -424,6 +433,25 @@ module transportpce-common-types {
     }
   }
 
+  typedef pm-granularity {
+      description
+        "Granularity of PM bin";
+      type enumeration {
+        enum "notApplicable" {
+          description
+            "This is for total statistic counters on devices that support
+                them.";
+          value 1;
+        }
+        enum "15min" {
+          value 2;
+        }
+        enum "24Hour" {
+          value 3;
+        }
+      }
+    }
+
   grouping link-tp {
     list link-tp {
       leaf node-id {
@@ -564,7 +592,7 @@ module transportpce-common-types {
       }
     }
     leaf granularity {
-      type org-openroadm-pm-types:pm-granularity;
+      type pm-granularity;
       mandatory true;
       description
         "Granularity of PM bin can be
@@ -672,4 +700,62 @@ module transportpce-common-types {
          the destination";
     }
   }
+
+  grouping service-result-rpc-common-parameters {
+          leaf central-frequency {
+                type org-openroadm-common-optical-channel-types:frequency-THz;
+                description
+                    "Assigned central-frquency in THz";
+          }
+          leaf width {
+                type org-openroadm-common-optical-channel-types:frequency-GHz;
+                description
+                    "Assigned frequency width (transponder/NMC)";
+          }
+          leaf optical-operational-mode {
+                type string;
+                description
+                    "Operation mode ID selected by the PCE";
+          }
+          leaf rx-estimated-osnr {
+                type org-openroadm-common-link-types:ratio-dB;
+                description
+                     "Estimated OSNR for the path";
+          }
+          leaf rx-estimated-gsnr {
+                type org-openroadm-common-link-types:ratio-dB;
+                description
+                     "Estimated Generalized SNR (including non linear impairments) for the path";
+          }
+          leaf max-output-power {
+                type org-openroadm-common-link-types:ratio-dB;
+                description
+                  "Maximum output-power";
+          }
+          leaf min-output-power {
+            type org-openroadm-common-link-types:ratio-dB;
+            description
+              "Minimum output-power";
+          }
+          leaf min-trib-slot {
+              type org-openroadm-otn-common-types:opucn-trib-slot-def;
+              description
+                  "Minimum trib slots in the form of 'A.B',
+                  where A and B correspond to port-number and trib-slots respectively";
+          }
+          leaf max-trib-slot {
+              type org-openroadm-otn-common-types:opucn-trib-slot-def;
+              description
+                  "Maximum trib slots in the form of 'A.B',
+                  where A and B correspond to port-number and trib-slots respectively";
+          }
+          leaf rate {
+            type uint32;
+            mandatory true;
+          }
+          leaf modulation-format {
+            type string;
+            // enum ?
+          }
+    }
 }
index 532bb16507f82d5ffefb76d78efd466be17956f2..0bca22ca45a8338b7dabeef2160021231244bbfd 100644 (file)
@@ -7,7 +7,6 @@ module transportpce-device-renderer {
   }
   import org-openroadm-otn-common-types {
     prefix org-openroadm-otn-common-types;
-    revision-date 2018-11-30;
   }
 
   organization
similarity index 80%
rename from api/src/main/yang/service_path/transportpce-pathDescription@2021-07-05.yang
rename to api/src/main/yang/service_path/transportpce-pathDescription@2023-05-01.yang
index 670586bf17ee8f92e4688bbbe01907af58733b83..e567e97501d0fa5c06668a2e27062cb013c5dfad 100644 (file)
@@ -5,14 +5,12 @@ module transportpce-pathDescription {
   import org-openroadm-common-optical-channel-types {
     prefix org-openroadm-common-optical-channel-types;
   }
-
   import org-openroadm-common-state-types {
     prefix org-openroadm-common-state-types;
     revision-date 2019-11-29;
   }
-  import org-openroadm-otn-common-types {
-    prefix org-openroadm-otn-common-types;
-    revision-date 2018-11-30;
+  import transportpce-common-types {
+    prefix transportpce-common-types;
   }
 
   organization
@@ -50,6 +48,10 @@ module transportpce-pathDescription {
       ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
       POSSIBILITY OF SUCH DAMAGE";
 
+  revision 2023-05-01 {
+      description
+        "Version 1.7. Add central frequency and spectral width parameters";
+    }
   revision 2021-07-05 {
     description
       "Version 1.6.4. To add a list of trib-slots and complex-trib-slots
@@ -135,26 +137,7 @@ module transportpce-pathDescription {
          description
          "Maximum frequency in THz.";
       }
-      leaf min-trib-slot {
-          type org-openroadm-otn-common-types:opucn-trib-slot-def;
-          description
-              "Minimum trib slots in the form of 'A.B',
-              where A and B correspond to port-number and trib-slots respectively";
-      }
-      leaf max-trib-slot {
-          type org-openroadm-otn-common-types:opucn-trib-slot-def;
-          description
-              "Maximum trib slots in the form of 'A.B',
-              where A and B correspond to port-number and trib-slots respectively";
-      }
-      leaf rate {
-        type uint32;
-        mandatory true;
-      }
-      leaf modulation-format {
-        type string;
-        // enum ?
-      }
+      uses transportpce-common-types:service-result-rpc-common-parameters;
       list aToZ {
         key "id";
         leaf id {
@@ -179,26 +162,7 @@ module transportpce-pathDescription {
          description
          "Maximum frequency in THz.";
       }
-      leaf min-trib-slot {
-          type org-openroadm-otn-common-types:opucn-trib-slot-def;
-          description
-              "Minimum trib slots in the form of 'A.B',
-              where A and B correspond to port-number and trib-slots respectively";
-      }
-      leaf max-trib-slot {
-          type org-openroadm-otn-common-types:opucn-trib-slot-def;
-          description
-              "Maximum trib slots in the form of 'A.B',
-              where A and B correspond to port-number and trib-slots respectively";
-      }
-      leaf rate {
-        type uint32;
-        mandatory true;
-      }
-      leaf modulation-format {
-        type string;
-        // enum ?
-      }
+      uses transportpce-common-types:service-result-rpc-common-parameters;
       list zToA {
         key "id";
         leaf id {
similarity index 77%
rename from api/src/main/yang/service_path/transportpce-pce@2022-01-18.yang
rename to api/src/main/yang/service_path/transportpce-pce@2024-02-05.yang
index a3eb3318d4e5adcc451eb6cf39cf6e47a934f3e7..cecc2b99290807f511e134195be8c12701e6fb41 100644 (file)
@@ -53,6 +53,26 @@ module transportpce-pce {
       ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
       POSSIBILITY OF SUCH DAMAGE";
 
+
+  revision 2024-02-05 {
+      description
+        "Add customer-name to path-computation-request input to check in controller-customization if the customer's
+        services need specific handling";
+  }
+  revision 2023-09-25 {
+      description
+        "Add pce-constraint-mode enum to be able to disinguish the way to manage node include constraints inside the
+         PCE module";
+  }
+  revision 2022-08-08 {
+      description
+        "Implement the RPC path-computation-reroute-request (only for reroute purposes) that computes a service path of
+        an existing service in order to reroute it";
+  }
+  revision 2022-06-15 {
+    description
+      "change fraction digits from 2 to 6 for accumulative-value leaf, from 2 to 6 to be compliant with Gnpy";
+  }
   revision 2022-01-18 {
     description
       "Add in path-computation-request input the pce-routing-metric.
@@ -79,6 +99,17 @@ module transportpce-pce {
       "Version 1.5";
   }
 
+  typedef pce-constraint-mode {
+    type enumeration {
+      enum loose {
+        value 1;
+      }
+      enum strict {
+        value 2;
+      }
+    }
+  }
+
   grouping stubpce-path-description {
     leaf path-name {
       type string;
@@ -140,7 +171,7 @@ module transportpce-pce {
         }
         leaf accumulative-value {
           type decimal64 {
-            fraction-digits 2;
+            fraction-digits 6;
           }
         }
       }
@@ -157,6 +188,13 @@ module transportpce-pce {
            e.g., CLFI, CLCI, etc. This is reported against the service, but
            may not get reflected in the service in the network.";
       }
+      leaf customer-name {
+        type string;
+        description
+          "name of the customer that may be declared in controller-customization,
+          to define a specific way to handle constraints associated with this
+          customer.";
+      }
       leaf resource-reserve {
         type boolean;
         mandatory true;
@@ -184,6 +222,38 @@ module transportpce-pce {
     }
   }
 
+  rpc path-computation-reroute-request {
+    input {
+      container endpoints {
+        description
+          "Indicates the endpoints termination-point of the service to reroute";
+        leaf a-end-tp {
+          mandatory true;
+          type string;
+        }
+        leaf z-end-tp {
+          mandatory true;
+          type string;
+        }
+      }
+      leaf pce-routing-metric {
+        type transportpce-common-service-path-types:pce-metric;
+      }
+      uses transportpce-common-service-path-types:service-handler-header;
+      container service-a-end {
+        uses transportpce-common-service-path-types:service-endpoint-sp;
+      }
+      container service-z-end {
+        uses transportpce-common-service-path-types:service-endpoint-sp;
+      }
+      uses org-openroadm-routing-constraints:routing-constraints;
+      uses org-openroadm-common-service-types:routing-metric;
+    }
+    output {
+       uses org-openroadm-common-service-types:configuration-response-common;
+    }
+  }
+
   rpc cancel-resource-reserve {
     input {
       leaf service-name {
similarity index 90%
rename from api/src/main/yang/tapi@2018-09-28.yang
rename to api/src/main/yang/tapi@2023-07-28.yang
index 831bc70a304fb3e26cf89f30816fae649f2cb9bb..6255ca59e42b1c3a5454a1d0afdd5b156bf7a18d 100644 (file)
@@ -1,15 +1,15 @@
 module tapi {
-  yang-version 1;
+  yang-version 1.1;
   namespace "urn:opendaylight:params:xml:ns:yang:tapi";
   prefix tapi;
 
   import tapi-topology {
     prefix tapi-topology;
-    revision-date 2018-12-10;
+    revision-date 2022-11-21;
   }
   import tapi-common {
     prefix tapi-common;
-    revision-date 2018-12-10;
+    revision-date 2022-11-21;
   }
   import org-openroadm-common-service-types {
     prefix org-openroadm-common-service-types;
@@ -25,6 +25,10 @@ module tapi {
      Thouenon ( gilles.thouenon@orange.com ) Christophe Betoule ( christophe.betoule@orange.com
      )";
 
+  revision "2023-07-28" {
+    description
+      "Second revision of TAPI model for migration towards TAPI 2.4";
+  }
   revision 2018-09-28 {
     description
       "Initial revision of TAPI model for internal use";
similarity index 57%
rename from api/src/main/yang/transportpce-networkutils@2017-08-18.yang
rename to api/src/main/yang/transportpce-networkutils@2022-06-30.yang
index 8426fa31bc77988d66d974b1f1b5794406eadce7..90fc4ed2af60e57fe7b30cbfc4b0d35980df6fc4 100644 (file)
@@ -1,13 +1,69 @@
 module transportpce-networkutils {
-  yang-version 1;
+  yang-version 1.1;
   namespace "http://org/opendaylight/transportpce/networkutils";
   prefix org-opendaylight-transportpce-networkutils;
 
+  import ietf-network {
+    prefix nd;
+    revision-date 2018-02-26;
+  }
+  import ietf-network-topology {
+    prefix nwt;
+    revision-date 2018-02-26;
+  }
+  import org-openroadm-common-network {
+    prefix cnet;
+    revision-date 2023-05-26;
+  }
+
+  revision 2022-06-30 {
+    description
+      "Add transportpce augmentation to manage otn-link-type in otn-topology";
+  }
+
   revision 2017-08-18 {
     description
       "Initial revision of networkutils model";
   }
 
+  typedef otn-link-type {
+    type enumeration {
+      enum "OTU4" {
+        value 0;
+      }
+      enum "ODU4" {
+        value 1;
+      }
+      enum "ODTU4" {
+        value 2;
+      }
+      enum "ODU2e" {
+        value 3;
+      }
+      enum "ODU0" {
+        value 4;
+      }
+      enum "OTUC4" {
+        value 5;
+      }
+      enum "ODUC4" {
+        value 6;
+      }
+      enum "OTUC3" {
+        value 7;
+      }
+      enum "ODUC3" {
+        value 8;
+      }
+      enum "OTUC2" {
+        value 9;
+      }
+      enum "ODUC2" {
+        value 10;
+      }
+    }
+  }
+
   grouping links-input-grouping {
     container links-input {
       description
@@ -103,4 +159,17 @@ module transportpce-networkutils {
       }
     }
   }
+
+  augment "/nd:networks/nd:network/nwt:link" {
+    when "../nd:network-types/cnet:openroadm-common-network/otn-topology";
+    description
+      "Defines more accurate otn link types to differentiate otn links in otn-topology";
+    leaf otn-link-type {
+      when
+        "../cnet:link-type = 'OTN-LINK'";
+      type otn-link-type;
+      description
+        "type of otn link, to help link management inside transportpce";
+    }
+  }
 }
similarity index 93%
rename from api/src/main/yang/transportpce-portmapping@2022-03-16.yang
rename to api/src/main/yang/transportpce-portmapping@2023-12-21.yang
index e70f74c09ad8bcdd56de2e6bf57ef2e59b11de97..307bf3be3cda57f130409e11eb0f97f0a11dec69 100644 (file)
@@ -25,7 +25,7 @@ module transportpce-portmapping {
   }
   import org-openroadm-port-types {
     prefix org-openroadm-port-types;
-    revision-date 2020-12-11;
+    revision-date 2023-05-26;
   }
 
 
@@ -39,6 +39,15 @@ module transportpce-portmapping {
      authors: Dhruv Bhardwaj ( db929a@att.com ) Shweta Vachhani ( sv111y@att.com )
               Balagangadhar Bathula ( bb4341@att.com )";
 
+  revision 2023-12-21 {
+    description
+       "Add leaflist supported-operational-mode to lcp";
+  }
+  revision 2022-09-22 {
+    description
+       "Add initial support to regenerators functionality; Modify the attribute
+       xponder-type to xpdr-type";
+  }
   revision 2022-03-16 {
     description
       "Align org-openroadm-port-types model version to the latest one,
@@ -248,8 +257,14 @@ module transportpce-portmapping {
           base org-openroadm-port-types:supported-if-capability;
         }
       }
+      leaf-list supported-operational-mode {
+        type string;
+        description
+          "List of operational-mode supported by the port";
+      }
       uses mpdr-restrictions-grp;
-      leaf xponder-type {
+      uses regen-profiles-grp;
+      leaf xpdr-type {
         type org-openroadm-device-types:xpdr-node-types;
       }
       leaf connection-map-lcp {
@@ -273,6 +288,19 @@ module transportpce-portmapping {
     }
   }
 
+  grouping regen-profiles-grp {
+    container regen-profiles {
+      when "../xpdr-type = 'regen'";
+      description
+        "This container is only populated when the xpdr-type is regen";
+      leaf-list regen-profile {
+        description
+          "Supported regen profile, these are otsi-group-capabilities profile";
+          type string;
+      }
+    }
+  }
+
   grouping mpdr-restrictions-grp {
     container mpdr-restrictions {
       when "../port-qual = 'switch-client' and ../../node-info/openroadm-version = '7.1'";
diff --git a/api/src/main/yang/transportpce-stub@2023-02-28.yang b/api/src/main/yang/transportpce-stub@2023-02-28.yang
new file mode 100644 (file)
index 0000000..8da14c9
--- /dev/null
@@ -0,0 +1,29 @@
+module transportpce-stub {
+  yang-version 1;
+  namespace "http://org/opendaylight/transportpce/stub";
+  prefix org-opendaylight-transportpce-stub;
+
+  import transportpce-pathDescription {
+    prefix transportpce-pathDescription;
+    revision-date 2023-05-01;
+  }
+
+
+  organization
+    "transportPCE";
+  contact
+    "transportPCE committers - ODL";
+  description
+    "YANG definitions for defining port mapping in TransportPCE.
+     Copyright (c) 2023 Orange and others. All rights reserved.
+     authors: Gilles Thouenon Emmanuelle Delfour";
+
+  revision 2023-02-28 {
+    description
+      "Model to parse json input file for FrequenciesServiceTests";
+  }
+
+  container path-description {
+      uses transportpce-pathDescription:path-description;
+  }
+}
similarity index 94%
rename from api/src/main/yang/transportpce-tapinetworkutils@2021-04-08.yang
rename to api/src/main/yang/transportpce-tapinetworkutils@2023-07-28.yang
index 60481c7f9f541fca232fb72eea067b45352b887c..8374d90722ed3db5327a07cceea5ad683194c129 100644 (file)
@@ -1,11 +1,11 @@
 module transportpce-tapinetworkutils {
-  yang-version 1;
+  yang-version 1.1;
   namespace "http://org/opendaylight/transportpce/tapinetworkutils";
   prefix "org-opendaylight-transportpce-tapinetworkutils";
 
   import tapi-common {
     prefix tapi-common;
-    revision-date 2018-12-10;
+    revision-date 2022-11-21;
   }
 
   organization
@@ -38,6 +38,10 @@ module transportpce-tapinetworkutils {
       ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
       POSSIBILITY OF SUCH DAMAGE";
 
+  revision "2023-07-28" {
+    description
+      "Second revision of tapi networkutils model for migration towards TAPI 2.4";
+  }
   revision "2021-04-08" {
     description
       "Initial revision of tapi networkutils model. Used as the transportpce-networkutils model to
diff --git a/artifacts/pom.xml b/artifacts/pom.xml
new file mode 100644 (file)
index 0000000..a7f3cfc
--- /dev/null
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright © 2022 Orange and others. All rights reserved.
+
+This program and the accompanying materials are made available under the
+terms of the Eclipse Public License v1.0 which accompanies this distribution,
+and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.opendaylight.odlparent</groupId>
+    <artifactId>odlparent-lite</artifactId>
+    <version>13.0.11</version>
+    <relativePath/>
+  </parent>
+
+  <groupId>org.opendaylight.transportpce</groupId>
+  <artifactId>transportpce-artifacts</artifactId>
+  <version>10.0.0-SNAPSHOT</version>
+  <packaging>pom</packaging>
+
+  <dependencyManagement>
+    <dependencies>
+      <!-- transportpce bundles -->
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>transportpce-api</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>transportpce-common</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>transportpce-networkmodel</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>transportpce-olm</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>transportpce-pce</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>transportpce-pce</artifactId>
+        <version>${project.version}</version>
+        <type>test-jar</type>
+      </dependency>
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>transportpce-renderer</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>transportpce-servicehandler</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>transportpce-tapi</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>transportpce-nbinotifications</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>transportpce-dmaap-client</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>transportpce-inventory</artifactId>
+        <version>${project.version}</version>
+      </dependency>
+      <!-- transportpce features -->
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>features-transportpce</artifactId>
+        <version>${project.version}</version>
+        <type>xml</type>
+        <classifier>features</classifier>
+      </dependency>
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>odl-transportpce</artifactId>
+        <version>${project.version}</version>
+        <type>xml</type>
+        <classifier>features</classifier>
+      </dependency>
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>odl-transportpce-tapi</artifactId>
+        <version>${project.version}</version>
+        <type>xml</type>
+        <classifier>features</classifier>
+      </dependency>
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>odl-transportpce-nbinotifications</artifactId>
+        <version>${project.version}</version>
+        <type>xml</type>
+        <classifier>features</classifier>
+      </dependency>
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>odl-transportpce-dmaap-client</artifactId>
+        <version>${project.version}</version>
+        <type>xml</type>
+        <classifier>features</classifier>
+      </dependency>
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>odl-transportpce-inventory</artifactId>
+        <version>${project.version}</version>
+        <type>xml</type>
+        <classifier>features</classifier>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+</project>
index eef0269b777a3d9fb2961346ca0382b26485b25b..6b07f24e7b749e5cf664d7c1440bc3512406a85a 100644 (file)
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>8.0.11</version>
+    <version>13.0.1</version>
     <relativePath/>
   </parent>
 
   <groupId>org.opendaylight.transportpce</groupId>
   <artifactId>transportpce-common</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
+  <version>10.0.0-SNAPSHOT</version>
   <packaging>bundle</packaging>
 
+  <properties>
+    <transportpce.models.version>20.0.0-SNAPSHOT</transportpce.models.version>
+  </properties>
+
   <dependencyManagement>
     <dependencies>
+      <dependency>
+        <groupId>org.opendaylight.transportpce.models</groupId>
+        <artifactId>transportpce-models-artifacts</artifactId>
+        <version>${transportpce.models.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
       <dependency>
         <groupId>org.opendaylight.netconf</groupId>
         <artifactId>netconf-artifacts</artifactId>
-        <version>2.0.14</version>
+        <version>7.0.4</version>
         <scope>import</scope>
         <type>pom</type>
       </dependency>
 
   <dependencies>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-common</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-1.2.1</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-device</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-2.2.1</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-network</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-7.1.0</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-13.1.0</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-device-1.2.1</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-device-2.2.1</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-device-7.1.0</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-network-13.1.0</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-service-13.1.0</artifactId>
     </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
     </dependency>
     <dependency>
       <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
-      <artifactId>rfc6991-ietf-inet-types</artifactId>
+      <artifactId>rfc8345-ietf-network</artifactId>
     </dependency>
     <dependency>
       <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
-      <artifactId>rfc8345-ietf-network</artifactId>
+      <artifactId>rfc6991-ietf-inet-types</artifactId>
     </dependency>
     <dependency>
       <groupId>org.opendaylight.mdsal</groupId>
     </dependency>
     <dependency>
       <groupId>org.opendaylight.netconf</groupId>
-      <artifactId>sal-netconf-connector</artifactId>
+      <artifactId>netconf-topology</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.github.spotbugs</groupId>
+      <artifactId>spotbugs-annotations</artifactId>
+      <optional>true</optional>
     </dependency>
     <dependency>
       <groupId>com.google.guava</groupId>
       <groupId>com.google.code.gson</groupId>
       <artifactId>gson</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.service.component.annotations</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.service.metatype.annotations</artifactId>
+    </dependency>
 
     <!-- Testing dependencies -->
     <dependency>
index 2cbd0a167c416f5f44c1a572ff0e309bf86ee46a..b5578babef1d59b9f4544f0827bc5cff0752c363 100644 (file)
@@ -8,11 +8,18 @@
 
 package org.opendaylight.transportpce.common;
 
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.network.topology.topology.topology.types.TopologyNetconf;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev231121.network.topology.topology.topology.types.TopologyNetconf;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NetworkTopology;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.TopologyId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
@@ -45,4 +52,58 @@ public final class InstanceIdentifiers {
         // Instance should be not created
     }
 
+    /**
+     * Get an instance identifier related to network termination point.
+     * @param nodeId String
+     * @param tpId String
+     * @return InstanceIdentifier
+     */
+    public static InstanceIdentifier<TerminationPoint1> createNetworkTerminationPoint1IIDBuilder(
+            String nodeId, String tpId) {
+        return InstanceIdentifier.builder(Networks.class)
+                .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
+                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
+                        .networks.network.Node.class,
+                    new NodeKey(new NodeId(nodeId)))
+                .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                        .Node1.class)
+                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                        .networks.network.node.TerminationPoint.class,
+                    new TerminationPointKey(new TpId(tpId)))
+                .augmentation(TerminationPoint1.class)
+                .build();
+    }
+
+    public static InstanceIdentifier<TerminationPoint> createNetworkTerminationPointIIDBuilder(
+            String nodeId, String tpId) {
+        return InstanceIdentifier.builder(Networks.class)
+                .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
+                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
+                        .networks.network.Node.class,
+                    new NodeKey(new NodeId(nodeId)))
+                .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                        .Node1.class)
+                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                        .networks.network.node.TerminationPoint.class,
+                    new TerminationPointKey(new TpId(tpId)))
+                .build();
+    }
+
+
+    /**
+     * Get an instance identifier related to network termination point.
+     * @param nodeId String
+     * @return InstanceIdentifier
+     */
+    public static InstanceIdentifier<Node1> createNodeIIDBuilder(String nodeId) {
+        return InstanceIdentifier.builder(Networks.class)
+                .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
+                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
+                        .networks.network.Node.class,
+                    new NodeKey(new NodeId(nodeId)))
+                .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                        .Node1.class)
+                .build();
+    }
+
 }
index d88754ad82b72a07642d8c5c56d59e3f85ca2b2f..1d6c9cf4e42b52b6db9459e9b01d9f0f03122c20 100644 (file)
@@ -8,6 +8,9 @@
 
 package org.opendaylight.transportpce.common;
 
+import java.util.Map;
+import org.opendaylight.yangtools.yang.common.Uint32;
+
 public final class StringConstants {
 
     public static final String OPENROADM_DEVICE_MODEL_NAME = "org-openroadm-device";
@@ -48,6 +51,16 @@ public final class StringConstants {
 
     public static final String SERVICE_DIRECTION_AZ = "aToz";
     public static final String SERVICE_DIRECTION_ZA = "zToa";
+    public static final String UNKNOWN_MODE = "Unknown Mode";
+
+    public static final Map<String, Uint32> SERVICE_TYPE_RATE = Map.of(
+        SERVICE_TYPE_100GE_T, ServiceRateConstant.RATE_100,
+        SERVICE_TYPE_OTU4, ServiceRateConstant.RATE_100,
+        SERVICE_TYPE_ODUC2, ServiceRateConstant.RATE_200,
+        SERVICE_TYPE_ODUC3, ServiceRateConstant.RATE_300,
+        SERVICE_TYPE_ODUC4, ServiceRateConstant.RATE_400,
+        SERVICE_TYPE_400GE, ServiceRateConstant.RATE_400);
+
 
     private StringConstants() {
         // hiding the default constructor
diff --git a/common/src/main/java/org/opendaylight/transportpce/common/catalog/CatalogConstant.java b/common/src/main/java/org/opendaylight/transportpce/common/catalog/CatalogConstant.java
new file mode 100644 (file)
index 0000000..423ab69
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright © 2022 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.common.catalog;
+
+
+
+/**
+ * Util class for Catalog constants and impairment calculation.
+ */
+
+
+public final class CatalogConstant {
+
+    public static final String ORW100GSC = "OR-W-100G-SC";
+    public static final String ORW100GOFEC316GBD = "OR-W-100G-oFEC-31.6Gbd";
+    public static final String ORW200GOFEC316GBD = "OR-W-200G-oFEC-31.6Gbd";
+    public static final String ORW200GOFEC631GBD = "OR-W-200G-oFEC-63.1Gbd";
+    public static final String ORW300GOFEC631GBD = "OR-W-300G-oFEC-63.1Gbd";
+    public static final String ORW400GOFEC631GBD = "OR-W-400G-oFEC-63.1Gbd";
+    public static final String MWWRCORE = "MW-WR-core";
+    public static final String MWMWCORE = "MW-MW-core";
+    public static final String MWISTANDARD = "MWi-standard";
+    public static final String MWILOWNOISE = "MWi-low-noise";
+    public static final double NLCONSTANTC1 = -2.0;
+    public static final double NLCONSTANTC0UPTO875 = 43.4;
+    public static final double NLCONSTANTC0UPTO1000 = 45.4;
+    public static final double NLCONSTANTC0UPTO1125 = 46.1;
+    public static final double NLCONSTANTC0UPTO1625 = 48.6;
+    public static final double NLCONSTANTC0GT1625 = 60.0;
+    public static final double NLCONSTANTCE = 11.33;
+    public static final double NLCONSTANTEX = -0.09;
+
+    public enum CatalogNodeType { ADD, DROP, EXPRESS, AMP, TSP }
+
+    private CatalogConstant() {
+    }
+}
diff --git a/common/src/main/java/org/opendaylight/transportpce/common/catalog/CatalogUtils.java b/common/src/main/java/org/opendaylight/transportpce/common/catalog/CatalogUtils.java
new file mode 100644 (file)
index 0000000..bfe6060
--- /dev/null
@@ -0,0 +1,855 @@
+/*
+ * Copyright © 2022 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.common.catalog;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.transportpce.common.StringConstants;
+import org.opendaylight.transportpce.common.catalog.CatalogConstant.CatalogNodeType;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.link.types.rev191129.RatioDB;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.ImpairmentType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.amplifier.parameters.Amplifier;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.OpenroadmOperationalModes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.SpecificOperationalModes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.openroadm.operational.modes.Amplifiers;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.openroadm.operational.modes.Roadms;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.openroadm.operational.modes.XpondersPluggables;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.openroadm.operational.modes.xponders.pluggables.XponderPluggableOpenroadmOperationalMode;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.openroadm.operational.modes.xponders.pluggables.XponderPluggableOpenroadmOperationalModeKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.specific.operational.modes.SpecificOperationalMode;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.specific.operational.modes.SpecificOperationalModeKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.roadm.add.parameters.Add;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.roadm.add.parameters.add.AddOpenroadmOperationalMode;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.roadm.add.parameters.add.AddOpenroadmOperationalModeKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.roadm.drop.parameters.Drop;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.roadm.drop.parameters.drop.OpenroadmOperationalMode;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.roadm.drop.parameters.drop.OpenroadmOperationalModeKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.roadm.express.parameters.Express;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.transponder.parameters.Penalties;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.transponder.parameters.PenaltiesKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.transponder.parameters.TXOOBOsnrKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.power.mask.MaskPowerVsPin;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.power.mask.MaskPowerVsPinKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.OperationalModeCatalog;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Utility class for Catalog. Following methods are used to retrieve parameters
+ * from the specification catalog. They point to either openROADM or specific
+ * operational modes. They provide to the PCE, the OLM and the Renderer, the
+ * required parameters to calculate impairments and set output power levels
+ * according to the specifications.
+ *
+ */
+public class CatalogUtils {
+
+    private static final Logger LOG = LoggerFactory.getLogger(CatalogUtils.class);
+
+    private static final String OPMODE_MISMATCH_MSG =
+        "Operational Mode {} passed to getPceRoadmAmpParameters does not correspond to an OpenROADM mode"
+        + "Parameters for amplifier and/or ROADMs can not be derived from specific-operational-modes.";
+    private static final Map<CatalogConstant.CatalogNodeType, String> CATALOGNODETYPE_OPERATIONMODEID_MAP = Map.of(
+        CatalogConstant.CatalogNodeType.ADD, CatalogConstant.MWWRCORE,
+        CatalogConstant.CatalogNodeType.DROP, CatalogConstant.MWWRCORE,
+        CatalogConstant.CatalogNodeType.EXPRESS, CatalogConstant.MWMWCORE,
+        CatalogConstant.CatalogNodeType.AMP, CatalogConstant.MWISTANDARD);
+    private static final Map<String, String> TSP_DEFAULT_OM_MAP = Map.of(
+        StringConstants.SERVICE_TYPE_100GE_T, CatalogConstant.ORW100GSC,
+        StringConstants.SERVICE_TYPE_OTU4, CatalogConstant.ORW100GSC,
+        StringConstants.SERVICE_TYPE_OTUC2,  CatalogConstant.ORW200GOFEC316GBD,
+        StringConstants.SERVICE_TYPE_OTUC3, CatalogConstant.ORW300GOFEC631GBD,
+        StringConstants.SERVICE_TYPE_OTUC4, CatalogConstant.ORW400GOFEC631GBD,
+        StringConstants.SERVICE_TYPE_400GE, CatalogConstant.ORW400GOFEC631GBD);
+
+    private final PenaltiesComparator penaltiesComparator = new PenaltiesComparator();
+    private NetworkTransactionService networkTransactionService;
+
+    public CatalogUtils(NetworkTransactionService networkTransactionService) {
+        this.networkTransactionService = networkTransactionService;
+    }
+
+    /**
+     * Following method returns default OperationalModeId for devices that do not
+     * expose them.
+     *
+     * @param catalogNodeType
+     *            identifies type of nodes in the catalog
+     * @param serviceType
+     *            allows for Xponder selecting default mode according to the rate
+     *
+     * @return a default operational mode that corresponds to initial specifications
+     *
+     */
+    public String getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType catalogNodeType,
+            String serviceType) {
+        if (CATALOGNODETYPE_OPERATIONMODEID_MAP.containsKey(catalogNodeType)) {
+            return CATALOGNODETYPE_OPERATIONMODEID_MAP.get(catalogNodeType);
+        }
+        if (!catalogNodeType.equals(CatalogConstant.CatalogNodeType.TSP)) {
+            LOG.warn("Unsupported catalogNodeType {}", catalogNodeType);
+            return "";
+        }
+        if (!TSP_DEFAULT_OM_MAP.containsKey(serviceType)) {
+            LOG.warn("Unsupported serviceType {} for TSP catalogNodeType", serviceType);
+            return "";
+        }
+        return TSP_DEFAULT_OM_MAP.get(serviceType);
+    }
+
+    /**
+     * This method retrieves channel-spacing associated with a Xponder TX.
+     *
+     * @param operationalModeId
+     *            operational-mode-Id of the Xponder (OR or Specific)
+     *
+     * @return the channel spacing used to correct OSNR contribution values from
+     *         ROADMs and amplifiers
+     * @throws RuntimeException
+     *             if operationalModeId is not described in the catalog
+     */
+
+    public double getPceTxTspChannelSpacing(String operationalModeId) {
+        double baudRate;
+        double maxRollOff;
+        if (operationalModeId.startsWith("OR")) {
+            InstanceIdentifier<XponderPluggableOpenroadmOperationalMode> omCatalogIid = InstanceIdentifier
+                .builder(OperationalModeCatalog.class)
+                .child(OpenroadmOperationalModes.class)
+                .child(XpondersPluggables.class)
+                .child(XponderPluggableOpenroadmOperationalMode.class,
+                    new XponderPluggableOpenroadmOperationalModeKey(operationalModeId))
+                .build();
+            try {
+                Optional<XponderPluggableOpenroadmOperationalMode> omOptional =
+                    networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, omCatalogIid).get();
+                if (omOptional.isEmpty()) {
+                    LOG.error("readMdSal: Error reading Operational Mode Catalog {} , empty list", omCatalogIid);
+                    return 0.0;
+                }
+                XponderPluggableOpenroadmOperationalMode orTspOM = omOptional.orElseThrow();
+                maxRollOff = orTspOM.getMaxRollOff() == null ? 0 : orTspOM.getMaxRollOff().doubleValue();
+                baudRate = orTspOM.getBaudRate().doubleValue();
+            } catch (InterruptedException | ExecutionException e) {
+                LOG.error("readMdSal: Error reading Operational Mode Catalog {} , Mode does not exist", omCatalogIid);
+                throw new RuntimeException("Operational mode not populated in Catalog : " + omCatalogIid + " :" + e);
+            }
+        } else {
+            // In other cases, means the mode is a non OpenROADM specific Operational Mode
+            InstanceIdentifier<SpecificOperationalMode> omCatalogIid = InstanceIdentifier
+                .builder(OperationalModeCatalog.class)
+                .child(SpecificOperationalModes.class)
+                .child(SpecificOperationalMode.class, new SpecificOperationalModeKey(operationalModeId))
+                .build();
+            try {
+                var somOptional =
+                    networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, omCatalogIid).get();
+                if (somOptional.isEmpty()) {
+                    LOG.error("readMdSal: Error reading Operational Mode Catalog {} , empty list", omCatalogIid);
+                    return 0.0;
+                }
+                SpecificOperationalMode speTspOM = somOptional.orElseThrow();
+                maxRollOff = speTspOM.getMaxRollOff() == null ? 0 : speTspOM.getMaxRollOff().doubleValue();
+                baudRate = speTspOM.getBaudRate().doubleValue();
+            } catch (InterruptedException | ExecutionException e) {
+                LOG.error("readMdSal: Error reading Operational Mode Catalog {} , Mode does not exist", omCatalogIid);
+                throw new RuntimeException("Operational mode not populated in Catalog : " + omCatalogIid + " :" + e);
+            }
+        }
+        if (maxRollOff == 0) {
+            if (CatalogConstant.ORW100GSC.contentEquals(operationalModeId)) {
+            // OR 100G SCFEC is the only case where rolloff factor is not mandatory in the catalog
+                LOG.info("Operational Mode {} associated channel spacing is 50.0", operationalModeId);
+                return 50.0;
+            }
+            LOG.warn("Missing rolloff factor (mandatory in Catalog) from Operational Mode {}: use default=0.2",
+                operationalModeId);
+            maxRollOff = 0.2;
+        }
+        double spacing = 12.5 * Math.ceil(baudRate * (1 + maxRollOff) / 12.5);
+        LOG.info("Operational Mode {} associated channel spacing is {}", operationalModeId, spacing);
+        return spacing;
+    }
+
+    /**
+     * This method retrieves performance parameters associated with a Xponder TX.
+     *
+     * @param operationalModeId
+     *            operational-mode-Id of the Xponder (OR or Specific)
+     * @param addDropMuxOperationalModeId
+     *            operational-mode-Id of the Add-Drop bloc the XponderTX is
+     *            associated to (conditions TX-OOB OSNR value)
+     *
+     * @return the linear Optical Noise to signal Ratio
+     * @throws RuntimeException
+     *             if operationalModeId is not described in the catalog
+     */
+    public double getPceTxTspParameters(String operationalModeId, String addDropMuxOperationalModeId) {
+        double txOnsrLin = 0.0;
+        XponderPluggableOpenroadmOperationalMode orTspOM = null;
+        SpecificOperationalMode speTspOM = null;
+        RatioDB minOOBOsnrSingleChannelValue;
+        RatioDB minOOBOsnrMultiChannelValue;
+        if (operationalModeId.startsWith("OR")) {
+            InstanceIdentifier<XponderPluggableOpenroadmOperationalMode> omCatalogIid = InstanceIdentifier
+                .builder(OperationalModeCatalog.class)
+                .child(OpenroadmOperationalModes.class)
+                .child(XpondersPluggables.class)
+                .child(XponderPluggableOpenroadmOperationalMode.class,
+                    new XponderPluggableOpenroadmOperationalModeKey(operationalModeId))
+                .build();
+            try {
+                Optional<XponderPluggableOpenroadmOperationalMode> omOptional =
+                    networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, omCatalogIid).get();
+                if (omOptional.isEmpty()) {
+                    LOG.error("readMdSal: Error reading Operational Mode Catalog {} , empty list", omCatalogIid);
+                    return 0.0;
+                }
+                orTspOM = omOptional.orElseThrow();
+                LOG.debug("readMdSal: Operational Mode Catalog: omOptional.isPresent = true {}", orTspOM);
+                TXOOBOsnrKey key = new TXOOBOsnrKey(addDropMuxOperationalModeId);
+                if (orTspOM.getMinTXOsnr() != null) {
+                    txOnsrLin = 1.0 / Math.pow(10.0, orTspOM.getMinTXOsnr().getValue().doubleValue() / 10.0);
+                }
+                if (orTspOM.nonnullTXOOBOsnr().get(key) == null) {
+                    return txOnsrLin;
+                }
+                minOOBOsnrSingleChannelValue = orTspOM.nonnullTXOOBOsnr().get(key).getMinOOBOsnrSingleChannelValue();
+                minOOBOsnrMultiChannelValue =  orTspOM.nonnullTXOOBOsnr().get(key).getMinOOBOsnrMultiChannelValue();
+            } catch (InterruptedException | ExecutionException e) {
+                LOG.error("readMdSal: Error reading Operational Mode Catalog {} , Mode does not exist", omCatalogIid);
+                throw new RuntimeException(
+                    "readMdSal: Error reading from operational store, Operational Mode Catalog : "
+                        + omCatalogIid + " :" + e);
+            }
+        } else {
+            // In other cases, means the mode is a non OpenROADM specific Operational Mode
+            InstanceIdentifier<SpecificOperationalMode> omCatalogIid = InstanceIdentifier
+                .builder(OperationalModeCatalog.class)
+                .child(SpecificOperationalModes.class)
+                .child(SpecificOperationalMode.class, new SpecificOperationalModeKey(operationalModeId))
+                .build();
+            try {
+                var somOptional =
+                    networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, omCatalogIid).get();
+                if (somOptional.isEmpty()) {
+                    LOG.error("readMdSal: Error reading Operational Mode Catalog {} , empty list", omCatalogIid);
+                    return 0.0;
+                }
+                speTspOM = somOptional.orElseThrow();
+                LOG.debug("readMdSal: Operational Mode Catalog: omOptional.isPresent = true {}", speTspOM);
+                TXOOBOsnrKey key = new TXOOBOsnrKey(addDropMuxOperationalModeId);
+                if (speTspOM.getMinTXOsnr() != null) {
+                    txOnsrLin = 1.0 / Math.pow(10.0, speTspOM.getMinTXOsnr().getValue().doubleValue() / 10.0);
+                }
+                if (speTspOM.nonnullTXOOBOsnr().get(key) == null) {
+                    return txOnsrLin;
+                }
+                minOOBOsnrSingleChannelValue = speTspOM.nonnullTXOOBOsnr().get(key).getMinOOBOsnrSingleChannelValue();
+                minOOBOsnrMultiChannelValue = speTspOM.nonnullTXOOBOsnr().get(key).getMinOOBOsnrMultiChannelValue();
+            } catch (InterruptedException | ExecutionException e) {
+                LOG.error("readMdSal: Error reading Operational Mode Catalog {} , Mode does not exist", omCatalogIid);
+                throw new RuntimeException(
+                    "readMdSal: Error reading from operational store, Operational Mode Catalog : " + omCatalogIid + " :"
+                        + e);
+            }
+        }
+        if (minOOBOsnrSingleChannelValue != null) {
+            txOnsrLin += 1.0 / Math.pow(10.0, minOOBOsnrSingleChannelValue.getValue().doubleValue() / 10.0);
+        }
+        if (minOOBOsnrMultiChannelValue != null) {
+            txOnsrLin += 1.0 / Math.pow(10.0, minOOBOsnrMultiChannelValue.getValue().doubleValue() / 10.0);
+        }
+        return txOnsrLin;
+    }
+
+    /**
+     * This method retrieves performance parameters associated with a Xponder RX.
+     * It calls getRxTspPenalty to evaluate the penalty associated with CD/PMD/PDL
+     * It compares expected OSNR with the OSNR resulting from the line degradation,
+     * and finally calculates and return the resulting margin.
+     *
+     * @param operationalModeId
+     *            operational-mode-Id of the Xponder (OR or Specific)
+     * @param calcCd
+     *            accumulated chromatic dispersion across the line
+     * @param calcPmd
+     *            accumulated Polarization mode dispersion across the line
+     * @param calcPdl
+     *            accumulated Polarization Dependant Loss across the line
+     * @param calcOsnrdB
+     *            Optical Signal to Noise Ratio (dB)resulting from the transmission
+     *            on the line, that shall include the Non Linear contribution
+     *
+     * @return the margin on the service path
+     * @throws RuntimeException
+     *             if operationalModeId is not described in the catalog
+     */
+    public double getPceRxTspParameters(String operationalModeId, double calcCd, double calcPmd,
+            double calcPdl, double calcOsnrdB) {
+        double rxOsnrdB = 0.0;
+        XponderPluggableOpenroadmOperationalMode orTspOM = null;
+        SpecificOperationalMode speTspOM = null;
+        Map<PenaltiesKey, Penalties> penaltiesMap = null;
+        if (operationalModeId.startsWith("OR")) {
+            var omCatalogIid = InstanceIdentifier
+                .builder(OperationalModeCatalog.class)
+                .child(OpenroadmOperationalModes.class)
+                .child(XpondersPluggables.class)
+                .child(XponderPluggableOpenroadmOperationalMode.class,
+                    new XponderPluggableOpenroadmOperationalModeKey(operationalModeId))
+                .build();
+            try {
+                Optional<XponderPluggableOpenroadmOperationalMode> omOptional = networkTransactionService
+                    .read(LogicalDatastoreType.CONFIGURATION, omCatalogIid).get();
+                if (omOptional.isPresent()) {
+                    orTspOM = omOptional.orElseThrow();
+                    LOG.debug("readMdSal: Operational Mode Catalog: omOptional.isPresent = true {}", orTspOM);
+                    if (orTspOM.getMinRXOsnrTolerance() != null) {
+                        rxOsnrdB = orTspOM.getMinRXOsnrTolerance().getValue().doubleValue();
+                    }
+                    penaltiesMap = orTspOM.getPenalties();
+                }
+            } catch (InterruptedException | ExecutionException e) {
+                LOG.error("readMdSal: Error reading Operational Mode Catalog {} , Mode does not exist", omCatalogIid);
+                throw new RuntimeException(
+                    "readMdSal: Error reading from operational store, Operational Mode Catalog : " + omCatalogIid + " :"
+                        + e);
+            }
+        } else {
+            // In other cases, means the mode is a non OpenROADM specific Operational Mode
+            // InstanceIdentifier<SpecificOperationalMode> omCatalogIid = InstanceIdentifier
+            var omCatalogIid = InstanceIdentifier
+                .builder(OperationalModeCatalog.class)
+                .child(SpecificOperationalModes.class)
+                .child(SpecificOperationalMode.class, new SpecificOperationalModeKey(operationalModeId))
+                .build();
+            try {
+                Optional<SpecificOperationalMode> somOptional = networkTransactionService
+                    .read(LogicalDatastoreType.CONFIGURATION, omCatalogIid).get();
+                if (somOptional.isPresent()) {
+                    speTspOM = somOptional.orElseThrow();
+                    LOG.debug("readMdSal: Operational Mode Catalog: omOptional.isPresent = true {}", speTspOM);
+                    if (speTspOM.getMinRXOsnrTolerance() != null) {
+                        rxOsnrdB = speTspOM.getMinRXOsnrTolerance().getValue().doubleValue();
+                    }
+                    penaltiesMap = speTspOM.getPenalties();
+                }
+            } catch (InterruptedException | ExecutionException e) {
+                LOG.error("readMdSal: Error reading Operational Mode Catalog {} , Mode does not exist", omCatalogIid);
+                throw new RuntimeException(
+                    "readMdSal: Error reading from operational store, Operational Mode Catalog : " + omCatalogIid + " :"
+                        + e);
+            }
+        }
+        if (penaltiesMap == null) {
+            LOG.error("Unable to calculate margin as penaltyMap can not be retrieved : Operational mode not populated");
+            return -9999.9;
+        }
+        HashMap<String, Double> impairments = new HashMap<>();
+        double penalty = getRxTspPenalty(calcCd, ImpairmentType.CDPsNm, penaltiesMap);
+        impairments.put("CDpenalty", penalty);
+        double totalPenalty = penalty;
+        penalty = getRxTspPenalty(calcPmd, ImpairmentType.PMDPs, penaltiesMap);
+        impairments.put("PMD Penalty", penalty);
+        totalPenalty += penalty;
+        // Calculation according to OpenROADM specification
+        // penalty = getRxTspPenalty(calcPdl, ImpairmentType.PDLDB, penaltiesMap);
+        // Calculation modified according to Julia's Tool
+        penalty = calcPdl / 2;
+        impairments.put("PDL penalty", penalty);
+        totalPenalty += penalty;
+        // TODO for Future work since at that time we have no way to calculate the following
+        // parameters,even if penalties are defined in the OpenROADM specifications
+        //
+        // impairments.put("Colorless Drop Adjacent Xtalk Penalty", getRxTspPenalty(TBD,
+        // ImpairmentType.ColorlessDropAdjacentChannelCrosstalkGHz, penalitiesMap));
+        // impairments.put("XTalk total Power Penalty", getRxTspPenalty(TBD,
+        // ImpairmentType.CrossTalkTotalPowerDB, penalitiesMap));
+        // impairments.put("Power penalty", getRxTspPenalty(TBD,
+        // ImpairmentType.PowerDBm, penalitiesMap));
+        LOG.info("Penalty resulting from CD, PMD and PDL is {} dB with following contributions {}",
+            totalPenalty, impairments);
+        double margin = calcOsnrdB - totalPenalty - rxOsnrdB;
+        LOG.info("According to RX TSP Specification and calculated impairments Margin is {} dB ", margin);
+        if (margin < 0) {
+            LOG.warn("Negative margin shall result in PCE rejecting the analyzed path");
+        }
+        return margin;
+    }
+
+    /**
+     * This generic method is called from getPceRxTspParameters to provide the
+     * Penalties associated with CD, PMD and DGD for Xponder. It scans a penalty
+     * list that includes penalty values corresponding to an interval between an
+     * upper and a lower boundary for each of the above parameters.
+     *
+     * @param impairmentType
+     *            : the type of impairment (CD/PMD/DGD)
+     * @param calculatedParameter
+     *            calculated accumulated value on the line for the impairment
+     * @param penaltiesMap
+     *            the global map of penalties retrieved by getPceRxTspParameters
+     *            from the Xponder operational mode
+     *
+     * @return the penalty associated with accumulated impairment if it is in the
+     *         range specified in the table, a value that will lead to reject the
+     *         path if this is not the case
+     */
+
+    private double getRxTspPenalty(double calculatedParameter, ImpairmentType impairmentType,
+            Map<PenaltiesKey, Penalties> penalitiesMap) {
+        Penalties penalty = penalitiesMap.values().stream()
+            // We only keep penalties corresponding to the calculated Parameter
+            .filter(val -> val.getParameterAndUnit().getName().equals(impairmentType.getName()))
+            // we sort it according to the comparator (based on up-to-boundary)
+            .sorted(penaltiesComparator)
+            // keep only items for which up to boundary is greater than calculatedParameter
+            .filter(val -> val.getUpToBoundary().doubleValue() >= calculatedParameter)
+            // takes the immediate greater or equal value
+            .findFirst().orElse(null);
+        if (penalty == null) {
+            //means a boundary that is greater than calculatedParameter couldn't be found
+            // Out of specification!
+            return 9999.9;
+        }
+        // In spec, return penalty associated with calculatedParameter
+        LOG.info("Penalty for {} is {} dB", impairmentType, penalty.getPenaltyValue().getValue().doubleValue());
+        return penalty.getPenaltyValue().getValue().doubleValue();
+    }
+
+    /**
+     * This method retrieves performance parameters associated with ROADMs and
+     * Amplifiers. It calculates the contribution of the node to the degradation of
+     * the signal for CD, DGD, PDL, and OSNR which is calculated through a
+     * polynomial fit described in the catalog. It finally corrects the accumulated
+     * values for these parameters and return them.
+     *
+     * @param catalogNodeType
+     *            crossed node path type (ADD/DROP/EXPRESS/AMP)
+     * @param operationalModeId
+     *            operational-mode-Id of the Node (OpenROADM only)
+     * @param cd
+     *            accumulated chromatic dispersion across the line
+     * @param dgd2
+     *            Square of accumulated Group velocity dispersion across the line
+     * @param pdl2
+     *            Square of the accumulated Polarization Dependant Loss across the
+     *            line
+     * @param pwrIn
+     *            Input power required to calculate OSNR contribution of the node =
+     *            f(pwrIn)
+     * @param onsrLin
+     *            Linear Optical Noise to Signal Ratio resulting from the
+     *            transmission on the line, that shall include the Non Linear
+     *            contribution
+     * @param spacing
+     *            Interchannel spacing used for correction to calculate OSNR
+     *            contribution of the node
+     *
+     * @return Impairment, a map that provides corrected values for all calculated
+     *         parameters which includes the contribution of the node
+     *         (CD/DGD2/PDL2/ONSRLin)
+     * @throws RuntimeException
+     *             if operationalModeId is not described in the catalog
+     */
+
+    public Map<String, Double> getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType catalogNodeType,
+            String operationalModeId, double pwrIn, double cd, double dgd2, double pdl2,
+            double onsrLin, double spacing) {
+        double maxIntroducedCd;
+        double maxIntroducedPdl;
+        double maxIntroducedDgd;
+        List<Double> osnrPolynomialFits;
+        switch (catalogNodeType) {
+            case ADD:
+                var omCatalogIid = InstanceIdentifier
+                    .builder(OperationalModeCatalog.class)
+                    .child(OpenroadmOperationalModes.class)
+                    .child(Roadms.class)
+                    .child(Add.class)
+                    .child(AddOpenroadmOperationalMode.class, new AddOpenroadmOperationalModeKey(operationalModeId))
+                    .build();
+                try {
+                    var omOptional =
+                        networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, omCatalogIid).get();
+                    if (omOptional.isEmpty()) {
+                        LOG.error(OPMODE_MISMATCH_MSG, operationalModeId);
+                        return new HashMap<>();
+                    }
+                    var orAddOM = omOptional.orElseThrow();
+                    LOG.debug("readMdSal: Operational Mode Catalog: omOptional.isPresent = true {}", orAddOM);
+                    maxIntroducedCd = orAddOM.getMaxIntroducedCd().doubleValue();
+                    // As per current OpenROADM Spec
+                    //maxIntroducedPdl = orAddOM.getMaxIntroducedPdl().getValue().doubleValue();
+                    // Applying calculation as provided in Julia's tool
+                    maxIntroducedPdl = Math.sqrt(0.2 * 0.2 + 0.4 * 0.4);
+                    maxIntroducedDgd = orAddOM.getMaxIntroducedDgd().doubleValue();
+                    osnrPolynomialFits = List.of(orAddOM.getIncrementalOsnr().getValue().doubleValue());
+                } catch (InterruptedException | ExecutionException e) {
+                    onsrLin = 1;
+                    LOG.error("readMdSal: Error reading Operational Mode Catalog {} , Mode does not exist",
+                        omCatalogIid);
+                    throw new RuntimeException(
+                        "readMdSal: Error reading from operational store, Operational Mode Catalog : "
+                            + omCatalogIid + " :" + e);
+                }
+                break;
+
+            case DROP:
+                var omCatalogIid1 = InstanceIdentifier
+                    .builder(OperationalModeCatalog.class)
+                    .child(OpenroadmOperationalModes.class)
+                    .child(Roadms.class)
+                    .child(Drop.class)
+                    .child(OpenroadmOperationalMode.class, new OpenroadmOperationalModeKey(operationalModeId))
+                    .build();
+                try {
+                    var omOptional =
+                        networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, omCatalogIid1).get();
+                    if (omOptional.isEmpty()) {
+                        LOG.error(OPMODE_MISMATCH_MSG, operationalModeId);
+                        return new HashMap<>();
+                    }
+                    var orDropOM = omOptional.orElseThrow();
+                    LOG.debug("readMdSal: Operational Mode Catalog: omOptional.isPresent = true {}", orDropOM);
+                    maxIntroducedCd = orDropOM.getMaxIntroducedCd().doubleValue();
+                    // As per current OpenROADM Spec
+                    // maxIntroducedPdl = orDropOM.getMaxIntroducedPdl().getValue().doubleValue();
+                    // Applying calculation as provided in Julia's tool
+                    maxIntroducedPdl = Math.sqrt(0.2 * 0.2 + 0.4 * 0.4);
+                    maxIntroducedDgd = orDropOM.getMaxIntroducedDgd().doubleValue();
+                    osnrPolynomialFits = List.of(
+                        orDropOM.getOsnrPolynomialFit().getD().doubleValue(),
+                        orDropOM.getOsnrPolynomialFit().getC().doubleValue(),
+                        orDropOM.getOsnrPolynomialFit().getB().doubleValue(),
+                        orDropOM.getOsnrPolynomialFit().getA().doubleValue());
+                } catch (InterruptedException | ExecutionException e) {
+                    LOG.error("readMdSal: Error reading Operational Mode Catalog {} , Mode does not exist",
+                        omCatalogIid1);
+                    throw new RuntimeException(
+                        "readMdSal: Error reading from operational store, Operational Mode Catalog : "
+                            + omCatalogIid1 + " :" + e);
+                }
+                break;
+
+            case EXPRESS:
+                var omCatalogIid2 = InstanceIdentifier
+                    .builder(OperationalModeCatalog.class)
+                    .child(OpenroadmOperationalModes.class)
+                    .child(Roadms.class)
+                    .child(Express.class)
+                    .child(
+                        org.opendaylight.yang.gen.v1.http
+                            .org.openroadm.operational.mode.catalog.rev230526
+                            .operational.mode.roadm.express.parameters.express.OpenroadmOperationalMode.class,
+                        new org.opendaylight.yang.gen.v1.http
+                            .org.openroadm.operational.mode.catalog.rev230526
+                            .operational.mode.roadm.express.parameters.express.OpenroadmOperationalModeKey(
+                                operationalModeId))
+                    .build();
+                try {
+                    var omOptional = networkTransactionService
+                        .read(LogicalDatastoreType.CONFIGURATION, omCatalogIid2)
+                        .get();
+                    if (omOptional.isEmpty()) {
+                        LOG.error(OPMODE_MISMATCH_MSG, operationalModeId);
+                        return new HashMap<>();
+                    }
+                    var orExpressOM = omOptional.orElseThrow();
+                    LOG.debug("readMdSal: Operational Mode Catalog: omOptional.isPresent = true {}", orExpressOM);
+                    maxIntroducedCd = orExpressOM.getMaxIntroducedCd().doubleValue();
+                    // As per current OpenROADM Spec
+                    // maxIntroducedPdl = orExpressOM.getMaxIntroducedPdl().getValue().doubleValue();
+                    // Applying calculation as provided in Julia's tool
+                    maxIntroducedPdl = Math.sqrt(2 * 0.2 * 0.2 + 2 * 0.4 * 0.4);
+                    maxIntroducedDgd = orExpressOM.getMaxIntroducedDgd().doubleValue();
+                    osnrPolynomialFits = List.of(
+                        orExpressOM.getOsnrPolynomialFit().getD().doubleValue(),
+                        orExpressOM.getOsnrPolynomialFit().getC().doubleValue(),
+                        orExpressOM.getOsnrPolynomialFit().getB().doubleValue(),
+                        orExpressOM.getOsnrPolynomialFit().getA().doubleValue());
+                } catch (InterruptedException | ExecutionException e) {
+                    LOG.error("readMdSal: Error reading Operational Mode Catalog {} , Mode does not exist",
+                        omCatalogIid2);
+                    throw new RuntimeException(
+                        "readMdSal: Error reading from operational store, Operational Mode Catalog : "
+                            + omCatalogIid2 + " :" + e);
+                }
+                break;
+
+            case AMP:
+                var omCatalogIid3 = InstanceIdentifier
+                    .builder(OperationalModeCatalog.class)
+                    .child(OpenroadmOperationalModes.class)
+                    .child(Amplifiers.class)
+                    .child(Amplifier.class)
+                    .child(
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526
+                            .operational.mode.amplifier.parameters.amplifier.OpenroadmOperationalMode.class,
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526
+                            .operational.mode.amplifier.parameters.amplifier.OpenroadmOperationalModeKey(
+                                    operationalModeId))
+                    .build();
+                try {
+                    var omOptional = networkTransactionService
+                        .read(LogicalDatastoreType.CONFIGURATION, omCatalogIid3)
+                        .get();
+                    if (omOptional.isEmpty()) {
+                        LOG.error(OPMODE_MISMATCH_MSG, operationalModeId);
+                        return new HashMap<>();
+                    }
+                    var orAmpOM = omOptional.orElseThrow();
+                    LOG.debug("readMdSal: Operational Mode Catalog: omOptional.isPresent = true {}", orAmpOM);
+                    maxIntroducedCd = orAmpOM.getMaxIntroducedCd().doubleValue();
+                    // As per current OpenROADM Spec
+                    // maxIntroducedPdl = orAmpOM.getMaxIntroducedPdl().getValue().doubleValue();
+                    // Applying calculation as provided in Julia's tool
+                    maxIntroducedPdl = 0.2;
+                    maxIntroducedDgd = orAmpOM.getMaxIntroducedDgd().doubleValue();
+                    osnrPolynomialFits = List.of(
+                        orAmpOM.getOsnrPolynomialFit().getD().doubleValue(),
+                        orAmpOM.getOsnrPolynomialFit().getC().doubleValue(),
+                        orAmpOM.getOsnrPolynomialFit().getB().doubleValue(),
+                        orAmpOM.getOsnrPolynomialFit().getA().doubleValue());
+                } catch (InterruptedException | ExecutionException e) {
+                    LOG.error("readMdSal: Error reading Operational Mode Catalog {} , Mode does not exist",
+                        omCatalogIid3);
+                    throw new RuntimeException(
+                        "readMdSal: Error reading from operational store, Operational Mode Catalog : "
+                            + omCatalogIid3 + " :" + e);
+                }
+                break;
+            default:
+                LOG.error("Unsupported catalogNodeType {}", catalogNodeType);
+                return new HashMap<>();
+        }
+        cd += maxIntroducedCd;
+        pdl2 += Math.pow(maxIntroducedPdl, 2.0);
+        dgd2 += Math.pow(maxIntroducedDgd, 2.0);
+        double pwrFact = 1;
+        double contrib = 0;
+        // We correct PwrIn to the value corresponding to a 50 GHz Bandwidth, because OpenROADM spec (polynomial fit)
+        // is based on power in 50GHz Bandwidth
+        pwrIn -= 10 * Math.log10(spacing / 50.0);
+        if (catalogNodeType != CatalogNodeType.ADD) {
+            // For add, incremental OSNR is defined for Noiseless input, BW Correction (contrib) does not apply
+            contrib = 10 * Math.log10(spacing / 50.0);
+        }
+        for (double fit : osnrPolynomialFits) {
+            contrib += pwrFact * fit;
+            pwrFact *= pwrIn;
+            // Using a for loop with multiplication instead of Math.pow optimizes the computation.
+        }
+        // Double is not strictly spoken a Mathematics commutative group because
+        // computers design limits their bits representation size.
+        // As a result, the order of arithmetic operation matters.
+        // In a sum, smallest numbers should be introduced first for a maximum of
+        // precision. In other words, the sum
+        //    10 * Math.log10(spacing / 50.0)
+        //    + osnrPolynomialFits.get(0)
+        //    + osnrPolynomialFits.get(1) * pwrIn
+        //    + osnrPolynomialFits.get(2) * Math.pow(pwrIn, 2)
+        //    + osnrPolynomialFits.get(3) * Math.pow(pwrIn, 3)
+        // is not equal to its reverse form
+        //    osnrPolynomialFits.get(3) * Math.pow(pwrIn, 3)
+        //    + osnrPolynomialFits.get(2) * Math.pow(pwrIn, 2)
+        //    + osnrPolynomialFits.get(1) * pwrIn
+        //    + osnrPolynomialFits.get(0)
+        //    + 10 * Math.log10(spacing / 50.0)
+        // and the more precise first form should be preferred here.
+        onsrLin += Math.pow(10, -contrib / 10);
+        Map<String, Double> impairments = new HashMap<>();
+        impairments.put("CD", cd);
+        impairments.put("DGD2", dgd2);
+        impairments.put("PDL2", pdl2);
+        impairments.put("ONSRLIN", onsrLin);
+        LOG.info("Accumulated CD is {} ps, DGD is {} ps and PDL is {} dB", cd, Math.sqrt(dgd2), Math.sqrt(pdl2));
+        LOG.info("Resulting OSNR is {} dB", 10 * Math.log10(1 / onsrLin));
+        return impairments;
+    }
+
+    /**
+     * This method calculates power that shall be applied at the output of ROADMs and
+     * Amplifiers. It retrieves the mask-power-vs-Pin and calculates target output
+     * power from the span loss
+     *
+     * @param catalogNodeType
+     *            crossed node path type (ADD/EXPRESS/AMP)
+     * @param operationalModeId
+     *            operational-mode-Id of the Node (OpenROADM only)
+     * @param spanLoss
+     *            spanLoss at the output of the ROADM
+     * @param powerCorrection
+     *            correction to be applied to the calculated power according to fiber type
+     * @param spacing
+     *            Interchannel spacing used for correction to calculate output power
+     * @return outputPower
+     *         Corrected output power calculated according to channel spacing
+     * @throws RuntimeException
+     *             if operationalModeId is not described in the catalog
+     */
+    public double getPceRoadmAmpOutputPower(CatalogConstant.CatalogNodeType catalogNodeType,
+            String operationalModeId, double spanLoss, double spacing, double powerCorrection) {
+        double pout = 99999.0;
+        switch (catalogNodeType) {
+            case ADD:
+                var omCatalogIid = InstanceIdentifier
+                    .builder(OperationalModeCatalog.class)
+                    .child(OpenroadmOperationalModes.class)
+                    .child(Roadms.class)
+                    .child(Add.class)
+                    .child(AddOpenroadmOperationalMode.class, new AddOpenroadmOperationalModeKey(operationalModeId))
+                    .build();
+                try {
+                    var omOptional =
+                        networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, omCatalogIid).get();
+                    if (omOptional.isEmpty()) {
+                        LOG.error(OPMODE_MISMATCH_MSG, operationalModeId);
+                        return pout;
+                    }
+                    var orAddOM = omOptional.orElseThrow();
+                    LOG.debug("readMdSal: Operational Mode Catalog: omOptional.isPresent = true {}", orAddOM);
+                    var mask = orAddOM.getMaskPowerVsPin();
+                    for (Map.Entry<MaskPowerVsPinKey, MaskPowerVsPin> pw : mask.entrySet()) {
+                        if (spanLoss >= pw.getKey().getLowerBoundary().doubleValue()
+                            && spanLoss <= pw.getKey().getUpperBoundary().doubleValue()) {
+                            pout = pw.getValue().getC().doubleValue() * spanLoss + pw.getValue().getD().doubleValue()
+                                + powerCorrection + 10 * Math.log10(spacing / 50.0);
+                            LOG.info("Calculated target Output power is {} dB in {} Bandwidth", pout, spacing);
+                            return pout;
+                        }
+                    }
+                    LOG.info("Did not succeed in calculating target Output power, SpanLoss {} dB is out of range",
+                        spanLoss);
+                } catch (InterruptedException | ExecutionException e) {
+                    LOG.error("readMdSal: Error reading Operational Mode Catalog {} , Mode does not exist",
+                        omCatalogIid);
+                    throw new RuntimeException(
+                        "readMdSal: Error reading from operational store, Operational Mode Catalog : "
+                            + omCatalogIid + " :" + e);
+                }
+                break;
+
+            case EXPRESS:
+                var omCatalogIid2 = InstanceIdentifier
+                    .builder(OperationalModeCatalog.class)
+                    .child(OpenroadmOperationalModes.class)
+                    .child(Roadms.class)
+                    .child(Express.class)
+                    .child(
+                        org.opendaylight.yang.gen.v1.http
+                            .org.openroadm.operational.mode.catalog.rev230526
+                            .operational.mode.roadm.express.parameters.express.OpenroadmOperationalMode.class,
+                        new org.opendaylight.yang.gen.v1.http
+                            .org.openroadm.operational.mode.catalog.rev230526
+                            .operational.mode.roadm.express.parameters.express.OpenroadmOperationalModeKey(
+                                operationalModeId))
+                    .build();
+                try {
+                    var omOptional = networkTransactionService
+                        .read(LogicalDatastoreType.CONFIGURATION, omCatalogIid2)
+                        .get();
+                    if (omOptional.isEmpty()) {
+                        LOG.error(OPMODE_MISMATCH_MSG, operationalModeId);
+                        return pout;
+                    }
+                    var orExpressOM = omOptional.orElseThrow();
+                    LOG.debug("readMdSal: Operational Mode Catalog: omOptional.isPresent = true {}", orExpressOM);
+                    var mask = orExpressOM.getMaskPowerVsPin();
+                    for (Map.Entry<MaskPowerVsPinKey, MaskPowerVsPin> pw : mask.entrySet()) {
+                        if (spanLoss >= pw.getKey().getLowerBoundary().doubleValue()
+                                && spanLoss <= pw.getKey().getUpperBoundary().doubleValue()) {
+                            pout = pw.getValue().getC().doubleValue() * spanLoss + pw.getValue().getD().doubleValue()
+                                + powerCorrection + 10 * Math.log10(spacing / 50.0);
+                            LOG.info("Calculated target Output power is {} dB in {} Bandwidth", pout, spacing);
+                            return pout;
+                        }
+                    }
+                    LOG.info("Did not succeed in calculating target Output power, SpanLoss {} dB is out of range",
+                        spanLoss);
+                } catch (InterruptedException | ExecutionException e) {
+                    LOG.error("readMdSal: Error reading Operational Mode Catalog {} , Mode does not exist",
+                        omCatalogIid2);
+                    throw new RuntimeException(
+                        "readMdSal: Error reading from operational store, Operational Mode Catalog : "
+                            + omCatalogIid2 + " :" + e);
+                }
+                break;
+
+            default:
+                LOG.error("Unsupported catalogNodeType {}", catalogNodeType);
+        }
+        return pout;
+    }
+
+    /**
+     * Non linear contribution computation.
+     * Public method calculating non linear contribution among the path from
+     * launched power and span length Formula comes from
+     * OpenROADM_OSNR_Calculation_20220610 Tool The resulting contribution shall be
+     * calculated for each fiber span and summed up
+     * @param launchedPowerdB
+     *            The power launched in the span (shall account for Optical Distribution
+     *            Frame loss)
+     * @param spanLength
+     *            Length of the span in km
+     * @param spacing
+     *            OpenROADM power and osnr contribution calculations are based on
+     *            spacing between channels : the Media Channel (MC) width
+     *
+     * @return nonLinearOnsrContributionLin
+     *         The inverse of the NL OSNR contribution converted from dB to linear value
+     */
+    public double calculateNLonsrContribution(double launchedPowerdB, double spanLength, double spacing) {
+        double constanteC0 = 0 ;
+        if (spacing > 162.5) {
+            constanteC0 = CatalogConstant.NLCONSTANTC0GT1625;
+        } else if (spacing > 112.5) {
+            constanteC0 = CatalogConstant.NLCONSTANTC0UPTO1625;
+        } else if (spacing > 100.0) {
+            constanteC0 = CatalogConstant.NLCONSTANTC0UPTO1125;
+        } else if (spacing > 87.5) {
+            constanteC0 = CatalogConstant.NLCONSTANTC0UPTO1000;
+        } else {
+            constanteC0 = CatalogConstant.NLCONSTANTC0UPTO875;
+        }
+        double nonLinearOnsrContributionLinDb = launchedPowerdB * CatalogConstant.NLCONSTANTC1
+            + constanteC0 + CatalogConstant.NLCONSTANTCE * Math.exp(CatalogConstant.NLCONSTANTEX * spanLength);
+        LOG.info(" OSNR Non Linear contribution is {} dB", nonLinearOnsrContributionLinDb);
+        return Math.pow(10.0, -nonLinearOnsrContributionLinDb / 10);
+    }
+
+    public boolean isCatalogFilled() {
+        var omCatalogIid = InstanceIdentifier
+            .builder(OperationalModeCatalog.class)
+            .child(OpenroadmOperationalModes.class)
+            .child(Roadms.class)
+            .child(Add.class)
+            .child(AddOpenroadmOperationalMode.class, new AddOpenroadmOperationalModeKey(CatalogConstant.MWWRCORE))
+            .build();
+        try {
+            if (networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, omCatalogIid).get().isEmpty()) {
+                LOG.error("Operational Mode catalog is not filled");
+                return false;
+            }
+            return true;
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("readMdSal: Error reading Operational Mode Catalog, catalog not filled");
+            throw new RuntimeException(
+                "readMdSal: Error reading from operational store, Operational Mode Catalog not filled" + e);
+        }
+    }
+
+}
diff --git a/common/src/main/java/org/opendaylight/transportpce/common/catalog/PenaltiesComparator.java b/common/src/main/java/org/opendaylight/transportpce/common/catalog/PenaltiesComparator.java
new file mode 100644 (file)
index 0000000..3759565
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright © 2022 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.common.catalog;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import java.io.Serializable;
+import java.util.Comparator;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.transponder.parameters.Penalties;
+
+@SuppressWarnings("serial")
+@SuppressFBWarnings(
+    value = "SE_NO_SERIALVERSIONID",
+    justification = "https://github.com/rzwitserloot/lombok/wiki/WHY-NOT:-serialVersionUID")
+public class PenaltiesComparator implements Comparator<Penalties>, Serializable {
+    @Override
+    public int compare(Penalties o1, Penalties o2) {
+        return Double.compare(o1.getUpToBoundary().doubleValue(), o2.getUpToBoundary().doubleValue());
+    }
+}
old mode 100644 (file)
new mode 100755 (executable)
index f29e660..e87d0a1
@@ -13,9 +13,13 @@ import com.google.gson.JsonParser;
 import com.google.gson.stream.JsonReader;
 import com.google.gson.stream.JsonWriter;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.io.Writer;
+import java.nio.charset.StandardCharsets;
 import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -28,7 +32,7 @@ import org.opendaylight.yangtools.yang.data.codec.gson.JSONNormalizedNodeStreamW
 import org.opendaylight.yangtools.yang.data.codec.gson.JsonParserStream;
 import org.opendaylight.yangtools.yang.data.codec.gson.JsonWriterFactory;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
-import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
+import org.opendaylight.yangtools.yang.data.impl.schema.NormalizationResultHolder;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.EffectiveStatementInference;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
@@ -61,18 +65,18 @@ public class JsonStringConverter<T extends DataObject> {
          */
 
         JSONCodecFactory codecFactory = supplier
-                .getShared(bindingDOMCodecServices.getRuntimeContext().getEffectiveModelContext());
+                .getShared(bindingDOMCodecServices.getRuntimeContext().modelContext());
         try (Writer writer = new StringWriter();
-                JsonWriter jsonWriter = JsonWriterFactory.createJsonWriter(writer, 4);) {
+                JsonWriter jsonWriter = JsonWriterFactory.createJsonWriter(writer, 4)) {
             EffectiveStatementInference rootNode = SchemaInferenceStack
-                .of(bindingDOMCodecServices.getRuntimeContext().getEffectiveModelContext())
+                .of(bindingDOMCodecServices.getRuntimeContext().modelContext())
                 .toInference();
-            rootNode.getEffectiveModelContext();
-            rootNode.getEffectiveModelContext();
+            rootNode.modelContext();
+            rootNode.modelContext();
             NormalizedNodeStreamWriter jsonStreamWriter = JSONNormalizedNodeStreamWriter
                 .createExclusiveWriter(codecFactory, rootNode, EffectiveModelContext.NAME.getNamespace(), jsonWriter);
             try (NormalizedNodeWriter nodeWriter = NormalizedNodeWriter.forStreamWriter(jsonStreamWriter)) {
-                nodeWriter.write(bindingDOMCodecServices.toNormalizedNode(id, dataObject).getValue());
+                nodeWriter.write(bindingDOMCodecServices.toNormalizedDataObject(id, dataObject).node());
                 nodeWriter.flush();
             }
             JsonObject asJsonObject = JsonParser.parseString(writer.toString()).getAsJsonObject();
@@ -93,17 +97,37 @@ public class JsonStringConverter<T extends DataObject> {
     @SuppressWarnings("unchecked")
     public T createDataObjectFromJsonString(YangInstanceIdentifier path, String jsonString,
             JSONCodecFactorySupplier supplier) {
-        JsonReader reader = new JsonReader(new StringReader(jsonString));
-        NormalizedNodeResult result = new NormalizedNodeResult();
-        try (NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
-                JsonParserStream jsonParser = JsonParserStream
-                    .create(
-                        streamWriter,
-                        supplier.getShared(bindingDOMCodecServices.getRuntimeContext().getEffectiveModelContext()))) {
+        return createDataObjectFromReader(path, new StringReader(jsonString), supplier);
+    }
+
+    public T createDataObjectFromInputStream(YangInstanceIdentifier path, InputStream jsonStream,
+                                            JSONCodecFactorySupplier supplier) {
+        return createDataObjectFromReader(path, new InputStreamReader(jsonStream, StandardCharsets.UTF_8), supplier);
+    }
+
+    /**
+     * Create a dataObject of T type from Reader.
+     * @param path YangInstanceIdentifier
+     * @param inputReader Reader (could be all class implementing Reader) containing Json data.
+     * @param supplier RFC7951 or DRAFT_LHOTKA_NETMOD_YANG_JSON_02
+     * @return the created object.
+     */
+    @SuppressWarnings("unchecked")
+    private T createDataObjectFromReader(YangInstanceIdentifier path, Reader inputReader,
+                                         JSONCodecFactorySupplier supplier) {
+
+        NormalizationResultHolder result = new NormalizationResultHolder();
+        try (JsonReader reader = new JsonReader(inputReader);
+             NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
+             JsonParserStream jsonParser = JsonParserStream
+                     .create(
+                             streamWriter,
+                             supplier.getShared(bindingDOMCodecServices
+                                     .getRuntimeContext().modelContext()))) {
             jsonParser.parse(reader);
-            return (T) bindingDOMCodecServices.fromNormalizedNode(path, result.getResult()).getValue();
+            return (T) bindingDOMCodecServices.fromNormalizedNode(path, result.getResult().data()).getValue();
         } catch (IOException e) {
-            LOG.warn("An error occured during parsing Json input stream", e);
+            LOG.warn("An error occured during parsing input reader", e);
             return null;
         }
     }
index 05ee1648b5c1b8f70db2da08d8d609eda163f96f..a86ed36d5ae91fc0634dc92b620c800dd6b7b332 100644 (file)
@@ -8,12 +8,12 @@
 
 package org.opendaylight.transportpce.common.crossconnect;
 
-import java.math.BigDecimal;
 import java.util.List;
 import java.util.Optional;
 import org.opendaylight.transportpce.common.fixedflex.SpectrumInformation;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.otn.renderer.nodes.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.otn.renderer.nodes.Nodes;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 
 public interface CrossConnect {
 
@@ -98,8 +98,7 @@ public interface CrossConnect {
      *            Name of the cross connect.
      * @return true/false based on status of operation.
      */
-    boolean setPowerLevel(String deviceId, String mode, BigDecimal powerValue,
-                          String connectionNumber);
+    boolean setPowerLevel(String deviceId, String mode, Decimal64 powerValue, String connectionNumber);
 
     Optional<String> postOtnCrossConnect(List<String> createdOduInterfaces, Nodes node) throws
             OpenRoadmInterfaceException;
index 8ba0963435aef3225e715806540bcf742e18e15d..b9a12e5881a760ef2a3949324dc9813d255293e8 100644 (file)
@@ -12,7 +12,6 @@ import static org.opendaylight.transportpce.common.StringConstants.OPENROADM_DEV
 import static org.opendaylight.transportpce.common.StringConstants.OPENROADM_DEVICE_VERSION_2_2_1;
 import static org.opendaylight.transportpce.common.StringConstants.OPENROADM_DEVICE_VERSION_7_1;
 
-import java.math.BigDecimal;
 import java.util.List;
 import java.util.Optional;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
@@ -20,20 +19,34 @@ import org.opendaylight.transportpce.common.fixedflex.SpectrumInformation;
 import org.opendaylight.transportpce.common.mapping.MappingUtils;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.OpticalControlMode;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.otn.renderer.nodes.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.otn.renderer.nodes.Nodes;
+import org.opendaylight.yangtools.yang.common.Decimal64;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@Component
 public class CrossConnectImpl implements CrossConnect {
 
     private static final Logger LOG = LoggerFactory.getLogger(CrossConnectImpl.class);
 
-    protected CrossConnect crossConnect;
     private final MappingUtils mappingUtils;
     private CrossConnectImpl121 crossConnectImpl121;
     private CrossConnectImpl221 crossConnectImpl221;
     private CrossConnectImpl710 crossConnectImpl710;
 
+    @Activate
+    public CrossConnectImpl(@Reference DeviceTransactionManager deviceTransactionManager,
+                            @Reference MappingUtils mappingUtils) {
+        this(deviceTransactionManager, mappingUtils,
+            new CrossConnectImpl121(deviceTransactionManager),
+            new CrossConnectImpl221(deviceTransactionManager),
+            new CrossConnectImpl710(deviceTransactionManager));
+    }
+
+    // TODO: DeviceTransactionManager is not used here
     public CrossConnectImpl(DeviceTransactionManager deviceTransactionManager, MappingUtils mappingUtils,
                             CrossConnectImpl121 crossConnectImpl121,
                             CrossConnectImpl221 crossConnectImpl221,
@@ -42,42 +55,39 @@ public class CrossConnectImpl implements CrossConnect {
         this.crossConnectImpl121 = crossConnectImpl121;
         this.crossConnectImpl221 = crossConnectImpl221;
         this.crossConnectImpl710 = crossConnectImpl710;
-        this.crossConnect = null;
     }
 
     public Optional<?> getCrossConnect(String nodeId, String connectionNumber) {
-        String openRoadmVersion = mappingUtils.getOpenRoadmVersion(nodeId);
-        if (OPENROADM_DEVICE_VERSION_1_2_1.equals(openRoadmVersion)) {
-            return crossConnectImpl121.getCrossConnect(nodeId,connectionNumber);
-        }
-        else if (OPENROADM_DEVICE_VERSION_2_2_1.equals(openRoadmVersion)) {
-            return crossConnectImpl221.getCrossConnect(nodeId,connectionNumber);
+        switch (mappingUtils.getOpenRoadmVersion(nodeId)) {
+            case OPENROADM_DEVICE_VERSION_1_2_1:
+                return crossConnectImpl121.getCrossConnect(nodeId,connectionNumber);
+            case OPENROADM_DEVICE_VERSION_2_2_1:
+                return crossConnectImpl221.getCrossConnect(nodeId,connectionNumber);
+            default:
+                return Optional.empty();
         }
-        return Optional.empty();
     }
 
 
     public Optional<String> postCrossConnect(String nodeId, String srcTp, String destTp,
             SpectrumInformation spectrumInformation) {
         String openRoadmVersion = mappingUtils.getOpenRoadmVersion(nodeId);
-        LOG.info("Cross Connect post request received for node {} with version {}",nodeId,openRoadmVersion);
-        if (OPENROADM_DEVICE_VERSION_1_2_1.equals(openRoadmVersion)) {
-            LOG.info("Device Version is 1.2.1");
-            return crossConnectImpl121.postCrossConnect(nodeId, srcTp, destTp, spectrumInformation);
-        }
-        else if (OPENROADM_DEVICE_VERSION_2_2_1.equals(openRoadmVersion)) {
-            LOG.info("Device Version is 2.2");
-            return crossConnectImpl221.postCrossConnect(nodeId, srcTp, destTp,
-                    spectrumInformation);
+        LOG.info("Cross Connect post request received for node {} with version {}", nodeId, openRoadmVersion);
+        switch (openRoadmVersion) {
+            case OPENROADM_DEVICE_VERSION_1_2_1:
+                LOG.info("Device Version is 1.2.1");
+                return crossConnectImpl121.postCrossConnect(nodeId, srcTp, destTp, spectrumInformation);
+            case OPENROADM_DEVICE_VERSION_2_2_1:
+                LOG.info("Device Version is 2.2.1");
+                return crossConnectImpl221.postCrossConnect(nodeId, srcTp, destTp, spectrumInformation);
+            default:
+                LOG.info("Device Version not found");
+                return Optional.empty();
         }
-        LOG.info("Device Version not found");
-        return Optional.empty();
-
     }
 
 
     public List<String> deleteCrossConnect(String nodeId, String connectionNumber, Boolean isOtn) {
-
         switch (mappingUtils.getOpenRoadmVersion(nodeId)) {
             case OPENROADM_DEVICE_VERSION_1_2_1:
                 return crossConnectImpl121.deleteCrossConnect(nodeId, connectionNumber);
@@ -93,45 +103,52 @@ public class CrossConnectImpl implements CrossConnect {
     public List<?> getConnectionPortTrail(String nodeId, String srcTp, String destTp, int lowerSpectralSlotNumber,
             int higherSpectralSlotNumber)
             throws OpenRoadmInterfaceException {
-        String openRoadmVersion = mappingUtils.getOpenRoadmVersion(nodeId);
-        if (OPENROADM_DEVICE_VERSION_1_2_1.equals(openRoadmVersion)) {
-            return crossConnectImpl121.getConnectionPortTrail(nodeId, srcTp, destTp,
-                    lowerSpectralSlotNumber, higherSpectralSlotNumber);
-        }
-        else if (OPENROADM_DEVICE_VERSION_2_2_1.equals(openRoadmVersion)) {
-            return crossConnectImpl221
+        switch (mappingUtils.getOpenRoadmVersion(nodeId)) {
+            case OPENROADM_DEVICE_VERSION_1_2_1:
+                return crossConnectImpl121
+                    .getConnectionPortTrail(nodeId, srcTp, destTp, lowerSpectralSlotNumber, higherSpectralSlotNumber);
+            case OPENROADM_DEVICE_VERSION_2_2_1:
+                return crossConnectImpl221
                     .getConnectionPortTrail(nodeId, srcTp, destTp, lowerSpectralSlotNumber, higherSpectralSlotNumber);
+            default:
+                return null;
         }
-        return null;
     }
 
-    public boolean setPowerLevel(String nodeId, String mode, BigDecimal powerValue, String connectionNumber) {
-        String openRoadmVersion = mappingUtils.getOpenRoadmVersion(nodeId);
-        if (OPENROADM_DEVICE_VERSION_1_2_1.equals(openRoadmVersion) && OpticalControlMode.forName(mode).isPresent()) {
-            return crossConnectImpl121.setPowerLevel(nodeId,OpticalControlMode.forName(mode).get(),
-                powerValue,connectionNumber);
-        }
-        else if (OPENROADM_DEVICE_VERSION_2_2_1.equals(openRoadmVersion)
-            && org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.OpticalControlMode.forName(mode)
-            .isPresent()) {
-            return crossConnectImpl221.setPowerLevel(nodeId,
-                org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.OpticalControlMode.forName(mode)
-                .get(), powerValue,connectionNumber);
+    @Override
+    public boolean setPowerLevel(String nodeId, String mode, Decimal64 powerValue, String connectionNumber) {
+        switch (mappingUtils.getOpenRoadmVersion(nodeId)) {
+            case OPENROADM_DEVICE_VERSION_1_2_1:
+                if (OpticalControlMode.forName(mode) == null) {
+                    return false;
+                }
+                return crossConnectImpl121.setPowerLevel(nodeId,
+                    OpticalControlMode.forName(mode),
+                    powerValue, connectionNumber);
+            case OPENROADM_DEVICE_VERSION_2_2_1:
+                if (org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.OpticalControlMode
+                        .forName(mode) == null) {
+                    return false;
+                }
+                return crossConnectImpl221.setPowerLevel(nodeId,
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.OpticalControlMode
+                        .forName(mode),
+                    powerValue, connectionNumber);
+            default:
+                return false;
         }
-        return false;
     }
 
     @Override
     public Optional<String> postOtnCrossConnect(List<String> createdOduInterfaces, Nodes node)
             throws OpenRoadmInterfaceException {
-        String openRoadmVersion = mappingUtils.getOpenRoadmVersion(node.getNodeId());
-
-        if (OPENROADM_DEVICE_VERSION_2_2_1.equals(openRoadmVersion)) {
-            return crossConnectImpl221.postOtnCrossConnect(createdOduInterfaces, node);
-        }
-        else if (OPENROADM_DEVICE_VERSION_7_1.equals(openRoadmVersion)) {
-            return crossConnectImpl710.postOtnCrossConnect(createdOduInterfaces, node);
+        switch (mappingUtils.getOpenRoadmVersion(node.getNodeId())) {
+            case OPENROADM_DEVICE_VERSION_2_2_1:
+                return crossConnectImpl221.postOtnCrossConnect(createdOduInterfaces, node);
+            case OPENROADM_DEVICE_VERSION_7_1:
+                return crossConnectImpl710.postOtnCrossConnect(createdOduInterfaces, node);
+            default:
+                return Optional.empty();
         }
-        return Optional.empty();
     }
 }
index b97d07d5a9d36bd9fa4fd5341c5fdce45da639ea..7b2ee2a1c231a8107ab9601f4ddd679297455027 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.transportpce.common.crossconnect;
 
 import com.google.common.util.concurrent.FluentFuture;
-import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -17,7 +16,7 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.api.MountPoint;
-import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
+import org.opendaylight.mdsal.binding.api.RpcService;
 import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.Timeouts;
@@ -28,9 +27,10 @@ import org.opendaylight.transportpce.common.fixedflex.SpectrumInformation;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.OpticalControlMode;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.PowerDBm;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.GetConnectionPortTrail;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.GetConnectionPortTrailInputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.GetConnectionPortTrailOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.OrgOpenroadmDeviceService;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.connection.DestinationBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.connection.SourceBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.get.connection.port.trail.output.Ports;
@@ -39,6 +39,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.open
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.RoadmConnectionsBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.RoadmConnectionsKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -58,38 +59,39 @@ public class CrossConnectImpl121 {
                 Timeouts.DEVICE_READ_TIMEOUT_UNIT);
     }
 
-    public Optional<String> postCrossConnect(String deviceId, String srcTp, String destTp,
-            SpectrumInformation spectrumInformation) {
-        RoadmConnectionsBuilder rdmConnBldr = new RoadmConnectionsBuilder();
-        String connectionNumber = spectrumInformation.getIdentifierFromParams(srcTp, destTp);
-        rdmConnBldr.setConnectionNumber(connectionNumber);
-        rdmConnBldr.setWavelengthNumber(spectrumInformation.getWaveLength());
-        rdmConnBldr.setOpticalControlMode(OpticalControlMode.Off);
-        rdmConnBldr.setSource(new SourceBuilder().setSrcIf(spectrumInformation.getIdentifierFromParams(srcTp))
-                .build());
-        rdmConnBldr.setDestination(new DestinationBuilder()
-                .setDstIf(spectrumInformation.getIdentifierFromParams(destTp))
-                .build());
-        InstanceIdentifier<RoadmConnections> rdmConnectionIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(RoadmConnections.class, new RoadmConnectionsKey(rdmConnBldr.getConnectionNumber()));
-
+    public Optional<String> postCrossConnect(
+            String deviceId, String srcTp, String destTp, SpectrumInformation spectrumInformation) {
         Future<Optional<DeviceTransaction>> deviceTxFuture = deviceTransactionManager.getDeviceTransaction(deviceId);
         DeviceTransaction deviceTx;
         try {
             Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
-            if (deviceTxOpt.isPresent()) {
-                deviceTx = deviceTxOpt.get();
-            } else {
+            if (deviceTxOpt.isEmpty()) {
                 LOG.error("Device transaction for device {} was not found!", deviceId);
                 return Optional.empty();
             }
+            deviceTx = deviceTxOpt.orElseThrow();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Unable to obtain device transaction for device {}!", deviceId, e);
             return Optional.empty();
         }
-
+        String connectionNumber = spectrumInformation.getIdentifierFromParams(srcTp, destTp);
+        RoadmConnections rdmConn = new RoadmConnectionsBuilder()
+            .setConnectionNumber(connectionNumber)
+            .setWavelengthNumber(spectrumInformation.getWaveLength())
+            .setOpticalControlMode(OpticalControlMode.Off)
+            .setSource(
+                new SourceBuilder().setSrcIf(spectrumInformation.getIdentifierFromParams(srcTp)).build())
+            .setDestination(
+                new DestinationBuilder().setDstIf(spectrumInformation.getIdentifierFromParams(destTp)).build())
+            .build();
         // post the cross connect on the device
-        deviceTx.merge(LogicalDatastoreType.CONFIGURATION, rdmConnectionIID, rdmConnBldr.build());
+        deviceTx.merge(
+            LogicalDatastoreType.CONFIGURATION,
+            InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(RoadmConnections.class, new RoadmConnectionsKey(connectionNumber))
+                .build(),
+            rdmConn);
         FluentFuture<? extends @NonNull CommitInfo> commit =
                 deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
         try {
@@ -99,19 +101,15 @@ public class CrossConnectImpl121 {
                     spectrumInformation.getHigherSpectralSlotNumber());
             return Optional.of(connectionNumber);
         } catch (InterruptedException | ExecutionException e) {
-            LOG.warn("Failed to post {}. Exception: ", rdmConnBldr.build(), e);
+            LOG.warn("Failed to post {}. Exception: ", rdmConn, e);
         }
         return Optional.empty();
     }
 
     public List<String> deleteCrossConnect(String deviceId, String connectionNumber) {
-        List<String> interfList = new ArrayList<>();
         Optional<RoadmConnections> xc = getCrossConnect(deviceId, connectionNumber);
         //Check if cross connect exists before delete
-        if (xc.isPresent()) {
-            interfList.add(xc.get().getSource().getSrcIf());
-            interfList.add(xc.get().getDestination().getDstIf());
-        } else {
+        if (xc.isEmpty()) {
             LOG.warn("Cross connect does not exist, halting delete");
             return null;
         }
@@ -119,17 +117,15 @@ public class CrossConnectImpl121 {
         DeviceTransaction deviceTx;
         try {
             Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
-            if (deviceTxOpt.isPresent()) {
-                deviceTx = deviceTxOpt.get();
-            } else {
+            if (deviceTxOpt.isEmpty()) {
                 LOG.error("Device transaction for device {} was not found!", deviceId);
                 return null;
             }
+            deviceTx = deviceTxOpt.orElseThrow();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Unable to obtain device transaction for device {}!", deviceId, e);
             return null;
         }
-
         // post the cross connect on the device
         deviceTx.delete(LogicalDatastoreType.CONFIGURATION, generateRdmConnectionIID(connectionNumber));
         FluentFuture<? extends @NonNull CommitInfo> commit =
@@ -137,7 +133,9 @@ public class CrossConnectImpl121 {
         try {
             commit.get();
             LOG.info("Roadm connection successfully deleted ");
-            return interfList;
+            return new ArrayList<>(List.of(
+                xc.orElseThrow().getSource().getSrcIf(),
+                xc.orElseThrow().getDestination().getDstIf()));
         } catch (InterruptedException | ExecutionException e) {
             LOG.warn("Failed to delete {}", connectionNumber, e);
         }
@@ -147,103 +145,100 @@ public class CrossConnectImpl121 {
 
     public List<Ports> getConnectionPortTrail(String nodeId, String srcTp, String destTp,
             int lowerSpectralSlotNumber, int higherSpectralSlotNumber) throws OpenRoadmInterfaceException {
-        String spectralSlotName = String.join(GridConstant.SPECTRAL_SLOT_SEPARATOR,
-                String.valueOf(lowerSpectralSlotNumber), String.valueOf(higherSpectralSlotNumber));
-        String connectionName = generateConnectionNumber(srcTp, destTp, spectralSlotName);
         Optional<MountPoint> mountPointOpt = deviceTransactionManager.getDeviceMountPoint(nodeId);
-        List<Ports> ports = null;
-        MountPoint mountPoint;
-        if (mountPointOpt.isPresent()) {
-            mountPoint = mountPointOpt.get();
-        } else {
+        if (mountPointOpt.isEmpty()) {
             LOG.error("Failed to obtain mount point for device {}!", nodeId);
             return Collections.emptyList();
         }
-        final Optional<RpcConsumerRegistry> service = mountPoint.getService(RpcConsumerRegistry.class);
-        if (!service.isPresent()) {
+        String connectionName = generateConnectionNumber(srcTp, destTp,
+            String.join(GridConstant.SPECTRAL_SLOT_SEPARATOR,
+                String.valueOf(lowerSpectralSlotNumber), String.valueOf(higherSpectralSlotNumber)));
+        MountPoint mountPoint = mountPointOpt.orElseThrow();
+        final Optional<RpcService> service = mountPoint.getService(RpcService.class);
+        if (service.isEmpty()) {
             LOG.error("Failed to get RpcService for node {}", nodeId);
         }
-        final OrgOpenroadmDeviceService rpcService = service.get().getRpcService(OrgOpenroadmDeviceService.class);
-        final GetConnectionPortTrailInputBuilder portTrainInputBuilder = new GetConnectionPortTrailInputBuilder();
-        portTrainInputBuilder.setConnectionNumber(connectionName);
-        final Future<RpcResult<GetConnectionPortTrailOutput>> portTrailOutput = rpcService.getConnectionPortTrail(
-                portTrainInputBuilder.build());
-        if (portTrailOutput != null) {
-            try {
-                RpcResult<GetConnectionPortTrailOutput> connectionPortTrailOutputRpcResult = portTrailOutput.get();
-                GetConnectionPortTrailOutput connectionPortTrailOutput = connectionPortTrailOutputRpcResult.getResult();
-                if (connectionPortTrailOutput == null) {
-                    throw new OpenRoadmInterfaceException(String.format("RPC get connection port trail called on"
-                            + " node %s returned null!", nodeId));
-                }
-                LOG.info("Getting port trail for node {}'s connection number {}", nodeId, connectionName);
-                ports = connectionPortTrailOutput.getPorts();
-                for (Ports port : ports) {
-                    LOG.info("{} - Circuit pack {} - Port {}", nodeId, port.getCircuitPackName(), port.getPortName());
-                }
-            } catch (InterruptedException | ExecutionException e) {
-                LOG.warn("Exception caught", e);
-            }
-        } else {
+        final GetConnectionPortTrail rpcService = service.orElseThrow().getRpc(GetConnectionPortTrail.class);
+        final Future<RpcResult<GetConnectionPortTrailOutput>> portTrailOutput = rpcService.invoke(
+                new GetConnectionPortTrailInputBuilder().setConnectionNumber(connectionName).build());
+        if (portTrailOutput == null) {
             LOG.warn("Port trail is null in getConnectionPortTrail for nodeId {}", nodeId);
+            return Collections.emptyList();
+        }
+        List<Ports> ports = null;
+        try {
+            RpcResult<GetConnectionPortTrailOutput> connectionPortTrailOutputRpcResult = portTrailOutput.get();
+            GetConnectionPortTrailOutput connectionPortTrailOutput = connectionPortTrailOutputRpcResult.getResult();
+            if (connectionPortTrailOutput == null) {
+                throw new OpenRoadmInterfaceException(String.format(
+                    "RPC get connection port trail called on node %s returned null!", nodeId));
+            }
+            LOG.info("Getting port trail for node {}'s connection number {}", nodeId, connectionName);
+            ports = connectionPortTrailOutput.getPorts();
+            for (Ports port : ports) {
+                LOG.info("{} - Circuit pack {} - Port {}", nodeId, port.getCircuitPackName(), port.getPortName());
+            }
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.warn("Exception caught", e);
         }
         return ports != null ? ports : Collections.emptyList();
     }
 
     private InstanceIdentifier<RoadmConnections> generateRdmConnectionIID(String connectionNumber) {
-        return InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(RoadmConnections.class, new RoadmConnectionsKey(connectionNumber));
+        return InstanceIdentifier.builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(RoadmConnections.class, new RoadmConnectionsKey(connectionNumber))
+            .build();
     }
 
     private String generateConnectionNumber(String srcTp, String destTp, String spectralSlotName) {
         return String.join(GridConstant.NAME_PARAMETERS_SEPARATOR, srcTp, destTp, spectralSlotName);
     }
 
-    public boolean setPowerLevel(String deviceId, OpticalControlMode mode, BigDecimal powerValue, String ctNumber) {
-
+    public boolean setPowerLevel(String deviceId, OpticalControlMode mode, Decimal64 powerValue, String ctNumber) {
         Optional<RoadmConnections> rdmConnOpt = getCrossConnect(deviceId, ctNumber);
-        if (rdmConnOpt.isPresent()) {
-            RoadmConnectionsBuilder rdmConnBldr = new RoadmConnectionsBuilder(rdmConnOpt.get())
-                    .setOpticalControlMode(mode);
-            if (powerValue != null) {
-                rdmConnBldr.setTargetOutputPower(new PowerDBm(powerValue));
-            }
-            RoadmConnections newRdmConn = rdmConnBldr.build();
-
-            Future<Optional<DeviceTransaction>> deviceTxFuture =
-                    deviceTransactionManager.getDeviceTransaction(deviceId);
-            DeviceTransaction deviceTx;
-            try {
-                Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
-                if (deviceTxOpt.isPresent()) {
-                    deviceTx = deviceTxOpt.get();
-                } else {
-                    LOG.error("Transaction for device {} was not found!", deviceId);
-                    return false;
-                }
-            } catch (InterruptedException | ExecutionException e) {
-                LOG.error("Unable to get transaction for device {}!", deviceId, e);
+        if (rdmConnOpt.isEmpty()) {
+            LOG.warn("Roadm-Connection is null in set power level ({})", ctNumber);
+            return false;
+        }
+        RoadmConnections newRdmConn =
+            powerValue == null
+                ? new RoadmConnectionsBuilder(rdmConnOpt.orElseThrow())
+                    .setOpticalControlMode(mode)
+                    .build()
+                : new RoadmConnectionsBuilder(rdmConnOpt.orElseThrow())
+                    .setOpticalControlMode(mode)
+                    .setTargetOutputPower(new PowerDBm(powerValue))
+                    .build();
+        Future<Optional<DeviceTransaction>> deviceTxFuture = deviceTransactionManager.getDeviceTransaction(deviceId);
+        DeviceTransaction deviceTx;
+        try {
+            Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
+            if (deviceTxOpt.isEmpty()) {
+                LOG.error("Transaction for device {} was not found!", deviceId);
                 return false;
             }
-
-            // post the cross connect on the device
-            InstanceIdentifier<RoadmConnections> roadmConnIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                    .child(RoadmConnections.class, new RoadmConnectionsKey(ctNumber));
-            deviceTx.merge(LogicalDatastoreType.CONFIGURATION, roadmConnIID, newRdmConn);
-            FluentFuture<? extends @NonNull CommitInfo> commit =
-                deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
-            try {
-                commit.get();
-                LOG.info("Roadm connection power level successfully set ");
-                return true;
-            } catch (InterruptedException | ExecutionException ex) {
-                LOG.warn("Failed to post {}", newRdmConn, ex);
-            }
-
-        } else {
-            LOG.warn("Roadm-Connection is null in set power level ({})", ctNumber);
+            deviceTx = deviceTxOpt.orElseThrow();
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Unable to get transaction for device {}!", deviceId, e);
+            return false;
+        }
+        // post the cross connect on the device
+        deviceTx.merge(
+            LogicalDatastoreType.CONFIGURATION,
+            InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(RoadmConnections.class, new RoadmConnectionsKey(ctNumber))
+                .build(),
+            newRdmConn);
+        FluentFuture<? extends @NonNull CommitInfo> commit =
+            deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
+        try {
+            commit.get();
+            LOG.info("Roadm connection power level successfully set ");
+            return true;
+        } catch (InterruptedException | ExecutionException ex) {
+            LOG.warn("Failed to post {}", newRdmConn, ex);
         }
         return false;
     }
-
 }
index 5dffcf234ea20492297eb116f4abee9d86cacf85..ea0dfef20329bfc716b3275474125f809d5ce482 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.transportpce.common.crossconnect;
 
 import com.google.common.util.concurrent.FluentFuture;
-import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -17,7 +16,7 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.api.MountPoint;
-import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
+import org.opendaylight.mdsal.binding.api.RpcService;
 import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.Timeouts;
@@ -28,21 +27,24 @@ import org.opendaylight.transportpce.common.fixedflex.SpectrumInformation;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.OpticalControlMode;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.PowerDBm;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.GetConnectionPortTrail;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.GetConnectionPortTrailInputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.GetConnectionPortTrailOutput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.OduConnection.Direction;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.OrgOpenroadmDeviceService;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.connection.DestinationBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.connection.SourceBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.get.connection.port.trail.output.Ports;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.OrgOpenroadmDevice;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.OduConnection;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.OduConnectionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.OduConnectionKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.RoadmConnections;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.RoadmConnectionsBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.RoadmConnectionsKey;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.otn.renderer.nodes.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.otn.renderer.nodes.Nodes;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -65,48 +67,49 @@ public class CrossConnectImpl221 {
                 Timeouts.DEVICE_READ_TIMEOUT_UNIT);
     }
 
-    public Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org
-            .openroadm.device.OduConnection> getOtnCrossConnect(String deviceId, String connectionNumber) {
+    public Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019
+                .org.openroadm.device.container.org.openroadm.device.OduConnection> getOtnCrossConnect(
+            String deviceId, String connectionNumber) {
         //TODO Change it to Operational later for real device
         return deviceTransactionManager.getDataFromDevice(deviceId, LogicalDatastoreType.CONFIGURATION,
                 generateOduConnectionIID(connectionNumber), Timeouts.DEVICE_READ_TIMEOUT,
                 Timeouts.DEVICE_READ_TIMEOUT_UNIT);
     }
 
-    public Optional<String> postCrossConnect(String deviceId, String srcTp, String destTp,
-                                             SpectrumInformation spectrumInformation) {
-        String connectionNumber = spectrumInformation.getIdentifierFromParams(srcTp, destTp);
-        RoadmConnectionsBuilder rdmConnBldr = new RoadmConnectionsBuilder()
-                .setConnectionName(connectionNumber)
-                .setOpticalControlMode(OpticalControlMode.Off)
-                .setSource(new SourceBuilder()
-                        .setSrcIf(spectrumInformation.getIdentifierFromParams(srcTp,"nmc"))
-                        .build())
-                .setDestination(new DestinationBuilder()
-                        .setDstIf(spectrumInformation.getIdentifierFromParams(destTp,"nmc"))
-                        .build());
-
-        InstanceIdentifier<RoadmConnections> rdmConnectionIID =
-                InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                        .child(RoadmConnections.class, new RoadmConnectionsKey(rdmConnBldr.getConnectionName()));
-
+    public Optional<String> postCrossConnect(
+            String deviceId, String srcTp, String destTp, SpectrumInformation spectrumInformation) {
         Future<Optional<DeviceTransaction>> deviceTxFuture = deviceTransactionManager.getDeviceTransaction(deviceId);
         DeviceTransaction deviceTx;
         try {
             Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
-            if (deviceTxOpt.isPresent()) {
-                deviceTx = deviceTxOpt.get();
-            } else {
+            if (deviceTxOpt.isEmpty()) {
                 LOG.error(DEV_TRANSACTION_NOT_FOUND, deviceId);
                 return Optional.empty();
             }
+            deviceTx = deviceTxOpt.orElseThrow();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error(UNABLE_DEV_TRANSACTION, deviceId, e);
             return Optional.empty();
         }
-
+        String connectionNumber = spectrumInformation.getIdentifierFromParams(srcTp, destTp);
+        RoadmConnections rdmConn = new RoadmConnectionsBuilder()
+                .setConnectionName(connectionNumber)
+                .setOpticalControlMode(OpticalControlMode.Off)
+                .setSource(new SourceBuilder()
+                        .setSrcIf(spectrumInformation.getIdentifierFromParams(srcTp,"nmc"))
+                        .build())
+                .setDestination(new DestinationBuilder()
+                        .setDstIf(spectrumInformation.getIdentifierFromParams(destTp,"nmc"))
+                        .build())
+                .build();
         // post the cross connect on the device
-        deviceTx.merge(LogicalDatastoreType.CONFIGURATION, rdmConnectionIID, rdmConnBldr.build());
+        deviceTx.merge(
+            LogicalDatastoreType.CONFIGURATION,
+            InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(RoadmConnections.class, new RoadmConnectionsKey(connectionNumber))
+                .build(),
+            rdmConn);
         FluentFuture<? extends @NonNull CommitInfo> commit =
                 deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
         try {
@@ -116,51 +119,49 @@ public class CrossConnectImpl221 {
                     spectrumInformation.getHigherSpectralSlotNumber());
             return Optional.of(connectionNumber);
         } catch (InterruptedException | ExecutionException e) {
-            LOG.warn("Failed to post {}. Exception: ", rdmConnBldr.build(), e);
+            LOG.warn("Failed to post {}. Exception: ", rdmConn, e);
         }
         return Optional.empty();
     }
 
-
     public List<String> deleteCrossConnect(String deviceId, String connectionName, boolean isOtn) {
         List<String> interfList = new ArrayList<>();
         Optional<RoadmConnections> xc = getCrossConnect(deviceId, connectionName);
-        Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org
-                .openroadm.device.OduConnection> otnXc = getOtnCrossConnect(deviceId, connectionName);
         //Check if cross connect exists before delete
         if (xc.isPresent()) {
-            interfList.add(xc.get().getSource().getSrcIf());
-            interfList.add(xc.get().getDestination().getDstIf());
-            interfList.add(xc.get().getSource().getSrcIf().replace("nmc", "mc"));
-            interfList.add(xc.get().getDestination().getDstIf().replace("nmc", "mc"));
-        } else if (otnXc.isPresent()) {
-            interfList.add(otnXc.get().getSource().getSrcIf());
-            interfList.add(otnXc.get().getDestination().getDstIf());
+            interfList.add(xc.orElseThrow().getSource().getSrcIf());
+            interfList.add(xc.orElseThrow().getDestination().getDstIf());
+            interfList.add(xc.orElseThrow().getSource().getSrcIf().replace("nmc", "mc"));
+            interfList.add(xc.orElseThrow().getDestination().getDstIf().replace("nmc", "mc"));
         } else {
-            LOG.warn("Cross connect {} does not exist, halting delete", connectionName);
-            return null;
+            Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019
+                    .org.openroadm.device.container.org.openroadm.device.OduConnection> otnXc =
+                getOtnCrossConnect(deviceId, connectionName);
+            if (otnXc.isEmpty()) {
+                LOG.warn("Cross connect {} does not exist, halting delete", connectionName);
+                return null;
+            }
+            interfList.add(otnXc.orElseThrow().getSource().getSrcIf());
+            interfList.add(otnXc.orElseThrow().getDestination().getDstIf());
         }
         Future<Optional<DeviceTransaction>> deviceTxFuture = deviceTransactionManager.getDeviceTransaction(deviceId);
         DeviceTransaction deviceTx;
         try {
             Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
-            if (deviceTxOpt.isPresent()) {
-                deviceTx = deviceTxOpt.get();
-            } else {
+            if (deviceTxOpt.isEmpty()) {
                 LOG.error(DEV_TRANSACTION_NOT_FOUND, deviceId);
                 return null;
             }
+            deviceTx = deviceTxOpt.orElseThrow();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error(UNABLE_DEV_TRANSACTION, deviceId, e);
             return null;
         }
 
         // post the cross connect on the device
-        if (isOtn) {
-            deviceTx.delete(LogicalDatastoreType.CONFIGURATION, generateOduConnectionIID(connectionName));
-        } else {
-            deviceTx.delete(LogicalDatastoreType.CONFIGURATION, generateRdmConnectionIID(connectionName));
-        }
+        deviceTx.delete(
+            LogicalDatastoreType.CONFIGURATION,
+            isOtn ? generateOduConnectionIID(connectionName) : generateRdmConnectionIID(connectionName));
         FluentFuture<? extends @NonNull CommitInfo> commit =
                 deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
         try {
@@ -174,110 +175,111 @@ public class CrossConnectImpl221 {
     }
 
 
-    public List<Ports> getConnectionPortTrail(String nodeId, String srcTp, String destTp,
-                                              int lowerSpectralSlotNumber, int higherSpectralSlotNumber)
+    public List<Ports> getConnectionPortTrail(
+            String nodeId, String srcTp, String destTp, int lowerSpectralSlotNumber, int higherSpectralSlotNumber)
             throws OpenRoadmInterfaceException {
-        String spectralSlotName = String.join(GridConstant.SPECTRAL_SLOT_SEPARATOR,
-                String.valueOf(lowerSpectralSlotNumber),
-                String.valueOf(higherSpectralSlotNumber));
-        String connectionName = generateConnectionName(srcTp, destTp, spectralSlotName);
         Optional<MountPoint> mountPointOpt = deviceTransactionManager.getDeviceMountPoint(nodeId);
         List<Ports> ports = null;
-        MountPoint mountPoint;
-        if (mountPointOpt.isPresent()) {
-            mountPoint = mountPointOpt.get();
-        } else {
+        if (mountPointOpt.isEmpty()) {
             LOG.error("Failed to obtain mount point for device {}!", nodeId);
             return Collections.emptyList();
         }
-        final Optional<RpcConsumerRegistry> service = mountPoint.getService(RpcConsumerRegistry.class);
-        if (!service.isPresent()) {
+        MountPoint mountPoint = mountPointOpt.orElseThrow();
+        final Optional<RpcService> service = mountPoint.getService(RpcService.class);
+        if (service.isEmpty()) {
             LOG.error("Failed to get RpcService for node {}", nodeId);
         }
-        final OrgOpenroadmDeviceService rpcService = service.get().getRpcService(OrgOpenroadmDeviceService.class);
-        final GetConnectionPortTrailInputBuilder portTrainInputBuilder = new GetConnectionPortTrailInputBuilder();
-        portTrainInputBuilder.setConnectionName(connectionName);
-        final Future<RpcResult<GetConnectionPortTrailOutput>> portTrailOutput = rpcService.getConnectionPortTrail(
-                portTrainInputBuilder.build());
-        if (portTrailOutput != null) {
-            try {
-                RpcResult<GetConnectionPortTrailOutput> connectionPortTrailOutputRpcResult = portTrailOutput.get();
-                GetConnectionPortTrailOutput connectionPortTrailOutput = connectionPortTrailOutputRpcResult.getResult();
-                if (connectionPortTrailOutput == null) {
-                    throw new OpenRoadmInterfaceException(String.format("RPC get connection port trail called on"
-                            + " node %s returned null!", nodeId));
-                }
-                LOG.info("Getting port trail for node {}'s connection number {}", nodeId, connectionName);
-                ports = connectionPortTrailOutput.getPorts();
-                for (Ports port : ports) {
-                    LOG.info("{} - Circuit pack {} - Port {}", nodeId, port.getCircuitPackName(), port.getPortName());
-                }
-            } catch (InterruptedException | ExecutionException e) {
-                LOG.warn("Exception caught", e);
-            }
-        } else {
+        String connectionName = generateConnectionName(srcTp, destTp,
+            String.join(GridConstant.SPECTRAL_SLOT_SEPARATOR,
+                String.valueOf(lowerSpectralSlotNumber), String.valueOf(higherSpectralSlotNumber)));
+        GetConnectionPortTrail rpcService = service.orElseThrow().getRpc(GetConnectionPortTrail.class);
+        final Future<RpcResult<GetConnectionPortTrailOutput>> portTrailOutput = rpcService.invoke(
+                new GetConnectionPortTrailInputBuilder()
+                    .setConnectionName(connectionName)
+                    .build());
+        if (portTrailOutput == null) {
             LOG.warn("Port trail is null in getConnectionPortTrail for nodeId {}", nodeId);
+            return Collections.emptyList();
+        }
+        try {
+            RpcResult<GetConnectionPortTrailOutput> connectionPortTrailOutputRpcResult = portTrailOutput.get();
+            GetConnectionPortTrailOutput connectionPortTrailOutput = connectionPortTrailOutputRpcResult.getResult();
+            if (connectionPortTrailOutput == null) {
+                throw new OpenRoadmInterfaceException(String.format(
+                    "RPC get connection port trail called on node %s returned null!", nodeId));
+            }
+            LOG.info("Getting port trail for node {}'s connection number {}", nodeId, connectionName);
+            ports = connectionPortTrailOutput.getPorts();
+            for (Ports port : ports) {
+                LOG.info("{} - Circuit pack {} - Port {}", nodeId, port.getCircuitPackName(), port.getPortName());
+            }
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.warn("Exception caught", e);
         }
-        return ports != null ? ports : Collections.emptyList();
+        return ports == null ? Collections.emptyList() : ports;
     }
 
 
-    public boolean setPowerLevel(String deviceId, OpticalControlMode mode, BigDecimal powerValue, String ctName) {
+    public boolean setPowerLevel(String deviceId, OpticalControlMode mode, Decimal64 powerValue, String ctName) {
         Optional<RoadmConnections> rdmConnOpt = getCrossConnect(deviceId, ctName);
-        if (rdmConnOpt.isPresent()) {
-            RoadmConnectionsBuilder rdmConnBldr = new RoadmConnectionsBuilder(rdmConnOpt.get());
-            rdmConnBldr.setOpticalControlMode(mode);
-            if (powerValue != null) {
-                rdmConnBldr.setTargetOutputPower(new PowerDBm(powerValue));
-            }
-            RoadmConnections newRdmConn = rdmConnBldr.build();
-
-            Future<Optional<DeviceTransaction>> deviceTxFuture =
-                    deviceTransactionManager.getDeviceTransaction(deviceId);
-            DeviceTransaction deviceTx;
-            try {
-                Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
-                if (deviceTxOpt.isPresent()) {
-                    deviceTx = deviceTxOpt.get();
-                } else {
-                    LOG.error("Transaction for device {} was not found!", deviceId);
-                    return false;
-                }
-            } catch (InterruptedException | ExecutionException e) {
-                LOG.error("Unable to get transaction for device {}!", deviceId, e);
+        if (rdmConnOpt.isEmpty()) {
+            LOG.warn("Roadm-Connection is null in set power level ({})", ctName);
+            return false;
+        }
+        RoadmConnections newRdmConn =
+            powerValue == null
+                ? new RoadmConnectionsBuilder(rdmConnOpt.orElseThrow())
+                    .setOpticalControlMode(mode)
+                    .build()
+                : new RoadmConnectionsBuilder(rdmConnOpt.orElseThrow())
+                    .setOpticalControlMode(mode)
+                    .setTargetOutputPower(new PowerDBm(powerValue))
+                    .build();
+        Future<Optional<DeviceTransaction>> deviceTxFuture = deviceTransactionManager.getDeviceTransaction(deviceId);
+        DeviceTransaction deviceTx;
+        try {
+            Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
+            if (deviceTxOpt.isEmpty()) {
+                LOG.error("Transaction for device {} was not found!", deviceId);
                 return false;
             }
-
-            // post the cross connect on the device
-            InstanceIdentifier<RoadmConnections> roadmConnIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                    .child(RoadmConnections.class, new RoadmConnectionsKey(ctName));
-            deviceTx.merge(LogicalDatastoreType.CONFIGURATION, roadmConnIID, newRdmConn);
-            FluentFuture<? extends @NonNull CommitInfo> commit =
-                    deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
-            try {
-                commit.get();
-                LOG.info("Roadm connection power level successfully set ");
-                return true;
-            } catch (InterruptedException | ExecutionException ex) {
-                LOG.warn("Failed to post {}", newRdmConn, ex);
-            }
-
-        } else {
-            LOG.warn("Roadm-Connection is null in set power level ({})", ctName);
+            deviceTx = deviceTxOpt.orElseThrow();
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Unable to get transaction for device {}!", deviceId, e);
+            return false;
+        }
+        // post the cross connect on the device
+        deviceTx.merge(
+            LogicalDatastoreType.CONFIGURATION,
+            InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(RoadmConnections.class, new RoadmConnectionsKey(ctName))
+                .build(),
+            newRdmConn);
+        FluentFuture<? extends @NonNull CommitInfo> commit =
+                deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
+        try {
+            commit.get();
+            LOG.info("Roadm connection power level successfully set ");
+            return true;
+        } catch (InterruptedException | ExecutionException ex) {
+            LOG.warn("Failed to post {}", newRdmConn, ex);
         }
         return false;
     }
 
     private InstanceIdentifier<RoadmConnections> generateRdmConnectionIID(String connectionNumber) {
-        return InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(RoadmConnections.class, new RoadmConnectionsKey(connectionNumber));
+        return InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(RoadmConnections.class, new RoadmConnectionsKey(connectionNumber))
+            .build();
     }
 
-    private InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device
-            .container.org.openroadm.device.OduConnection> generateOduConnectionIID(String connectionNumber) {
-        return InstanceIdentifier.create(OrgOpenroadmDevice.class).child(org.opendaylight.yang.gen.v1.http.org
-                    .openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.OduConnection.class,
-                new OduConnectionKey(connectionNumber));
+    private InstanceIdentifier<OduConnection> generateOduConnectionIID(String connectionNumber) {
+        return InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(OduConnection.class, new OduConnectionKey(connectionNumber))
+            .build();
     }
 
     private String generateConnectionName(String srcTp, String destTp, String spectralSlotName) {
@@ -286,50 +288,52 @@ public class CrossConnectImpl221 {
 
     public Optional<String> postOtnCrossConnect(List<String> createdOduInterfaces, Nodes node) {
         String deviceId = node.getNodeId();
-        String srcTp = createdOduInterfaces.get(0);
-        String dstTp = createdOduInterfaces.get(1);
-        OduConnectionBuilder oduConnectionBuilder = new OduConnectionBuilder()
-                .setConnectionName(srcTp + "-x-" + dstTp)
-                .setDestination(new org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.odu.connection
-                        .DestinationBuilder().setDstIf(dstTp).build())
-                .setSource(new org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.odu.connection
-                        .SourceBuilder().setSrcIf(srcTp).build())
-                .setDirection(Direction.Bidirectional);
-
-        InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device
-                .container.org.openroadm.device.OduConnection> oduConnectionIID =
-                InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                        .child(org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device
-                                        .container.org.openroadm.device.OduConnection.class,
-                                new OduConnectionKey(oduConnectionBuilder.getConnectionName())
-                        );
-
         Future<Optional<DeviceTransaction>> deviceTxFuture = deviceTransactionManager.getDeviceTransaction(deviceId);
         DeviceTransaction deviceTx;
         try {
             Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
-            if (deviceTxOpt.isPresent()) {
-                deviceTx = deviceTxOpt.get();
-            } else {
+            if (deviceTxOpt.isEmpty()) {
                 LOG.error(DEV_TRANSACTION_NOT_FOUND, deviceId);
                 return Optional.empty();
             }
+            deviceTx = deviceTxOpt.orElseThrow();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error(UNABLE_DEV_TRANSACTION, deviceId, e);
             return Optional.empty();
         }
-
+        List<String> sortedCreatedOduInterfaces = new ArrayList<>(createdOduInterfaces);
+        sortedCreatedOduInterfaces.sort((s1,s2) -> s1.compareTo(s2));
+        String srcTp = sortedCreatedOduInterfaces.get(0);
+        String dstTp = sortedCreatedOduInterfaces.get(1);
+        // Strip the service name from the src and dst
+        String oduXConnectionName = srcTp.split(":")[0] + "-x-" + dstTp.split(":")[0];
+        OduConnection oduConnection = new OduConnectionBuilder()
+                .setConnectionName(oduXConnectionName)
+                .setDestination(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019
+                        .odu.connection.DestinationBuilder().setDstIf(dstTp).build())
+                .setSource(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019
+                        .odu.connection.SourceBuilder().setSrcIf(srcTp).build())
+                .setDirection(Direction.Bidirectional)
+                .build();
         // post the cross connect on the device
-        deviceTx.merge(LogicalDatastoreType.CONFIGURATION, oduConnectionIID, oduConnectionBuilder.build());
+        deviceTx.merge(
+            LogicalDatastoreType.CONFIGURATION,
+            InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(OduConnection.class, new OduConnectionKey(oduXConnectionName))
+                .build(),
+            oduConnection);
         FluentFuture<? extends @NonNull CommitInfo> commit =
                 deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
         try {
             commit.get();
-            LOG.info("Otn-connection successfully created: {}-{}", srcTp, dstTp);
-            return Optional.of(srcTp + "-x-" + dstTp);
+            LOG.info("Otn-connection successfully created: {}", oduXConnectionName);
+            return Optional.of(oduXConnectionName);
         } catch (InterruptedException | ExecutionException e) {
-            LOG.warn("Failed to post {}.", oduConnectionBuilder.build(), e);
+            LOG.warn("Failed to post {}.", oduConnection, e);
         }
         return Optional.empty();
     }
-}
\ No newline at end of file
+}
index 0b94fc12250c66ba385a1c9a9a5ed604869c3f26..ddd647f81abfda50b90c4aeb3651a341050d2c2f 100644 (file)
@@ -21,10 +21,12 @@ import org.opendaylight.transportpce.common.Timeouts;
 import org.opendaylight.transportpce.common.device.DeviceTransaction;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.OduConnection.Direction;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.OrgOpenroadmDevice;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.OduConnection;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.OduConnectionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.OduConnectionKey;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.otn.renderer.nodes.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.otn.renderer.nodes.Nodes;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -38,51 +40,54 @@ public class CrossConnectImpl710 {
         this.deviceTransactionManager = deviceTransactionManager;
     }
 
-    public Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container
-        .org.openroadm.device.OduConnection> getOtnCrossConnect(String deviceId, String connectionNumber) {
-
+    public Optional<OduConnection> getOtnCrossConnect(String deviceId, String connectionNumber) {
         return deviceTransactionManager.getDataFromDevice(deviceId, LogicalDatastoreType.OPERATIONAL,
             generateOduConnectionIID(connectionNumber), Timeouts.DEVICE_READ_TIMEOUT,
             Timeouts.DEVICE_READ_TIMEOUT_UNIT);
     }
 
-    private InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device
-        .container.org.openroadm.device.OduConnection> generateOduConnectionIID(String connectionNumber) {
-
-        return InstanceIdentifier.create(OrgOpenroadmDevice.class).child(org.opendaylight.yang.gen.v1.http.org
-                .openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.OduConnection.class,
-            new OduConnectionKey(connectionNumber));
+    private InstanceIdentifier<OduConnection> generateOduConnectionIID(String connectionNumber) {
+        return InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(OduConnection.class, new OduConnectionKey(connectionNumber))
+            .build();
     }
 
     public Optional<String> postOtnCrossConnect(List<String> createdOduInterfaces, Nodes node) {
         String deviceId = node.getNodeId();
         String srcTp = createdOduInterfaces.get(0);
         String dstTp = createdOduInterfaces.get(1);
-
+        LOG.debug("Client TP: {}, Network TP: {}, Network2TP: {} SrcTP: {}, DstTP: {}",
+                node.getClientTp(), node.getNetworkTp(), node.getNetwork2Tp(), srcTp, dstTp);
+        if (!srcTp.contains(node.getClientTp())) {
+            // If the src-tp does not contain client port, then we swap src-tp & dest-tp
+            String tmp;
+            tmp = dstTp;
+            dstTp = srcTp;
+            srcTp = tmp;
+            LOG.debug("After swap, SrcTP: {}, DstTP: {}", srcTp, dstTp);
+        }
+        // Strip the service name from the src and dst
+        String oduXConnectionName = srcTp.split(":")[0] + "-x-" + dstTp.split(":")[0];
         OduConnectionBuilder oduConnectionBuilder = new OduConnectionBuilder()
-            .setConnectionName(srcTp + "-x-" + dstTp)
+            .setConnectionName(oduXConnectionName)
             .setDestination(new org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.odu.connection
                 .DestinationBuilder().setDstIf(dstTp).build())
             .setSource(new org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.odu.connection
                 .SourceBuilder().setSrcIf(srcTp).build())
             .setDirection(Direction.Bidirectional);
 
-        InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device
-            .container.org.openroadm.device.OduConnection> oduConnectionIID =
-            InstanceIdentifier.create(
-                org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container
-                    .OrgOpenroadmDevice.class)
-                .child(org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device
-                .container.org.openroadm.device.OduConnection.class,
-                    new OduConnectionKey(oduConnectionBuilder.getConnectionName())
-                );
+        InstanceIdentifier<OduConnection> oduConnectionIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(OduConnection.class, new OduConnectionKey(oduConnectionBuilder.getConnectionName()))
+            .build();
 
         Future<Optional<DeviceTransaction>> deviceTxFuture = deviceTransactionManager.getDeviceTransaction(deviceId);
         DeviceTransaction deviceTx;
         try {
             Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
             if (deviceTxOpt.isPresent()) {
-                deviceTx = deviceTxOpt.get();
+                deviceTx = deviceTxOpt.orElseThrow();
             } else {
                 LOG.error("Device transaction for device {} was not found!", deviceId);
                 return Optional.empty();
@@ -98,8 +103,8 @@ public class CrossConnectImpl710 {
             deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
         try {
             commit.get();
-            LOG.info("Otn-connection successfully created: {}-{}", srcTp, dstTp);
-            return Optional.of(srcTp + "-x-" + dstTp);
+            LOG.info("Otn-connection successfully created: {}", oduXConnectionName);
+            return Optional.of(oduXConnectionName);
         } catch (InterruptedException | ExecutionException e) {
             LOG.warn("Failed to post {}.", oduConnectionBuilder.build(), e);
         }
@@ -113,8 +118,8 @@ public class CrossConnectImpl710 {
             .container.org.openroadm.device.OduConnection> otnXc = getOtnCrossConnect(deviceId, connectionName);
 
         if (otnXc.isPresent()) {
-            interfList.add(otnXc.get().getSource().getSrcIf());
-            interfList.add(otnXc.get().getDestination().getDstIf());
+            interfList.add(otnXc.orElseThrow().getSource().getSrcIf());
+            interfList.add(otnXc.orElseThrow().getDestination().getDstIf());
         } else {
             LOG.warn("Cross connect {} does not exist, halting delete", connectionName);
             return null;
@@ -124,7 +129,7 @@ public class CrossConnectImpl710 {
         try {
             Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
             if (deviceTxOpt.isPresent()) {
-                deviceTx = deviceTxOpt.get();
+                deviceTx = deviceTxOpt.orElseThrow();
             } else {
                 LOG.error("Device transaction for device {} was not found!", deviceId);
                 return null;
index eaa7773d99c065dc5c7c3edc28d502f8c781243f..86221d5c6bfe06077450ddf9e22f69fa7fedb7c9 100644 (file)
@@ -8,6 +8,8 @@
 
 package org.opendaylight.transportpce.common.device;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
@@ -33,39 +35,70 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeKey;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.Designate;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-
-public class DeviceTransactionManagerImpl implements DeviceTransactionManager {
+@Component
+@Designate(ocd = DeviceTransactionManagerImpl.Configuration.class)
+public final class DeviceTransactionManagerImpl implements DeviceTransactionManager {
+    @ObjectClassDefinition
+    public @interface Configuration {
+        @AttributeDefinition(description = "Minimum number of threads in the checking pool", min = "0")
+        int checkingMinThreads() default DEFAULT_CHECKING_MIN_THREADS;
+        @AttributeDefinition(description = "Number of threads in the listening pool", min = "1")
+        int listeningThreads() default DEFAULT_LISTENING_THREADS;
+        @AttributeDefinition(description = "Maximum time to wait for transaction submit, in milliseconds", min = "0")
+        long maxDurationToSubmit() default DEFAULT_MAX_DURATION_TO_SUBMIT;
+        @AttributeDefinition(description = "Maximum time to wait for get-data submit, in milliseconds", min = "0")
+        long maxDurationToGetData() default DEFAULT_MAX_DURATION_TO_GET_DATA;
+    }
 
     // TODO cache device data brokers
     // TODO remove disconnected devices from maps
 
     private static final Logger LOG = LoggerFactory.getLogger(DeviceTransactionManagerImpl.class);
-    private static final int NUMBER_OF_THREADS = 4;
-    private static final long GET_DATA_SUBMIT_TIMEOUT = 3000;
-    private static final TimeUnit GET_DATA_SUBMIT_TIME_UNIT = TimeUnit.MILLISECONDS;
-    private static final TimeUnit MAX_DURATION_TO_SUBMIT_TIMEUNIT = TimeUnit.MILLISECONDS;
+    private static final long DEFAULT_MAX_DURATION_TO_GET_DATA = 3000;
+    private static final long DEFAULT_MAX_DURATION_TO_SUBMIT = 15000;
+    private static final int DEFAULT_CHECKING_MIN_THREADS = 4;
+    private static final int DEFAULT_LISTENING_THREADS = 4;
 
     private final MountPointService mountPointService;
     private final ScheduledExecutorService checkingExecutor;
     private final ListeningExecutorService listeningExecutor;
-    private final ConcurrentMap<String, CountDownLatch> deviceLocks;
-    // TODO set reasonable value in blueprint for maxDurationToSubmitTransaction
+    private final ConcurrentMap<String, CountDownLatch> deviceLocks = new ConcurrentHashMap<>();
     private final long maxDurationToSubmitTransaction;
+    private final long maxDurationToGetData;
+
+    @Activate
+    public DeviceTransactionManagerImpl(@Reference MountPointService mountPointService, Configuration configuration) {
+        this(mountPointService, configuration.maxDurationToSubmit(), configuration.maxDurationToGetData(),
+            configuration.checkingMinThreads(), configuration.listeningThreads());
+    }
 
     public DeviceTransactionManagerImpl(MountPointService mountPointService, long maxDurationToSubmitTransaction) {
-        this.mountPointService = mountPointService;
+        this(mountPointService, maxDurationToSubmitTransaction, DEFAULT_MAX_DURATION_TO_GET_DATA,
+            DEFAULT_CHECKING_MIN_THREADS, DEFAULT_LISTENING_THREADS);
+    }
+
+    public DeviceTransactionManagerImpl(MountPointService mountPointService, long maxDurationToSubmitTransaction,
+            long maxDurationToGetData, int checkingPoolMinThreads, int listeningPoolThreads) {
+        this.mountPointService = requireNonNull(mountPointService);
         this.maxDurationToSubmitTransaction = maxDurationToSubmitTransaction;
-        this.deviceLocks = new ConcurrentHashMap<>();
-        this.checkingExecutor = Executors.newScheduledThreadPool(NUMBER_OF_THREADS);
-        this.listeningExecutor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(NUMBER_OF_THREADS));
+        this.maxDurationToGetData = maxDurationToGetData;
+        this.checkingExecutor = Executors.newScheduledThreadPool(checkingPoolMinThreads);
+        this.listeningExecutor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(listeningPoolThreads));
     }
 
     @Override
     public Future<Optional<DeviceTransaction>> getDeviceTransaction(String deviceId) {
-        return getDeviceTransaction(deviceId, maxDurationToSubmitTransaction, MAX_DURATION_TO_SUBMIT_TIMEUNIT);
+        return getDeviceTransaction(deviceId, maxDurationToSubmitTransaction, TimeUnit.MILLISECONDS);
     }
 
     @Override
@@ -84,7 +117,7 @@ public class DeviceTransactionManagerImpl implements DeviceTransactionManager {
             Optional<DataBroker> deviceDataBrokerOpt = getDeviceDataBroker(deviceId);
             DataBroker deviceDataBroker;
             if (deviceDataBrokerOpt.isPresent()) {
-                deviceDataBroker = deviceDataBrokerOpt.get();
+                deviceDataBroker = deviceDataBrokerOpt.orElseThrow();
             } else {
                 newLock.countDown();
                 return Optional.empty();
@@ -100,7 +133,7 @@ public class DeviceTransactionManagerImpl implements DeviceTransactionManager {
                 // if time will run out and transaction was not closed then it will be cancelled (and unlocked)
                 checkingExecutor.schedule(() -> {
                     if (deviceTransactionOptional.isPresent()) {
-                        DeviceTransaction deviceTx = deviceTransactionOptional.get();
+                        DeviceTransaction deviceTx = deviceTransactionOptional.orElseThrow();
                         LOG.debug("Timeout to submit transaction run out! Transaction was {} submitted or canceled.",
                                 deviceTx.wasSubmittedOrCancelled().get() ? "" : "not");
                         if (!deviceTx.wasSubmittedOrCancelled().get()) {
@@ -131,7 +164,7 @@ public class DeviceTransactionManagerImpl implements DeviceTransactionManager {
     private Optional<DataBroker> getDeviceDataBroker(String deviceId) {
         Optional<MountPoint> netconfNode = getDeviceMountPoint(deviceId);
         if (netconfNode.isPresent()) {
-            return netconfNode.get().getService(DataBroker.class);
+            return netconfNode.orElseThrow().getService(DataBroker.class);
         } else {
             LOG.error("Device mount point not found for : {}", deviceId);
             return Optional.empty();
@@ -156,13 +189,13 @@ public class DeviceTransactionManagerImpl implements DeviceTransactionManager {
             return Optional.empty();
         }
         if (deviceTxOpt.isPresent()) {
-            DeviceTransaction deviceTx = deviceTxOpt.get();
+            DeviceTransaction deviceTx = deviceTxOpt.orElseThrow();
             try {
                 return deviceTx.read(logicalDatastoreType, path).get(timeout, timeUnit);
             } catch (InterruptedException | ExecutionException | TimeoutException e) {
                 LOG.error("Exception thrown while reading data from device {}! IID: {}", deviceId, path, e);
             } finally {
-                deviceTx.commit(GET_DATA_SUBMIT_TIMEOUT, GET_DATA_SUBMIT_TIME_UNIT);
+                deviceTx.commit(maxDurationToGetData, TimeUnit.MILLISECONDS);
             }
         } else {
             LOG.error("Could not obtain transaction for device {}!", deviceId);
@@ -175,6 +208,7 @@ public class DeviceTransactionManagerImpl implements DeviceTransactionManager {
         return getDeviceDataBroker(deviceId).isPresent();
     }
 
+    @Deactivate
     public void preDestroy() {
         checkingExecutor.shutdown();
         listeningExecutor.shutdown();
index 6dd3fec20026084518129822f6e9293e210d4d48..e6e89839e29754994c69322bc8470af6d107dd33 100644 (file)
@@ -14,12 +14,13 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.ServicePathInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev211210.FrequencyGHz;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev211210.FrequencyTHz;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev230526.FrequencyGHz;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev230526.FrequencyTHz;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.ModulationFormat;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.available.freq.map.AvailFreqMaps;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.available.freq.map.AvailFreqMapsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.available.freq.map.AvailFreqMapsKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.available.freq.map.AvailFreqMaps;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.available.freq.map.AvailFreqMapsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.available.freq.map.AvailFreqMapsKey;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.Uint16;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.slf4j.Logger;
@@ -44,8 +45,10 @@ public final class GridUtils {
         Arrays.fill(byteArray, (byte) GridConstant.AVAILABLE_SLOT_VALUE);
         Map<AvailFreqMapsKey, AvailFreqMaps> waveMap = new HashMap<>();
         AvailFreqMaps availFreqMaps = new AvailFreqMapsBuilder().setMapName(GridConstant.C_BAND)
-                .setFreqMapGranularity(new FrequencyGHz(BigDecimal.valueOf(GridConstant.GRANULARITY)))
-                .setStartEdgeFreq(new FrequencyTHz(BigDecimal.valueOf(GridConstant.START_EDGE_FREQUENCY)))
+                .setFreqMapGranularity(
+                    new FrequencyGHz(Decimal64.valueOf(BigDecimal.valueOf(GridConstant.GRANULARITY))))
+                .setStartEdgeFreq(
+                    new FrequencyTHz(Decimal64.valueOf(BigDecimal.valueOf(GridConstant.START_EDGE_FREQUENCY))))
                 .setEffectiveBits(Uint16.valueOf(GridConstant.EFFECTIVE_BITS))
                 .setFreqMap(byteArray)
                 .build();
@@ -85,15 +88,16 @@ public final class GridUtils {
     /**
      * Get the bit index for the frequency.
      *
-     * @param frequency BigDecimal
+     * @param atozMinFrequency BigDecimal
      * @return the bit index of the frequency. Throw IllegalArgumentException if
      *         index not in range of 0 GridConstant.EFFECTIVE_BITS
      */
-    public static int getIndexFromFrequency(BigDecimal frequency) {
-        double nvalue = (frequency.doubleValue() - GridConstant.CENTRAL_FREQUENCY) * (1000 / GridConstant.GRANULARITY);
+    public static int getIndexFromFrequency(Decimal64 atozMinFrequency) {
+        double nvalue = (atozMinFrequency.doubleValue() - GridConstant.CENTRAL_FREQUENCY)
+            * (1000 / GridConstant.GRANULARITY);
         int index =  (int) Math.round(nvalue + 284);
         if (index < 0 || index > GridConstant.EFFECTIVE_BITS) {
-            throw new IllegalArgumentException("Frequency not in range " + frequency);
+            throw new IllegalArgumentException("Frequency not in range " + atozMinFrequency);
         }
         return index;
     }
@@ -102,9 +106,10 @@ public final class GridUtils {
      * Get the spectrum width for rate and modulation format.
      * @param rate Uint32
      * @param modulationFormat ModulationFormat
-     * @return spectrum width in GHz
+     * @return spectrum width in GHz compatible with models 10.1
      */
-    public static FrequencyGHz getWidthFromRateAndModulationFormat(Uint32 rate, ModulationFormat modulationFormat) {
+    public static FrequencyGHz getWidthFromRateAndModulationFormat(Uint32 rate,
+            ModulationFormat modulationFormat) {
         String width = GridConstant.FREQUENCY_WIDTH_TABLE.get(rate, modulationFormat);
         if (width == null) {
             LOG.warn("No width found for service rate {} and modulation format {}, set width to 40", rate,
@@ -118,11 +123,10 @@ public final class GridUtils {
      * Get central frequency of spectrum.
      * @param minFrequency BigDecimal
      * @param maxFrequency BigDecimal
-     * @return central frequency in THz
+     * @return central frequency in THz compatible with models 10.1
      */
     public static FrequencyTHz getCentralFrequency(BigDecimal minFrequency, BigDecimal maxFrequency) {
-        return new FrequencyTHz(computeCentralFrequency(minFrequency, maxFrequency));
-
+        return new FrequencyTHz(Decimal64.valueOf(computeCentralFrequency(minFrequency, maxFrequency)));
     }
 
     /**
@@ -136,7 +140,8 @@ public final class GridUtils {
         getCentralFrequencyWithPrecision(BigDecimal minFrequency,
             BigDecimal maxFrequency, int precision) {
         return new org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.FrequencyTHz(
-                computeCentralFrequency(minFrequency, maxFrequency).setScale(precision, RoundingMode.HALF_EVEN));
+                Decimal64.valueOf(computeCentralFrequency(minFrequency, maxFrequency)
+                    .setScale(precision, RoundingMode.HALF_EVEN)));
 
     }
 
@@ -155,7 +160,7 @@ public final class GridUtils {
      * @param frequency BigDecimal
      * @return the lower spectral index
      */
-    public static int getLowerSpectralIndexFromFrequency(BigDecimal frequency) {
+    public static int getLowerSpectralIndexFromFrequency(Decimal64 frequency) {
         return getIndexFromFrequency(frequency) + 1;
     }
 
@@ -164,7 +169,7 @@ public final class GridUtils {
      * @param frequency BigDecimal
      * @return the lower spectral index
      */
-    public static int getHigherSpectralIndexFromFrequency(BigDecimal frequency) {
+    public static int getHigherSpectralIndexFromFrequency(Decimal64 frequency) {
         return getIndexFromFrequency(frequency);
     }
 
@@ -185,26 +190,27 @@ public final class GridUtils {
             spectrumInformation.setWaveLength(input.getWaveNumber());
         }
         if (input.getMinFreq() != null) {
-            spectrumInformation.setMinFrequency(input.getMinFreq().getValue());
+            spectrumInformation.setMinFrequency(input.getMinFreq().getValue().decimalValue());
         } else {
             spectrumInformation.setMinFrequency(
                     GridUtils.getStartFrequencyFromIndex(input.getLowerSpectralSlotNumber().intValue() - 1));
         }
         if (input.getMaxFreq() != null) {
-            spectrumInformation.setMaxFrequency(input.getMaxFreq().getValue());
+            spectrumInformation.setMaxFrequency(input.getMaxFreq().getValue().decimalValue());
         } else {
             spectrumInformation.setMaxFrequency(
                     GridUtils.getStopFrequencyFromIndex(input.getHigherSpectralSlotNumber().intValue() - 1));
         }
         if (input.getCenterFreq() != null) {
-            spectrumInformation.setCenterFrequency(input.getCenterFreq().getValue());
+            spectrumInformation.setCenterFrequency(input.getCenterFreq().getValue().decimalValue());
         } else {
-            spectrumInformation.setCenterFrequency(GridUtils
-                    .getCentralFrequency(spectrumInformation.getMinFrequency(),
-                            spectrumInformation.getMaxFrequency()).getValue());
+            spectrumInformation.setCenterFrequency(GridUtils.getCentralFrequency(
+                    spectrumInformation.getMinFrequency(),
+                    spectrumInformation.getMaxFrequency()).getValue().decimalValue());
         }
         if (input.getNmcWidth() != null) {
-            spectrumInformation.setWidth(input.getNmcWidth().getValue());
+            spectrumInformation.setWidth(input.getNmcWidth().getValue().decimalValue()
+                    .setScale(0, RoundingMode.CEILING));
         }
         if (input.getModulationFormat() != null) {
             spectrumInformation.setModulationFormat(input.getModulationFormat());
index 00d597194c3ba17133f78ec7f6e987ccba94e414..8696b92844fcbbc1effa9ad8b12778676fa2577a 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.transportpce.common.mapping;
 
 import java.util.List;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mc.capabilities.McCapabilities;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mc.capabilities.McCapabilities;
 
 public interface MappingUtils {
 
index 7c474cc0cec9b44412e214e8e68711b23d7d2153..b91104798d9a9f18bb2a812730fe7cd97b3cb05d 100644 (file)
@@ -7,69 +7,77 @@
  */
 package org.opendaylight.transportpce.common.mapping;
 
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableMap;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.ReadTransaction;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.StringConstants;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mc.capabilities.McCapabilities;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfo;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If100GE;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If100GEODU4;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If10GE;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If10GEODU2;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If10GEODU2e;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If1GE;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If1GEODU0;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If400GE;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOCH;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOCHOTU2EODU2E;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOCHOTU2ODU2;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOCHOTU4ODU4;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOTUCnODUCn;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOtsiOtsigroup;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.SupportedIfCapability;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.Network;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mc.capabilities.McCapabilities;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfo;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If100GE;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If100GEODU4;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If10GE;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If10GEODU2;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If10GEODU2e;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If1GEODU0;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If400GE;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOCH;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOCHOTU4ODU4;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOTU4ODU4;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOtsiOtsigroup;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.SupportedIfCapability;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class MappingUtilsImpl implements MappingUtils {
+@Component
+public final class MappingUtilsImpl implements MappingUtils {
 
     private static final Logger LOG = LoggerFactory.getLogger(MappingUtilsImpl.class);
 
-    private final DataBroker dataBroker;
-
-    private static Map<String, Class<? extends SupportedIfCapability>> capTypeClassMap = new HashMap<>() {
-        {
-            put("IfOtsiOtsigroup", IfOtsiOtsigroup.class);
-            put("IfOTUCnODUCn", IfOTUCnODUCn.class);
-            put("IfOCHOTU4ODU4", IfOCHOTU4ODU4.class);
-            put("IfOCH", IfOCH.class);
-            put("If100GEODU4", If100GEODU4.class);
-            put("If10GEODU2e", If10GEODU2e.class);
-            put("If10GEODU2", If10GEODU2.class);
-            put("If1GEODU0", If1GEODU0.class);
-            put("If400GE", If400GE.class);
-            put("If100GE", If100GE.class);
-            put("If10GE", If10GE.class);
-            put("If1GE", If1GE.class);
-            put("IfOCHOTU2EODU2E", IfOCHOTU2EODU2E.class);
-            put("IfOCHOTU2ODU2", IfOCHOTU2ODU2.class);
-        }
-    };
-
-    public MappingUtilsImpl(DataBroker dataBroker) {
+    private static final ImmutableMap<String, SupportedIfCapability> CAP_TYPE_MAP =
+        ImmutableMap.<String, SupportedIfCapability>builder()
+            .put("If400GE{qname=(http://org/openroadm/port/types?revision=2020-03-27)if-400GE}", If400GE.VALUE)
+            .put("IfOTU4ODU4{qname=(http://org/openroadm/port/types?revision=2020-03-27)if-OTU4-ODU4}",
+                    IfOTU4ODU4.VALUE)
+            .put("IfOtsiOtsigroup{qname=(http://org/openroadm/port/types?revision=2020-03-27)if-otsi-otsigroup}",
+                IfOtsiOtsigroup.VALUE)
+            .put("IfOCH{qname=(http://org/openroadm/port/types?revision=2018-10-19)if-OCH}", IfOCH.VALUE)
+            .put("IfOCHOTU4ODU4{qname=(http://org/openroadm/port/types?revision=2018-10-19)if-OCH-OTU4-ODU4}",
+                IfOCHOTU4ODU4.VALUE)
+            .put("IfOCHOTU4ODU4{qname=(http://org/openroadm/port/types?revision=2020-03-27)if-OCH-OTU4-ODU4}",
+                IfOCHOTU4ODU4.VALUE)
+            .put("If1GEODU0{qname=(http://org/openroadm/port/types?revision=2018-10-19)if-1GE-ODU0}", If1GEODU0.VALUE)
+            .put("If10GE{qname=(http://org/openroadm/port/types?revision=2018-10-19)if-10GE}", If10GE.VALUE)
+            .put("If10GEODU2{qname=(http://org/openroadm/port/types?revision=2018-10-19)if-10GE-ODU2}",
+                If10GEODU2.VALUE)
+            .put("If10GEODU2e{qname=(http://org/openroadm/port/types?revision=2018-10-19)if-10GE-ODU2e}",
+                If10GEODU2e.VALUE)
+            .put("If100GE{qname=(http://org/openroadm/port/types?revision=2018-10-19)if-100GE}", If100GE.VALUE)
+            .put("If100GE{qname=(http://org/openroadm/port/types?revision=2020-03-27)if-100GE}", If100GE.VALUE)
+            .put("If100GEODU4{qname=(http://org/openroadm/port/types?revision=2018-10-19)if-100GE-ODU4}",
+                If100GEODU4.VALUE)
+            .put("If100GEODU4{qname=(http://org/openroadm/port/types?revision=2020-03-27)if-100GE-ODU4}",
+                If100GEODU4.VALUE)
+            .build();
 
-        this.dataBroker = dataBroker;
+    private final DataBroker dataBroker;
 
+    @Activate
+    public MappingUtilsImpl(@Reference DataBroker dataBroker) {
+        this.dataBroker = requireNonNull(dataBroker);
     }
 
     public String getOpenRoadmVersion(String nodeId) {
@@ -82,7 +90,7 @@ public class MappingUtilsImpl implements MappingUtils {
             Optional<NodeInfo> nodeInfoObj =
                     readTx.read(LogicalDatastoreType.CONFIGURATION, nodeInfoIID).get();
             if (nodeInfoObj.isPresent()) {
-                NodeInfo nodInfo = nodeInfoObj.get();
+                NodeInfo nodInfo = nodeInfoObj.orElseThrow();
                 switch (nodInfo.getOpenroadmVersion()) {
                     case _71:
                         return StringConstants.OPENROADM_DEVICE_VERSION_7_1;
@@ -116,8 +124,8 @@ public class MappingUtilsImpl implements MappingUtils {
             Optional<Nodes> nodePortMapObject = readTx.read(LogicalDatastoreType.CONFIGURATION, nodePortMappingIID)
                     .get();
             if (nodePortMapObject.isPresent()) {
-                LOG.info("Found node {}", nodeId);
-                Nodes node = nodePortMapObject.get();
+                LOG.debug("Found node {}", nodeId);
+                Nodes node = nodePortMapObject.orElseThrow();
                 mcCapabilities.addAll(node.nonnullMcCapabilities().values());
             }
         } catch (ExecutionException e) {
@@ -126,15 +134,15 @@ public class MappingUtilsImpl implements MappingUtils {
             LOG.error("Request interrupted for node {} interrupted", nodeId, e);
             Thread.currentThread().interrupt();
         }
-        LOG.info("Capabilitities for node {}: {}", nodeId, mcCapabilities);
+        LOG.debug("Capabilitities for node {}: {}", nodeId, mcCapabilities);
         return mcCapabilities;
     }
 
-    public static Class<? extends SupportedIfCapability> convertSupIfCapa(String ifCapType) {
-        if (!capTypeClassMap.containsKey(ifCapType)) {
+    public static SupportedIfCapability convertSupIfCapa(String ifCapType) {
+        if (!CAP_TYPE_MAP.containsKey(ifCapType)) {
             LOG.error("supported-if-capability {} not supported", ifCapType);
             return null;
         }
-        return capTypeClassMap.get(ifCapType);
+        return CAP_TYPE_MAP.get(ifCapType);
     }
 }
index 4342590e968ff87c8162ffc3286d2fc1930159a6..e5a9b66747b93d4f85c6022d1ff834e78396e828 100644 (file)
@@ -11,9 +11,9 @@ package org.opendaylight.transportpce.common.mapping;
 
 import java.util.List;
 import java.util.Map;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mc.capabilities.McCapabilities;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mc.capabilities.McCapabilities;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.OduSwitchingPools;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.odu.switching.pools.non.blocking.list.PortList;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -109,6 +109,30 @@ public interface PortMapping {
      */
     Mapping getMapping(String nodeId, String circuitPackName, String portName);
 
+    /**
+     * This method for a given node's termination point returns the Mapping object
+     * based on portmapping.yang model stored in the MD-SAL data store which is
+     * created when the node is connected for the first time. The mapping object
+     * basically contains the following attributes of interest:
+     *
+     * <p>
+     * 1. Supporting circuit pack
+     *
+     * <p>
+     * 2. Supporting port
+     *
+     * <p>
+     * 3. Supporting OTS/OMS interface (if port on ROADM)
+     *
+     * @param nodeId
+     *            Unique Identifier for the node of interest.
+     * @param interfName
+     *            Name of the OTS interface
+     *
+     * @return Result Mapping object if success otherwise null.
+     */
+    Mapping getMappingFromOtsInterface(String nodeId, String interfName);
+
     /**
      * This method removes a given mapping data from the mapping list
      * stored in the datastore while the Netconf device is already
index 85f7280bab8eb46b7293afde7323c95411d4f181..e488777be0cf5b66b0c2c0b7054c6f8312a81b12 100644 (file)
@@ -21,23 +21,27 @@ import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.ReadTransaction;
 import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.OpenroadmNodeVersion;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mc.capabilities.McCapabilities;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mc.capabilities.McCapabilitiesKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesKey;
+import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.Network;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.OpenroadmNodeVersion;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mc.capabilities.McCapabilities;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mc.capabilities.McCapabilitiesKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.OduSwitchingPools;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.odu.switching.pools.non.blocking.list.PortList;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Uint16;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-
+@Component
 public class PortMappingImpl implements PortMapping {
 
     private static final Logger LOG = LoggerFactory.getLogger(PortMappingImpl.class);
@@ -47,6 +51,15 @@ public class PortMappingImpl implements PortMapping {
     private final PortMappingVersion221 portMappingVersion22;
     private final PortMappingVersion121 portMappingVersion121;
 
+    @Activate
+    public PortMappingImpl(@Reference DataBroker dataBroker,
+            @Reference DeviceTransactionManager deviceTransactionManager) {
+        this(dataBroker,
+            new PortMappingVersion710(dataBroker, deviceTransactionManager),
+            new PortMappingVersion221(dataBroker, deviceTransactionManager),
+            new PortMappingVersion121(dataBroker, deviceTransactionManager));
+    }
+
     public PortMappingImpl(DataBroker dataBroker, PortMappingVersion710 portMappingVersion710,
         PortMappingVersion221 portMappingVersion22, PortMappingVersion121 portMappingVersion121) {
 
@@ -92,7 +105,7 @@ public class PortMappingImpl implements PortMapping {
         try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
             Optional<Mapping> mapObject = readTx.read(LogicalDatastoreType.CONFIGURATION, portMappingIID).get();
             if (mapObject.isPresent()) {
-                Mapping mapping = mapObject.get();
+                Mapping mapping = mapObject.orElseThrow();
                 LOG.info("Found mapping for {} - {}. Mapping: {}", nodeId, logicalConnPoint, mapping.toString());
                 return mapping;
             }
@@ -110,11 +123,11 @@ public class PortMappingImpl implements PortMapping {
             .child(Nodes.class, new NodesKey(nodeId));
         try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
             Optional<Nodes> portMapppingOpt = readTx.read(LogicalDatastoreType.CONFIGURATION, portMappingIID).get();
-            if (!portMapppingOpt.isPresent()) {
+            if (portMapppingOpt.isEmpty()) {
                 LOG.warn("Could not get portMapping for node {}", nodeId);
                 return null;
             }
-            Map<MappingKey, Mapping> mappings = portMapppingOpt.get().getMapping();
+            Map<MappingKey, Mapping> mappings = portMapppingOpt.orElseThrow().getMapping();
             for (Mapping mapping : mappings.values()) {
                 if (circuitPackName.equals(mapping.getSupportingCircuitPackName())
                     && portName.equals(mapping.getSupportingPort())) {
@@ -154,7 +167,7 @@ public class PortMappingImpl implements PortMapping {
             Optional<McCapabilities> mcCapObject = readTx.read(LogicalDatastoreType.CONFIGURATION,
                 mcCapabilitiesIID).get();
             if (mcCapObject.isPresent()) {
-                McCapabilities mcCap = mcCapObject.get();
+                McCapabilities mcCap = mcCapObject.orElseThrow();
                 LOG.info("Found MC-cap for {} - {}. Mapping: {}", nodeId, mcLcp, mcCap.toString());
                 return mcCap;
             }
@@ -205,7 +218,7 @@ public class PortMappingImpl implements PortMapping {
             Optional<Nodes> nodePortMapObject =
                 readTx.read(LogicalDatastoreType.CONFIGURATION, nodePortMappingIID).get();
             if (nodePortMapObject.isPresent()) {
-                Nodes node = nodePortMapObject.get();
+                Nodes node = nodePortMapObject.orElseThrow();
                 LOG.info("Found node {} in portmapping.", nodeId);
                 return node;
             }
@@ -235,4 +248,27 @@ public class PortMappingImpl implements PortMapping {
         return this.getNode(nodeId) != null;
     }
 
+    @Override
+    public Mapping getMappingFromOtsInterface(String nodeId, String interfName) {
+        KeyedInstanceIdentifier<Nodes, NodesKey> nodePortmappingIID = InstanceIdentifier.create(Network.class)
+            .child(Nodes.class, new NodesKey(nodeId));
+        try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
+            Optional<Nodes> nodePortmapppingOpt
+                = readTx.read(LogicalDatastoreType.CONFIGURATION, nodePortmappingIID).get();
+            if (nodePortmapppingOpt.isEmpty()) {
+                LOG.warn("Could not get portMapping for node {}", nodeId);
+                return null;
+            }
+            Map<MappingKey, Mapping> mappings = nodePortmapppingOpt.orElseThrow().getMapping();
+            for (Mapping mapping : mappings.values()) {
+                if (interfName.equals(mapping.getSupportingOts())) {
+                    return mapping;
+                }
+            }
+        } catch (InterruptedException | ExecutionException ex) {
+            LOG.error("Unable to get mapping list for nodeId {}", nodeId, ex);
+        }
+        return null;
+    }
+
 }
index aea5d098ff51fa945797e6573d63c5b9284530a4..970f0abc972f485306f4ad32bae4b7a54b8225e3 100644 (file)
@@ -9,10 +9,12 @@
 package org.opendaylight.transportpce.common.mapping;
 
 import com.google.common.util.concurrent.FluentFuture;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -29,22 +31,23 @@ import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.transportpce.common.Timeouts;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.NetworkBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.OpenroadmNodeVersion;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.cp.to.degree.CpToDegree;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.cp.to.degree.CpToDegreeBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.cp.to.degree.CpToDegreeKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfo;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfoBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.Network;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.NetworkBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.OpenroadmNodeVersion;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.cp.to.degree.CpToDegree;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.cp.to.degree.CpToDegreeBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.cp.to.degree.CpToDegreeKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfo;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfoBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.Direction;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.CircuitPack;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.Port;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.Ports;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.PortsKey;
@@ -74,7 +77,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev161014.OtnO
 import org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev161014.Protocols1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev161014.lldp.container.Lldp;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev161014.lldp.container.lldp.PortConfig;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev170929.SupportedIfCapability;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev161014.SupportedIfCapability;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Uint16;
 import org.opendaylight.yangtools.yang.common.Uint32;
@@ -100,6 +103,7 @@ public class PortMappingVersion121 {
             Direction.Bidirectional, "TXRX");
     }
 
+
     public PortMappingVersion121(DataBroker dataBroker, DeviceTransactionManager deviceTransactionManager) {
         this.dataBroker = dataBroker;
         this.deviceTransactionManager = deviceTransactionManager;
@@ -108,14 +112,15 @@ public class PortMappingVersion121 {
     public boolean createMappingData(String nodeId) {
         LOG.info(PortMappingUtils.CREATE_MAPPING_DATA_LOGMSG, nodeId, "1.2.1");
         List<Mapping> portMapList = new ArrayList<>();
-        InstanceIdentifier<Info> infoIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Info.class);
+        InstanceIdentifier<Info> infoIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class).child(Info.class).build();
         Optional<Info> deviceInfoOptional = this.deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType
             .OPERATIONAL, infoIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
         if (deviceInfoOptional.isEmpty()) {
             LOG.warn(PortMappingUtils.DEVICE_HAS_LOGMSG, nodeId, "no info", "subtree");
             return false;
         }
-        Info deviceInfo = deviceInfoOptional.get();
+        Info deviceInfo = deviceInfoOptional.orElseThrow();
         NodeInfo nodeInfo = createNodeInfo(deviceInfo);
         if (nodeInfo == null) {
             return false;
@@ -163,12 +168,14 @@ public class PortMappingVersion121 {
             LOG.error(PortMappingUtils.UNABLE_MAPPING_LOGMSG, nodeId, PortMappingUtils.UPDATE, "a null value");
             return false;
         }
-        InstanceIdentifier<Ports> portId = InstanceIdentifier.create(OrgOpenroadmDevice.class)
+        InstanceIdentifier<Ports> portId = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
             .child(CircuitPacks.class, new CircuitPacksKey(oldMapping.getSupportingCircuitPackName()))
-            .child(Ports.class, new PortsKey(oldMapping.getSupportingPort()));
+            .child(Ports.class, new PortsKey(oldMapping.getSupportingPort()))
+            .build();
         try {
             Ports port = deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL,
-                portId, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT).get();
+                portId, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT).orElseThrow();
             Mapping newMapping = updateMappingObject(nodeId, port, oldMapping);
             LOG.debug(PortMappingUtils.UPDATE_MAPPING_LOGMSG,
                 nodeId, oldMapping, oldMapping.getLogicalConnectionPoint(), newMapping);
@@ -189,7 +196,8 @@ public class PortMappingVersion121 {
 
     private boolean createXpdrPortMapping(String nodeId, List<Mapping> portMapList) {
         // Creating for Xponder Line and Client Ports
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class).build();
         Optional<OrgOpenroadmDevice> deviceObject = deviceTransactionManager.getDataFromDevice(nodeId,
             LogicalDatastoreType.OPERATIONAL, deviceIID,
             Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -197,7 +205,7 @@ public class PortMappingVersion121 {
             LOG.error(PortMappingUtils.CANNOT_GET_DEV_CONF_LOGMSG, nodeId);
             return false;
         }
-        OrgOpenroadmDevice device = deviceObject.get();
+        OrgOpenroadmDevice device = deviceObject.orElseThrow();
         if (device.getCircuitPacks() == null) {
             LOG.warn(PortMappingUtils.MISSING_CP_LOGMSG, nodeId, PortMappingUtils.FOUND);
             return false;
@@ -228,7 +236,7 @@ public class PortMappingVersion121 {
             }
         }
 
-        for (ConnectionMap cm : deviceObject.get().nonnullConnectionMap().values()) {
+        for (ConnectionMap cm : deviceObject.orElseThrow().nonnullConnectionMap().values()) {
             String skey = cm.getSource().getCircuitPackName() + "+" + cm.getSource().getPortName();
             Destination destination0 = cm.nonnullDestination().values().iterator().next();
             String dkey = destination0.getCircuitPackName() + "+" + destination0.getPortName();
@@ -277,14 +285,16 @@ public class PortMappingVersion121 {
             List<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.srg.CircuitPacks> srgCps
                 = new ArrayList<>();
             LOG.debug(PortMappingUtils.GETTING_CP_LOGMSG, deviceId, srgCounter);
-            InstanceIdentifier<SharedRiskGroup> srgIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(SharedRiskGroup.class, new SharedRiskGroupKey(Uint16.valueOf(srgCounter)));
+            InstanceIdentifier<SharedRiskGroup> srgIID = InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(SharedRiskGroup.class, new SharedRiskGroupKey(Uint16.valueOf(srgCounter)))
+                .build();
             Optional<SharedRiskGroup> ordmSrgObject = this.deviceTransactionManager.getDataFromDevice(deviceId,
                 LogicalDatastoreType.OPERATIONAL, srgIID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
             if (ordmSrgObject.isPresent()) {
-                srgCps.addAll(ordmSrgObject.get().nonnullCircuitPacks().values());
-                cpPerSrg.put(ordmSrgObject.get().getSrgNumber().toJava(), srgCps);
+                srgCps.addAll(ordmSrgObject.orElseThrow().nonnullCircuitPacks().values());
+                cpPerSrg.put(ordmSrgObject.orElseThrow().getSrgNumber().toJava(), srgCps);
             }
         }
         LOG.info(PortMappingUtils.DEVICE_HAS_LOGMSG, deviceId, cpPerSrg.size(), "SRG");
@@ -356,20 +366,22 @@ public class PortMappingVersion121 {
                 nodeId, port.getPortName(), circuitPackName);
             return null;
         }
-        InstanceIdentifier<Ports> port2ID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
+        InstanceIdentifier<Ports> port2ID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
             .child(CircuitPacks.class, new CircuitPacksKey(port.getPartnerPort().getCircuitPackName()))
-            .child(Ports.class, new PortsKey(port.getPartnerPort().getPortName()));
+            .child(Ports.class, new PortsKey(port.getPartnerPort().getPortName()))
+            .build();
         Optional<Ports> port2Object = this.deviceTransactionManager
             .getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, port2ID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
         if (port2Object.isEmpty()
-                || port2Object.get().getPortQual().getIntValue() != Port.PortQual.RoadmExternal.getIntValue()) {
+                || port2Object.orElseThrow().getPortQual().getIntValue() != Port.PortQual.RoadmExternal.getIntValue()) {
             LOG.error(PortMappingUtils.NOT_CORRECT_PARTNERPORT_LOGMSG + PortMappingUtils.PARTNERPORT_GET_ERROR_LOGMSG,
                 nodeId, port.getPartnerPort().getPortName(), port.getPartnerPort().getCircuitPackName(),
                 port.getPortName(), circuitPackName);
             return null;
         }
-        Ports port2 = port2Object.get();
+        Ports port2 = port2Object.orElseThrow();
         if (!checkPartnerPort(circuitPackName, port, port2)) {
             LOG.error(PortMappingUtils.NOT_CORRECT_PARTNERPORT_LOGMSG + PortMappingUtils.PARTNERPORT_CONF_ERROR_LOGMSG,
                 nodeId, port2.getPortName(), port.getPartnerPort().getCircuitPackName(),
@@ -382,8 +394,10 @@ public class PortMappingVersion121 {
     }
 
     private List<Ports> getPortList(String circuitPackName, String nodeId) {
-        InstanceIdentifier<CircuitPacks> cpIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-            .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName));
+        InstanceIdentifier<CircuitPacks> cpIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName))
+            .build();
         Optional<CircuitPacks> circuitPackObject = this.deviceTransactionManager.getDataFromDevice(nodeId,
              LogicalDatastoreType.OPERATIONAL, cpIID,
              Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -392,11 +406,11 @@ public class PortMappingVersion121 {
                 nodeId, circuitPackName);
             return new ArrayList<>();
         }
-        if (circuitPackObject.get().getPorts() == null) {
+        if (circuitPackObject.orElseThrow().getPorts() == null) {
             LOG.warn(PortMappingUtils.NO_PORT_ON_CP_LOGMSG, nodeId, PortMappingUtils.FOUND, circuitPackName);
             return new ArrayList<>();
         }
-        return new ArrayList<>(circuitPackObject.get().nonnullPorts().values());
+        return new ArrayList<>(circuitPackObject.orElseThrow().nonnullPorts().values());
     }
 
     private String createLogicalConnectionPort(Ports port, int index, int portIndex) {
@@ -408,6 +422,9 @@ public class PortMappingVersion121 {
         return null;
     }
 
+    @SuppressFBWarnings(
+        value = "SLF4J_UNKNOWN_ARRAY",
+        justification = "False positive")
     private Map<Integer, Degree> getDegreesMap(String deviceId, Info ordmInfo) {
         Map<Integer, Degree> degrees = new HashMap<>();
 
@@ -417,13 +434,15 @@ public class PortMappingVersion121 {
 
         for (int degreeCounter = 1; degreeCounter <= maxDegree; degreeCounter++) {
             LOG.debug(PortMappingUtils.GETTING_CONPORT_LOGMSG, deviceId, degreeCounter);
-            InstanceIdentifier<Degree> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(Degree.class, new DegreeKey(Uint16.valueOf(degreeCounter)));
+            InstanceIdentifier<Degree> deviceIID = InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(Degree.class, new DegreeKey(Uint16.valueOf(degreeCounter)))
+                .build();
             Optional<Degree> ordmDegreeObject = this.deviceTransactionManager.getDataFromDevice(deviceId,
                 LogicalDatastoreType.OPERATIONAL, deviceIID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
             if (ordmDegreeObject.isPresent()) {
-                degrees.put(degreeCounter, ordmDegreeObject.get());
+                degrees.put(degreeCounter, ordmDegreeObject.orElseThrow());
             }
         }
         LOG.info(PortMappingUtils.DEVICE_HAS_LOGMSG,
@@ -440,41 +459,46 @@ public class PortMappingVersion121 {
 
     private Map<String, String> getEthInterfaceList(String nodeId) {
         LOG.info(PortMappingUtils.GETTING_ETH_LIST_LOGMSG, nodeId);
-        InstanceIdentifier<Protocols> protocoliid = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-            .child(Protocols.class);
+        InstanceIdentifier<Protocols> protocoliid = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Protocols.class)
+            .build();
         Optional<Protocols> protocolObject = this.deviceTransactionManager.getDataFromDevice(nodeId,
             LogicalDatastoreType.OPERATIONAL, protocoliid, Timeouts.DEVICE_READ_TIMEOUT,
             Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-        if (protocolObject.isEmpty() || protocolObject.get().augmentation(Protocols1.class).getLldp() == null) {
+        if (protocolObject.isEmpty() || protocolObject.orElseThrow().augmentation(Protocols1.class).getLldp() == null) {
             LOG.warn(PortMappingUtils.PROCESSING_DONE_LOGMSG, nodeId, PortMappingUtils.CANNOT_GET_LLDP_CONF_LOGMSG);
             return new HashMap<>();
         }
         Map<String, String> cpToInterfaceMap = new HashMap<>();
-        Lldp lldp = protocolObject.get().augmentation(Protocols1.class).getLldp();
+        Lldp lldp = protocolObject.orElseThrow().augmentation(Protocols1.class).getLldp();
         for (PortConfig portConfig : lldp.nonnullPortConfig().values()) {
             if (!portConfig.getAdminStatus().equals(PortConfig.AdminStatus.Txandrx)) {
                 continue;
             }
-            InstanceIdentifier<Interface> interfaceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(Interface.class, new InterfaceKey(portConfig.getIfName()));
+            InstanceIdentifier<Interface> interfaceIID = InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(Interface.class, new InterfaceKey(portConfig.getIfName()))
+                .build();
             Optional<Interface> interfaceObject = this.deviceTransactionManager.getDataFromDevice(nodeId,
                 LogicalDatastoreType.OPERATIONAL, interfaceIID, Timeouts.DEVICE_READ_TIMEOUT,
                 Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-            if (interfaceObject.isEmpty() || interfaceObject.get().getSupportingCircuitPackName() == null) {
+            if (interfaceObject.isEmpty() || interfaceObject.orElseThrow().getSupportingCircuitPackName() == null) {
                 continue;
             }
-            String supportingCircuitPackName = interfaceObject.get().getSupportingCircuitPackName();
+            String supportingCircuitPackName = interfaceObject.orElseThrow().getSupportingCircuitPackName();
             cpToInterfaceMap.put(supportingCircuitPackName, portConfig.getIfName());
             InstanceIdentifier<CircuitPacks> circuitPacksIID = InstanceIdentifier
-                .create(OrgOpenroadmDevice.class)
-                .child(CircuitPacks.class, new CircuitPacksKey(supportingCircuitPackName));
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(CircuitPacks.class, new CircuitPacksKey(supportingCircuitPackName))
+                .build();
             Optional<CircuitPacks> circuitPackObject = this.deviceTransactionManager.getDataFromDevice(
                 nodeId, LogicalDatastoreType.OPERATIONAL, circuitPacksIID, Timeouts.DEVICE_READ_TIMEOUT,
                 Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-            if (circuitPackObject.isEmpty() || circuitPackObject.get().getParentCircuitPack() == null) {
+            if (circuitPackObject.isEmpty() || circuitPackObject.orElseThrow().getParentCircuitPack() == null) {
                 continue;
             }
-            cpToInterfaceMap.put(circuitPackObject.get().getParentCircuitPack().getCircuitPackName(),
+            cpToInterfaceMap.put(circuitPackObject.orElseThrow().getParentCircuitPack().getCircuitPackName(),
                 portConfig.getIfName());
         }
         LOG.info(PortMappingUtils.PROCESSING_DONE_LOGMSG, nodeId, " - success");
@@ -588,8 +612,7 @@ public class PortMappingVersion121 {
     }
 
     private MappingBuilder updateMappingInterfaces(String nodeId, MappingBuilder mpBldr, Ports port) {
-        mpBldr.setSupportingOtu4(null)
-            .setSupportingOdu4(null);
+        mpBldr.setSupportingOtu4(null).setSupportingOdu4(null);
         for (Interfaces interfaces : port.getInterfaces()) {
             Optional<Interface> openRoadmInterface = getInterfaceFromDevice(nodeId, interfaces.getInterfaceName());
             if (openRoadmInterface.isEmpty()) {
@@ -597,24 +620,19 @@ public class PortMappingVersion121 {
                     nodeId, interfaces.getInterfaceName() + "- empty interface");
                 continue;
             }
-            LOG.debug(PortMappingUtils.GOT_INTF_LOGMSG,
-                nodeId, openRoadmInterface.get().getName(), openRoadmInterface.get().getType());
-            Class<? extends InterfaceType> interfaceType
-                = (Class<? extends InterfaceType>) openRoadmInterface.get().getType();
-            // Check if interface type is OMS or OTS
-            if (interfaceType.equals(OpenROADMOpticalMultiplex.class)) {
+            InterfaceType interfaceType = openRoadmInterface.orElseThrow().getType();
+            LOG.debug(PortMappingUtils.GOT_INTF_LOGMSG, nodeId, openRoadmInterface.orElseThrow().getName(),
+                    interfaceType);
+            // Switch/Case might be more indicated here but is not possible in jdk17 w/o enable-preview
+            if (interfaceType.equals(OpenROADMOpticalMultiplex.VALUE)) {
                 mpBldr.setSupportingOms(interfaces.getInterfaceName());
-            }
-            if (interfaceType.equals(OpticalTransport.class)) {
+            } else if (interfaceType.equals(OpticalTransport.VALUE)) {
                 mpBldr.setSupportingOts(interfaces.getInterfaceName());
-            }
-            if (interfaceType.equals(OtnOtu.class)) {
+            } else if (interfaceType.equals(OtnOtu.VALUE)) {
                 mpBldr.setSupportingOtu4(interfaces.getInterfaceName());
-            }
-            if (interfaceType.equals(OtnOdu.class)) {
+            } else if (interfaceType.equals(OtnOdu.VALUE)) {
                 mpBldr.setSupportingOdu4(interfaces.getInterfaceName());
-            }
-            if (interfaceType.equals(EthernetCsmacd.class)) {
+            } else if (interfaceType.equals(EthernetCsmacd.VALUE)) {
                 mpBldr.setSupportingEthernet(interfaces.getInterfaceName());
             }
         }
@@ -633,8 +651,8 @@ public class PortMappingVersion121 {
 
     private Mapping createNewXpdrMapping(String nodeId, Ports port, String circuitPackName,
             String logicalConnectionPoint, String partnerLcp) {
-        List<Class<? extends org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211
-            .SupportedIfCapability>> supportedIntf = new ArrayList<>();
+        Set<org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.SupportedIfCapability> supportedIntf =
+            new HashSet<>();
         for (String sup: getSupIfCapList(port)) {
             if (MappingUtilsImpl.convertSupIfCapa(sup) != null) {
                 supportedIntf.add(MappingUtilsImpl.convertSupIfCapa(sup));
@@ -646,7 +664,7 @@ public class PortMappingVersion121 {
                 .setSupportingCircuitPackName(circuitPackName)
                 .setSupportingPort(port.getPortName())
                 .setPortDirection(port.getPortDirection().getName())
-                .setXponderType(XpdrNodeTypes.Tpdr)
+                .setXpdrType(XpdrNodeTypes.Tpdr)
                 .setLcpHashVal(PortMappingUtils.fnv1size64(nodeId + "-" + logicalConnectionPoint))
                 .setSupportedInterfaceCapability(supportedIntf);
         if (port.getPortQual() != null) {
@@ -665,12 +683,12 @@ public class PortMappingVersion121 {
     }
 
     private List<String> getSupIfCapList(Ports port) {
-        List<Class<? extends SupportedIfCapability>> supIfCapClassList = port.getSupportedInterfaceCapability();
+        Set<SupportedIfCapability> supIfCapClassList = port.getSupportedInterfaceCapability();
         return
             supIfCapClassList == null
                 ? Collections.emptyList()
                 : supIfCapClassList
-                    .stream().map(e -> e.getSimpleName())
+                    .stream().map(e -> e.toString())
                     .collect(Collectors.toList());
     }
 
@@ -691,7 +709,7 @@ public class PortMappingVersion121 {
             LOG.error(PortMappingUtils.MISSING_CP_LOGMSG, nodeId, port.getPartnerPort().getCircuitPackName());
             return null;
         }
-        Optional<Ports> poOpt = cpOpt.get().nonnullPorts().values().stream()
+        Optional<Ports> poOpt = cpOpt.orElseThrow().nonnullPorts().values().stream()
             .filter(p -> p.getPortName().equals(port.getPartnerPort().getPortName()))
             .findFirst();
         if (poOpt.isEmpty()) {
@@ -699,8 +717,8 @@ public class PortMappingVersion121 {
                 nodeId, port.getPartnerPort().getPortName(), port.getPartnerPort().getCircuitPackName());
             return null;
         }
-        Ports port2 = poOpt.get();
-        circuitPackName2.append(cpOpt.get().getCircuitPackName());
+        Ports port2 = poOpt.orElseThrow();
+        circuitPackName2.append(cpOpt.orElseThrow().getCircuitPackName());
         if (!checkPartnerPort(circuitPackName, port, port2)) {
             LOG.error(PortMappingUtils.NOT_CORRECT_PARTNERPORT_LOGMSG,
                 nodeId, port2.getPortName(), circuitPackName2, port.getPortName(), circuitPackName);
@@ -876,9 +894,11 @@ public class PortMappingVersion121 {
     }
 
     private Ports getTtpPort(ConnectionPorts cp, String cpName, String nodeId) {
-        InstanceIdentifier<Ports> portID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
+        InstanceIdentifier<Ports> portID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
             .child(CircuitPacks.class, new CircuitPacksKey(cpName))
-            .child(Ports.class, new PortsKey(cp.getPortName()));
+            .child(Ports.class, new PortsKey(cp.getPortName()))
+            .build();
         LOG.debug(PortMappingUtils.FETCH_CONNECTIONPORT_LOGMSG, nodeId, cp.getPortName(), cpName);
         Optional<Ports> portObject = this.deviceTransactionManager.getDataFromDevice(nodeId,
             LogicalDatastoreType.OPERATIONAL, portID, Timeouts.DEVICE_READ_TIMEOUT,
@@ -887,7 +907,7 @@ public class PortMappingVersion121 {
             LOG.error(PortMappingUtils.NO_PORT_ON_CP_LOGMSG, nodeId, cp.getPortName(), cpName);
             return null;
         }
-        return portObject.get();
+        return portObject.orElseThrow();
     }
 
     private boolean checkPortQual(Ports port, String cpName, String nodeId) {
@@ -972,8 +992,10 @@ public class PortMappingVersion121 {
     }
 
     private Optional<Interface> getInterfaceFromDevice(String nodeId, String interfaceName) {
-        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-            .child(Interface.class, new InterfaceKey(interfaceName));
+        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Interface.class, new InterfaceKey(interfaceName))
+            .build();
         return deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.CONFIGURATION,
             interfacesIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
     }
index 1160a9ad808aabea270bc51b9811dc21bd74723f..6587d99834ba5d437d6f03d3257b6880ead86ce1 100644 (file)
@@ -9,10 +9,12 @@
 package org.opendaylight.transportpce.common.mapping;
 
 import com.google.common.util.concurrent.FluentFuture;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -29,34 +31,35 @@ import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.transportpce.common.Timeouts;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.NetworkBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.OpenroadmNodeVersion;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.cp.to.degree.CpToDegree;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.cp.to.degree.CpToDegreeBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.cp.to.degree.CpToDegreeKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mc.capabilities.McCapabilities;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mc.capabilities.McCapabilitiesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mc.capabilities.McCapabilitiesKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfo;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfoBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.switching.pool.lcp.SwitchingPoolLcp;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.switching.pool.lcp.SwitchingPoolLcpBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.switching.pool.lcp.SwitchingPoolLcpKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.switching.pool.lcp.switching.pool.lcp.NonBlockingList;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.switching.pool.lcp.switching.pool.lcp.NonBlockingListBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.switching.pool.lcp.switching.pool.lcp.NonBlockingListKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.Network;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.NetworkBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.OpenroadmNodeVersion;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.cp.to.degree.CpToDegree;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.cp.to.degree.CpToDegreeBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.cp.to.degree.CpToDegreeKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mc.capabilities.McCapabilities;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mc.capabilities.McCapabilitiesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mc.capabilities.McCapabilitiesKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfo;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfoBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.switching.pool.lcp.SwitchingPoolLcp;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.switching.pool.lcp.SwitchingPoolLcpBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.switching.pool.lcp.SwitchingPoolLcpKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.switching.pool.lcp.switching.pool.lcp.NonBlockingList;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.switching.pool.lcp.switching.pool.lcp.NonBlockingListBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.switching.pool.lcp.switching.pool.lcp.NonBlockingListKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.FrequencyGHz;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.Direction;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.PortQual;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.XpdrNodeTypes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.CircuitPack;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.circuit.pack.Ports;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.circuit.pack.PortsKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.circuit.packs.CircuitPacks;
@@ -124,7 +127,10 @@ public class PortMappingVersion221 {
         LOG.info(PortMappingUtils.CREATE_MAPPING_DATA_LOGMSG, nodeId, "2.2.1");
         List<Mapping> portMapList = new ArrayList<>();
         Map<McCapabilitiesKey, McCapabilities> mcCapabilities = new HashMap<>();
-        InstanceIdentifier<Info> infoIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Info.class);
+        InstanceIdentifier<Info> infoIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Info.class)
+            .build();
         Optional<Info> deviceInfoOptional = this.deviceTransactionManager.getDataFromDevice(
                 nodeId, LogicalDatastoreType.OPERATIONAL, infoIID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -132,7 +138,7 @@ public class PortMappingVersion221 {
             LOG.warn(PortMappingUtils.DEVICE_HAS_LOGMSG, nodeId, "no info", "subtree");
             return false;
         }
-        Info deviceInfo = deviceInfoOptional.get();
+        Info deviceInfo = deviceInfoOptional.orElseThrow();
         NodeInfo nodeInfo = createNodeInfo(deviceInfo);
         if (nodeInfo == null) {
             return false;
@@ -186,13 +192,39 @@ public class PortMappingVersion221 {
             LOG.error(PortMappingUtils.UNABLE_MAPPING_LOGMSG, nodeId, PortMappingUtils.UPDATE, "a null value");
             return false;
         }
-        InstanceIdentifier<Ports> portId = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(CircuitPacks.class, new CircuitPacksKey(oldMapping.getSupportingCircuitPackName()))
-                .child(Ports.class, new PortsKey(oldMapping.getSupportingPort()));
         try {
-            Ports port = deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL,
-                portId, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT).get();
-            Mapping newMapping = updateMappingObject(nodeId, port, oldMapping);
+            Mapping newMapping = updateMappingObject(
+                nodeId,
+                //port
+                deviceTransactionManager
+                    .getDataFromDevice(
+                        nodeId,
+                        LogicalDatastoreType.OPERATIONAL,
+                        // port Identifier
+                        InstanceIdentifier
+                            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                            .child(CircuitPacks.class, new CircuitPacksKey(oldMapping.getSupportingCircuitPackName()))
+                            .child(Ports.class, new PortsKey(oldMapping.getSupportingPort()))
+                            .build(),
+                        Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT)
+                    .orElseThrow(),
+                oldMapping,
+                //otsInterface
+                oldMapping.getSupportingOts() == null
+                    ? null
+                    : deviceTransactionManager
+                        .getDataFromDevice(
+                            nodeId,
+                            LogicalDatastoreType.OPERATIONAL,
+                            //interface Identifier
+                            InstanceIdentifier
+                                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                                .child(Interface.class, new InterfaceKey(oldMapping.getSupportingOts()))
+                                .build(),
+                            Timeouts.DEVICE_READ_TIMEOUT,
+                            Timeouts.DEVICE_READ_TIMEOUT_UNIT)
+                        .orElseThrow()
+                );
             LOG.debug(PortMappingUtils.UPDATE_MAPPING_LOGMSG,
                 nodeId, oldMapping, oldMapping.getLogicalConnectionPoint(), newMapping);
             final WriteTransaction writeTransaction = this.dataBroker.newWriteOnlyTransaction();
@@ -247,7 +279,9 @@ public class PortMappingVersion221 {
     }
 
     private OrgOpenroadmDevice getXpdrDevice(String nodeId) {
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject = deviceTransactionManager.getDataFromDevice(nodeId,
             LogicalDatastoreType.OPERATIONAL, deviceIID,
             Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -255,7 +289,7 @@ public class PortMappingVersion221 {
             LOG.error(PortMappingUtils.CANNOT_GET_DEV_CONF_LOGMSG, nodeId);
             return null;
         }
-        OrgOpenroadmDevice device = deviceObject.get();
+        OrgOpenroadmDevice device = deviceObject.orElseThrow();
         if (device.getCircuitPacks() == null) {
             LOG.warn(PortMappingUtils.MISSING_CP_LOGMSG, nodeId, PortMappingUtils.FOUND);
             return null;
@@ -326,14 +360,14 @@ public class PortMappingVersion221 {
                 nodeId, circuitPackName);
             return null;
         }
-        Optional<Ports> portsList = cpList.get().nonnullPorts().values().stream()
+        Optional<Ports> portsList = cpList.orElseThrow().nonnullPorts().values().stream()
                 .filter(p -> p.getPortName().equals(portName)).findFirst();
         if (portsList.isEmpty()) {
             LOG.warn(PortMappingUtils.NO_ASSOC_FOUND_LOGMSG + PortMappingUtils.PORTMAPPING_IGNORE_LOGMSG,
                 nodeId, portName, circuitPackName, "in the device");
             return null;
         }
-        return portsList.get();
+        return portsList.orElseThrow();
     }
 
     private List<SwitchingPoolLcp> getSwitchingPoolList(OrgOpenroadmDevice device,
@@ -346,7 +380,7 @@ public class PortMappingVersion221 {
                 if (nbl.getPortList() == null) {
                     continue;
                 }
-                List<String> lcpList = new ArrayList<>();
+                Set<String> lcpList = new HashSet<>();
                 for (PortList item : nbl.nonnullPortList().values()) {
                     String key = item.getCircuitPackName() + "+" + item.getPortName();
                     if (!lcpMap.containsKey(key)) {
@@ -404,14 +438,16 @@ public class PortMappingVersion221 {
             List<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.srg.CircuitPacks> srgCps
                 = new ArrayList<>();
             LOG.debug(PortMappingUtils.GETTING_CP_LOGMSG, deviceId, srgCounter);
-            InstanceIdentifier<SharedRiskGroup> srgIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(SharedRiskGroup.class, new SharedRiskGroupKey(Uint16.valueOf(srgCounter)));
+            InstanceIdentifier<SharedRiskGroup> srgIID = InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(SharedRiskGroup.class, new SharedRiskGroupKey(Uint16.valueOf(srgCounter)))
+                .build();
             Optional<SharedRiskGroup> ordmSrgObject = this.deviceTransactionManager.getDataFromDevice(deviceId,
                 LogicalDatastoreType.OPERATIONAL, srgIID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
             if (ordmSrgObject.isPresent()) {
-                srgCps.addAll(ordmSrgObject.get().nonnullCircuitPacks().values());
-                cpPerSrg.put(ordmSrgObject.get().getSrgNumber().toJava(), srgCps);
+                srgCps.addAll(ordmSrgObject.orElseThrow().nonnullCircuitPacks().values());
+                cpPerSrg.put(ordmSrgObject.orElseThrow().getSrgNumber().toJava(), srgCps);
             }
         }
         LOG.info(PortMappingUtils.DEVICE_HAS_LOGMSG, deviceId, cpPerSrg.size(), "SRG");
@@ -483,20 +519,22 @@ public class PortMappingVersion221 {
                 nodeId, port.getPortName(), circuitPackName);
             return null;
         }
-        InstanceIdentifier<Ports> port2ID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
+        InstanceIdentifier<Ports> port2ID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
             .child(CircuitPacks.class, new CircuitPacksKey(port.getPartnerPort().getCircuitPackName()))
-            .child(Ports.class, new PortsKey(port.getPartnerPort().getPortName()));
+            .child(Ports.class, new PortsKey(port.getPartnerPort().getPortName()))
+            .build();
         Optional<Ports> port2Object = this.deviceTransactionManager
             .getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, port2ID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
         if (port2Object.isEmpty()
-                || port2Object.get().getPortQual().getIntValue() != PortQual.RoadmExternal.getIntValue()) {
+                || port2Object.orElseThrow().getPortQual().getIntValue() != PortQual.RoadmExternal.getIntValue()) {
             LOG.error(PortMappingUtils.NOT_CORRECT_PARTNERPORT_LOGMSG + PortMappingUtils.PARTNERPORT_GET_ERROR_LOGMSG,
                 nodeId, port.getPartnerPort().getPortName(), port.getPartnerPort().getCircuitPackName(),
                 port.getPortName(), circuitPackName);
             return null;
         }
-        Ports port2 = port2Object.get();
+        Ports port2 = port2Object.orElseThrow();
         if (!checkPartnerPort(circuitPackName, port, port2)) {
             LOG.error(PortMappingUtils.NOT_CORRECT_PARTNERPORT_LOGMSG + PortMappingUtils.PARTNERPORT_CONF_ERROR_LOGMSG,
                 nodeId, port2.getPortName(), port.getPartnerPort().getCircuitPackName(),
@@ -509,8 +547,10 @@ public class PortMappingVersion221 {
     }
 
     private List<Ports> getPortList(String circuitPackName, String nodeId) {
-        InstanceIdentifier<CircuitPacks> cpIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-            .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName));
+        InstanceIdentifier<CircuitPacks> cpIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName))
+            .build();
         Optional<CircuitPacks> circuitPackObject = this.deviceTransactionManager.getDataFromDevice(nodeId,
              LogicalDatastoreType.OPERATIONAL, cpIID,
              Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -519,11 +559,11 @@ public class PortMappingVersion221 {
                 nodeId, circuitPackName);
             return new ArrayList<>();
         }
-        if (circuitPackObject.get().getPorts() == null) {
+        if (circuitPackObject.orElseThrow().getPorts() == null) {
             LOG.warn(PortMappingUtils.NO_PORT_ON_CP_LOGMSG, nodeId, PortMappingUtils.FOUND, circuitPackName);
             return new ArrayList<>();
         }
-        return new ArrayList<>(circuitPackObject.get().nonnullPorts().values());
+        return new ArrayList<>(circuitPackObject.orElseThrow().nonnullPorts().values());
     }
 
     private String createLogicalConnectionPort(Ports port, int index, int portIndex) {
@@ -535,6 +575,9 @@ public class PortMappingVersion221 {
         return null;
     }
 
+    @SuppressFBWarnings(
+        value = "SLF4J_UNKNOWN_ARRAY",
+        justification = "False positive")
     private Map<Integer, Degree> getDegreesMap(String deviceId, Info ordmInfo) {
         Map<Integer, Degree> degrees = new HashMap<>();
 
@@ -544,13 +587,15 @@ public class PortMappingVersion221 {
 
         for (int degreeCounter = 1; degreeCounter <= maxDegree; degreeCounter++) {
             LOG.debug(PortMappingUtils.GETTING_CONPORT_LOGMSG, deviceId, degreeCounter);
-            InstanceIdentifier<Degree> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(Degree.class, new DegreeKey(Uint16.valueOf(degreeCounter)));
+            InstanceIdentifier<Degree> deviceIID = InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(Degree.class, new DegreeKey(Uint16.valueOf(degreeCounter)))
+                .build();
             Optional<Degree> ordmDegreeObject = this.deviceTransactionManager.getDataFromDevice(deviceId,
                 LogicalDatastoreType.OPERATIONAL, deviceIID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
             if (ordmDegreeObject.isPresent()) {
-                degrees.put(degreeCounter, ordmDegreeObject.get());
+                degrees.put(degreeCounter, ordmDegreeObject.orElseThrow());
             }
         }
         LOG.info(PortMappingUtils.DEVICE_HAS_LOGMSG,
@@ -572,13 +617,15 @@ public class PortMappingVersion221 {
         // if not present assume to be 20 (temporary)
         Integer maxSrg = ordmInfo.getMaxSrgs() == null ? 20 : ordmInfo.getMaxSrgs().toJava();
         for (int srgCounter = 1; srgCounter <= maxSrg; srgCounter++) {
-            InstanceIdentifier<SharedRiskGroup> srgIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(SharedRiskGroup.class, new SharedRiskGroupKey(Uint16.valueOf(srgCounter)));
+            InstanceIdentifier<SharedRiskGroup> srgIID = InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(SharedRiskGroup.class, new SharedRiskGroupKey(Uint16.valueOf(srgCounter)))
+                .build();
             Optional<SharedRiskGroup> ordmSrgObject = this.deviceTransactionManager.getDataFromDevice(deviceId,
                 LogicalDatastoreType.OPERATIONAL, srgIID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
             if (ordmSrgObject.isPresent()) {
-                srgs.add(ordmSrgObject.get());
+                srgs.add(ordmSrgObject.orElseThrow());
 
             }
         }
@@ -587,40 +634,46 @@ public class PortMappingVersion221 {
 
     private Map<String, String> getEthInterfaceList(String nodeId) {
         LOG.info(PortMappingUtils.GETTING_ETH_LIST_LOGMSG, nodeId);
-        InstanceIdentifier<Protocols> protocoliid = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-            .child(Protocols.class);
+        InstanceIdentifier<Protocols> protocoliid = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Protocols.class)
+            .build();
         Optional<Protocols> protocolObject = this.deviceTransactionManager.getDataFromDevice(nodeId,
             LogicalDatastoreType.OPERATIONAL, protocoliid, Timeouts.DEVICE_READ_TIMEOUT,
             Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-        if (protocolObject.isEmpty() || protocolObject.get().augmentation(Protocols1.class).getLldp() == null) {
+        if (protocolObject.isEmpty() || protocolObject.orElseThrow().augmentation(Protocols1.class).getLldp() == null) {
             LOG.warn(PortMappingUtils.PROCESSING_DONE_LOGMSG, nodeId, PortMappingUtils.CANNOT_GET_LLDP_CONF_LOGMSG);
             return new HashMap<>();
         }
         Map<String, String> cpToInterfaceMap = new HashMap<>();
-        Lldp lldp = protocolObject.get().augmentation(Protocols1.class).getLldp();
+        Lldp lldp = protocolObject.orElseThrow().augmentation(Protocols1.class).getLldp();
         for (PortConfig portConfig : lldp.nonnullPortConfig().values()) {
             if (!portConfig.getAdminStatus().equals(PortConfig.AdminStatus.Txandrx)) {
                 continue;
             }
-            InstanceIdentifier<Interface> interfaceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(Interface.class, new InterfaceKey(portConfig.getIfName()));
+            InstanceIdentifier<Interface> interfaceIID = InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(Interface.class, new InterfaceKey(portConfig.getIfName()))
+                .build();
             Optional<Interface> interfaceObject = this.deviceTransactionManager.getDataFromDevice(nodeId,
                 LogicalDatastoreType.OPERATIONAL, interfaceIID, Timeouts.DEVICE_READ_TIMEOUT,
                 Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-            if (interfaceObject.isEmpty() || interfaceObject.get().getSupportingCircuitPackName() == null) {
+            if (interfaceObject.isEmpty() || interfaceObject.orElseThrow().getSupportingCircuitPackName() == null) {
                 continue;
             }
-            String supportingCircuitPackName = interfaceObject.get().getSupportingCircuitPackName();
+            String supportingCircuitPackName = interfaceObject.orElseThrow().getSupportingCircuitPackName();
             cpToInterfaceMap.put(supportingCircuitPackName, portConfig.getIfName());
-            InstanceIdentifier<CircuitPacks> circuitPacksIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(CircuitPacks.class, new CircuitPacksKey(supportingCircuitPackName));
+            InstanceIdentifier<CircuitPacks> circuitPacksIID = InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(CircuitPacks.class, new CircuitPacksKey(supportingCircuitPackName))
+                .build();
             Optional<CircuitPacks> circuitPackObject = this.deviceTransactionManager.getDataFromDevice(
                 nodeId, LogicalDatastoreType.OPERATIONAL, circuitPacksIID, Timeouts.DEVICE_READ_TIMEOUT,
                 Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-            if (circuitPackObject.isEmpty() || circuitPackObject.get().getParentCircuitPack() == null) {
+            if (circuitPackObject.isEmpty() || circuitPackObject.orElseThrow().getParentCircuitPack() == null) {
                 continue;
             }
-            cpToInterfaceMap.put(circuitPackObject.get().getParentCircuitPack().getCircuitPackName(),
+            cpToInterfaceMap.put(circuitPackObject.orElseThrow().getParentCircuitPack().getCircuitPackName(),
                 portConfig.getIfName());
         }
         LOG.info(PortMappingUtils.PROCESSING_DONE_LOGMSG, nodeId, " - success");
@@ -777,9 +830,9 @@ public class PortMappingVersion221 {
         return mpBldr.build();
     }
 
-    private Mapping updateMappingObject(String nodeId, Ports port, Mapping oldmapping) {
+    private Mapping updateMappingObject(String nodeId, Ports port, Mapping oldmapping, Interface otsInterf) {
         MappingBuilder mpBldr = new MappingBuilder(oldmapping);
-        updateMappingStates(mpBldr, port, oldmapping);
+        updateMappingStates(mpBldr, port, oldmapping, otsInterf);
         if (port.getInterfaces() == null) {
             return mpBldr.build();
         }
@@ -788,21 +841,25 @@ public class PortMappingVersion221 {
         return mpBldr.build();
     }
 
-    private MappingBuilder updateMappingStates(MappingBuilder mpBldr, Ports port, Mapping oldmapping) {
+    private MappingBuilder updateMappingStates(MappingBuilder mpBldr, Ports port, Mapping oldmapping,
+            Interface otsInterf) {
         if (port.getAdministrativeState() != null
-            && !port.getAdministrativeState().getName().equals(oldmapping.getPortAdminState())) {
+                && !port.getAdministrativeState().getName().equals(oldmapping.getPortAdminState())) {
             mpBldr.setPortAdminState(port.getAdministrativeState().name());
         }
         if (port.getOperationalState() != null
-            && !port.getOperationalState().getName().equals(oldmapping.getPortOperState())) {
+                && !port.getOperationalState().getName().equals(oldmapping.getPortOperState())) {
             mpBldr.setPortOperState(port.getOperationalState().name());
         }
+        if (otsInterf != null && otsInterf.getOperationalState() != null
+                && !otsInterf.getOperationalState().name().equals(oldmapping.getPortOperState())) {
+            mpBldr.setPortOperState(otsInterf.getOperationalState().name());
+        }
         return mpBldr;
     }
 
     private MappingBuilder updateMappingInterfaces(String nodeId, MappingBuilder mpBldr, Ports port) {
-        mpBldr.setSupportingOtu4(null)
-            .setSupportingOdu4(null);
+        mpBldr.setSupportingOtu4(null).setSupportingOdu4(null);
         for (Interfaces interfaces : port.getInterfaces()) {
             Optional<Interface> openRoadmInterface = getInterfaceFromDevice(nodeId,
                 interfaces.getInterfaceName());
@@ -811,24 +868,20 @@ public class PortMappingVersion221 {
                     nodeId, interfaces.getInterfaceName() + "- empty interface");
                 continue;
             }
-            LOG.debug(PortMappingUtils.GOT_INTF_LOGMSG,
-                nodeId, openRoadmInterface.get().getName(), openRoadmInterface.get().getType());
-            Class<? extends InterfaceType> interfaceType
-                = (Class<? extends InterfaceType>) openRoadmInterface.get().getType();
+            InterfaceType interfaceType = openRoadmInterface.orElseThrow().getType();
+            LOG.debug(PortMappingUtils.GOT_INTF_LOGMSG, nodeId, openRoadmInterface.orElseThrow().getName(),
+                    interfaceType);
             // Check if interface type is OMS or OTS
-            if (interfaceType.equals(OpenROADMOpticalMultiplex.class)) {
+            // Switch/Case might be more indicated here but is not possible in jdk17 w/o enable-preview
+            if (interfaceType.equals(OpenROADMOpticalMultiplex.VALUE)) {
                 mpBldr.setSupportingOms(interfaces.getInterfaceName());
-            }
-            if (interfaceType.equals(OpticalTransport.class)) {
+            } else if (interfaceType.equals(OpticalTransport.VALUE)) {
                 mpBldr.setSupportingOts(interfaces.getInterfaceName());
-            }
-            if (interfaceType.equals(OtnOtu.class)) {
+            } else if (interfaceType.equals(OtnOtu.VALUE)) {
                 mpBldr.setSupportingOtu4(interfaces.getInterfaceName());
-            }
-            if (interfaceType.equals(OtnOdu.class)) {
+            } else if (interfaceType.equals(OtnOdu.VALUE)) {
                 mpBldr.setSupportingOdu4(interfaces.getInterfaceName());
-            }
-            if (interfaceType.equals(EthernetCsmacd.class)) {
+            } else if (interfaceType.equals(EthernetCsmacd.VALUE)) {
                 mpBldr.setSupportingEthernet(interfaces.getInterfaceName());
             }
         }
@@ -847,8 +900,8 @@ public class PortMappingVersion221 {
 
     private Mapping createNewXpdrMapping(String nodeId, Ports port, String circuitPackName,
             String logicalConnectionPoint, String partnerLcp, XpdrNodeTypes xpdrNodeType) {
-        List<Class<? extends org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211
-            .SupportedIfCapability>> supportedIntf = new ArrayList<>();
+        Set<org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.SupportedIfCapability> supportedIntf =
+            new HashSet<>();
         for (String sup: getSupIfCapList(port)) {
             if (MappingUtilsImpl.convertSupIfCapa(sup) != null) {
                 supportedIntf.add(MappingUtilsImpl.convertSupIfCapa(sup));
@@ -866,7 +919,7 @@ public class PortMappingVersion221 {
             mpBldr.setPortQual(port.getPortQual().getName());
         }
         if (xpdrNodeType != null) {
-            mpBldr.setXponderType(
+            mpBldr.setXpdrType(
                 org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.XpdrNodeTypes.forValue(
                     xpdrNodeType.getIntValue()));
         }
@@ -883,16 +936,16 @@ public class PortMappingVersion221 {
     }
 
     private List<String> getSupIfCapList(Ports port) {
-        List<Class<? extends SupportedIfCapability>> supIfCapClassList = port.getSupportedInterfaceCapability();
+        Set<SupportedIfCapability> supIfCapClassList = port.getSupportedInterfaceCapability();
         if (supIfCapClassList != null) {
             return supIfCapClassList
-                    .stream().map(e -> e.getSimpleName())
+                    .stream().map(e -> e.toString())
                     .collect(Collectors.toList());
         }
         Ports1 ports1 = port.augmentation(Ports1.class);
         if (ports1 != null && ports1.getPortCapabilities() != null) {
             return ports1.getPortCapabilities().getSupportedInterfaceCapability()
-                    .values().stream().map(e -> e.getIfCapType().getSimpleName())
+                    .values().stream().map(e -> e.getIfCapType().toString())
                     .collect(Collectors.toList());
         }
         return Collections.emptyList();
@@ -916,7 +969,7 @@ public class PortMappingVersion221 {
             LOG.error(PortMappingUtils.MISSING_CP_LOGMSG, nodeId, port.getPartnerPort().getCircuitPackName());
             return null;
         }
-        Optional<Ports> poOpt = cpOpt.get().nonnullPorts().values().stream()
+        Optional<Ports> poOpt = cpOpt.orElseThrow().nonnullPorts().values().stream()
             .filter(p -> p.getPortName().equals(port.getPartnerPort().getPortName()))
             .findFirst();
         if (poOpt.isEmpty()) {
@@ -924,8 +977,8 @@ public class PortMappingVersion221 {
                 nodeId, port.getPartnerPort().getPortName(), port.getPartnerPort().getCircuitPackName());
             return null;
         }
-        Ports port2 = poOpt.get();
-        circuitPackName2.append(cpOpt.get().getCircuitPackName());
+        Ports port2 = poOpt.orElseThrow();
+        circuitPackName2.append(cpOpt.orElseThrow().getCircuitPackName());
         if (!checkPartnerPort(circuitPackName, port, port2)) {
             LOG.error(PortMappingUtils.NOT_CORRECT_PARTNERPORT_LOGMSG,
                 nodeId, port2.getPortName(), circuitPackName2, port.getPortName(), circuitPackName);
@@ -1109,9 +1162,11 @@ public class PortMappingVersion221 {
     }
 
     private Ports getTtpPort(ConnectionPorts cp, String cpName, String nodeId) {
-        InstanceIdentifier<Ports> portID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
+        InstanceIdentifier<Ports> portID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
             .child(CircuitPacks.class, new CircuitPacksKey(cpName))
-            .child(Ports.class, new PortsKey(cp.getPortName()));
+            .child(Ports.class, new PortsKey(cp.getPortName()))
+            .build();
         LOG.debug(PortMappingUtils.FETCH_CONNECTIONPORT_LOGMSG, nodeId, cp.getPortName(), cpName);
         Optional<Ports> portObject = this.deviceTransactionManager.getDataFromDevice(nodeId,
             LogicalDatastoreType.OPERATIONAL, portID, Timeouts.DEVICE_READ_TIMEOUT,
@@ -1120,7 +1175,7 @@ public class PortMappingVersion221 {
             LOG.error(PortMappingUtils.NO_PORT_ON_CP_LOGMSG, nodeId, cp.getPortName(), cpName);
             return null;
         }
-        return portObject.get();
+        return portObject.orElseThrow();
     }
 
     private boolean checkPortQual(Ports port, String cpName, String nodeId) {
@@ -1196,8 +1251,10 @@ public class PortMappingVersion221 {
     }
 
     private Optional<Interface> getInterfaceFromDevice(String nodeId, String interfaceName) {
-        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-            .child(Interface.class, new InterfaceKey(interfaceName));
+        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Interface.class, new InterfaceKey(interfaceName))
+            .build();
         return deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.CONFIGURATION,
             interfacesIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
     }
index 207d0bad6c6a122aa8fa44090a31b9e1f8476ca8..c632c734e8bd2fa54586175945d7fa902339b061 100644 (file)
@@ -9,11 +9,13 @@
 package org.opendaylight.transportpce.common.mapping;
 
 import com.google.common.util.concurrent.FluentFuture;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
@@ -31,33 +33,35 @@ import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.transportpce.common.Timeouts;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.NetworkBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.OpenroadmNodeVersion;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.cp.to.degree.CpToDegree;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.cp.to.degree.CpToDegreeBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.cp.to.degree.CpToDegreeKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mc.capabilities.McCapabilities;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mc.capabilities.McCapabilitiesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mc.capabilities.McCapabilitiesKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mpdr.restrictions.grp.MpdrRestrictionsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfo;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfoBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.switching.pool.lcp.SwitchingPoolLcp;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.switching.pool.lcp.SwitchingPoolLcpBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.switching.pool.lcp.SwitchingPoolLcpKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.switching.pool.lcp.switching.pool.lcp.NonBlockingList;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.switching.pool.lcp.switching.pool.lcp.NonBlockingListBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.switching.pool.lcp.switching.pool.lcp.NonBlockingListKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.Network;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.NetworkBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.OpenroadmNodeVersion;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.cp.to.degree.CpToDegree;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.cp.to.degree.CpToDegreeBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.cp.to.degree.CpToDegreeKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mc.capabilities.McCapabilities;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mc.capabilities.McCapabilitiesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mc.capabilities.McCapabilitiesKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mpdr.restrictions.grp.MpdrRestrictionsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfo;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfoBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.regen.profiles.grp.RegenProfilesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.switching.pool.lcp.SwitchingPoolLcp;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.switching.pool.lcp.SwitchingPoolLcpBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.switching.pool.lcp.SwitchingPoolLcpKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.switching.pool.lcp.switching.pool.lcp.NonBlockingList;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.switching.pool.lcp.switching.pool.lcp.NonBlockingListBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.switching.pool.lcp.switching.pool.lcp.NonBlockingListKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.alarm.pm.types.rev191129.Direction;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.FrequencyGHz;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.CircuitPack;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.circuit.pack.Ports;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.circuit.pack.PortsKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.circuit.packs.CircuitPacks;
@@ -133,7 +137,10 @@ public class PortMappingVersion710 {
         LOG.info(PortMappingUtils.CREATE_MAPPING_DATA_LOGMSG, nodeId, "7.1");
         List<Mapping> portMapList = new ArrayList<>();
         Map<McCapabilitiesKey, McCapabilities> mcCapabilities = new HashMap<>();
-        InstanceIdentifier<Info> infoIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Info.class);
+        InstanceIdentifier<Info> infoIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Info.class)
+            .build();
         Optional<Info> deviceInfoOptional = this.deviceTransactionManager.getDataFromDevice(
                 nodeId, LogicalDatastoreType.OPERATIONAL, infoIID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -141,7 +148,7 @@ public class PortMappingVersion710 {
             LOG.warn(PortMappingUtils.DEVICE_HAS_LOGMSG, nodeId, "no info", "subtree");
             return false;
         }
-        Info deviceInfo = deviceInfoOptional.get();
+        Info deviceInfo = deviceInfoOptional.orElseThrow();
         NodeInfo nodeInfo = createNodeInfo(deviceInfo);
         if (nodeInfo == null) {
             return false;
@@ -203,12 +210,14 @@ public class PortMappingVersion710 {
             LOG.error(PortMappingUtils.UNABLE_MAPPING_LOGMSG, nodeId, PortMappingUtils.UPDATE, "a null value");
             return false;
         }
-        InstanceIdentifier<Ports> portId = InstanceIdentifier.create(OrgOpenroadmDevice.class)
+        InstanceIdentifier<Ports> portId = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
             .child(CircuitPacks.class, new CircuitPacksKey(oldMapping.getSupportingCircuitPackName()))
-            .child(Ports.class, new PortsKey(oldMapping.getSupportingPort()));
+            .child(Ports.class, new PortsKey(oldMapping.getSupportingPort()))
+            .build();
         try {
             Ports port = deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL,
-                portId, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT).get();
+                portId, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT).orElseThrow();
             Mapping newMapping = updateMappingObject(nodeId, port, oldMapping);
             LOG.debug(PortMappingUtils.UPDATE_MAPPING_LOGMSG,
                 nodeId, oldMapping, oldMapping.getLogicalConnectionPoint(), newMapping);
@@ -234,7 +243,7 @@ public class PortMappingVersion710 {
             InstanceIdentifier.create(Network.class).child(Nodes.class, new NodesKey(nodeId));
         Nodes portmappingNode = null;
         try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
-            portmappingNode = readTx.read(LogicalDatastoreType.CONFIGURATION, portMappingNodeIID).get().get();
+            portmappingNode = readTx.read(LogicalDatastoreType.CONFIGURATION, portMappingNodeIID).get().orElseThrow();
         } catch (InterruptedException | ExecutionException ex) {
             LOG.error("Unable to read the port-mapping for nodeId {}", nodeId, ex);
         }
@@ -243,7 +252,7 @@ public class PortMappingVersion710 {
         }
 
         OduSwitchingPools osp = deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL,
-            ospIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT).get();
+            ospIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT).orElseThrow();
         Uint16 ospNumber = osp.getSwitchingPoolNumber();
         Map<SwitchingPoolLcpKey, SwitchingPoolLcp> splMap =
             new HashMap<SwitchingPoolLcpKey, SwitchingPoolLcp>(portmappingNode.nonnullSwitchingPoolLcp());
@@ -280,10 +289,10 @@ public class PortMappingVersion710 {
             || !splBldr.getNonBlockingList().containsKey(new NonBlockingListKey(entry.getKey()))
                 ? new NonBlockingListBuilder().setNblNumber(entry.getKey()).setInterconnectBandwidth(interconnectBw)
                 : new NonBlockingListBuilder(splBldr.getNonBlockingList().get(new NonBlockingListKey(entry.getKey())));
-        List<String> lcpList = nblBldr.getLcpList() != null ? nblBldr.getLcpList() : new ArrayList<>();
+        Set<String> lcpList = nblBldr.getLcpList() != null ? nblBldr.getLcpList() : new HashSet<>();
         for (InstanceIdentifier<PortList> id : entry.getValue()) {
             PortList portList = deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL,
-                id, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT).get();
+                id, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT).orElseThrow();
             String lcp = getLcpFromCpAndPort(mappings, portList.getCircuitPackName(), portList.getPortName());
             if (lcp == null || lcpList.contains(lcp)) {
                 return null;
@@ -330,7 +339,9 @@ public class PortMappingVersion710 {
     }
 
     private OrgOpenroadmDevice getXpdrDevice(String nodeId) {
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject = deviceTransactionManager.getDataFromDevice(nodeId,
             LogicalDatastoreType.OPERATIONAL, deviceIID,
             Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -338,7 +349,7 @@ public class PortMappingVersion710 {
             LOG.error(PortMappingUtils.CANNOT_GET_DEV_CONF_LOGMSG, nodeId);
             return null;
         }
-        OrgOpenroadmDevice device = deviceObject.get();
+        OrgOpenroadmDevice device = deviceObject.orElseThrow();
         if (device.getCircuitPacks() == null) {
             LOG.warn(PortMappingUtils.MISSING_CP_LOGMSG, nodeId, PortMappingUtils.FOUND);
             return null;
@@ -409,14 +420,14 @@ public class PortMappingVersion710 {
                 nodeId, circuitPackName);
             return null;
         }
-        Optional<Ports> portsList = cpList.get().nonnullPorts().values().stream()
+        Optional<Ports> portsList = cpList.orElseThrow().nonnullPorts().values().stream()
                 .filter(p -> p.getPortName().equals(portName)).findFirst();
         if (portsList.isEmpty()) {
             LOG.warn(PortMappingUtils.NO_ASSOC_FOUND_LOGMSG + PortMappingUtils.PORTMAPPING_IGNORE_LOGMSG,
                 nodeId, portName, circuitPackName, "in the device");
             return null;
         }
-        return portsList.get();
+        return portsList.orElseThrow();
     }
 
     private List<SwitchingPoolLcp> getSwitchingPoolList(OrgOpenroadmDevice device,
@@ -429,7 +440,7 @@ public class PortMappingVersion710 {
                 if (nbl.getPortList() == null) {
                     continue;
                 }
-                List<String> lcpList = new ArrayList<>();
+                Set<String> lcpList = new HashSet<>();
                 for (PortList item : nbl.nonnullPortList().values()) {
                     String key = item.getCircuitPackName() + "+" + item.getPortName();
                     if (!lcpMap.containsKey(key)) {
@@ -488,14 +499,16 @@ public class PortMappingVersion710 {
             List<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.srg.CircuitPacks> srgCps
                 = new ArrayList<>();
             LOG.debug(PortMappingUtils.GETTING_CP_LOGMSG, deviceId, srgCounter);
-            InstanceIdentifier<SharedRiskGroup> srgIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(SharedRiskGroup.class, new SharedRiskGroupKey(Uint16.valueOf(srgCounter)));
+            InstanceIdentifier<SharedRiskGroup> srgIID = InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(SharedRiskGroup.class, new SharedRiskGroupKey(Uint16.valueOf(srgCounter)))
+                .build();
             Optional<SharedRiskGroup> ordmSrgObject = this.deviceTransactionManager.getDataFromDevice(deviceId,
                 LogicalDatastoreType.OPERATIONAL, srgIID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
             if (ordmSrgObject.isPresent()) {
-                srgCps.addAll(ordmSrgObject.get().nonnullCircuitPacks().values());
-                cpPerSrg.put(ordmSrgObject.get().getSrgNumber().toJava(), srgCps);
+                srgCps.addAll(ordmSrgObject.orElseThrow().nonnullCircuitPacks().values());
+                cpPerSrg.put(ordmSrgObject.orElseThrow().getSrgNumber().toJava(), srgCps);
             }
         }
         LOG.info(PortMappingUtils.DEVICE_HAS_LOGMSG, deviceId, cpPerSrg.size(), "SRG");
@@ -567,20 +580,22 @@ public class PortMappingVersion710 {
                 nodeId, port.getPortName(), circuitPackName);
             return null;
         }
-        InstanceIdentifier<Ports> port2ID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
+        InstanceIdentifier<Ports> port2ID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
             .child(CircuitPacks.class, new CircuitPacksKey(port.getPartnerPort().getCircuitPackName()))
-            .child(Ports.class, new PortsKey(port.getPartnerPort().getPortName()));
+            .child(Ports.class, new PortsKey(port.getPartnerPort().getPortName()))
+            .build();
         Optional<Ports> port2Object = this.deviceTransactionManager
             .getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, port2ID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
         if (port2Object.isEmpty()
-                || port2Object.get().getPortQual().getIntValue() != PortQual.RoadmExternal.getIntValue()) {
+                || port2Object.orElseThrow().getPortQual().getIntValue() != PortQual.RoadmExternal.getIntValue()) {
             LOG.error(PortMappingUtils.NOT_CORRECT_PARTNERPORT_LOGMSG + PortMappingUtils.PARTNERPORT_GET_ERROR_LOGMSG,
                 nodeId, port.getPartnerPort().getPortName(), port.getPartnerPort().getCircuitPackName(),
                 port.getPortName(), circuitPackName);
             return null;
         }
-        Ports port2 = port2Object.get();
+        Ports port2 = port2Object.orElseThrow();
         if (!checkPartnerPort(circuitPackName, port, port2)) {
             LOG.error(PortMappingUtils.NOT_CORRECT_PARTNERPORT_LOGMSG + PortMappingUtils.PARTNERPORT_CONF_ERROR_LOGMSG,
                 nodeId, port2.getPortName(), port.getPartnerPort().getCircuitPackName(),
@@ -593,8 +608,10 @@ public class PortMappingVersion710 {
     }
 
     private List<Ports> getPortList(String circuitPackName, String nodeId) {
-        InstanceIdentifier<CircuitPacks> cpIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-            .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName));
+        InstanceIdentifier<CircuitPacks> cpIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName))
+            .build();
         Optional<CircuitPacks> circuitPackObject = this.deviceTransactionManager.getDataFromDevice(nodeId,
              LogicalDatastoreType.OPERATIONAL, cpIID,
              Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -603,11 +620,11 @@ public class PortMappingVersion710 {
                 nodeId, circuitPackName);
             return new ArrayList<>();
         }
-        if (circuitPackObject.get().getPorts() == null) {
+        if (circuitPackObject.orElseThrow().getPorts() == null) {
             LOG.warn(PortMappingUtils.NO_PORT_ON_CP_LOGMSG, nodeId, PortMappingUtils.FOUND, circuitPackName);
             return new ArrayList<>();
         }
-        return new ArrayList<>(circuitPackObject.get().nonnullPorts().values());
+        return new ArrayList<>(circuitPackObject.orElseThrow().nonnullPorts().values());
     }
 
     private String createLogicalConnectionPort(Ports port, int index, int portIndex) {
@@ -621,7 +638,9 @@ public class PortMappingVersion710 {
 
     private Map<McCapabilityProfileKey, McCapabilityProfile> getMcCapabilityProfiles(String deviceId, Info ordmInfo) {
         Map<McCapabilityProfileKey, McCapabilityProfile>  mcCapabilityProfiles = new HashMap<>();
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject = deviceTransactionManager.getDataFromDevice(deviceId,
             LogicalDatastoreType.OPERATIONAL, deviceIID,
             Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -631,11 +650,14 @@ public class PortMappingVersion710 {
             LOG.warn("MC-capabilities profile will be empty for node {}", deviceId);
             return mcCapabilityProfiles;
         }
-        device = deviceObject.get();
+        device = deviceObject.orElseThrow();
         mcCapabilityProfiles = device.getMcCapabilityProfile();
         return mcCapabilityProfiles;
     }
 
+    @SuppressFBWarnings(
+        value = "SLF4J_UNKNOWN_ARRAY",
+        justification = "False positive")
     private Map<Integer, Degree> getDegreesMap(String deviceId, Info ordmInfo) {
         Map<Integer, Degree> degrees = new HashMap<>();
 
@@ -645,13 +667,15 @@ public class PortMappingVersion710 {
 
         for (int degreeCounter = 1; degreeCounter <= maxDegree; degreeCounter++) {
             LOG.debug(PortMappingUtils.GETTING_CONPORT_LOGMSG, deviceId, degreeCounter);
-            InstanceIdentifier<Degree> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(Degree.class, new DegreeKey(Uint16.valueOf(degreeCounter)));
+            InstanceIdentifier<Degree> deviceIID = InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(Degree.class, new DegreeKey(Uint16.valueOf(degreeCounter)))
+                .build();
             Optional<Degree> ordmDegreeObject = this.deviceTransactionManager.getDataFromDevice(deviceId,
                 LogicalDatastoreType.OPERATIONAL, deviceIID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
             if (ordmDegreeObject.isPresent()) {
-                degrees.put(degreeCounter, ordmDegreeObject.get());
+                degrees.put(degreeCounter, ordmDegreeObject.orElseThrow());
             }
         }
         LOG.info(PortMappingUtils.DEVICE_HAS_LOGMSG,
@@ -673,13 +697,15 @@ public class PortMappingVersion710 {
         // if not present assume to be 20 (temporary)
         Integer maxSrg = ordmInfo.getMaxSrgs() == null ? 20 : ordmInfo.getMaxSrgs().toJava();
         for (int srgCounter = 1; srgCounter <= maxSrg; srgCounter++) {
-            InstanceIdentifier<SharedRiskGroup> srgIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(SharedRiskGroup.class, new SharedRiskGroupKey(Uint16.valueOf(srgCounter)));
+            InstanceIdentifier<SharedRiskGroup> srgIID = InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(SharedRiskGroup.class, new SharedRiskGroupKey(Uint16.valueOf(srgCounter)))
+                .build();
             Optional<SharedRiskGroup> ordmSrgObject = this.deviceTransactionManager.getDataFromDevice(deviceId,
                 LogicalDatastoreType.OPERATIONAL, srgIID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
             if (ordmSrgObject.isPresent()) {
-                srgs.add(ordmSrgObject.get());
+                srgs.add(ordmSrgObject.orElseThrow());
 
             }
         }
@@ -688,40 +714,46 @@ public class PortMappingVersion710 {
 
     private Map<String, String> getEthInterfaceList(String nodeId) {
         LOG.info(PortMappingUtils.GETTING_ETH_LIST_LOGMSG, nodeId);
-        InstanceIdentifier<Protocols> protocoliid = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-            .child(Protocols.class);
+        InstanceIdentifier<Protocols> protocoliid = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Protocols.class)
+            .build();
         Optional<Protocols> protocolObject = this.deviceTransactionManager.getDataFromDevice(nodeId,
             LogicalDatastoreType.OPERATIONAL, protocoliid, Timeouts.DEVICE_READ_TIMEOUT,
             Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-        if (protocolObject.isEmpty() || protocolObject.get().augmentation(Protocols1.class).getLldp() == null) {
+        if (protocolObject.isEmpty() || protocolObject.orElseThrow().augmentation(Protocols1.class).getLldp() == null) {
             LOG.warn(PortMappingUtils.PROCESSING_DONE_LOGMSG, nodeId, PortMappingUtils.CANNOT_GET_LLDP_CONF_LOGMSG);
             return new HashMap<>();
         }
         Map<String, String> cpToInterfaceMap = new HashMap<>();
-        Lldp lldp = protocolObject.get().augmentation(Protocols1.class).getLldp();
+        Lldp lldp = protocolObject.orElseThrow().augmentation(Protocols1.class).getLldp();
         for (PortConfig portConfig : lldp.nonnullPortConfig().values()) {
             if (!portConfig.getAdminStatus().equals(PortConfig.AdminStatus.Txandrx)) {
                 continue;
             }
-            InstanceIdentifier<Interface> interfaceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(Interface.class, new InterfaceKey(portConfig.getIfName()));
+            InstanceIdentifier<Interface> interfaceIID = InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(Interface.class, new InterfaceKey(portConfig.getIfName()))
+                .build();
             Optional<Interface> interfaceObject = this.deviceTransactionManager.getDataFromDevice(nodeId,
                 LogicalDatastoreType.OPERATIONAL, interfaceIID, Timeouts.DEVICE_READ_TIMEOUT,
                 Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-            if (interfaceObject.isEmpty() || interfaceObject.get().getSupportingCircuitPackName() == null) {
+            if (interfaceObject.isEmpty() || interfaceObject.orElseThrow().getSupportingCircuitPackName() == null) {
                 continue;
             }
-            String supportingCircuitPackName = interfaceObject.get().getSupportingCircuitPackName();
+            String supportingCircuitPackName = interfaceObject.orElseThrow().getSupportingCircuitPackName();
             cpToInterfaceMap.put(supportingCircuitPackName, portConfig.getIfName());
-            InstanceIdentifier<CircuitPacks> circuitPacksIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(CircuitPacks.class, new CircuitPacksKey(supportingCircuitPackName));
+            InstanceIdentifier<CircuitPacks> circuitPacksIID = InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(CircuitPacks.class, new CircuitPacksKey(supportingCircuitPackName))
+                .build();
             Optional<CircuitPacks> circuitPackObject = this.deviceTransactionManager.getDataFromDevice(
                 nodeId, LogicalDatastoreType.OPERATIONAL, circuitPacksIID, Timeouts.DEVICE_READ_TIMEOUT,
                 Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-            if (circuitPackObject.isEmpty() || circuitPackObject.get().getParentCircuitPack() == null) {
+            if (circuitPackObject.isEmpty() || circuitPackObject.orElseThrow().getParentCircuitPack() == null) {
                 continue;
             }
-            cpToInterfaceMap.put(circuitPackObject.get().getParentCircuitPack().getCircuitPackName(),
+            cpToInterfaceMap.put(circuitPackObject.orElseThrow().getParentCircuitPack().getCircuitPackName(),
                 portConfig.getIfName());
         }
         LOG.info(PortMappingUtils.PROCESSING_DONE_LOGMSG, nodeId, " - success");
@@ -953,37 +985,34 @@ public class PortMappingVersion710 {
                     nodeId, interfaces.getInterfaceName() + "- empty interface");
                 continue;
             }
-            LOG.debug(PortMappingUtils.GOT_INTF_LOGMSG,
-                nodeId, openRoadmInterface.get().getName(), openRoadmInterface.get().getType());
-            Class<? extends InterfaceType> interfaceType
-                = (Class<? extends InterfaceType>) openRoadmInterface.get().getType();
+            InterfaceType interfaceType = openRoadmInterface.orElseThrow().getType();
+            LOG.debug(PortMappingUtils.GOT_INTF_LOGMSG, nodeId, openRoadmInterface.orElseThrow().getName(),
+                    interfaceType);
             // Check if interface type is OMS or OTS
-            if (interfaceType.equals(OpenROADMOpticalMultiplex.class)) {
+            // Switch/Case might be more indicated here but is not possible in jdk17 w/o enable-preview
+            if (interfaceType.equals(OpenROADMOpticalMultiplex.VALUE)) {
                 mpBldr.setSupportingOms(interfaces.getInterfaceName());
-            }
-            if (interfaceType.equals(OpticalTransport.class)) {
+            } else if (interfaceType.equals(OpticalTransport.VALUE)) {
                 mpBldr.setSupportingOts(interfaces.getInterfaceName());
-            }
-            String interfaceName = interfaces.getInterfaceName();
-            if (interfaceType.equals(OtnOtu.class)
-                && (interfaceName.substring(interfaceName.lastIndexOf("-") + 1)
-                .equals("OTU4"))) {
-                mpBldr.setSupportingOtu4(interfaces.getInterfaceName());
-            }
-            if ((interfaceType.equals(OtnOtu.class))
-                && (interfaceName.substring(interfaceName.lastIndexOf("-") + 1)
-                .contains("OTUC"))) {
-                mpBldr.setSupportingOtucn(interfaces.getInterfaceName());
-            }
-            if (interfaceType.equals(OtnOdu.class)
-                && (interfaceName.substring(interfaceName.lastIndexOf("-") + 1)
-                .equals("ODU4"))) {
-                mpBldr.setSupportingOdu4(interfaces.getInterfaceName());
-            }
-            if ((interfaceType.equals(OtnOdu.class))
-                && (interfaceName.substring(interfaceName.lastIndexOf("-") + 1)
-                .contains("ODUC"))) {
-                mpBldr.setSupportingOducn(interfaces.getInterfaceName());
+            //TODO check if the following lines for Eth CSMACD present in 1.2.1 and 2.2.1 were not forgotten in 7.1
+            //} else if(interfaceType.equals(EthernetCsmacd.VALUE)) {
+            //    mpBldr.setSupportingEthernet(interfaces.getInterfaceName());
+            } else if (interfaceType.equals(OtnOtu.VALUE)) {
+                String interfaceName = interfaces.getInterfaceName();
+                String suffix = interfaceName.substring(interfaceName.lastIndexOf("-") + 1);
+                if (suffix.equals("OTU4")) {
+                    mpBldr.setSupportingOtu4(interfaces.getInterfaceName());
+                } else if (suffix.contains("OTUC")) {
+                    mpBldr.setSupportingOtucn(interfaces.getInterfaceName());
+                }
+            } else if (interfaceType.equals(OtnOdu.VALUE)) {
+                String interfaceName = interfaces.getInterfaceName();
+                String suffix = interfaceName.substring(interfaceName.lastIndexOf("-") + 1);
+                if (suffix.equals("ODU4")) {
+                    mpBldr.setSupportingOdu4(interfaces.getInterfaceName());
+                } else if (suffix.contains("ODUC")) {
+                    mpBldr.setSupportingOducn(interfaces.getInterfaceName());
+                }
             }
         }
         return mpBldr;
@@ -1014,37 +1043,51 @@ public class PortMappingVersion710 {
             mpBldr.setPortQual(port.getPortQual().getName());
         }
         if (xpdrNodeType != null) {
-            mpBldr.setXponderType(xpdrNodeType);
+            mpBldr.setXpdrType(xpdrNodeType);
         }
         if (partnerLcp != null) {
             mpBldr.setPartnerLcp(partnerLcp);
         }
         Collection<SupportedInterfaceCapability> supIntfCapaList = getSupIntfCapaList(port);
         if (supIntfCapaList != null) {
-            List<Class<? extends org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211
-                .SupportedIfCapability>> supportedIntf = new ArrayList<>();
-            SupportedInterfaceCapability sic1 = null;
+            Set<org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.SupportedIfCapability>
+                    supportedIntf = new HashSet<>();
+            Set<String> regenProfiles = new HashSet<>();
             for (SupportedInterfaceCapability sic : supIntfCapaList) {
-                supportedIntf.add(MappingUtilsImpl.convertSupIfCapa(sic.getIfCapType().getSimpleName()));
-                sic1 = sic;
-            }
-            mpBldr.setSupportedInterfaceCapability(supportedIntf);
-            if (port.getPortQual() == PortQual.SwitchClient
-                && !sic1.getOtnCapability().getMpdrClientRestriction().isEmpty()) {
-                // Here we assume all the supported-interfaces has the support same rates, and the
-                // trib-slot numbers are assumed to be the same
-                String mxpProfileName =
-                    sic1.getOtnCapability().getMpdrClientRestriction().get(0).getMuxpProfileName().get(0);
-                // From this muxponder-profile get the min-trib-slot and the max-trib-slot
-                LOG.info("{}: Muxp-profile used for trib information {}", nodeId, mxpProfileName);
-                // This provides the tribSlot information from muxProfile
-                List<OpucnTribSlotDef> minMaxOpucnTribSlots = getOpucnTribSlots(nodeId, mxpProfileName);
-                mpBldr.setMpdrRestrictions(
-                    new MpdrRestrictionsBuilder()
-                        .setMinTribSlot(minMaxOpucnTribSlots.get(0))
-                        .setMaxTribSlot(minMaxOpucnTribSlots.get(1))
-                        .build());
+                // Here it could add null values and cause a null pointer exception
+                // Especially when the MappingUtilsImpl does not contain required supported-if-cap
+                if (MappingUtilsImpl.convertSupIfCapa(sic.getIfCapType().toString()) != null) {
+                    supportedIntf.add(MappingUtilsImpl.convertSupIfCapa(sic.getIfCapType().toString()));
+                }
+                LOG.debug("This the xpdr-type {}", xpdrNodeType.getName());
+                // Here we use both types of Regen (bi/uni). Though initial support is only for bi-directional regen
+                if (xpdrNodeType == XpdrNodeTypes.Regen || xpdrNodeType == XpdrNodeTypes.RegenUni) {
+                    if (sic.getOtsigroupCapabilityProfileName().isEmpty()) {
+                        LOG.error("Otsigroup-capability-profile-name is not found for regen port {}",
+                                port.getPortName());
+                    }
+                    LOG.info("Regen-profiles {}", sic.getOtsigroupCapabilityProfileName());
+                    regenProfiles.addAll(sic.getOtsigroupCapabilityProfileName());
+                }
+                if (port.getPortQual() == PortQual.SwitchClient
+                        && sic.getOtnCapability() != null) {
+                    // Here we assume all the supported-interfaces has the support same rates, and the
+                    // trib-slot numbers are assumed to be the same
+                    String mxpProfileName = sic.getOtnCapability().getMpdrClientRestriction().get(0)
+                            .getMuxpProfileName().stream().findFirst().orElseThrow();
+                    // From this muxponder-profile get the min-trib-slot and the max-trib-slot
+                    LOG.info("{}: Muxp-profile used for trib information {}", nodeId, mxpProfileName);
+                    // This provides the tribSlot information from muxProfile
+                    List<OpucnTribSlotDef> minMaxOpucnTribSlots = getOpucnTribSlots(nodeId, mxpProfileName);
+                    mpBldr.setMpdrRestrictions(
+                            new MpdrRestrictionsBuilder()
+                                    .setMinTribSlot(minMaxOpucnTribSlots.get(0))
+                                    .setMaxTribSlot(minMaxOpucnTribSlots.get(1))
+                                    .build());
+                }
             }
+            mpBldr.setRegenProfiles(new RegenProfilesBuilder().setRegenProfile(regenProfiles).build())
+                    .setSupportedInterfaceCapability(supportedIntf);
         }
         if (port.getAdministrativeState() != null) {
             mpBldr.setPortAdminState(port.getAdministrativeState().name());
@@ -1066,14 +1109,16 @@ public class PortMappingVersion710 {
         ArrayList<OpucnTribSlotDef> minMaxOpucnTribSlots = new ArrayList<>(2);
 
         LOG.info("{} : Getting Min/Max Trib-slots from {}", deviceId, mxpProfileName);
-        InstanceIdentifier<MuxpProfile> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-            .child(MuxpProfile.class, new MuxpProfileKey(mxpProfileName));
+        InstanceIdentifier<MuxpProfile> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(MuxpProfile.class, new MuxpProfileKey(mxpProfileName))
+            .build();
 
         Optional<MuxpProfile> muxpProfileObject = this.deviceTransactionManager.getDataFromDevice(deviceId,
             LogicalDatastoreType.OPERATIONAL, deviceIID,
             Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
 
-        List<OpucnTribSlotDef> ntwHoOduOpucnTribSlots = muxpProfileObject.get().getNetworkHoOduOpucnTribSlots();
+        Set<OpucnTribSlotDef> ntwHoOduOpucnTribSlots = muxpProfileObject.orElseThrow().getNetworkHoOduOpucnTribSlots();
         // Sort the tib-slots in ascending order and pick min and max
         List<OpucnTribSlotDef> sortedNtwHoOduOpucnTribSlots = ntwHoOduOpucnTribSlots.stream().sorted(
             Comparator.comparingDouble(x -> Double.parseDouble(
@@ -1103,7 +1148,7 @@ public class PortMappingVersion710 {
             LOG.error(PortMappingUtils.MISSING_CP_LOGMSG, nodeId, port.getPartnerPort().getCircuitPackName());
             return null;
         }
-        Optional<Ports> poOpt = cpOpt.get().nonnullPorts().values().stream()
+        Optional<Ports> poOpt = cpOpt.orElseThrow().nonnullPorts().values().stream()
             .filter(p -> p.getPortName().equals(port.getPartnerPort().getPortName()))
             .findFirst();
         if (poOpt.isEmpty()) {
@@ -1111,8 +1156,8 @@ public class PortMappingVersion710 {
                 nodeId, port.getPartnerPort().getPortName(), port.getPartnerPort().getCircuitPackName());
             return null;
         }
-        Ports port2 = poOpt.get();
-        circuitPackName2.append(cpOpt.get().getCircuitPackName());
+        Ports port2 = poOpt.orElseThrow();
+        circuitPackName2.append(cpOpt.orElseThrow().getCircuitPackName());
         if (!checkPartnerPort(circuitPackName, port, port2)) {
             LOG.error(PortMappingUtils.NOT_CORRECT_PARTNERPORT_LOGMSG,
                 nodeId, port2.getPortName(), circuitPackName2, port.getPortName(), circuitPackName);
@@ -1321,9 +1366,11 @@ public class PortMappingVersion710 {
     }
 
     private Ports getTtpPort(ConnectionPorts cp, String cpName, String nodeId) {
-        InstanceIdentifier<Ports> portID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
+        InstanceIdentifier<Ports> portID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
             .child(CircuitPacks.class, new CircuitPacksKey(cpName))
-            .child(Ports.class, new PortsKey(cp.getPortName()));
+            .child(Ports.class, new PortsKey(cp.getPortName()))
+            .build();
         LOG.debug(PortMappingUtils.FETCH_CONNECTIONPORT_LOGMSG, nodeId, cp.getPortName(), cpName);
         Optional<Ports> portObject = this.deviceTransactionManager.getDataFromDevice(nodeId,
             LogicalDatastoreType.OPERATIONAL, portID, Timeouts.DEVICE_READ_TIMEOUT,
@@ -1332,7 +1379,7 @@ public class PortMappingVersion710 {
             LOG.error(PortMappingUtils.NO_PORT_ON_CP_LOGMSG, nodeId, cp.getPortName(), cpName);
             return null;
         }
-        return portObject.get();
+        return portObject.orElseThrow();
     }
 
     private boolean checkPortQual(Ports port, String cpName, String nodeId) {
@@ -1419,8 +1466,10 @@ public class PortMappingVersion710 {
     }
 
     private Optional<Interface> getInterfaceFromDevice(String nodeId, String interfaceName) {
-        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-            .child(Interface.class, new InterfaceKey(interfaceName));
+        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Interface.class, new InterfaceKey(interfaceName))
+            .build();
         return deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.CONFIGURATION,
             interfacesIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
     }
index 21166d099f4dccdac32118a5a0ef1846f2a7410d..76b0d8d97ea85d66b8039521779f719cbc1459a4 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.transportpce.common.mapping;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.Serializable;
 import java.util.Comparator;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.Port;
@@ -19,7 +20,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.Port;
  *
  */
 @SuppressWarnings("serial")
-@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+@SuppressFBWarnings(
     value = "SE_NO_SERIALVERSIONID",
     justification = "https://github.com/rzwitserloot/lombok/wiki/WHY-NOT:-serialVersionUID")
 public class SortPort121ByName implements Comparator<Port>, Serializable {
index de16646ff313dced3c76c86193dc9a1b27d234b2..565d980008cc03344c384bf3ea1219cc2f75f66d 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.transportpce.common.mapping;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.Serializable;
 import java.util.Comparator;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.Port;
@@ -19,7 +20,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.Port;
  *
  */
 @SuppressWarnings("serial")
-@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+@SuppressFBWarnings(
     value = "SE_NO_SERIALVERSIONID",
     justification = "https://github.com/rzwitserloot/lombok/wiki/WHY-NOT:-serialVersionUID")
 public class SortPort221ByName implements Comparator<Port>, Serializable {
index 82fae03f9e30a11491611f544696e55edde63bca..b9f8a88417fde41cd2a78f3ee74bd1f114b2fbdd 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.transportpce.common.mapping;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.Serializable;
 import java.util.Comparator;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.Port;
@@ -18,7 +19,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.Port;
  *
  */
 @SuppressWarnings("serial")
-@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+@SuppressFBWarnings(
     value = "SE_NO_SERIALVERSIONID",
     justification = "https://github.com/rzwitserloot/lombok/wiki/WHY-NOT:-serialVersionUID")
 public class SortPort710ByName implements Comparator<Port>, Serializable {
index 3f39eb110345ba48d7ac113b0fec817e51f7ae0b..10f1dafbb5328797daa73a8a2763148847706be0 100644 (file)
@@ -10,25 +10,28 @@ package org.opendaylight.transportpce.common.network;
 
 import com.google.common.util.concurrent.FluentFuture;
 import com.google.common.util.concurrent.ListenableFuture;
+import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 
+@Component
+public final class NetworkTransactionImpl implements NetworkTransactionService {
+    private final RequestProcessor requestProcessor;
 
-public class NetworkTransactionImpl implements NetworkTransactionService {
-
-    RequestProcessor requestProcessor;
-
-    public NetworkTransactionImpl(RequestProcessor requestProcessor) {
-        this.requestProcessor = requestProcessor;
-
+    @Activate
+    public NetworkTransactionImpl(@Reference DataBroker dataBroker) {
+        this.requestProcessor = new RequestProcessor(dataBroker);
     }
 
-    public <T extends DataObject> ListenableFuture<java.util.Optional<T>>
-        read(LogicalDatastoreType store, InstanceIdentifier<T> path) {
+    public <T extends DataObject> ListenableFuture<Optional<T>> read(LogicalDatastoreType store,
+            InstanceIdentifier<T> path) {
         return requestProcessor.read(store, path);
     }
 
@@ -50,22 +53,16 @@ public class NetworkTransactionImpl implements NetworkTransactionService {
         return requestProcessor.commit();
     }
 
-    @Override
-    public void close() {
-
-        requestProcessor.close();
-    }
-
     public <T extends DataObject> void merge(LogicalDatastoreType store,
         InstanceIdentifier<T> path, T data) {
         requestProcessor.merge(store, path, data);
     }
 
     /*
-    * (non-Javadoc)
-    *
-    * @see org.opendaylight.transportpce.common.network.NetworkTransactionService#getDataBroker()
-    */
+     * (non-Javadoc)
+     *
+     * @see org.opendaylight.transportpce.common.network.NetworkTransactionService#getDataBroker()
+     */
     @Override
     public DataBroker getDataBroker() {
         return requestProcessor.getDataBroker();
index af75889fe4a9e82eb8cd47c23bdaea6ce9753f82..1b139d91ca0d0b80db90614d41f6f7e288764845 100644 (file)
@@ -33,8 +33,6 @@ public interface NetworkTransactionService {
 
     FluentFuture<? extends @NonNull CommitInfo> commit();
 
-    void close();
-
     /**
      * the Databroker related to NetworkTransactionService.
      * @return the Databroker related to NetworkTransactionService.
index 810902dd42dc775c2e27e8450dbe614aaf60e7c2..8a4780ca104bb107ab4ede0c0f88cb070e966322 100644 (file)
  */
 package org.opendaylight.transportpce.common.network;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.util.concurrent.FluentFuture;
 import com.google.common.util.concurrent.ListenableFuture;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Optional;
+import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.ReadTransaction;
-import org.opendaylight.mdsal.binding.api.ReadWriteTransaction;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.yangtools.util.concurrent.FluentFutures;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@SuppressFBWarnings(value = "UL_UNRELEASED_LOCK_EXCEPTION_PATH",
+    justification = "This appears to be doing exactly the right thing with the finally-clause to release the lock")
 public class RequestProcessor {
 
     private static final Logger LOG = LoggerFactory.getLogger(RequestProcessor.class);
 
     private final DataBroker dataBroker;
-    private ReadWriteTransaction rwTx;
-    private ReadTransaction readTx;
-    private ReentrantReadWriteLock lock;
-
+    private final ReentrantReadWriteLock rwL = new ReentrantReadWriteLock();
+    private final Lock readL = rwL.readLock();
+    private final Lock writeL = rwL.writeLock();
+    private Map<String, WriteTransaction> writeTrMap = new HashMap<>();
 
 
     public RequestProcessor(DataBroker dataBroker) {
-        this.dataBroker = dataBroker;
-        rwTx = dataBroker.newReadWriteTransaction();
-        readTx = dataBroker.newReadOnlyTransaction();
-        lock = new ReentrantReadWriteLock();
+        this.dataBroker = requireNonNull(dataBroker);
         LOG.info("RequestProcessor instantiated");
-
     }
 
-    public <T extends DataObject> ListenableFuture<Optional<T>>
-         read(LogicalDatastoreType store,InstanceIdentifier<T> path) {
-
-        ListenableFuture<Optional<T>> result = null;
-        acquireReadLock();
-        LOG.debug("Number of threads in queue to read {}", lock.getQueueLength());
-        result = rwTx.read(store, path);
-
-        releaseReadLock();
-        return result;
+    public <T extends DataObject> ListenableFuture<Optional<T>> read(LogicalDatastoreType store,
+            InstanceIdentifier<T> path) {
+        ReadTransaction readTx = dataBroker.newReadOnlyTransaction();
+        String thread = Thread.currentThread().getName();
+        readL.lock();
+        LOG.debug("read locked {} by {}", store, thread);
+        try {
+            return readTx.read(store, path);
+        }
+        finally {
+            readTx.close();
+            readL.unlock();
+            LOG.debug("read after unlock - {}", thread);
+        }
     }
 
     public <T extends DataObject> void delete(LogicalDatastoreType store, InstanceIdentifier<?> path) {
-
-        acquireLock();
-        LOG.info("Number of delete requests waiting in queue :{}", lock.getQueueLength());
-        rwTx.delete(store, path);
-    }
-
-
-    public <T extends DataObject> void put(LogicalDatastoreType store,
-        InstanceIdentifier<T> path, T data) {
-
-        acquireLock();
-        LOG.debug("Number of put requests waiting in queue :{}", lock.getQueueLength());
-        rwTx.put(store, path, data);
-    }
-
-
-    public <T extends DataObject> void merge(LogicalDatastoreType store,
-        InstanceIdentifier<T> path, T data) {
-
-        acquireLock();
-        LOG.debug("Number of merge requests waiting in queue :{}", lock.getQueueLength());
-        rwTx.merge(store, path, data);
-    }
-
-    public FluentFuture<? extends @NonNull CommitInfo> commit() {
-        acquireLock();
-        FluentFuture<? extends @NonNull CommitInfo> future = null;
-        future = rwTx.commit();
-        releaseLock();
-        resetRwTx();
-        return future;
-    }
-
-    public void close() {
-        releaseLock();
-    }
-
-    private void acquireLock() {
-        if (!lock.writeLock().isHeldByCurrentThread()) {
-            lock.writeLock().lock();
-            LOG.debug("Number of write lock requests waiting in queue :{}", lock.getQueueLength());
-            LOG.info("Write Lock acquired by : {}", Thread.currentThread().getName());
-            rwTx = resetRwTx();
-        } else {
-            LOG.debug("Lock already acquired by : {}", Thread.currentThread().getName());
+        String thread = Thread.currentThread().getName();
+        LOG.debug("delete - store, thread = {} - {}", store, thread);
+        writeL.lock();
+        LOG.debug("delete locked by {}", thread);
+        try {
+            if (!writeTrMap.containsKey(thread)) {
+                writeTrMap.put(thread, dataBroker.newWriteOnlyTransaction());
+            }
+            writeTrMap.get(thread).delete(store, path);
         }
-    }
-
-    private void acquireReadLock() {
-        if (lock.getReadHoldCount() > 0) {
-            LOG.info("Read Lock already acquired by : {}", Thread.currentThread().getName());
-        } else {
-            lock.readLock().lock();
-            rwTx = resetRwTx();
-            LOG.info("Read Lock acquired by : {}", Thread.currentThread().getName());
+        finally {
+            LOG.debug("delete before unlock - {}", thread);
+            writeL.unlock();
+            LOG.debug("delete after unlock1 - {}", Thread.currentThread().getName());
+            LOG.debug("delete after unlock2 - {}", thread);
         }
     }
 
-    private void releaseLock() {
-        if (lock.writeLock().isHeldByCurrentThread()) {
-            LOG.info("Write Lock released by : {}", Thread.currentThread().getName());
-            lock.writeLock().unlock();
+    public <T extends DataObject> void put(LogicalDatastoreType store, InstanceIdentifier<T> path, T data) {
+        String thread = Thread.currentThread().getName();
+        writeL.lock();
+        LOG.debug("put locked {} by {}", store, thread);
+        try {
+            if (!writeTrMap.containsKey(thread)) {
+                writeTrMap.put(thread, dataBroker.newWriteOnlyTransaction());
+            }
+            writeTrMap.get(thread).put(store, path, data);
+        }
+        finally {
+            writeL.unlock();
+            LOG.debug("put after unlock - {}", thread);
         }
     }
 
-    private void releaseReadLock() {
-        LOG.info("Read Lock released by : {}", Thread.currentThread().getName());
-        lock.readLock().unlock();
+    public <T extends DataObject> void merge(LogicalDatastoreType store, InstanceIdentifier<T> path, T data) {
+        String thread = Thread.currentThread().getName();
+        writeL.lock();
+        LOG.debug("merge locked {} by {}", store, thread);
+        try {
+            if (!writeTrMap.containsKey(thread)) {
+                writeTrMap.put(thread, dataBroker.newWriteOnlyTransaction());
+            }
+            writeTrMap.get(thread).merge(store, path, data);
+        }
+        finally {
+            writeL.unlock();
+            LOG.debug("merge after unlock - {}", thread);
+        }
     }
 
-    private ReadWriteTransaction resetRwTx() {
-        LOG.info("Resetting the read write transaction .....");
-        rwTx = dataBroker.newReadWriteTransaction();
-        return rwTx;
+    public FluentFuture<? extends @NonNull CommitInfo> commit() {
+        String thread = Thread.currentThread().getName();
+        writeL.lock();
+        LOG.debug("commit locked by {}", thread);
+        try {
+            if (writeTrMap.containsKey(thread)) {
+                return writeTrMap.get(thread).commit();
+            } else {
+                LOG.warn("No write transaction available for thread {}", thread);
+                return FluentFutures.immediateNullFluentFuture();
+            }
+        }
+        finally {
+            writeTrMap.remove(thread);
+            writeL.unlock();
+            LOG.debug("commit after unlock - {}", thread);
+        }
     }
 
     /**
index 13dd4d4e08c047841fa7c73b32dc19eb42e5a480..2f476fcdd4a6132896309e243052ac5c3fa0afb4 100644 (file)
@@ -8,8 +8,10 @@
 
 package org.opendaylight.transportpce.common.openroadminterfaces;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
 @SuppressWarnings("serial")
-@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+@SuppressFBWarnings(
     value = "SE_NO_SERIALVERSIONID",
     justification = "https://github.com/rzwitserloot/lombok/wiki/WHY-NOT:-serialVersionUID")
 public class OpenRoadmInterfaceException extends Exception {
@@ -21,4 +23,14 @@ public class OpenRoadmInterfaceException extends Exception {
     public OpenRoadmInterfaceException(String message, Throwable cause) {
         super(message, cause);
     }
+
+    public static final String mapping_msg_err(String node, String port) {
+        return String.format(
+            "Unable to get mapping from PortMapping for node %s and logical connection port %s", node, port);
+    }
+
+    public static final String mapping_xpdrtype_err(String node, String port) {
+        return String.format(
+                "Unable to get XpdrType from PortMapping for node % and logical connection port %s", node, port);
+    }
 }
index a32cc7d68cf81649e3102e04b9faef07bf06f1f3..5020fdbd22789fbad1b370a8a3caa9046ab6735c 100644 (file)
@@ -15,11 +15,15 @@ import static org.opendaylight.transportpce.common.StringConstants.OPENROADM_DEV
 import java.util.Optional;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.common.mapping.MappingUtils;
+import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.InterfaceBuilder;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-
+@Component
 public class OpenRoadmInterfacesImpl implements OpenRoadmInterfaces {
 
     private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmInterfacesImpl.class);
@@ -29,6 +33,15 @@ public class OpenRoadmInterfacesImpl implements OpenRoadmInterfaces {
     OpenRoadmInterfacesImpl710 openRoadmInterfacesImpl710;
     MappingUtils mappingUtils;
 
+    @Activate
+    public OpenRoadmInterfacesImpl(@Reference DeviceTransactionManager deviceTransactionManager,
+                                   @Reference MappingUtils mappingUtils, @Reference PortMapping portMapping) {
+        this(deviceTransactionManager, mappingUtils,
+            new OpenRoadmInterfacesImpl121(deviceTransactionManager),
+            new OpenRoadmInterfacesImpl221(deviceTransactionManager, portMapping),
+            new OpenRoadmInterfacesImpl710(deviceTransactionManager, portMapping));
+    }
+
     public OpenRoadmInterfacesImpl(DeviceTransactionManager deviceTransactionManager, MappingUtils mappingUtils,
                                    OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121,
                                    OpenRoadmInterfacesImpl221 openRoadmInterfacesImpl221,
index 6d103d9013ef2ca61bcf3554fa1a83382da9f9d5..a4512d8a5c9f8a9e92d681beade782ffa2e13a96 100755 (executable)
@@ -19,6 +19,7 @@ import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.transportpce.common.Timeouts;
 import org.opendaylight.transportpce.common.device.DeviceTransaction;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.Ports;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.PortsKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.packs.CircuitPacks;
@@ -32,7 +33,6 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.port.Int
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev161014.AdminStates;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev161014.States;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -52,7 +52,7 @@ public class OpenRoadmInterfacesImpl121 {
         try {
             Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
             if (deviceTxOpt.isPresent()) {
-                deviceTx = deviceTxOpt.get();
+                deviceTx = deviceTxOpt.orElseThrow();
             } else {
                 throw new OpenRoadmInterfaceException(String.format("Device transaction was not found for node %s!",
                     nodeId));
@@ -62,8 +62,10 @@ public class OpenRoadmInterfacesImpl121 {
                 nodeId), e);
         }
 
-        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(
-            Interface.class, new InterfaceKey(ifBuilder.getName()));
+        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Interface.class, new InterfaceKey(ifBuilder.getName()))
+            .build();
         deviceTx.merge(LogicalDatastoreType.CONFIGURATION, interfacesIID, ifBuilder.build());
         FluentFuture<? extends @NonNull CommitInfo> txSubmitFuture =
             deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
@@ -103,8 +105,10 @@ public class OpenRoadmInterfacesImpl121 {
 
 
     public Optional<Interface> getInterface(String nodeId, String interfaceName) throws OpenRoadmInterfaceException {
-        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-            .child(Interface.class, new InterfaceKey(interfaceName));
+        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Interface.class, new InterfaceKey(interfaceName))
+            .build();
         return deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.CONFIGURATION,
             interfacesIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
     }
@@ -119,7 +123,7 @@ public class OpenRoadmInterfacesImpl121 {
                 interfaceName, nodeId), e);
         }
         if (intf2DeleteOpt.isPresent()) {
-            Interface intf2Delete = intf2DeleteOpt.get();
+            Interface intf2Delete = intf2DeleteOpt.orElseThrow();
             // State admin state to out of service
             InterfaceBuilder ifBuilder = new InterfaceBuilder()
                 .setAdministrativeState(AdminStates.OutOfService)
@@ -133,15 +137,17 @@ public class OpenRoadmInterfacesImpl121 {
                     + " deleting it!", interfaceName, AdminStates.OutOfService), ex);
             }
 
-            InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(
-                Interface.class, new InterfaceKey(interfaceName));
+            InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(Interface.class, new InterfaceKey(interfaceName))
+                .build();
             Future<Optional<DeviceTransaction>> deviceTxFuture = this.deviceTransactionManager.getDeviceTransaction(
                 nodeId);
             DeviceTransaction deviceTx;
             try {
                 Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
                 if (deviceTxOpt.isPresent()) {
-                    deviceTx = deviceTxOpt.get();
+                    deviceTx = deviceTxOpt.orElseThrow();
                 } else {
                     throw new OpenRoadmInterfaceException(String.format("Device transaction was not found for node %s!",
                         nodeId));
@@ -176,14 +182,16 @@ public class OpenRoadmInterfacesImpl121 {
     public void postEquipmentState(String nodeId, String circuitPackName, boolean activate)
         throws OpenRoadmInterfaceException {
 
-        InstanceIdentifier<CircuitPacks> circuitPackIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(
-            CircuitPacks.class, new CircuitPacksKey(circuitPackName));
+        InstanceIdentifier<CircuitPacks> circuitPackIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName))
+            .build();
         Optional<CircuitPacks> cpOpt = this.deviceTransactionManager.getDataFromDevice(nodeId,
             LogicalDatastoreType.CONFIGURATION, circuitPackIID, Timeouts.DEVICE_READ_TIMEOUT,
             Timeouts.DEVICE_READ_TIMEOUT_UNIT);
         CircuitPacks cp = null;
         if (cpOpt.isPresent()) {
-            cp = cpOpt.get();
+            cp = cpOpt.orElseThrow();
         } else {
             throw new OpenRoadmInterfaceException(String.format(
                 "Could not find CircuitPack %s in equipment config datastore for node %s", circuitPackName, nodeId));
@@ -207,7 +215,7 @@ public class OpenRoadmInterfacesImpl121 {
             try {
                 Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
                 if (deviceTxOpt.isPresent()) {
-                    deviceTx = deviceTxOpt.get();
+                    deviceTx = deviceTxOpt.orElseThrow();
                 } else {
                     throw new OpenRoadmInterfaceException(String.format("Device transaction was not found for node %s!",
                         nodeId));
@@ -234,7 +242,7 @@ public class OpenRoadmInterfacesImpl121 {
         try {
             supInterfOpt = getInterface(nodeId, interf);
             if (supInterfOpt.isPresent()) {
-                return supInterfOpt.get().getSupportingInterface();
+                return supInterfOpt.orElseThrow().getSupportingInterface();
             } else {
                 return null;
             }
@@ -245,11 +253,13 @@ public class OpenRoadmInterfacesImpl121 {
     }
 
     private boolean checkIfDevicePortIsUpdatedWithInterface(String nodeId, InterfaceBuilder ifBuilder) {
-        KeyedInstanceIdentifier<Ports, PortsKey> portIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
+        InstanceIdentifier<Ports> portIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
             .child(CircuitPacks.class, new CircuitPacksKey(ifBuilder.getSupportingCircuitPackName()))
-            .child(Ports.class, new PortsKey(ifBuilder.getSupportingPort()));
+            .child(Ports.class, new PortsKey(ifBuilder.getSupportingPort()))
+            .build();
         Ports port = deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL,
-            portIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT).get();
+            portIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT).orElseThrow();
         if (port.getInterfaces() == null) {
             return false;
         }
index 437773621d73fe87d16f6b7b4fc7e5d187242a05..6ff1015d4da11de216ede44a8aff10c4c0acd38e 100755 (executable)
@@ -21,7 +21,8 @@ import org.opendaylight.transportpce.common.device.DeviceTransaction;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.mapping.PortMappingVersion221;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.circuit.pack.Ports;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.circuit.pack.PortsKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.circuit.packs.CircuitPacks;
@@ -35,7 +36,6 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.port.Int
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev171215.AdminStates;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev171215.States;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -47,11 +47,10 @@ public class OpenRoadmInterfacesImpl221 {
     private final PortMapping portMapping;
     private final PortMappingVersion221 portMapping221;
 
-    public OpenRoadmInterfacesImpl221(DeviceTransactionManager deviceTransactionManager,
-            PortMapping portMapping, PortMappingVersion221 portMapping221) {
+    public OpenRoadmInterfacesImpl221(DeviceTransactionManager deviceTransactionManager, PortMapping portMapping) {
         this.deviceTransactionManager = deviceTransactionManager;
         this.portMapping = portMapping;
-        this.portMapping221 = portMapping221;
+        this.portMapping221 = portMapping.getPortMappingVersion221();
     }
 
     public void postInterface(String nodeId, InterfaceBuilder ifBuilder) throws OpenRoadmInterfaceException {
@@ -60,7 +59,7 @@ public class OpenRoadmInterfacesImpl221 {
         try {
             Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
             if (deviceTxOpt.isPresent()) {
-                deviceTx = deviceTxOpt.get();
+                deviceTx = deviceTxOpt.orElseThrow();
             } else {
                 throw new OpenRoadmInterfaceException(String.format("Device transaction was not found for node %s!",
                     nodeId));
@@ -70,8 +69,10 @@ public class OpenRoadmInterfacesImpl221 {
                 nodeId), e);
         }
 
-        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(
-            Interface.class, new InterfaceKey(ifBuilder.getName()));
+        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Interface.class, new InterfaceKey(ifBuilder.getName()))
+            .build();
         LOG.info("POST INTERF for {} : InterfaceBuilder : name = {} \t type = {}", nodeId, ifBuilder.getName(),
             ifBuilder.getType().toString());
         deviceTx.merge(LogicalDatastoreType.CONFIGURATION, interfacesIID, ifBuilder.build());
@@ -113,8 +114,10 @@ public class OpenRoadmInterfacesImpl221 {
 
 
     public Optional<Interface> getInterface(String nodeId, String interfaceName) throws OpenRoadmInterfaceException {
-        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-            .child(Interface.class, new InterfaceKey(interfaceName));
+        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Interface.class, new InterfaceKey(interfaceName))
+            .build();
         return deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.CONFIGURATION,
             interfacesIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
     }
@@ -130,7 +133,7 @@ public class OpenRoadmInterfacesImpl221 {
                 interfaceName, nodeId), e);
         }
         if (intf2DeleteOpt.isPresent()) {
-            Interface intf2Delete = intf2DeleteOpt.get();
+            Interface intf2Delete = intf2DeleteOpt.orElseThrow();
             // State admin state to out of service
             InterfaceBuilder ifBuilder = new InterfaceBuilder()
                 .setAdministrativeState(AdminStates.OutOfService)
@@ -144,15 +147,17 @@ public class OpenRoadmInterfacesImpl221 {
                     + " deleting it!", interfaceName, AdminStates.OutOfService), ex);
             }
 
-            InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(
-                Interface.class, new InterfaceKey(interfaceName));
+            InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(Interface.class, new InterfaceKey(interfaceName))
+                .build();
             Future<Optional<DeviceTransaction>> deviceTxFuture = this.deviceTransactionManager.getDeviceTransaction(
                 nodeId);
             DeviceTransaction deviceTx;
             try {
                 Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
                 if (deviceTxOpt.isPresent()) {
-                    deviceTx = deviceTxOpt.get();
+                    deviceTx = deviceTxOpt.orElseThrow();
                 } else {
                     throw new OpenRoadmInterfaceException(String.format("Device transaction was not found for node %s!",
                         nodeId));
@@ -190,14 +195,16 @@ public class OpenRoadmInterfacesImpl221 {
 
     public void postEquipmentState(String nodeId, String circuitPackName, boolean activate)
         throws OpenRoadmInterfaceException {
-        InstanceIdentifier<CircuitPacks> circuitPackIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(
-            CircuitPacks.class, new CircuitPacksKey(circuitPackName));
+        InstanceIdentifier<CircuitPacks> circuitPackIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName))
+            .build();
         Optional<CircuitPacks> cpOpt = this.deviceTransactionManager.getDataFromDevice(nodeId,
             LogicalDatastoreType.CONFIGURATION, circuitPackIID, Timeouts.DEVICE_READ_TIMEOUT,
             Timeouts.DEVICE_READ_TIMEOUT_UNIT);
         CircuitPacks cp = null;
         if (cpOpt.isPresent()) {
-            cp = cpOpt.get();
+            cp = cpOpt.orElseThrow();
         } else {
             throw new OpenRoadmInterfaceException(String.format(
                 "Could not find CircuitPack %s in equipment config datastore for node %s", circuitPackName, nodeId));
@@ -222,7 +229,7 @@ public class OpenRoadmInterfacesImpl221 {
             try {
                 Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
                 if (deviceTxOpt.isPresent()) {
-                    deviceTx = deviceTxOpt.get();
+                    deviceTx = deviceTxOpt.orElseThrow();
                 } else {
                     throw new OpenRoadmInterfaceException(String.format("Device transaction was not found for node %s!",
                         nodeId));
@@ -249,7 +256,7 @@ public class OpenRoadmInterfacesImpl221 {
         try {
             supInterfOpt = getInterface(nodeId, interf);
             if (supInterfOpt.isPresent()) {
-                return supInterfOpt.get().getSupportingInterface();
+                return supInterfOpt.orElseThrow().getSupportingInterface();
             } else {
                 return null;
             }
@@ -260,11 +267,13 @@ public class OpenRoadmInterfacesImpl221 {
     }
 
     private boolean checkIfDevicePortIsUpdatedWithInterface(String nodeId, InterfaceBuilder ifBuilder) {
-        KeyedInstanceIdentifier<Ports, PortsKey> portIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
+        InstanceIdentifier<Ports> portIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
             .child(CircuitPacks.class, new CircuitPacksKey(ifBuilder.getSupportingCircuitPackName()))
-            .child(Ports.class, new PortsKey(ifBuilder.getSupportingPort()));
+            .child(Ports.class, new PortsKey(ifBuilder.getSupportingPort()))
+            .build();
         Ports port = deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL,
-            portIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT).get();
+            portIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT).orElseThrow();
         if (port.getInterfaces() == null) {
             return false;
         }
index de6ab127ea10c48e50c7aa893652c6e4c78e9aaf..836bdf35fb6e496c44e2ecf20eb004ae1b38ce41 100644 (file)
@@ -21,7 +21,8 @@ import org.opendaylight.transportpce.common.device.DeviceTransaction;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.mapping.PortMappingVersion710;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.circuit.pack.Ports;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.circuit.pack.PortsKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.circuit.packs.CircuitPacks;
@@ -35,7 +36,6 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.port.Int
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.States;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -47,11 +47,10 @@ public class OpenRoadmInterfacesImpl710 {
     private final PortMapping portMapping;
     private final PortMappingVersion710 portMapping710;
 
-    public OpenRoadmInterfacesImpl710(DeviceTransactionManager deviceTransactionManager,
-            PortMapping portMapping, PortMappingVersion710 portMapping710) {
+    public OpenRoadmInterfacesImpl710(DeviceTransactionManager deviceTransactionManager, PortMapping portMapping) {
         this.deviceTransactionManager = deviceTransactionManager;
         this.portMapping = portMapping;
-        this.portMapping710 = portMapping710;
+        this.portMapping710 = portMapping.getPortMappingVersion710();
     }
 
     public void postInterface(String nodeId, InterfaceBuilder ifBuilder) throws OpenRoadmInterfaceException {
@@ -60,7 +59,7 @@ public class OpenRoadmInterfacesImpl710 {
         try {
             Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
             if (deviceTxOpt.isPresent()) {
-                deviceTx = deviceTxOpt.get();
+                deviceTx = deviceTxOpt.orElseThrow();
             } else {
                 throw new OpenRoadmInterfaceException(String.format("Device transaction was not found for node %s!",
                     nodeId));
@@ -70,8 +69,10 @@ public class OpenRoadmInterfacesImpl710 {
                 nodeId), e);
         }
 
-        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(
-            Interface.class, new InterfaceKey(ifBuilder.getName()));
+        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Interface.class, new InterfaceKey(ifBuilder.getName()))
+            .build();
         LOG.info("POST INTERF for {} : InterfaceBuilder : name = {} \t type = {}", nodeId, ifBuilder.getName(),
             ifBuilder.getType().toString());
         deviceTx.merge(LogicalDatastoreType.CONFIGURATION, interfacesIID, ifBuilder.build());
@@ -113,8 +114,10 @@ public class OpenRoadmInterfacesImpl710 {
 
 
     public Optional<Interface> getInterface(String nodeId, String interfaceName) throws OpenRoadmInterfaceException {
-        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-            .child(Interface.class, new InterfaceKey(interfaceName));
+        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Interface.class, new InterfaceKey(interfaceName))
+            .build();
         return deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.CONFIGURATION,
             interfacesIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
     }
@@ -130,7 +133,7 @@ public class OpenRoadmInterfacesImpl710 {
                 interfaceName, nodeId), e);
         }
         if (intf2DeleteOpt.isPresent()) {
-            Interface intf2Delete = intf2DeleteOpt.get();
+            Interface intf2Delete = intf2DeleteOpt.orElseThrow();
             // set the name and set the type. Having these two lines will post the interface with just
             // name, type and admin-state, without all the default values such as maint-testsignal
             //  delete the interfaces successfully
@@ -150,15 +153,17 @@ public class OpenRoadmInterfacesImpl710 {
                     + " deleting it!", interfaceName, AdminStates.OutOfService), ex);
             }
 
-            InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(
-                Interface.class, new InterfaceKey(interfaceName));
+            InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(Interface.class, new InterfaceKey(interfaceName))
+                .build();
             Future<Optional<DeviceTransaction>> deviceTxFuture = this.deviceTransactionManager.getDeviceTransaction(
                 nodeId);
             DeviceTransaction deviceTx;
             try {
                 Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
                 if (deviceTxOpt.isPresent()) {
-                    deviceTx = deviceTxOpt.get();
+                    deviceTx = deviceTxOpt.orElseThrow();
                 } else {
                     throw new OpenRoadmInterfaceException(String.format("Device transaction was not found for node %s!",
                         nodeId));
@@ -197,14 +202,16 @@ public class OpenRoadmInterfacesImpl710 {
 
     public void postEquipmentState(String nodeId, String circuitPackName, boolean activate)
         throws OpenRoadmInterfaceException {
-        InstanceIdentifier<CircuitPacks> circuitPackIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(
-            CircuitPacks.class, new CircuitPacksKey(circuitPackName));
+        InstanceIdentifier<CircuitPacks> circuitPackIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName))
+            .build();
         Optional<CircuitPacks> cpOpt = this.deviceTransactionManager.getDataFromDevice(nodeId,
             LogicalDatastoreType.CONFIGURATION, circuitPackIID, Timeouts.DEVICE_READ_TIMEOUT,
             Timeouts.DEVICE_READ_TIMEOUT_UNIT);
         CircuitPacks cp = null;
         if (cpOpt.isPresent()) {
-            cp = cpOpt.get();
+            cp = cpOpt.orElseThrow();
         } else {
             throw new OpenRoadmInterfaceException(String.format(
                 "Could not find CircuitPack %s in equipment config datastore for node %s", circuitPackName, nodeId));
@@ -229,7 +236,7 @@ public class OpenRoadmInterfacesImpl710 {
             try {
                 Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
                 if (deviceTxOpt.isPresent()) {
-                    deviceTx = deviceTxOpt.get();
+                    deviceTx = deviceTxOpt.orElseThrow();
                 } else {
                     throw new OpenRoadmInterfaceException(String.format("Device transaction was not found for node %s!",
                         nodeId));
@@ -256,7 +263,7 @@ public class OpenRoadmInterfacesImpl710 {
         try {
             supInterfOpt = getInterface(nodeId, interf);
             if (supInterfOpt.isPresent()) {
-                return supInterfOpt.get().getSupportingInterfaceList().get(0);
+                return supInterfOpt.orElseThrow().getSupportingInterfaceList().stream().findFirst().orElseThrow();
             } else {
                 return null;
             }
@@ -267,11 +274,13 @@ public class OpenRoadmInterfacesImpl710 {
     }
 
     private boolean checkIfDevicePortIsUpdatedWithInterface(String nodeId, InterfaceBuilder ifBuilder) {
-        KeyedInstanceIdentifier<Ports, PortsKey> portIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
+        InstanceIdentifier<Ports> portIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
             .child(CircuitPacks.class, new CircuitPacksKey(ifBuilder.getSupportingCircuitPackName()))
-            .child(Ports.class, new PortsKey(ifBuilder.getSupportingPort()));
+            .child(Ports.class, new PortsKey(ifBuilder.getSupportingPort()))
+            .build();
         Ports port = deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL,
-            portIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT).get();
+            portIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT).orElseThrow();
         if (port.getInterfaces() == null) {
             return false;
         }
index a764f1828b8079d1f111de5f2672ea0a30246993..6055a71385338c51c4f1ed7651cbf1dd1574ec08 100644 (file)
@@ -10,7 +10,7 @@ package org.opendaylight.transportpce.common.service;
 
 import java.util.Map;
 import org.opendaylight.transportpce.common.StringConstants;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.PortQual;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.XpdrNodeTypes;
 import org.opendaylight.yangtools.yang.common.Uint32;
@@ -30,6 +30,15 @@ public final class ServiceTypes {
                 if (Uint32.valueOf(100).equals(serviceRate)) {
                     return StringConstants.SERVICE_TYPE_100GE_T;
                 }
+                if (Uint32.valueOf(200).equals(serviceRate)) {
+                    return StringConstants.SERVICE_TYPE_OTUC2;
+                }
+                if (Uint32.valueOf(300).equals(serviceRate)) {
+                    return StringConstants.SERVICE_TYPE_OTUC3;
+                }
+                if (Uint32.valueOf(400).equals(serviceRate)) {
+                    return StringConstants.SERVICE_TYPE_400GE;
+                }
                 LOG.warn("Invalid service-rate {}", serviceRate);
                 return null;
 
@@ -41,7 +50,7 @@ public final class ServiceTypes {
                     if (mapping == null || !PortQual.SwitchClient.getName().equals(mapping.getPortQual())) {
                         return StringConstants.SERVICE_TYPE_100GE_T;
                     }
-                    if (XpdrNodeTypes.Switch.equals(mapping.getXponderType())) {
+                    if (XpdrNodeTypes.Switch.equals(mapping.getXpdrType())) {
                         return StringConstants.SERVICE_TYPE_100GE_S;
                     }
                 }
diff --git a/common/src/main/resources/OSGI-INF/blueprint/common-blueprint.xml b/common/src/main/resources/OSGI-INF/blueprint/common-blueprint.xml
deleted file mode 100644 (file)
index 8add362..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- vi: set et smarttab sw=4 tabstop=4: -->
-<!--
-Copyright © 2016 Orange and others. All rights reserved.
-
-This program and the accompanying materials are made available under the
-terms of the Eclipse Public License v1.0 which accompanies this distribution,
-and is available at http://www.eclipse.org/legal/epl-v10.html
--->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
-           xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
-           odl:use-default-for-reference-types="true">
-
-    <reference id="mountPointService" interface="org.opendaylight.mdsal.binding.api.MountPointService" />
-    <reference id="dataBroker" interface="org.opendaylight.mdsal.binding.api.DataBroker" />
-
-    <bean id="deviceTransactionManager" class="org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl"
-          destroy-method="preDestroy" >
-        <argument ref="mountPointService" />
-        <argument value="15000" />
-    </bean>
-
-    <bean id="mappingUtils" class="org.opendaylight.transportpce.common.mapping.MappingUtilsImpl" >
-        <argument ref="dataBroker" />
-    </bean>
-
-    <bean id="openRoadmInterfaces121" class="org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl121" >
-        <argument ref="deviceTransactionManager" />
-    </bean>
-
-    <bean id="openRoadmInterfaces221" class="org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl221" >
-        <argument ref="deviceTransactionManager" />
-        <argument ref="portMapping" />
-        <argument ref="portMapping221" />
-    </bean>
-
-    <bean id="openRoadmInterfaces710" class="org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl710" >
-        <argument ref="deviceTransactionManager" />
-        <argument ref="portMapping" />
-        <argument ref="portMapping710" />
-    </bean>
-
-    <bean id="openRoadmInterfaces" class="org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl" >
-        <argument ref="deviceTransactionManager" />
-        <argument ref="mappingUtils" />
-        <argument ref="openRoadmInterfaces121" />
-        <argument ref="openRoadmInterfaces221" />
-        <argument ref="openRoadmInterfaces710" />
-    </bean>
-
-    <bean id="portMapping121" class="org.opendaylight.transportpce.common.mapping.PortMappingVersion121" >
-        <argument ref="dataBroker" />
-        <argument ref="deviceTransactionManager" />
-    </bean>
-
-    <bean id="portMapping221" class="org.opendaylight.transportpce.common.mapping.PortMappingVersion221" >
-        <argument ref="dataBroker" />
-        <argument ref="deviceTransactionManager" />
-    </bean>
-
-    <bean id="portMapping710" class="org.opendaylight.transportpce.common.mapping.PortMappingVersion710" >
-        <argument ref="dataBroker" />
-        <argument ref="deviceTransactionManager" />
-    </bean>
-
-    <bean id="requestProcessor" class="org.opendaylight.transportpce.common.network.RequestProcessor" scope="singleton" >
-        <argument ref="dataBroker" />
-    </bean>
-
-    <bean id="networkTransactionImpl" class="org.opendaylight.transportpce.common.network.NetworkTransactionImpl">
-        <argument ref="requestProcessor" />
-    </bean>
-
-    <bean id="portMapping" class="org.opendaylight.transportpce.common.mapping.PortMappingImpl" >
-        <argument ref="dataBroker" />
-        <argument ref="portMapping221" />
-        <argument ref="portMapping121" />
-        <argument ref="portMapping710" />
-    </bean>
-
-    <bean id="crossConnect121" class="org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl121" >
-        <argument ref="deviceTransactionManager" />
-    </bean>
-
-    <bean id="crossConnect221" class="org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl221" >
-        <argument ref="deviceTransactionManager" />
-    </bean>
-
-    <bean id="crossConnect710" class="org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl710" >
-        <argument ref="deviceTransactionManager" />
-    </bean>
-
-    <bean id="crossConnectImpl" class="org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl" >
-        <argument ref="deviceTransactionManager" />
-        <argument ref="mappingUtils" />
-        <argument ref="crossConnect121" />
-        <argument ref="crossConnect221" />
-        <argument ref="crossConnect710" />
-    </bean>
-
-    <service ref="deviceTransactionManager" interface="org.opendaylight.transportpce.common.device.DeviceTransactionManager" />
-
-    <service ref="networkTransactionImpl" interface="org.opendaylight.transportpce.common.network.NetworkTransactionService" />
-
-    <service ref="openRoadmInterfaces" interface="org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces" />
-
-    <service ref="portMapping" interface="org.opendaylight.transportpce.common.mapping.PortMapping" />
-
-    <service ref="crossConnectImpl" interface="org.opendaylight.transportpce.common.crossconnect.CrossConnect" />
-
-    <service ref="mappingUtils" interface="org.opendaylight.transportpce.common.mapping.MappingUtils" />
-
-</blueprint>
index bc02b76c9928de7501c0d44ea75d0a86f14c06a5..f3f07db72c245026b8c7505ebae93e67e0eb0c17 100644 (file)
@@ -8,50 +8,37 @@
 
 package org.opendaylight.transportpce.common;
 
-import java.util.Arrays;
-import java.util.Collection;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
-@RunWith(Parameterized.class)
-public class NodeIdPairTest {
-
-    private NodeIdPair firstPair;
-    private Object secondPair;
-    private boolean equality;
+import java.util.stream.Stream;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
 
-    public NodeIdPairTest(NodeIdPair firstPair, Object secondPair, boolean equality) {
-        this.firstPair = firstPair;
-        this.secondPair = secondPair;
-        this.equality = equality;
-    }
+public class NodeIdPairTest {
 
-    @Parameterized.Parameters
-    public static Collection<?> nodes() {
+    private static Stream<Arguments> provideNodeSamples() {
         NodeIdPair same = new NodeIdPair("nodeS", "CLIENT");
-        return Arrays.asList(new Object[][] {
-                { new NodeIdPair("",""), null, false },
-                { new NodeIdPair("",""), "", false },
-                { new NodeIdPair("node1","PP"), new NodeIdPair("node2","PP"), false },
-                { new NodeIdPair("node1","PP"), new NodeIdPair("node1","TTP"), false },
-                { new NodeIdPair(null,"PP"), new NodeIdPair(null,"TTP"), false },
-                { new NodeIdPair(null,"PP"), new NodeIdPair("node2","TTP"), false },
-                { new NodeIdPair("node1",null), new NodeIdPair("node1","NETWORK"), false },
-                { new NodeIdPair("node1",null), new NodeIdPair("node1",null), true },
-                { new NodeIdPair("node1","TTP"), new NodeIdPair("node1","TTP"), true },
-                { new NodeIdPair(null,null), new NodeIdPair(null,null), true },
-                {same, same, true}
-        });
+        return Stream.of(
+            Arguments.of(new NodeIdPair("",""), null, false),
+            Arguments.of(new NodeIdPair("",""), "", false),
+            Arguments.of(new NodeIdPair("node1","PP"), new NodeIdPair("node2","PP"), false),
+            Arguments.of(new NodeIdPair("node1","PP"), new NodeIdPair("node1","TTP"), false),
+            Arguments.of(new NodeIdPair(null,"PP"), new NodeIdPair(null,"TTP"), false),
+            Arguments.of(new NodeIdPair(null,"PP"), new NodeIdPair("node2","TTP"), false),
+            Arguments.of(new NodeIdPair("node1",null), new NodeIdPair("node1","NETWORK"), false),
+            Arguments.of(new NodeIdPair("node1",null), new NodeIdPair("node1",null), true),
+            Arguments.of(new NodeIdPair("node1","TTP"), new NodeIdPair("node1","TTP"), true),
+            Arguments.of(new NodeIdPair(null,null), new NodeIdPair(null,null), true),
+            Arguments.of(same, same, true));
     }
 
-    @Test
-    public void equalityTest() {
-        Assert.assertEquals(this.equality, firstPair.equals(this.secondPair));
-        if ((this.secondPair != null) && this.firstPair.getClass().equals(this.secondPair.getClass())) {
-            Assert.assertEquals(this.equality, this.firstPair.hashCode() == this.secondPair.hashCode());
+    @ParameterizedTest
+    @MethodSource("provideNodeSamples")
+    void equalityTest(NodeIdPair firstPair, Object secondPair, boolean equality) {
+        assertEquals(equality, firstPair.equals(secondPair));
+        if ((secondPair != null) && firstPair.getClass().equals(secondPair.getClass())) {
+            assertEquals(equality, firstPair.hashCode() == secondPair.hashCode());
         }
     }
-
 }
diff --git a/common/src/test/java/org/opendaylight/transportpce/common/catalog/CatalogUtilsTest.java b/common/src/test/java/org/opendaylight/transportpce/common/catalog/CatalogUtilsTest.java
new file mode 100644 (file)
index 0000000..e1d9778
--- /dev/null
@@ -0,0 +1,336 @@
+/*
+ * Copyright © 2022 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.common.catalog;
+
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import org.eclipse.jdt.annotation.NonNull;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.transportpce.common.StringConstants;
+import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
+import org.opendaylight.transportpce.test.AbstractTest;
+import org.opendaylight.transportpce.test.converter.DataObjectConverter;
+import org.opendaylight.transportpce.test.converter.JSONDataObjectConverter;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.OperationalModeCatalog;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CatalogUtilsTest extends AbstractTest {
+    private static final Logger LOG = LoggerFactory.getLogger(CatalogUtilsTest.class);
+    private static final String CATALOG_FILE = "src/test/resources/apidocCatalog12_0-OptSpecV5_1.json";
+
+    private static OperationalModeCatalog omCatalog;
+    private static Map<String, Double> outputImpairments = new HashMap<>();
+
+    @BeforeAll
+    static void setUp() throws InterruptedException,
+        ExecutionException {
+        DataObjectConverter dataObjectConverter = JSONDataObjectConverter
+            .createWithDataStoreUtil(getDataStoreContextUtil());
+        try (Reader reader = new FileReader(CATALOG_FILE, StandardCharsets.UTF_8)) {
+            NormalizedNode normalizedNode = dataObjectConverter
+                .transformIntoNormalizedNode(reader).orElseThrow();
+            omCatalog = (OperationalModeCatalog) getDataStoreContextUtil()
+                .getBindingDOMCodecServices().fromNormalizedNode(YangInstanceIdentifier
+                    .of(OperationalModeCatalog.QNAME), normalizedNode)
+                .getValue();
+            @NonNull
+            WriteTransaction newWriteOnlyTransaction = getDataBroker().newWriteOnlyTransaction();
+            newWriteOnlyTransaction
+                .put(LogicalDatastoreType.CONFIGURATION,
+                    InstanceIdentifier.create(OperationalModeCatalog.class),
+                    omCatalog);
+            newWriteOnlyTransaction.commit().get();
+        } catch (IOException e) {
+            LOG.error("Cannot load OpenROADM part of Operational Mode Catalog ", e);
+            fail("Cannot load openROADM operational modes ");
+        }
+    }
+
+    @Test
+    void catalogPrimitivesTest() {
+        NetworkTransactionService netTransServ = new NetworkTransactionImpl(getDataBroker());
+        CatalogUtils catalogUtils = new CatalogUtils(netTransServ);
+        assertEquals(
+            CatalogConstant.MWWRCORE,
+            catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.ADD,
+                StringConstants.SERVICE_TYPE_100GE_T),
+            "Checking retrieval of Operational Mode from Node Type ADD");
+        assertEquals(
+            CatalogConstant.MWWRCORE,
+            catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.DROP,
+                StringConstants.SERVICE_TYPE_100GE_T),
+            "Checking retrieval of Operational Mode from Node Type DROP");
+        assertEquals(
+            CatalogConstant.MWMWCORE,
+            catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.EXPRESS,
+                StringConstants.SERVICE_TYPE_100GE_T),
+            "Checking retrieval of Operational Mode from Node Type EXPRESS");
+        assertEquals(
+            CatalogConstant.MWISTANDARD,
+            catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.AMP,
+                StringConstants.SERVICE_TYPE_100GE_T),
+            "Checking retrieval of Operational Mode from Node Type AMP");
+        assertEquals(
+            CatalogConstant.ORW100GSC,
+            catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
+                StringConstants.SERVICE_TYPE_100GE_T),
+            "Checking retrieval of Operational Mode from Node Type and service Type 100GE");
+        assertEquals(
+            CatalogConstant.ORW100GSC,
+            catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
+                StringConstants.SERVICE_TYPE_OTU4),
+            "Checking retrieval of Operational Mode from Node Type and service Type OTU4");
+        assertEquals(
+            CatalogConstant.ORW200GOFEC316GBD,
+            catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
+                StringConstants.SERVICE_TYPE_OTUC2),
+            "Checking retrieval of Operational Mode from Node Type and service Type OTUC2");
+        assertEquals(
+            CatalogConstant.ORW300GOFEC631GBD,
+            catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
+                StringConstants.SERVICE_TYPE_OTUC3),
+            "Checking retrieval of Operational Mode from Node Type and service Type OTUC3");
+        assertEquals(
+            CatalogConstant.ORW400GOFEC631GBD,
+            catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
+                StringConstants.SERVICE_TYPE_400GE),
+            "Checking retrieval of Operational Mode from Node Type and service Type 400GE");
+        assertEquals(
+            CatalogConstant.ORW400GOFEC631GBD,
+            catalogUtils.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP,
+                StringConstants.SERVICE_TYPE_OTUC4),
+            "Checking retrieval of Operational Mode from Node Type and service Type OTUC4");
+        assertEquals(
+            50.0,
+            catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW100GSC),
+            0.005,
+            "Checking retrieval of channel spacing from Operational Mode 100G SC FEC");
+        assertEquals(
+            50.0,
+            catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW100GOFEC316GBD),
+            0.005,
+            "Checking retrieval of channel spacing from Operational Mode 100G OFEC 31.6");
+        assertEquals(
+            50.0,
+            catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW200GOFEC316GBD),
+            0.005,
+            "Checking retrieval of channel spacing from Operational Mode 200G OFEC 31.6");
+        assertEquals(
+            87.5,
+            catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW200GOFEC631GBD),
+            0.005,
+            "Checking retrieval of channel spacing from Operational Mode 200G OFEC 63.1");
+        assertEquals(
+            87.5,
+            catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW300GOFEC631GBD),
+            0.005,
+            "Checking retrieval of channel spacing from Operational Mode 300G OFEC 63.1 GBd");
+        assertEquals(
+            87.5,
+            catalogUtils.getPceTxTspChannelSpacing(CatalogConstant.ORW400GOFEC631GBD),
+            0.005,
+            "Checking retrieval of channel spacing from Operational Mode 400G OFEC 63.1 Gbd");
+        assertEquals(
+            1345.6,
+            catalogUtils.getPceTxTspParameters(CatalogConstant.ORW100GSC, CatalogConstant.MWWRCORE) * 1000000.0,
+            0.5,
+            "Checking 100GSCFEC ONSR Lin");
+        assertEquals(
+            450.7,
+            catalogUtils.getPceTxTspParameters(CatalogConstant.ORW100GOFEC316GBD, CatalogConstant.MWWRCORE) * 1000000.0,
+            0.5,
+            "Checking 100G OFEC 31.6 Gbauds ONSR Lin");
+        assertEquals(
+            450.7,
+            catalogUtils.getPceTxTspParameters(CatalogConstant.ORW200GOFEC316GBD, CatalogConstant.MWWRCORE) * 1000000.0,
+            0.5,
+            "Checking 200G OFEC 31.6 Gbauds ONSR Lin");
+        assertEquals(
+            450.7,
+            catalogUtils.getPceTxTspParameters(CatalogConstant.ORW200GOFEC631GBD, CatalogConstant.MWWRCORE) * 1000000.0,
+            0.5,
+            "Checking 200G OFEC 63.1 Gbauds ONSR Lin");
+        assertEquals(
+            450.7,
+            catalogUtils.getPceTxTspParameters(CatalogConstant.ORW300GOFEC631GBD, CatalogConstant.MWWRCORE) * 1000000.0,
+            0.5,
+            "Checking 300G OFEC 63.1 Gbauds ONSR Lin");
+        assertEquals(
+            450.7,
+            catalogUtils.getPceTxTspParameters(CatalogConstant.ORW400GOFEC631GBD, CatalogConstant.MWWRCORE) * 1000000.0,
+            0.5,
+            "Checking 400G OFEC 63.1 Gbauds ONSR Lin");
+        assertEquals(
+            0.0, catalogUtils.getPceTxTspParameters("SPE-non-existing-mode", CatalogConstant.MWWRCORE) * 1000000.0,
+            0.0,
+            "Checking ONSR Lin = 0 for non valid OM");
+        assertEquals(
+            -9996.9,
+            catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GSC, 18001.0, 0.0, 0.0, 20.0),
+            0.5,
+            "Checking 100GSCFEC RX margin OOR due to CD");
+        assertEquals(
+            -9996.9,
+            catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GSC, 0.0, 30.1, 0.0, 20.0),
+            0.5,
+            "Checking 100GSCFEC RX margin OOR due to PMD");
+        assertEquals(
+            0.0,
+            catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GSC, 0.0, 0.0, 6.0, 20.0),
+            0.5,
+            "Checking 100GSCFEC RX margin OOR due to PDL");
+        assertEquals(
+            0.0,
+            catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GSC, 17999.0, 29.9, 6.0, 20.0),
+            0.05,
+            "Checking 100GSCFEC RX margin in Range at max tolerated penalty");
+        assertEquals(
+            -9996.9,
+            catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 12001.0, 0.0, 0.0, 27.0),
+            0.5,
+            "Checking 400G OFEC 63.1 Gbauds RX margin OOR due to CD");
+        assertEquals(
+            -9996.9,
+            catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 0.0, 20.1, 0.0, 27.0),
+            0.5,
+            "Checking 400G OFEC 63.1 Gbauds RX margin OOR due to PMD");
+        assertEquals(
+            0.0,
+            catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 0.0, 0.0, 6.0, 27.0),
+            0.5,
+            "Checking 400G OFEC 63.1 Gbauds RX margin OOR due to PDL");
+        assertEquals(
+            0.5,
+            catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 11999.0, 19.9, 5.0, 28.0),
+            0.05,
+            "Checking 400G OFEC 63.1 Gbauds RX margin in Range at max tolerated penalty");
+        assertEquals(
+            0.5,
+            catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 3999.0, 9.9, 2.0, 25.5),
+            0.05,
+            "Checking 400G OFEC 63.1 Gbauds RX margin in Range at intermediate tolerated penalty");
+        assertEquals(
+            0.5,
+            catalogUtils.getPceRxTspParameters(CatalogConstant.ORW400GOFEC631GBD, 3999.0, 9.9, 1.0, 25.0),
+            0.05,
+            "Checking 400G OFEC 63.1 Gbauds RX margin in Range at min tolerated penalty");
+        assertEquals(
+            0.5,
+            catalogUtils.getPceRxTspParameters(CatalogConstant.ORW300GOFEC631GBD, 17999.0, 24.9, 5.0, 25.0),
+            0.05,
+            "Checking 300G OFEC 63.1 Gbauds RX margin in Range at max tolerated penalty");
+        assertEquals(
+            0.5,
+            catalogUtils.getPceRxTspParameters(CatalogConstant.ORW300GOFEC631GBD, 3999.0, 9.9, 1.0, 22.0),
+            0.05,
+            "Checking 300G OFEC 63.1 Gbauds RX margin in Range at min tolerated penalty");
+        assertEquals(
+            0.5,
+            catalogUtils.getPceRxTspParameters(CatalogConstant.ORW200GOFEC631GBD, 23999.0, 24.9, 5.0, 21.0),
+            0.05,
+            "Checking 200G OFEC 63.1 Gbauds RX margin in Range at max tolerated penalty");
+        assertEquals(
+            0.5,
+            catalogUtils.getPceRxTspParameters(CatalogConstant.ORW200GOFEC631GBD, 3999.0, 9.9, 1.0, 18.0),
+            0.05,
+            "Checking 200G OFEC 63.1 Gbauds RX margin in Range at min tolerated penalty");
+        assertEquals(
+            0.5,
+            catalogUtils.getPceRxTspParameters(CatalogConstant.ORW200GOFEC316GBD, 23999.0, 29.9, 5.0, 24.5),
+            0.05,
+            "Checking 200G OFEC 31.6 Gbauds RX margin in Range at max tolerated penalty");
+        assertEquals(
+            0.5,
+            catalogUtils.getPceRxTspParameters(CatalogConstant.ORW200GOFEC316GBD, 3999.0, 9.9, 1.0, 21.5),
+            0.05,
+            "Checking 200G OFEC 31.6 Gbauds RX margin in Range at min tolerated penalty");
+        assertEquals(
+            0.5,
+            catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GOFEC316GBD, 47999.0, 29.9, 5.0, 16.0),
+            0.05,
+            "Checking 100G OFEC 31.6 Gbauds RX margin in Range at max tolerated penalty");
+        assertEquals(
+            0.5,
+            catalogUtils.getPceRxTspParameters(CatalogConstant.ORW100GOFEC316GBD, 3999.0, 9.9, 1.0, 13.0),
+            0.05,
+            "Checking 100G OFEC 31.6 Gbauds RX margin in Range at min tolerated penalty");
+        assertEquals(
+            -9999.9,
+            catalogUtils.getPceRxTspParameters("SPE-non-existing-mode", 0.0, 0.0, 0.0, 30.0),
+            0.05,
+            "Checking Margin negative for non valid OM");
+        outputImpairments.put("CD", 1025.0);
+        outputImpairments.put("DGD2", 18.0);
+        outputImpairments.put("PDL2", 4.4);
+        outputImpairments.put("ONSRLIN", 0.0016307685044580757);
+        // check how to add Delta on an object<String, Double>
+        assertEquals(
+            outputImpairments,
+            catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.EXPRESS, CatalogConstant.MWMWCORE,
+                -15.0, 1000.0, 9.0, 4.0, 0.001000, 50.0),
+            "Checking ROADM Express path contribution to impairments ");
+        outputImpairments.put("ONSRLIN", 0.0014729700859390747);
+        assertEquals(
+            outputImpairments,
+            catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.EXPRESS, CatalogConstant.MWMWCORE,
+                -15.0, 1000.0, 9.0, 4.0, 0.001000, 87.5),
+            "Checking ROADM Express path contribution to impairments with 87.5 GHz spacing");
+        outputImpairments.put("ONSRLIN", 0.0015011872336272727);
+        assertEquals(
+            outputImpairments,
+            catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.ADD, CatalogConstant.MWWRCORE,
+                -15.0, 1000.0, 9.0, 4.2, 0.001, 50.0),
+            "Checking ROADM Add path contribution to impairments");
+        outputImpairments.put("ONSRLIN", 0.0016307685044580757);
+        assertEquals(
+            outputImpairments,
+            catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.DROP, CatalogConstant.MWWRCORE,
+                -15.0, 1000.0, 9.0, 4.2, 0.001, 50.0),
+            "Checking ROADM Drop path contribution to impairments");
+        outputImpairments.put("ONSRLIN", 0.0015010372326658581);
+        assertEquals(
+            outputImpairments,
+            catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.AMP, CatalogConstant.MWISTANDARD,
+                -15.0, 1025.0, 9.0, 4.36, 0.001, 50.0),
+            "Checking Amp path contribution to impairments");
+        assertEquals(
+            true,
+            catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.AMP, "ThisIsNotAValidMode",
+                -15.0,1000.0, 0.0, 0.0, 0.001, 50.0).isEmpty(),
+            "Checking empty map returned in case wrong Operational mode provided ");
+        outputImpairments.put("ONSRLIN", 1.0);
+        assertEquals(
+            true,
+            catalogUtils.getPceRoadmAmpParameters(CatalogConstant.CatalogNodeType.AMP, "OR-InvalidMode",
+                -15.0, 1025.0, 18.0, 6.25, 0.001, 50.0).isEmpty(),
+            "Checking empty map returned in case wrong Operational mode provided");
+        assertEquals(
+            0.000114266642501745,
+            catalogUtils.calculateNLonsrContribution(2, 70, 87.5),
+            0.000000005,
+            "Checking Non Linear contribution calculation");
+    }
+}
index 085f57e40caf4e51eac2f7d067ba2e4a1bc6f5e6..1f66142b9ed3e068c3e1fc9966334dd7aedf0d5d 100644 (file)
@@ -7,9 +7,10 @@
  */
 package org.opendaylight.transportpce.common.converter;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.FileReader;
 import java.io.IOException;
@@ -17,7 +18,7 @@ import java.io.Reader;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.transportpce.test.AbstractTest;
 import org.opendaylight.transportpce.test.converter.JSONDataObjectConverter;
 import org.opendaylight.yang.gen.v1.gnpy.gnpy.api.rev220221.Request;
@@ -28,10 +29,9 @@ import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
 public class JsonStringConverterTest extends AbstractTest {
 
     @Test
-    public void createJsonStringFromDataObjectTest() {
+    void createJsonStringFromDataObjectTest() {
         try (Reader reader = new FileReader("src/test/resources/gnpy_request.json", StandardCharsets.UTF_8)) {
             assertEquals(
-                "Should be a valid request",
                 Files.readString(Paths.get("src/test/resources/expected_string.json")),
                 new JsonStringConverter<Request>(getDataStoreContextUtil().getBindingDOMCodecServices())
                     .createJsonStringFromDataObject(
@@ -44,22 +44,23 @@ public class JsonStringConverterTest extends AbstractTest {
                                 JSONDataObjectConverter
                                     .createWithDataStoreUtil(getDataStoreContextUtil())
                                     .transformIntoNormalizedNode(reader)
-                                    .get())
+                                    .orElseThrow())
                             .getValue(),
-                        JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02));
+                        JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02),
+                "Should be a valid request");
         } catch (IOException e) {
             fail("Cannot load path description ");
         }
     }
 
     @Test
-    public void createDataObjectFromJsonStringTest() throws IOException {
+    void createDataObjectFromJsonStringTest() throws IOException {
         assertNotNull(
-            "Should not be null",
             new JsonStringConverter<Request>(getDataStoreContextUtil().getBindingDOMCodecServices())
                 .createDataObjectFromJsonString(
                     YangInstanceIdentifier.of(Request.QNAME),
                     Files.readString(Paths.get("src/test/resources/expected_string.json")),
-                    JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02));
+                    JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02),
+            "Should not be null");
     }
 }
index 09fe8e4bfca6365b15ca2930292ca51ee74d49eb..6c247be1ae5dd5f1ea7a9076d068e022dd9f7ae3 100644 (file)
@@ -8,17 +8,19 @@
 
 package org.opendaylight.transportpce.common.crossconnect;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
+import static org.opendaylight.mdsal.common.api.CommitInfo.emptyFluentFuture;
 
-import java.math.BigDecimal;
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mockito;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.MountPoint;
 import org.opendaylight.mdsal.binding.api.MountPointService;
@@ -30,13 +32,17 @@ import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl;
 import org.opendaylight.transportpce.common.fixedflex.SpectrumInformation;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.OpticalControlMode;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.OrgOpenroadmDevice;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.RoadmConnections;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.RoadmConnectionsBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.RoadmConnectionsKey;
 import org.opendaylight.yangtools.util.concurrent.FluentFutures;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.Uint32;
 
+
 public class CrossConnectImpl121Test {
     private CrossConnectImpl121 crossConnectImpl121 = null;
     private DeviceTransactionManager deviceTransactionManager = null;
@@ -45,16 +51,18 @@ public class CrossConnectImpl121Test {
     private MountPoint mountPointMock = mock(MountPoint.class);
     private DataBroker dataBrokerMock = mock(DataBroker.class);
     private ReadWriteTransaction rwTransactionMock = mock(ReadWriteTransaction.class);
+    private DeviceTransaction deviceTransaction = mock(DeviceTransaction.class);
 
-    @Before
-    public void setup() {
+    @BeforeEach
+    void setup() {
         deviceTransactionManager = mock(DeviceTransactionManager.class);
         crossConnectImpl121 = new CrossConnectImpl121(deviceTransactionManager);
 
         //mock responses for deviceTransactionManager calls
-        InstanceIdentifier<RoadmConnections> deviceIID =
-                InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                        .child(RoadmConnections.class, new RoadmConnectionsKey("1"));
+        InstanceIdentifier<RoadmConnections> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(RoadmConnections.class, new RoadmConnectionsKey("1"))
+            .build();
         when(deviceTransactionManager.getDataFromDevice("deviceId",
                 LogicalDatastoreType.OPERATIONAL, deviceIID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
@@ -62,18 +70,18 @@ public class CrossConnectImpl121Test {
     }
 
     @Test
-    public void getCrossConnectTest() {
+    void getCrossConnectTest() {
         Optional<RoadmConnections> res =
                 crossConnectImpl121.getCrossConnect("deviceId", "1");
-        Assert.assertTrue("Optional object should have a value", res.isPresent());
+        assertTrue(res.isPresent(), "Optional object should have a value");
     }
 
     @Test
-    public void postCrossConnectTest() {
-        Mockito.when(mountPointServiceMock.getMountPoint(any())).thenReturn(Optional.of(mountPointMock));
-        Mockito.when(mountPointMock.getService(any())).thenReturn(Optional.of(dataBrokerMock));
-        Mockito.when(dataBrokerMock.newReadWriteTransaction()).thenReturn(rwTransactionMock);
-        Mockito.when(rwTransactionMock.commit()).thenReturn(FluentFutures.immediateNullFluentFuture());
+    void postCrossConnectTest() {
+        when(mountPointServiceMock.getMountPoint(any())).thenReturn(Optional.of(mountPointMock));
+        when(mountPointMock.getService(any())).thenReturn(Optional.of(dataBrokerMock));
+        when(dataBrokerMock.newReadWriteTransaction()).thenReturn(rwTransactionMock);
+        when(rwTransactionMock.commit()).thenReturn(FluentFutures.immediateNullFluentFuture());
         deviceTransactionManager = new DeviceTransactionManagerImpl(mountPointServiceMock, 3000);
         crossConnectImpl121 = new CrossConnectImpl121(deviceTransactionManager);
         SpectrumInformation spectrumInformation = new SpectrumInformation();
@@ -81,24 +89,23 @@ public class CrossConnectImpl121Test {
         spectrumInformation.setLowerSpectralSlotNumber(761);
         spectrumInformation.setHigherSpectralSlotNumber(768);
         Optional<String> res = crossConnectImpl121.postCrossConnect("deviceId", "srcTp", "destTp", spectrumInformation);
-        Assert.assertEquals(res.get(), "srcTp-destTp-761:768");
+        assertEquals(res.orElseThrow(), "srcTp-destTp-761:768");
     }
 
-    // TODO : fix commit
-    @Test(expected = NullPointerException.class)
-    public void setPowerLevelTest() {
-        InstanceIdentifier<RoadmConnections> deviceIID =
-                InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                        .child(RoadmConnections.class, new RoadmConnectionsKey("1"));
+    @Test
+    void setPowerLevelTest() {
+        InstanceIdentifier<RoadmConnections> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(RoadmConnections.class, new RoadmConnectionsKey("1"))
+            .build();
         when(deviceTransactionManager.getDataFromDevice("deviceId",
                 LogicalDatastoreType.OPERATIONAL, deviceIID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
-            .thenReturn(Optional.of(mock(RoadmConnections.class)));
-
-        Mockito.when(deviceTransactionManager.getDeviceTransaction("deviceId"))
-            .thenReturn(CompletableFuture.completedFuture(Optional.of(mock(DeviceTransaction.class))));
-        crossConnectImpl121.setPowerLevel("deviceId", OpticalControlMode.Power, new BigDecimal(100), "1");
-
-        Assert.assertTrue("set Level should be true", true);
+            .thenReturn(Optional.of(new RoadmConnectionsBuilder().setConnectionNumber("1").build()));
+        when(deviceTransactionManager.getDeviceTransaction("deviceId"))
+            .thenReturn(CompletableFuture.completedFuture(Optional.of(deviceTransaction)));
+        doReturn(emptyFluentFuture()).when(deviceTransaction).commit(anyLong(), any());
+        crossConnectImpl121.setPowerLevel("deviceId", OpticalControlMode.Power, Decimal64.valueOf("100"), "1");
+        assertTrue(true, "set Level should be true");
     }
 }
index e2a3c55b78a8619f358ab785868ba0ca12c2d350..03735fdd2d536c9c4f56611d187067aeda0863c9 100644 (file)
@@ -8,16 +8,20 @@
 
 package org.opendaylight.transportpce.common.crossconnect;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+import static org.opendaylight.mdsal.common.api.CommitInfo.emptyFluentFuture;
 
-import java.math.BigDecimal;
 import java.util.List;
 import java.util.Optional;
 import java.util.concurrent.CompletableFuture;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.MountPoint;
@@ -30,12 +34,15 @@ import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl;
 import org.opendaylight.transportpce.common.fixedflex.SpectrumInformation;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.OpticalControlMode;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.OrgOpenroadmDevice;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.RoadmConnections;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.RoadmConnectionsBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.RoadmConnectionsKey;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.otn.renderer.nodes.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.otn.renderer.nodes.Nodes;
 import org.opendaylight.yangtools.util.concurrent.FluentFutures;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.Uint32;
 
 public class CrossConnectImpl221Test {
@@ -46,37 +53,38 @@ public class CrossConnectImpl221Test {
     private MountPoint mountPointMock = mock(MountPoint.class);
     private DataBroker dataBrokerMock = mock(DataBroker.class);
     private ReadWriteTransaction rwTransactionMock = mock(ReadWriteTransaction.class);
+    private DeviceTransaction deviceTransaction = mock(DeviceTransaction.class);
 
-    @Before
-    public void setup() {
+    @BeforeEach
+    void setup() {
         deviceTransactionManager = mock(DeviceTransactionManager.class);
         crossConnectImpl221 = new CrossConnectImpl221(deviceTransactionManager);
 
         //mock responses for deviceTransactionManager calls
-        InstanceIdentifier<RoadmConnections> deviceIID =
-                InstanceIdentifier
-                        .create(OrgOpenroadmDevice.class)
-                        .child(RoadmConnections.class, new RoadmConnectionsKey("1"));
+        InstanceIdentifier<RoadmConnections> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(RoadmConnections.class, new RoadmConnectionsKey("1"))
+            .build();
 
-        Mockito.when(deviceTransactionManager.getDataFromDevice("deviceId",
+        when(deviceTransactionManager.getDataFromDevice("deviceId",
                 LogicalDatastoreType.CONFIGURATION, deviceIID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
             .thenReturn(Optional.of(mock(RoadmConnections.class)));
     }
 
     @Test
-    public void getCrossConnectTest() {
+    void getCrossConnectTest() {
         Optional<RoadmConnections> res =
                 crossConnectImpl221.getCrossConnect("deviceId", "1");
-        Assert.assertTrue("Optional object should have a value", res.isPresent());
+        assertTrue(res.isPresent(), "Optional object should have a value");
     }
 
     @Test
-    public void postCrossConnectTest() {
-        Mockito.when(mountPointServiceMock.getMountPoint(any())).thenReturn(Optional.of(mountPointMock));
-        Mockito.when(mountPointMock.getService(any())).thenReturn(Optional.of(dataBrokerMock));
-        Mockito.when(dataBrokerMock.newReadWriteTransaction()).thenReturn(rwTransactionMock);
-        Mockito.when(rwTransactionMock.commit()).thenReturn(FluentFutures.immediateNullFluentFuture());
+    void postCrossConnectTest() {
+        when(mountPointServiceMock.getMountPoint(any())).thenReturn(Optional.of(mountPointMock));
+        when(mountPointMock.getService(any())).thenReturn(Optional.of(dataBrokerMock));
+        when(dataBrokerMock.newReadWriteTransaction()).thenReturn(rwTransactionMock);
+        when(rwTransactionMock.commit()).thenReturn(FluentFutures.immediateNullFluentFuture());
         deviceTransactionManager = new DeviceTransactionManagerImpl(mountPointServiceMock, 3000);
         crossConnectImpl221 = new CrossConnectImpl221(deviceTransactionManager);
         SpectrumInformation spectrumInformation = new SpectrumInformation();
@@ -84,33 +92,35 @@ public class CrossConnectImpl221Test {
         spectrumInformation.setLowerSpectralSlotNumber(761);
         spectrumInformation.setHigherSpectralSlotNumber(768);
         Optional<String> res = crossConnectImpl221.postCrossConnect("deviceId", "srcTp", "destTp", spectrumInformation);
-        Assert.assertEquals(res.get(), "srcTp-destTp-761:768");
+        assertEquals(res.orElseThrow(), "srcTp-destTp-761:768");
     }
 
-    @Test(expected = NullPointerException.class)
-    public void setPowerLevelTest() {
-        InstanceIdentifier<RoadmConnections> deviceIID =
-                InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                        .child(RoadmConnections.class, new RoadmConnectionsKey("1"));
-        Mockito.when(deviceTransactionManager.getDataFromDevice("deviceId",
-                LogicalDatastoreType.OPERATIONAL, deviceIID,
+    @Test
+    void setPowerLevelTest() {
+        InstanceIdentifier<RoadmConnections> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(RoadmConnections.class, new RoadmConnectionsKey("1"))
+            .build();
+        when(deviceTransactionManager.getDataFromDevice("deviceId",
+                LogicalDatastoreType.CONFIGURATION, deviceIID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
-            .thenReturn(Optional.of(mock(RoadmConnections.class)));
+            .thenReturn(Optional.of(new RoadmConnectionsBuilder().setConnectionName("1").build()));
 
-        Mockito.when(deviceTransactionManager.getDeviceTransaction("deviceId"))
-            .thenReturn(CompletableFuture.completedFuture(Optional.of(mock(DeviceTransaction.class))));
-        crossConnectImpl221.setPowerLevel("deviceId", OpticalControlMode.GainLoss, new BigDecimal(100), "1");
-
-        Assert.assertTrue("set Level should be true", true);
+        when(deviceTransactionManager.getDeviceTransaction("deviceId"))
+            .thenReturn(CompletableFuture.completedFuture(Optional.of(deviceTransaction)));
+        doReturn(emptyFluentFuture()).when(deviceTransaction).commit(anyLong(), any());
+        crossConnectImpl221.setPowerLevel("deviceId", OpticalControlMode.GainLoss, Decimal64.valueOf("100"), "1");
+        assertTrue(true, "set Level should be true");
     }
 
-    @Test(expected = NullPointerException.class)
-    public void postOtnCrossConnect() {
+    @Test
+    void postOtnCrossConnect() {
         Nodes nodes = Mockito.mock(Nodes.class);
-        Mockito.when(nodes.getNodeId()).thenReturn("nodeId");
-        Mockito.when(deviceTransactionManager.getDeviceTransaction(any()))
-            .thenReturn(CompletableFuture.completedFuture(Optional.of(mock(DeviceTransaction.class))));
+        when(nodes.getNodeId()).thenReturn("nodeId");
+        when(deviceTransactionManager.getDeviceTransaction(any()))
+            .thenReturn(CompletableFuture.completedFuture(Optional.of(deviceTransaction)));
+        doReturn(emptyFluentFuture()).when(deviceTransaction).commit(anyLong(), any());
         Optional<String> res = crossConnectImpl221.postOtnCrossConnect(List.of("src1", "src2"), nodes);
-        Assert.assertTrue("Optional value should have a value", res.isPresent());
+        assertTrue(res.isPresent(), "Optional value should have a value");
     }
 }
index 7d6bb2a965e510ac8bdda569c40387ad69ff8906..d3b2f9637d2cf12260c54767cfb588a30d95076a 100644 (file)
 
 package org.opendaylight.transportpce.common.crossconnect;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
+import static org.opendaylight.transportpce.common.StringConstants.OPENROADM_DEVICE_VERSION_1_2_1;
+import static org.opendaylight.transportpce.common.StringConstants.OPENROADM_DEVICE_VERSION_2_2_1;
 
-import java.math.BigDecimal;
 import java.util.List;
 import java.util.Optional;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.common.fixedflex.SpectrumInformation;
 import org.opendaylight.transportpce.common.mapping.MappingUtils;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.RoadmConnections;
-import org.opendaylight.yangtools.yang.common.Uint32;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org.openroadm.device.RoadmConnections;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 
-@Ignore
 public class CrossConnectImplTest {
 
     private CrossConnectImpl crossConnectImpl = null;
-    private static DeviceTransactionManager deviceTransactionManager;
-    private CrossConnectImpl121 crossConnectImpl121 = null;
-    private CrossConnectImpl221 crossConnectImpl221 = null;
-    private CrossConnectImpl710 crossConnectImpl710 = null;
-    private MappingUtils mappingUtils = null;
-
-    @Before
-    public void setUp() {
-        deviceTransactionManager = mock(DeviceTransactionManager.class);
-        crossConnectImpl121 = mock(CrossConnectImpl121.class);
-        crossConnectImpl221 = mock(CrossConnectImpl221.class);
-        crossConnectImpl710 = mock(CrossConnectImpl710.class);
-        mappingUtils = mock(MappingUtils.class);
-        crossConnectImpl =
-                new CrossConnectImpl(deviceTransactionManager, mappingUtils, crossConnectImpl121,
-                    crossConnectImpl221, crossConnectImpl710);
-    }
-
-    @Before
-    public void init() {
-
+    private static DeviceTransactionManager deviceTransactionManager = mock(DeviceTransactionManager.class);
+    private CrossConnectImpl121 crossConnectImpl121 = mock(CrossConnectImpl121.class);
+    private CrossConnectImpl221 crossConnectImpl221 = mock(CrossConnectImpl221.class);
+    private CrossConnectImpl710 crossConnectImpl710 = mock(CrossConnectImpl710.class);
+    private MappingUtils mappingUtils = mock(MappingUtils.class);
+    private SpectrumInformation spectrumInfo = mock(SpectrumInformation.class);
+
+    @BeforeEach
+    void setUp() {
+        crossConnectImpl = new CrossConnectImpl(deviceTransactionManager, mappingUtils, crossConnectImpl121,
+            crossConnectImpl221, crossConnectImpl710);
     }
 
 
     @Test
-    public void getCrossConnect() {
-        Optional<?> res = crossConnectImpl.getCrossConnect("100", "122");
-        Assert.assertFalse("Optional object should be empty",res.isPresent());
-
-        String devV121 = "(http://org/openroadm/device?revision=2017-02-06)org-openroadm-device";
-        when(mappingUtils.getOpenRoadmVersion(any())).thenReturn(devV121);
-        when(crossConnectImpl121.getCrossConnect(any(), any())).thenReturn(Optional.of(mock(RoadmConnections.class)));
-        res = crossConnectImpl.getCrossConnect("100", "122");
-        Assert.assertTrue("Optional object should have a value",res.isPresent());
+    void getCrossConnect() {
+        when(mappingUtils.getOpenRoadmVersion("NodeId")).thenReturn(OPENROADM_DEVICE_VERSION_2_2_1);
+        when(crossConnectImpl221.getCrossConnect(any(), any())).thenReturn(Optional.empty());
+        Optional<?> res = crossConnectImpl.getCrossConnect("NodeId", "122");
+        assertFalse(res.isPresent(), "Optional object should be empty");
+
+        when(mappingUtils.getOpenRoadmVersion(any())).thenReturn(OPENROADM_DEVICE_VERSION_2_2_1);
+        when(crossConnectImpl221.getCrossConnect(any(), any())).thenReturn(Optional.of(mock(RoadmConnections.class)));
+        res = crossConnectImpl.getCrossConnect("NodeId", "122");
+        assertTrue(res.isPresent(), "Optional object should have a value");
     }
 
     @Test
-    public void postCrossConnect() {
-        SpectrumInformation spectrumInformation = new SpectrumInformation();
-        spectrumInformation.setWaveLength(Uint32.valueOf(1));
-        spectrumInformation.setLowerSpectralSlotNumber(761);
-        spectrumInformation.setHigherSpectralSlotNumber(768);
-        Optional<?> res = crossConnectImpl.postCrossConnect("100", "srcTp", "destTp", spectrumInformation);
-        Assert.assertFalse("Optional object should be empty",res.isPresent());
-
-        String devV121 = "(http://org/openroadm/device?revision=2017-02-06)org-openroadm-device";
-        when(mappingUtils.getOpenRoadmVersion(any())).thenReturn(devV121);
-        when(crossConnectImpl121.postCrossConnect(any(), any(), any(), any()))
-                .thenReturn(Optional.of("Value"));
-        res = crossConnectImpl.postCrossConnect("100", "srcTp", "destTp", spectrumInformation);
-        Assert.assertTrue("Optional object should have a value",res.isPresent());
+    void postCrossConnect() {
+        when(mappingUtils.getOpenRoadmVersion(anyString())).thenReturn("bad node version");
+        Optional<?> res = crossConnectImpl.postCrossConnect("nodeId", "srcTp", "destTp", spectrumInfo);
+        assertFalse(res.isPresent(), "Optional object should be empty");
+
+        when(mappingUtils.getOpenRoadmVersion(any())).thenReturn(OPENROADM_DEVICE_VERSION_2_2_1);
+        when(crossConnectImpl221.postCrossConnect(any(), any(), any(), any()))
+                .thenReturn(Optional.of("Connection Number"));
+        res = crossConnectImpl.postCrossConnect("100", "srcTp", "destTp", spectrumInfo);
+        assertTrue(res.isPresent(), "Optional object should have a value");
     }
 
     @Test
-    public void deleteCrossConnect() {
-        List<String> res = crossConnectImpl.deleteCrossConnect("100", "srcTp", true);
-        Assert.assertNull(res);
+    void deleteCrossConnect() {
+        when(mappingUtils.getOpenRoadmVersion(anyString())).thenReturn("bad node version");
+        List<String> res = crossConnectImpl.deleteCrossConnect("nodeId", "100", false);
+        assertNull(res);
 
-        String devV121 = "(http://org/openroadm/device?revision=2017-02-06)org-openroadm-device";
-        when(mappingUtils.getOpenRoadmVersion(any())).thenReturn(devV121);
+        when(mappingUtils.getOpenRoadmVersion(any())).thenReturn(OPENROADM_DEVICE_VERSION_1_2_1);
         when(crossConnectImpl121.deleteCrossConnect(any(), any()))
-                .thenReturn(List.of("val1"));
-        res = crossConnectImpl.deleteCrossConnect("100", "srcTp", true);
-        Assert.assertEquals(res.size(), 1);
+                .thenReturn(List.of("interface1", "interface2"));
+        res = crossConnectImpl.deleteCrossConnect("nodeId", "100", false);
+        assertEquals(res.size(), 2);
     }
 
     @Test
-    public void setPowerLevel() {
-        boolean res = crossConnectImpl.setPowerLevel("100", "srcTp", new BigDecimal(100), "power");
-        Assert.assertFalse("Power Level sgould be false",res);
+    void setPowerLevel() {
+        when(mappingUtils.getOpenRoadmVersion(anyString())).thenReturn(OPENROADM_DEVICE_VERSION_1_2_1);
+        boolean res = crossConnectImpl.setPowerLevel("nodeId", "bad mode", Decimal64.valueOf("1"), "connection number");
+        assertFalse(res, "Power Level sgould be false");
 
-        String devV121 = "(http://org/openroadm/device?revision=2017-02-06)org-openroadm-device";
-        when(mappingUtils.getOpenRoadmVersion(any())).thenReturn(devV121);
+        when(mappingUtils.getOpenRoadmVersion(any())).thenReturn(OPENROADM_DEVICE_VERSION_1_2_1);
         when(crossConnectImpl121.setPowerLevel(any(), any(), any(), any()))
                 .thenReturn(true);
-        //FIXME: this part of the test needs to be reviewed
-        crossConnectImpl.setPowerLevel("100", "srcTp", new BigDecimal(100), "power");
-        Assert.assertTrue(true);
+        crossConnectImpl.setPowerLevel("nodeId", "power", Decimal64.valueOf("1"), "connection number");
+        assertTrue(true);
     }
 }
index f4de527a7a5fac771cb23fcb0e4025b9e0ace51e..556fcc21faa7230b8c9308070c5a8b7dd6501ed2 100644 (file)
@@ -8,7 +8,12 @@
 
 package org.opendaylight.transportpce.common.device;
 
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.lenient;
+import static org.mockito.Mockito.when;
 
 import java.util.LinkedList;
 import java.util.List;
@@ -17,29 +22,27 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
 import org.mockito.Mockito;
-import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.MountPoint;
 import org.opendaylight.mdsal.binding.api.MountPointService;
 import org.opendaylight.mdsal.binding.api.ReadWriteTransaction;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkBuilder;
 import org.opendaylight.yangtools.util.concurrent.FluentFutures;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
-
-@RunWith(MockitoJUnitRunner.class)
+@ExtendWith(MockitoExtension.class)
 public class DeviceTransactionManagerTest {
 
     @Mock
@@ -55,33 +58,34 @@ public class DeviceTransactionManagerTest {
     private DeviceTransactionManagerImpl transactionManager;
     private String defaultDeviceId = "device-id";
     private LogicalDatastoreType defaultDatastore = LogicalDatastoreType.OPERATIONAL;
-    private InstanceIdentifier<Network> defaultIid = InstanceIdentifier.create(Network.class);
+    private InstanceIdentifier<Network> defaultIid = InstanceIdentifier
+        .builder(Networks.class).child(Network.class).build();
     private Network defaultData;
     private long defaultTimeout = 1000;
     private TimeUnit defaultTimeUnit = TimeUnit.MILLISECONDS;
 
-    @Before
-    public void before() {
-        Mockito.when(mountPointServiceMock.getMountPoint(any())).thenReturn(Optional.of(mountPointMock));
-        Mockito.when(mountPointMock.getService(any())).thenReturn(Optional.of(dataBrokerMock));
-        Mockito.when(dataBrokerMock.newReadWriteTransaction()).thenReturn(rwTransactionMock);
-        Mockito.when(rwTransactionMock.commit()).thenReturn(FluentFutures.immediateNullFluentFuture());
+    @BeforeEach
+    void before() {
+        when(mountPointServiceMock.getMountPoint(any())).thenReturn(Optional.of(mountPointMock));
+        when(mountPointMock.getService(any())).thenReturn(Optional.of(dataBrokerMock));
+        when(dataBrokerMock.newReadWriteTransaction()).thenReturn(rwTransactionMock);
+        lenient().when(rwTransactionMock.commit()).thenReturn(FluentFutures.immediateNullFluentFuture());
         NetworkId networkId =  new NetworkId("NETWORK1");
         defaultData = new NetworkBuilder().setNetworkId(networkId).build();
         this.transactionManager = new DeviceTransactionManagerImpl(mountPointServiceMock, 3000);
     }
 
-    @After
-    public void after() {
+    @AfterEach
+    void after() {
         transactionManager.preDestroy();
     }
 
     @Test
-    public void basicPositiveTransactionTest() {
+    void basicPositiveTransactionTest() {
         try {
             putAndSubmit(transactionManager, defaultDeviceId, defaultDatastore, defaultIid, defaultData);
         } catch (InterruptedException | ExecutionException e) {
-            Assert.fail("Exception catched! " + e);
+            fail("Exception catched! " + e);
             return;
         }
 
@@ -90,59 +94,59 @@ public class DeviceTransactionManagerTest {
     }
 
     @Test
-    @Ignore
-    public void advancedPositiveTransactionTest() {
+    void advancedPositiveTransactionTest() {
         try {
             Future<java.util.Optional<DeviceTransaction>> firstDeviceTxFuture =
                     transactionManager.getDeviceTransaction(defaultDeviceId);
-            DeviceTransaction firstDeviceTx = firstDeviceTxFuture.get().get();
+            DeviceTransaction firstDeviceTx = firstDeviceTxFuture.get().orElseThrow();
 
             Future<java.util.Optional<DeviceTransaction>> secondDeviceTxFuture =
                     transactionManager.getDeviceTransaction(defaultDeviceId);
-            Assert.assertFalse(secondDeviceTxFuture.isDone());
+            assertFalse(secondDeviceTxFuture.isDone());
 
             Future<java.util.Optional<DeviceTransaction>> thirdDeviceTxFuture =
                     transactionManager.getDeviceTransaction(defaultDeviceId);
-            Assert.assertFalse(thirdDeviceTxFuture.isDone());
+            assertFalse(thirdDeviceTxFuture.isDone());
 
             firstDeviceTx.put(defaultDatastore, defaultIid, defaultData);
-            Assert.assertFalse(secondDeviceTxFuture.isDone());
-            Assert.assertFalse(thirdDeviceTxFuture.isDone());
+            assertFalse(secondDeviceTxFuture.isDone());
+            assertFalse(thirdDeviceTxFuture.isDone());
             Thread.sleep(200);
-            Assert.assertFalse(secondDeviceTxFuture.isDone());
-            Assert.assertFalse(thirdDeviceTxFuture.isDone());
+            assertFalse(secondDeviceTxFuture.isDone());
+            assertFalse(thirdDeviceTxFuture.isDone());
 
             Future<java.util.Optional<DeviceTransaction>> anotherDeviceTxFuture =
                     transactionManager.getDeviceTransaction("another-id");
-            Assert.assertTrue(anotherDeviceTxFuture.isDone());
-            anotherDeviceTxFuture.get().get().commit(defaultTimeout, defaultTimeUnit);
+            Thread.sleep(50);
+            assertTrue(anotherDeviceTxFuture.isDone());
+            anotherDeviceTxFuture.get().orElseThrow().commit(defaultTimeout, defaultTimeUnit);
 
             firstDeviceTx.commit(defaultTimeout, defaultTimeUnit);
             Thread.sleep(200);
-            Assert.assertTrue(secondDeviceTxFuture.isDone());
-            Assert.assertFalse(thirdDeviceTxFuture.isDone());
+            assertTrue(secondDeviceTxFuture.isDone());
+            assertFalse(thirdDeviceTxFuture.isDone());
 
-            DeviceTransaction secondDeviceTx = secondDeviceTxFuture.get().get();
+            DeviceTransaction secondDeviceTx = secondDeviceTxFuture.get().orElseThrow();
             secondDeviceTx.put(defaultDatastore, defaultIid, defaultData);
-            Assert.assertFalse(thirdDeviceTxFuture.isDone());
+            assertFalse(thirdDeviceTxFuture.isDone());
 
             secondDeviceTx.commit(defaultTimeout, defaultTimeUnit);
             Thread.sleep(200);
-            Assert.assertTrue(thirdDeviceTxFuture.isDone());
+            assertTrue(thirdDeviceTxFuture.isDone());
 
-            DeviceTransaction thirdDeviceTx = thirdDeviceTxFuture.get().get();
+            DeviceTransaction thirdDeviceTx = thirdDeviceTxFuture.get().orElseThrow();
             thirdDeviceTx.put(defaultDatastore, defaultIid, defaultData);
             thirdDeviceTx.commit(defaultTimeout, defaultTimeUnit);
 
             Mockito.verify(rwTransactionMock, Mockito.times(3)).put(defaultDatastore, defaultIid, defaultData);
             Mockito.verify(rwTransactionMock, Mockito.times(4)).commit();
         } catch (InterruptedException | ExecutionException e) {
-            Assert.fail("Exception catched! " + e);
+            fail("Exception catched! " + e);
         }
     }
 
     @Test
-    public void bigAmountOfTransactionsOnSameDeviceTest() {
+    void bigAmountOfTransactionsOnSameDeviceTest() {
         int numberOfTxs = 100;
         List<Future<java.util.Optional<DeviceTransaction>>> deviceTransactionFutures = new LinkedList<>();
         List<DeviceTransaction> deviceTransactions = new LinkedList<>();
@@ -153,77 +157,79 @@ public class DeviceTransactionManagerTest {
 
         try {
             for (Future<java.util.Optional<DeviceTransaction>> futureTx : deviceTransactionFutures) {
-                DeviceTransaction deviceTx = futureTx.get().get();
+                DeviceTransaction deviceTx = futureTx.get().orElseThrow();
                 deviceTx.commit(defaultTimeout, defaultTimeUnit);
                 deviceTransactions.add(deviceTx);
             }
         } catch (InterruptedException | ExecutionException e) {
-            Assert.fail("Exception catched! " + e);
+            fail("Exception catched! " + e);
         }
 
         for (DeviceTransaction deviceTx : deviceTransactions) {
-            Assert.assertTrue(deviceTx.wasSubmittedOrCancelled().get());
+            assertTrue(deviceTx.wasSubmittedOrCancelled().get());
         }
     }
 
     @Test
-    public void bigAmountOfTransactionsOnDifferentDevicesTest() {
+    void bigAmountOfTransactionsOnDifferentDevicesTest() {
         int numberOfTxs = 1000;
         List<DeviceTransaction> deviceTransactions = new LinkedList<>();
 
         try {
             for (int i = 0; i < numberOfTxs; i++) {
-                deviceTransactions.add(transactionManager.getDeviceTransaction(defaultDeviceId + " " + i).get().get());
+                deviceTransactions.add(transactionManager.getDeviceTransaction(defaultDeviceId + " " + i).get()
+                    .orElseThrow());
             }
         } catch (InterruptedException | ExecutionException e) {
-            Assert.fail("Exception catched! " + e);
+            fail("Exception catched! " + e);
         }
 
         deviceTransactions.parallelStream()
                 .forEach(deviceTransaction -> deviceTransaction.commit(defaultTimeout, defaultTimeUnit));
 
         deviceTransactions.parallelStream()
-                .forEach(deviceTransaction -> Assert.assertTrue(deviceTransaction.wasSubmittedOrCancelled().get()));
+                .forEach(deviceTransaction -> assertTrue(deviceTransaction.wasSubmittedOrCancelled().get()));
     }
 
     @Test
-    public void bigAmountOfTransactionsOnDifferentDevicesWithoutSubmitTest() {
+    void bigAmountOfTransactionsOnDifferentDevicesWithoutSubmitTest() {
         int numberOfTxs = 1000;
         List<DeviceTransaction> deviceTransactions = new LinkedList<>();
 
         try {
             for (int i = 0; i < numberOfTxs; i++) {
-                deviceTransactions.add(transactionManager.getDeviceTransaction(defaultDeviceId + " " + i).get().get());
+                deviceTransactions.add(transactionManager.getDeviceTransaction(defaultDeviceId + " " + i).get()
+                    .orElseThrow());
             }
         } catch (InterruptedException | ExecutionException e) {
-            Assert.fail("Exception catched! " + e);
+            fail("Exception catched! " + e);
         }
 
         try {
             Thread.sleep(transactionManager.getMaxDurationToSubmitTransaction() + 1000);
         } catch (InterruptedException e) {
-            Assert.fail("Exception catched! " + e);
+            fail("Exception catched! " + e);
         }
         deviceTransactions.parallelStream()
-                .forEach(deviceTransaction -> Assert.assertTrue(deviceTransaction.wasSubmittedOrCancelled().get()));
+                .forEach(deviceTransaction -> assertTrue(deviceTransaction.wasSubmittedOrCancelled().get()));
     }
 
     @Test
-    public void notSubmittedTransactionTest() {
+    void notSubmittedTransactionTest() {
         Future<java.util.Optional<DeviceTransaction>> deviceTxFuture =
                 transactionManager.getDeviceTransaction(defaultDeviceId);
         try {
             deviceTxFuture.get();
             Thread.sleep(transactionManager.getMaxDurationToSubmitTransaction() + 1000);
         } catch (InterruptedException | ExecutionException e) {
-            Assert.fail("Exception catched! " + e);
+            fail("Exception catched! " + e);
         }
         Mockito.verify(rwTransactionMock, Mockito.times(1)).cancel();
 
         try {
             putAndSubmit(transactionManager, defaultDeviceId, defaultDatastore, defaultIid, defaultData);
         } catch (InterruptedException | ExecutionException e) {
-            Assert.fail("Exception catched! " + e);
+            fail("Exception catched! " + e);
             return;
         }
 
@@ -233,7 +239,7 @@ public class DeviceTransactionManagerTest {
     }
 
     @Test
-    public void dataBrokerTimeoutTransactionTest() {
+    void dataBrokerTimeoutTransactionTest() {
         Mockito.when(dataBrokerMock.newReadWriteTransaction()).then(invocation -> {
             Thread.sleep(transactionManager.getMaxDurationToSubmitTransaction() + 1000);
             return rwTransactionMock;
@@ -242,7 +248,7 @@ public class DeviceTransactionManagerTest {
         try {
             putAndSubmit(transactionManager, defaultDeviceId, defaultDatastore, defaultIid, defaultData);
         } catch (InterruptedException | ExecutionException e) {
-            Assert.fail("Exception catched! " + e);
+            fail("Exception catched! " + e);
         }
 
         Mockito.verify(rwTransactionMock, Mockito.times(1)).commit();
@@ -252,7 +258,7 @@ public class DeviceTransactionManagerTest {
         try {
             putAndSubmit(transactionManager, defaultDeviceId, defaultDatastore, defaultIid, defaultData);
         } catch (InterruptedException | ExecutionException e) {
-            Assert.fail("Exception catched! " + e);
+            fail("Exception catched! " + e);
             return;
         }
 
@@ -261,7 +267,7 @@ public class DeviceTransactionManagerTest {
     }
 
     @Test
-    public void getFutureTimeoutTransactionTest() {
+    void getFutureTimeoutTransactionTest() {
         Mockito.when(dataBrokerMock.newReadWriteTransaction()).then(invocation -> {
             Thread.sleep(3000);
             return rwTransactionMock;
@@ -274,13 +280,13 @@ public class DeviceTransactionManagerTest {
         try {
             deviceTxFuture.get(1000, TimeUnit.MILLISECONDS);
         } catch (InterruptedException | ExecutionException e) {
-            Assert.fail("Exception catched! " + e);
+            fail("Exception catched! " + e);
         } catch (TimeoutException e) {
             throwedException = e;
         }
 
         if (throwedException == null) {
-            Assert.fail("TimeoutException should be thrown!");
+            fail("TimeoutException should be thrown!");
             return;
         }
 
@@ -289,7 +295,7 @@ public class DeviceTransactionManagerTest {
         try {
             putAndSubmit(transactionManager, defaultDeviceId, defaultDatastore, defaultIid, defaultData);
         } catch (InterruptedException | ExecutionException e) {
-            Assert.fail("Exception catched! " + e);
+            fail("Exception catched! " + e);
             return;
         }
 
@@ -301,7 +307,7 @@ public class DeviceTransactionManagerTest {
             LogicalDatastoreType store, InstanceIdentifier<T> path, T data)
             throws ExecutionException, InterruptedException {
         Future<java.util.Optional<DeviceTransaction>> deviceTxFuture = deviceTxManager.getDeviceTransaction(deviceId);
-        DeviceTransaction deviceTx = deviceTxFuture.get().get();
+        DeviceTransaction deviceTx = deviceTxFuture.get().orElseThrow();
         deviceTx.put(store, path, data);
         deviceTx.commit(defaultTimeout, defaultTimeUnit);
     }
index d93051fafa538c20dfa6199e4de15eddb2afaff1..d6526e3ef739bde9c50fdd1b685dd2c403481da0 100644 (file)
 
 package org.opendaylight.transportpce.common.fixedflex;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.math.BigDecimal;
 import java.util.Arrays;
 import java.util.Map;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.transportpce.common.ServiceRateConstant;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.ServicePathInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.ServicePathInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev211210.FrequencyGHz;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev211210.FrequencyTHz;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev230526.FrequencyGHz;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev230526.FrequencyTHz;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.ModulationFormat;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.available.freq.map.AvailFreqMaps;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.available.freq.map.AvailFreqMapsKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.available.freq.map.AvailFreqMaps;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.available.freq.map.AvailFreqMapsKey;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.Uint32;
 
 public class GridUtilsTest {
 
     @Test
-    public void getWaveLengthIndexFromSpectrumAssigmentTest() {
-        assertEquals("Wavelength index should be 15", 15, GridUtils.getWaveLengthIndexFromSpectrumAssigment(647));
+    void getWaveLengthIndexFromSpectrumAssigmentTest() {
+        assertEquals(15, GridUtils.getWaveLengthIndexFromSpectrumAssigment(647), "Wavelength index should be 15");
     }
 
     @Test
-    public void getFrequencyFromIndexTest() {
+    void getFrequencyFromIndexTest() {
         BigDecimal[] expectedFrequencies = new BigDecimal[768];
         BigDecimal frequency = BigDecimal.valueOf(191.325);
         for (int i = 0; i < expectedFrequencies.length; i++) {
             expectedFrequencies[i] = frequency;
             frequency = frequency.add(BigDecimal.valueOf(0.00625));
         }
-        assertEquals("Frequency should be 191.325", 0, expectedFrequencies[0]
-                .compareTo(GridUtils.getStartFrequencyFromIndex(0)));
-        assertEquals("Frequency should be 193.1", 0, expectedFrequencies[284]
-                .compareTo(GridUtils.getStartFrequencyFromIndex(284)));
-        assertEquals("Frequency should be 196.1188", 0, expectedFrequencies[767]
-                .compareTo(GridUtils.getStartFrequencyFromIndex(767)));
+        assertEquals(0, expectedFrequencies[0].compareTo(GridUtils.getStartFrequencyFromIndex(0)),
+            "Frequency should be 191.325");
+        assertEquals(0, expectedFrequencies[284].compareTo(GridUtils.getStartFrequencyFromIndex(284)),
+            "Frequency should be 193.1");
+        assertEquals(0, expectedFrequencies[767].compareTo(GridUtils.getStartFrequencyFromIndex(767)),
+            "Frequency should be 196.1188");
     }
 
     @Test
-    public void initFreqMaps4FixedGrid2AvailableTest() {
+    void initFreqMaps4FixedGrid2AvailableTest() {
         AvailFreqMapsKey key = new AvailFreqMapsKey(GridConstant.C_BAND);
         byte[] byteArray = new byte[GridConstant.NB_OCTECTS];
         Arrays.fill(byteArray, (byte) GridConstant.AVAILABLE_SLOT_VALUE);
         Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMaps = GridUtils.initFreqMaps4FixedGrid2Available();
-        assertEquals("Should contains 1 element", 1, availFreqMaps.size());
-        assertTrue("should contains cband key", availFreqMaps.containsKey(key));
-        assertTrue("Should have available freq map", Arrays.equals(byteArray, availFreqMaps.get(key).getFreqMap()));
+        assertEquals(1, availFreqMaps.size(), "Should contains 1 element");
+        assertTrue(availFreqMaps.containsKey(key), "should contains cband key");
+        assertTrue(Arrays.equals(byteArray, availFreqMaps.get(key).getFreqMap()), "Should have available freq map");
     }
 
     @Test
-    public void getIndexFromFrequencyTest() {
-        assertEquals("Index should be 693", 693, GridUtils.getIndexFromFrequency(BigDecimal.valueOf(195.65625)));
-        assertEquals("Index should be 0", 0, GridUtils.getIndexFromFrequency(BigDecimal.valueOf(191.325)));
-        assertEquals("Index should be 767", 767, GridUtils.getIndexFromFrequency(BigDecimal.valueOf(196.11875)));
-        assertEquals("Index should be 8", 8, GridUtils.getIndexFromFrequency(BigDecimal.valueOf(191.375)));
-        assertEquals("Index should be 15", 15, GridUtils.getIndexFromFrequency(BigDecimal.valueOf(191.41875)));
-        assertEquals("Index should be 768", 768, GridUtils.getIndexFromFrequency(BigDecimal.valueOf(196.125)));
+    void getIndexFromFrequencyTest() {
+        assertEquals(693, GridUtils.getIndexFromFrequency(Decimal64.valueOf("195.65625")), "Index should be 693");
+        assertEquals(0, GridUtils.getIndexFromFrequency(Decimal64.valueOf("191.325")), "Index should be 0");
+        assertEquals(767, GridUtils.getIndexFromFrequency(Decimal64.valueOf("196.11875")), "Index should be 767");
+        assertEquals(8, GridUtils.getIndexFromFrequency(Decimal64.valueOf("191.375")), "Index should be 8");
+        assertEquals(15, GridUtils.getIndexFromFrequency(Decimal64.valueOf("191.41875")), "Index should be 15");
+        assertEquals(768, GridUtils.getIndexFromFrequency(Decimal64.valueOf("196.125")), "Index should be 768");
     }
 
-    @Test(expected = IllegalArgumentException.class)
-    public void getIndexFromFrequencyExceptionTest() {
-        GridUtils.getIndexFromFrequency(BigDecimal.valueOf(196.13125));
+    @Test
+    void getIndexFromFrequencyExceptionTest() {
+        IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> {
+            GridUtils.getIndexFromFrequency(Decimal64.valueOf("196.13125"));
+        });
+        assertEquals("Frequency not in range 196.13125", exception.getMessage());
     }
 
-    @Test(expected = IllegalArgumentException.class)
-    public void getIndexFromFrequencyException2Test() {
-        GridUtils.getIndexFromFrequency(BigDecimal.valueOf(191.31875));
+    @Test
+    void getIndexFromFrequencyException2Test() {
+        IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> {
+            GridUtils.getIndexFromFrequency(Decimal64.valueOf("191.31875"));
+        });
+        assertEquals("Frequency not in range 191.31875", exception.getMessage());
     }
 
     @Test
-    public void getWidthFromRateAndModulationFormatTest() {
-        assertEquals("Width should be 75", new FrequencyGHz(GridConstant.WIDTH_75),
-                GridUtils.getWidthFromRateAndModulationFormat(ServiceRateConstant.RATE_400,
-                        ModulationFormat.DpQam16));
+    void getWidthFromRateAndModulationFormatTest() {
+        assertEquals(
+            new FrequencyGHz(Decimal64.valueOf(GridConstant.WIDTH_75)),
+            GridUtils.getWidthFromRateAndModulationFormat(ServiceRateConstant.RATE_400, ModulationFormat.DpQam16),
+            "Width should be 75");
     }
 
     @Test
-    public void getWidthFromRateAndModulationFormatNotFoundTest() {
-        assertEquals("As not found width should be 40", new FrequencyGHz(GridConstant.WIDTH_40),
-                GridUtils.getWidthFromRateAndModulationFormat(ServiceRateConstant.RATE_100,
-                        ModulationFormat.DpQam16));
+    void getWidthFromRateAndModulationFormatNotFoundTest() {
+        assertEquals(
+            new FrequencyGHz(Decimal64.valueOf(GridConstant.WIDTH_40)),
+            GridUtils.getWidthFromRateAndModulationFormat(ServiceRateConstant.RATE_100, ModulationFormat.DpQam16),
+            "As not found width should be 40");
     }
 
     @Test
-    public void getCentralFrequencyTest() {
-        assertEquals("Central frequency should be 191.350",
-                new FrequencyTHz(BigDecimal.valueOf(191.35).setScale(3)),
-                GridUtils.getCentralFrequency(BigDecimal.valueOf(191.325), BigDecimal.valueOf(191.375)));
+    void getCentralFrequencyTest() {
+        assertEquals(
+            new FrequencyTHz(Decimal64.valueOf(BigDecimal.valueOf(191.35).setScale(3))),
+            GridUtils.getCentralFrequency(BigDecimal.valueOf(191.325), BigDecimal.valueOf(191.375)),
+            "Central frequency should be 191.350");
     }
 
     @Test
-    public void getCentralFrequencyWithPrecisionTest() {
-        assertEquals("Central frequency should be 191.3500",
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.FrequencyTHz(
-                        BigDecimal.valueOf(191.35).setScale(4)),
-                GridUtils.getCentralFrequencyWithPrecision(BigDecimal.valueOf(191.325),
-                        BigDecimal.valueOf(191.375), 4));
+    void getCentralFrequencyWithPrecisionTest() {
+        assertEquals(
+            new org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.FrequencyTHz(
+                    Decimal64.valueOf(BigDecimal.valueOf(191.35).setScale(4))),
+            GridUtils.getCentralFrequencyWithPrecision(BigDecimal.valueOf(191.325), BigDecimal.valueOf(191.375), 4),
+            "Central frequency should be 191.3500");
     }
 
     @Test
-    public void getCentralFrequencyWithPrecisionAndRoundTest() {
-        assertEquals("Central frequency should be 191.3499",
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.FrequencyTHz(
-                        BigDecimal.valueOf(191.3499)),
-                GridUtils.getCentralFrequencyWithPrecision(BigDecimal.valueOf(191.3244445),
-                        BigDecimal.valueOf(191.3754457788), 4));
+    void getCentralFrequencyWithPrecisionAndRoundTest() {
+        assertEquals(
+            new org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.FrequencyTHz(
+                    Decimal64.valueOf("191.3499")),
+            GridUtils.getCentralFrequencyWithPrecision(
+                    BigDecimal.valueOf(191.3244445), BigDecimal.valueOf(191.3754457788), 4),
+            "Central frequency should be 191.3499");
     }
 
     @Test
-    public void initSpectrumInformationFromServicePathInputTest() {
+    void initSpectrumInformationFromServicePathInputTest() {
         ServicePathInput input = new ServicePathInputBuilder()
                 .setWaveNumber(Uint32.valueOf(1))
                 .setCenterFreq(new org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019
-                        .FrequencyTHz(BigDecimal.valueOf(196.1)))
+                        .FrequencyTHz(Decimal64.valueOf("196.1")))
                 .setHigherSpectralSlotNumber(Uint32.valueOf(768))
                 .setLowerSpectralSlotNumber(Uint32.valueOf(761))
                 .setMaxFreq(new org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019
-                        .FrequencyTHz(BigDecimal.valueOf(196.125)))
+                        .FrequencyTHz(Decimal64.valueOf("196.125")))
                 .setMinFreq(new org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019
-                        .FrequencyTHz(BigDecimal.valueOf(196.075)))
+                        .FrequencyTHz(Decimal64.valueOf("196.075")))
                 .setNmcWidth(new org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019
-                        .FrequencyGHz(GridConstant.WIDTH_40))
+                        .FrequencyGHz(Decimal64.valueOf(GridConstant.WIDTH_40)))
                 .build();
         SpectrumInformation spectrumInformation = GridUtils.initSpectrumInformationFromServicePathInput(input);
-        assertEquals("Width should be 40", BigDecimal.valueOf(40), spectrumInformation.getWidth());
-        assertEquals("Wavelength should be 1", Uint32.valueOf(1), spectrumInformation.getWaveLength());
-        assertEquals("Center freq should be 196.1", BigDecimal.valueOf(196.1).setScale(4),
-                spectrumInformation.getCenterFrequency());
-        assertEquals("Lower slot number should be 761", 761, spectrumInformation.getLowerSpectralSlotNumber());
-        assertEquals("Higher slot number should be 768", 768, spectrumInformation.getHigherSpectralSlotNumber());
-        assertEquals("Min freq should be 196.075", BigDecimal.valueOf(196.075).setScale(4),
-                spectrumInformation.getMinFrequency());
-        assertEquals("Max freq should be 196.125", BigDecimal.valueOf(196.125).setScale(4),
-                spectrumInformation.getMaxFrequency());
+        assertEquals(BigDecimal.valueOf(40), spectrumInformation.getWidth(), "Width should be 40");
+        assertEquals(Uint32.valueOf(1), spectrumInformation.getWaveLength(), "Wavelength should be 1");
+        assertEquals(BigDecimal.valueOf(196.1).setScale(4), spectrumInformation.getCenterFrequency(),
+            "Center freq should be 196.1");
+        assertEquals(761, spectrumInformation.getLowerSpectralSlotNumber(), "Lower slot number should be 761");
+        assertEquals(768, spectrumInformation.getHigherSpectralSlotNumber(), "Higher slot number should be 768");
+        assertEquals(BigDecimal.valueOf(196.075).setScale(4), spectrumInformation.getMinFrequency(),
+            "Min freq should be 196.075");
+        assertEquals(BigDecimal.valueOf(196.125).setScale(4), spectrumInformation.getMaxFrequency(),
+            "Max freq should be 196.125");
     }
 
     @Test
-    public void initSpectrumInformationFromServicePathInputNoCenterFreqTest() {
+    void initSpectrumInformationFromServicePathInputNoCenterFreqTest() {
         ServicePathInput input = new ServicePathInputBuilder()
                 .setWaveNumber(Uint32.valueOf(1))
                 .setHigherSpectralSlotNumber(Uint32.valueOf(768))
                 .setLowerSpectralSlotNumber(Uint32.valueOf(761))
                 .setMaxFreq(new org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019
-                        .FrequencyTHz(BigDecimal.valueOf(196.125)))
+                        .FrequencyTHz(Decimal64.valueOf("196.125")))
                 .setMinFreq(new org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019
-                        .FrequencyTHz(BigDecimal.valueOf(196.075)))
+                        .FrequencyTHz(Decimal64.valueOf("196.075")))
                 .setNmcWidth(new org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019
-                        .FrequencyGHz(GridConstant.WIDTH_40))
+                        .FrequencyGHz(Decimal64.valueOf(GridConstant.WIDTH_40)))
                 .build();
         SpectrumInformation spectrumInformation = GridUtils.initSpectrumInformationFromServicePathInput(input);
-        assertEquals("Width should be 40", BigDecimal.valueOf(40), spectrumInformation.getWidth());
-        assertEquals("Wavelength should be 1", Uint32.valueOf(1), spectrumInformation.getWaveLength());
-        assertEquals("Center freq should be 196.1", BigDecimal.valueOf(196.1).setScale(4),
-                spectrumInformation.getCenterFrequency());
-        assertEquals("Lower slot number should be 761", 761, spectrumInformation.getLowerSpectralSlotNumber());
-        assertEquals("Higher slot number should be 768", 768, spectrumInformation.getHigherSpectralSlotNumber());
-        assertEquals("Min freq should be 196.075", BigDecimal.valueOf(196.075).setScale(4),
-                spectrumInformation.getMinFrequency());
-        assertEquals("Max freq should be 196.125", BigDecimal.valueOf(196.125).setScale(4),
-                spectrumInformation.getMaxFrequency());
+        assertEquals(BigDecimal.valueOf(40), spectrumInformation.getWidth(), "Width should be 40");
+        assertEquals(Uint32.valueOf(1), spectrumInformation.getWaveLength(), "Wavelength should be 1");
+        assertEquals(BigDecimal.valueOf(196.1).setScale(4), spectrumInformation.getCenterFrequency(),
+            "Center freq should be 196.1");
+        assertEquals(761, spectrumInformation.getLowerSpectralSlotNumber(), "Lower slot number should be 761");
+        assertEquals(768, spectrumInformation.getHigherSpectralSlotNumber(), "Higher slot number should be 768");
+        assertEquals(BigDecimal.valueOf(196.075).setScale(4), spectrumInformation.getMinFrequency(),
+            "Min freq should be 196.075");
+        assertEquals(BigDecimal.valueOf(196.125).setScale(4), spectrumInformation.getMaxFrequency(),
+            "Max freq should be 196.125");
     }
 
     @Test
-    public void initSpectrumInformationFromServicePathInputNoFreqTest() {
+    void initSpectrumInformationFromServicePathInputNoFreqTest() {
         ServicePathInput input = new ServicePathInputBuilder()
                 .setWaveNumber(Uint32.valueOf(1))
                 .setHigherSpectralSlotNumber(Uint32.valueOf(768))
                 .setLowerSpectralSlotNumber(Uint32.valueOf(761))
                 .setNmcWidth(new org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019
-                        .FrequencyGHz(GridConstant.WIDTH_40))
+                        .FrequencyGHz(Decimal64.valueOf(GridConstant.WIDTH_40)))
                 .build();
         SpectrumInformation spectrumInformation = GridUtils.initSpectrumInformationFromServicePathInput(input);
-        assertEquals("Width should be 40", BigDecimal.valueOf(40), spectrumInformation.getWidth());
-        assertEquals("Wavelength should be 1", Uint32.valueOf(1), spectrumInformation.getWaveLength());
-        assertEquals("Center freq should be 196.1", BigDecimal.valueOf(196.1).setScale(4),
-                spectrumInformation.getCenterFrequency());
-        assertEquals("Lower slot number should be 761", 761, spectrumInformation.getLowerSpectralSlotNumber());
-        assertEquals("Higher slot number should be 768", 768, spectrumInformation.getHigherSpectralSlotNumber());
-        assertEquals("Min freq should be 196.075", BigDecimal.valueOf(196.075).setScale(4),
-                spectrumInformation.getMinFrequency());
-        assertEquals("Max freq should be 196.125", BigDecimal.valueOf(196.125).setScale(4),
-                spectrumInformation.getMaxFrequency());
+        assertEquals(BigDecimal.valueOf(40), spectrumInformation.getWidth(), "Width should be 40");
+        assertEquals(Uint32.valueOf(1), spectrumInformation.getWaveLength(), "Wavelength should be 1");
+        assertEquals(BigDecimal.valueOf(196.1).setScale(4), spectrumInformation.getCenterFrequency(),
+            "Center freq should be 196.1");
+        assertEquals(761, spectrumInformation.getLowerSpectralSlotNumber(), "Lower slot number should be 761");
+        assertEquals(768, spectrumInformation.getHigherSpectralSlotNumber(), "Higher slot number should be 768");
+        assertEquals(BigDecimal.valueOf(196.075).setScale(4), spectrumInformation.getMinFrequency(),
+            "Min freq should be 196.075");
+        assertEquals(BigDecimal.valueOf(196.125).setScale(4), spectrumInformation.getMaxFrequency(),
+            "Max freq should be 196.125");
     }
 
-    @Test(expected = IllegalArgumentException.class)
-    public void initSpectrumInformationFromServicePathInputNoSlotTest() {
-        GridUtils.initSpectrumInformationFromServicePathInput(new ServicePathInputBuilder().build());
+    @Test
+    void initSpectrumInformationFromServicePathInputNoSlotTest() {
+        IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> {
+            GridUtils.initSpectrumInformationFromServicePathInput(new ServicePathInputBuilder().build());
+        });
+        assertEquals("low and higher spectral slot numbers cannot be null", exception.getMessage());
     }
 }
index a9a72c51e873a353b4b1beab1652110c70954961..82689ddfa805e764f4be75520f8d24fc86b53a35 100644 (file)
@@ -8,10 +8,11 @@
 
 package org.opendaylight.transportpce.common.mapping;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.FileNotFoundException;
 import java.io.FileReader;
@@ -19,15 +20,15 @@ import java.io.IOException;
 import java.io.Reader;
 import java.nio.charset.StandardCharsets;
 import java.util.concurrent.ExecutionException;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.transportpce.test.AbstractTest;
 import org.opendaylight.transportpce.test.converter.DataObjectConverter;
 import org.opendaylight.transportpce.test.converter.JSONDataObjectConverter;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.Network;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
@@ -38,13 +39,13 @@ public class MappingUtilsImplTest extends AbstractTest {
     private static final Logger LOG = LoggerFactory.getLogger(MappingUtilsImplTest.class);
     private static MappingUtils mappingUtils;
 
-    @BeforeClass
-    public static void setUp() throws InterruptedException, ExecutionException, FileNotFoundException {
+    @BeforeAll
+    static void setUp() throws InterruptedException, ExecutionException, FileNotFoundException {
         DataObjectConverter dataObjectConverter = JSONDataObjectConverter
                 .createWithDataStoreUtil(getDataStoreContextUtil());
         try (Reader reader = new FileReader("src/test/resources/network.json", StandardCharsets.UTF_8)) {
             NormalizedNode normalizedNode = dataObjectConverter
-                    .transformIntoNormalizedNode(reader).get();
+                    .transformIntoNormalizedNode(reader).orElseThrow();
             Network network = (Network) getDataStoreContextUtil()
                     .getBindingDOMCodecServices().fromNormalizedNode(YangInstanceIdentifier
                             .of(Network.QNAME), normalizedNode).getValue();
@@ -60,23 +61,19 @@ public class MappingUtilsImplTest extends AbstractTest {
     }
 
     @Test
-    public void getOpenRoadmVersionTest() throws ExecutionException, InterruptedException {
-        assertEquals("NodeInfo with ROADM-C1 as id should be 1.2.1 version",
-                StringConstants.OPENROADM_DEVICE_VERSION_1_2_1,
-                mappingUtils.getOpenRoadmVersion("ROADM-C1"));
-        assertEquals("NodeInfo with ROADM-A1 as id should be 2.2.1 version",
-                StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
-                mappingUtils.getOpenRoadmVersion("ROADM-A1"));
-        assertNull("NodeInfo with nodes3 as id should not exist", mappingUtils.getOpenRoadmVersion("nodes3"));
+    void getOpenRoadmVersionTest() throws ExecutionException, InterruptedException {
+        assertEquals(StringConstants.OPENROADM_DEVICE_VERSION_1_2_1, mappingUtils.getOpenRoadmVersion("ROADM-C1"),
+            "NodeInfo with ROADM-C1 as id should be 1.2.1 version");
+        assertEquals(StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, mappingUtils.getOpenRoadmVersion("ROADM-A1"),
+            "NodeInfo with ROADM-A1 as id should be 2.2.1 version");
+        assertNull(mappingUtils.getOpenRoadmVersion("nodes3"), "NodeInfo with nodes3 as id should not exist");
     }
 
     @Test
-    public void getMcCapabilitiesForNodeTest() {
-        assertEquals("Mc capabilities list size should be 2", 2,
-                mappingUtils.getMcCapabilitiesForNode("ROADM-A1").size());
-        assertTrue("Mc capabilities list size should be empty",
-                mappingUtils.getMcCapabilitiesForNode("ROADM-A2").isEmpty());
+    void getMcCapabilitiesForNodeTest() {
+        assertEquals(2, mappingUtils.getMcCapabilitiesForNode("ROADM-A1").size(),
+            "Mc capabilities list size should be 2");
+        assertTrue(mappingUtils.getMcCapabilitiesForNode("ROADM-A2").isEmpty(),
+            "Mc capabilities list size should be empty");
     }
-
-
 }
index 68dcb97068f3f00f25ab9b4f2d1e41b6dabf6110..119bcf28958040bdf875c06d7268ebffaa45b90e 100644 (file)
@@ -8,34 +8,34 @@
 
 package org.opendaylight.transportpce.common.mapping;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 import static org.opendaylight.transportpce.common.StringConstants.OPENROADM_DEVICE_VERSION_1_2_1;
 import static org.opendaylight.transportpce.common.StringConstants.OPENROADM_DEVICE_VERSION_2_2_1;
 
 import java.util.concurrent.ExecutionException;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.test.DataStoreContext;
 import org.opendaylight.transportpce.test.DataStoreContextImpl;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.OpenroadmNodeVersion;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfo;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfoBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.Network;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.OpenroadmNodeVersion;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfo;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfoBuilder;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public class PortMappingImplTest {
@@ -46,8 +46,8 @@ public class PortMappingImplTest {
     private PortMappingVersion121 portMappingVersion121;
     private PortMapping portMapping;
 
-    @Before
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp() throws Exception {
         DataStoreContext dataStoreContext = new DataStoreContextImpl();
         dataBroker = dataStoreContext.getDataBroker();
         portMappingVersion710 = mock(PortMappingVersion710.class);
@@ -58,7 +58,7 @@ public class PortMappingImplTest {
     }
 
     @Test
-    public void createMappingDataTest() {
+    void createMappingDataTest() {
         //test create mapping version 1
         when(portMappingVersion121.createMappingData("node")).thenReturn(true);
         assertTrue(portMapping.createMappingData("node", OPENROADM_DEVICE_VERSION_1_2_1));
@@ -71,9 +71,8 @@ public class PortMappingImplTest {
         assertFalse(portMapping.createMappingData("node", "test"));
     }
 
-
     @Test
-    public void updateMappingTest() throws ExecutionException, InterruptedException {
+    void updateMappingTest() throws ExecutionException, InterruptedException {
         Mapping mapping = new MappingBuilder().setLogicalConnectionPoint("logicalConnectionPoint")
                 .setPortDirection("1").setConnectionMapLcp("1").setPartnerLcp("1")
                 .setPortQual("1").setSupportingCircuitPackName("1").setSupportingOms("1")
@@ -97,7 +96,7 @@ public class PortMappingImplTest {
         wr.commit().get();
         //test update port mapping version 2
         when(portMappingVersion221.updateMapping("node", mapping)).thenReturn(true);
-        assertTrue("Update sould be ok", portMapping.updateMapping("node", mapping));
+        assertTrue(portMapping.updateMapping("node", mapping), "Update sould be ok");
 
         //replace node nodefino version 1 instead of version 2
         WriteTransaction wr2 = dataBroker.newWriteOnlyTransaction();
@@ -115,15 +114,12 @@ public class PortMappingImplTest {
         assertNull(portMapping.getNode("node2"));
 
         //test get portmapping for existing node
-        assertEquals(portMapping
-                .getMapping("node", "logicalConnectionPoint"), mapping);
+        assertEquals(portMapping.getMapping("node", "logicalConnectionPoint"), mapping);
 
         //test delete portmapping for existing node
         portMapping.deletePortMappingNode("node");
 
         //test get portmapping that was deleted above and doesn't exist anymore
         assertNull(portMapping.getMapping("node", "logicalConnectionPoint"));
-
     }
-
 }
index de1aa85dac7b4e5443e5240ae77cbc74ad14f8d1..a91af2c79952084bceb5fda03b757e6ec187bed1 100644 (file)
@@ -8,10 +8,10 @@
 
 package org.opendaylight.transportpce.common.mapping;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -25,8 +25,8 @@ import java.util.Optional;
 import java.util.Random;
 import java.util.concurrent.ExecutionException;
 import org.eclipse.jdt.annotation.NonNull;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.ReadTransaction;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
@@ -34,12 +34,13 @@ import org.opendaylight.transportpce.common.Timeouts;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.test.DataStoreContext;
 import org.opendaylight.transportpce.test.DataStoreContextImpl;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.NetworkBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.Network;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.NetworkBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.Direction;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.NodeTypes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.Port;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.ParentCircuitPackBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.Ports;
@@ -85,7 +86,6 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
 import org.opendaylight.yangtools.yang.binding.Augmentation;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Uint16;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.slf4j.Logger;
@@ -99,8 +99,8 @@ public class PortMappingVersion121Test {
     private static PortMappingVersion121 portMappingVersion121;
     private Random ran = new Random();
 
-    @Before
-    public void setUp() throws Exception {
+    @BeforeEach
+    void setUp() throws Exception {
         // test createMappingData for a xpdr node with 3 network + 1 client + bidirectional & unidirectional ports
         DataStoreContext dataStoreContext = new DataStoreContextImpl();
         dataBroker = dataStoreContext.getDataBroker();
@@ -109,7 +109,7 @@ public class PortMappingVersion121Test {
     }
 
     @Test
-    public void createMappingDataTestRdm() {
+    void createMappingDataTestRdm() {
         // mock node info
         final Info info = getInfo2();
 
@@ -284,45 +284,43 @@ public class PortMappingVersion121Test {
         Protocols protocols = new ProtocolsBuilder().addAugmentation(augmentation).build();
 
         // mock responses for deviceTransactionManager calls
-        InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.device
-            .rev170206.org.openroadm.device.container.org.openroadm.device.Degree> deviceIID = InstanceIdentifier
-            .create(OrgOpenroadmDevice.class)
-            .child(org.opendaylight.yang.gen.v1.http.org.openroadm.device
-                    .rev170206.org.openroadm.device.container.org.openroadm.device.Degree.class,
-                                new DegreeKey(Uint16.valueOf(1)));
+        InstanceIdentifier<Degree> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Degree.class, new DegreeKey(Uint16.valueOf(1)))
+            .build();
         when(deviceTransactionManager.getDataFromDevice("node", LogicalDatastoreType.OPERATIONAL, deviceIID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
                         .thenReturn(Optional.of(ordmDegreeObject));
 
-        InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206
-            .org.openroadm.device.container.org.openroadm.device.Degree> deviceIID3 = InstanceIdentifier
-            .create(OrgOpenroadmDevice.class)
-            .child(org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206
-            .org.openroadm.device.container.org.openroadm.device.Degree.class,
-                                new DegreeKey(Uint16.valueOf(2)));
+        InstanceIdentifier<Degree> deviceIID3 = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Degree.class, new DegreeKey(Uint16.valueOf(2)))
+            .build();
         when(deviceTransactionManager.getDataFromDevice("node", LogicalDatastoreType.OPERATIONAL, deviceIID3,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
                         .thenReturn(Optional.of(ordmDegreeObject3));
 
-        InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206
-            .org.openroadm.device.container.org.openroadm.device.Degree> deviceIID5 = InstanceIdentifier
-            .create(OrgOpenroadmDevice.class)
-            .child(org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206
-            .org.openroadm.device.container.org.openroadm.device.Degree.class,
-                                new DegreeKey(Uint16.valueOf(3)));
+        InstanceIdentifier<Degree> deviceIID5 = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Degree.class, new DegreeKey(Uint16.valueOf(3)))
+            .build();
         when(deviceTransactionManager.getDataFromDevice("node", LogicalDatastoreType.OPERATIONAL, deviceIID5,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
                         .thenReturn(Optional.of(ordmDegreeObject5));
 
-        InstanceIdentifier<Protocols> protocoliid =
-                InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Protocols.class);
+        InstanceIdentifier<Protocols> protocoliid = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Protocols.class)
+            .build();
         when(deviceTransactionManager.getDataFromDevice("node", LogicalDatastoreType.OPERATIONAL, protocoliid,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT)).thenReturn(Optional.of(protocols));
 
         Interface interfaceObject = new InterfaceBuilder().withKey(new InterfaceKey("itf1"))
                 .setSupportingCircuitPackName("sc1").build();
-        InstanceIdentifier<Interface> interfaceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(Interface.class, new InterfaceKey(portConfig.getIfName()));
+        InstanceIdentifier<Interface> interfaceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Interface.class, new InterfaceKey(portConfig.getIfName()))
+            .build();
         when(deviceTransactionManager.getDataFromDevice("node", LogicalDatastoreType.OPERATIONAL, interfaceIID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
                         .thenReturn(Optional.of(interfaceObject));
@@ -371,67 +369,88 @@ public class PortMappingVersion121Test {
         when(deviceTransactionManager.getDataFromDevice("node", LogicalDatastoreType.OPERATIONAL, portID55,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT)).thenReturn(Optional.of(ports55));
 
-        InstanceIdentifier<Info> infoIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Info.class);
+        InstanceIdentifier<Info> infoIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Info.class)
+            .build();
         when(deviceTransactionManager.getDataFromDevice("node", LogicalDatastoreType.OPERATIONAL, infoIID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT)).thenReturn(Optional.of(info));
 
-        InstanceIdentifier<CircuitPacks> circuitPacksIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(CircuitPacks.class, new CircuitPacksKey("c1"));
+        InstanceIdentifier<CircuitPacks> circuitPacksIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey("c1"))
+            .build();
         when(deviceTransactionManager.getDataFromDevice("node", LogicalDatastoreType.OPERATIONAL, circuitPacksIID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
                         .thenReturn(Optional.of(circuitPackObject));
 
-        InstanceIdentifier<CircuitPacks> circuitPacksIID2 = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(CircuitPacks.class, new CircuitPacksKey("c2"));
+        InstanceIdentifier<CircuitPacks> circuitPacksIID2 = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey("c2"))
+            .build();
         when(deviceTransactionManager.getDataFromDevice("node", LogicalDatastoreType.OPERATIONAL, circuitPacksIID2,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
                         .thenReturn(Optional.of(circuitPackObject2));
 
-        InstanceIdentifier<CircuitPacks> circuitPacksIID3 = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(CircuitPacks.class, new CircuitPacksKey("c3"));
+        InstanceIdentifier<CircuitPacks> circuitPacksIID3 = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey("c3"))
+            .build();
         when(deviceTransactionManager.getDataFromDevice("node", LogicalDatastoreType.OPERATIONAL, circuitPacksIID3,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
                         .thenReturn(Optional.of(circuitPackObject3));
 
-        InstanceIdentifier<CircuitPacks> circuitPacksIID4 = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(CircuitPacks.class, new CircuitPacksKey("c4"));
+        InstanceIdentifier<CircuitPacks> circuitPacksIID4 = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey("c4"))
+            .build();
         when(deviceTransactionManager.getDataFromDevice("node", LogicalDatastoreType.OPERATIONAL, circuitPacksIID4,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
                         .thenReturn(Optional.of(circuitPackObject4));
 
-        InstanceIdentifier<CircuitPacks> circuitPacksIID5 = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(CircuitPacks.class, new CircuitPacksKey("c5"));
+        InstanceIdentifier<CircuitPacks> circuitPacksIID5 = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey("c5"))
+            .build();
         when(deviceTransactionManager.getDataFromDevice("node", LogicalDatastoreType.OPERATIONAL, circuitPacksIID5,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
                         .thenReturn(Optional.of(circuitPackObject5));
 
-        InstanceIdentifier<CircuitPacks> circuitPacksIID6 = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(CircuitPacks.class, new CircuitPacksKey("c6"));
+        InstanceIdentifier<CircuitPacks> circuitPacksIID6 = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey("c6"))
+            .build();
         when(deviceTransactionManager.getDataFromDevice("node", LogicalDatastoreType.OPERATIONAL, circuitPacksIID6,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
                         .thenReturn(Optional.of(circuitPackObject6));
 
-        InstanceIdentifier<SharedRiskGroup> srgIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(SharedRiskGroup.class, new SharedRiskGroupKey(Uint16.valueOf(1)));
+        InstanceIdentifier<SharedRiskGroup> srgIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(SharedRiskGroup.class, new SharedRiskGroupKey(Uint16.valueOf(1)))
+            .build();
         when(deviceTransactionManager.getDataFromDevice("node", LogicalDatastoreType.OPERATIONAL, srgIID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
                         .thenReturn(Optional.of(ordmSrgObject));
 
-        InstanceIdentifier<SharedRiskGroup> srgIID4 = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(SharedRiskGroup.class, new SharedRiskGroupKey(Uint16.valueOf(2)));
+        InstanceIdentifier<SharedRiskGroup> srgIID4 = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(SharedRiskGroup.class, new SharedRiskGroupKey(Uint16.valueOf(2)))
+            .build();
         when(deviceTransactionManager.getDataFromDevice("node", LogicalDatastoreType.OPERATIONAL, srgIID4,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
                         .thenReturn(Optional.of(ordmSrgObject4));
 
-        InstanceIdentifier<SharedRiskGroup> srgIID6 = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(SharedRiskGroup.class, new SharedRiskGroupKey(Uint16.valueOf(3)));
+        InstanceIdentifier<SharedRiskGroup> srgIID6 = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(SharedRiskGroup.class, new SharedRiskGroupKey(Uint16.valueOf(3)))
+            .build();
         when(deviceTransactionManager.getDataFromDevice("node", LogicalDatastoreType.OPERATIONAL, srgIID6,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
                         .thenReturn(Optional.of(ordmSrgObject6));
 
         // test createMappingData with a node with 3 dgree + 3 srg + bidirectional & unidirectional ports
-        assertTrue("creating mappingdata for existed node returns true",
-                portMappingVersion121.createMappingData("node"));
+        assertTrue(portMappingVersion121.createMappingData("node"),
+            "creating mappingdata for existed node returns true");
 
         // assert all portmappings have been created for the roadm node
         ReadTransaction rr = dataBroker.newReadOnlyTransaction();
@@ -440,13 +459,12 @@ public class PortMappingVersion121Test {
         try {
             Optional<Network> optionalNetwork = rr.read(LogicalDatastoreType.CONFIGURATION, mappingIID).get();
             if (optionalNetwork.isPresent()) {
-                network = optionalNetwork.get();
+                network = optionalNetwork.orElseThrow();
             }
 
         } catch (ExecutionException | InterruptedException e) {
             LOG.error("Failed to read mapping.", e);
             fail();
-
         }
         List<String> testMappings = Arrays.asList("SRG2-PP1-RX", "SRG3-PP1-RX", "SRG1-PP1-TXRX", "SRG3-PP1-TX",
                 "DEG1-TTP-TXRX", "SRG2-PP1-TX", "DEG2-TTP-RX", "DEG2-TTP-TX", "DEG3-TTP-RX", "DEG3-TTP-TX");
@@ -458,23 +476,23 @@ public class PortMappingVersion121Test {
         }
         Collections.sort(testMappings);
         Collections.sort(mappings);
-        assertEquals("test mapping are equals to mapping", testMappings, mappings);
+        assertEquals(testMappings, mappings, "test mapping are equals to mapping");
 
         // test updateMapping
-        assertTrue("update mapping for node returns true",
-                portMappingVersion121.updateMapping("node", mappingValues.get(0)));
+        assertTrue(portMappingVersion121.updateMapping("node", mappingValues.get(0)),
+            "update mapping for node returns true");
 
         // test createMapping for non-existent roadm node
-        assertFalse("create non existed roadm node returns false", portMappingVersion121.createMappingData("node2"));
+        assertFalse(portMappingVersion121.createMappingData("node2"), "create non existed roadm node returns false");
 
         // test updateMapping for null roadm node
-        assertFalse("updating null roadm node returns false",
-                portMappingVersion121.updateMapping(null, mappingValues.get(0)));
+        assertFalse(portMappingVersion121.updateMapping(null, mappingValues.get(0)),
+            "updating null roadm node returns false");
 
     }
 
     @Test
-    public void createMappingDataTestXpdr() {
+    void createMappingDataTestXpdr() {
         // mock node info
         final Info info = getInfo();
 
@@ -540,7 +558,10 @@ public class PortMappingVersion121Test {
         when(deviceTransactionManager.getDataFromDevice("node", LogicalDatastoreType.OPERATIONAL, portID5,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT)).thenReturn(Optional.of(ports5));
 
-        InstanceIdentifier<Info> infoIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Info.class);
+        InstanceIdentifier<Info> infoIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Info.class)
+            .build();
         when(deviceTransactionManager.getDataFromDevice("node", LogicalDatastoreType.OPERATIONAL, infoIID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT)).thenReturn(Optional.of(info));
 
@@ -550,26 +571,34 @@ public class PortMappingVersion121Test {
         CircuitPacks circuitPackObject3 = getCircuitPacks(portsList2, "c3", "pc3");
         CircuitPacks circuitPackObject4 = getCircuitPacks(portsList4, "c4", "pc4");
 
-        InstanceIdentifier<CircuitPacks> circuitPacksIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(CircuitPacks.class, new CircuitPacksKey("c1"));
+        InstanceIdentifier<CircuitPacks> circuitPacksIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey("c1"))
+            .build();
         when(deviceTransactionManager.getDataFromDevice("node", LogicalDatastoreType.OPERATIONAL, circuitPacksIID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
                         .thenReturn(Optional.of(circuitPackObject));
 
-        InstanceIdentifier<CircuitPacks> circuitPacksIID2 = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(CircuitPacks.class, new CircuitPacksKey("c2"));
+        InstanceIdentifier<CircuitPacks> circuitPacksIID2 = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey("c2"))
+            .build();
         when(deviceTransactionManager.getDataFromDevice("node", LogicalDatastoreType.OPERATIONAL, circuitPacksIID2,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
                         .thenReturn(Optional.of(circuitPackObject2));
 
-        InstanceIdentifier<CircuitPacks> circuitPacksIID3 = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(CircuitPacks.class, new CircuitPacksKey("c3"));
+        InstanceIdentifier<CircuitPacks> circuitPacksIID3 = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey("c3"))
+            .build();
         when(deviceTransactionManager.getDataFromDevice("node", LogicalDatastoreType.OPERATIONAL, circuitPacksIID3,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
                         .thenReturn(Optional.of(circuitPackObject3));
 
-        InstanceIdentifier<CircuitPacks> circuitPacksIID4 = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(CircuitPacks.class, new CircuitPacksKey("c4"));
+        InstanceIdentifier<CircuitPacks> circuitPacksIID4 = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey("c4"))
+            .build();
         when(deviceTransactionManager.getDataFromDevice("node", LogicalDatastoreType.OPERATIONAL, circuitPacksIID4,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
                         .thenReturn(Optional.of(circuitPackObject4));
@@ -582,12 +611,14 @@ public class PortMappingVersion121Test {
 
         OrgOpenroadmDevice deviceObject = new OrgOpenroadmDeviceBuilder().setCircuitPacks(circuitPacksMap)
                 .setConnectionMap(connectionMapMap).build();
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         when(deviceTransactionManager.getDataFromDevice("node", LogicalDatastoreType.OPERATIONAL, deviceIID,
                 Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT)).thenReturn(Optional.of(deviceObject));
 
         // test createMappingData for xpdr node with 2 network + 1 client + unidirectional & bidirectional ports
-        assertTrue("returns true when create mapping ", portMappingVersion121.createMappingData("node"));
+        assertTrue(portMappingVersion121.createMappingData("node"), "returns true when create mapping");
 
         // assert all portmappings have been created for the xpdr node
         ReadTransaction rr = dataBroker.newReadOnlyTransaction();
@@ -596,7 +627,7 @@ public class PortMappingVersion121Test {
         try {
             Optional<Network> optionalNetwork = rr.read(LogicalDatastoreType.CONFIGURATION, mappingIID).get();
             if (optionalNetwork.isPresent()) {
-                network = optionalNetwork.get();
+                network = optionalNetwork.orElseThrow();
             }
 
         } catch (ExecutionException | InterruptedException e) {
@@ -613,13 +644,16 @@ public class PortMappingVersion121Test {
         }
         Collections.sort(testMappings);
         Collections.sort(mappings);
-        assertEquals("test mapping are equals to mapping", testMappings, mappings);
+        assertEquals(testMappings, mappings, "test mapping are equals to mapping");
     }
 
     @NonNull
-    private KeyedInstanceIdentifier<Ports, PortsKey> getChild(String c4, String p5) {
-        return InstanceIdentifier.create(OrgOpenroadmDevice.class).child(CircuitPacks.class, new CircuitPacksKey(c4))
-                .child(Ports.class, new PortsKey(p5));
+    private InstanceIdentifier<Ports> getChild(String c4, String p5) {
+        return InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey(c4))
+            .child(Ports.class, new PortsKey(p5))
+            .build();
     }
 
     private ConnectionMap getConnectionMap(List<Destination> destinationList) {
@@ -673,5 +707,4 @@ public class PortMappingVersion121Test {
     private Interfaces getInterfaces(String i1) {
         return new InterfacesBuilder().setInterfaceName(i1).build();
     }
-
 }
index 646184645bb1218125e1220d59f854427d77fa9a..3c5fe33183671e4ae9c2aba025fa12b2a7cb3fbc 100644 (file)
@@ -8,17 +8,17 @@
 
 package org.opendaylight.transportpce.common.mapping;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.Port;
 
 public class SortPort121ByNameTest {
 
     @Test
-    public void compareTest() {
+    void compareTest() {
         Port port1 = mock(Port.class);
         Port port2 = mock(Port.class);
         when(port1.getPortName()).thenReturn("port1");
index ceb55557ba72c9fb6d26197bda64e9b4b67f372b..dec91c67106563f04a527aecbe84b3db7437bb01 100644 (file)
@@ -8,17 +8,17 @@
 
 package org.opendaylight.transportpce.common.mapping;
 
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.Port;
 
 public class SortPort221ByNameTest {
 
     @Test
-    public void compareTest() {
+    void compareTest() {
         Port port1 = mock(Port.class);
         Port port2 = mock(Port.class);
         when(port1.getPortName()).thenReturn("port1");
index 3eeca57e06f00483240998e7beddb6c90fd35ac2..c2b5bf5ef515e52829950a509accadcc63bce7f0 100644 (file)
@@ -8,12 +8,13 @@
 
 package org.opendaylight.transportpce.common.service;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
 
-import org.junit.Test;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingBuilder;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+import org.junit.jupiter.api.Test;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.PortQual;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.XpdrNodeTypes;
 import org.opendaylight.yangtools.yang.common.Uint32;
@@ -21,74 +22,73 @@ import org.opendaylight.yangtools.yang.common.Uint32;
 public class ServiceTypeTest {
 
     @Test
-    public void getServiceTypeForServiceFormatUnknownTest() {
+    void getServiceTypeForServiceFormatUnknownTest() {
         String serviceType = ServiceTypes.getServiceType("toto", null, null);
-        assertNull("service-type should be null", serviceType);
+        assertNull(serviceType, "service-type should be null");
     }
 
     @Test
-    public void getServiceTypeForServiceFormatOCTest() {
+    void getServiceTypeForServiceFormatOCTest() {
         String serviceType = ServiceTypes.getServiceType("OC", Uint32.valueOf(100), null);
-        assertEquals("service-type should be 100GEt", "100GEt", serviceType);
+        assertEquals("100GEt", serviceType, "service-type should be 100GEt");
         serviceType = ServiceTypes.getServiceType("OC", null, null);
-        assertNull("service-type should be null", serviceType);
+        assertNull(serviceType, "service-type should be null");
     }
 
     @Test
-    public void getServiceTypeForServiceFormatEthernetTest() {
+    void getServiceTypeForServiceFormatEthernetTest() {
         String serviceType = ServiceTypes.getServiceType("Ethernet", Uint32.valueOf(400), null);
-        assertEquals("service-type should be 400GE", "400GE", serviceType);
+        assertEquals("400GE", serviceType, "service-type should be 400GE");
         serviceType = ServiceTypes.getServiceType("Ethernet", Uint32.valueOf(100), null);
-        assertEquals("service-type should be 100GEt", "100GEt", serviceType);
+        assertEquals("100GEt", serviceType, "service-type should be 100GEt");
         Mapping mapping = new MappingBuilder()
             .setLogicalConnectionPoint("logicalConnectionPoint")
             .setPortQual(PortQual.XpdrClient.getName())
             .build();
         serviceType = ServiceTypes.getServiceType("Ethernet", Uint32.valueOf(100), mapping);
-        assertEquals("service-type should be 100GEt", "100GEt", serviceType);
+        assertEquals("100GEt", serviceType, "service-type should be 100GEt");
 
         mapping = new MappingBuilder()
             .setLogicalConnectionPoint("logicalConnectionPoint")
             .setPortQual(PortQual.SwitchClient.getName())
             .build();
         serviceType = ServiceTypes.getServiceType("Ethernet", Uint32.valueOf(100), mapping);
-        assertEquals("service-type should be 100GEm", "100GEm", serviceType);
+        assertEquals("100GEm", serviceType, "service-type should be 100GEm");
         serviceType = ServiceTypes.getServiceType("Ethernet", Uint32.valueOf(10), mapping);
-        assertEquals("service-type should be 10GE", "10GE", serviceType);
+        assertEquals("10GE", serviceType, "service-type should be 10GE");
         serviceType = ServiceTypes.getServiceType("Ethernet", Uint32.valueOf(1), mapping);
-        assertEquals("service-type should be 1GE", "1GE", serviceType);
+        assertEquals("1GE", serviceType, "service-type should be 1GE");
 
         mapping = new MappingBuilder()
             .setLogicalConnectionPoint("logicalConnectionPoint")
             .setPortQual(PortQual.SwitchClient.getName())
-            .setXponderType(XpdrNodeTypes.Switch)
+            .setXpdrType(XpdrNodeTypes.Switch)
             .build();
         serviceType = ServiceTypes.getServiceType("Ethernet", Uint32.valueOf(100), mapping);
-        assertEquals("service-type should be 100GEs", "100GEs", serviceType);
+        assertEquals("100GEs", serviceType, "service-type should be 100GEs");
     }
 
     @Test
-    public void getOtnServiceTypeForServiceFormatEthernetTest() {
+    void getOtnServiceTypeForServiceFormatEthernetTest() {
         String serviceType = ServiceTypes.getOtnServiceType("toto", Uint32.valueOf(123));
-        assertNull("service-type should be null", serviceType);
+        assertNull(serviceType, "service-type should be null");
         serviceType = ServiceTypes.getOtnServiceType("Ethernet", Uint32.valueOf(123));
-        assertNull("service-type should be null", serviceType);
+        assertNull(serviceType, "service-type should be null");
         serviceType = ServiceTypes.getOtnServiceType("Ethernet", Uint32.valueOf(1));
-        assertEquals("service-type should be 1GE", "1GE", serviceType);
+        assertEquals("1GE", serviceType, "service-type should be 1GE");
         serviceType = ServiceTypes.getOtnServiceType("Ethernet", Uint32.valueOf(10));
-        assertEquals("service-type should be 10GE", "10GE", serviceType);
+        assertEquals("10GE", serviceType, "service-type should be 10GE");
         serviceType = ServiceTypes.getOtnServiceType("Ethernet", Uint32.valueOf(100));
-        assertEquals("service-type should be 100GEm", "100GEm", serviceType);
+        assertEquals("100GEm", serviceType, "service-type should be 100GEm");
 
         serviceType = ServiceTypes.getOtnServiceType("OTU", Uint32.valueOf(100));
-        assertEquals("service-type should be OTU4", "OTU4", serviceType);
+        assertEquals("OTU4", serviceType, "service-type should be OTU4");
         serviceType = ServiceTypes.getOtnServiceType("OTU", Uint32.valueOf(400));
-        assertEquals("service-type should be OTUC4", "OTUC4", serviceType);
+        assertEquals("OTUC4", serviceType, "service-type should be OTUC4");
 
         serviceType = ServiceTypes.getOtnServiceType("ODU", Uint32.valueOf(100));
-        assertEquals("service-type should be ODU4", "ODU4", serviceType);
+        assertEquals("ODU4", serviceType, "service-type should be ODU4");
         serviceType = ServiceTypes.getOtnServiceType("ODU", Uint32.valueOf(400));
-        assertEquals("service-type should be ODUC4", "ODUC4", serviceType);
+        assertEquals("ODUC4", serviceType, "service-type should be ODUC4");
     }
-
 }
\ No newline at end of file
diff --git a/common/src/test/resources/apidocCatalog12_0-OptSpecV5_1.json b/common/src/test/resources/apidocCatalog12_0-OptSpecV5_1.json
new file mode 100644 (file)
index 0000000..830322c
--- /dev/null
@@ -0,0 +1,735 @@
+{
+    "operational-mode-catalog": {
+        "openroadm-operational-modes": {
+            "grid-parameters": {
+                "min-central-frequency": "191.32500000",
+                "max-central-frequency": "196.12500000",
+                "central-frequency-granularity": "12.50000",
+                "min-spacing": "37.50000"
+            },
+            "xponders-pluggables": {
+                "xponder-pluggable-openroadm-operational-mode": [
+                    {
+                        "openroadm-operational-mode-id": "OR-W-100G-SC",
+                        "baud-rate": "28.0",
+                        "line-rate": "111.8",
+                        "modulation-format": "dp-qpsk",
+                        "min-TX-osnr": "33.000",
+                        "TX-OOB-osnr": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-OOB-osnr-multi-channel-value": "31.000",
+                            "min-OOB-osnr-single-channel-value": "43.000"
+                        },
+                        "output-power-range": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-output-power": "-5.000",
+                            "max-output-power": "0.000"
+                        },
+                        "min-RX-osnr-tolerance": "17.000",
+                        "min-input-power-at-RX-osnr": "-22.000",
+                        "max-input-power": "1.000",
+                        "channel-width": "40.00000",
+                        "fec-type": "org-openroadm-common-types:scfec",
+                        "penalties": [
+                            {
+                                "parameter-and-unit": "CD-ps/nm",
+                                "up-to-boundary": "18000",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "6",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "PMD-ps",
+                                "up-to-boundary": "30",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-22",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "cross-talk-total-power-dB",
+                                "up-to-boundary": "15",
+                                "penalty-value": "0.200"
+                            },
+                            {
+                                "parameter-and-unit": "colorless-drop-adjacent-channel-crosstalk-GHz",
+                                "up-to-boundary": "4",
+                                "penalty-value": "0.200"
+                            }
+                        ]
+                    },
+                    {
+                        "openroadm-operational-mode-id": "OR-W-100G-oFEC-31.6Gbd",
+                        "baud-rate": "31.6",
+                        "line-rate": "126.3",
+                        "modulation-format": "dp-qpsk",
+                        "min-TX-osnr": "37.000",
+                        "TX-OOB-osnr": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-OOB-osnr-multi-channel-value": "36.000"
+                        },
+                        "output-power-range": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-output-power": "-5.000",
+                            "max-output-power": "0.000"
+                        },
+                        "min-RX-osnr-tolerance": "12.000",
+                        "min-input-power-at-RX-osnr": "-18.000",
+                        "max-input-power": "1.000",
+                        "channel-width": "37.88400",
+                        "fec-type": "org-openroadm-common-types:ofec",
+                        "min-roll-off": "0.05",
+                        "max-roll-off": "0.20",
+                        "penalties": [
+                            {
+                                "parameter-and-unit": "CD-ps/nm",
+                                "up-to-boundary": "4000",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "CD-ps/nm",
+                                "up-to-boundary": "48000",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "1",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "2",
+                                "penalty-value": "1.000"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "4",
+                                "penalty-value": "2.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "6",
+                                "penalty-value": "4.000"
+                            },
+                            {
+                                "parameter-and-unit": "PMD-ps",
+                                "up-to-boundary": "10",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "PMD-ps",
+                                "up-to-boundary": "30",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-18",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-20",
+                                "penalty-value": "1.000"
+                            },
+                            {
+                                "parameter-and-unit": "cross-talk-total-power-dB",
+                                "up-to-boundary": "15",
+                                "penalty-value": "0.200"
+                            },
+                            {
+                                "parameter-and-unit": "colorless-drop-adjacent-channel-crosstalk-GHz",
+                                "up-to-boundary": "4",
+                                "penalty-value": "0.200"
+                            }
+                        ]
+                    },
+                    {
+                        "openroadm-operational-mode-id": "OR-W-200G-oFEC-31.6Gbd",
+                        "baud-rate": "31.6",
+                        "line-rate": "252.6",
+                        "modulation-format": "dp-qam16",
+                        "min-TX-osnr": "37.000",
+                        "TX-OOB-osnr": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-OOB-osnr-multi-channel-value": "36.000"
+                        },
+                        "output-power-range": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-output-power": "-5.000",
+                            "max-output-power": "0.000"
+                        },
+                        "min-RX-osnr-tolerance": "20.500",
+                        "min-input-power-at-RX-osnr": "-16.000",
+                        "max-input-power": "1.000",
+                        "channel-width": "37.88400",
+                        "fec-type": "org-openroadm-common-types:ofec",
+                        "min-roll-off": "0.05",
+                        "max-roll-off": "0.20",
+                        "penalties": [
+                            {
+                                "parameter-and-unit": "CD-ps/nm",
+                                "up-to-boundary": "4000",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "CD-ps/nm",
+                                "up-to-boundary": "24000",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "1",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "2",
+                                "penalty-value": "1.000"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "4",
+                                "penalty-value": "2.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "6",
+                                "penalty-value": "4.000"
+                            },
+                            {
+                                "parameter-and-unit": "PMD-ps",
+                                "up-to-boundary": "10",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "PMD-ps",
+                                "up-to-boundary": "30",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-16",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-18",
+                                "penalty-value": "1.000"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-20",
+                                "penalty-value": "2.000"
+                            },
+                            {
+                                "parameter-and-unit": "cross-talk-total-power-dB",
+                                "up-to-boundary": "15",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "colorless-drop-adjacent-channel-crosstalk-GHz",
+                                "up-to-boundary": "4",
+                                "penalty-value": "0.500"
+                            }
+                        ]
+                    },
+                    {
+                        "openroadm-operational-mode-id": "OR-W-200G-oFEC-63.1Gbd",
+                        "baud-rate": "63.1",
+                        "line-rate": "252.6",
+                        "modulation-format": "dp-qpsk",
+                        "min-TX-osnr": "37.000",
+                        "TX-OOB-osnr": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-OOB-osnr-multi-channel-value": "36.000"
+                        },
+                        "output-power-range": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-output-power": "-5.000",
+                            "max-output-power": "0.000"
+                        },
+                        "min-RX-osnr-tolerance": "17.000",
+                        "min-input-power-at-RX-osnr": "-18.000",
+                        "max-input-power": "1.000",
+                        "channel-width": "75.72000",
+                        "fec-type": "org-openroadm-common-types:ofec",
+                        "min-roll-off": "0.05",
+                        "max-roll-off": "0.20",
+                        "penalties": [
+                            {
+                                "parameter-and-unit": "CD-ps/nm",
+                                "up-to-boundary": "4000",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "CD-ps/nm",
+                                "up-to-boundary": "24000",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "1",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "2",
+                                "penalty-value": "1.000"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "4",
+                                "penalty-value": "2.500"
+                            },
+                            {
+                                "parameter-and-unit": "PMD-ps",
+                                "up-to-boundary": "10",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "PMD-ps",
+                                "up-to-boundary": "25",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-18",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-20",
+                                "penalty-value": "1.000"
+                            },
+                            {
+                                "parameter-and-unit": "cross-talk-total-power-dB",
+                                "up-to-boundary": "15",
+                                "penalty-value": "0.300"
+                            },
+                            {
+                                "parameter-and-unit": "colorless-drop-adjacent-channel-crosstalk-GHz",
+                                "up-to-boundary": "4",
+                                "penalty-value": "0.500"
+                            }
+                        ]
+                    },
+                    {
+                        "openroadm-operational-mode-id": "OR-W-300G-oFEC-63.1Gbd",
+                        "baud-rate": "63.1",
+                        "line-rate": "378.8",
+                        "modulation-format": "dp-qam8",
+                        "min-TX-osnr": "37.000",
+                        "TX-OOB-osnr": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-OOB-osnr-multi-channel-value": "36.000"
+                        },
+                        "output-power-range": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-output-power": "-5.000",
+                            "max-output-power": "0.000"
+                        },
+                        "min-RX-osnr-tolerance": "21.000",
+                        "min-input-power-at-RX-osnr": "-16.000",
+                        "max-input-power": "1.000",
+                        "channel-width": "75.72000",
+                        "fec-type": "org-openroadm-common-types:ofec",
+                        "min-roll-off": "0.05",
+                        "max-roll-off": "0.20",
+                        "penalties": [
+                            {
+                                "parameter-and-unit": "CD-ps/nm",
+                                "up-to-boundary": "4000",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "CD-ps/nm",
+                                "up-to-boundary": "18000",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "1.00",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "2.00",
+                                "penalty-value": "1.000"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "4.00",
+                                "penalty-value": "2.500"
+                            },
+                            {
+                                "parameter-and-unit": "PMD-ps",
+                                "up-to-boundary": "10.00",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "PMD-ps",
+                                "up-to-boundary": "25.00",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-16.00",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-18.00",
+                                "penalty-value": "1.000"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-20.00",
+                                "penalty-value": "2.000"
+                            },
+                            {
+                                "parameter-and-unit": "cross-talk-total-power-dB",
+                                "up-to-boundary": "15.00",
+                                "penalty-value": "0.300"
+                            },
+                            {
+                                "parameter-and-unit": "colorless-drop-adjacent-channel-crosstalk-GHz",
+                                "up-to-boundary": "4.0",
+                                "penalty-value": "0.500"
+                            }
+                        ]
+                    },
+                    {
+                        "openroadm-operational-mode-id": "OR-W-400G-oFEC-63.1Gbd",
+                        "baud-rate": "63.1",
+                        "line-rate": "505.1",
+                        "modulation-format": "dp-qam16",
+                        "min-TX-osnr": "37.000",
+                        "TX-OOB-osnr": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-OOB-osnr-multi-channel-value": "36.000"
+                        },
+                        "output-power-range": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-output-power": "-5.000",
+                            "max-output-power": "0.000"
+                        },
+                        "min-RX-osnr-tolerance": "24.000",
+                        "min-input-power-at-RX-osnr": "-14.000",
+                        "max-input-power": "1.000",
+                        "channel-width": "75.72000",
+                        "fec-type": "org-openroadm-common-types:ofec",
+                        "min-roll-off": "0.05",
+                        "max-roll-off": "0.20",
+                        "penalties": [
+                            {
+                                "parameter-and-unit": "CD-ps/nm",
+                                "up-to-boundary": "4000",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "CD-ps/nm",
+                                "up-to-boundary": "12000",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "1.00",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "2.00",
+                                "penalty-value": "1.000"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "4.00",
+                                "penalty-value": "2.500"
+                            },
+                            {
+                                "parameter-and-unit": "PMD-ps",
+                                "up-to-boundary": "10.00",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "PMD-ps",
+                                "up-to-boundary": "20.00",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-14",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-16.00",
+                                "penalty-value": "1.000"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-18.00",
+                                "penalty-value": "2.000"
+                            },
+                            {
+                                "parameter-and-unit": "cross-talk-total-power-dB",
+                                "up-to-boundary": "13.00",
+                                "penalty-value": "0.300"
+                            },
+                            {
+                                "parameter-and-unit": "cross-talk-total-power-dB",
+                                "up-to-boundary": "15.00",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "colorless-drop-adjacent-channel-crosstalk-GHz",
+                                "up-to-boundary": "4.10",
+                                "penalty-value": "0.500"
+                            }
+                        ]
+                    }
+                ]
+            },
+            "roadms": {
+                "Express": {
+                    "openroadm-operational-mode": {
+                        "openroadm-operational-mode-id": "MW-MW-core",
+                        "per-channel-Pin-min": "-21.000",
+                        "per-channel-Pin-max": "-9.000",
+                        "max-introduced-pdl": "1.500",
+                        "max-introduced-dgd": "3.00",
+                        "max-introduced-cd": "25.00",
+                        "osnr-polynomial-fit": {
+                            "A": "-0.00059520",
+                            "B": "-0.06250000",
+                            "C": "-1.07100000",
+                            "D": "27.99000000"
+                        },
+                        "mask-power-vs-pin": [
+                            {
+                                "lower-boundary": "0",
+                                "upper-boundary": "6",
+                                "C": "1.00000000",
+                                "D": "-9.00000000",
+                                "fiber-type": "smf"
+                            },
+                            {
+                                "lower-boundary": "6",
+                                "upper-boundary": "8",
+                                "C": "-0.00000000",
+                                "D": "-3.00000000",
+                                "fiber-type": "smf"
+                            },
+                            {
+                                "lower-boundary": "8",
+                                "upper-boundary": "23",
+                                "C": "0.33333334",
+                                "D": "-5.66666667",
+                                "fiber-type": "smf"
+                            },
+                            {
+                                "lower-boundary": "23",
+                                "upper-boundary": "27",
+                                "C": "0.00000000",
+                                "D": "2.00000000",
+                                "fiber-type": "smf"
+                            }
+                        ]
+                    }
+                },
+                "Add": {
+                    "add-openroadm-operational-mode": {
+                        "openroadm-operational-mode-id": "MW-WR-core",
+                        "incremental-osnr": "33.000",
+                        "per-channel-Pin-min": "-6.000",
+                        "per-channel-Pin-max": "3.000",
+                        "max-introduced-pdl": "1.500",
+                        "max-introduced-dgd": "3.00",
+                        "max-introduced-cd": "25.00",
+                        "mask-power-vs-pin": [
+                            {
+                                "lower-boundary": "0",
+                                "upper-boundary": "6",
+                                "C": "1.00000000",
+                                "D": "-9.00000000",
+                                "fiber-type": "smf"
+                            },
+                            {
+                                "lower-boundary": "6",
+                                "upper-boundary": "8",
+                                "C": "-0.00000000",
+                                "D": "-3.00000000",
+                                "fiber-type": "smf"
+                            },
+                            {
+                                "lower-boundary": "8",
+                                "upper-boundary": "23",
+                                "C": "0.33333334",
+                                "D": "-5.66666667",
+                                "fiber-type": "smf"
+                            },
+                            {
+                                "lower-boundary": "23",
+                                "upper-boundary": "27",
+                                "C": "0.00000000",
+                                "D": "2.00000000",
+                                "fiber-type": "smf"
+                            }
+                        ]
+                    }
+                },
+                "Drop": {
+                    "openroadm-operational-mode": {
+                        "openroadm-operational-mode-id": "MW-WR-core",
+                        "per-channel-Pin-min": "-25.000",
+                        "per-channel-Pin-max": "-9.000",
+                        "max-introduced-pdl": "1.500",
+                        "max-introduced-dgd": "3.00",
+                        "max-introduced-cd": "25.00",
+                        "osnr-polynomial-fit": {
+                            "A": "-0.00059520",
+                            "B": "-0.06250000",
+                            "C": "-1.07100000",
+                            "D": "27.99000000"
+                        },
+                        "per-channel-Pout-min": "-22.000",
+                        "per-channel-Pout-max": "1.000"
+                    }
+                }
+            },
+            "amplifiers": {
+                "Amplifier": {
+                    "openroadm-operational-mode": [
+                        {
+                            "openroadm-operational-mode-id": "MWi-standard",
+                            "per-channel-Pin-min": "-31.000",
+                            "per-channel-Pin-max": "-9.000",
+                            "max-introduced-pdl": "0.70",
+                            "max-introduced-dgd": "3.00",
+                            "max-introduced-cd": "0.00",
+                            "osnr-polynomial-fit": {
+                                "A": "-0.00059520",
+                                "B": "-0.06250000",
+                                "C": "-1.07100000",
+                                "D": "28.99000000"
+                            },
+                            "mask-power-vs-pin": [
+                                {
+                                    "lower-boundary": "0",
+                                    "upper-boundary": "6",
+                                    "C": "1.00000000",
+                                    "D": "-9.00000000",
+                                    "fiber-type": "smf"
+                                },
+                                {
+                                    "lower-boundary": "6",
+                                    "upper-boundary": "8",
+                                    "C": "-0.00000000",
+                                    "D": "-3.00000000",
+                                    "fiber-type": "smf"
+                                },
+                                {
+                                    "lower-boundary": "8",
+                                    "upper-boundary": "23",
+                                    "C": "0.33333334",
+                                    "D": "-5.66666667",
+                                    "fiber-type": "smf"
+                                },
+                                {
+                                    "lower-boundary": "23",
+                                    "upper-boundary": "31",
+                                    "C": "0.00000000",
+                                    "D": "2.00000000",
+                                    "fiber-type": "smf"
+                                }
+                            ],
+                            "min-gain": "0.000",
+                            "max-gain": "27.000",
+                            "max-extended-gain": "31.000",
+                             "mask-gain-ripple-vs-tilt": [
+                                {
+                                    "lower-boundary": "-4",
+                                    "upper-boundary": "-1",
+                                    "C": "-0.50",
+                                    "D": "1.00"
+                                },
+                                {
+                                    "lower-boundary": "-1",
+                                    "upper-boundary": "0",
+                                    "C": "0.50",
+                                    "D": "2.00"
+                                }
+                            ]
+                        },
+                        {
+                            "openroadm-operational-mode-id": "MWi-low-noise",
+                            "per-channel-Pin-min": "-31.000",
+                            "per-channel-Pin-max": "-9.000",
+                            "max-introduced-pdl": "0.700",
+                            "max-introduced-dgd": "3.00",
+                            "max-introduced-cd": "0.00",
+                            "osnr-polynomial-fit": {
+                                "A": "-0.00081040",
+                                "B": "-0.06221000",
+                                "C": "-0.58890000",
+                                "D": "37.62000000"
+                            },
+                            "mask-power-vs-pin": [
+                                {
+                                    "lower-boundary": "0",
+                                    "upper-boundary": "6",
+                                    "C": "1.00000000",
+                                    "D": "-9.00000000",
+                                    "fiber-type": "smf"
+                                },
+                                {
+                                    "lower-boundary": "6",
+                                    "upper-boundary": "8",
+                                    "C": "-0.00000000",
+                                    "D": "-3.00000000",
+                                    "fiber-type": "smf"
+                                },
+                                {
+                                    "lower-boundary": "8",
+                                    "upper-boundary": "23",
+                                    "C": "0.33333334",
+                                    "D": "-5.66666667",
+                                    "fiber-type": "smf"
+                                },
+                                {
+                                    "lower-boundary": "23",
+                                    "upper-boundary": "31",
+                                    "C": "0.00000000",
+                                    "D": "2.00000000",
+                                    "fiber-type": "smf"
+                                }
+                            ],
+                            "min-gain": "0.000",
+                            "max-gain": "27.000",
+                            "max-extended-gain": "31.000",
+                             "mask-gain-ripple-vs-tilt": [
+                                {
+                                    "lower-boundary": "-4",
+                                    "upper-boundary": "-1",
+                                    "C": "-0.50",
+                                    "D": "1.00"
+                                },
+                                {
+                                    "lower-boundary": "-1",
+                                    "upper-boundary": "0",
+                                    "C": "0.50",
+                                    "D": "2.00"
+                                }
+                            ]
+                        }
+                    ]
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
index f27cf978c5d4cd811d12222c6fd940cf20acb33c..820331c4a8893aecb429baca92d6edabe7d7cd58 100644 (file)
@@ -1 +1 @@
-{"gnpy-api:request":{"topology":{"connections":[{"from_node":"127.0.0.51","to_node":"127.0.0.50"},{"from_node":"127.0.0.30","to_node":"127.0.0.31"},{"from_node":"127.0.0.10","to_node":"243.0.0.1"},{"from_node":"243.0.0.1","to_node":"127.0.0.30"},{"from_node":"127.0.0.20","to_node":"127.0.0.21"},{"from_node":"127.0.0.20","to_node":"243.0.0.2"},{"from_node":"243.0.0.2","to_node":"127.0.0.10"},{"from_node":"127.0.0.20","to_node":"243.0.0.3"},{"from_node":"243.0.0.3","to_node":"127.0.0.50"},{"from_node":"127.0.0.40","to_node":"127.0.0.41"},{"from_node":"127.0.0.40","to_node":"243.0.0.4"},{"from_node":"243.0.0.4","to_node":"127.0.0.30"},{"from_node":"127.0.0.50","to_node":"243.0.0.5"},{"from_node":"243.0.0.5","to_node":"127.0.0.30"},{"from_node":"127.0.0.31","to_node":"127.0.0.30"},{"from_node":"127.0.0.50","to_node":"127.0.0.51"},{"from_node":"127.0.0.20","to_node":"243.0.0.6"},{"from_node":"243.0.0.6","to_node":"127.0.0.30"},{"from_node":"127.0.0.30","to_node":"243.0.0.7"},{"from_node":"243.0.0.7","to_node":"127.0.0.40"},{"from_node":"127.0.0.11","to_node":"127.0.0.10"},{"from_node":"127.0.0.30","to_node":"243.0.0.8"},{"from_node":"243.0.0.8","to_node":"127.0.0.10"},{"from_node":"127.0.0.40","to_node":"243.0.0.9"},{"from_node":"243.0.0.9","to_node":"127.0.0.50"},{"from_node":"127.0.0.30","to_node":"243.0.0.10"},{"from_node":"243.0.0.10","to_node":"127.0.0.50"},{"from_node":"127.0.0.50","to_node":"243.0.0.11"},{"from_node":"243.0.0.11","to_node":"127.0.0.20"},{"from_node":"127.0.0.50","to_node":"243.0.0.12"},{"from_node":"243.0.0.12","to_node":"127.0.0.40"},{"from_node":"127.0.0.21","to_node":"127.0.0.20"},{"from_node":"127.0.0.41","to_node":"127.0.0.40"},{"from_node":"127.0.0.30","to_node":"243.0.0.13"},{"from_node":"243.0.0.13","to_node":"127.0.0.20"},{"from_node":"127.0.0.10","to_node":"127.0.0.11"},{"from_node":"127.0.0.10","to_node":"243.0.0.14"},{"from_node":"243.0.0.14","to_node":"127.0.0.20"}],"elements":[{"uid":"127.0.0.11","metadata":{"location":{"latitude":0,"longitude":0,"region":"XPONDER-1"}},"type":"gnpy-network-topology:Transceiver"},{"uid":"127.0.0.10","metadata":{"location":{"latitude":0,"longitude":0,"region":"OpenROADM-1"}},"type":"gnpy-network-topology:Roadm","params":{"target_pch_out_db":-20}},{"uid":"127.0.0.51","metadata":{"location":{"latitude":0,"longitude":0,"region":"XPONDER-5"}},"type":"gnpy-network-topology:Transceiver"},{"uid":"127.0.0.50","metadata":{"location":{"latitude":0,"longitude":0,"region":"OpenROADM-5"}},"type":"gnpy-network-topology:Roadm","params":{"target_pch_out_db":-20}},{"uid":"127.0.0.31","metadata":{"location":{"latitude":0,"longitude":0,"region":"XPONDER-3"}},"type":"gnpy-network-topology:Transceiver"},{"uid":"127.0.0.30","metadata":{"location":{"latitude":0,"longitude":0,"region":"OpenROADM-3"}},"type":"gnpy-network-topology:Roadm","params":{"target_pch_out_db":-20}},{"uid":"127.0.0.21","metadata":{"location":{"latitude":0,"longitude":0,"region":"XPONDER-2"}},"type":"gnpy-network-topology:Transceiver"},{"uid":"127.0.0.40","metadata":{"location":{"latitude":0,"longitude":0,"region":"OpenROADM-4"}},"type":"gnpy-network-topology:Roadm","params":{"target_pch_out_db":-20}},{"uid":"127.0.0.20","metadata":{"location":{"latitude":0,"longitude":0,"region":"OpenROADM-2"}},"type":"gnpy-network-topology:Roadm","params":{"target_pch_out_db":-20}},{"uid":"127.0.0.41","metadata":{"location":{"latitude":0,"longitude":0,"region":"XPONDER-4"}},"type":"gnpy-network-topology:Transceiver"},{"uid":"243.0.0.12","metadata":{"location":{"latitude":0,"city":"N/A","longitude":0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0,"con_in":0,"length":100,"con_out":0,"loss_coef":0.29}},{"uid":"243.0.0.11","metadata":{"location":{"latitude":0,"city":"N/A","longitude":0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0,"con_in":0,"length":60,"con_out":0,"loss_coef":0.12}},{"uid":"243.0.0.10","metadata":{"location":{"latitude":0,"city":"N/A","longitude":0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0,"con_in":0,"length":60,"con_out":0,"loss_coef":0.12}},{"uid":"243.0.0.14","metadata":{"location":{"latitude":0,"city":"N/A","longitude":0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0,"con_in":0,"length":100,"con_out":0,"loss_coef":0.29}},{"uid":"243.0.0.13","metadata":{"location":{"latitude":0,"city":"N/A","longitude":0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0,"con_in":0,"length":140,"con_out":0,"loss_coef":0.2127659574468085124099303584443987347185611724853515625}},{"uid":"243.0.0.8","metadata":{"location":{"latitude":0,"city":"N/A","longitude":0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0,"con_in":0,"length":100,"con_out":0,"loss_coef":0.11999999999999999555910790149937383830547332763671875}},{"uid":"243.0.0.9","metadata":{"location":{"latitude":0,"city":"N/A","longitude":0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0,"con_in":0,"length":100,"con_out":0,"loss_coef":0.29}},{"uid":"243.0.0.4","metadata":{"location":{"latitude":0,"city":"N/A","longitude":0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0,"con_in":0,"length":100,"con_out":0,"loss_coef":0.29}},{"uid":"243.0.0.5","metadata":{"location":{"latitude":0,"city":"N/A","longitude":0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0,"con_in":0,"length":60,"con_out":0,"loss_coef":0.12}},{"uid":"243.0.0.6","metadata":{"location":{"latitude":0,"city":"N/A","longitude":0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0,"con_in":0,"length":140,"con_out":0,"loss_coef":0.2127659574468085124099303584443987347185611724853515625}},{"uid":"243.0.0.7","metadata":{"location":{"latitude":0,"city":"N/A","longitude":0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0,"con_in":0,"length":100,"con_out":0,"loss_coef":0.29}},{"uid":"243.0.0.1","metadata":{"location":{"latitude":0,"city":"N/A","longitude":0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0,"con_in":0,"length":100,"con_out":0,"loss_coef":0.11999999999999999555910790149937383830547332763671875}},{"uid":"243.0.0.2","metadata":{"location":{"latitude":0,"city":"N/A","longitude":0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0,"con_in":0,"length":100,"con_out":0,"loss_coef":0.29}},{"uid":"243.0.0.3","metadata":{"location":{"latitude":0,"city":"N/A","longitude":0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0,"con_in":0,"length":60,"con_out":0,"loss_coef":0.12}}]},"service":{"path-request":[{"request-id":"2","bidirectional":false,"dst-tp-id":"ZHN0VHBJZA\u003d\u003d","src-tp-id":"c3JjVHBJZA\u003d\u003d","path-constraints":{"te-bandwidth":{"spacing":50000000000,"trx_mode":"W100G","trx_type":"openroadm-beta1","effective-freq-slot":[{"N":0,"M":4}],"path_bandwidth":100,"technology":"flexi-grid"}},"source":"127.0.0.11","explicit-route-objects":{"route-object-include-exclude":[{"index":0,"num-unnum-hop":{"hop-type":"STRICT","link-tp-id":"1","node-id":"127.0.0.20"},"explicit-route-usage":"gnpy-path-computation-simplified:route-include-ero"},{"index":1,"num-unnum-hop":{"hop-type":"STRICT","link-tp-id":"1","node-id":"127.0.0.30"},"explicit-route-usage":"gnpy-path-computation-simplified:route-include-ero"}]},"destination":"127.0.0.41"}]}}}
\ No newline at end of file
+{"gnpy-api:request":{"topology":{"connections":[{"from_node":"127.0.0.51","to_node":"127.0.0.50"},{"from_node":"127.0.0.30","to_node":"127.0.0.31"},{"from_node":"127.0.0.10","to_node":"243.0.0.1"},{"from_node":"243.0.0.1","to_node":"127.0.0.30"},{"from_node":"127.0.0.20","to_node":"127.0.0.21"},{"from_node":"127.0.0.20","to_node":"243.0.0.2"},{"from_node":"243.0.0.2","to_node":"127.0.0.10"},{"from_node":"127.0.0.20","to_node":"243.0.0.3"},{"from_node":"243.0.0.3","to_node":"127.0.0.50"},{"from_node":"127.0.0.40","to_node":"127.0.0.41"},{"from_node":"127.0.0.40","to_node":"243.0.0.4"},{"from_node":"243.0.0.4","to_node":"127.0.0.30"},{"from_node":"127.0.0.50","to_node":"243.0.0.5"},{"from_node":"243.0.0.5","to_node":"127.0.0.30"},{"from_node":"127.0.0.31","to_node":"127.0.0.30"},{"from_node":"127.0.0.50","to_node":"127.0.0.51"},{"from_node":"127.0.0.20","to_node":"243.0.0.6"},{"from_node":"243.0.0.6","to_node":"127.0.0.30"},{"from_node":"127.0.0.30","to_node":"243.0.0.7"},{"from_node":"243.0.0.7","to_node":"127.0.0.40"},{"from_node":"127.0.0.11","to_node":"127.0.0.10"},{"from_node":"127.0.0.30","to_node":"243.0.0.8"},{"from_node":"243.0.0.8","to_node":"127.0.0.10"},{"from_node":"127.0.0.40","to_node":"243.0.0.9"},{"from_node":"243.0.0.9","to_node":"127.0.0.50"},{"from_node":"127.0.0.30","to_node":"243.0.0.10"},{"from_node":"243.0.0.10","to_node":"127.0.0.50"},{"from_node":"127.0.0.50","to_node":"243.0.0.11"},{"from_node":"243.0.0.11","to_node":"127.0.0.20"},{"from_node":"127.0.0.50","to_node":"243.0.0.12"},{"from_node":"243.0.0.12","to_node":"127.0.0.40"},{"from_node":"127.0.0.21","to_node":"127.0.0.20"},{"from_node":"127.0.0.41","to_node":"127.0.0.40"},{"from_node":"127.0.0.30","to_node":"243.0.0.13"},{"from_node":"243.0.0.13","to_node":"127.0.0.20"},{"from_node":"127.0.0.10","to_node":"127.0.0.11"},{"from_node":"127.0.0.10","to_node":"243.0.0.14"},{"from_node":"243.0.0.14","to_node":"127.0.0.20"}],"elements":[{"uid":"127.0.0.11","metadata":{"location":{"latitude":0.0,"longitude":0.0,"region":"XPONDER-1"}},"type":"gnpy-network-topology:Transceiver"},{"uid":"127.0.0.10","metadata":{"location":{"latitude":0.0,"longitude":0.0,"region":"OpenROADM-1"}},"type":"gnpy-network-topology:Roadm","params":{"target_pch_out_db":-20.0}},{"uid":"127.0.0.21","metadata":{"location":{"latitude":0.0,"longitude":0.0,"region":"XPONDER-2"}},"type":"gnpy-network-topology:Transceiver"},{"uid":"127.0.0.40","metadata":{"location":{"latitude":0.0,"longitude":0.0,"region":"OpenROADM-4"}},"type":"gnpy-network-topology:Roadm","params":{"target_pch_out_db":-20.0}},{"uid":"127.0.0.51","metadata":{"location":{"latitude":0.0,"longitude":0.0,"region":"XPONDER-5"}},"type":"gnpy-network-topology:Transceiver"},{"uid":"127.0.0.50","metadata":{"location":{"latitude":0.0,"longitude":0.0,"region":"OpenROADM-5"}},"type":"gnpy-network-topology:Roadm","params":{"target_pch_out_db":-20.0}},{"uid":"127.0.0.20","metadata":{"location":{"latitude":0.0,"longitude":0.0,"region":"OpenROADM-2"}},"type":"gnpy-network-topology:Roadm","params":{"target_pch_out_db":-20.0}},{"uid":"127.0.0.31","metadata":{"location":{"latitude":0.0,"longitude":0.0,"region":"XPONDER-3"}},"type":"gnpy-network-topology:Transceiver"},{"uid":"127.0.0.30","metadata":{"location":{"latitude":0.0,"longitude":0.0,"region":"OpenROADM-3"}},"type":"gnpy-network-topology:Roadm","params":{"target_pch_out_db":-20.0}},{"uid":"127.0.0.41","metadata":{"location":{"latitude":0.0,"longitude":0.0,"region":"XPONDER-4"}},"type":"gnpy-network-topology:Transceiver"},{"uid":"243.0.0.12","metadata":{"location":{"latitude":0.0,"city":"N/A","longitude":0.0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0.0,"con_in":0.0,"length":100.0,"con_out":0.0,"loss_coef":0.29}},{"uid":"243.0.0.11","metadata":{"location":{"latitude":0.0,"city":"N/A","longitude":0.0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0.0,"con_in":0.0,"length":60.0,"con_out":0.0,"loss_coef":0.12}},{"uid":"243.0.0.10","metadata":{"location":{"latitude":0.0,"city":"N/A","longitude":0.0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0.0,"con_in":0.0,"length":60.0,"con_out":0.0,"loss_coef":0.12}},{"uid":"243.0.0.14","metadata":{"location":{"latitude":0.0,"city":"N/A","longitude":0.0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0.0,"con_in":0.0,"length":100.0,"con_out":0.0,"loss_coef":0.29}},{"uid":"243.0.0.13","metadata":{"location":{"latitude":0.0,"city":"N/A","longitude":0.0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0.0,"con_in":0.0,"length":140.0,"con_out":0.0,"loss_coef":0.21}},{"uid":"243.0.0.8","metadata":{"location":{"latitude":0.0,"city":"N/A","longitude":0.0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0.0,"con_in":0.0,"length":100.0,"con_out":0.0,"loss_coef":0.12}},{"uid":"243.0.0.9","metadata":{"location":{"latitude":0.0,"city":"N/A","longitude":0.0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0.0,"con_in":0.0,"length":100.0,"con_out":0.0,"loss_coef":0.29}},{"uid":"243.0.0.4","metadata":{"location":{"latitude":0.0,"city":"N/A","longitude":0.0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0.0,"con_in":0.0,"length":100.0,"con_out":0.0,"loss_coef":0.29}},{"uid":"243.0.0.5","metadata":{"location":{"latitude":0.0,"city":"N/A","longitude":0.0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0.0,"con_in":0.0,"length":60.0,"con_out":0.0,"loss_coef":0.12}},{"uid":"243.0.0.6","metadata":{"location":{"latitude":0.0,"city":"N/A","longitude":0.0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0.0,"con_in":0.0,"length":140.0,"con_out":0.0,"loss_coef":0.21}},{"uid":"243.0.0.7","metadata":{"location":{"latitude":0.0,"city":"N/A","longitude":0.0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0.0,"con_in":0.0,"length":100.0,"con_out":0.0,"loss_coef":0.29}},{"uid":"243.0.0.1","metadata":{"location":{"latitude":0.0,"city":"N/A","longitude":0.0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0.0,"con_in":0.0,"length":100.0,"con_out":0.0,"loss_coef":0.12}},{"uid":"243.0.0.2","metadata":{"location":{"latitude":0.0,"city":"N/A","longitude":0.0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0.0,"con_in":0.0,"length":100.0,"con_out":0.0,"loss_coef":0.29}},{"uid":"243.0.0.3","metadata":{"location":{"latitude":0.0,"city":"N/A","longitude":0.0,"region":"N/A"}},"type":"gnpy-network-topology:Fiber","type_variety":"SSMF","params":{"length_units":"gnpy-network-topology:km","att_in":0.0,"con_in":0.0,"length":60.0,"con_out":0.0,"loss_coef":0.12}}]},"service":{"path-request":[{"request-id":"2","bidirectional":false,"dst-tp-id":"ZHN0VHBJZA\u003d\u003d","src-tp-id":"c3JjVHBJZA\u003d\u003d","path-constraints":{"te-bandwidth":{"trx_type":"openroadm-beta1","effective-freq-slot":[{"N":0,"M":4}],"spacing":50000000000.0,"path_bandwidth":100.0,"trx_mode":"W100G","technology":"flexi-grid"}},"source":"127.0.0.11","explicit-route-objects":{"route-object-include-exclude":[{"index":0,"explicit-route-usage":"gnpy-path-computation-simplified:route-include-ero","num-unnum-hop":{"hop-type":"STRICT","link-tp-id":"1","node-id":"127.0.0.20"}},{"index":1,"explicit-route-usage":"gnpy-path-computation-simplified:route-include-ero","num-unnum-hop":{"hop-type":"STRICT","link-tp-id":"1","node-id":"127.0.0.30"}}]},"destination":"127.0.0.41"}]}}}
\ No newline at end of file
index 272f6990a6c81ed3fcba3779c78008a1405fef39..8c03f3328d87574e2961ad4f454a215f2fe6e390 100644 (file)
           },
           "params": {
             "length": 100,
-            "loss_coef": 0.11999999999999999555910790149937383830547332763671875,
+            "loss_coef": 0.12,
             "length_units": "gnpy-network-topology:km",
             "att_in": 0,
             "con_in": 0,
           },
           "params": {
             "length": 140,
-            "loss_coef": 0.2127659574468085124099303584443987347185611724853515625,
+            "loss_coef": 0.21,
             "length_units": "gnpy-network-topology:km",
             "att_in": 0,
             "con_in": 0,
           },
           "params": {
             "length": 100,
-            "loss_coef": 0.11999999999999999555910790149937383830547332763671875,
+            "loss_coef": 0.12,
             "length_units": "gnpy-network-topology:km",
             "att_in": 0,
             "con_in": 0,
           },
           "params": {
             "length": 140,
-            "loss_coef": 0.2127659574468085124099303584443987347185611724853515625,
+            "loss_coef": 0.21,
             "length_units": "gnpy-network-topology:km",
             "att_in": 0,
             "con_in": 0,
index e4799d66c30f68a916e739f67dbe1e9aa94ecf0a..a7125b35a0c74804cdce30388736010566d2db98 100755 (executable)
@@ -12,6 +12,7 @@
 
 use strict;
 use warnings;
+
 #use diagnostics;  #uncomment this line for more details when encountering warnings
 use Net::OpenSSH;
 use FileHandle;
@@ -20,15 +21,19 @@ use Getopt::Long qw(:config no_ignore_case bundling);
 use IO::Socket;
 use Net::hostent;
 
-my ($host, $help, $usage,  $proxy_port, $login, $password, $kidpid, $ssh_subsocket, $simpleproxy,
-    $pid, $ssh_handle, $client, $server, $capabilities, $hello_message, $verbose);
+my (
+    $host,        $help,         $usage,         $proxy_port,
+    $login,       $password,     $kidpid,        $ssh_subsocket,
+    $simpleproxy, $pid,          $ssh_handle,    $client,
+    $server,      $capabilities, $hello_message, $verbose
+);
 
-GetOptions (
-    "h|help" =>\$help,
-    "p|port=i"=>\$proxy_port,
-    "s|simpleproxy" =>\$simpleproxy,
-    "v|verbose" =>\$verbose,
-    "C|capabilities=s"=>\$capabilities
+GetOptions(
+    "h|help"           => \$help,
+    "p|port=i"         => \$proxy_port,
+    "s|simpleproxy"    => \$simpleproxy,
+    "v|verbose"        => \$verbose,
+    "C|capabilities=s" => \$capabilities
 );
 $usage = "
 USAGE: netconf_TCP_SSH_hijackproxy.pl [-h|--help] [-p|--port <port_number>] [-s|--simpleproxy] [-v|--verbose] [-C|--capabilities <custom_hello_file.xml>] <[login[:password]@]host[:port]> [login] [password]
@@ -59,39 +64,42 @@ if ($help) {
     exit(0);
 }
 
-unless (@ARGV >= 1) {
+unless ( @ARGV >= 1 ) {
     print $usage;
     exit(0);
 }
 
-($host, $login, $password) = @ARGV;
+( $host, $login, $password ) = @ARGV;
 
 #netconf default port is no 22 but 830
-if ($host !~ /:[0-9]+$/) { $host.=':830'; }
+if ( $host !~ /:[0-9]+$/ ) { $host .= ':830'; }
 
-if (!defined($proxy_port)) { $proxy_port = 9000; }
+if ( !defined($proxy_port) ) { $proxy_port = 9000; }
 
-my $connection_string=$host;
+my $connection_string = $host;
 if ($password) {
-   $connection_string=$login.":".$password."@".$connection_string;
-} elsif ($login) {
-   $connection_string=$login."@".$connection_string;
+    $connection_string = $login . ":" . $password . "@" . $connection_string;
+}
+elsif ($login) {
+    $connection_string = $login . "@" . $connection_string;
 }
 
 #retrieving hello custom file if any
-if ((!defined ($simpleproxy))&&(defined ($capabilities))) {
-    open(CAPABILITIES,'<',$capabilities) or die ("can not open $capabilities") ;
+if ( ( !defined($simpleproxy) ) && ( defined($capabilities) ) ) {
+    open( CAPABILITIES, '<', $capabilities )
+      or die("can not open $capabilities");
     while (<CAPABILITIES>) {
         $hello_message .= $_;
     }
-    chop $hello_message; # removing EOF
-    $hello_message.="]]>]]>";
+    chop $hello_message;    # removing EOF
+    $hello_message .= "]]>]]>";
     close(CAPABILITIES);
 }
 
 # the following regex are used to modify some part of the server messages relayed to the client
 # you can adapt it to your needs, some examples have been commented.
-my %regex_hash=(
+my %regex_hash = (
+
 # replace oo-device v1.2 by v1.2.1
 #   'module=org-openroadm-device&amp;revision=2016-10-14.*<\/capability>'=>'s/&amp;revision=2016-10-14/&amp;revision=2017-02-06/',
 #   '<schema><identifier>org-openroadm-device<\/identifier><version>2016-10-14'=>'s@<schema><identifier>org-openroadm-device</identifier><version>2016-10-14@<schema><identifier>org-openroadm-device</identifier><version>2017-02-06@',
@@ -100,105 +108,119 @@ my %regex_hash=(
 # add the ietf-netconf capability to the hello handshake - without it, ODL netconf mountpoints can not work
 #    '<\/capabilities>'=>'s@</capabilities>@\n<capability>urn:ietf:params:xml:ns:yang:ietf-netconf?module=ietf-netconf&amp;revision=2011-06-01</capability>\n</capabilities>@',
 # add the right notifications capabilities to the hello handshake + provide another solution for the ietf-netconf capability
-    '<\/capabilities>'=>'s@</capabilities>@\n<capability>urn:ietf:params:xml:ns:netmod:notification?module=nc-notifications&amp;revision=2008-07-14</capability>\n<capability>urn:ietf:params:xml:ns:netconf:notification:1.0?module=notifications&amp;revision=2008-07-14</capability>\n<capability>urn:ietf:params:xml:ns:netconf:base:1.0?module=ietf-netconf&amp;revision=2011-06-01</capability>\n</capabilities>@'
+    '<\/capabilities>' =>
+'s@</capabilities>@\n<capability>urn:ietf:params:xml:ns:netmod:notification?module=nc-notifications&amp;revision=2008-07-14</capability>\n<capability>urn:ietf:params:xml:ns:netconf:notification:1.0?module=notifications&amp;revision=2008-07-14</capability>\n<capability>urn:ietf:params:xml:ns:netconf:base:1.0?module=ietf-netconf&amp;revision=2011-06-01</capability>\n</capabilities>@'
 );
 
-if (defined ($simpleproxy)) { %regex_hash=(); }
+if ( defined($simpleproxy) ) { %regex_hash = (); }
 
 my %compiled_regex_hash;
-foreach my $keyword (keys %regex_hash){
-    eval ('$compiled_regex_hash{$keyword}= qr/'.$keyword.'/;');
+foreach my $keyword ( keys %regex_hash ) {
+    eval( '$compiled_regex_hash{$keyword}= qr/' . $keyword . '/;' );
 }
 
-$server = IO::Socket::INET->new( Proto     => 'tcp',
-                                 LocalPort => $proxy_port,
-                                 Listen    => SOMAXCONN,
-                                 Reuse     => 1);
+$server = IO::Socket::INET->new(
+    Proto     => 'tcp',
+    LocalPort => $proxy_port,
+    Listen    => SOMAXCONN,
+    Reuse     => 1
+);
 die "can't setup server" unless $server;
 print STDERR "[Proxy server $0 accepting clients: Ctrl-C to stop]\n";
 
+while ( $client = $server->accept() ) {
+    $client->autoflush(1);
+    my $hostinfo = gethostbyaddr( $client->peeraddr );
+    printf STDERR "[Incoming connection from %s]\n",
+      $hostinfo->name || $client->peerhost;
 
-while ($client = $server->accept()) {
-  $client->autoflush(1);
-  my $hostinfo = gethostbyaddr($client->peeraddr);
-  printf STDERR "[Incoming connection from %s]\n", $hostinfo->name || $client->peerhost;
+    print STDERR "[relaying to " . $connection_string . "]\n";
 
+    $ssh_handle = Net::OpenSSH->new(
+        $connection_string,
+        master_opts         => [ -o => 'StrictHostKeyChecking=no' ],
+        timeout             => 500,
+        kill_ssh_on_timeout => 500
+    );
 
-print STDERR "[relaying to ".$connection_string."]\n";
+    #netconf requires a specific socket
+    ( $ssh_subsocket, $pid ) =
+      $ssh_handle->open2socket( { ssh_opts => '-s' }, 'netconf' );
+    die "can't establish connection: exiting\n" unless defined($ssh_subsocket);
 
-$ssh_handle = Net::OpenSSH->new($connection_string,
-                                master_opts => [-o => 'StrictHostKeyChecking=no'],
-                                timeout => 500, kill_ssh_on_timeout => 500);
+    print STDERR "[Connected]\n";
 
-#netconf requires a specific socket
-($ssh_subsocket, $pid) = $ssh_handle->open2socket({ssh_opts => '-s'}, 'netconf');
-die "can't establish connection: exiting\n" unless defined($ssh_subsocket);
+    # split the program into two processes, identical twins
+    die "can't fork: $!" unless defined( $kidpid = fork() );
 
-print STDERR "[Connected]\n";
+    $| = 1;
 
-# split the program into two processes, identical twins
-die "can't fork: $!" unless defined($kidpid = fork());
+# the if{} block runs only in the parent process (server output relayed to the client)
+    if ( !$kidpid ) {
 
-$|=1;
+        # copy the socket to standard output
+        my $buf;
 
-# the if{} block runs only in the parent process (server output relayed to the client)
-if (!$kidpid) {
+        if ( defined($hello_message) ) {
 
-    # copy the socket to standard output
-    my $buf;
+            #retrieve the server hello but do not relay it
+            while ( my $nread = sysread( $ssh_subsocket, $buf, 400 ) ) {
+                $ssh_subsocket->flush();
+                if ( $buf =~ /]]>]]>/ ) { last }
+            }
+
+            #send a custom hello message instead
+            print $client $hello_message;
+            if ( defined($verbose) ) { print STDOUT $hello_message; }
+        }
 
-    if (defined ($hello_message)) {
-        #retrieve the server hello but do not relay it
-        while (my $nread = sysread($ssh_subsocket,$buf,400)) {
+#while (<$ssh_subsocket>) {
+#buffer seems not totally flushed when using the usual syntax above (nor when using autoflush)
+        while ( my $nread = sysread( $ssh_subsocket, $buf, 400 ) ) {
+            foreach my $keyword ( keys %regex_hash ) {
+                if ( $buf =~ $compiled_regex_hash{$keyword} ) {
+                    print STDERR 'found regex '
+                      . $keyword
+                      . ": replacing '\n"
+                      . $buf
+                      . "\n' by '\n";
+                    eval( '$buf =~ ' . $regex_hash{$keyword} . ';' );
+                    print STDERR $buf . "\n'\n";
+                }
+            }
+            print $client $buf;
             $ssh_subsocket->flush();
-            if ($buf =~ /]]>]]>/) { last };
-        };
-        #send a custom hello message instead
-        print $client $hello_message;
-        if (defined($verbose))  { print STDOUT  $hello_message; }
-    }
+            if ( defined($verbose) ) { print STDOUT $buf; }
 
-    #while (<$ssh_subsocket>) {
-    #buffer seems not totally flushed when using the usual syntax above (nor when using autoflush)
-    while (my $nread = sysread($ssh_subsocket,$buf,400)) {
-        foreach my $keyword (keys %regex_hash){
-           if($buf =~ $compiled_regex_hash{$keyword}){
-               print STDERR 'found regex '.$keyword.": replacing '\n".$buf."\n' by '\n";
-               eval ('$buf =~ '.$regex_hash{$keyword}.';');
-               print STDERR $buf."\n'\n";
-           }
         }
-        print $client $buf;
-        $ssh_subsocket->flush();
-        if (defined($verbose))  { print STDOUT  $buf; }
 
-    };
+        kill( "TERM", $kidpid );    # send SIGTERM to child
+    }
 
-    kill("TERM", $kidpid);              # send SIGTERM to child
-}
 # the else{} block runs only in the child process (client input relayed to the server)
-else {
-
-   $ssh_subsocket->autoflush(1);
-   sleep 1;                             # wait needed for ensuring STDOUT buffer is not melt
-   my $buf;
-
-   #while (defined (my $buf = <$client>)) {
-   #usual syntax above used in verbose mode results into flush problems
-   while (my $nread = sysread($client,$buf,400)) {
-      print $ssh_subsocket $buf;
-      $client->flush();
-      if (defined($verbose))  { print STDOUT  $buf; }
-   }continue {}
+    else {
+
+        $ssh_subsocket->autoflush(1);
+        sleep 1;    # wait needed for ensuring STDOUT buffer is not melt
+        my $buf;
+
+        #while (defined (my $buf = <$client>)) {
+        #usual syntax above used in verbose mode results into flush problems
+        while ( my $nread = sysread( $client, $buf, 400 ) ) {
+            print $ssh_subsocket $buf;
+            $client->flush();
+            if ( defined($verbose) ) { print STDOUT $buf; }
+        }
+        continue { }
 
-   close $client;
+        close $client;
 
-}
+    }
 
-$|=0;
+    $| = 0;
 
-sleep 2;
-kill("TERM", $kidpid);                  # send SIGTERM to child
+    sleep 2;
+    kill( "TERM", $kidpid );    # send SIGTERM to child
 
 }
 
index 789fe187e183bf3fea16b65e27260e280a17e043..78367550b35cd6bc4abd28c2af2860372e916081 100755 (executable)
 
 use strict;
 use warnings;
+
 #use diagnostics;  #uncomment this line for more details when encountering warnings
 use Net::OpenSSH;
 use FileHandle;
 use Getopt::Long qw(:config no_ignore_case bundling);
 
-my ($host, $help, $usage,  $capabilities, $login, $password, $kidpid, $hello_message);
-
+my ( $host, $help, $usage, $capabilities, $login, $password, $kidpid,
+    $hello_message );
 
-GetOptions (
-    "h|help" =>\$help,
-    "C|capabilities=s"=>\$capabilities
+GetOptions(
+    "h|help"           => \$help,
+    "C|capabilities=s" => \$capabilities
 );
 $usage = "
 USAGE: netconf_terminal.pl [-h|--help] [-C|--capabilities <custom_hello_file.xml>] <[login[:password]@]host[:port]> [login] [password]
@@ -43,39 +44,42 @@ if ($help) {
     exit(0);
 }
 
-unless (@ARGV >= 1) {
+unless ( @ARGV >= 1 ) {
     print $usage;
     exit(0);
 }
 
-($host, $login, $password) = @ARGV;
+( $host, $login, $password ) = @ARGV;
 
 #netconf default port is no 22 but 830
-if ($host !~ /:[0-9]+$/) {
-    $host.=':830';
+if ( $host !~ /:[0-9]+$/ ) {
+    $host .= ':830';
 }
 
-my $connection_string=$host;
+my $connection_string = $host;
 if ($password) {
-   $connection_string=$login.":".$password."@".$connection_string;
-} elsif ($login) {
-   $connection_string=$login."@".$connection_string;
+    $connection_string = $login . ":" . $password . "@" . $connection_string;
+}
+elsif ($login) {
+    $connection_string = $login . "@" . $connection_string;
 }
 
 #retrieving hello custom file if any
-if (defined ($capabilities)) {
-    open(CAPABILITIES,'<',$capabilities) or die ("can not open $capabilities") ;
+if ( defined($capabilities) ) {
+    open( CAPABILITIES, '<', $capabilities )
+      or die("can not open $capabilities");
     while (<CAPABILITIES>) {
         $hello_message .= $_;
     }
-    chop $hello_message; # removing EOF
-    $hello_message.="\n]]>]]>\n";
+    chop $hello_message;    # removing EOF
+    $hello_message .= "\n]]>]]>\n";
     close(CAPABILITIES);
 }
+
 #otherwise using a basic hello message
 #EXI extension is not advertised by default since difficult to handle manually
-else{
-    $hello_message='<?xml version="1.0" encoding="utf-8"?>
+else {
+    $hello_message = '<?xml version="1.0" encoding="utf-8"?>
 <hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
 <capabilities>
 <capability>urn:ietf:params:xml:ns:yang:ietf-netconf-monitoring?module=ietf-netconf-monitoring&amp;revision=2010-10-04</capability>
@@ -90,61 +94,65 @@ else{
 <capability>urn:ietf:params:xml:ns:yang:ietf-inet-types?module=ietf-inet-types&amp;revision=2013-07-15</capability>
 </capabilities>
 </hello>';
-    $hello_message.="\n]]>]]>\n";
+    $hello_message .= "\n]]>]]>\n";
 }
 
+print STDERR "connecting to " . $connection_string . "\n";
 
-print STDERR "connecting to ".$connection_string."\n";
-
-my $ssh_handle= Net::OpenSSH->new($connection_string,
-                                  master_opts => [-o => 'StrictHostKeyChecking=no'],
-                                  timeout => 500, kill_ssh_on_timeout => 500);
+my $ssh_handle = Net::OpenSSH->new(
+    $connection_string,
+    master_opts         => [ -o => 'StrictHostKeyChecking=no' ],
+    timeout             => 500,
+    kill_ssh_on_timeout => 500
+);
 
 #netconf requires a specific socket
-my ($ssh_subsocket, $pid) = $ssh_handle->open2socket({ssh_opts => '-s'}, 'netconf');
+my ( $ssh_subsocket, $pid ) =
+  $ssh_handle->open2socket( { ssh_opts => '-s' }, 'netconf' );
 die "can't establish connection: exiting\n" unless defined($ssh_subsocket);
 
 print STDERR "[Connected]\n";
 
 # split the program into two processes, identical twins
-die "can't fork: $!" unless defined($kidpid = fork());
-
+die "can't fork: $!" unless defined( $kidpid = fork() );
 
 # the if{} block runs only in the parent process (terminal output)
-if (!$kidpid) {
+if ( !$kidpid ) {
 
-    $|=1;
+    $| = 1;
 
     # copy the socket to standard output
     my $buf;
     my $nread;
-    #while (<$ssh_subsocket>) {
-    #buffer seems not totally flushed when using the syntax above (nor when using autoflush)
-    while ($nread = sysread($ssh_subsocket,$buf,150)) {
+
+#while (<$ssh_subsocket>) {
+#buffer seems not totally flushed when using the syntax above (nor when using autoflush)
+    while ( $nread = sysread( $ssh_subsocket, $buf, 150 ) ) {
         print $buf;
         $ssh_subsocket->flush();
-    };
+    }
 
     print;
-    kill("TERM", $kidpid);                  # send SIGTERM to child
+    kill( "TERM", $kidpid );    # send SIGTERM to child
 }
+
 # the else{} block runs only in the child process (terminal input)
 else {
 
-   $ssh_subsocket->autoflush(1);
-   sleep 1;                                 # wait needed for ensuring STDOUT buffer is not melt
+    $ssh_subsocket->autoflush(1);
+    sleep 1;    # wait needed for ensuring STDOUT buffer is not melt
 
-   if (defined ($hello_message)) {
-       print $ssh_subsocket $hello_message;
-       sleep 1;
-   }
+    if ( defined($hello_message) ) {
+        print $ssh_subsocket $hello_message;
+        sleep 1;
+    }
 
-   while (defined (my $line = <STDIN>)) {
-      print $ssh_subsocket $line;
-   }
+    while ( defined( my $line = <STDIN> ) ) {
+        print $ssh_subsocket $line;
+    }
 
 }
 
 sleep 2;
-kill("TERM", $kidpid);                      # send SIGTERM to child
+kill( "TERM", $kidpid );    # send SIGTERM to child
 exit;
index 1e4ed70490d16aa14cf4f8f3b06a9f2e0de0d532..f3da0a7efcdc8d00a77c460b650c8be9097c7510 100644 (file)
@@ -9,30 +9,41 @@
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>8.0.11</version>
+    <version>13.0.1</version>
     <relativePath/>
   </parent>
 
   <groupId>org.opendaylight.transportpce</groupId>
   <artifactId>transportpce-dmaap-client</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
+  <version>10.0.0-SNAPSHOT</version>
   <packaging>bundle</packaging>
   <description>client to send message to Dmaap message router</description>
 
   <properties>
+    <transportpce.models.version>20.0.0-SNAPSHOT</transportpce.models.version>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   </properties>
 
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.opendaylight.transportpce.models</groupId>
+        <artifactId>transportpce-models-artifacts</artifactId>
+        <version>${transportpce.models.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
   <dependencies>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-common</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-13.1.0</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-service</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-service-13.1.0</artifactId>
     </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
       <groupId>org.glassfish.jersey.core</groupId>
       <artifactId>jersey-client</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.glassfish.jersey.core</groupId>
-      <artifactId>jersey-server</artifactId>
-    </dependency>
     <dependency>
       <groupId>org.glassfish.jersey.ext</groupId>
       <artifactId>jersey-proxy-client</artifactId>
       <artifactId>jackson-datatype-jsr310</artifactId>
     </dependency>
     <dependency>
-      <groupId>javax.ws.rs</groupId>
-      <artifactId>javax.ws.rs-api</artifactId>
+      <groupId>jakarta.ws.rs</groupId>
+      <artifactId>jakarta.ws.rs-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.service.component.annotations</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.service.metatype.annotations</artifactId>
     </dependency>
 
     <!-- Testing dependencies -->
       <artifactId>jersey-test-framework-provider-grizzly2</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.glassfish.jersey.core</groupId>
+      <artifactId>jersey-server</artifactId>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>org.mockito</groupId>
       <artifactId>mockito-core</artifactId>
     <dependency>
       <groupId>ch.qos.logback</groupId>
       <artifactId>logback-core</artifactId>
+      <scope>test</scope>
     </dependency>
   </dependencies>
-</project>
\ No newline at end of file
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>attach-dmaap-artifact</id>
+            <goals>
+              <goal>attach-artifact</goal>
+            </goals>
+            <configuration>
+              <artifacts>
+                <artifact>
+                  <file>${basedir}/src/main/resources/org.opendaylight.transportpce.dmaap.cfg</file>
+                  <type>cfg</type>
+                  <classifier>config</classifier>
+                </artifact>
+              </artifacts>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
+</project>
index 63bee535759a193a9fbd5a6ee41b3654db684f94..45b0850727bea033893f74bb478cb13c19c49138 100644 (file)
@@ -8,35 +8,42 @@
 package org.opendaylight.transportpce.dmaap.client.impl;
 
 import org.opendaylight.mdsal.binding.api.NotificationService;
-import org.opendaylight.transportpce.dmaap.client.listener.NbiNotificationsListenerImpl;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NbiNotificationsListener;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.transportpce.dmaap.client.listener.NbiNotificationsHandler;
+import org.opendaylight.yangtools.concepts.Registration;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@Component(configurationPid = "org.opendaylight.transportpce.dmaap")
 public class DmaapClientProvider {
+
+    @ObjectClassDefinition
+    public @interface Configuration {
+        @AttributeDefinition
+        String dmaapBaseUrl() default "http://localhost:8080";
+        @AttributeDefinition
+        String dmaapUsername() default "";
+        @AttributeDefinition
+        String dmaapPassword() default "";
+    }
+
     private static final Logger LOG = LoggerFactory.getLogger(DmaapClientProvider.class);
-    private ListenerRegistration<NbiNotificationsListener> listenerRegistration;
-    private NotificationService notificationService;
-    private final String baseUrl;
-    private final String username;
-    private final String password;
+    private Registration listenerRegistration;
 
-    public DmaapClientProvider(NotificationService notificationService, String baseUrl,
-            String username, String password) {
-        this.notificationService = notificationService;
-        this.baseUrl = baseUrl;
-        this.username = username;
-        this.password = password;
+    @Activate
+    public DmaapClientProvider(@Reference NotificationService notificationService, Configuration config) {
+        this(notificationService, config.dmaapBaseUrl(), config.dmaapUsername(), config.dmaapPassword());
     }
 
-    /**
-     * Method called when the blueprint container is created.
-     */
-    public void init() {
+    public DmaapClientProvider(NotificationService notificationService, String baseUrl,
+            String username, String password) {
+        final var listener = new NbiNotificationsHandler(baseUrl, username, password);
+        listenerRegistration = notificationService.registerCompositeListener(listener.getCompositeListener());
         LOG.info("DmaapClientProvider Session Initiated");
-        listenerRegistration = notificationService.registerNotificationListener(
-                new NbiNotificationsListenerImpl(baseUrl, username, password));
     }
 
     /**
@@ -46,5 +53,4 @@ public class DmaapClientProvider {
         listenerRegistration.close();
         LOG.info("DmaapClientProvider Closed");
     }
-
 }
similarity index 62%
rename from dmaap-client/src/main/java/org/opendaylight/transportpce/dmaap/client/listener/NbiNotificationsListenerImpl.java
rename to dmaap-client/src/main/java/org/opendaylight/transportpce/dmaap/client/listener/NbiNotificationsHandler.java
index 4a91e6a4cf1d80cb2c9572797af898cc57a3d442..07812c168eb168febc3aa76333da28b1244448d1 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.transportpce.dmaap.client.listener;
 
+import java.util.Set;
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.client.Client;
 import javax.ws.rs.client.ClientBuilder;
@@ -14,21 +15,22 @@ import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature;
 import org.glassfish.jersey.client.proxy.WebResourceFactory;
 import org.glassfish.jersey.jackson.JacksonFeature;
 import org.glassfish.jersey.logging.LoggingFeature;
+import org.opendaylight.mdsal.binding.api.NotificationService.CompositeListener;
 import org.opendaylight.transportpce.dmaap.client.resource.EventsApi;
 import org.opendaylight.transportpce.dmaap.client.resource.config.JsonConfigurator;
 import org.opendaylight.transportpce.dmaap.client.resource.model.CreatedEvent;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NbiNotificationsListener;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationAlarmService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationAlarmService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishTapiNotificationService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class NbiNotificationsListenerImpl implements NbiNotificationsListener {
-    private static final Logger LOG = LoggerFactory.getLogger(NbiNotificationsListenerImpl.class);
+public class NbiNotificationsHandler {
+    private static final Logger LOG = LoggerFactory.getLogger(NbiNotificationsHandler.class);
     private String topic = "unauthenticated.TPCE";
     private EventsApi api;
 
-    public NbiNotificationsListenerImpl(String baseUrl, String username, String password) {
+    public NbiNotificationsHandler(String baseUrl, String username, String password) {
         LOG.info("Dmaap server {} for user {}", baseUrl, username);
         Client client = ClientBuilder.newClient();
         if (username != null && username.isBlank() && password != null && !password.isBlank()) {
@@ -42,8 +44,18 @@ public class NbiNotificationsListenerImpl implements NbiNotificationsListener {
 
     }
 
-    @Override
-    public void onPublishNotificationProcessService(PublishNotificationProcessService notification) {
+    public CompositeListener getCompositeListener() {
+        return new CompositeListener(Set.of(
+            new CompositeListener.Component<>(
+                PublishNotificationProcessService.class, this::onPublishNotificationProcessService),
+            new CompositeListener.Component<>(
+                PublishNotificationAlarmService.class, this::onPublishNotificationAlarmService),
+            new CompositeListener.Component<>(
+                PublishTapiNotificationService.class, this::onPublishTapiNotificationService)
+        ));
+    }
+
+    void onPublishNotificationProcessService(PublishNotificationProcessService notification) {
         try {
             CreatedEvent response = api.sendEvent(topic, notification);
             LOG.info("Response received {}", response);
@@ -53,9 +65,9 @@ public class NbiNotificationsListenerImpl implements NbiNotificationsListener {
 
     }
 
-    @Override
-    public void onPublishNotificationAlarmService(PublishNotificationAlarmService notification) {
-
+    private void onPublishNotificationAlarmService(PublishNotificationAlarmService notification) {
     }
 
+    private void onPublishTapiNotificationService(PublishTapiNotificationService notification) {
+    }
 }
index e6f167824b5fe5be45a55bec1e35c6e6384bd72f..7fc5955f011ef64bcb47ccdf1d658dd7522c6dab 100644 (file)
@@ -14,7 +14,7 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import org.opendaylight.transportpce.dmaap.client.resource.model.CreatedEvent;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationProcessService;
 
 @Path("/events")
 public interface EventsApi {
index 3997ff3e58f7fbc9dc049dcd63f5d42ffc58df7d..59080914bca1786dca6a23e9b013d6c5ea47a7a0 100644 (file)
@@ -11,7 +11,7 @@ import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.databind.SerializerProvider;
 import com.fasterxml.jackson.databind.ser.std.StdSerializer;
 import java.io.IOException;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.lgx.Lgx;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.lgx.Lgx;
 
 // This class is a temporary workaround while waiting jackson
 // support in yang tools https://git.opendaylight.org/gerrit/c/yangtools/+/94852
index 0f9c8a12277dd04bd40a0abf59eecd73a52c4884..e1472b0e1c407a9b49270e4beb6444c6351a349a 100644 (file)
@@ -11,7 +11,7 @@ import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.databind.SerializerProvider;
 import com.fasterxml.jackson.databind.ser.std.StdSerializer;
 import java.io.IOException;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.port.Port;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.port.Port;
 
 // This class is a temporary workaround while waiting jackson
 // support in yang tools https://git.opendaylight.org/gerrit/c/yangtools/+/94852
index 9fcbf9f2a398c2854428640d7b550f2bd1477a2f..c16b395210c747cca0bf040b30bbd76d368552be 100644 (file)
@@ -9,13 +9,13 @@ package org.opendaylight.transportpce.dmaap.client.resource.config;
 
 import com.fasterxml.jackson.databind.module.SimpleModule;
 import com.fasterxml.jackson.datatype.jsr310.PackageVersion;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.RxDirection;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.TxDirection;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.lgx.Lgx;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.port.Port;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationProcessService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.notification.process.service.ServiceAEnd;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.notification.process.service.ServiceZEnd;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.RxDirection;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.TxDirection;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.lgx.Lgx;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.port.Port;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.process.service.ServiceAEnd;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.process.service.ServiceZEnd;
 
 //This class is a temporary workaround while waiting jackson
 //support in yang tools https://git.opendaylight.org/gerrit/c/yangtools/+/94852
index b9b650ce0573324cf069bacf26528c588e5db6e1..b48db260759b7974b5ea049160cf23abc788722b 100644 (file)
@@ -11,7 +11,7 @@ import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.databind.SerializerProvider;
 import com.fasterxml.jackson.databind.ser.std.StdSerializer;
 import java.io.IOException;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationProcessService;
 
 // This class is a temporary workaround while waiting jackson
 // support in yang tools https://git.opendaylight.org/gerrit/c/yangtools/+/94852
index 234ed21517098e1a18c4246016893f9120df438a..99324f7180448f2e4731d942cf6163dfe19fa104 100644 (file)
@@ -11,7 +11,7 @@ import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.databind.SerializerProvider;
 import com.fasterxml.jackson.databind.ser.std.StdSerializer;
 import java.io.IOException;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.RxDirection;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.RxDirection;
 
 // This class is a temporary workaround while waiting jackson
 // support in yang tools https://git.opendaylight.org/gerrit/c/yangtools/+/94852
index e05e0fcbb6f91ab923d4b6cee91a51e509a15444..edb2583b7ebd77fbef63291d8e526adc9437baf6 100644 (file)
@@ -11,7 +11,7 @@ import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.databind.SerializerProvider;
 import com.fasterxml.jackson.databind.ser.std.StdSerializer;
 import java.io.IOException;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.notification.process.service.ServiceAEnd;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.process.service.ServiceAEnd;
 
 // This class is a temporary workaround while waiting jackson
 // support in yang tools https://git.opendaylight.org/gerrit/c/yangtools/+/94852
index 2e1ae283596e3da6a2eb9e5c96bd326333d01425..bcefe867766cc973981984ac052d9f0d23d56c4c 100644 (file)
@@ -11,7 +11,7 @@ import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.databind.SerializerProvider;
 import com.fasterxml.jackson.databind.ser.std.StdSerializer;
 import java.io.IOException;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.notification.process.service.ServiceZEnd;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.process.service.ServiceZEnd;
 
 // This class is a temporary workaround while waiting jackson
 // support in yang tools https://git.opendaylight.org/gerrit/c/yangtools/+/94852
index 2df5a2c6429f61b32f98bd59900e8c10cf07a40e..bb644f7786e9b73d0934bc3571e78d6a4bef15c4 100644 (file)
@@ -11,7 +11,7 @@ import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.databind.SerializerProvider;
 import com.fasterxml.jackson.databind.ser.std.StdSerializer;
 import java.io.IOException;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.TxDirection;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.TxDirection;
 
 // This class is a temporary workaround while waiting jackson
 // support in yang tools https://git.opendaylight.org/gerrit/c/yangtools/+/94852
diff --git a/dmaap-client/src/main/resources/OSGI-INF/blueprint/dmaap-blueprint.xml b/dmaap-client/src/main/resources/OSGI-INF/blueprint/dmaap-blueprint.xml
deleted file mode 100644 (file)
index 459848e..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- vi: set et smarttab sw=4 tabstop=4: -->
-<!-- Copyright © 2021 Orange and others. All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution,
-    and is available at http://www.eclipse.org/legal/epl-v10.html -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
- xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
-    odl:use-default-for-reference-types="true">
-    <cm:property-placeholder persistent-id="org.opendaylight.transportpce.dmaap" update-strategy="reload">
-        <cm:default-properties>
-            <cm:property name="dmaap.baseUrl" value="http://localhost:8080" />
-            <cm:property name="dmaap.username" value="" />
-             <cm:property name="dmaap.password" value="" />
-        </cm:default-properties>
-    </cm:property-placeholder>
-    <reference id="notificationService" interface="org.opendaylight.mdsal.binding.api.NotificationService"/>
-
-    <bean id="provider"
-        class="org.opendaylight.transportpce.dmaap.client.impl.DmaapClientProvider"
-        init-method="init" destroy-method="close">
-        <argument ref="notificationService" />
-        <argument value="${dmaap.baseUrl}"></argument>
-        <argument value="${dmaap.username}"></argument>
-        <argument value="${dmaap.password}"></argument>
-    </bean>
-</blueprint>
index 1ebfadee53dd7334ce16b71362278b4d18aa9a8d..93c7940fa080ccb754b1be3135d3ee0bf7a6d835 100644 (file)
@@ -10,13 +10,12 @@ package org.opendaylight.transportpce.dmaap.client.impl;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 import org.opendaylight.mdsal.binding.api.NotificationService;
-import org.opendaylight.transportpce.dmaap.client.listener.NbiNotificationsListenerImpl;
 
 
 public class DmaapClientProviderTest {
@@ -24,18 +23,16 @@ public class DmaapClientProviderTest {
     @Mock
     private NotificationService notificationService;
 
-    @Before
-    public void init() {
+    @BeforeEach
+    void init() {
         MockitoAnnotations.openMocks(this);
-
     }
 
     @Test
-    public void testInitRegisterNbiNotificationsToRpcRegistry() {
-        DmaapClientProvider provider =  new DmaapClientProvider(notificationService, "http://localhost", "username", "password");
-        provider.init();
-        (verify(notificationService, times(1)))
-                .registerNotificationListener(Mockito.any(NbiNotificationsListenerImpl.class));
+    void testInitRegisterNbiNotificationsToRpcRegistry() {
+        new DmaapClientProvider(notificationService, "http://localhost", "username", "password");
+        verify(notificationService, times(1))
+            .registerCompositeListener(Mockito.any(NotificationService.CompositeListener.class));
     }
 
 }
@@ -7,7 +7,8 @@
  */
 package org.opendaylight.transportpce.dmaap.client.listener;
 
-import static org.junit.Assert.assertEquals;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import ch.qos.logback.classic.Logger;
 import ch.qos.logback.classic.spi.ILoggingEvent;
@@ -18,26 +19,25 @@ import javax.ws.rs.core.Application;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.test.JerseyTest;
 import org.glassfish.jersey.test.TestProperties;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.transportpce.dmaap.client.resource.EventsApiStub;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ConnectionType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.RxDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.RxDirectionKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.TxDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.TxDirectionKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ConnectionType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.RxDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.RxDirectionKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.TxDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.TxDirectionKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NbiNotificationsListener;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationProcessService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationProcessServiceBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.notification.process.service.ServiceAEndBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.notification.process.service.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationProcessServiceBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.process.service.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.process.service.ServiceZEndBuilder;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.opendaylight.yangtools.yang.common.Uint8;
 import org.slf4j.LoggerFactory;
 
-public class NbiNotificationsListenerImplTest extends JerseyTest {
+public class NbiNotificationsHandlerTest extends JerseyTest {
     @Override
     protected Application configure() {
         enable(TestProperties.LOG_TRAFFIC);
@@ -46,12 +46,12 @@ public class NbiNotificationsListenerImplTest extends JerseyTest {
     }
 
     @Test
-    public void onPublishNotificationServiceTest() {
-        Logger logger = (Logger) LoggerFactory.getLogger(NbiNotificationsListenerImpl.class);
+    void onPublishNotificationServiceTest() {
+        Logger logger = (Logger) LoggerFactory.getLogger(NbiNotificationsHandler.class);
         ListAppender<ILoggingEvent> listAppender = new ListAppender<>();
         listAppender.start();
         logger.addAppender(listAppender);
-        NbiNotificationsListener listener = new NbiNotificationsListenerImpl("http://localhost:9998", null, null);
+        NbiNotificationsHandler listener = new NbiNotificationsHandler("http://localhost:9998", null, null);
         PublishNotificationProcessService notification = new PublishNotificationProcessServiceBuilder()
                 .setCommonId("CommonId")
                 .setMessage("Service implemented")
@@ -82,7 +82,6 @@ public class NbiNotificationsListenerImplTest extends JerseyTest {
         listener.onPublishNotificationProcessService(notification);
         // as onPublishNotificationService is a void method, we check log message to be sure everything went well
         List<ILoggingEvent> logsList = listAppender.list;
-        assertEquals("Response received CreatedEvent [serverTimeMs=1, count=1]", logsList.get(1).getFormattedMessage());
-
+        assertEquals(logsList.get(1).getFormattedMessage(), "Response received CreatedEvent [serverTimeMs=1, count=1]");
     }
 }
index 0eae088536aa042748898abbfc46033b1e264919..24e2e6d0a651e806a480bde8f48fc399e8dbeecb 100644 (file)
@@ -14,6 +14,8 @@ from docs_conf.conf import *
 linkcheck_ignore = [
     # Ignore dmaap sample URL
     'https://dmaap-mr:30226',
+    # LFN CI connectivy issue with tox wiki URL
+    'https://tox.wiki',
     # OpenROADM white paper often has connectivity issues from the Gate
     'https://0201.nccdn.net/1_2/000/000/134/c50/Open-ROADM-MSA-release-2-Device-White-paper-v1-1.pdf'
 ]
index 26f40bc9d41b77e55258b17364905753ad81b05c..dbe9639d25e4e1a22874cd8b159cd7c759fe4608 100644 (file)
@@ -1,3 +1,3 @@
 project_cfg: opendaylight
 project: Transport PCE
-version: Phosphorus
+version: Sulfur
index 1e6e5d3080246dde822c36336065e99c14b7d24e..4da5cb4e591f46bc09b550436dde8fe8f26bf992 100644 (file)
@@ -28,7 +28,7 @@ equipment\_ and Optical Line Management (OLM) is associated with a generic block
 relying on open models, each of them communicating through published APIs.
 
 
-.. figure:: ./images/TransportPCE-Diagram-Phosphorus.jpg
+.. figure:: ./images/TransportPCE-Diagram-Sulfur.jpg
    :alt: TransportPCE architecture
 
    TransportPCE architecture
@@ -66,7 +66,7 @@ Bus of ONAP.
 
 Phosphorus consolidates end to end support for high rate services (ODUC4, OTUC4),
 allowing service creation and deletion from the NBI. The support of path
-computation for high rate services (OTUC4) will be added through the different P
+computation for high rate services (OTUC4) has been added through the different P
 releases, relying on GNPy for impairment aware path computation. An experimental
 support of T-API is provided allowing service-create/delete from a T-API version
 2.1.1 compliant NBI. A T-API network topology, with different levels of abstraction
@@ -74,6 +74,26 @@ and service context are maintained in the MDSAL. Service state is managed,
 monitoring device port state changes. Associated notifications are handled through
 Kafka and  DMaaP clients.
 
+Sulfur is introducing OpenROADM service and network models 10.1, which include the
+operational-modes catalog, needed for future support of Alien Wavelength use cases.
+It also offers T-API notification support, handling the RPC associated with the
+notification subscription service.
+
+The Chlorine release brings structural changes to the project. indeed, all the official
+yang models of the OpenROADM and ONF-TAPI communities are no longer managed directly
+in the TransportPCE project but in a dedicated sub-project: transportpce/models.
+Also, the implementation of these models which is made in TransportPCE now imports
+the models already compiled by maven dependency.
+From a functional point of view, Chlorine supports the autonomous reroute of WDM services
+terminated on 100G or 400G Transponders, as well as the beginning of developments around
+the OpenROAM catalog management.
+
+The Argon release provides autonomous impairment aware path computation, relying on
+OpenROADM operational-modes catalog. It is used in a first step of the path validation,
+to evaluate the Optical Signal to Noise Ratio as well as the penalty associated with the
+signal across the calculated pass. Validation of the optical path by GNPy is still
+triggered, in a second step, leveraging advanced calculation of non linear contribution.
+
 
 Module description
 ~~~~~~~~~~~~~~~~~~
@@ -104,8 +124,8 @@ interfaces.
 In Silicon release, the management of TopologyUpdateNotification coming from the *Topology Management*
 module was implemented. This functionality enables the controller to update the information of existing
 services according to the online status of the network infrastructure. If any service is affected by
-the topology update and the *odl-transportpce-nbi* feature is installed, the Service Handler will send a
-notification to a Kafka server with the service update information.
+the topology update and the *odl-transportpce-nbinotifications* feature is installed, the Service
+Handler will send a notification to a Kafka server with the service update information.
 
 PCE
 ^^^
@@ -121,39 +141,68 @@ allows keeping PCE aligned with the latest changes in the topology. Information
 about current and planned services is available in the MD-SAL data store.
 
 Current implementation of PCE allows finding the shortest path, minimizing either the hop
-count (default) or the propagation delay. Central wavelength is assigned considering a fixed
-grid of 96 wavelengths 50 GHz spaced. The assignment of wavelengths according to a flexible
-grid considering 768 subsequent slots of 6,25 GHz (total spectrum of 4.8 Thz), and their
-occupation by existing services is planned for later releases.
-In Neon SR0, the PCE calculates the OSNR, on the base of incremental noise specifications
-provided in Open ROADM MSA. The support of unidirectional ports is also added.
+count (default) or the propagation delay. The support of a flexible grid was introduced in Aluminium.
+The central wavelength assignment depends on the  capabilities of the different devices on the path.
+If one of the elements only supports a fixed grid, the wavelength is assigned considering a grid of
+96 wavelengths 50 GHz spaced. If  all the devices on the path support a flexible grid, the assignment
+of wavelengths is done according to a flexible grid considering 768 subsequent slots of 6,25 GHz
+(total spectrum of 4.8 Thz).
 
-PCE handles the following constraints as hard constraints:
+The PCE module handles the following constraints as hard constraints:
 
 -   **Node exclusion**
 -   **SRLG exclusion**
 -   **Maximum latency**
 
-In Magnesium SR0, the interconnection of the PCE with GNPY (Gaussian Noise Python), an
-open-source library developed in the scope of the Telecom Infra Project for building route
-planning and optimizing performance in optical mesh networks, is fully supported. Impairment
-aware path computation for service of higher rates (Beyond 100G) is planned across Phoshorus
-releases. It implies to make B100G OpenROADM specifications available in GNPy libraries.
-
-If the OSNR calculated by the PCE is too close to the limit defined in OpenROADM
-specifications, the PCE forwards through a REST interface to GNPY external tool the topology
-and the pre-computed path translated in routing constraints. GNPy calculates a set of Quality of
-Transmission metrics for this path using its own library which includes models for OpenROADM.
-The result is sent back to the PCE. If the path is validated, the PCE sends back a response to
-the service handler. In case of invalidation of the path by GNPY, the PCE sends a new request to
-GNPY, including only the constraints expressed in the path-computation-request initiated by the
-Service Handler. GNPy then tries to calculate a path based on these relaxed constraints. The
-result of the path computation is provided to the PCE which translates the path according to the
-topology handled in transportPCE and forwards the results to the Service Handler.
-
-GNPy relies on SNR and takes into account the linear and non-linear impairments
-to check feasibility. In the related tests, GNPy module runs externally in a
-docker and the communication with T-PCE is ensured via HTTPs.
+In Neon SR0, the PCE calculates the OSNR, on the base of incremental noise specifications provided
+in Open ROADM MSA. The support of unidirectional ports is also added. The interconnection of the PCE
+with GNPY (Gaussian Noise Python), an open-source library developed in the scope of the Telecom Infra
+Project for building route planning and optimizing performance in optical mesh networks, is supported
+since Magnesium SR0. This allowed introducing impairment aware path computation for (Beyond 100G)
+services across Phoshorus releases.
+
+In Argon, we introduce autonomous impairment aware path computation, leveraging OpenROADM yang
+specification catalog (R10.1), which translates the optical specifications provided in the MSA into
+models understandable by the controller. To each disaggregated element crossed along the path
+(Transponders, ROADM add/drop modules and degrees), is associated an operational mode, for which each
+physical parameters is described in the catalog. This allows evaluating the degradations that each
+element, whether it is a device of fiber span, brings to the signal transmission. The resulting
+Optical Signal to Noise Ratio is calculated, as well as the penalties associated with the cumulated
+chromatic dispersion, Polarisation Mode Dispersion (PMD), Polarization Dependant Loss (PDL)… and the
+non-linear contribution is evaluated.
+
+All of this is done in accordance with OpenROADM optical specifications. Handling OpenROADM specification
+catalogs improves the upgradability of the code, since the future evolution of the specifications only
+implies to add new operational modes to the catalog while the associated code remains unchanged.
+
+In Argon SR0, to benefit from this new functionality, the specification catalog must be manually loaded
+into the data store.  The catalog includes 2 different parts, the first being dedicated to the
+translation of OpenROADM specifications, the second (optional) being dedicated to specific operational
+modes for transponders used in “bookended” mode (same transponders on both ends of the path). The
+automatic filling of the first part of the catalog is planned in Ar SR1. In this release will also be
+supported the 2 RPCs used to fill the different parts of the catalog :
+-   **add-openroadm-operational-mode-to-catalog**
+-   **add-specific-operational-mode-to-catalog**
+
+Autonomous impairment aware path computation is triggered in Argon for any path at the WDM layer,
+whatever is the service rate. The transmission margin is evaluated in both direction and the result is
+provided in INFO Logs. GNPy is used in a second step to enforce path validation. Indeed, it gives
+complementary information to the calculation made from OpenROADM specifications, with a finer assessment
+of non-linear contribution, and potentially a consideration of the interaction with other channels
+already provisioned on the network. This last capability will be added across Argon releases.
+The PCE forwards through a REST interface to GNPY external tool the topology and the pre-computed path
+translated in routing constraints. GNPy calculates a set of Quality of Transmission metrics for this path
+using its own library which includes models for OpenROADM. The result is sent back to the PCE. If the
+path is validated, the PCE sends back a response to the service handler. In case of invalidation of the
+path by GNPY, the PCE sends a new request to GNPY, including only the constraints expressed in the
+path-computation-request initiated by the Service Handler. GNPy then tries to calculate a path based on
+these relaxed constraints. The result of the path computation is provided to the PCE which translates
+the path according to the topology handled in transportPCE and forwards the results to the Service
+Handler.
+
+GNPy relies on SNR and takes into account the linear and non-linear impairments to check feasibility.
+In the related tests, GNPy module runs externally in a docker and the communication with T-PCE is
+ensured via HTTPs.
 
 Topology Management
 ^^^^^^^^^^^^^^^^^^^
@@ -303,7 +352,7 @@ External API
 
 North API, interconnecting the Service Handler to higher level applications
 relies on the Service Model defined in the MSA. The Renderer and the OLM are
-developed to allow configuring Open ROADM devices through a southbound
+developed to allow configuring OpenROADM devices through a southbound
 Netconf/Yang interface and rely on the MSA’s device model.
 
 ServiceHandler Service
@@ -468,13 +517,16 @@ through the NETCONF connector.
     In the current version, only optical equipment compliant with open ROADM datamodels are managed
     by transportPCE.
 
+    Since Chlorine release, the bierman implementation of RESTCONF is no longer supported for the benefit of the RFC8040.
+    Thus REST API must be compliant to the RFC8040 format.
+
 
 Connecting nodes
 ~~~~~~~~~~~~~~~~
 
-To connect a node, use the following JSON RPC
+To connect a node, use the following RESTconf request
 
-**REST API** : *POST /restconf/config/network-topology:network-topology/topology/topology-netconf/node/<node-id>*
+**REST API** : *PUT /rests/data/network-topology:network-topology/topology=topology-netconf/node=<node-id>*
 
 **Sample JSON Data**
 
@@ -506,7 +558,7 @@ To connect a node, use the following JSON RPC
 Then check that the netconf session has been correctly established between the controller and the
 node. the status of **netconf-node-topology:connection-status** must be **connected**
 
-**REST API** : *GET /restconf/operational/network-topology:network-topology/topology/topology-netconf/node/<node-id>*
+**REST API** : *GET /rests/data/network-topology:network-topology/topology=topology-netconf/node=<node-id>?content=nonconfig*
 
 
 Node configuration discovery
@@ -517,9 +569,9 @@ discovery of the node configuration datastore and creates **Logical Connection P
 physical ports related to transmission. All *circuit-packs* inside the node configuration are
 analyzed.
 
-Use the following JSON RPC to check that function internally named *portMapping*.
+Use the following RESTconf URI to check that function internally named *portMapping*.
 
-**REST API** : *GET /restconf/config/portmapping:network*
+**REST API** : *GET /rests/data/transportpce-portmapping:network*
 
 .. note::
 
@@ -550,26 +602,26 @@ created by transportPCE. Nevertheless, depending on the configuration inside opt
 topology can be partial. Check that link of type *ROADMtoROADM* exists between two adjacent rdm
 nodes.
 
-**REST API** : *GET /restconf/config/ietf-network:network/openroadm-topology*
+**REST API** : *GET /rests/data/ietf-network:networks/network=openroadm-topology*
 
 If it is not the case, you need to manually complement the topology with *ROADMtoROADM* link using
 the following REST RPC:
 
 
-**REST API** : *POST /restconf/operations/networkutils:init-roadm-nodes*
+**REST API** : *POST /rests/operations/transportpce-networkutils:init-roadm-nodes*
 
 **Sample JSON Data**
 
 .. code:: json
 
     {
-      "networkutils:input": {
-        "networkutils:rdm-a-node": "<node-id-A>",
-        "networkutils:deg-a-num": "<degree-A-number>",
-        "networkutils:termination-point-a": "<Logical-Connection-Point>",
-        "networkutils:rdm-z-node": "<node-id-Z>",
-        "networkutils:deg-z-num": "<degree-Z-number>",
-        "networkutils:termination-point-z": "<Logical-Connection-Point>"
+      "input": {
+        "rdm-a-node": "<node-id-A>",
+        "deg-a-num": "<degree-A-number>",
+        "termination-point-a": "<Logical-Connection-Point>",
+        "rdm-z-node": "<node-id-Z>",
+        "deg-z-num": "<degree-Z-number>",
+        "termination-point-z": "<Logical-Connection-Point>"
       }
     }
 
@@ -581,21 +633,21 @@ following REST RPCs:
 From xpdr to rdm:
 ^^^^^^^^^^^^^^^^^
 
-**REST API** : *POST /restconf/operations/networkutils:init-xpdr-rdm-links*
+**REST API** : *POST /rests/operations/transportpce-networkutils:init-xpdr-rdm-links*
 
 **Sample JSON Data**
 
 .. code:: json
 
     {
-      "networkutils:input": {
-        "networkutils:links-input": {
-          "networkutils:xpdr-node": "<xpdr-node-id>",
-          "networkutils:xpdr-num": "1",
-          "networkutils:network-num": "<xpdr-network-port-number>",
-          "networkutils:rdm-node": "<rdm-node-id>",
-          "networkutils:srg-num": "<srg-number>",
-          "networkutils:termination-point-num": "<Logical-Connection-Point>"
+      "input": {
+        "links-input": {
+          "xpdr-node": "<xpdr-node-id>",
+          "xpdr-num": "1",
+          "network-num": "<xpdr-network-port-number>",
+          "rdm-node": "<rdm-node-id>",
+          "srg-num": "<srg-number>",
+          "termination-point-num": "<Logical-Connection-Point>"
         }
       }
     }
@@ -603,21 +655,21 @@ From xpdr to rdm:
 From rdm to xpdr:
 ^^^^^^^^^^^^^^^^^
 
-**REST API** : *POST /restconf/operations/networkutils:init-rdm-xpdr-links*
+**REST API** : *POST /rests/operations/transportpce-networkutils:init-rdm-xpdr-links*
 
 **Sample JSON Data**
 
 .. code:: json
 
     {
-      "networkutils:input": {
-        "networkutils:links-input": {
-          "networkutils:xpdr-node": "<xpdr-node-id>",
-          "networkutils:xpdr-num": "1",
-          "networkutils:network-num": "<xpdr-network-port-number>",
-          "networkutils:rdm-node": "<rdm-node-id>",
-          "networkutils:srg-num": "<srg-number>",
-          "networkutils:termination-point-num": "<Logical-Connection-Point>"
+      "input": {
+        "links-input": {
+          "xpdr-node": "<xpdr-node-id>",
+          "xpdr-num": "1",
+          "network-num": "<xpdr-network-port-number>",
+          "rdm-node": "<rdm-node-id>",
+          "srg-num": "<srg-number>",
+          "termination-point-num": "<Logical-Connection-Point>"
         }
       }
     }
@@ -629,7 +681,7 @@ Before creating an OTN service, your topology must contain at least two xpdr dev
 or SWITCH type connected to two different rdm devices. To check that these xpdr are present in the
 OTN topology, use the following command on the REST API :
 
-**REST API** : *GET /restconf/config/ietf-network:network/otn-topology*
+**REST API** : *GET /rests/data/ietf-network:networks/network=otn-topology*
 
 An optical connectivity service shall have been created in a first setp. Since Magnesium SR2, the OTN
 links are automatically populated in the topology after the Och, OTU4 and ODU4 interfaces have
@@ -671,7 +723,7 @@ Use the following REST RPC to invoke *service handler* module in order to create
 end-to-end optical connectivity service between two xpdr over an optical network composed of rdm
 nodes.
 
-**REST API** : *POST /restconf/operations/org-openroadm-service:service-create*
+**REST API** : *POST /rests/operations/org-openroadm-service:service-create*
 
 **Sample JSON Data**
 
@@ -692,7 +744,7 @@ nodes.
                 "node-id": "<xpdr-node-id>",
                 "service-format": "Ethernet",
                 "clli": "<ccli-name>",
-                "tx-direction": {
+                "tx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-client-port>",
                         "port-type": "fixed",
@@ -705,9 +757,10 @@ nodes.
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
-                "rx-direction": {
+                    },
+                    "index": 0
+                }],
+                "rx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-client-port>",
                         "port-type": "fixed",
@@ -720,8 +773,9 @@ nodes.
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
+                    },
+                    "index": 0
+                }],
                 "optic-type": "gray"
             },
             "service-z-end": {
@@ -729,7 +783,7 @@ nodes.
                 "node-id": "<xpdr-node-id>",
                 "service-format": "Ethernet",
                 "clli": "<ccli-name>",
-                "tx-direction": {
+                "tx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-client-port>",
                         "port-type": "fixed",
@@ -742,9 +796,10 @@ nodes.
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
-                "rx-direction": {
+                    },
+                    "index": 0
+                }],
+                "rx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-client-port>",
                         "port-type": "fixed",
@@ -757,8 +812,9 @@ nodes.
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
+                    },
+                    "index": 0
+                }],
                 "optic-type": "gray"
             },
             "due-date": "yyyy-mm-ddT00:00:01Z",
@@ -778,7 +834,7 @@ Use the following REST RPC to invoke *service handler* module in order to create
 end-to end Optical Channel (OC) connectivity service between two add/drop ports (PP port of SRG
 node) over an optical network only composed of rdm nodes.
 
-**REST API** : *POST /restconf/operations/org-openroadm-service:service-create*
+**REST API** : *POST /rests/operations/org-openroadm-service:service-create*
 
 **Sample JSON Data**
 
@@ -799,7 +855,7 @@ node) over an optical network only composed of rdm nodes.
                 "node-id": "<xpdr-node-id>",
                 "service-format": "OC",
                 "clli": "<ccli-name>",
-                "tx-direction": {
+                "tx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-client-port>",
                         "port-type": "fixed",
@@ -812,9 +868,10 @@ node) over an optical network only composed of rdm nodes.
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
-                "rx-direction": {
+                    },
+                    "index": 0
+                }],
+                "rx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-client-port>",
                         "port-type": "fixed",
@@ -827,8 +884,9 @@ node) over an optical network only composed of rdm nodes.
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
+                    },
+                    "index": 0
+                }],
                 "optic-type": "gray"
             },
             "service-z-end": {
@@ -836,7 +894,7 @@ node) over an optical network only composed of rdm nodes.
                 "node-id": "<xpdr-node-id>",
                 "service-format": "OC",
                 "clli": "<ccli-name>",
-                "tx-direction": {
+                "tx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-client-port>",
                         "port-type": "fixed",
@@ -849,9 +907,10 @@ node) over an optical network only composed of rdm nodes.
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
-                "rx-direction": {
+                    },
+                    "index": 0
+                }],
+                "rx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-client-port>",
                         "port-type": "fixed",
@@ -864,8 +923,9 @@ node) over an optical network only composed of rdm nodes.
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
+                    },
+                    "index": 0
+                }],
                 "optic-type": "gray"
             },
             "due-date": "yyyy-mm-ddT00:00:01Z",
@@ -885,7 +945,7 @@ infrastructure a bidirectional end-to-end OTU4 over an optical wavelength connec
 between two optical network ports of OTN Xponder (MUXPDR or SWITCH). Such service configure the
 optical network infrastructure composed of rdm nodes.
 
-**REST API** : *POST /restconf/operations/org-openroadm-service:service-create*
+**REST API** : *POST /rests/operations/org-openroadm-service:service-create*
 
 **Sample JSON Data**
 
@@ -907,7 +967,7 @@ optical network infrastructure composed of rdm nodes.
                 "service-format": "OTU",
                 "otu-service-rate": "org-openroadm-otn-common-types:OTU4",
                 "clli": "<ccli-name>",
-                "tx-direction": {
+                "tx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-node-id-in-otn-topology>",
                         "port-type": "fixed",
@@ -920,9 +980,10 @@ optical network infrastructure composed of rdm nodes.
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
-                "rx-direction": {
+                    },
+                    "index": 0
+                }],
+                "rx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-node-id-in-otn-topology>",
                         "port-type": "fixed",
@@ -935,8 +996,9 @@ optical network infrastructure composed of rdm nodes.
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
+                    },
+                    "index": 0
+                }],
                 "optic-type": "gray"
             },
             "service-z-end": {
@@ -945,7 +1007,7 @@ optical network infrastructure composed of rdm nodes.
                 "service-format": "OTU",
                 "otu-service-rate": "org-openroadm-otn-common-types:OTU4",
                 "clli": "<ccli-name>",
-                "tx-direction": {
+                "tx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-node-id-in-otn-topology>",
                         "port-type": "fixed",
@@ -958,9 +1020,10 @@ optical network infrastructure composed of rdm nodes.
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
-                "rx-direction": {
+                    },
+                    "index": 0
+                }],
+                "rx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-node-id-in-otn-topology>",
                         "port-type": "fixed",
@@ -973,8 +1036,9 @@ optical network infrastructure composed of rdm nodes.
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
+                    },
+                    "index": 0
+                }],
                 "optic-type": "gray"
             },
             "due-date": "yyyy-mm-ddT00:00:01Z",
@@ -994,7 +1058,7 @@ infrastructure a bidirectional end-to-end OTUC4 over an optical Optical Tributar
 connectivity service between two optical network ports of OTN Xponder (MUXPDR or SWITCH). Such
 service configure the optical network infrastructure composed of rdm nodes.
 
-**REST API** : *POST /restconf/operations/org-openroadm-service:service-create*
+**REST API** : *POST /rests/operations/org-openroadm-service:service-create*
 
 **Sample JSON Data**
 
@@ -1016,7 +1080,7 @@ service configure the optical network infrastructure composed of rdm nodes.
                 "service-format": "OTU",
                 "otu-service-rate": "org-openroadm-otn-common-types:OTUCn",
                 "clli": "<ccli-name>",
-                "tx-direction": {
+                "tx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-node-id-in-otn-topology>",
                         "port-type": "fixed",
@@ -1029,9 +1093,10 @@ service configure the optical network infrastructure composed of rdm nodes.
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
-                "rx-direction": {
+                    },
+                    "index": 0
+                }],
+                "rx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-node-id-in-otn-topology>",
                         "port-type": "fixed",
@@ -1044,8 +1109,9 @@ service configure the optical network infrastructure composed of rdm nodes.
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
+                    },
+                    "index": 0
+                }],
                 "optic-type": "gray"
             },
             "service-z-end": {
@@ -1054,7 +1120,7 @@ service configure the optical network infrastructure composed of rdm nodes.
                 "service-format": "OTU",
                 "otu-service-rate": "org-openroadm-otn-common-types:OTUCn",
                 "clli": "<ccli-name>",
-                "tx-direction": {
+                "tx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-node-id-in-otn-topology>",
                         "port-type": "fixed",
@@ -1067,9 +1133,10 @@ service configure the optical network infrastructure composed of rdm nodes.
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
-                "rx-direction": {
+                    },
+                    "index": 0
+                }],
+                "rx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-node-id-in-otn-topology>",
                         "port-type": "fixed",
@@ -1082,8 +1149,9 @@ service configure the optical network infrastructure composed of rdm nodes.
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
+                    },
+                    "index": 0
+                }],
                 "optic-type": "gray"
             },
             "due-date": "yyyy-mm-ddT00:00:01Z",
@@ -1119,7 +1187,7 @@ infrastructure a bidirectional end-to-end ODU4 OTN service over an OTU4 and stru
 low-order OTN services (ODU2e, ODU0). As for OTU4, such a service must be created between two network
 ports of OTN Xponder (MUXPDR or SWITCH).
 
-**REST API** : *POST /restconf/operations/org-openroadm-service:service-create*
+**REST API** : *POST /rests/operations/org-openroadm-service:service-create*
 
 **Sample JSON Data**
 
@@ -1141,7 +1209,7 @@ ports of OTN Xponder (MUXPDR or SWITCH).
                 "service-format": "ODU",
                 "otu-service-rate": "org-openroadm-otn-common-types:ODU4",
                 "clli": "<ccli-name>",
-                "tx-direction": {
+                "tx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-node-id-in-otn-topology>",
                         "port-type": "fixed",
@@ -1154,9 +1222,10 @@ ports of OTN Xponder (MUXPDR or SWITCH).
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
-                "rx-direction": {
+                    },
+                    "index": 0
+                }],
+                "rx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-node-id-in-otn-topology>",
                         "port-type": "fixed",
@@ -1169,8 +1238,9 @@ ports of OTN Xponder (MUXPDR or SWITCH).
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
+                    },
+                    "index": 0
+                }],
                 "optic-type": "gray"
             },
             "service-z-end": {
@@ -1179,7 +1249,7 @@ ports of OTN Xponder (MUXPDR or SWITCH).
                 "service-format": "ODU",
                 "otu-service-rate": "org-openroadm-otn-common-types:ODU4",
                 "clli": "<ccli-name>",
-                "tx-direction": {
+                "tx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-node-id-in-otn-topology>",
                         "port-type": "fixed",
@@ -1192,9 +1262,10 @@ ports of OTN Xponder (MUXPDR or SWITCH).
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
-                "rx-direction": {
+                    },
+                    "index": 0
+                }],
+                "rx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-node-id-in-otn-topology>",
                         "port-type": "fixed",
@@ -1207,8 +1278,9 @@ ports of OTN Xponder (MUXPDR or SWITCH).
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
+                    },
+                    "index": 0
+                }],
                 "optic-type": "gray"
             },
             "due-date": "yyyy-mm-ddT00:00:01Z",
@@ -1228,7 +1300,7 @@ infrastructure a bidirectional end-to-end 10GE-ODU2e OTN service over an ODU4.
 Such a service must be created between two client ports of OTN Xponder (MUXPDR or SWITCH)
 configured to support 10GE interfaces.
 
-**REST API** : *POST /restconf/operations/org-openroadm-service:service-create*
+**REST API** : *POST /rests/operations/org-openroadm-service:service-create*
 
 **Sample JSON Data**
 
@@ -1255,7 +1327,7 @@ configured to support 10GE interfaces.
                         "committed-burst-size": "64"
                     }
                 },
-                "tx-direction": {
+                "tx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-node-id-in-otn-topology>",
                         "port-type": "fixed",
@@ -1268,9 +1340,10 @@ configured to support 10GE interfaces.
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
-                "rx-direction": {
+                    },
+                    "index": 0
+                }],
+                "rx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-node-id-in-otn-topology>",
                         "port-type": "fixed",
@@ -1283,8 +1356,9 @@ configured to support 10GE interfaces.
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
+                    },
+                    "index": 0
+                }],
                 "optic-type": "gray"
             },
             "service-z-end": {
@@ -1298,7 +1372,7 @@ configured to support 10GE interfaces.
                         "committed-burst-size": "64"
                     }
                 },
-                "tx-direction": {
+                "tx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-node-id-in-otn-topology>",
                         "port-type": "fixed",
@@ -1311,9 +1385,10 @@ configured to support 10GE interfaces.
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
-                "rx-direction": {
+                    },
+                    "index": 0
+                }],
+                "rx-direction": [{
                     "port": {
                         "port-device-name": "<xpdr-node-id-in-otn-topology>",
                         "port-type": "fixed",
@@ -1326,8 +1401,9 @@ configured to support 10GE interfaces.
                         "lgx-port-name": "Some lgx-port-name",
                         "lgx-port-rack": "000000.00",
                         "lgx-port-shelf": "00"
-                    }
-                },
+                    },
+                    "index": 0
+                }],
                 "optic-type": "gray"
             },
             "due-date": "yyyy-mm-ddT00:00:01Z",
@@ -1360,7 +1436,7 @@ Deleting any kind of service
 Use the following REST RPC to invoke *service handler* module in order to delete a given optical
 connectivity service.
 
-**REST API** : *POST /restconf/operations/org-openroadm-service:service-delete*
+**REST API** : *POST /rests/operations/org-openroadm-service:service-delete*
 
 **Sample JSON Data**
 
@@ -1401,7 +1477,7 @@ nodes.
 Checking OTU4 service connectivity
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-**REST API** : *POST /restconf/operations/transportpce-pce:path-computation-request*
+**REST API** : *POST /rests/operations/transportpce-pce:path-computation-request*
 
 **Sample JSON Data**
 
@@ -1426,7 +1502,7 @@ Checking OTU4 service connectivity
              "service-format": "OTU",
              "node-id": "<otn-node-id>"
              },
-           "pce-metric": "hop-count"
+           "pce-routing-metric": "hop-count"
        }
    }
 
@@ -1437,7 +1513,7 @@ Checking OTU4 service connectivity
 Checking ODU4 service connectivity
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-**REST API** : *POST /restconf/operations/transportpce-pce:path-computation-request*
+**REST API** : *POST /rests/operations/transportpce-pce:path-computation-request*
 
 **Sample JSON Data**
 
@@ -1462,7 +1538,7 @@ Checking ODU4 service connectivity
              "service-format": "ODU",
              "node-id": "<otn-node-id>"
              },
-           "pce-metric": "hop-count"
+           "pce-routing-metric": "hop-count"
        }
    }
 
@@ -1472,7 +1548,7 @@ Checking ODU4 service connectivity
 Checking 10GE/ODU2e service connectivity
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-**REST API** : *POST /restconf/operations/transportpce-pce:path-computation-request*
+**REST API** : *POST /rests/operations/transportpce-pce:path-computation-request*
 
 **Sample JSON Data**
 
@@ -1497,7 +1573,7 @@ Checking 10GE/ODU2e service connectivity
              "service-format": "Ethernet",
              "node-id": "<otn-node-id>"
              },
-           "pce-metric": "hop-count"
+           "pce-routing-metric": "hop-count"
        }
    }
 
@@ -1510,16 +1586,19 @@ odl-transportpce-tapi
 
 This feature allows TransportPCE application to expose at its northbound interface other APIs than
 those defined by the OpenROADM MSA. With this feature, TransportPCE provides part of the Transport-API
-specified by the Open Networking Foundation. More specifically, the Topology Service and Connectivity
-Service components are implemented, allowing to expose to higher level applications an abstraction of
-its OpenROADM topologies in the form of topologies respecting the T-API modelling, as well as
-creating/deleting connectivity services between the Service Interface Points (SIPs) exposed by the
-T-API topology. The current version of TransportPCE implements the *tapi-topology.yang* and
-*tapi-connectivity.yang* models in the revision 2018-12-10 (T-API v2.1.2).
+specified by the Open Networking Foundation. More specifically, the Topology Service, Connectivity and Notification
+Service components are implemented, allowing to:
+
+1. Expose to higher level applications an abstraction of its OpenROADM topologies in the form of topologies respecting the T-API modelling.
+2. Create/delete connectivity services between the Service Interface Points (SIPs) exposed by the T-API topology.
+3. Create/Delete Notification Subscription Service to expose to higher level applications T-API notifications through a Kafka server.
 
-Additionally, support for the Notification Service component will be added in future releases, which
-will allow higher level applications to create/delete a Notification Subscription Service to receive
-several T-API notifications as defined in the *tapi-notification.yang* model.
+The current version of TransportPCE implements the *tapi-topology.yang*,
+*tapi-connectivity.yang* and *tapi-notification.yang* models in the revision
+2018-12-10 (T-API v2.1.2).
+
+Additionally, support for the Path Computation Service will be added in future releases, which will allow T-PCE
+to compute a path over the T-API topology.
 
 T-API Topology Service
 ~~~~~~~~~~~~~~~~~~~~~~
@@ -1608,7 +1687,7 @@ single layer DSR node with only the two Owned Node Edge Ports representing the t
 of respectively XPDR-A1-XPDR1 and XPDR-C1-XPDR1...
 
 
-**REST API** : *POST /restconf/operations/tapi-topology:get-topology-details*
+**REST API** : *POST /rests/operations/tapi-topology:get-topology-details*
 
 This request builds the TAPI *T0 - Multi-layer topology* abstraction with regard to the current
 state of *openroadm-topology* and *otn-topology* topologies stored in OpenDaylight datastores.
@@ -1654,7 +1733,7 @@ the T-API topology context stored in OpenDaylight datastores.
         }
     }
 
-**REST API** : *POST /restconf/operations/tapi-topology:get-node-details*
+**REST API** : *POST /rests/operations/tapi-topology:get-node-details*
 
 This request returns the information, stored in the Topology Context, of the corresponding T-API node.
 The user can provide, either the Uuid associated to the attribute or its name.
@@ -1666,11 +1745,11 @@ The user can provide, either the Uuid associated to the attribute or its name.
     {
       "tapi-topology:input": {
         "tapi-topology:topology-id-or-name": "T0 - Full Multi-layer topology",
-        "tapi-topology:node-id-or-name": "ROADM-A1+PHOTONINC_MEDIA"
+        "tapi-topology:node-id-or-name": "ROADM-A1+PHOTONIC_MEDIA"
       }
     }
 
-**REST API** : *POST /restconf/operations/tapi-topology:get-node-edge-point-details*
+**REST API** : *POST /rests/operations/tapi-topology:get-node-edge-point-details*
 
 This request returns the information, stored in the Topology Context, of the corresponding T-API NEP.
 The user can provide, either the Uuid associated to the attribute or its name.
@@ -1682,12 +1761,12 @@ The user can provide, either the Uuid associated to the attribute or its name.
     {
       "tapi-topology:input": {
         "tapi-topology:topology-id-or-name": "T0 - Full Multi-layer topology",
-        "tapi-topology:node-id-or-name": "ROADM-A1+PHOTONINC_MEDIA",
-        "tapi-topology:ep-id-or-name": "ROADM-A1+PHOTONINC_MEDIA+DEG1-TTP-TXRX"
+        "tapi-topology:node-id-or-name": "ROADM-A1+PHOTONIC_MEDIA",
+        "tapi-topology:ep-id-or-name": "ROADM-A1+PHOTONIC_MEDIA+DEG1-TTP-TXRX"
       }
     }
 
-**REST API** : *POST /restconf/operations/tapi-topology:get-link-details*
+**REST API** : *POST /rests/operations/tapi-topology:get-link-details*
 
 This request returns the information, stored in the Topology Context, of the corresponding T-API link.
 The user can provide, either the Uuid associated to the attribute or its name.
@@ -1787,7 +1866,7 @@ following REST RPCs:
 From xpdr <--> rdm:
 ^^^^^^^^^^^^^^^^^^^
 
-**REST API** : *POST /restconf/operations/transportpce-tapinetworkutils:init-xpdr-rdm-tapi-link*
+**REST API** : *POST /rests/operations/transportpce-tapinetworkutils:init-xpdr-rdm-tapi-link*
 
 **Sample JSON Data**
 
@@ -1805,7 +1884,7 @@ From xpdr <--> rdm:
 Use the following REST RPC to invoke T-API module in order to create a bidirectional connectivity
 service between two devices. The network should be composed of two ROADMs and two Xponders (SWITCH or MUX)
 
-**REST API** : *POST /restconf/operations/tapi-connectivity:create-connectivity-service*
+**REST API** : *POST /rests/operations/tapi-connectivity:create-connectivity-service*
 
 **Sample JSON Data**
 
@@ -1885,7 +1964,7 @@ Deleting a connectivity service
 Use the following REST RPC to invoke *TAPI* module in order to delete a given optical
 connectivity service.
 
-**REST API** : *POST /restconf/operations/tapi-connectivity:delete-connectivity-service*
+**REST API** : *POST /rests/operations/tapi-connectivity:delete-connectivity-service*
 
 **Sample JSON Data**
 
@@ -1907,10 +1986,141 @@ connectivity service.
 T-API Notification Service
 ~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-In future releases, the T-API notification service will be implemented. The objective will be to write and read
-T-API notifications stored in topics of a Kafka server as explained later in the odl-transportpce-nbinotifications
-section, but T-API based.
+-  RPC calls implemented:
+
+   -  create-notification-subscription-service
+
+   -  get-supported-notification-types
+
+   -  delete-notification-subscription-service
+
+   -  get-notification-subscription-service-details
+
+   -  get-notification-subscription-service-list
+
+   -  get-notification-list
+
+Sulfur SR1 extends the T-API interface support by implementing the T-API notification service. This feature
+allows TransportPCE to write and read tapi-notifications stored in topics of a Kafka server. It also upgrades
+the nbinotifications module to support the serialization and deserialization of tapi-notifications into JSON
+format and vice-versa. Current implementation of the notification service creates a Kafka topic and stores
+tapi-notification on reception of a create-notification-subscription-service request. Only connectivity-service
+related notifications are stored in the Kafka server.
+
+In comparison with openroadm notifications, in which several pre-defined kafka topics are created on nbinotification
+module instantiation, tapi-related kafka topics are created on-demand. Upon reception of a
+*create-notification-subscription-service request*, a new topic will be created in the Kafka server.
+This topic is named after the connectivity-service UUID.
+
+.. note::
+    Creating a Notification Subscription Service could include a list of T-API object UUIDs, therefore 1 topic per UUID
+    is created in the Kafka server.
+
+In the current implementation, only Connectivity Service related notification are supported.
+
+**REST API** : *POST /rests/operations/tapi-notification:get-supported-notification-types*
+
+The response body will include the type of notifications supported and the object types
+
+Use the following RPC to create a Notification Subscription Service.
+
+**REST API** : *POST /rests/operations/tapi-notification:create-notification-subscription-service*
+
+**Sample JSON Data**
+
+.. code:: json
+
+    {
+        "tapi-notification:input": {
+            "tapi-notification:subscription-filter": {
+                "tapi-notification:requested-notification-types": [
+                    "ALARM_EVENT"
+                ],
+                "tapi-notification:requested-object-types": [
+                    "CONNECTIVITY_SERVICE"
+                ],
+                "tapi-notification:requested-layer-protocols": [
+                    "<LAYER_PROTOCOL_NAME>"
+                ],
+                "tapi-notification:requested-object-identifier": [
+                    "<Service_UUID>"
+                ],
+                "tapi-notification:include-content": true,
+                "tapi-notification:local-id": "localId",
+                "tapi-notification:name": [
+                    {
+                        "tapi-notification:value-name": "Subscription name",
+                        "tapi-notification:value": "<notification_service_name>"
+                    }
+                ]
+            },
+            "tapi-notification:subscription-state": "ACTIVE"
+        }
+    }
+
+This call will return the *UUID* of the Notification Subscription service, which can later be used to retrieve the
+details of the created subscription, to delete the subscription (and all the related kafka topics) or to retrieve
+all the tapi notifications related to that subscription service.
+
+The figure below shows an example of the application of tapi and nbinotifications in order to notify when there is
+a connectivity service creation process. Depending on the status of the process a tapi-notification with the
+corresponding updated state of the connectivity service is sent to the topic "Service_UUID".
+
+.. figure:: ./images/TransportPCE-tapi-nbinotifications-service-example.jpg
+   :alt: Example of tapi connectivity service notifications using the feature nbinotifications in TransportPCE
+
+Additionally, when a connectivity service breaks down or is restored a tapi notification alarming the new status
+will be sent to a Kafka Server. Below an example of a tapi notification is shown.
+
+**Sample JSON T-API notification**
+
+.. code:: json
+
+    {
+      "nbi-notifications:notification-tapi-service": {
+        "layer-protocol-name": "<LAYER_PROTOCOL_NAME>",
+        "notification-type": "ATTRIBUTE_VALUE_CHANGE",
+        "changed-attributes": [
+          {
+            "value-name": "administrativeState",
+            "old-value": "<LOCKED_OR_UNLOCKED>",
+            "new-value": "<UNLOCKED_OR_LOCKED>"
+          },
+          {
+            "value-name": "operationalState",
+            "old-value": "DISABLED_OR_ENABLED",
+            "new-value": "ENABLED_OR_DISABLED"
+          }
+        ],
+        "target-object-name": [
+          {
+            "value-name": "Connectivity Service Name",
+            "value": "<SERVICE_UUID>"
+          }
+        ],
+        "uuid": "<NOTIFICATION_UUID>",
+        "target-object-type": "CONNECTIVITY_SERVICE",
+        "event-time-stamp": "2022-04-06T09:06:01+00:00",
+        "target-object-identifier": "<SERVICE_UUID>"
+      }
+    }
+
+To retrieve these tapi connectivity service notifications stored in the kafka server:
+
+**REST API** : *POST /rests/operations/tapi-notification:get-notification-list*
+
+**Sample JSON Data**
+
+.. code:: json
+
+    {
+        "tapi-notification:input": {
+            "tapi-notification:subscription-id-or-name": "<SUBSCRIPTION_UUID_OR_NAME>",
+            "tapi-notification:time-period": "time-period"
+        }
+    }
 
+Further development will support more types of T-API objects, i.e., node, link, topology, connection...
 
 odl-transportpce-dmaap-client
 -----------------------------
@@ -1967,7 +2177,7 @@ Otherwise, this notification will be published :
 
 To retrieve these service notifications stored in the Kafka server :
 
-**REST API** : *POST /restconf/operations/nbi-notifications:get-notifications-process-service*
+**REST API** : *POST /rests/operations/nbi-notifications:get-notifications-process-service*
 
 **Sample JSON Data**
 
@@ -1991,7 +2201,7 @@ The topics that store these notifications in the Kafka server are also named aft
 
 To retrieve these alarm notifications stored in the Kafka server :
 
-**REST API** : *POST /restconf/operations/nbi-notifications:get-notifications-alarm-service*
+**REST API** : *POST /rests/operations/nbi-notifications:get-notifications-alarm-service*
 
 **Sample JSON Data**
 
diff --git a/docs/images/TransportPCE-Diagram-Sulfur.jpg b/docs/images/TransportPCE-Diagram-Sulfur.jpg
new file mode 100644 (file)
index 0000000..b39e8e0
Binary files /dev/null and b/docs/images/TransportPCE-Diagram-Sulfur.jpg differ
diff --git a/docs/images/TransportPCE-tapi-nbinotifications-service-example.jpg b/docs/images/TransportPCE-tapi-nbinotifications-service-example.jpg
new file mode 100644 (file)
index 0000000..8c85d2d
Binary files /dev/null and b/docs/images/TransportPCE-tapi-nbinotifications-service-example.jpg differ
index 1ede63a3c2ef130330899a9ef175b553fdcd856f..6473ffb064e78acc286e12da022f2488deb53744 100644 (file)
@@ -42,7 +42,7 @@ Tox configuration
 -----------------
 
 `Tox` configuration is written in the `tox.ini` file at the root folder of the Git project.
-Please read `tox official documentation <https://tox.readthedocs.io/>`_ for more details.
+Please read `tox official documentation <https://tox.wiki/>`_ for more details.
 For tox users, the most important parameter in the `[tox]` section is `envlist`.
 It specifies which profiles to run by default (i.e. when tox is called without the option `-e`).
 The option `-e` overrides this parameter and allows to choose which profiles to run.
@@ -106,7 +106,7 @@ Some are even performed in the CI.
 Pre-commit profiles
 -------------------
 
-`Pre-commit <https://pre-commit.com/>`_ is another wrapper for linters that relies on `Git Hooks <https://githooks.com/>`_.
+`Pre-commit <https://pre-commit.com/>`_ is another wrapper for linters that relies on `Git Hooks <https://git-scm.com/docs/githooks>`_.
 It is particularly useful to address common programming issues such as
 triming trailing whitespaces or removing tabs.
 
index f8ee5e8ba3e7bc49ba3e35a8d10f742fae13c61f..0e1bc1ce0d5af06e55f727e40055b56001d2d660 100644 (file)
@@ -17,11 +17,11 @@ request coming from a higher layer controller and/or an orchestrator.
 This capability may rely on the controller only or it may be delegated to
 distributed (standardized) protocols.
 
-It provides basic alarm/fault and performance monitoring,
+For the time being, it provides very basic alarm/fault management and performance monitoring,
 but this function might be externalized to improve the scalability.
-A Graphical User Interface has been developped separately and is not proposed
-here since automated control does not imply user interactions at the transport
-controller level.
+A Graphical User Interface (`Transport PCE_GUI <https://gitlab.com/Orange-OpenSource/lfn/odl/tpce_gui>`__)
+has been developped separately and is not proposed here since automated control
+does not imply user interactions at the transport controller level.
 
 TransportPCE modular architecture is described on the next diagram. Each main
 function such as Topology management, Path Calculation Engine (PCE), Service
@@ -48,7 +48,7 @@ TransportPCE User-Facing Features
 
 -  **feature odl-transportpce-tapi**
 
-   -  This feature provides transportPCE a limited support of TAPI version 2.1.2 Northbound interface.
+   -  This feature provides transportPCE a limited support of TAPI version 2.1.1 Northbound interface.
 
 -  **feature odl-transportpce-inventory**
 
@@ -71,10 +71,11 @@ How To Start
 Preparing for Installation
 ~~~~~~~~~~~~~~~~~~~~~~~~~~
 
-1. Devices must support the standard OpenROADM Models more precisely versions 1.2.1 and 2.2.1.
+1. Devices must support the standard OpenROADM Models more precisely versions 1.2.1, 2.2.1 or 7.1.0.
    Since Magnesium SR0, an OTN experimental support is provided for OpenROADM devices 2.2.1.
    Magnesium SR2 is the first release managing end-to-end OTN services, as OCH-OTU4,
    structured ODU4 or again 10GE-ODU2e services.
+   This has also been extended to be supported on 7.1 devices
 
 2. Devices must support configuration through NETCONF protocol/API.
 
@@ -85,16 +86,16 @@ Installation Feature
 
 Creation of services with TransportPCE controller on real optical devices takes a rather long while,
 due to the fact that the output optical power level modification on interfaces requires time for stabilisation
-level. Per default values of TransportPCE timers are those recommended by OpenROADM MSA, respectively 120 000
+level. By default values of TransportPCE timers are those recommended by OpenROADM MSA, respectively 120 000
 and 20 000 seconds.
 When running TransportPCE controller with honeynode simulators, which is the case of all TransportPCE functional tests,
 we don't need so important timer values. You can considerably speed tests using respectively 3000 and 2000 seconds.
-To that end, before running OpenDaylight, set OLM_TIMER1 and OLM_TIMER2 as environment variables.
+To that end, before starting karaf of the OpenDaylight TransportPCE controller, set OLM_TIMER1 and OLM_TIMER2 as environment variables.
 For example::
 
     export OLM_TIMER1=3000 OLM_TIMER2=2000
 
-To come back with per default values for these timers, just logout from OpenDaylight controller, and unset your
+To come back with per default values for these timers, just logout from OpenDaylight controller, unset your
 environment variables, and start again the controller::
 
     unset OLM_TIMER1 OLM_TIMER2
@@ -115,16 +116,19 @@ For example by modifying the environment variables JAVA_MIN_MEM and JAVA_MAX_MEM
    export JAVA_MIN_MEM=1024M
    export JAVA_MAX_MEM=4069M
 
-if you need the inventory external connector support limited to 1.2.1 OpenROADM devices, then run::
+In Chlorine, installation of odl-transportpce-tapi feature may cause some other transportpce OSGi bundle to be
+in failure. To restore the situation, just log out and log back in.
+
+If you need the inventory external connector support limited to 1.2.1 OpenROADM devices, then run::
 
    feature:install odl-transportpce-inventory
 
-if you need the Dmaap connector support, before running Opendaylight, set DMAAP_BASE_URL as environment variable.
+If you need the Dmaap connector support, before running Opendaylight, set DMAAP_BASE_URL as environment variable.
 For example, if the base url of your Dmaap server is "https://dmaap-mr:30226", then::
 
     export DMAAP_BASE_URL=https://dmaap-mr:30226
 
-if your Dmaap server provides https connection through a self-signed certificate, do not forget to add the certificate
+If your Dmaap server provides https connection through a self-signed certificate, do not forget to add the certificate
 to the JAVA truststore::
 
     echo -n | openssl s_client -showcerts -connect dmaap-mr:30226 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/dmaap.crt
@@ -152,4 +156,9 @@ After that, run in karaf::
 
    feature:install odl-transportpce-nbinotifications
 
+.. note::
+
+    In Chlorine release, the odl-transportpce-swagger feature is no longer functional. Issue still under investigation.
+
+
 For a more detailed overview of the TransportPCE, see the :ref:`transportpce-dev-guide`.
diff --git a/features/features-transportpce/pom.xml b/features/features-transportpce/pom.xml
new file mode 100644 (file)
index 0000000..4c91daa
--- /dev/null
@@ -0,0 +1,69 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright © 2022 Orange and others. All rights reserved.
+
+This program and the accompanying materials are made available under the
+terms of the Eclipse Public License v1.0 which accompanies this distribution,
+and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.opendaylight.odlparent</groupId>
+    <artifactId>feature-repo-parent</artifactId>
+    <version>13.0.11</version>
+    <relativePath/>
+  </parent>
+
+  <groupId>org.opendaylight.transportpce</groupId>
+  <artifactId>features-transportpce</artifactId>
+  <version>10.0.0-SNAPSHOT</version>
+  <packaging>feature</packaging>
+  <name>OpenDaylight :: TransportPCE :: Features</name>
+
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>${project.groupId}</groupId>
+        <artifactId>transportpce-artifacts</artifactId>
+        <version>${project.version}</version>
+        <scope>import</scope>
+        <type>pom</type>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
+  <dependencies>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>odl-transportpce</artifactId>
+      <classifier>features</classifier>
+      <type>xml</type>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>odl-transportpce-tapi</artifactId>
+      <classifier>features</classifier>
+      <type>xml</type>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>odl-transportpce-nbinotifications</artifactId>
+      <classifier>features</classifier>
+      <type>xml</type>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>odl-transportpce-dmaap-client</artifactId>
+      <classifier>features</classifier>
+      <type>xml</type>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>odl-transportpce-inventory</artifactId>
+      <classifier>features</classifier>
+      <type>xml</type>
+    </dependency>
+  </dependencies>
+</project>
index a623770d1160dea88de3dfea15094f9f23d604f7..c584e675ff1a72994692b1c12c18d92e7c6dbc6b 100644 (file)
   <parent>
     <groupId>org.opendaylight.odlparent</groupId>
     <artifactId>single-feature-parent</artifactId>
-    <version>9.0.13</version>
+    <version>13.0.11</version>
     <relativePath/>
   </parent>
 
   <groupId>org.opendaylight.transportpce</groupId>
   <artifactId>odl-transportpce-dmaap-client</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
+  <version>10.0.0-SNAPSHOT</version>
   <packaging>feature</packaging>
   <name>OpenDaylight :: transportpce :: dmaap-client</name>
 
   <properties>
-    <!-- skipped because we are using config file as artifact and it is not installed before running test -->
-    <skip.karaf.featureTest>true</skip.karaf.featureTest>
+    <skip.karaf.featureTest>false</skip.karaf.featureTest>
   </properties>
 
   <dependencies>
         </exclusion>
       </exclusions>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce</groupId>
+      <artifactId>transportpce-dmaap-client</artifactId>
+      <version>${project.version}</version>
+      <type>cfg</type>
+      <classifier>config</classifier>
+    </dependency>
   </dependencies>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>build-helper-maven-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>attach-dmaap-artifact</id>
-            <phase>test</phase>
-            <goals>
-              <goal>attach-artifact</goal>
-            </goals>
-            <configuration>
-              <artifacts>
-                <artifact>
-                  <file>${basedir}/src/main/resources/org.opendaylight.transportpce.dmaap.cfg</file>
-                  <type>cfg</type>
-                  <classifier>config</classifier>
-                </artifact>
-              </artifacts>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-</project>
\ No newline at end of file
+</project>
index 0031ef8c322d885eb2d76257fa6c638716ac64a8..7fd90d6faf8905ff4197adddf5df07c80c85b5bc 100644 (file)
@@ -6,7 +6,7 @@
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="odl-transportpce-dmaap-client">
     <feature name="odl-transportpce-dmaap-client">
         <configfile finalname="etc/org.opendaylight.transportpce.dmaap.cfg" override="false">
-            mvn:${project.groupId}/${project.artifactId}/${project.version}/cfg/config
+            mvn:${project.groupId}/transportpce-dmaap-client/${project.version}/cfg/config
         </configfile>
     </feature>
 </features>
\ No newline at end of file
index 855f0359cdb2d400d352dad65bf49a1ce5d01275..3ef6613991db240eb0e97ffddf95adbe0c0cf452 100644 (file)
@@ -9,17 +9,20 @@
   <parent>
     <groupId>org.opendaylight.odlparent</groupId>
     <artifactId>single-feature-parent</artifactId>
-    <version>9.0.13</version>
+    <version>13.0.11</version>
     <relativePath/>
   </parent>
 
   <groupId>org.opendaylight.transportpce</groupId>
   <artifactId>odl-transportpce-inventory</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
+  <version>10.0.0-SNAPSHOT</version>
   <packaging>feature</packaging>
   <name>OpenDaylight :: transportpce :: Inventory</name>
 
   <properties>
+    <mdsal.version>13.0.1</mdsal.version>
+    <netconf.version>7.0.4</netconf.version>
+    <transportpce.models.version>20.0.0-SNAPSHOT</transportpce.models.version>
     <transportpce.db.host>localhost:3306</transportpce.db.host>
     <transportpce.db.database>transportpce</transportpce.db.database>
     <transportpce.db.username>root</transportpce.db.username>
     <transporpce.device.backup.prefix></transporpce.device.backup.prefix>
     <transporpce.device.backup.period>600</transporpce.device.backup.period>
     <!-- skipping single feature test because DataSource is not available in Pax4j (H2 possible workaround) -->
-    <skip.karaf.featureTest>true</skip.karaf.featureTest>
+    <skip.karaf.featureTest>false</skip.karaf.featureTest>
   </properties>
 
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.opendaylight.mdsal</groupId>
+        <artifactId>mdsal-artifacts</artifactId>
+        <version>${mdsal.version}</version>
+        <scope>import</scope>
+        <type>pom</type>
+      </dependency>
+      <dependency>
+        <groupId>org.opendaylight.netconf</groupId>
+        <artifactId>netconf-artifacts</artifactId>
+        <version>${netconf.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
   <dependencies>
     <dependency>
       <groupId>org.opendaylight.transportpce</groupId>
       <classifier>features</classifier>
       <type>xml</type>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>odl-mdsal-binding-base</artifactId>
+      <classifier>features</classifier>
+      <type>xml</type>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.netconf</groupId>
+      <artifactId>odl-netconf-util</artifactId>
+      <classifier>features</classifier>
+      <type>xml</type>
+    </dependency>
+    <!--dependency>
+      <groupId>org.opendaylight.netconf</groupId>
+      <artifactId>odl-netconf-mapping-api</artifactId>
+      <classifier>features</classifier>
+      <type>xml</type>
+    </dependency-->
+    <dependency>
+      <groupId>org.opendaylight.transportpce</groupId>
+      <artifactId>transportpce-inventory</artifactId>
+      <version>${project.version}</version>
+    </dependency>
     <dependency>
       <groupId>org.opendaylight.transportpce</groupId>
       <artifactId>transportpce-inventory</artifactId>
       <version>${project.version}</version>
+      <type>cfg</type>
+      <classifier>config</classifier>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce</groupId>
+      <artifactId>transportpce-inventory</artifactId>
+      <version>${project.version}</version>
+      <type>cfg</type>
+      <classifier>datasource</classifier>
     </dependency>
   </dependencies>
-
-  <build>
-    <plugins>
-      <plugin>
-        <artifactId>maven-resources-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>copy-resources</id>
-            <phase>validate</phase>
-            <goals>
-              <goal>copy-resources</goal>
-            </goals>
-            <configuration>
-              <outputDirectory>${basedir}/target/resources</outputDirectory>
-              <resources>
-                <resource>
-                  <directory>src/main/resources</directory>
-                  <filtering>true</filtering>
-                </resource>
-              </resources>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>build-helper-maven-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>attach-db-artifact</id>
-            <phase>package</phase>
-            <goals>
-              <goal>attach-artifact</goal>
-            </goals>
-            <configuration>
-              <artifacts>
-                <artifact>
-                  <file>target/resources/org.ops4j.datasource-transporpce.cfg</file>
-                  <type>cfg</type>
-                  <classifier>datasource</classifier>
-                </artifact>
-                <artifact>
-                  <file>target/resources/org.opendaylight.transportpce.job.cfg</file>
-                  <type>cfg</type>
-                  <classifier>config</classifier>
-                </artifact>
-              </artifacts>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
 </project>
index 0c9de2a06acb96b530aba9367e0665bde9f1be59..fe40883a2be3bead391af4eca4625487bc1fa03b 100644 (file)
@@ -5,10 +5,10 @@
         <feature>pax-jdbc-mariadb</feature>
         <feature>pax-jdbc-pool-dbcp2</feature>
         <configfile finalname="etc/org.ops4j.datasource-transportpce.cfg" override="false">
-            mvn:${project.groupId}/${project.artifactId}/${project.version}/cfg/datasource
+            mvn:${project.groupId}/transportpce-inventory/${project.version}/cfg/datasource
         </configfile>
         <configfile finalname="etc/org.opendaylight.transportpce.job.cfg" override="false">
-            mvn:${project.groupId}/${project.artifactId}/${project.version}/cfg/config
+            mvn:${project.groupId}/transportpce-inventory/${project.version}/cfg/config
         </configfile>
     </feature>
 </features>
\ No newline at end of file
index bdcd60d784ee1f259bbda6d0f5d9e19970a9cbe5..42810dcf9d7a9842fdd0d4513928e2e0562aafe5 100644 (file)
   <parent>
     <groupId>org.opendaylight.odlparent</groupId>
     <artifactId>single-feature-parent</artifactId>
-    <version>9.0.13</version>
+    <version>13.0.11</version>
     <relativePath/>
   </parent>
 
   <groupId>org.opendaylight.transportpce</groupId>
   <artifactId>odl-transportpce-nbinotifications</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
+  <version>10.0.0-SNAPSHOT</version>
   <packaging>feature</packaging>
   <name>OpenDaylight :: transportpce :: nbinotifications</name>
 
   <properties>
-    <!-- skipped because we are using config file as artifact and it is not installed before running test -->
-    <skip.karaf.featureTest>true</skip.karaf.featureTest>
+    <skip.karaf.featureTest>false</skip.karaf.featureTest>
   </properties>
 
   <dependencies>
       <artifactId>transportpce-nbinotifications</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>transportpce-nbinotifications</artifactId>
+      <version>${project.version}</version>
+      <type>cfg</type>
+      <classifier>config</classifier>
+    </dependency>
   </dependencies>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>build-helper-maven-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>attach-dmaap-artifact</id>
-            <phase>package</phase>
-            <goals>
-              <goal>attach-artifact</goal>
-            </goals>
-            <configuration>
-              <artifacts>
-                <artifact>
-                  <file>${basedir}/src/main/resources/org.opendaylight.transportpce.nbinotifications.cfg</file>
-                  <type>cfg</type>
-                  <classifier>config</classifier>
-                </artifact>
-              </artifacts>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
 </project>
index 5e99a524176d3dd9708f84a217b000c1f0094f66..e2cca34aadeddf4b2b820027848aeebc1f14cd32 100644 (file)
@@ -6,7 +6,7 @@
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="odl-transportpce-nbinotifications">
     <feature name="odl-transportpce-nbinotifications">
         <configfile finalname="etc/org.opendaylight.transportpce.nbinotififications.cfg" override="false">
-            mvn:${project.groupId}/${project.artifactId}/${project.version}/cfg/config
+            mvn:${project.groupId}/transportpce-nbinotifications/${project.version}/cfg/config
         </configfile>
     </feature>
 </features>
\ No newline at end of file
diff --git a/features/odl-transportpce-swagger/pom.xml b/features/odl-transportpce-swagger/pom.xml
deleted file mode 100644 (file)
index 63debf6..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Copyright © 2021 Orange and others. All rights reserved.
-
-This program and the accompanying materials are made available under the
-terms of the Eclipse Public License v1.0 which accompanies this distribution,
-and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.opendaylight.odlparent</groupId>
-    <artifactId>single-feature-parent</artifactId>
-    <version>9.0.13</version>
-    <relativePath/>
-  </parent>
-
-  <groupId>org.opendaylight.transportpce</groupId>
-  <artifactId>odl-transportpce-swagger</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
-  <packaging>feature</packaging>
-  <name>OpenDaylight :: transportpce :: swagger</name>
-
-  <properties>
-    <netconf.version>2.0.14</netconf.version>
-    <configfile.directory>etc/opendaylight/karaf</configfile.directory>
-  </properties>
-
-  <dependencyManagement>
-    <dependencies>
-      <dependency>
-        <groupId>org.opendaylight.netconf</groupId>
-        <artifactId>netconf-artifacts</artifactId>
-        <version>${netconf.version}</version>
-        <type>pom</type>
-        <scope>import</scope>
-      </dependency>
-    </dependencies>
-  </dependencyManagement>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.opendaylight.netconf</groupId>
-      <artifactId>odl-mdsal-apidocs</artifactId>
-      <classifier>features</classifier>
-      <type>xml</type>
-    </dependency>
-  </dependencies>
-
-  <!-- skipping test since this is an umbrella project / folder -->
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <skipTests>true</skipTests>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-</project>
index c30cccaf621c35c27295231a6623cc65c112a078..378a45a63ed354764f865d5d6cbbe6726681edfd 100644 (file)
@@ -12,21 +12,80 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
   <parent>
     <groupId>org.opendaylight.odlparent</groupId>
     <artifactId>single-feature-parent</artifactId>
-    <version>9.0.13</version>
+    <version>13.0.11</version>
     <relativePath/>
   </parent>
 
   <groupId>org.opendaylight.transportpce</groupId>
   <artifactId>odl-transportpce-tapi</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
+  <version>10.0.0-SNAPSHOT</version>
   <packaging>feature</packaging>
   <name>OpenDaylight :: transportpce :: tapi</name>
 
+  <properties>
+    <mdsal.version>13.0.1</mdsal.version>
+    <netconf.version>7.0.4</netconf.version>
+    <transportpce.models.version>20.0.0-SNAPSHOT</transportpce.models.version>
+    <skip.karaf.featureTest>false</skip.karaf.featureTest>
+  </properties>
+
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.opendaylight.transportpce.models</groupId>
+        <artifactId>transportpce-models-artifacts</artifactId>
+        <version>${transportpce.models.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+      <dependency>
+        <groupId>org.opendaylight.mdsal</groupId>
+        <artifactId>mdsal-artifacts</artifactId>
+        <version>13.0.1</version>
+        <scope>import</scope>
+        <type>pom</type>
+      </dependency>
+      <dependency>
+        <groupId>org.opendaylight.netconf</groupId>
+        <artifactId>netconf-artifacts</artifactId>
+        <version>${netconf.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
   <dependencies>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>odl-tapi-2.4.0-models</artifactId>
+      <classifier>features</classifier>
+      <type>xml</type>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.mdsal.model</groupId>
+      <artifactId>odl-mdsal-model-rfc8345</artifactId>
+      <classifier>features</classifier>
+      <type>xml</type>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.netconf</groupId>
+      <artifactId>odl-netconf-connector</artifactId>
+      <classifier>features</classifier>
+      <type>xml</type>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.netconf</groupId>
+      <artifactId>odl-netconf-all</artifactId>
+      <classifier>features</classifier>
+      <type>xml</type>
+    </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
-      <artifactId>transportpce-tapimodels</artifactId>
+      <artifactId>odl-transportpce</artifactId>
       <version>${project.version}</version>
+      <classifier>features</classifier>
+      <type>xml</type>
     </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
@@ -34,17 +93,4 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
       <version>${project.version}</version>
     </dependency>
   </dependencies>
-
-  <!-- skipping test since this is an umbrella project / folder -->
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <skipTests>true</skipTests>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
 </project>
index 1710cc23ca82d9b120ab09f00ac8c999444490b3..2e0798deedbfd63b40208be3fbf94aeb42e75bcc 100644 (file)
@@ -12,23 +12,32 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
   <parent>
     <groupId>org.opendaylight.odlparent</groupId>
     <artifactId>single-feature-parent</artifactId>
-    <version>9.0.13</version>
+    <version>13.0.11</version>
     <relativePath/>
   </parent>
 
   <groupId>org.opendaylight.transportpce</groupId>
   <artifactId>odl-transportpce</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
+  <version>10.0.0-SNAPSHOT</version>
   <packaging>feature</packaging>
   <name>OpenDaylight :: transportpce</name>
 
   <properties>
-    <netconf.version>2.0.14</netconf.version>
+    <netconf.version>7.0.4</netconf.version>
+    <transportpce.models.version>20.0.0-SNAPSHOT</transportpce.models.version>
     <configfile.directory>etc/opendaylight/karaf</configfile.directory>
+    <skip.karaf.featureTest>false</skip.karaf.featureTest>
   </properties>
 
   <dependencyManagement>
     <dependencies>
+      <dependency>
+        <groupId>org.opendaylight.transportpce.models</groupId>
+        <artifactId>transportpce-models-artifacts</artifactId>
+        <version>${transportpce.models.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
       <dependency>
         <groupId>org.opendaylight.netconf</groupId>
         <artifactId>netconf-artifacts</artifactId>
@@ -41,24 +50,10 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
 
   <dependencies>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-device</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-network</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-service</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>odl-openroadm-models</artifactId>
+      <classifier>features</classifier>
+      <type>xml</type>
     </dependency>
     <dependency>
       <groupId>org.opendaylight.transportpce</groupId>
@@ -85,6 +80,13 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
       <artifactId>transportpce-olm</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce</groupId>
+      <artifactId>transportpce-olm</artifactId>
+      <version>${project.version}</version>
+      <type>cfg</type>
+      <classifier>config</classifier>
+    </dependency>
     <dependency>
       <groupId>org.opendaylight.transportpce</groupId>
       <artifactId>transportpce-pce</artifactId>
@@ -97,7 +99,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
     </dependency>
     <dependency>
       <groupId>org.opendaylight.netconf</groupId>
-      <artifactId>odl-restconf</artifactId>
+      <artifactId>odl-restconf-all</artifactId>
       <classifier>features</classifier>
       <type>xml</type>
     </dependency>
@@ -114,39 +116,4 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
       <type>xml</type>
     </dependency>
   </dependencies>
-
-  <!-- skipping test since this is an umbrella project / folder -->
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <skipTests>true</skipTests>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>build-helper-maven-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>attach-artifact</id>
-            <phase>test</phase>
-            <goals>
-              <goal>attach-artifact</goal>
-            </goals>
-            <configuration>
-              <artifacts>
-                <artifact>
-                  <file>${basedir}/src/main/resources/org.opendaylight.transportpce.cfg</file>
-                  <type>cfg</type>
-                  <classifier>config</classifier>
-                </artifact>
-              </artifacts>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
 </project>
index 13c35983cec85de0cd208d0a9f775e90496eea16..e0df389c7824ac329d58970689af1057b8547d32 100644 (file)
@@ -6,7 +6,7 @@
 <features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="odl-transportpce">
     <feature name="odl-transportpce">
         <configfile finalname="etc/org.opendaylight.transportpce.cfg" override="true">
-            mvn:${project.groupId}/${project.artifactId}/${project.version}/cfg/config
+            mvn:${project.groupId}/transportpce-olm/${project.version}/cfg/config
         </configfile>
     </feature>
 </features>
\ No newline at end of file
index 40f2fa42e39b23eb97cef556889a025b3b8b0b90..1d79b7023cdc37bd1259a0adff2e26cdc1c803c3 100644 (file)
@@ -12,22 +12,41 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
   <parent>
     <groupId>org.opendaylight.odlparent</groupId>
     <artifactId>odlparent-lite</artifactId>
-    <version>9.0.13</version>
+    <version>13.0.11</version>
     <relativePath/>
   </parent>
 
   <groupId>org.opendaylight.transportpce</groupId>
   <artifactId>features-aggregator</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
+  <version>10.0.0-SNAPSHOT</version>
   <name>${project.artifactId}</name>
   <packaging>pom</packaging>
 
   <modules>
+    <module>features-transportpce</module>
     <module>odl-transportpce</module>
     <module>odl-transportpce-tapi</module>
     <module>odl-transportpce-inventory</module>
     <module>odl-transportpce-nbinotifications</module>
     <module>odl-transportpce-dmaap-client</module>
-    <module>odl-transportpce-swagger</module>
   </modules>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-deploy-plugin</artifactId>
+        <configuration>
+          <skip>true</skip>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-install-plugin</artifactId>
+        <configuration>
+          <skip>true</skip>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
 </project>
index 9dc9e8b50838ab3b12a6a76cdc2ecad7c488db55..176dcbed457e7831a18e2f28c5ce02a1fd4f8915 100644 (file)
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>8.0.11</version>
+    <version>13.0.1</version>
     <relativePath/>
   </parent>
 
   <groupId>org.opendaylight.transportpce</groupId>
   <artifactId>transportpce-inventory</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
+  <version>10.0.0-SNAPSHOT</version>
   <packaging>bundle</packaging>
 
+  <properties>
+    <transportpce.models.version>20.0.0-SNAPSHOT</transportpce.models.version>
+  </properties>
+
   <dependencyManagement>
     <dependencies>
+      <dependency>
+        <groupId>org.opendaylight.transportpce.models</groupId>
+        <artifactId>transportpce-models-artifacts</artifactId>
+        <version>${transportpce.models.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
       <dependency>
         <groupId>org.opendaylight.netconf</groupId>
         <artifactId>netconf-artifacts</artifactId>
-        <version>2.0.13</version>
+        <version>7.0.4</version>
         <scope>import</scope>
         <type>pom</type>
       </dependency>
 
   <dependencies>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-common</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-1.2.1</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-device</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-device-1.2.1</artifactId>
     </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
       <groupId>org.opendaylight.mdsal</groupId>
       <artifactId>yang-binding</artifactId>
     </dependency>
+    <dependency>
+      <groupId>com.github.spotbugs</groupId>
+      <artifactId>spotbugs-annotations</artifactId>
+      <optional>true</optional>
+    </dependency>
     <dependency>
       <groupId>org.opendaylight.mdsal</groupId>
       <artifactId>mdsal-binding-api</artifactId>
     </dependency>
     <dependency>
       <groupId>org.opendaylight.netconf</groupId>
-      <artifactId>sal-netconf-connector</artifactId>
+      <artifactId>netconf-topology</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.netconf</groupId>
+      <artifactId>netconf-client-mdsal</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.service.component.annotations</artifactId>
     </dependency>
   </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <artifactId>maven-resources-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy-resources</id>
+            <phase>validate</phase>
+            <goals>
+              <goal>copy-resources</goal>
+            </goals>
+            <configuration>
+              <outputDirectory>${basedir}/target/resources</outputDirectory>
+              <resources>
+                <resource>
+                  <directory>src/main/resources</directory>
+                  <filtering>true</filtering>
+                </resource>
+              </resources>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>attach-db-artifact</id>
+            <goals>
+              <goal>attach-artifact</goal>
+            </goals>
+            <configuration>
+              <artifacts>
+                <artifact>
+                  <file>target/resources/org.ops4j.datasource-transporpce.cfg</file>
+                  <type>cfg</type>
+                  <classifier>datasource</classifier>
+                </artifact>
+                <artifact>
+                  <file>target/resources/org.opendaylight.transportpce.job.cfg</file>
+                  <type>cfg</type>
+                  <classifier>config</classifier>
+                </artifact>
+              </artifacts>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
 </project>
index 2b6a2f9e99fd2c14135000d00023a3d5fb8225b4..dee864b3b96925a025899aff90d4386c78a671c3 100644 (file)
@@ -15,7 +15,6 @@ import java.util.Date;
 import java.util.concurrent.ExecutionException;
 import java.util.regex.Pattern;
 import javax.sql.DataSource;
-import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -30,13 +29,10 @@ public class DeviceInventory {
 
     private final DataSource dataSource;
     private final INode inode;
-    private final DeviceTransactionManager deviceTransactionManager;
 
-    public DeviceInventory(DataSource dataSource, INode inode,
-                           DeviceTransactionManager deviceTransactionManager) {
+    public DeviceInventory(DataSource dataSource, INode inode) {
         this.dataSource = dataSource;
         this.inode = inode;
-        this.deviceTransactionManager = deviceTransactionManager;
     }
 
     public void init() {
index c7299c835b230c05d60ca0d7e821627c3b159407..e1fd3cfe921fa07acc41c53c22084d85c9aa985a 100644 (file)
@@ -8,32 +8,29 @@
 
 package org.opendaylight.transportpce.inventory;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import javax.sql.DataSource;
-import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+@SuppressFBWarnings(
     value = "SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING",
     justification = "TODO review the SQL statement generation process")
 public class INode {
     private static final Logger LOG = LoggerFactory.getLogger(INode.class);
 
     private final DataSource dataSource;
-    private final DeviceTransactionManager deviceTransactionManager;
     //private final INode221 inode221;
     private final INode121 inode121;
 
-    public INode(DataSource dataSource, DeviceTransactionManager deviceTransactionManager,
-        INode121 inode121
+    public INode(DataSource dataSource, INode121 inode121
         //, INode221 inode221
     ) {
         this.dataSource = dataSource;
-        this.deviceTransactionManager = deviceTransactionManager;
         this.inode121 = inode121;
         //this.inode221 = inode221;
     }
index bc185290114126cb3d59ca1fbb0bd32ab4013c84..def34d0e9eb0665543d0c36e200965f957b23da7 100644 (file)
@@ -13,6 +13,7 @@ import static org.opendaylight.transportpce.inventory.utils.StringUtils.getCurre
 import static org.opendaylight.transportpce.inventory.utils.StringUtils.prepareDashString;
 import static org.opendaylight.transportpce.inventory.utils.StringUtils.prepareEmptyString;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -26,6 +27,7 @@ import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.Timeouts;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.inventory.query.Queries;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.CpSlots;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.CpSlotsKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.Ports;
@@ -82,7 +84,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+@SuppressFBWarnings(
     value = "SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING",
     justification = "TODO review the SQL statement generation process")
 public class INode121 {
@@ -99,7 +101,10 @@ public class INode121 {
 
     public boolean addNode(String deviceId) {
 
-        InstanceIdentifier<Info> infoIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Info.class);
+        InstanceIdentifier<Info> infoIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Info.class)
+            .build();
         Optional<Info> infoOpt =
                 deviceTransactionManager.getDataFromDevice(deviceId, LogicalDatastoreType.OPERATIONAL, infoIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -108,7 +113,7 @@ public class INode121 {
             LOG.warn("Could not get device info from DataBroker");
             return false;
         }
-        deviceInfo = infoOpt.get();
+        deviceInfo = infoOpt.orElseThrow();
         boolean sqlResult = false;
         String query = Queries.getQuery().deviceInfoInsert().get();
         LOG.info("Running {} query ", query);
@@ -198,14 +203,16 @@ public class INode121 {
     }
 
     public void getRoadmShelves(String nodeId) throws InterruptedException, ExecutionException {
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject = deviceTransactionManager.getDataFromDevice(nodeId,
                 LogicalDatastoreType.OPERATIONAL, deviceIID, Timeouts.DEVICE_READ_TIMEOUT,
                 Timeouts.DEVICE_READ_TIMEOUT_UNIT);
         if (!deviceObject.isPresent()) {
             return;
         }
-        Map<ShelvesKey, Shelves> shelvesMap = deviceObject.get().nonnullShelves();
+        Map<ShelvesKey, Shelves> shelvesMap = deviceObject.orElseThrow().nonnullShelves();
         LOG.info("Shelves size {}", shelvesMap.size());
         try (Connection connection = requireNonNull(dataSource.getConnection())) {
             for (Map.Entry<ShelvesKey, Shelves> shelveEntry : shelvesMap.entrySet()) {
@@ -227,7 +234,9 @@ public class INode121 {
     }
 
     public void getCircuitPacks(String nodeId) throws InterruptedException, ExecutionException {
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, deviceIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -235,7 +244,7 @@ public class INode121 {
             LOG.warn("Device object {} was not found", nodeId);
             return;
         }
-        Map<CircuitPacksKey, CircuitPacks> circuitPacksMap = deviceObject.get().nonnullCircuitPacks();
+        Map<CircuitPacksKey, CircuitPacks> circuitPacksMap = deviceObject.orElseThrow().nonnullCircuitPacks();
         LOG.info("Circuit pack size {}", circuitPacksMap.size());
 
         try (Connection connection = requireNonNull(dataSource.getConnection())) {
@@ -722,7 +731,7 @@ public class INode121 {
 
         String name = deviceInterface.getName();
         String description = deviceInterface.getDescription();
-        String type = deviceInterface.getType().getTypeName();
+        String type = deviceInterface.getType().toString();
         String administrativeStateEnu = deviceInterface.getAdministrativeState().getName();
         int operationalState = deviceInterface.getOperationalState().getIntValue();
         String circuitId = deviceInterface.getCircuitId();
@@ -751,7 +760,7 @@ public class INode121 {
                     org.opendaylight.yang.gen.v1
                         .http.org.openroadm.optical.channel.interfaces.rev161014.Interface1.class)
                     .getOch());
-                ochRate = ochIfBuilder.getRate().getName();
+                ochRate = ochIfBuilder.getRate().toString();
                 ochWavelengthNumber = ochIfBuilder.getWavelengthNumber().toString();
                 ochModulationFormat = ochIfBuilder.getModulationFormat().getName();
                 ochTransmitPower = ochIfBuilder.getTransmitPower().toString();
@@ -802,7 +811,7 @@ public class INode121 {
                     new OtuBuilder(deviceInterface.augmentation(
                         org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev161014.Interface1.class)
                     .getOtu());
-                otuRate = otuIfBuilder.getRate().getName();
+                otuRate = otuIfBuilder.getRate().toString();
                 otuFecEnu = otuIfBuilder.getFec().getName();
                 otuMaintLoopbackEnabled = otuIfBuilder.getMaintLoopback().getEnabled().toString();
                 otuMaintTypeEnu = otuIfBuilder.getMaintLoopback().getType().getName();
@@ -962,7 +971,7 @@ public class INode121 {
     private static Object[] prepareDevInterfaceOtnOduTxMsiParameters(String nodeId, String interfaceName, TxMsi txMsi) {
 
         String tribSlot = txMsi.getTribSlot().toString();
-        String odtuType = txMsi.getOdtuType().getTypeName();
+        String odtuType = txMsi.getOdtuType().toString();
         String tribPort = txMsi.getTribPort().toString();
         String tribPortPayload = txMsi.getTribPortPayload();
 
@@ -983,7 +992,7 @@ public class INode121 {
     private static Object[] prepareDevInterfaceOtnOduRxMsiParameters(String nodeId, String interfaceName, RxMsi rxMsi) {
 
         String tribSlot = rxMsi.getTribSlot().toString();
-        String odtuType = rxMsi.getOdtuType().getTypeName();
+        String odtuType = rxMsi.getOdtuType().toString();
         String tribPort = rxMsi.getTribPort().toString();
         String tribPortPayload = rxMsi.getTribPortPayload();
 
@@ -1006,7 +1015,7 @@ public class INode121 {
         ExpMsi expMsi) {
 
         String tribSlot = expMsi.getTribSlot().toString();
-        String odtuType = expMsi.getOdtuType().getTypeName();
+        String odtuType = expMsi.getOdtuType().toString();
         String tribPort = expMsi.getTribPort().toString();
         String tribPortPayload = expMsi.getTribPortPayload();
 
@@ -1026,14 +1035,16 @@ public class INode121 {
 
     private void persistDevInterfaces(String nodeId, Connection connection) {
 
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, deviceIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
         if (!deviceObject.isPresent()) {
             return;
         }
-        Map<InterfaceKey, Interface> interfaceMap = deviceObject.get().nonnullInterface();
+        Map<InterfaceKey, Interface> interfaceMap = deviceObject.orElseThrow().nonnullInterface();
         for (Map.Entry<InterfaceKey, Interface> interfaceEntrySet : interfaceMap.entrySet()) {
             Interface deviceInterface = interfaceEntrySet.getValue();
             Object[] parameters = prepareDevInterfaceParameters(nodeId, deviceInterface, connection);
@@ -1054,21 +1065,23 @@ public class INode121 {
 
     private void persistDevProtocols(String nodeId, Connection connection) {
 
-        InstanceIdentifier<Protocols> protocolsIID =
-                InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Protocols.class);
+        InstanceIdentifier<Protocols> protocolsIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Protocols.class)
+            .build();
         Optional<Protocols> protocolObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.CONFIGURATION, protocolsIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-        if (!protocolObject.isPresent() || protocolObject.get().augmentation(Protocols1.class) == null) {
+        if (!protocolObject.isPresent() || protocolObject.orElseThrow().augmentation(Protocols1.class) == null) {
             LOG.error("LLDP subtree is missing");
             return;
         }
-        String adminstatusEnu = protocolObject.get().augmentation(Protocols1.class).getLldp().getGlobalConfig()
+        String adminstatusEnu = protocolObject.orElseThrow().augmentation(Protocols1.class).getLldp().getGlobalConfig()
             .getAdminStatus().getName();
-        String msgTxtInterval = protocolObject.get().augmentation(Protocols1.class).getLldp().getGlobalConfig()
+        String msgTxtInterval = protocolObject.orElseThrow().augmentation(Protocols1.class).getLldp().getGlobalConfig()
             .getMsgTxInterval().toString();
-        String mxgTxHoldMultiplier = protocolObject.get().augmentation(Protocols1.class).getLldp().getGlobalConfig()
-            .getMsgTxHoldMultiplier().toString();
+        String mxgTxHoldMultiplier = protocolObject.orElseThrow().augmentation(Protocols1.class).getLldp()
+            .getGlobalConfig().getMsgTxHoldMultiplier().toString();
         String startTimestamp = getCurrentTimestamp();
         persistDevProtocolLldpPortConfig(nodeId, connection);
         persistDevProtocolLldpNbrList(nodeId, connection);
@@ -1097,18 +1110,20 @@ public class INode121 {
 
     private void persistDevProtocolLldpPortConfig(String nodeId, Connection connection) {
 
-        InstanceIdentifier<Protocols> protocolsIID =
-                InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Protocols.class);
+        InstanceIdentifier<Protocols> protocolsIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Protocols.class)
+            .build();
         Optional<Protocols> protocolObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.CONFIGURATION, protocolsIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-        if (!protocolObject.isPresent() || protocolObject.get().augmentation(Protocols1.class) == null) {
+        if (!protocolObject.isPresent() || protocolObject.orElseThrow().augmentation(Protocols1.class) == null) {
             LOG.error("LLDP subtree is missing");
             return;
         }
         String startTimestamp = getCurrentTimestamp();
         @NonNull
-        Map<PortConfigKey, PortConfig> portConfigMap = protocolObject.get()
+        Map<PortConfigKey, PortConfig> portConfigMap = protocolObject.orElseThrow()
             .augmentation(Protocols1.class).getLldp().nonnullPortConfig();
         for (Map.Entry<PortConfigKey, PortConfig> entry : portConfigMap.entrySet()) {
             PortConfig portConfig = entry.getValue();
@@ -1140,8 +1155,10 @@ public class INode121 {
 
     private void persistDevProtocolLldpNbrList(String nodeId, Connection connection) {
 
-        InstanceIdentifier<Protocols> protocolsIID =
-                InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Protocols.class);
+        InstanceIdentifier<Protocols> protocolsIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Protocols.class)
+            .build();
         Optional<Protocols> protocolObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.CONFIGURATION, protocolsIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -1149,18 +1166,18 @@ public class INode121 {
             LOG.error("Protocols is missing");
             return;
         }
-        if (protocolObject.get().augmentation(Protocols1.class).getLldp().getNbrList() == null) {
+        if (protocolObject.orElseThrow().augmentation(Protocols1.class).getLldp().getNbrList() == null) {
             protocolObject =
                     deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, protocolsIID,
                             Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-            if (protocolObject.get().augmentation(Protocols1.class).getLldp().getNbrList() == null) {
+            if (protocolObject.orElseThrow().augmentation(Protocols1.class).getLldp().getNbrList() == null) {
                 LOG.error("LLDP nbrlist subtree is missing for {}", nodeId);
                 return;
             }
         }
         String startTimestamp = getCurrentTimestamp();
         Map<IfNameKey, IfName> ifNameMap =
-                protocolObject.get().augmentation(Protocols1.class).getLldp().getNbrList().nonnullIfName();
+                protocolObject.orElseThrow().augmentation(Protocols1.class).getLldp().getNbrList().nonnullIfName();
         for (Map.Entry<IfNameKey, IfName> ifNameEntry : ifNameMap.entrySet()) {
 
             IfName ifNameObj = ifNameEntry.getValue();
@@ -1203,23 +1220,25 @@ public class INode121 {
 
     private void persistDevInternalLinks(String nodeId, Connection connection) {
 
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, deviceIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
         if (!deviceObject.isPresent()) {
             return;
         }
-        if (deviceObject.get().getInternalLink() == null) {
+        if (deviceObject.orElseThrow().getInternalLink() == null) {
             deviceObject = deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.CONFIGURATION,
                     deviceIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-            if (deviceObject.get().getInternalLink() == null) {
+            if (deviceObject.orElseThrow().getInternalLink() == null) {
                 LOG.info("External links not found for {}", nodeId);
                 return;
             }
         }
         @NonNull
-        Map<InternalLinkKey, InternalLink> internalLinkMap = deviceObject.get().nonnullInternalLink();
+        Map<InternalLinkKey, InternalLink> internalLinkMap = deviceObject.orElseThrow().nonnullInternalLink();
         String startTimestamp = getCurrentTimestamp();
         for (Map.Entry<InternalLinkKey, InternalLink> internalLinkEntry: internalLinkMap.entrySet()) {
             InternalLink internalLink = internalLinkEntry.getValue();
@@ -1248,24 +1267,26 @@ public class INode121 {
 
     private void persistDevExternalLinks(String nodeId, Connection connection) {
 
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, deviceIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
         if (!deviceObject.isPresent()) {
             return;
         }
-        if (deviceObject.get().getExternalLink() == null) {
+        if (deviceObject.orElseThrow().getExternalLink() == null) {
             deviceObject = deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.CONFIGURATION,
                     deviceIID, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-            if (deviceObject.get().getExternalLink() == null) {
+            if (deviceObject.orElseThrow().getExternalLink() == null) {
                 LOG.info("External links not found for {}", nodeId);
                 return;
             }
         }
         String startTimestamp = getCurrentTimestamp();
         @NonNull
-        Map<ExternalLinkKey, ExternalLink> externalLinkMap = deviceObject.get().nonnullExternalLink();
+        Map<ExternalLinkKey, ExternalLink> externalLinkMap = deviceObject.orElseThrow().nonnullExternalLink();
         for (Map.Entry<ExternalLinkKey, ExternalLink> externalLinkEntry: externalLinkMap.entrySet()) {
             ExternalLink externalLink = externalLinkEntry.getValue();
             String externalLinkName = externalLink.getExternalLinkName();
@@ -1296,7 +1317,9 @@ public class INode121 {
 
     private void persistDevPhysicalLinks(String nodeId, Connection connection) {
 
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, deviceIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -1304,7 +1327,7 @@ public class INode121 {
             LOG.error("No device with node Id {}", nodeId);
             return;
         }
-        if (deviceObject.get().getPhysicalLink() == null) {
+        if (deviceObject.orElseThrow().getPhysicalLink() == null) {
             deviceObject =
                     deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.CONFIGURATION, deviceIID,
                             Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -1312,7 +1335,7 @@ public class INode121 {
                 LOG.error("No device with node Id {}", nodeId);
                 return;
             }
-            if (deviceObject.get().getPhysicalLink() == null) {
+            if (deviceObject.orElseThrow().getPhysicalLink() == null) {
                 LOG.info("Physical links not found for {}", nodeId);
                 return;
             }
@@ -1320,7 +1343,7 @@ public class INode121 {
 
         String startTimestamp = getCurrentTimestamp();
         @NonNull
-        Map<PhysicalLinkKey, PhysicalLink> physicalLinkMap = deviceObject.get().nonnullPhysicalLink();
+        Map<PhysicalLinkKey, PhysicalLink> physicalLinkMap = deviceObject.orElseThrow().nonnullPhysicalLink();
         for (Map.Entry<PhysicalLinkKey, PhysicalLink> physicalLinkEntry : physicalLinkMap.entrySet()) {
             PhysicalLink physicalLink = physicalLinkEntry.getValue();
             String physicalLinkName = physicalLink.getPhysicalLinkName();
@@ -1356,7 +1379,9 @@ public class INode121 {
 
     private void persistDevDegree(String nodeId, Connection connection) {
 
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, deviceIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -1373,7 +1398,7 @@ public class INode121 {
         }
         String startTimestamp = getCurrentTimestamp();
         @NonNull
-        Map<DegreeKey, Degree> degreeMap = deviceObject.get().nonnullDegree();
+        Map<DegreeKey, Degree> degreeMap = deviceObject.orElseThrow().nonnullDegree();
         for (Map.Entry<DegreeKey, Degree> degreeEntry : degreeMap.entrySet()) {
             Degree degree = degreeEntry.getValue();
             String degreeNumber = degree.getDegreeNumber().toString();
@@ -1487,7 +1512,9 @@ public class INode121 {
 
     private void persistDevSrg(String nodeId, Connection connection) {
 
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, deviceIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -1496,7 +1523,7 @@ public class INode121 {
             return;
         }
 
-        if (deviceObject.get().getSharedRiskGroup() == null) {
+        if (deviceObject.orElseThrow().getSharedRiskGroup() == null) {
             deviceObject =
                     deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.CONFIGURATION, deviceIID,
                             Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -1507,7 +1534,8 @@ public class INode121 {
         }
 
         @NonNull
-        Map<SharedRiskGroupKey, SharedRiskGroup> sharedRiskGroupMap = deviceObject.get().nonnullSharedRiskGroup();
+        Map<SharedRiskGroupKey, SharedRiskGroup> sharedRiskGroupMap = deviceObject.orElseThrow()
+            .nonnullSharedRiskGroup();
         if (sharedRiskGroupMap.isEmpty()) {
             LOG.info("no srg found for node {} ", nodeId);
             return;
@@ -1598,7 +1626,9 @@ public class INode121 {
 
         //int opticalcontrolmodeEnu=-1;
 
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, deviceIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -1606,7 +1636,7 @@ public class INode121 {
             LOG.error("No device found in operational datastore for node {}", nodeId);
             return;
         }
-        if (deviceObject.get().getRoadmConnections() == null) {
+        if (deviceObject.orElseThrow().getRoadmConnections() == null) {
             deviceObject =
                     deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.CONFIGURATION, deviceIID,
                             Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -1617,7 +1647,8 @@ public class INode121 {
         }
 
         @NonNull
-        Map<RoadmConnectionsKey, RoadmConnections> connectionsMap = deviceObject.get().nonnullRoadmConnections();
+        Map<RoadmConnectionsKey, RoadmConnections> connectionsMap = deviceObject.orElseThrow()
+            .nonnullRoadmConnections();
         if (connectionsMap.isEmpty()) {
             LOG.info("ROADM Dev Connections not found!! for {}", nodeId);
             return;
@@ -1663,7 +1694,9 @@ public class INode121 {
 
     private void persistDevConnectionMap(String nodeId, Connection connection) {
 
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, deviceIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -1673,7 +1706,7 @@ public class INode121 {
         }
         String startTimestamp = getCurrentTimestamp();
         @NonNull
-        Map<ConnectionMapKey, ConnectionMap> connectionsMap = deviceObject.get().nonnullConnectionMap();
+        Map<ConnectionMapKey, ConnectionMap> connectionsMap = deviceObject.orElseThrow().nonnullConnectionMap();
         for (Map.Entry<ConnectionMapKey, ConnectionMap> entry : connectionsMap.entrySet()) {
             ConnectionMap connectionMap = entry.getValue();
             String connectionMapNumber = connectionMap.getConnectionMapNumber().toString();
@@ -1706,7 +1739,9 @@ public class INode121 {
 
     private void persistDevWavelengthMap(String nodeId, Connection connection) {
 
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, deviceIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -1717,7 +1752,8 @@ public class INode121 {
 
         String startTimestamp = getCurrentTimestamp();
         @NonNull
-        Map<WavelengthsKey, Wavelengths> wavelengthsMap = deviceObject.get().getWavelengthMap().nonnullWavelengths();
+        Map<WavelengthsKey, Wavelengths> wavelengthsMap = deviceObject.orElseThrow().getWavelengthMap()
+            .nonnullWavelengths();
         for (Map.Entry<WavelengthsKey, Wavelengths> entry : wavelengthsMap.entrySet()) {
             Wavelengths wavelengths = entry.getValue();
             String wavelengthNumber = wavelengths.getWavelengthNumber().toString();
index 852a7a849c6dc78c106ac6f765363ec915bb2931..f42261759dfbf70be54cd5e664cc074c17eb9c5b 100644 (file)
@@ -12,6 +12,7 @@ import static org.opendaylight.transportpce.inventory.utils.StringUtils.getCurre
 import static org.opendaylight.transportpce.inventory.utils.StringUtils.prepareDashString;
 import static org.opendaylight.transportpce.inventory.utils.StringUtils.prepareEmptyString;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
@@ -26,6 +27,7 @@ import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.Timeouts;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.inventory.query.Queries;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.CpSlots;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.CpSlotsKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.packs.CircuitPacks;
@@ -78,7 +80,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+@SuppressFBWarnings(
     value = "SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING",
     justification = "TODO review the SQL statement generation process")
 public class INode221 {
@@ -94,13 +96,16 @@ public class INode221 {
 
     public boolean addNode(String deviceId) {
 
-        InstanceIdentifier<Info> infoIID = InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Info.class);
+        InstanceIdentifier<Info> infoIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Info.class)
+            .build();
         Optional<Info> infoOpt =
                 deviceTransactionManager.getDataFromDevice(deviceId, LogicalDatastoreType.OPERATIONAL, infoIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
         Info deviceInfo;
         if (infoOpt.isPresent()) {
-            deviceInfo = infoOpt.get();
+            deviceInfo = infoOpt.orElseThrow();
         } else {
             LOG.warn("Could not get device info from DataBroker");
             return false;
@@ -196,7 +201,9 @@ public class INode221 {
     }
 
     public void getRoadmShelves(String nodeId) throws InterruptedException, ExecutionException {
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject = deviceTransactionManager.getDataFromDevice(nodeId,
                 LogicalDatastoreType.OPERATIONAL, deviceIID, Timeouts.DEVICE_READ_TIMEOUT,
                 Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -205,7 +212,7 @@ public class INode221 {
             return;
         }
         @NonNull
-        Map<ShelvesKey, Shelves> shelvesMap = deviceObject.get().nonnullShelves();
+        Map<ShelvesKey, Shelves> shelvesMap = deviceObject.orElseThrow().nonnullShelves();
         LOG.info("Shelves size {}", shelvesMap.size());
         try (Connection connection = requireNonNull(dataSource.getConnection())) {
             for (Map.Entry<ShelvesKey, Shelves> entry : shelvesMap.entrySet()) {
@@ -229,7 +236,9 @@ public class INode221 {
     }
 
     public void getCircuitPacks(String nodeId) throws InterruptedException, ExecutionException {
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, deviceIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -238,7 +247,7 @@ public class INode221 {
             return;
         }
         @NonNull
-        Map<CircuitPacksKey, CircuitPacks> circuitPacksMap = deviceObject.get().nonnullCircuitPacks();
+        Map<CircuitPacksKey, CircuitPacks> circuitPacksMap = deviceObject.orElseThrow().nonnullCircuitPacks();
         LOG.info("Circuit pack size {}", circuitPacksMap.size());
 
         try (Connection connection = requireNonNull(dataSource.getConnection())) {
@@ -534,7 +543,7 @@ public class INode221 {
         //int otsFiberTypeEnu = -1;
         String name = deviceInterface.getName();
         String description = deviceInterface.getDescription();
-        String type = deviceInterface.getType().getTypeName();
+        String type = deviceInterface.getType().toString();
         String circuitId = deviceInterface.getCircuitId();
         String supportingInterface = deviceInterface.getSupportingInterface();
         String supportingCircuitPackName = deviceInterface.getSupportingCircuitPackName();
@@ -627,7 +636,7 @@ public class INode221 {
                     org.opendaylight.yang.gen.v1
                         .http.org.openroadm.optical.channel.interfaces.rev161014.Interface1.class)
                     .getOch());
-                ochRate = ochIfBuilder.getRate().getName();
+                ochRate = ochIfBuilder.getRate().toString();
                 //ochWavelengthNumber = ochIfBuilder.getWavelengthNumber().toString();
                 ochModulationFormat = ochIfBuilder.getModulationFormat().getName();
                 ochTransmitPower = ochIfBuilder.getTransmitPower().toString();
@@ -676,7 +685,7 @@ public class INode221 {
                 OtuBuilder otuIfBuilder = new OtuBuilder(deviceInterface.augmentation(
                     org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev161014.Interface1.class)
                     .getOtu());
-                otuRate = otuIfBuilder.getRate().getName();
+                otuRate = otuIfBuilder.getRate().toString();
                 otuFecEnu = otuIfBuilder.getFec().getIntValue();
                 otuMaintLoopbackEnabled = otuIfBuilder.getMaintLoopback().getEnabled().toString();
                 otuMaintTypeEnu = otuIfBuilder.getMaintLoopback().getType().getIntValue();
@@ -841,7 +850,7 @@ public class INode221 {
     private static Object[] prepareDevInterfaceOtnOduTxMsiParameters(String nodeId, String interfaceName, TxMsi txMsi) {
 
         String tribSlot = txMsi.getTribSlot().toString();
-        String odtuType = txMsi.getOdtuType().getTypeName();
+        String odtuType = txMsi.getOdtuType().toString();
         String tribPort = txMsi.getTribPort().toString();
         String tribPortPayload = txMsi.getTribPortPayload();
 
@@ -862,7 +871,7 @@ public class INode221 {
     private static Object[] prepareDevInterfaceOtnOduRxMsiParameters(String nodeId, String interfaceName, RxMsi rxMsi) {
 
         String tribSlot = rxMsi.getTribSlot().toString();
-        String odtuType = rxMsi.getOdtuType().getTypeName();
+        String odtuType = rxMsi.getOdtuType().toString();
         String tribPort = rxMsi.getTribPort().toString();
         String tribPortPayload = rxMsi.getTribPortPayload();
 
@@ -885,7 +894,7 @@ public class INode221 {
         ExpMsi expMsi) {
 
         String tribSlot = expMsi.getTribSlot().toString();
-        String odtuType = expMsi.getOdtuType().getTypeName();
+        String odtuType = expMsi.getOdtuType().toString();
         String tribPort = expMsi.getTribPort().toString();
         String tribPortPayload = expMsi.getTribPortPayload();
 
@@ -905,7 +914,9 @@ public class INode221 {
 
     private void persistDevInterfaces(String nodeId, Connection connection) {
 
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, deviceIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -917,7 +928,7 @@ public class INode221 {
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT); */
 
         @NonNull
-        Map<InterfaceKey, Interface> interfaceMap = deviceObject.get().nonnullInterface();
+        Map<InterfaceKey, Interface> interfaceMap = deviceObject.orElseThrow().nonnullInterface();
         for (Map.Entry<InterfaceKey, Interface> entry : interfaceMap.entrySet()) {
             Interface deviceInterface;
 
@@ -946,24 +957,26 @@ public class INode221 {
 
     private void persistDevProtocols(String nodeId, Connection connection) {
 
-        InstanceIdentifier<Protocols> protocolsIID =
-                InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Protocols.class);
+        InstanceIdentifier<Protocols> protocolsIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Protocols.class)
+            .build();
         Optional<Protocols> protocolObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.CONFIGURATION, protocolsIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-        if (!protocolObject.isPresent() || protocolObject.get().augmentation(Protocols1.class) == null) {
+        if (!protocolObject.isPresent() || protocolObject.orElseThrow().augmentation(Protocols1.class) == null) {
             LOG.error("LLDP subtree is missing");
             return;
         }
         int adminstatusEnu =
-            protocolObject.get().augmentation(Protocols1.class).getLldp().getGlobalConfig().getAdminStatus()
-            .getIntValue();
+            protocolObject.orElseThrow().augmentation(Protocols1.class).getLldp().getGlobalConfig().getAdminStatus()
+                .getIntValue();
         String msgTxtInterval =
-            protocolObject.get().augmentation(Protocols1.class).getLldp().getGlobalConfig().getMsgTxInterval()
-            .toString();
+            protocolObject.orElseThrow().augmentation(Protocols1.class).getLldp().getGlobalConfig().getMsgTxInterval()
+                .toString();
         String mxgTxHoldMultiplier =
-            protocolObject.get().augmentation(Protocols1.class).getLldp().getGlobalConfig().getMsgTxHoldMultiplier()
-            .toString();
+            protocolObject.orElseThrow().augmentation(Protocols1.class).getLldp().getGlobalConfig()
+                .getMsgTxHoldMultiplier().toString();
         String startTimestamp = getCurrentTimestamp();
         persistDevProtocolLldpPortConfig(nodeId, connection);
         persistDevProtocolLldpNbrList(nodeId, connection);
@@ -993,18 +1006,20 @@ public class INode221 {
 
     private void persistDevProtocolLldpPortConfig(String nodeId, Connection connection) {
 
-        InstanceIdentifier<Protocols> protocolsIID =
-                InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Protocols.class);
+        InstanceIdentifier<Protocols> protocolsIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Protocols.class)
+            .build();
         Optional<Protocols> protocolObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.CONFIGURATION, protocolsIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-        if (!protocolObject.isPresent() || protocolObject.get().augmentation(Protocols1.class) == null) {
+        if (!protocolObject.isPresent() || protocolObject.orElseThrow().augmentation(Protocols1.class) == null) {
             LOG.error("LLDP subtree is missing");
             return;
         }
         String startTimestamp = getCurrentTimestamp();
         @NonNull
-        Map<PortConfigKey, PortConfig> portConfigMap = protocolObject.get()
+        Map<PortConfigKey, PortConfig> portConfigMap = protocolObject.orElseThrow()
             .augmentation(Protocols1.class).getLldp().nonnullPortConfig();
         for (Map.Entry<PortConfigKey, PortConfig> entry : portConfigMap.entrySet()) {
 
@@ -1037,18 +1052,20 @@ public class INode221 {
 
     private void persistDevProtocolLldpNbrList(String nodeId, Connection connection) {
 
-        InstanceIdentifier<Protocols> protocolsIID =
-                InstanceIdentifier.create(OrgOpenroadmDevice.class).child(Protocols.class);
+        InstanceIdentifier<Protocols> protocolsIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Protocols.class)
+            .build();
         Optional<Protocols> protocolObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.CONFIGURATION, protocolsIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-        if (!protocolObject.isPresent() || protocolObject.get().augmentation(Protocols1.class) == null) {
+        if (!protocolObject.isPresent() || protocolObject.orElseThrow().augmentation(Protocols1.class) == null) {
             LOG.error("LLDP subtree is missing");
             return;
         }
         String startTimestamp = getCurrentTimestamp();
         @NonNull
-        Map<IfNameKey, IfName> ifNameMap = protocolObject.get()
+        Map<IfNameKey, IfName> ifNameMap = protocolObject.orElseThrow()
             .augmentation(Protocols1.class).getLldp().getNbrList().nonnullIfName();
         for (Map.Entry<IfNameKey, IfName> entry : ifNameMap.entrySet()) {
 
@@ -1092,7 +1109,9 @@ public class INode221 {
 
     private void persistDevInternalLinks(String nodeId, Connection connection) {
 
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, deviceIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -1102,7 +1121,7 @@ public class INode221 {
         }
         String startTimestamp = getCurrentTimestamp();
         @NonNull
-        Map<InternalLinkKey, InternalLink> internalLinkMap = deviceObject.get().nonnullInternalLink();
+        Map<InternalLinkKey, InternalLink> internalLinkMap = deviceObject.orElseThrow().nonnullInternalLink();
         for (Map.Entry<InternalLinkKey, InternalLink> entry : internalLinkMap.entrySet()) {
             InternalLink internalLink = entry.getValue();
             String internalLinkName = internalLink.getInternalLinkName();
@@ -1139,7 +1158,9 @@ public class INode221 {
 
     private void persistDevExternalLinks(String nodeId, Connection connection) {
 
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, deviceIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -1149,7 +1170,7 @@ public class INode221 {
         }
         String startTimestamp = getCurrentTimestamp();
         @NonNull
-        Map<ExternalLinkKey, ExternalLink> externalLinkMap = deviceObject.get().nonnullExternalLink();
+        Map<ExternalLinkKey, ExternalLink> externalLinkMap = deviceObject.orElseThrow().nonnullExternalLink();
         for (Map.Entry<ExternalLinkKey, ExternalLink> entry : externalLinkMap.entrySet()) {
             ExternalLink externalLink = entry.getValue();
             String externalLinkName = externalLink.getExternalLinkName();
@@ -1189,7 +1210,9 @@ public class INode221 {
 
     private void persistDevPhysicalLinks(String nodeId, Connection connection) {
 
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, deviceIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -1200,7 +1223,7 @@ public class INode221 {
         }
         String startTimestamp = getCurrentTimestamp();
         @NonNull
-        Map<PhysicalLinkKey, PhysicalLink> physicalLinkMap = deviceObject.get().nonnullPhysicalLink();
+        Map<PhysicalLinkKey, PhysicalLink> physicalLinkMap = deviceObject.orElseThrow().nonnullPhysicalLink();
         for (Map.Entry<PhysicalLinkKey, PhysicalLink> entry : physicalLinkMap.entrySet()) {
             PhysicalLink physicalLink = entry.getValue();
             String physicalLinkName = physicalLink.getPhysicalLinkName();
@@ -1236,7 +1259,9 @@ public class INode221 {
 
     private void persistDevDegree(String nodeId, Connection connection) {
 
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, deviceIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -1246,7 +1271,7 @@ public class INode221 {
         }
         String startTimestamp = getCurrentTimestamp();
         @NonNull
-        Map<DegreeKey, Degree> degreeMap = deviceObject.get().nonnullDegree();
+        Map<DegreeKey, Degree> degreeMap = deviceObject.orElseThrow().nonnullDegree();
         for (Map.Entry<DegreeKey, Degree> entry : degreeMap.entrySet()) {
             Degree degree = entry.getValue();
             String degreeNumber = degree.getDegreeNumber().toString();
@@ -1368,7 +1393,9 @@ public class INode221 {
 
     private void persistDevSrg(String nodeId, Connection connection) {
 
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, deviceIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -1379,7 +1406,8 @@ public class INode221 {
         }
         String startTimestamp = getCurrentTimestamp();
         @NonNull
-        Map<SharedRiskGroupKey, SharedRiskGroup> sharedRiskGroupMap = deviceObject.get().nonnullSharedRiskGroup();
+        Map<SharedRiskGroupKey, SharedRiskGroup> sharedRiskGroupMap = deviceObject.orElseThrow()
+            .nonnullSharedRiskGroup();
         for (Map.Entry<SharedRiskGroupKey, SharedRiskGroup> entry : sharedRiskGroupMap.entrySet()) {
             SharedRiskGroup sharedRiskGroup = entry.getValue();
             String maxAddDropPorts = sharedRiskGroup.getMaxAddDropPorts().toString();
@@ -1463,7 +1491,9 @@ public class INode221 {
 
     private void persistDevRoadmConnections(String nodeId, Connection connection) {
 
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, deviceIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -1473,7 +1503,8 @@ public class INode221 {
         }
         String startTimestamp = getCurrentTimestamp();
         @NonNull
-        Map<RoadmConnectionsKey, RoadmConnections> roadmConnectionsMap = deviceObject.get().nonnullRoadmConnections();
+        Map<RoadmConnectionsKey, RoadmConnections> roadmConnectionsMap = deviceObject.orElseThrow()
+            .nonnullRoadmConnections();
         for (Map.Entry<RoadmConnectionsKey, RoadmConnections> entry : roadmConnectionsMap.entrySet()) {
             RoadmConnections roadmConnections = entry.getValue();
             int opticalcontrolmodeEnu = roadmConnections.getOpticalControlMode().getIntValue();
@@ -1516,7 +1547,9 @@ public class INode221 {
 
     private void persistDevConnectionMap(String nodeId, Connection connection) {
 
-        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier.create(OrgOpenroadmDevice.class);
+        InstanceIdentifier<OrgOpenroadmDevice> deviceIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .build();
         Optional<OrgOpenroadmDevice> deviceObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, deviceIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
@@ -1526,7 +1559,7 @@ public class INode221 {
         }
         String startTimestamp = getCurrentTimestamp();
         @NonNull
-        Map<ConnectionMapKey, ConnectionMap> connectionMapMap = deviceObject.get().nonnullConnectionMap();
+        Map<ConnectionMapKey, ConnectionMap> connectionMapMap = deviceObject.orElseThrow().nonnullConnectionMap();
         for (Map.Entry<ConnectionMapKey, ConnectionMap> entry : connectionMapMap.entrySet()) {
             ConnectionMap connectionMap = entry.getValue();
             String connectionMapNumber = connectionMap.getConnectionMapNumber().toString();
index 0e1227d29ab0b10798100c3b2db3c97811272aad..651621aa59151146af8493cfa9cf08a60bb64c40 100644 (file)
@@ -7,81 +7,84 @@
  */
 package org.opendaylight.transportpce.inventory;
 
+import java.util.ArrayList;
+import java.util.List;
+import javax.sql.DataSource;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.InstanceIdentifiers;
+import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.inventory.listener.ClliNetworkChangeListener;
 import org.opendaylight.transportpce.inventory.listener.DeviceConfigListener;
 import org.opendaylight.transportpce.inventory.listener.DeviceListener;
 import org.opendaylight.transportpce.inventory.listener.OverlayNetworkChangeListener;
 import org.opendaylight.transportpce.inventory.listener.UnderlayNetworkChangeListener;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
+import org.opendaylight.yangtools.concepts.Registration;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * {@link ListenerProvider} registers {@link DataTreeChangeListener} for each network layer.
  */
+@Component
 public class ListenerProvider {
 
     private static final Logger LOG = LoggerFactory.getLogger(ListenerProvider.class);
-
-    private final DataBroker dataBroker;
-    private final OverlayNetworkChangeListener overlayNetworkListener;
-    private final UnderlayNetworkChangeListener underlayNetworkListener;
-    private final ClliNetworkChangeListener clliNetworkChangeListener;
-    private final DeviceListener deviceListener;
-    private final DeviceConfigListener deviceConfigListener;
+    private List<Registration> listeners = new ArrayList<>();
 
     /**
      * Constructor invoked by blueprint injects all dependencies.
      *
      * @param dataBroker dataBroker
-     * @param overlayNetworkListener  overlay-network Listener
-     * @param underlayNetworkListener underlay-network Listener
-     * @param clliNetworkChangeListener clli Network change Listener
-     * @param deviceListener device listener
-     * @param deviceConfigListener device config listener
+     * @param dataSource dataSource
+     * @param deviceTransactionManager deviceTransactionManager
      */
-    public ListenerProvider(DataBroker dataBroker, OverlayNetworkChangeListener overlayNetworkListener,
-        UnderlayNetworkChangeListener underlayNetworkListener, ClliNetworkChangeListener clliNetworkChangeListener,
-        DeviceListener deviceListener, DeviceConfigListener deviceConfigListener) {
-
-        this.dataBroker = dataBroker;
-        this.overlayNetworkListener = overlayNetworkListener;
-        this.underlayNetworkListener = underlayNetworkListener;
-        this.clliNetworkChangeListener = clliNetworkChangeListener;
-        this.deviceListener = deviceListener;
-        this.deviceConfigListener = deviceConfigListener;
-    }
+    @Activate
+    public ListenerProvider(@Reference DataBroker dataBroker,
+            @Reference DataSource dataSource,
+            @Reference DeviceTransactionManager deviceTransactionManager) {
 
-    /**
-     * Invoked by blueprint, registers the listeners.
-     */
-    public void initialize() {
         LOG.debug("Registering listeners...");
-        dataBroker.registerDataTreeChangeListener(
+        OverlayNetworkChangeListener overlayNetworkListener = new OverlayNetworkChangeListener();
+        listeners.add(dataBroker.registerDataTreeChangeListener(
                 DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, InstanceIdentifiers.OVERLAY_NETWORK_II),
-                overlayNetworkListener);
+                overlayNetworkListener));
         LOG.info("Overlay network change listener was successfully registered");
-        dataBroker.registerDataTreeChangeListener(
+        UnderlayNetworkChangeListener underlayNetworkListener = new UnderlayNetworkChangeListener();
+        listeners.add(dataBroker.registerDataTreeChangeListener(
                 DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, InstanceIdentifiers.UNDERLAY_NETWORK_II),
-                underlayNetworkListener);
+                underlayNetworkListener));
         LOG.info("Underlay network change listener was successfully registered");
-        dataBroker.registerDataTreeChangeListener(
+        ClliNetworkChangeListener clliNetworkChangeListener = new ClliNetworkChangeListener();
+        listeners.add(dataBroker.registerDataTreeChangeListener(
                 DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, InstanceIdentifiers.CLLI_NETWORK_II),
-                clliNetworkChangeListener);
+                clliNetworkChangeListener));
         LOG.info("CLLI network change listener was successfully registered");
-        dataBroker.registerDataTreeChangeListener(
+        INode121 inode121 = new INode121(dataSource, deviceTransactionManager);
+        INode inode = new INode(dataSource, inode121);
+        DeviceInventory deviceInventory = new DeviceInventory(dataSource, inode);
+        DeviceListener deviceListener = new DeviceListener(deviceInventory);
+        listeners.add(dataBroker.registerDataTreeChangeListener(
                 DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL,
-                InstanceIdentifiers.NETCONF_TOPOLOGY_II.child(Node.class)), deviceListener);
+                InstanceIdentifiers.NETCONF_TOPOLOGY_II.child(Node.class)), deviceListener));
         LOG.info("Device change listener was successfully registered");
-        dataBroker.registerDataTreeChangeListener(
+        DeviceConfigListener deviceConfigListener = new DeviceConfigListener(deviceInventory);
+        listeners.add(dataBroker.registerDataTreeChangeListener(
                 DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
-                InstanceIdentifiers.NETCONF_TOPOLOGY_II.child(Node.class)), deviceConfigListener);
+                InstanceIdentifiers.NETCONF_TOPOLOGY_II.child(Node.class)), deviceConfigListener));
         LOG.info("Device config change listener was successfully registered");
     }
 
+    @Deactivate
+    public void close() {
+        listeners.forEach(lis -> lis.close());
+        listeners.clear();
+    }
 }
index 4cf13e80f3863c4a967d604e315d4b0046b78800..490952c962cd5387081f5877a8433634933c0eaa 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.transportpce.inventory.listener;
 
-import java.util.Collection;
+import java.util.List;
 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
@@ -19,7 +19,7 @@ public class ClliNetworkChangeListener implements DataTreeChangeListener<Network
     private static final Logger LOG = LoggerFactory.getLogger(ClliNetworkChangeListener.class);
 
     @Override
-    public void onDataTreeChanged(Collection<DataTreeModification<Network>> changes) {
+    public void onDataTreeChanged(List<DataTreeModification<Network>> changes) {
         LOG.info("Clli network changed {}", changes);
     }
 
index ae2bd2447300afe51024c5204476cdae5f68fcae..837f225dd31414509100fff6bf926f953d98c32f 100644 (file)
@@ -5,7 +5,6 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-
 package org.opendaylight.transportpce.inventory.listener;
 
 import java.util.Collection;
@@ -18,9 +17,8 @@ import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.transportpce.inventory.DeviceInventory;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus.ConnectionStatus;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.ConnectionOper.ConnectionStatus;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev231121.NetconfNode;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -44,24 +42,24 @@ public class DeviceConfigListener implements DataTreeChangeListener<Node> {
     }
 
     @Override
-    public void onDataTreeChanged(Collection<DataTreeModification<Node>> changes) {
+    public void onDataTreeChanged(List<DataTreeModification<Node>> changes) {
 
         //LOG.debug("testing np1: {}", changes.toString());
         String openROADMversion = "";
         List<DataTreeModification<Node>> changesWithoutDefaultNetconfNode = getRealDevicesOnly(changes);
         for (DataTreeModification<Node> device : changesWithoutDefaultNetconfNode) {
             DataObjectModification<Node> rootNode = device.getRootNode();
-            String nodeId = rootNode.getDataAfter().key().getNodeId().getValue();
+            String nodeId = rootNode.dataAfter().key().getNodeId().getValue();
 
             LOG.debug("nodeId {}", nodeId);
 
-            NetconfNode netconfNode = rootNode.getDataAfter().augmentation(NetconfNode.class);
-            NetconfNodeConnectionStatus.ConnectionStatus connectionStatus =
+            NetconfNode netconfNode = rootNode.dataAfter().augmentation(NetconfNode.class);
+            ConnectionStatus connectionStatus =
                     netconfNode.getConnectionStatus();
             long count = netconfNode.getAvailableCapabilities().getAvailableCapability().stream()
                     .filter(cp -> cp.getCapability().contains(StringConstants.OPENROADM_DEVICE_MODEL_NAME))
                     .count();
-            LOG.debug("DCL Modification Type {}", device.getRootNode().getModificationType().toString());
+            LOG.debug("DCL Modification Type {}", device.getRootNode().modificationType());
             LOG.debug("DCL Capability Count {}", count);
             LOG.debug("DCL Connection Status {}", connectionStatus);
             if (isCreate(device) || isUpdate(device)) {
@@ -89,7 +87,7 @@ public class DeviceConfigListener implements DataTreeChangeListener<Node> {
      */
     private void processModifiedSubtree(String nodeId, NetconfNode netconfNode, String openROADMversion)
             throws InterruptedException, ExecutionException {
-        NetconfNodeConnectionStatus.ConnectionStatus connectionStatus = netconfNode.getConnectionStatus();
+        ConnectionStatus connectionStatus = netconfNode.getConnectionStatus();
         /*long count = netconfNode.getAvailableCapabilities().getAvailableCapability().stream()
                 .filter(cp -> cp.getCapability().contains(StringConstants.OPENROADM_DEVICE_MODEL_NAME)).count();
         if (count < 1) {
@@ -113,16 +111,16 @@ public class DeviceConfigListener implements DataTreeChangeListener<Node> {
      */
     private static List<DataTreeModification<Node>> getRealDevicesOnly(Collection<DataTreeModification<Node>> changes) {
         return changes.stream()
-                .filter(change -> (change.getRootNode().getDataAfter() != null
+                .filter(change ->
+                    (change.getRootNode().dataAfter() != null
                         && !StringConstants.DEFAULT_NETCONF_NODEID
-                        .equalsIgnoreCase(change.getRootNode().getDataAfter().key().getNodeId().getValue())
-                        && change.getRootNode().getDataAfter().augmentation(NetconfNode.class) != null)
-                        || (change.getRootNode().getDataBefore() != null
-                        && !StringConstants.DEFAULT_NETCONF_NODEID.equalsIgnoreCase(
-                        change.getRootNode().getDataBefore().key().getNodeId().getValue())
-                        && change.getRootNode().getDataBefore().augmentation(NetconfNode.class) != null
-
-                )).collect(Collectors.toList());
+                            .equalsIgnoreCase(change.getRootNode().dataAfter().key().getNodeId().getValue())
+                        && change.getRootNode().dataAfter().augmentation(NetconfNode.class) != null)
+                    || (change.getRootNode().dataBefore() != null
+                        && !StringConstants.DEFAULT_NETCONF_NODEID
+                            .equalsIgnoreCase(change.getRootNode().dataBefore().key().getNodeId().getValue())
+                        && change.getRootNode().dataBefore().augmentation(NetconfNode.class) != null))
+                .collect(Collectors.toList());
     }
 
     /**
@@ -130,8 +128,8 @@ public class DeviceConfigListener implements DataTreeChangeListener<Node> {
      *
      */
     private static boolean isCreate(DataTreeModification<Node> change) {
-        return change.getRootNode().getDataBefore() == null && change.getRootNode().getDataAfter() != null
-                && ModificationType.WRITE.equals(change.getRootNode().getModificationType());
+        return change.getRootNode().dataBefore() == null && change.getRootNode().dataAfter() != null
+                && ModificationType.WRITE.equals(change.getRootNode().modificationType());
     }
 
     /**
@@ -139,7 +137,7 @@ public class DeviceConfigListener implements DataTreeChangeListener<Node> {
      *
      */
     private static boolean isUpdate(DataTreeModification<Node> change) {
-        return ModificationType.SUBTREE_MODIFIED.equals(change.getRootNode().getModificationType());
+        return ModificationType.SUBTREE_MODIFIED.equals(change.getRootNode().modificationType());
     }
 
     /**
@@ -147,7 +145,7 @@ public class DeviceConfigListener implements DataTreeChangeListener<Node> {
      *
      */
     private static boolean isDelete(DataTreeModification<Node> change) {
-        return change.getRootNode().getDataBefore() != null && change.getRootNode().getDataAfter() == null
-                && ModificationType.DELETE.equals(change.getRootNode().getModificationType());
+        return change.getRootNode().dataBefore() != null && change.getRootNode().dataAfter() == null
+                && ModificationType.DELETE.equals(change.getRootNode().modificationType());
     }
 }
index f64836c72deb5921f4eb02aaf22b98afb529199d..7e51845b56dea9916d4a349d1c3c7e5ec6732e79 100644 (file)
@@ -5,7 +5,6 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-
 package org.opendaylight.transportpce.inventory.listener;
 
 import java.util.Collection;
@@ -17,9 +16,8 @@ import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.transportpce.inventory.DeviceInventory;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus.ConnectionStatus;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.ConnectionOper.ConnectionStatus;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev231121.NetconfNode;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -43,23 +41,22 @@ public class DeviceListener implements DataTreeChangeListener<Node> {
     }
 
     @Override
-    public void onDataTreeChanged(Collection<DataTreeModification<Node>> changes) {
+    public void onDataTreeChanged(List<DataTreeModification<Node>> changes) {
         //LOG.debug("testing np1: {}", changes.toString());
         String openROADMversion = "";
         List<DataTreeModification<Node>> changesWithoutDefaultNetconfNode = getRealDevicesOnly(changes);
         for (DataTreeModification<Node> device : changesWithoutDefaultNetconfNode) {
-            String nodeId = device.getRootNode().getDataAfter().key().getNodeId().getValue();
-            NetconfNode netconfNode = device.getRootNode().getDataAfter().augmentation(NetconfNode.class);
-            NetconfNodeConnectionStatus.ConnectionStatus connectionStatus =
-                    netconfNode.getConnectionStatus();
+            String nodeId = device.getRootNode().dataAfter().key().getNodeId().getValue();
+            NetconfNode netconfNode = device.getRootNode().dataAfter().augmentation(NetconfNode.class);
+            ConnectionStatus connectionStatus = netconfNode.getConnectionStatus();
             long count = netconfNode.getAvailableCapabilities().getAvailableCapability().stream()
                     .filter(cp -> cp.getCapability().contains(StringConstants.OPENROADM_DEVICE_MODEL_NAME))
                     .count();
-            LOG.debug("DL Modification Type {}", device.getRootNode().getModificationType().toString());
+            LOG.debug("DL Modification Type {}", device.getRootNode().modificationType());
             LOG.debug("DL Capability Count {}", count);
             LOG.debug("DL Connection Status {}", connectionStatus);
-            LOG.debug("DL device.getRootNode().getDataBefore() {}", device.getRootNode().getDataBefore());
-            LOG.debug("DL device.getRootNode().getDataAfter() {}", device.getRootNode().getDataAfter());
+            LOG.debug("DL device.getRootNode().getDataBefore() {}", device.getRootNode().dataBefore());
+            LOG.debug("DL device.getRootNode().getDataAfter() {}", device.getRootNode().dataAfter());
 
             if (isCreate(device)) {
                 LOG.info("Node {} was created", nodeId);
@@ -86,7 +83,7 @@ public class DeviceListener implements DataTreeChangeListener<Node> {
      */
     private void processModifiedSubtree(String nodeId, NetconfNode netconfNode, String openROADMversion)
             throws InterruptedException, ExecutionException {
-        NetconfNodeConnectionStatus.ConnectionStatus connectionStatus = netconfNode.getConnectionStatus();
+        ConnectionStatus connectionStatus = netconfNode.getConnectionStatus();
 
         long count = netconfNode.getAvailableCapabilities().getAvailableCapability().stream()
                 .filter(cp -> cp.getCapability().contains(StringConstants.OPENROADM_DEVICE_MODEL_NAME))
@@ -114,16 +111,16 @@ public class DeviceListener implements DataTreeChangeListener<Node> {
      */
     private static List<DataTreeModification<Node>> getRealDevicesOnly(Collection<DataTreeModification<Node>> changes) {
         return changes.stream()
-                .filter(change -> (change.getRootNode().getDataAfter() != null
+                .filter(change ->
+                    (change.getRootNode().dataAfter() != null
                         && !StringConstants.DEFAULT_NETCONF_NODEID
-                        .equalsIgnoreCase(change.getRootNode().getDataAfter().key().getNodeId().getValue())
-                        && change.getRootNode().getDataAfter().augmentation(NetconfNode.class) != null)
-                        || (change.getRootNode().getDataBefore() != null
-                        && !StringConstants.DEFAULT_NETCONF_NODEID.equalsIgnoreCase(
-                        change.getRootNode().getDataBefore().key().getNodeId().getValue())
-                        && change.getRootNode().getDataBefore().augmentation(NetconfNode.class) != null
-
-                )).collect(Collectors.toList());
+                            .equalsIgnoreCase(change.getRootNode().dataAfter().key().getNodeId().getValue())
+                        && change.getRootNode().dataAfter().augmentation(NetconfNode.class) != null)
+                    || (change.getRootNode().dataBefore() != null
+                        && !StringConstants.DEFAULT_NETCONF_NODEID
+                            .equalsIgnoreCase(change.getRootNode().dataBefore().key().getNodeId().getValue())
+                        && change.getRootNode().dataBefore().augmentation(NetconfNode.class) != null))
+                .collect(Collectors.toList());
     }
 
     /**
@@ -131,7 +128,7 @@ public class DeviceListener implements DataTreeChangeListener<Node> {
      *
      */
     private static boolean isCreate(DataTreeModification<Node> change) {
-        return change.getRootNode().getModificationType().toString().equalsIgnoreCase("WRITE");
+        return change.getRootNode().modificationType().toString().equalsIgnoreCase("WRITE");
     }
 
     /**
@@ -139,7 +136,7 @@ public class DeviceListener implements DataTreeChangeListener<Node> {
      *
      */
     private static boolean isDelete(DataTreeModification<Node> change) {
-        return change.getRootNode().getDataBefore() != null && change.getRootNode().getDataAfter() == null
-                && ModificationType.DELETE.equals(change.getRootNode().getModificationType());
+        return change.getRootNode().dataBefore() != null && change.getRootNode().dataAfter() == null
+                && ModificationType.DELETE.equals(change.getRootNode().modificationType());
     }
 }
index 26fd56d13ea4b1cedd327cab4c61fb75aa6c99a5..49977639466cfe754483af8e3922360361ed0e6c 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.transportpce.inventory.listener;
 
-import java.util.Collection;
+import java.util.List;
 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
@@ -19,8 +19,7 @@ public class OverlayNetworkChangeListener implements DataTreeChangeListener<Netw
     private static final Logger LOG = LoggerFactory.getLogger(OverlayNetworkChangeListener.class);
 
     @Override
-    public void onDataTreeChanged(Collection<DataTreeModification<Network>> changes) {
+    public void onDataTreeChanged(List<DataTreeModification<Network>> changes) {
         LOG.info("Overlay network changed {}", changes);
     }
-
 }
index 19b87fae1ef8e996de1881a8da64fe144dd21604..35691482b527d9aaab286e6b40f6815e3791ac22 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.transportpce.inventory.listener;
 
-import java.util.Collection;
+import java.util.List;
 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
@@ -19,7 +19,7 @@ public class UnderlayNetworkChangeListener implements DataTreeChangeListener<Net
     private static final Logger LOG = LoggerFactory.getLogger(UnderlayNetworkChangeListener.class);
 
     @Override
-    public void onDataTreeChanged(Collection<DataTreeModification<Network>> changes) {
+    public void onDataTreeChanged(List<DataTreeModification<Network>> changes) {
         LOG.info("Underlay network changed {}", changes);
     }
 
diff --git a/inventory/src/main/resources/OSGI-INF/blueprint/inventory-blueprint.xml b/inventory/src/main/resources/OSGI-INF/blueprint/inventory-blueprint.xml
deleted file mode 100644 (file)
index 1889ee7..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- vi: set et smarttab sw=4 tabstop=4: -->
-<!-- Copyright © 2016 Orange and others. All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution,
-    and is available at http://www.eclipse.org/legal/epl-v10.html -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
-           odl:use-default-for-reference-types="true"  xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0">
-
-    <reference id="dataBroker" interface="org.opendaylight.mdsal.binding.api.DataBroker"/>
-    <reference id="dataSource" interface="javax.sql.DataSource"/>
-    <reference id="deviceTransactionManager"
-               interface="org.opendaylight.transportpce.common.device.DeviceTransactionManager"/>
-
-    <bean id="deviceInventory" class="org.opendaylight.transportpce.inventory.DeviceInventory">
-        <argument ref="dataSource"/>
-        <argument ref="iNodeImpl"/>
-        <argument ref="deviceTransactionManager"/>
-    </bean>
-
-    <bean id="iNode121" class="org.opendaylight.transportpce.inventory.INode121">
-        <argument ref="dataSource"/>
-        <argument ref="deviceTransactionManager"/>
-    </bean>
-
-    <bean id="iNodeImpl" class="org.opendaylight.transportpce.inventory.INode">
-        <argument ref="dataSource"/>
-        <argument ref="deviceTransactionManager"/>
-        <argument ref="iNode121"/>
-
-    </bean>
-
-    <bean id="overlayNetworkChangeListener"
-          class="org.opendaylight.transportpce.inventory.listener.OverlayNetworkChangeListener"/>
-    <bean id="underlayNetworkChangeListener"
-          class="org.opendaylight.transportpce.inventory.listener.UnderlayNetworkChangeListener"/>
-    <bean id="clliNetworkChangeListener"
-          class="org.opendaylight.transportpce.inventory.listener.ClliNetworkChangeListener"/>
-
-    <bean id="deviceListener" class="org.opendaylight.transportpce.inventory.listener.DeviceListener">
-        <argument ref="deviceInventory"/>
-    </bean>
-
-    <bean id="deviceConfigListener" class="org.opendaylight.transportpce.inventory.listener.DeviceConfigListener">
-        <argument ref="deviceInventory"/>
-    </bean>
-
-    <bean id="listenerProvider" class="org.opendaylight.transportpce.inventory.ListenerProvider"
-          init-method="initialize">
-        <argument ref="dataBroker"/>
-        <argument ref="overlayNetworkChangeListener"/>
-        <argument ref="underlayNetworkChangeListener"/>
-        <argument ref="clliNetworkChangeListener"/>
-        <argument ref="deviceListener"/>
-        <argument ref="deviceConfigListener"/>
-    </bean>
-
-</blueprint>
similarity index 76%
rename from features/odl-transportpce-inventory/src/main/resources/org.ops4j.datasource-transporpce.cfg
rename to inventory/src/main/resources/org.ops4j.datasource-transporpce.cfg
index e48d393362b66770b89da301ae5f3b14f9314982..fb1e2550df106213aab67d6652d0449a546ede06 100644 (file)
@@ -3,5 +3,4 @@ url=jdbc:mariadb://${transportpce.db.host}/${transportpce.db.database}?useUnicod
 pool=dbcp2
 user=${transportpce.db.username}
 password=${transportpce.db.password}
-databaseName=${transportpce.db.database}
 dataSourceName=transportpce
\ No newline at end of file
index 4c4597e65356f3b4eac550321efd4e335ad334b4..b5ea8c0e3dae8de5b62a3529b28ab980259c0f2e 100644 (file)
@@ -12,13 +12,13 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
   <parent>
     <groupId>org.opendaylight.odlparent</groupId>
     <artifactId>karaf4-parent</artifactId>
-    <version>9.0.13</version>
+    <version>13.0.11</version>
     <relativePath/>
   </parent>
 
   <groupId>org.opendaylight.transportpce</groupId>
   <artifactId>transportpce-karaf</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
+  <version>10.0.0-SNAPSHOT</version>
   <packaging>pom</packaging>
   <name>${project.artifactId}</name>
 
@@ -80,14 +80,6 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
       <type>xml</type>
       <scope>runtime</scope>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>odl-transportpce-swagger</artifactId>
-      <version>${project.version}</version>
-      <classifier>features</classifier>
-      <type>xml</type>
-      <scope>runtime</scope>
-    </dependency>
   </dependencies>
 
   <build>
index 813d9c3f05933a67603da05200a1e5851b953f62..40f3545d0d92314fcdd9b713e4787ed3d0abedba 100755 (executable)
@@ -7,7 +7,8 @@ sed 's/8181/ODL_RESTCONF_PORT/' ../etc/org.ops4j.pax.web.cfg > org.ops4j.pax.web
 sed 's/8181/ODL_RESTCONF_PORT/' ../etc/jetty.xml > jetty_template.xml
 sed 's/8101/ODL_SHELL_PORT/' ../etc/org.apache.karaf.shell.cfg > org.apache.karaf.shell._template.cfg
 sed -e 's/1099/ODL_RMI_REGISTRY_PORT/' -e 's/44444/ODL_RMI_SERVER_PORT/' ../etc/org.apache.karaf.management.cfg > org.apache.karaf.management._template.cfg
-sed 's/^[#|]websocket-port=8185/websocket-port=ODL_WEBSOCKET_PORT/' ../system/org/opendaylight/netconf/sal-rest-connector-config/[0-9.]*/sal-rest-connector-config-[0-9.]*-restconf.cfg >org.opendaylight.restconf._template.cfg
+
+sed 's/^#persistent=true/persistent=false/' ../system/org/opendaylight/controller/sal-clustering-config/*/sal-clustering-config-*-datastore.cfg > ../etc/org.opendaylight.controller.cluster.datastore.cfg
 
 sed -i'_' -e '1 a\
 \
index a3bcef4d0865d736f97ed0182d59b599cd53e5e8..15b00b37cc8b5594b6bdd89c2be319dbae74b615 100755 (executable)
@@ -2,6 +2,7 @@
 
 cd $(dirname "$0")
 export JDK_JAVA_OPTIONS="--add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED"
-#./build_lighty_core.sh
-mvn clean install -B -U -Dmaven.javadoc.skip=true -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn
+# uncomment the following line when related artifacts are not avaible on mvn central yet
+./build_lighty_core.sh
+mvn clean install -B -U -q -Dmaven.javadoc.skip=true -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn -s ../tests/odl_settings.xml -DskipTests
 unzip -q target/tpce-bin.zip -d target
index 3621fb1a4884c8e3f795f4f4db6b275ce8b15896..a454111352476ddcf0e34e18cf053bc54614afc3 100755 (executable)
@@ -2,9 +2,9 @@
 
 cd $(dirname "$0")
 cd ..
-git clone https://github.com/PantheonTechnologies/lighty-core.git
-cd lighty-core
-#git checkout master
-git checkout 15.1.x
+git clone https://github.com/PANTHEONtech/lighty.git lighty-repo
+cd lighty-repo
+git checkout main
+#git checkout 19.x
 export JDK_JAVA_OPTIONS="--add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.nio=ALL-UNNAMED"
-mvn clean install -B -U -DskipTests -Dmaven.javadoc.skip=true -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn
+mvn clean install -B -U -q -DskipTests -s ../tests/odl_settings.xml -Dmaven.javadoc.skip=true -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=warn
index 3c93b56fd4f144ab09bed96fd62641b2c5dbff71..5bba36530e08789706a704d526e0dfa17465e0a8 100644 (file)
   <parent>
     <groupId>io.lighty.core</groupId>
     <artifactId>lighty-app-parent</artifactId>
-    <version>15.2.0</version>
+    <version>20.0.0-SNAPSHOT</version>
     <relativePath/>
   </parent>
 
   <groupId>io.lighty.controllers</groupId>
   <artifactId>tpce</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
+  <version>10.0.0-SNAPSHOT</version>
   <packaging>jar</packaging>
 
   <properties>
     <application.main.class>io.lighty.controllers.tpce.Main</application.main.class>
     <application.attach.zip>true</application.attach.zip>
     <maven.deploy.skip>true</maven.deploy.skip>
-    <transportpce.version>5.0.0-SNAPSHOT</transportpce.version>
+    <transportpce.version>10.0.0-SNAPSHOT</transportpce.version>
+    <transportpce.models.version>20.0.0-SNAPSHOT</transportpce.models.version>
   </properties>
 
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.opendaylight.transportpce.models</groupId>
+        <artifactId>transportpce-models-artifacts</artifactId>
+        <version>${transportpce.models.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
   <dependencies>
     <!-- for parsing command line arguments -->
     <dependency>
       <version>1.4</version>
     </dependency>
     <!-- TPCE Models - BEGIN -->
+    <dependency>
+     <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-1.2.1</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-2.2.1</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-7.1.0</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-13.1.0</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-device-1.2.1</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-device-2.2.1</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-device-7.1.0</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-network-13.1.0</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-service-13.1.0</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>tapi-2.4.0</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.opendaylight.transportpce</groupId>
       <artifactId>transportpce-api</artifactId>
       <groupId>io.lighty.modules</groupId>
       <artifactId>lighty-restconf-nb-community</artifactId>
     </dependency>
+    <dependency>
+      <groupId>io.lighty.modules</groupId>
+      <artifactId>lighty-openapi</artifactId>
+    </dependency>
     <dependency>
       <groupId>junit</groupId>
       <artifactId>junit</artifactId>
             **/module-info.java
           </excludes>
           <consoleOutput>true</consoleOutput>
+          <propertyExpansion>checkstyle.violationSeverity=error</propertyExpansion>
         </configuration>
         <executions>
           <execution>
index a16c4a981becacdb7d969ceaa94c10f297850276..207497da8de35aa84abcdbd0a7c2085f2a97142c 100644 (file)
@@ -2,6 +2,6 @@
     "restconf":{
         "inetAddress": "127.0.0.1",
         "httpPort": ODL_RESTCONF_PORT,
-        "webSocketPort": ODL_WEBSOCKET_PORT
+        "restconfServletContextPath":"/rests"
     }
 }
index 043f37f9657f7cfbc738100e8b24d3ce6ed91a6f..f7521205a17ed8320d52c1c19574060079c7222b 100644 (file)
@@ -20,13 +20,13 @@ import io.lighty.core.controller.impl.config.ControllerConfiguration;
 import io.lighty.core.controller.impl.util.ControllerConfigUtils;
 import io.lighty.modules.northbound.restconf.community.impl.CommunityRestConf;
 import io.lighty.modules.northbound.restconf.community.impl.CommunityRestConfBuilder;
-import io.lighty.modules.northbound.restconf.community.impl.config.JsonRestConfServiceType;
 import io.lighty.modules.northbound.restconf.community.impl.config.RestConfConfiguration;
 import io.lighty.modules.northbound.restconf.community.impl.util.RestConfConfigUtils;
 import io.lighty.modules.southbound.netconf.impl.NetconfSBPlugin;
 import io.lighty.modules.southbound.netconf.impl.NetconfTopologyPluginBuilder;
 import io.lighty.modules.southbound.netconf.impl.config.NetconfConfiguration;
 import io.lighty.modules.southbound.netconf.impl.util.NetconfConfigUtils;
+import io.lighty.openapi.OpenApiLighty;
 import io.lighty.server.LightyServerBuilder;
 import java.io.IOException;
 import java.net.InetSocketAddress;
@@ -82,7 +82,6 @@ public class Main {
                 restConfConfig.setHttpPort(8181);
 
             }
-            restConfConfig.setJsonRestconfServiceType(JsonRestConfServiceType.DRAFT_02);
             // 3. NETCONF SBP configuration
             NetconfConfiguration netconfSBPConfig = NetconfConfigUtils.createDefaultNetconfConfiguration();
             startLighty(singleNodeConfiguration, restConfConfig, netconfSBPConfig, registerShutdownHook,
@@ -159,16 +158,21 @@ public class Main {
         LightyController lightyController = lightyControllerBuilder.from(controllerConfiguration).build();
         lightyController.start().get();
 
-        // 2. start RestConf server
+        // 2. Start swagger server
         LightyServerBuilder jettyServerBuilder = new LightyServerBuilder(
                 new InetSocketAddress(restConfConfiguration.getInetAddress(), restConfConfiguration.getHttpPort()));
         CommunityRestConfBuilder communityRestConfBuilder = CommunityRestConfBuilder.from(
                 RestConfConfigUtils.getRestConfConfiguration(restConfConfiguration, lightyController.getServices()));
+        OpenApiLighty swagger = new OpenApiLighty(restConfConfiguration, jettyServerBuilder,
+                lightyController.getServices());
+        swagger.start().get();
+
+        // 3. start RestConf server
         CommunityRestConf communityRestConf = communityRestConfBuilder.withLightyServer(jettyServerBuilder).build();
         communityRestConf.start().get();
         communityRestConf.startServer();
 
-        // 3. start NetConf SBP
+        // 4. start NetConf SBP
         NetconfSBPlugin netconfSouthboundPlugin;
         netconfSBPConfiguration = NetconfConfigUtils.injectServicesToTopologyConfig(netconfSBPConfiguration,
                 lightyController.getServices());
@@ -178,12 +182,12 @@ public class Main {
                 .build();
         netconfSouthboundPlugin.start().get();
 
-        // 4. start TransportPCE beans
+        // 5. start TransportPCE beans
         TransportPCE transportPCE = new TransportPCEImpl(lightyController.getServices(), activateNbiNotification,
             activateTapi, olmtimer1, olmtimer2);
         transportPCE.start().get();
 
-        // 5. Register shutdown hook for graceful shutdown.
+        // 6. Register shutdown hook for graceful shutdown.
         shutdownHook = new ShutdownHook(lightyController, communityRestConf, netconfSouthboundPlugin, transportPCE);
         if (registerShutdownHook) {
             Runtime.getRuntime().addShutdownHook(shutdownHook);
index 44aa827ecb468d45c0fc7392521b2e00101d79e8..29391fdf2d658126a263c6f97f81a09804e286b2 100644 (file)
@@ -7,7 +7,9 @@
  */
 package io.lighty.controllers.tpce.exception;
 
-@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+
+@SuppressFBWarnings(
     value = "SE_NO_SERIALVERSIONID",
     justification = "https://github.com/rzwitserloot/lombok/wiki/WHY-NOT:-serialVersionUID")
 public class TechnicalException extends RuntimeException {
index ef88bf77e81598a2dc3f74de3f7af0bf7b45c118..bed1ccba9ff996e7166596d37bf55adb7e67ce87 100644 (file)
@@ -9,9 +9,12 @@ package io.lighty.controllers.tpce.module;
 
 import io.lighty.core.controller.api.AbstractLightyModule;
 import io.lighty.core.controller.api.LightyServices;
-import java.util.Arrays;
+import java.util.ArrayList;
 import java.util.List;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
 import org.opendaylight.mdsal.binding.api.NotificationService;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl121;
@@ -27,7 +30,6 @@ import org.opendaylight.transportpce.common.mapping.PortMappingVersion221;
 import org.opendaylight.transportpce.common.mapping.PortMappingVersion710;
 import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
-import org.opendaylight.transportpce.common.network.RequestProcessor;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl121;
@@ -37,31 +39,19 @@ import org.opendaylight.transportpce.nbinotifications.impl.NbiNotificationsProvi
 import org.opendaylight.transportpce.networkmodel.NetConfTopologyListener;
 import org.opendaylight.transportpce.networkmodel.NetworkModelProvider;
 import org.opendaylight.transportpce.networkmodel.NetworkUtilsImpl;
-import org.opendaylight.transportpce.networkmodel.R2RLinkDiscovery;
 import org.opendaylight.transportpce.networkmodel.listeners.PortMappingListener;
-import org.opendaylight.transportpce.networkmodel.service.FrequenciesService;
 import org.opendaylight.transportpce.networkmodel.service.FrequenciesServiceImpl;
 import org.opendaylight.transportpce.networkmodel.service.NetworkModelService;
 import org.opendaylight.transportpce.networkmodel.service.NetworkModelServiceImpl;
 import org.opendaylight.transportpce.olm.OlmPowerServiceRpcImpl;
-import org.opendaylight.transportpce.olm.OlmProvider;
-import org.opendaylight.transportpce.olm.power.PowerMgmt;
 import org.opendaylight.transportpce.olm.power.PowerMgmtImpl;
-import org.opendaylight.transportpce.olm.service.OlmPowerService;
 import org.opendaylight.transportpce.olm.service.OlmPowerServiceImpl;
-import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumer;
 import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumerImpl;
-import org.opendaylight.transportpce.pce.impl.PceProvider;
+import org.opendaylight.transportpce.pce.impl.PceServiceRPCImpl;
 import org.opendaylight.transportpce.pce.service.PathComputationService;
 import org.opendaylight.transportpce.pce.service.PathComputationServiceImpl;
-import org.opendaylight.transportpce.renderer.RendererProvider;
-import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface121;
-import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface221;
-import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface710;
 import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterfaceFactory;
 // Adding OTN interface
-import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmOtnInterface221;
-import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmOtnInterface710;
 import org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererService;
 import org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererServiceImpl;
 import org.opendaylight.transportpce.renderer.provisiondevice.OtnDeviceRendererService;
@@ -69,197 +59,199 @@ import org.opendaylight.transportpce.renderer.provisiondevice.OtnDeviceRendererS
 import org.opendaylight.transportpce.renderer.provisiondevice.OtnDeviceRendererServiceImpl;
 import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations;
 import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperationsImpl;
+import org.opendaylight.transportpce.renderer.provisiondevice.notification.NotificationSender;
 import org.opendaylight.transportpce.renderer.rpcs.DeviceRendererRPCImpl;
+import org.opendaylight.transportpce.renderer.rpcs.RendererRPCImpl;
+import org.opendaylight.transportpce.servicehandler.catalog.CatalogDataStoreOperationsImpl;
+import org.opendaylight.transportpce.servicehandler.impl.ServiceHandlerProvider;
 import org.opendaylight.transportpce.servicehandler.impl.ServicehandlerImpl;
-import org.opendaylight.transportpce.servicehandler.impl.ServicehandlerProvider;
-import org.opendaylight.transportpce.servicehandler.listeners.NetworkModelListenerImpl;
-import org.opendaylight.transportpce.servicehandler.listeners.PceListenerImpl;
-import org.opendaylight.transportpce.servicehandler.listeners.RendererListenerImpl;
+import org.opendaylight.transportpce.servicehandler.listeners.NetworkModelNotificationHandler;
+import org.opendaylight.transportpce.servicehandler.listeners.PceNotificationHandler;
+import org.opendaylight.transportpce.servicehandler.listeners.RendererNotificationHandler;
 import org.opendaylight.transportpce.servicehandler.listeners.ServiceListener;
 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperationsImpl;
-import org.opendaylight.transportpce.tapi.R2RTapiLinkDiscovery;
 import org.opendaylight.transportpce.tapi.impl.TapiProvider;
-import org.opendaylight.transportpce.tapi.listeners.TapiPceListenerImpl;
-import org.opendaylight.transportpce.tapi.listeners.TapiRendererListenerImpl;
-import org.opendaylight.transportpce.tapi.listeners.TapiServiceHandlerListenerImpl;
-import org.opendaylight.transportpce.tapi.topology.TapiNetconfTopologyListener;
-import org.opendaylight.transportpce.tapi.topology.TapiNetworkModelService;
+import org.opendaylight.transportpce.tapi.listeners.TapiNetworkModelNotificationHandler;
 import org.opendaylight.transportpce.tapi.topology.TapiNetworkModelServiceImpl;
 import org.opendaylight.transportpce.tapi.topology.TapiNetworkUtilsImpl;
-import org.opendaylight.transportpce.tapi.topology.TapiOrLinkListener;
-import org.opendaylight.transportpce.tapi.topology.TapiPortMappingListener;
 import org.opendaylight.transportpce.tapi.utils.TapiLink;
-import org.opendaylight.transportpce.tapi.utils.TapiListener;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.TransportpceNetworkutilsService;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.TransportpceOlmService;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev210408.TransportpceTapinetworkutilsService;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OrgOpenroadmServiceService;
+import org.opendaylight.transportpce.tapi.utils.TapiLinkImpl;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 
 public class TransportPCEImpl extends AbstractLightyModule implements TransportPCE {
     private static final Logger LOG = LoggerFactory.getLogger(TransportPCEImpl.class);
-    private static final long MAX_DURATION_TO_SUBMIT_TRANSACTION = 1500;
+    private static final long MAX_TIME_FOR_TRANSACTION = 1500;
     // transaction beans
     // cannot use interface for DeviceTransactionManagerImpl
     // because implementation has additional public methods ...
     private final DeviceTransactionManagerImpl deviceTransactionManager;
     private final NetworkTransactionService networkTransaction;
-    // pce beans
-    private final PceProvider pceProvider;
     // network model beans
     private final NetworkModelProvider networkModelProvider;
-    // OLM beans
-    private final OlmProvider olmProvider;
-    // renderer beans
-    private final RendererProvider rendererProvider;
     // service-handler beans
-    private final ServicehandlerProvider servicehandlerProvider;
+    private final ServiceHandlerProvider servicehandlerProvider;
     // T-api
     private TapiProvider tapiProvider;
     // nbi-notifications beans
     private NbiNotificationsProvider nbiNotificationsProvider;
-    /**
-     * List of publisher topics.
-     */
-    private final List<String> publisherServiceList = Arrays.asList("PceListener", "ServiceHandlerOperations",
-            "ServiceHandler", "RendererListener");
-    private final List<String> publisherAlarmList = Arrays.asList("ServiceListener");
+    private List<Registration> rpcRegistrations = new ArrayList<>();
 
-    public TransportPCEImpl(LightyServices lightyServices, boolean activateNbiNotification, boolean activateTapi,
-                            String olmtimer1, String olmtimer2) {
+    public TransportPCEImpl(
+            LightyServices lightyServices, boolean activateNbiNotification, boolean activateTapi,
+            String olmtimer1, String olmtimer2) {
         LOG.info("Initializing transaction providers ...");
-        deviceTransactionManager = new DeviceTransactionManagerImpl(lightyServices.getBindingMountPointService(),
-                MAX_DURATION_TO_SUBMIT_TRANSACTION);
-        RequestProcessor requestProcessor = new RequestProcessor(lightyServices.getBindingDataBroker());
-        networkTransaction = new NetworkTransactionImpl(requestProcessor);
+        deviceTransactionManager =
+            new DeviceTransactionManagerImpl(lightyServices.getBindingMountPointService(), MAX_TIME_FOR_TRANSACTION);
+        DataBroker dataBroker = lightyServices.getBindingDataBroker();
+        networkTransaction = new NetworkTransactionImpl(dataBroker);
 
         LOG.info("Creating network-model beans ...");
-        R2RLinkDiscovery linkDiscoveryImpl = new R2RLinkDiscovery(lightyServices.getBindingDataBroker(),
-                deviceTransactionManager, networkTransaction);
-        TransportpceNetworkutilsService networkutilsServiceImpl = new NetworkUtilsImpl(
-                lightyServices.getBindingDataBroker());
-        PortMapping portMapping = initPortMapping(lightyServices);
-        NetworkModelService networkModelService = new NetworkModelServiceImpl(networkTransaction, linkDiscoveryImpl,
-                portMapping, lightyServices.getBindingNotificationPublishService());
-        FrequenciesService networkModelWavelengthService =
-                new FrequenciesServiceImpl(lightyServices.getBindingDataBroker());
-        NetConfTopologyListener netConfTopologyListener = new NetConfTopologyListener(networkModelService,
-                lightyServices.getBindingDataBroker(), deviceTransactionManager, portMapping);
-        PortMappingListener portMappingListener = new PortMappingListener(networkModelService);
-        networkModelProvider = new NetworkModelProvider(networkTransaction, lightyServices.getBindingDataBroker(),
-                lightyServices.getRpcProviderService(), networkutilsServiceImpl, netConfTopologyListener,
-                lightyServices.getNotificationService(), networkModelWavelengthService, portMappingListener);
+        PortMapping portMapping = initPortMapping(dataBroker);
+        NotificationPublishService notificationPublishService = lightyServices.getBindingNotificationPublishService();
+        NetworkModelService networkModelService = new NetworkModelServiceImpl(dataBroker, deviceTransactionManager,
+                networkTransaction, portMapping, notificationPublishService);
+        new NetConfTopologyListener(networkModelService, dataBroker, deviceTransactionManager, portMapping);
+        new PortMappingListener(networkModelService);
+
+        RpcProviderService rpcProviderService = lightyServices.getRpcProviderService();
+        NotificationService notificationService = lightyServices.getNotificationService();
+        new NetworkUtilsImpl(dataBroker, rpcProviderService);
+        networkModelProvider = new NetworkModelProvider(networkTransaction, dataBroker, networkModelService,
+                deviceTransactionManager, portMapping, notificationService, new FrequenciesServiceImpl(dataBroker));
 
         LOG.info("Creating PCE beans ...");
         // TODO: pass those parameters through command line
-        GnpyConsumer gnpyConsumer = new GnpyConsumerImpl("http://127.0.0.1:8008",
-                "gnpy", "gnpy", lightyServices.getAdapterContext().currentSerializer());
         PathComputationService pathComputationService = new PathComputationServiceImpl(
                 networkTransaction,
-                lightyServices.getBindingNotificationPublishService(),
-                gnpyConsumer,
-                portMapping
-                );
-        pceProvider = new PceProvider(lightyServices.getRpcProviderService(), pathComputationService);
+                notificationPublishService,
+                new GnpyConsumerImpl(
+                    "http://127.0.0.1:8008", "gnpy", "gnpy", lightyServices.getAdapterContext().currentSerializer()),
+                portMapping);
+        rpcRegistrations.add(new PceServiceRPCImpl(rpcProviderService, pathComputationService).getRegisteredRpc());
 
         LOG.info("Creating OLM beans ...");
-        MappingUtils mappingUtils = new MappingUtilsImpl(lightyServices.getBindingDataBroker());
+        MappingUtils mappingUtils = new MappingUtilsImpl(dataBroker);
         CrossConnect crossConnect = initCrossConnect(mappingUtils);
         OpenRoadmInterfaces openRoadmInterfaces = initOpenRoadmInterfaces(mappingUtils, portMapping);
-        PowerMgmt powerMgmt = new PowerMgmtImpl(lightyServices.getBindingDataBroker(), openRoadmInterfaces,
-                crossConnect, deviceTransactionManager, olmtimer1, olmtimer2);
-        OlmPowerService olmPowerService = new OlmPowerServiceImpl(lightyServices.getBindingDataBroker(), powerMgmt,
-                deviceTransactionManager, portMapping, mappingUtils, openRoadmInterfaces);
-        olmProvider = new OlmProvider(lightyServices.getRpcProviderService(), olmPowerService);
-        TransportpceOlmService olmPowerServiceRpc = new OlmPowerServiceRpcImpl(olmPowerService);
+        OlmPowerServiceRpcImpl olmPowerServiceRpc = new OlmPowerServiceRpcImpl(
+            new OlmPowerServiceImpl(
+                    dataBroker,
+                    new PowerMgmtImpl(
+                            openRoadmInterfaces,
+                            crossConnect,
+                            deviceTransactionManager,
+                            portMapping,
+                            Long.valueOf(olmtimer1).longValue(),
+                            Long.valueOf(olmtimer2).longValue()),
+                    deviceTransactionManager,
+                    portMapping,
+                    mappingUtils,
+                    openRoadmInterfaces),
+            rpcProviderService);
+        rpcRegistrations.add(olmPowerServiceRpc.getRegisteredRpc());
 
         LOG.info("Creating renderer beans ...");
-        OpenRoadmInterfaceFactory openRoadmInterfaceFactory = initOpenRoadmFactory(mappingUtils, openRoadmInterfaces,
-                portMapping);
+        new OpenRoadmInterfaceFactory(mappingUtils, portMapping, openRoadmInterfaces);
         DeviceRendererService deviceRendererService = new DeviceRendererServiceImpl(
-                lightyServices.getBindingDataBroker(), deviceTransactionManager, openRoadmInterfaceFactory,
-                openRoadmInterfaces, crossConnect, portMapping);
-        OtnDeviceRendererService otnDeviceRendererService = new OtnDeviceRendererServiceImpl(openRoadmInterfaceFactory,
-                crossConnect, openRoadmInterfaces, deviceTransactionManager, networkModelService);
-        rendererProvider = initRenderer(lightyServices, olmPowerServiceRpc, deviceRendererService,
-                otnDeviceRendererService, portMapping);
+                dataBroker,
+                deviceTransactionManager,
+                openRoadmInterfaces,
+                crossConnect,
+                mappingUtils,
+                portMapping);
+        OtnDeviceRendererService otnDeviceRendererService = new OtnDeviceRendererServiceImpl(
+                crossConnect,
+                openRoadmInterfaces,
+                deviceTransactionManager,
+                mappingUtils,
+                portMapping);
+        //FIXME: need mdsal.binding;api.RpcService from LightyServices
+        RpcService rpcService = lightyServices.getRpcService();
+        RendererServiceOperations rendererServiceOperations = new RendererServiceOperationsImpl(
+                deviceRendererService, otnDeviceRendererService, dataBroker,
+                new NotificationSender(notificationPublishService),
+                portMapping,
+                rpcService);
+        rpcRegistrations.add(new DeviceRendererRPCImpl(
+                        lightyServices.getRpcProviderService(),
+                        deviceRendererService,
+                        otnDeviceRendererService)
+                    .getRegisteredRpc());
+        rpcRegistrations.add(new RendererRPCImpl(
+                rendererServiceOperations,
+                lightyServices.getRpcProviderService())
+            .getRegisteredRpc());
 
         LOG.info("Creating service-handler beans ...");
-        RendererServiceOperations rendererServiceOperations = new RendererServiceOperationsImpl(deviceRendererService,
-                otnDeviceRendererService, olmPowerServiceRpc, lightyServices.getBindingDataBroker(),
-                lightyServices.getBindingNotificationPublishService(), portMapping);
-        ServiceDataStoreOperations serviceDataStoreOperations = new ServiceDataStoreOperationsImpl(
-                lightyServices.getBindingDataBroker());
-        RendererListenerImpl rendererListenerImpl = new RendererListenerImpl(pathComputationService,
-            lightyServices.getBindingNotificationPublishService(), networkModelService);
-        PceListenerImpl pceListenerImpl = new PceListenerImpl(rendererServiceOperations, pathComputationService,
-            lightyServices.getBindingNotificationPublishService(), serviceDataStoreOperations);
-        ServiceListener serviceListener = new ServiceListener(lightyServices.getBindingDataBroker(),
-                lightyServices.getBindingNotificationPublishService());
-        NetworkModelListenerImpl networkModelListenerImpl = new NetworkModelListenerImpl(
-                lightyServices.getBindingNotificationPublishService(), serviceDataStoreOperations);
-        ServicehandlerImpl servicehandler = new ServicehandlerImpl(lightyServices.getBindingDataBroker(),
-            pathComputationService, rendererServiceOperations, lightyServices.getBindingNotificationPublishService(),
-            pceListenerImpl, rendererListenerImpl, networkModelListenerImpl, serviceDataStoreOperations);
-        servicehandlerProvider = new ServicehandlerProvider(lightyServices.getBindingDataBroker(),
-                lightyServices.getRpcProviderService(), lightyServices.getNotificationService(),
-                serviceDataStoreOperations, pceListenerImpl, serviceListener, rendererListenerImpl,
-                networkModelListenerImpl, servicehandler);
+        ServiceDataStoreOperations serviceDataStoreOperations = new ServiceDataStoreOperationsImpl(dataBroker);
+        RendererNotificationHandler rendererListener =
+            new RendererNotificationHandler(pathComputationService, notificationPublishService, networkModelService);
+        PceNotificationHandler pceListenerImpl = new PceNotificationHandler(
+                rendererServiceOperations, pathComputationService,
+                notificationPublishService, serviceDataStoreOperations);
+        NetworkModelNotificationHandler networkListener = new NetworkModelNotificationHandler(
+                notificationPublishService, serviceDataStoreOperations);
+        ServicehandlerImpl servicehandler = new ServicehandlerImpl(
+                rpcProviderService,
+                serviceDataStoreOperations,
+                pceListenerImpl,
+                rendererListener,
+                networkListener,
+                new CatalogDataStoreOperationsImpl(networkTransaction),
+                pathComputationService,
+                rendererServiceOperations,
+                notificationPublishService);
+        rpcRegistrations.add(servicehandler.getRegisteredRpc());
+        servicehandlerProvider = new ServiceHandlerProvider(
+                dataBroker,
+                notificationService,
+                serviceDataStoreOperations,
+                pceListenerImpl,
+                rendererListener,
+                networkListener,
+                new ServiceListener(rpcService, serviceDataStoreOperations, notificationPublishService));
+
         if (activateTapi) {
             LOG.info("Creating tapi beans ...");
-            TapiLink tapiLink = new TapiLink(networkTransaction);
-            R2RTapiLinkDiscovery tapilinkDiscoveryImpl = new R2RTapiLinkDiscovery(networkTransaction,
-                deviceTransactionManager, tapiLink);
-            TapiRendererListenerImpl tapiRendererListenerImpl = new TapiRendererListenerImpl(lightyServices
-                    .getBindingDataBroker());
-            TapiPceListenerImpl tapiPceListenerImpl = new TapiPceListenerImpl(lightyServices.getBindingDataBroker());
-            TapiServiceHandlerListenerImpl tapiServiceHandlerListener = new TapiServiceHandlerListenerImpl(lightyServices
-                    .getBindingDataBroker());
-            TransportpceTapinetworkutilsService tapiNetworkutilsServiceImpl = new TapiNetworkUtilsImpl(
-                    networkTransaction, tapiLink);
-            TapiNetworkModelService tapiNetworkModelService = new TapiNetworkModelServiceImpl(
-                tapilinkDiscoveryImpl, networkTransaction, tapiLink);
-            TapiNetconfTopologyListener tapiNetConfTopologyListener =
-                    new TapiNetconfTopologyListener(tapiNetworkModelService);
-            TapiOrLinkListener orLinkListener = new TapiOrLinkListener(tapiLink, networkTransaction);
-            TapiPortMappingListener tapiPortMappingListener =
-                new TapiPortMappingListener(tapiNetworkModelService);
-
-            tapiProvider = initTapi(lightyServices, servicehandler, networkTransaction, serviceDataStoreOperations,
-                tapiNetConfTopologyListener, tapiPortMappingListener, tapiNetworkutilsServiceImpl, tapiPceListenerImpl,
-                tapiRendererListenerImpl, tapiServiceHandlerListener, lightyServices.getNotificationService(),
-                orLinkListener);
+            TapiLink tapiLink = new TapiLinkImpl(networkTransaction);
+            new TapiNetworkUtilsImpl(rpcProviderService, networkTransaction, tapiLink);
+            tapiProvider = new TapiProvider(
+                    dataBroker,
+                    rpcProviderService,
+                    rpcService,
+                    notificationService,
+                    notificationPublishService,
+                    networkTransaction,
+                    serviceDataStoreOperations,
+                    new TapiNetworkModelNotificationHandler(networkTransaction, notificationPublishService),
+                    new TapiNetworkModelServiceImpl(
+                            networkTransaction,
+                            deviceTransactionManager,
+                            tapiLink,
+                            notificationPublishService));
+            rpcRegistrations.addAll(tapiProvider.getRegisteredRpcs());
         }
         if (activateNbiNotification) {
             LOG.info("Creating nbi-notifications beans ...");
             nbiNotificationsProvider = new NbiNotificationsProvider(
-                publisherServiceList, publisherAlarmList, null, null, lightyServices.getRpcProviderService(),
-                lightyServices.getNotificationService(), lightyServices.getAdapterContext().currentSerializer());
+                    rpcProviderService,
+                    notificationService,
+                    lightyServices.getAdapterContext().currentSerializer(),
+                    networkTransaction, null);
         }
     }
 
     @Override
     protected boolean initProcedure() {
-        LOG.info("Initializing PCE provider ...");
-        pceProvider.init();
-        LOG.info("Initializing network-model provider ...");
-        networkModelProvider.init();
-        LOG.info("Initializing OLM provider ...");
-        olmProvider.init();
-        LOG.info("Initializing renderer provider ...");
-        rendererProvider.init();
-        LOG.info("Initializing service-handler provider ...");
-        servicehandlerProvider.init();
         if (tapiProvider != null) {
             LOG.info("Initializing tapi provider ...");
-            tapiProvider.init();
         }
         if (nbiNotificationsProvider != null) {
             LOG.info("Initializing nbi-notifications provider ...");
-            nbiNotificationsProvider.init();
         }
         LOG.info("Init done.");
         return true;
@@ -276,80 +268,32 @@ public class TransportPCEImpl extends AbstractLightyModule implements TransportP
             LOG.info("Shutting down service-handler provider ...");
         }
         servicehandlerProvider.close();
-        LOG.info("Shutting down renderer provider ...");
-        rendererProvider.close();
-        LOG.info("Shutting down OLM provider ...");
-        olmProvider.close();
         LOG.info("Shutting down network-model provider ...");
         networkModelProvider.close();
-        LOG.info("Shutting down PCE provider ...");
-        pceProvider.close();
         LOG.info("Shutting down transaction providers ...");
-        networkTransaction.close();
         deviceTransactionManager.preDestroy();
+        LOG.info("Closing registered RPCs...");
+        for (Registration reg : rpcRegistrations) {
+            reg.close();
+        }
         LOG.info("Shutdown done.");
         return true;
     }
 
-    private TapiProvider initTapi(LightyServices lightyServices, OrgOpenroadmServiceService servicehandler,
-                                  NetworkTransactionService networkTransactionService,
-                                  ServiceDataStoreOperations serviceDataStoreOperations,
-                                  TapiNetconfTopologyListener tapiNetConfTopologyListener,
-                                  TapiPortMappingListener tapiPortMappingListener,
-                                  TransportpceTapinetworkutilsService tapiNetworkutilsServiceImpl,
-                                  TapiPceListenerImpl pceListenerImpl, TapiRendererListenerImpl rendererListenerImpl,
-                                  TapiServiceHandlerListenerImpl serviceHandlerListenerImpl,
-                                  NotificationService notificationService, TapiOrLinkListener orLinkListener) {
-        return new TapiProvider(lightyServices.getBindingDataBroker(), lightyServices.getRpcProviderService(),
-            servicehandler, serviceDataStoreOperations, new TapiListener(), networkTransactionService,
-            tapiNetConfTopologyListener, tapiPortMappingListener, tapiNetworkutilsServiceImpl, pceListenerImpl,
-            rendererListenerImpl, serviceHandlerListenerImpl, notificationService, orLinkListener);
-    }
-
-    private RendererProvider initRenderer(LightyServices lightyServices, TransportpceOlmService olmPowerServiceRpc,
-            DeviceRendererService deviceRendererService, OtnDeviceRendererService otnDeviceRendererService,
-            PortMapping portMapping) {
-        DeviceRendererRPCImpl deviceRendererRPC = new DeviceRendererRPCImpl(deviceRendererService,
-                otnDeviceRendererService);
-        RendererServiceOperationsImpl rendererServiceOperations = new RendererServiceOperationsImpl(
-                deviceRendererService, otnDeviceRendererService, olmPowerServiceRpc,
-                lightyServices.getBindingDataBroker(), lightyServices.getBindingNotificationPublishService(),
-                portMapping);
-        return new RendererProvider(lightyServices.getRpcProviderService(), deviceRendererRPC,
-                rendererServiceOperations);
-    }
-
-    private OpenRoadmInterfaceFactory initOpenRoadmFactory(MappingUtils mappingUtils,
-            OpenRoadmInterfaces openRoadmInterfaces, PortMapping portMapping) {
-        OpenRoadmInterface121 openRoadmInterface121 = new OpenRoadmInterface121(portMapping, openRoadmInterfaces);
-        OpenRoadmInterface221 openRoadmInterface221 = new OpenRoadmInterface221(portMapping, openRoadmInterfaces);
-        OpenRoadmInterface710 openRoadmInterface710 = new OpenRoadmInterface710(portMapping, openRoadmInterfaces);
-        OpenRoadmOtnInterface221 openRoadmOtnInterface221 = new OpenRoadmOtnInterface221(portMapping,
-                openRoadmInterfaces);
-        OpenRoadmOtnInterface710 openRoadmOtnInterface710 = new OpenRoadmOtnInterface710(portMapping,
-            openRoadmInterfaces);
-        return new OpenRoadmInterfaceFactory(mappingUtils, openRoadmInterface121, openRoadmInterface221,
-            openRoadmInterface710, openRoadmOtnInterface221, openRoadmOtnInterface710);
-    }
-
-    private PortMapping initPortMapping(LightyServices lightyServices) {
-        PortMappingVersion710 portMappingVersion710 = new PortMappingVersion710(lightyServices.getBindingDataBroker(),
-                deviceTransactionManager);
-        PortMappingVersion221 portMappingVersion221 = new PortMappingVersion221(lightyServices.getBindingDataBroker(),
-                deviceTransactionManager);
-        PortMappingVersion121 portMappingVersion121 = new PortMappingVersion121(lightyServices.getBindingDataBroker(),
-                deviceTransactionManager);
-        return new PortMappingImpl(lightyServices.getBindingDataBroker(), portMappingVersion710,
-            portMappingVersion221, portMappingVersion121);
+    private PortMapping initPortMapping(DataBroker dataBroker) {
+        PortMappingVersion710 portMappingVersion710 = new PortMappingVersion710(dataBroker, deviceTransactionManager);
+        PortMappingVersion221 portMappingVersion221 = new PortMappingVersion221(dataBroker, deviceTransactionManager);
+        PortMappingVersion121 portMappingVersion121 = new PortMappingVersion121(dataBroker, deviceTransactionManager);
+        return new PortMappingImpl(dataBroker, portMappingVersion710, portMappingVersion221, portMappingVersion121);
     }
 
     private OpenRoadmInterfaces initOpenRoadmInterfaces(MappingUtils mappingUtils, PortMapping portMapping) {
-        OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121 = new OpenRoadmInterfacesImpl121(
-                deviceTransactionManager);
-        OpenRoadmInterfacesImpl221 openRoadmInterfacesImpl221 = new OpenRoadmInterfacesImpl221(
-                deviceTransactionManager, portMapping, portMapping.getPortMappingVersion221());
-        OpenRoadmInterfacesImpl710 openRoadmInterfacesImpl710 = new OpenRoadmInterfacesImpl710(
-                deviceTransactionManager, portMapping, portMapping.getPortMappingVersion710());
+        OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121 =
+            new OpenRoadmInterfacesImpl121(deviceTransactionManager);
+        OpenRoadmInterfacesImpl221 openRoadmInterfacesImpl221 =
+            new OpenRoadmInterfacesImpl221(deviceTransactionManager, portMapping);
+        OpenRoadmInterfacesImpl710 openRoadmInterfacesImpl710 =
+            new OpenRoadmInterfacesImpl710(deviceTransactionManager, portMapping);
         return new OpenRoadmInterfacesImpl(deviceTransactionManager, mappingUtils, openRoadmInterfacesImpl121,
                 openRoadmInterfacesImpl221, openRoadmInterfacesImpl710);
     }
@@ -358,7 +302,7 @@ public class TransportPCEImpl extends AbstractLightyModule implements TransportP
         CrossConnectImpl121 crossConnectImpl121 = new CrossConnectImpl121(deviceTransactionManager);
         CrossConnectImpl221 crossConnectImpl221 = new CrossConnectImpl221(deviceTransactionManager);
         CrossConnectImpl710 crossConnectImpl710 = new CrossConnectImpl710(deviceTransactionManager);
-        return new CrossConnectImpl(deviceTransactionManager, mappingUtils, crossConnectImpl121, crossConnectImpl221,
-            crossConnectImpl710);
+        return new CrossConnectImpl(deviceTransactionManager, mappingUtils, crossConnectImpl121,
+                crossConnectImpl221, crossConnectImpl710);
     }
 }
index 1d0692dc8a6a642a0a2afd13764becfe2b982bc3..e75bdb1f741b9532864f4bf6e5cf21a7a7229349 100644 (file)
@@ -23,42 +23,21 @@ public final class TPCEUtils {
             // common models 1.2.1 and 2.2.1
             org.opendaylight.yang.gen.v1.http.org.openroadm.alarm.rev161014.$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.alarm.rev181019.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.amplifier.types.rev181130.$YangModuleInfoImpl
-                    .getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.equipment.types.rev181130.$YangModuleInfoImpl
-                    .getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.link.types.rev181130.$YangModuleInfoImpl
-                    .getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev181130.$YangModuleInfoImpl
-                    .getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev181130.$YangModuleInfoImpl
-                    .getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev181130.$YangModuleInfoImpl
-                    .getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev170929.$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181130.$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev161014.$YangModuleInfoImpl
                     .getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev171215.$YangModuleInfoImpl
                     .getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev181130.$YangModuleInfoImpl
-                    .getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.layerrate.rev161014.$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.maintenance.rev161014.$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.maintenance.rev181019.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev170929.$YangModuleInfoImpl
-                    .getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev171215.$YangModuleInfoImpl
                     .getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev181130.$YangModuleInfoImpl
-                    .getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev181019.$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev171215.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev170929.$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev181019.$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.probablecause.rev161014.$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.probablecause.rev181019.$YangModuleInfoImpl.getInstance(),
@@ -68,8 +47,6 @@ public final class TPCEUtils {
             org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019.$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.switching.pool.types.rev171215.$YangModuleInfoImpl
                     .getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.switching.pool.types.rev181130.$YangModuleInfoImpl
-                    .getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.tca.rev161014.$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.tca.rev181019.$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.user.mgmt.rev161014.$YangModuleInfoImpl.getInstance(),
@@ -115,20 +92,20 @@ public final class TPCEUtils {
             org.opendaylight.yang.gen.v1.http.org.openroadm.tca.rev200327.$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.user.mgmt.rev191129.$YangModuleInfoImpl.getInstance(),
 
-            // common models 10.1
+            // common models 13.1
             org.opendaylight.yang.gen.v1.http.org.openroadm.common.attributes.rev210924.$YangModuleInfoImpl
                 .getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.$YangModuleInfoImpl
                 .getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev211210.$YangModuleInfoImpl
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev230526.$YangModuleInfoImpl
                 .getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.phy.codes.rev210528.$YangModuleInfoImpl
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.phy.codes.rev220527.$YangModuleInfoImpl
                 .getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev211210.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev230526.$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.$YangModuleInfoImpl
             .getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev210924.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev211210.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev220325.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev230526.$YangModuleInfoImpl.getInstance(),
 
             // device models 1.2.1 and 2.2.1
             org.opendaylight.yang.gen.v1.http.org.openroadm.database.rev161014.$YangModuleInfoImpl.getInstance(),
@@ -258,65 +235,67 @@ public final class TPCEUtils {
             // network models
             org.opendaylight.yang.gen.v1.http.org.openroadm.amplifier.rev210924.$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.clli.network.rev191129.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev211210.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.external.pluggable.rev211210.$YangModuleInfoImpl
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev230526.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.external.pluggable.rev230526.$YangModuleInfoImpl
                     .getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.network.rev211210.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.$YangModuleInfoImpl
+            org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.network.rev230526.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.$YangModuleInfoImpl
                     .getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.$YangModuleInfoImpl
+            org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.$YangModuleInfoImpl
                     .getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.roadm.rev191129.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev211210.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev211210.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.srg.rev230526.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev230526.$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.$YangModuleInfoImpl
                     .getInstance(),
             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.$YangModuleInfoImpl
                     .getInstance(),
 
             // service models
-            org.opendaylight.yang.gen.v1.http.org.openroadm.ber.test.rev211210.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.ber.test.rev230526.$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.http.org.openroadm.common.ber.test.rev200529.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.$YangModuleInfoImpl
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.$YangModuleInfoImpl
                 .getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.controller.customization.rev211210.$YangModuleInfoImpl
+            org.opendaylight.yang.gen.v1.http.org.openroadm.controller.customization.rev230526.$YangModuleInfoImpl
                 .getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev211210.$YangModuleInfoImpl
+            org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.$YangModuleInfoImpl
                 .getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.$YangModuleInfoImpl
+            org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.$YangModuleInfoImpl
                 .getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev211210.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev230526.$YangModuleInfoImpl.getInstance(),
 
             // tapi models
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.oam.rev181210.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.$YangModuleInfoImpl
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.oam.rev221121.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev221121.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.$YangModuleInfoImpl
+                    .getInstance(),
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.$YangModuleInfoImpl
                     .getInstance(),
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.$YangModuleInfoImpl
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.path.computation.rev221121.$YangModuleInfoImpl
                     .getInstance(),
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.path.computation.rev181210.$YangModuleInfoImpl
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.eth.rev221121.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.$YangModuleInfoImpl
                     .getInstance(),
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.eth.rev181210.$YangModuleInfoImpl.getInstance(),
 
             // API models / opendaylight
             org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.alarmsuppression.rev171102
             .$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.$YangModuleInfoImpl
+            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.$YangModuleInfoImpl
                     .getInstance(),
             org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.$YangModuleInfoImpl
                     .getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.$YangModuleInfoImpl
+            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.$YangModuleInfoImpl
                     .getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.$YangModuleInfoImpl
+            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.$YangModuleInfoImpl
                     .getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev210408
+            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev230728
                     .$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004
                     .$YangModuleInfoImpl.getInstance(),
@@ -326,25 +305,22 @@ public final class TPCEUtils {
                     .getInstance(),
             org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.$YangModuleInfoImpl
                     .getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.gnpy.gnpy.api.rev220221.$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.gnpy.gnpy.eqpt.config.rev220221.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.gnpy.path.rev220221.$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316
+            org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.gnpy.path.rev220615.$YangModuleInfoImpl.getInstance(),
+            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221
                     .$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705
+            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501
                     .$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118
                     .$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.$YangModuleInfoImpl
                     .getInstance(),
-            org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.$YangModuleInfoImpl.getInstance(),
 
             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.rev080714.$YangModuleInfoImpl
                 .getInstance(),
-            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev170119.$YangModuleInfoImpl
-                    .getInstance(),
             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana.afn.safi.rev130704.$YangModuleInfoImpl
                     .getInstance(),
             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.$YangModuleInfoImpl
@@ -355,17 +331,13 @@ public final class TPCEUtils {
                     .getInstance(),
             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.$YangModuleInfoImpl
                     .getInstance(),
-            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.extension.rev131210
-                    .$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.monitoring.rev101004
                      .$YangModuleInfoImpl.getInstance(),
             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.netconf.notifications.rev120206
                      .$YangModuleInfoImpl.getInstance(),
-            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.restconf.rev131019.$YangModuleInfoImpl
-                    .getInstance(),
-            org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.tapi.rev180928.$YangModuleInfoImpl
+            org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.tapi.rev230728.$YangModuleInfoImpl
                     .getInstance(),
-            org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.$YangModuleInfoImpl
+            org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.$YangModuleInfoImpl
                     .getInstance());
 
     private static final Set<YangModuleInfo> TPCE_YANG_MODEL = Stream.concat(
index 98abb12dba47b8404d92cd21e9e210b5fbb57593..f3260e38788482bc38196da620316caee2e8a09b 100644 (file)
@@ -49,7 +49,7 @@ public class MaintTest {
     @Test
     public void startNoConfigFileTest() throws Exception {
         main.start(null, false, false, "3000", "2000", true);
-        ContentResponse response = client.GET("http://localhost:8181/restconf/config/ietf-network:networks/network/openroadm-topology");
+        ContentResponse response = client.GET("http://localhost:8181/restconf/data/ietf-network:networks/network=openroadm-topology");
         assertEquals("Response code should be 200", 200, response.getStatus());
     }
 
@@ -57,7 +57,7 @@ public class MaintTest {
     public void startConfigFileTest() throws Exception {
         File configFile = new File("src/test/resources/config.json");
         main.start(configFile.getAbsolutePath(), false, false, "3000", "2000", true);
-        ContentResponse response = client.GET("http://localhost:8888/restconfCustom/config/ietf-network:networks/network/openroadm-topology");
+        ContentResponse response = client.GET("http://localhost:8888/restconfCustom/data/ietf-network:networks/network=openroadm-topology");
         assertEquals("Response code should be 200", 200, response.getStatus());
     }
 }
index 761c4ee26e2f133d6d59924fd2324112e3fd0412..d770f00d2cf0b5caa78783922906599610fe8ae8 100644 (file)
@@ -2,8 +2,6 @@
     "restconf":{
         "inetAddress": "127.0.0.1",
         "httpPort":8888,
-        "webSocketPort": 8185,
-        "restconfServletContextPath":"/restconfCustom",
-        "jsonRestconfServiceType": "DRAFT_18"
+        "restconfServletContextPath":"/restconfCustom"
     }
 }
index 4cf525a3aea93200135563214a0a33999579a323..99c5a51946ae799a6b52f52dbadbc0b9d1d8e686 100644 (file)
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>8.0.11</version>
+    <version>13.0.1</version>
     <relativePath/>
   </parent>
 
   <groupId>org.opendaylight.transportpce</groupId>
   <artifactId>transportpce-nbinotifications</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
+  <version>10.0.0-SNAPSHOT</version>
   <packaging>bundle</packaging>
 
   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-    <kafka.version>3.0.0</kafka.version>
+    <transportpce.models.version>20.0.0-SNAPSHOT</transportpce.models.version>
+    <kafka.version>3.7.0</kafka.version>
   </properties>
 
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.opendaylight.transportpce.models</groupId>
+        <artifactId>transportpce-models-artifacts</artifactId>
+        <version>${transportpce.models.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
   <dependencies>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-common</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-service-13.1.0</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-service</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>tapi-2.4.0</artifactId>
     </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
       <groupId>org.opendaylight.mdsal</groupId>
       <artifactId>yang-binding</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>mdsal-common-api</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.opendaylight.mdsal</groupId>
       <artifactId>mdsal-binding-api</artifactId>
       <artifactId>kafka-clients</artifactId>
       <version>${kafka.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.service.component.annotations</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.service.metatype.annotations</artifactId>
+    </dependency>
 
     <!-- Testing Dependencies -->
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-13.1.0</artifactId>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
       <artifactId>test-common</artifactId>
       <artifactId>jackson-databind</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.skyscreamer</groupId>
+      <artifactId>jsonassert</artifactId>
+      <version>1.5.1</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>attach-dmaap-artifact</id>
+            <goals>
+              <goal>attach-artifact</goal>
+            </goals>
+            <configuration>
+              <artifacts>
+                <artifact>
+                  <file>${basedir}/src/main/resources/org.opendaylight.transportpce.nbinotifications.cfg</file>
+                  <type>cfg</type>
+                  <classifier>config</classifier>
+                </artifact>
+              </artifacts>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
 </project>
index 7ebc0bdf620cb09a11bc9e3e31fe691298374f5a..154cbb80f4d191bd225a8d24c2bc11f9d52d1de2 100644 (file)
@@ -18,6 +18,7 @@ import org.apache.kafka.clients.consumer.ConsumerConfig;
 import org.apache.kafka.clients.consumer.ConsumerRecord;
 import org.apache.kafka.clients.consumer.ConsumerRecords;
 import org.apache.kafka.clients.consumer.KafkaConsumer;
+import org.apache.kafka.common.TopicPartition;
 import org.apache.kafka.common.serialization.StringDeserializer;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.transportpce.common.converter.JsonStringConverter;
@@ -39,6 +40,7 @@ public class Subscriber<T extends DataObject, D> {
         Properties propsConsumer = NbiNotificationsUtils.loadProperties("subscriber.properties");
         propsConsumer.put(ConsumerConfig.GROUP_ID_CONFIG, groupId);
         propsConsumer.put(ConsumerConfig.CLIENT_ID_CONFIG, id);
+        propsConsumer.put(ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG, false);
         propsConsumer.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
         propsConsumer.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG , deserializerConf);
         propsConsumer.put(ConfigConstants.CONVERTER , deserializer);
@@ -55,7 +57,7 @@ public class Subscriber<T extends DataObject, D> {
         final ConsumerRecords<String, D> consumerRecords = consumer.poll(Duration.ofMillis(1000));
         List<D> notificationServiceList = new ArrayList<>();
         YangInstanceIdentifier.of(name);
-        for (ConsumerRecord<String, D> record : consumerRecords) {
+        for (ConsumerRecord<String, D> record : consumerRecords.records(new TopicPartition(topicName, 0))) {
             if (record.value() != null) {
                 notificationServiceList.add(record.value());
             }
diff --git a/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/NbiNotificationsImpl.java b/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/NbiNotificationsImpl.java
deleted file mode 100644 (file)
index 77f6f85..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright © 2020 Orange, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.transportpce.nbinotifications.impl;
-
-import com.google.common.util.concurrent.ListenableFuture;
-import java.util.List;
-import org.opendaylight.transportpce.common.converter.JsonStringConverter;
-import org.opendaylight.transportpce.nbinotifications.consumer.Subscriber;
-import org.opendaylight.transportpce.nbinotifications.serialization.NotificationAlarmServiceDeserializer;
-import org.opendaylight.transportpce.nbinotifications.serialization.NotificationServiceDeserializer;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.GetNotificationsAlarmServiceInput;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.GetNotificationsAlarmServiceOutput;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.GetNotificationsAlarmServiceOutputBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.GetNotificationsProcessServiceInput;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.GetNotificationsProcessServiceOutput;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.GetNotificationsProcessServiceOutputBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NbiNotificationsService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationAlarmService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationProcessService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.get.notifications.alarm.service.output.NotificationsAlarmService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.get.notifications.process.service.output.NotificationsProcessService;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class NbiNotificationsImpl implements NbiNotificationsService {
-    private static final Logger LOG = LoggerFactory.getLogger(NbiNotificationsImpl.class);
-    private final JsonStringConverter<NotificationProcessService> converterService;
-    private final JsonStringConverter<NotificationAlarmService> converterAlarmService;
-    private final String server;
-
-    public NbiNotificationsImpl(JsonStringConverter<NotificationProcessService> converterService,
-                                JsonStringConverter<NotificationAlarmService> converterAlarmService, String server) {
-        this.converterService = converterService;
-        this.converterAlarmService = converterAlarmService;
-        this.server = server;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<GetNotificationsProcessServiceOutput>> getNotificationsProcessService(
-            GetNotificationsProcessServiceInput input) {
-        LOG.info("RPC getNotificationsService received");
-        if (input == null || input.getIdConsumer() == null || input.getGroupId() == null) {
-            LOG.warn("Missing mandatory params for input {}", input);
-            return RpcResultBuilder.success(new GetNotificationsProcessServiceOutputBuilder().build()).buildFuture();
-        }
-        Subscriber<NotificationProcessService, NotificationsProcessService> subscriber = new Subscriber<>(
-                input.getIdConsumer(), input.getGroupId(), server, converterService,
-                NotificationServiceDeserializer.class);
-        List<NotificationsProcessService> notificationServiceList = subscriber
-                .subscribe(input.getConnectionType().getName(), NotificationsProcessService.QNAME);
-        return RpcResultBuilder.success(new GetNotificationsProcessServiceOutputBuilder()
-                .setNotificationsProcessService(notificationServiceList).build()).buildFuture();
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<GetNotificationsAlarmServiceOutput>> getNotificationsAlarmService(
-            GetNotificationsAlarmServiceInput input) {
-        LOG.info("RPC getNotificationsAlarmService received");
-        if (input == null || input.getIdConsumer() == null || input.getGroupId() == null) {
-            LOG.warn("Missing mandatory params for input {}", input);
-            return RpcResultBuilder.success(new GetNotificationsAlarmServiceOutputBuilder().build()).buildFuture();
-        }
-        Subscriber<NotificationAlarmService, NotificationsAlarmService> subscriber = new Subscriber<>(
-                input.getIdConsumer(), input.getGroupId(), server, converterAlarmService,
-                NotificationAlarmServiceDeserializer.class);
-        List<NotificationsAlarmService> notificationAlarmServiceList = subscriber
-                .subscribe("alarm" + input.getConnectionType().getName(), NotificationsAlarmService.QNAME);
-        return RpcResultBuilder.success(new GetNotificationsAlarmServiceOutputBuilder()
-                .setNotificationsAlarmService(notificationAlarmServiceList).build()).buildFuture();
-    }
-}
index 24c0383e4dbfb516383666a734612d217a8b5089..6c61bfa25ecf1c4c166d34c426e805ff9443b1fa 100644 (file)
  */
 package org.opendaylight.transportpce.nbinotifications.impl;
 
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
 import org.opendaylight.mdsal.binding.api.NotificationService;
 import org.opendaylight.mdsal.binding.api.RpcProviderService;
 import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.converter.JsonStringConverter;
-import org.opendaylight.transportpce.nbinotifications.listener.NbiNotificationsListenerImpl;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
+import org.opendaylight.transportpce.nbinotifications.impl.rpc.CreateNotificationSubscriptionServiceImpl;
+import org.opendaylight.transportpce.nbinotifications.impl.rpc.DeleteNotificationSubscriptionServiceImpl;
+import org.opendaylight.transportpce.nbinotifications.impl.rpc.GetNotificationListImpl;
+import org.opendaylight.transportpce.nbinotifications.impl.rpc.GetNotificationSubscriptionServiceDetailsImpl;
+import org.opendaylight.transportpce.nbinotifications.impl.rpc.GetNotificationSubscriptionServiceListImpl;
+import org.opendaylight.transportpce.nbinotifications.impl.rpc.GetNotificationsAlarmServiceImpl;
+import org.opendaylight.transportpce.nbinotifications.impl.rpc.GetNotificationsProcessServiceImpl;
+import org.opendaylight.transportpce.nbinotifications.impl.rpc.GetSupportedNotificationTypesImpl;
+import org.opendaylight.transportpce.nbinotifications.listener.NbiNotificationsHandler;
 import org.opendaylight.transportpce.nbinotifications.producer.Publisher;
-import org.opendaylight.transportpce.nbinotifications.serialization.NotificationAlarmServiceSerializer;
-import org.opendaylight.transportpce.nbinotifications.serialization.NotificationServiceSerializer;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NbiNotificationsListener;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NbiNotificationsService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationAlarmService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationProcessService;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.concepts.ObjectRegistration;
+import org.opendaylight.transportpce.nbinotifications.utils.TopicManager;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationAlarmService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationTapiService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Context;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.Context1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.context.NotificationContext;
+import org.opendaylight.yangtools.concepts.Registration;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@Component(configurationPid = "org.opendaylight.transportpce.nbinotifications")
 public class NbiNotificationsProvider {
 
+    @ObjectClassDefinition
+    public @interface Configuration {
+        @AttributeDefinition
+        String suscriberServer() default "";
+        @AttributeDefinition
+        String publisherServer() default "";
+    }
+
     private static final Logger LOG = LoggerFactory.getLogger(NbiNotificationsProvider.class);
-    private static Map<String, Publisher<NotificationProcessService>> publishersServiceMap =  new HashMap<>();
-    private static Map<String, Publisher<NotificationAlarmService>> publishersAlarmMap =  new HashMap<>();
-    private final RpcProviderService rpcService;
-    private final NotificationService notificationService;
-    private final JsonStringConverter<NotificationProcessService> converterService;
-    private final JsonStringConverter<NotificationAlarmService> converterAlarmService;
-    private final String subscriberServer;
-    private ObjectRegistration<NbiNotificationsService> rpcRegistration;
-    private ListenerRegistration<NbiNotificationsListener> listenerRegistration;
+    private Map<String, Publisher<NotificationProcessService>> publishersServiceMap;
+    private Map<String, Publisher<NotificationAlarmService>> publishersAlarmMap;
+    private Registration listenerRegistration;
+    private Registration rpcRegistration;
+    private NetworkTransactionService networkTransactionService;
 
+    @Activate
+    public NbiNotificationsProvider(@Reference RpcProviderService rpcProviderService,
+            @Reference NotificationService notificationService,
+            @Reference BindingDOMCodecServices bindingDOMCodecServices,
+            @Reference NetworkTransactionService networkTransactionService,
+            final Configuration configuration) {
+        this(configuration.suscriberServer(), configuration.publisherServer(), rpcProviderService, notificationService,
+                bindingDOMCodecServices, networkTransactionService);
+    }
 
-    public NbiNotificationsProvider(List<String> publishersService, List<String> publishersAlarm,
-            String subscriberServer, String publisherServer,
+    public NbiNotificationsProvider(String subscriberServer, String publisherServer,
             RpcProviderService rpcProviderService, NotificationService notificationService,
-            BindingDOMCodecServices bindingDOMCodecServices) {
-        this.rpcService = rpcProviderService;
-        this.notificationService = notificationService;
-        converterService =  new JsonStringConverter<>(bindingDOMCodecServices);
-        for (String publisherService: publishersService) {
+            BindingDOMCodecServices bindingDOMCodecServices, NetworkTransactionService networkTransactionService) {
+        this.networkTransactionService = networkTransactionService;
+        List<String> publishersServiceList = List.of("PceListener", "ServiceHandlerOperations", "ServiceHandler",
+                "RendererListener");
+        TopicManager topicManager = TopicManager.getInstance();
+        topicManager.setPublisherServer(publisherServer);
+        JsonStringConverter<NotificationProcessService> converterService =
+            new JsonStringConverter<>(bindingDOMCodecServices);
+        topicManager.setProcessConverter(converterService);
+        for (String publisherService: publishersServiceList) {
             LOG.info("Creating publisher for the following class {}", publisherService);
-            publishersServiceMap.put(publisherService, new Publisher<>(publisherService, publisherServer,
-                    converterService, NotificationServiceSerializer.class));
+            topicManager.addProcessTopic(publisherService);
         }
-        converterAlarmService = new JsonStringConverter<>(bindingDOMCodecServices);
-        for (String publisherAlarm: publishersAlarm) {
+        JsonStringConverter<NotificationAlarmService> converterAlarmService =
+                new JsonStringConverter<>(bindingDOMCodecServices);
+        topicManager.setAlarmConverter(converterAlarmService);
+        List<String> publishersAlarmList = List.of("ServiceListener");
+        for (String publisherAlarm: publishersAlarmList) {
             LOG.info("Creating publisher for the following class {}", publisherAlarm);
-            publishersAlarmMap.put(publisherAlarm, new Publisher<>(publisherAlarm, publisherServer,
-                    converterAlarmService, NotificationAlarmServiceSerializer.class));
+            topicManager.addAlarmTopic(publisherAlarm);
         }
-        this.subscriberServer = subscriberServer;
-    }
+        JsonStringConverter<NotificationTapiService> converterTapiService =
+                new JsonStringConverter<>(bindingDOMCodecServices);
+        LOG.info("tapi converter: {}", converterTapiService);
+        topicManager.setTapiConverter(converterTapiService);
 
-    /**
-     * Method called when the blueprint container is created.
-     */
-    public void init() {
+        rpcRegistration = rpcProviderService.registerRpcImplementations(
+                new GetNotificationsProcessServiceImpl(converterService, subscriberServer),
+                new GetNotificationsAlarmServiceImpl(converterAlarmService, subscriberServer),
+                new GetSupportedNotificationTypesImpl(this),
+                new CreateNotificationSubscriptionServiceImpl(this, topicManager),
+                new DeleteNotificationSubscriptionServiceImpl(networkTransactionService, topicManager),
+                new GetNotificationSubscriptionServiceDetailsImpl(this),
+                new GetNotificationSubscriptionServiceListImpl(this),
+                new GetNotificationListImpl(converterTapiService, subscriberServer, networkTransactionService,
+                        topicManager));
+
+        NbiNotificationsHandler notificationsListener = new NbiNotificationsHandler(
+            topicManager.getProcessTopicMap(), topicManager.getAlarmTopicMap(), topicManager.getTapiTopicMap());
+        listenerRegistration = notificationService.registerCompositeListener(
+            notificationsListener.getCompositeListener());
+        topicManager.setNbiNotificationsListener(notificationsListener);
+        publishersServiceMap = topicManager.getProcessTopicMap();
+        publishersAlarmMap = topicManager.getAlarmTopicMap();
         LOG.info("NbiNotificationsProvider Session Initiated");
-        rpcRegistration = rpcService.registerRpcImplementation(NbiNotificationsService.class,
-                new NbiNotificationsImpl(converterService, converterAlarmService, subscriberServer));
-        listenerRegistration = notificationService.registerNotificationListener(
-                new NbiNotificationsListenerImpl(publishersServiceMap, publishersAlarmMap));
     }
 
     /**
      * Method called when the blueprint container is destroyed.
      */
+    @Deactivate
     public void close() {
         for (Publisher<NotificationProcessService> publisher : publishersServiceMap.values()) {
             publisher.close();
@@ -88,4 +138,40 @@ public class NbiNotificationsProvider {
         LOG.info("NbiNotificationsProvider Closed");
     }
 
+    public NotificationContext getNotificationContext() {
+        LOG.info("Getting tapi notification context");
+        try {
+            Optional<NotificationContext> notificationContextOptional = this.networkTransactionService.read(
+                    LogicalDatastoreType.OPERATIONAL,
+                    InstanceIdentifier.builder(Context.class)
+                        .augmentation(Context1.class).child(NotificationContext.class)
+                        .build())
+                .get();
+            if (notificationContextOptional.isPresent()) {
+                return notificationContextOptional.orElseThrow();
+            }
+            LOG.debug("notification context is empty");
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Caught exception getting Notification Context", e);
+        }
+        LOG.error("Could not get TAPI notification context");
+        return null;
+    }
+
+    public boolean updateNotificationContext(NotificationContext notificationContext1) {
+        try {
+            this.networkTransactionService.merge(
+                    LogicalDatastoreType.OPERATIONAL,
+                    InstanceIdentifier.builder(Context.class)
+                        .augmentation(Context1.class).child(NotificationContext.class)
+                        .build(),
+                    notificationContext1);
+            this.networkTransactionService.commit().get();
+            return true;
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Could not update TAPI notification context");
+        }
+        return false;
+    }
+
 }
diff --git a/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/CreateNotificationSubscriptionServiceImpl.java b/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/CreateNotificationSubscriptionServiceImpl.java
new file mode 100644 (file)
index 0000000..b6b79f7
--- /dev/null
@@ -0,0 +1,112 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.nbinotifications.impl.rpc;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+import org.opendaylight.transportpce.nbinotifications.impl.NbiNotificationsProvider;
+import org.opendaylight.transportpce.nbinotifications.utils.TopicManager;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.CreateNotificationSubscriptionService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.CreateNotificationSubscriptionServiceInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.CreateNotificationSubscriptionServiceOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.CreateNotificationSubscriptionServiceOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.context.NotificationContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.context.NotificationContextBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.create.notification.subscription.service.output.SubscriptionService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.create.notification.subscription.service.output.SubscriptionServiceBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.context.NotifSubscription;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.context.NotifSubscriptionBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.context.NotifSubscriptionKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.context.Notification;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.context.NotificationKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.subscription.service.SubscriptionFilter;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.subscription.service.SubscriptionFilterBuilder;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class CreateNotificationSubscriptionServiceImpl implements CreateNotificationSubscriptionService {
+    private static final Logger LOG = LoggerFactory.getLogger(CreateNotificationSubscriptionServiceImpl.class);
+
+    private NbiNotificationsProvider nbiNotifications;
+    private final TopicManager topicManager;
+
+    public CreateNotificationSubscriptionServiceImpl(NbiNotificationsProvider nbiNotifications,
+            TopicManager topicManager) {
+        this.nbiNotifications = nbiNotifications;
+        this.topicManager = topicManager;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<CreateNotificationSubscriptionServiceOutput>> invoke(
+            CreateNotificationSubscriptionServiceInput input) {
+        for (Uuid uuid : input.getSubscriptionFilter().getRequestedObjectIdentifier()) {
+            LOG.info("Adding T-API topic: {} to Kafka server", uuid.getValue());
+            this.topicManager.addTapiTopic(uuid.getValue());
+        }
+        Uuid notifSubscriptionUuid = new Uuid(UUID.randomUUID().toString());
+        SubscriptionFilter subscriptionFilter = new SubscriptionFilterBuilder()
+            .setName(input.getSubscriptionFilter().getName())
+            .setLocalId(input.getSubscriptionFilter().getLocalId())
+            .setIncludeContent(input.getSubscriptionFilter().getIncludeContent())
+            .setRequestedNotificationTypes(input.getSubscriptionFilter().getRequestedNotificationTypes())
+            .setRequestedLayerProtocols(input.getSubscriptionFilter().getRequestedLayerProtocols())
+            .setRequestedObjectIdentifier(input.getSubscriptionFilter().getRequestedObjectIdentifier())
+            .setRequestedObjectTypes(input.getSubscriptionFilter().getRequestedObjectTypes())
+            .build();
+        SubscriptionService subscriptionService = new SubscriptionServiceBuilder()
+            .setUuid(notifSubscriptionUuid)
+            .setSubscriptionFilter(new HashMap<>(Map.of(subscriptionFilter.key(), subscriptionFilter)))
+            .setSubscriptionState(input.getSubscriptionState())
+            .build();
+        Map<NotifSubscriptionKey, NotifSubscription> notifSubscriptions = new HashMap<>(Map.of(
+            new NotifSubscriptionKey(notifSubscriptionUuid),
+            new NotifSubscriptionBuilder()
+                .setSubscriptionState(subscriptionService.getSubscriptionState())
+                .setSubscriptionFilter(subscriptionService.getSubscriptionFilter())
+                .setUuid(notifSubscriptionUuid)
+//            Following 2 items are no more in notification-context with T-API 2.4
+//              .setSupportedNotificationTypes(notificationTypes)
+//              .setSupportedObjectTypes(objectTypes)
+                .setName(subscriptionService.getName())
+                .build()));
+        Map<NotificationKey, Notification> notifications;
+        NotificationContext notificationContext = nbiNotifications.getNotificationContext();
+        if (notificationContext == null) {
+            notifications = new HashMap<>();
+        } else {
+            notifications = notificationContext.getNotification();
+            var subsc = notificationContext.getNotifSubscription();
+            if (subsc != null) {
+                notifSubscriptions.putAll(subsc);
+            }
+        }
+        if (nbiNotifications.updateNotificationContext(
+                new NotificationContextBuilder()
+                    .setNotification(notifications)
+                    .setNotifSubscription(notifSubscriptions)
+                    .build())) {
+            return RpcResultBuilder
+                .success(
+                    new CreateNotificationSubscriptionServiceOutputBuilder()
+                        .setSubscriptionService(subscriptionService)
+                        .build())
+                .buildFuture();
+        }
+        LOG.error("Failed to update Notification context");
+        return RpcResultBuilder.<CreateNotificationSubscriptionServiceOutput>failed()
+            .withError(ErrorType.RPC, "Failed to update notification context")
+            .buildFuture();
+    }
+}
diff --git a/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/DeleteNotificationSubscriptionServiceImpl.java b/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/DeleteNotificationSubscriptionServiceImpl.java
new file mode 100644 (file)
index 0000000..726d9c6
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.nbinotifications.impl.rpc;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
+import org.opendaylight.transportpce.nbinotifications.utils.TopicManager;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Context;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.Context1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.DeleteNotificationSubscriptionService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.DeleteNotificationSubscriptionServiceInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.DeleteNotificationSubscriptionServiceOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.DeleteNotificationSubscriptionServiceOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.context.NotificationContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.context.NotifSubscription;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.context.NotifSubscriptionKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.subscription.service.SubscriptionFilter;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.subscription.service.SubscriptionFilterKey;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class DeleteNotificationSubscriptionServiceImpl implements DeleteNotificationSubscriptionService {
+    private static final Logger LOG = LoggerFactory.getLogger(DeleteNotificationSubscriptionServiceImpl.class);
+
+    private final NetworkTransactionService networkTransactionService;
+    private final TopicManager topicManager;
+
+    public DeleteNotificationSubscriptionServiceImpl(
+            NetworkTransactionService networkTransactionService, TopicManager topicManager) {
+        this.networkTransactionService = networkTransactionService;
+        this.topicManager = topicManager;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<DeleteNotificationSubscriptionServiceOutput>> invoke(
+            DeleteNotificationSubscriptionServiceInput input) {
+        try {
+            if (input == null || input.getUuid() == null) {
+                LOG.warn("Missing mandatory params for input {}", input);
+                return RpcResultBuilder.<DeleteNotificationSubscriptionServiceOutput>failed()
+                    .withError(ErrorType.RPC, "Missing input parameters")
+                    .buildFuture();
+            }
+            Uuid notifSubsUuid = input.getUuid();
+            InstanceIdentifier<NotifSubscription> notifSubscriptionIID = InstanceIdentifier.builder(Context.class)
+                .augmentation(Context1.class)
+                .child(NotificationContext.class)
+                .child(NotifSubscription.class, new NotifSubscriptionKey(notifSubsUuid))
+                .build();
+            Optional<NotifSubscription> optionalNotifSub = this.networkTransactionService
+                .read(LogicalDatastoreType.OPERATIONAL, notifSubscriptionIID)
+                .get();
+            if (optionalNotifSub.isEmpty()) {
+                return RpcResultBuilder.<DeleteNotificationSubscriptionServiceOutput>failed()
+                    .withError(ErrorType.APPLICATION, "Notification subscription doesnt exist")
+                    .buildFuture();
+            }
+            NotifSubscription notifSubscription = optionalNotifSub.orElseThrow();
+            this.networkTransactionService.delete(LogicalDatastoreType.OPERATIONAL, notifSubscriptionIID);
+            this.networkTransactionService.commit().get();
+            for (Map.Entry<SubscriptionFilterKey, SubscriptionFilter> sfEntry :
+                    notifSubscription.getSubscriptionFilter().entrySet()) {
+                for (Uuid objectUuid:sfEntry.getValue().getRequestedObjectIdentifier()) {
+                    this.topicManager.deleteTapiTopic(objectUuid.getValue());
+                }
+            }
+            return RpcResultBuilder
+                .success(new DeleteNotificationSubscriptionServiceOutputBuilder().build())
+                .buildFuture();
+        } catch (InterruptedException | ExecutionException | NoSuchElementException e) {
+            LOG.error("Failed to delete Notification subscription service", e);
+        }
+        return RpcResultBuilder.<DeleteNotificationSubscriptionServiceOutput>failed()
+            .withError(ErrorType.APPLICATION, "Failed to delete notification subscription service")
+            .buildFuture();
+    }
+}
diff --git a/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/GetNotificationListImpl.java b/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/GetNotificationListImpl.java
new file mode 100644 (file)
index 0000000..acfc4bf
--- /dev/null
@@ -0,0 +1,120 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.nbinotifications.impl.rpc;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.transportpce.common.converter.JsonStringConverter;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
+import org.opendaylight.transportpce.nbinotifications.consumer.Subscriber;
+import org.opendaylight.transportpce.nbinotifications.serialization.TapiNotificationDeserializer;
+import org.opendaylight.transportpce.nbinotifications.utils.TopicManager;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationTapiService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Context;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.Context1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.GetNotificationList;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.GetNotificationListInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.GetNotificationListOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.GetNotificationListOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.context.NotificationContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.get.notification.list.output.Notification;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.get.notification.list.output.NotificationKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.context.NotifSubscription;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.context.NotifSubscriptionKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.subscription.service.SubscriptionFilter;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.subscription.service.SubscriptionFilterKey;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class GetNotificationListImpl implements GetNotificationList {
+    private static final Logger LOG = LoggerFactory.getLogger(GetNotificationListImpl.class);
+
+    private final JsonStringConverter<NotificationTapiService> converterTapiService;
+    private final String server;
+    private final NetworkTransactionService networkTransactionService;
+    private final TopicManager topicManager;
+
+    public GetNotificationListImpl(JsonStringConverter<NotificationTapiService> converterTapiService, String server,
+            NetworkTransactionService networkTransactionService, TopicManager topicManager) {
+        this.converterTapiService = converterTapiService;
+        this.server = server;
+        this.networkTransactionService = networkTransactionService;
+        this.topicManager = topicManager;
+    }
+
+
+    @Override
+    public ListenableFuture<RpcResult<GetNotificationListOutput>> invoke(GetNotificationListInput input) {
+        try {
+            LOG.info("RPC getNotificationList received");
+            if (input == null || input.getSubscriptionId() == null) {
+                LOG.warn("Missing mandatory params for input {}", input);
+                return RpcResultBuilder.<GetNotificationListOutput>failed()
+                    .withError(ErrorType.RPC, "Missing input parameters")
+                    .buildFuture();
+            }
+            Uuid notifSubsUuid = input.getSubscriptionId();
+            Optional<NotifSubscription> optionalNotifSub = this.networkTransactionService
+                .read(
+                    LogicalDatastoreType.OPERATIONAL,
+                    InstanceIdentifier.builder(Context.class).augmentation(Context1.class)
+                        .child(NotificationContext.class)
+                        .child(NotifSubscription.class, new NotifSubscriptionKey(notifSubsUuid))
+                        .build())
+                .get();
+            if (optionalNotifSub.isEmpty()) {
+                return RpcResultBuilder.<GetNotificationListOutput>failed()
+                    .withError(ErrorType.APPLICATION, "Notification subscription doesnt exist")
+                    .buildFuture();
+            }
+            NotifSubscription notifSubscription = optionalNotifSub.orElseThrow();
+            List<Notification> notificationTapiList = new ArrayList<>();
+            for (Map.Entry<SubscriptionFilterKey, SubscriptionFilter> sfEntry :
+                    notifSubscription.getSubscriptionFilter().entrySet()) {
+                for (Uuid objectUuid:sfEntry.getValue().getRequestedObjectIdentifier()) {
+                    if (!this.topicManager.getTapiTopicMap().containsKey(objectUuid.getValue())) {
+                        LOG.warn("Topic doesnt exist for {}", objectUuid.getValue());
+                        continue;
+                    }
+                    LOG.info("Going to get notifications for topic {}", objectUuid.getValue());
+                    Subscriber<NotificationTapiService, Notification> subscriber = new Subscriber<>(
+                        objectUuid.getValue(), objectUuid.getValue(), server, converterTapiService,
+                        TapiNotificationDeserializer.class);
+                    notificationTapiList.addAll(subscriber.subscribe(objectUuid.getValue(), Notification.QNAME));
+                }
+            }
+            LOG.info("TAPI notifications = {}", notificationTapiList);
+            Map<NotificationKey, Notification> notificationMap = new HashMap<>();
+            for (Notification notif:notificationTapiList) {
+                notificationMap.put(notif.key(), notif);
+            }
+            return RpcResultBuilder
+                .success(new GetNotificationListOutputBuilder().setNotification(notificationMap).build())
+                .buildFuture();
+        } catch (InterruptedException | ExecutionException | NoSuchElementException e) {
+            LOG.error("Failed to get Notifications from Kafka", e);
+        }
+        return RpcResultBuilder.<GetNotificationListOutput>failed()
+            .withError(ErrorType.APPLICATION, "Notifications couldnt be retrieved from Kafka server")
+            .buildFuture();
+    }
+
+}
diff --git a/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/GetNotificationSubscriptionServiceDetailsImpl.java b/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/GetNotificationSubscriptionServiceDetailsImpl.java
new file mode 100644 (file)
index 0000000..e054bf4
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.nbinotifications.impl.rpc;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.transportpce.nbinotifications.impl.NbiNotificationsProvider;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.GetNotificationSubscriptionServiceDetails;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.GetNotificationSubscriptionServiceDetailsInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.GetNotificationSubscriptionServiceDetailsOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.GetNotificationSubscriptionServiceDetailsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.context.NotificationContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.get.notification.subscription.service.details.output.SubscriptionServiceBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.context.NotifSubscriptionKey;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class GetNotificationSubscriptionServiceDetailsImpl implements GetNotificationSubscriptionServiceDetails {
+    private static final Logger LOG = LoggerFactory.getLogger(GetNotificationSubscriptionServiceDetailsImpl.class);
+
+    private NbiNotificationsProvider nbiNotifications;
+
+    public GetNotificationSubscriptionServiceDetailsImpl(NbiNotificationsProvider nbiNotifications) {
+        this.nbiNotifications = nbiNotifications;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<GetNotificationSubscriptionServiceDetailsOutput>> invoke(
+            GetNotificationSubscriptionServiceDetailsInput input) {
+        if (input == null || input.getUuid() == null) {
+            LOG.warn("Missing mandatory params for input {}", input);
+            return RpcResultBuilder.<GetNotificationSubscriptionServiceDetailsOutput>failed()
+                .withError(ErrorType.RPC, "Missing input parameters")
+                .buildFuture();
+        }
+        Uuid notifSubsUuid = input.getUuid();
+        NotificationContext notificationContext = nbiNotifications.getNotificationContext();
+        if (notificationContext == null) {
+            return RpcResultBuilder.<GetNotificationSubscriptionServiceDetailsOutput>failed()
+                .withError(ErrorType.APPLICATION, "Notification context is empty")
+                .buildFuture();
+        }
+        var subsc = notificationContext.getNotifSubscription();
+        if (subsc == null) {
+            return RpcResultBuilder
+                .success(
+                    new GetNotificationSubscriptionServiceDetailsOutputBuilder()
+                        .setSubscriptionService(new SubscriptionServiceBuilder().build())
+                        .build())
+                .buildFuture();
+        }
+        if (subsc.containsKey(new NotifSubscriptionKey(notifSubsUuid))) {
+            return RpcResultBuilder
+                .success(
+                    new GetNotificationSubscriptionServiceDetailsOutputBuilder()
+                        .setSubscriptionService(
+                            new SubscriptionServiceBuilder(subsc.get(new NotifSubscriptionKey(notifSubsUuid))).build())
+                        .build())
+                .buildFuture();
+        }
+        return RpcResultBuilder.<GetNotificationSubscriptionServiceDetailsOutput>failed()
+            .withError(ErrorType.APPLICATION, "Notification subscription service doesnt exist")
+            .buildFuture();
+
+    }
+
+}
diff --git a/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/GetNotificationSubscriptionServiceListImpl.java b/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/GetNotificationSubscriptionServiceListImpl.java
new file mode 100644 (file)
index 0000000..b533ac9
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.nbinotifications.impl.rpc;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.HashMap;
+import java.util.Map;
+import org.opendaylight.transportpce.nbinotifications.impl.NbiNotificationsProvider;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.GetNotificationSubscriptionServiceList;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.GetNotificationSubscriptionServiceListInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.GetNotificationSubscriptionServiceListOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.GetNotificationSubscriptionServiceListOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.context.NotificationContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.get.notification.subscription.service.list.output.SubscriptionService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.get.notification.subscription.service.list.output.SubscriptionServiceBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.get.notification.subscription.service.list.output.SubscriptionServiceKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.context.NotifSubscription;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+
+
+public class GetNotificationSubscriptionServiceListImpl implements GetNotificationSubscriptionServiceList {
+
+    private NbiNotificationsProvider nbiNotifications;
+
+    public GetNotificationSubscriptionServiceListImpl(NbiNotificationsProvider nbiNotifications) {
+        this.nbiNotifications = nbiNotifications;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<GetNotificationSubscriptionServiceListOutput>> invoke(
+            GetNotificationSubscriptionServiceListInput input) {
+        NotificationContext notificationContext = nbiNotifications.getNotificationContext();
+        if (notificationContext == null) {
+            return RpcResultBuilder.<GetNotificationSubscriptionServiceListOutput>failed()
+                .withError(ErrorType.APPLICATION, "Notification context is empty")
+                .buildFuture();
+        }
+        if (notificationContext.getNotifSubscription() == null) {
+            return RpcResultBuilder
+                .success(new GetNotificationSubscriptionServiceListOutputBuilder()
+                    .setSubscriptionService(new HashMap<>())
+                    .build())
+                .buildFuture();
+        }
+        Map<SubscriptionServiceKey, SubscriptionService> notifSubsMap = new HashMap<>();
+        for (NotifSubscription notifSubscription:notificationContext.getNotifSubscription().values()) {
+            SubscriptionService subscriptionService = new SubscriptionServiceBuilder(notifSubscription).build();
+            notifSubsMap.put(subscriptionService.key(), subscriptionService);
+        }
+        return RpcResultBuilder
+            .success(
+                new GetNotificationSubscriptionServiceListOutputBuilder().setSubscriptionService(notifSubsMap).build())
+            .buildFuture();
+    }
+
+}
diff --git a/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/GetNotificationsAlarmServiceImpl.java b/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/GetNotificationsAlarmServiceImpl.java
new file mode 100644 (file)
index 0000000..6dd1256
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.nbinotifications.impl.rpc;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.transportpce.common.converter.JsonStringConverter;
+import org.opendaylight.transportpce.nbinotifications.consumer.Subscriber;
+import org.opendaylight.transportpce.nbinotifications.serialization.NotificationAlarmServiceDeserializer;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.GetNotificationsAlarmService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.GetNotificationsAlarmServiceInput;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.GetNotificationsAlarmServiceOutput;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.GetNotificationsAlarmServiceOutputBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationAlarmService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.get.notifications.alarm.service.output.NotificationsAlarmService;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class GetNotificationsAlarmServiceImpl implements GetNotificationsAlarmService {
+    private static final Logger LOG = LoggerFactory.getLogger(GetNotificationsAlarmServiceImpl.class);
+
+    private final JsonStringConverter<NotificationAlarmService> converterAlarmService;
+    private final String server;
+
+    public GetNotificationsAlarmServiceImpl(JsonStringConverter<NotificationAlarmService> converterAlarmService,
+            String server) {
+        this.converterAlarmService = converterAlarmService;
+        this.server = server;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<GetNotificationsAlarmServiceOutput>> invoke(
+            GetNotificationsAlarmServiceInput input) {
+        LOG.info("RPC getNotificationsAlarmService received");
+        if (input == null || input.getIdConsumer() == null || input.getGroupId() == null) {
+            LOG.warn("Missing mandatory params for input {}", input);
+            return RpcResultBuilder.success(new GetNotificationsAlarmServiceOutputBuilder().build()).buildFuture();
+        }
+        return RpcResultBuilder
+            .success(new GetNotificationsAlarmServiceOutputBuilder()
+                .setNotificationsAlarmService(
+                    new Subscriber<NotificationAlarmService, NotificationsAlarmService>(
+                            input.getIdConsumer(), input.getGroupId(), server, converterAlarmService,
+                            NotificationAlarmServiceDeserializer.class)
+                        .subscribe("alarm" + input.getConnectionType().getName(), NotificationsAlarmService.QNAME))
+                .build())
+            .buildFuture();
+    }
+
+}
diff --git a/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/GetNotificationsProcessServiceImpl.java b/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/GetNotificationsProcessServiceImpl.java
new file mode 100644 (file)
index 0000000..67e092b
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.nbinotifications.impl.rpc;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.transportpce.common.converter.JsonStringConverter;
+import org.opendaylight.transportpce.nbinotifications.consumer.Subscriber;
+import org.opendaylight.transportpce.nbinotifications.serialization.NotificationServiceDeserializer;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.GetNotificationsProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.GetNotificationsProcessServiceInput;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.GetNotificationsProcessServiceOutput;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.GetNotificationsProcessServiceOutputBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.get.notifications.process.service.output.NotificationsProcessService;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class GetNotificationsProcessServiceImpl implements GetNotificationsProcessService {
+    private static final Logger LOG = LoggerFactory.getLogger(GetNotificationsProcessServiceImpl.class);
+
+    private final JsonStringConverter<NotificationProcessService> converterService;
+    private final String server;
+
+    public GetNotificationsProcessServiceImpl(JsonStringConverter<NotificationProcessService> converterService,
+            String server) {
+        this.converterService = converterService;
+        this.server = server;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<GetNotificationsProcessServiceOutput>> invoke(
+            GetNotificationsProcessServiceInput input) {
+        LOG.info("RPC getNotificationsService received");
+        if (input == null || input.getIdConsumer() == null || input.getGroupId() == null) {
+            LOG.warn("Missing mandatory params for input {}", input);
+            return RpcResultBuilder.success(new GetNotificationsProcessServiceOutputBuilder().build()).buildFuture();
+        }
+        return RpcResultBuilder
+            .success(
+                new GetNotificationsProcessServiceOutputBuilder()
+                    .setNotificationsProcessService(
+                        new Subscriber<NotificationProcessService, NotificationsProcessService>(
+                                input.getIdConsumer(), input.getGroupId(), server, converterService,
+                                NotificationServiceDeserializer.class)
+                            .subscribe(input.getConnectionType().getName(), NotificationsProcessService.QNAME))
+                    .build())
+            .buildFuture();
+    }
+}
diff --git a/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/GetSupportedNotificationTypesImpl.java b/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/impl/rpc/GetSupportedNotificationTypesImpl.java
new file mode 100644 (file)
index 0000000..91dc75c
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.nbinotifications.impl.rpc;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.HashSet;
+import java.util.Set;
+import org.opendaylight.transportpce.nbinotifications.impl.NbiNotificationsProvider;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OBJECTTYPE;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OBJECTTYPEPROFILE;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OBJECTTYPESERVICEINTERFACEPOINT;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OBJECTTYPETAPICONTEXT;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CONNECTIVITYOBJECTTYPE;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CONNECTIVITYOBJECTTYPECONNECTION;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CONNECTIVITYOBJECTTYPECONNECTIONENDPOINT;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CONNECTIVITYOBJECTTYPECONNECTIVITYSERVICE;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.GetSupportedNotificationTypes;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.GetSupportedNotificationTypesInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.GetSupportedNotificationTypesOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.GetSupportedNotificationTypesOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.NOTIFICATIONTYPE;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.NOTIFICATIONTYPEATTRIBUTEVALUECHANGE;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.NOTIFICATIONTYPEOBJECTCREATION;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.NOTIFICATIONTYPEOBJECTDELETION;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.context.NotificationContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.TOPOLOGYOBJECTTYPEINTERRULEGROUP;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.TOPOLOGYOBJECTTYPELINK;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.TOPOLOGYOBJECTTYPENODE;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.TOPOLOGYOBJECTTYPENODEEDGEPOINT;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.TOPOLOGYOBJECTTYPENODERULEGROUP;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+
+
+public class GetSupportedNotificationTypesImpl implements GetSupportedNotificationTypes {
+
+    private NbiNotificationsProvider nbiNotifications;
+
+    public GetSupportedNotificationTypesImpl(NbiNotificationsProvider nbiNotifications) {
+        this.nbiNotifications = nbiNotifications;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<GetSupportedNotificationTypesOutput>> invoke(
+            GetSupportedNotificationTypesInput input) {
+        NotificationContext notificationContext = nbiNotifications.getNotificationContext();
+        if (notificationContext == null) {
+            return RpcResultBuilder.<GetSupportedNotificationTypesOutput>failed()
+                .withError(ErrorType.APPLICATION, "Couldnt get Notification Context from Datastore")
+                .buildFuture();
+        }
+        //TAPI 2.4 removes supported notification types from notif-subscription list and notification-context
+        //No way to store what notification types are supported
+        //Considers that by default all notification are supported
+        Set<NOTIFICATIONTYPE> notificationTypeList = new HashSet<>();
+        notificationTypeList.add(NOTIFICATIONTYPEOBJECTCREATION.VALUE);
+        notificationTypeList.add(NOTIFICATIONTYPEOBJECTDELETION.VALUE);
+        notificationTypeList.add(NOTIFICATIONTYPEATTRIBUTEVALUECHANGE.VALUE);
+//
+//        if (notificationContext.getNotifSubscription() == null) {
+//            return RpcResultBuilder.success(new GetSupportedNotificationTypesOutputBuilder()
+//                .setSupportedNotificationTypes(new HashSet<>())
+//                .setSupportedObjectTypes(new HashSet<>()).build()).buildFuture();
+//        }
+//        Set<NOTIFICATIONTYPE> notificationTypeList = new HashSet<>();
+
+        //TAPI 2.4 removes supported object types from notif-subscription list and notification-context
+        //No way to store what object types are supported
+        //Considers that by default all object are supported
+        Set<OBJECTTYPE> objectTypeList = new HashSet<>();
+        objectTypeList.add(OBJECTTYPESERVICEINTERFACEPOINT.VALUE);
+        objectTypeList.add(OBJECTTYPETAPICONTEXT.VALUE);
+        objectTypeList.add(OBJECTTYPEPROFILE.VALUE);
+        objectTypeList.add(TOPOLOGYOBJECTTYPENODE.VALUE);
+        objectTypeList.add(TOPOLOGYOBJECTTYPELINK.VALUE);
+        objectTypeList.add(TOPOLOGYOBJECTTYPENODEEDGEPOINT.VALUE);
+        objectTypeList.add(TOPOLOGYOBJECTTYPENODERULEGROUP.VALUE);
+        objectTypeList.add(TOPOLOGYOBJECTTYPEINTERRULEGROUP.VALUE);
+        objectTypeList.add(CONNECTIVITYOBJECTTYPE.VALUE);
+        objectTypeList.add(CONNECTIVITYOBJECTTYPECONNECTIVITYSERVICE.VALUE);
+        objectTypeList.add(CONNECTIVITYOBJECTTYPECONNECTIONENDPOINT.VALUE);
+        objectTypeList.add(CONNECTIVITYOBJECTTYPECONNECTION.VALUE);
+//        for (NotifSubscription notifSubscription:notificationContext.getNotifSubscription().values()) {
+//            if (notifSubscription.getSupportedNotificationTypes() != null) {
+//                notificationTypeList.addAll(notifSubscription.getSupportedNotificationTypes());
+//            }
+//            if (notifSubscription.getSupportedObjectTypes() != null) {
+//                objectTypeList.addAll(notifSubscription.getSupportedObjectTypes());
+//            }
+//        }
+        return RpcResultBuilder.success(new GetSupportedNotificationTypesOutputBuilder()
+            .setSupportedNotificationTypes(notificationTypeList)
+            .setSupportedObjectTypes(objectTypeList).build()).buildFuture();
+    }
+
+}
diff --git a/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/listener/NbiNotificationsHandler.java b/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/listener/NbiNotificationsHandler.java
new file mode 100644 (file)
index 0000000..917f40c
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ * Copyright © 2020 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.nbinotifications.listener;
+
+import java.util.Map;
+import java.util.Set;
+import org.opendaylight.mdsal.binding.api.NotificationService.CompositeListener;
+import org.opendaylight.transportpce.nbinotifications.producer.Publisher;
+import org.opendaylight.transportpce.nbinotifications.utils.NbiNotificationsUtils;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationAlarmService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationAlarmServiceBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationProcessServiceBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationTapiService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationTapiServiceBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationAlarmService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishTapiNotificationService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class NbiNotificationsHandler {
+    private static final Logger LOG = LoggerFactory.getLogger(NbiNotificationsHandler.class);
+    private Map<String, Publisher<NotificationProcessService>> publishersServiceMap;
+    private Map<String, Publisher<NotificationAlarmService>> publishersAlarmMap;
+    private Map<String, Publisher<NotificationTapiService>> tapiPublisherMap;
+
+    public NbiNotificationsHandler(Map<String, Publisher<NotificationProcessService>> publishersServiceMap,
+                                        Map<String, Publisher<NotificationAlarmService>> publishersAlarmMap,
+                                        Map<String, Publisher<NotificationTapiService>> tapiPublisherMap) {
+        this.publishersServiceMap = publishersServiceMap;
+        this.publishersAlarmMap = publishersAlarmMap;
+        this.tapiPublisherMap = tapiPublisherMap;
+    }
+
+    public CompositeListener getCompositeListener() {
+        return new CompositeListener(Set.of(
+            new CompositeListener.Component<>(
+                PublishNotificationProcessService.class, this::onPublishNotificationProcessService),
+            new CompositeListener.Component<>(
+                PublishNotificationAlarmService.class, this::onPublishNotificationAlarmService),
+            new CompositeListener.Component<>(
+                PublishTapiNotificationService.class, this::onPublishTapiNotificationService)
+        ));
+    }
+
+    void onPublishNotificationProcessService(PublishNotificationProcessService notification) {
+        LOG.info("Receiving request for publishing notification service");
+        String publisherName = notification.getPublisherName();
+        if (!publishersServiceMap.containsKey(publisherName)) {
+            LOG.error("Unknown publisher {}", publisherName);
+            return;
+        }
+        Publisher<NotificationProcessService> publisher = publishersServiceMap.get(publisherName);
+        NotificationProcessServiceBuilder notificationProcessServiceBuilder = new NotificationProcessServiceBuilder()
+                .setCommonId(notification.getCommonId())
+                .setConnectionType(notification.getConnectionType())
+                .setMessage(notification.getMessage())
+                .setOperationalState(notification.getOperationalState())
+                .setResponseFailed(notification.getResponseFailed())
+                .setServiceAEnd(notification.getServiceAEnd())
+                .setServiceName(notification.getServiceName())
+                .setServiceZEnd(notification.getServiceZEnd());
+
+        if (notification.getIsTempService() == null || !notification.getIsTempService()) {
+            publisher.sendEvent(notificationProcessServiceBuilder
+                .build(), notification.getConnectionType().getName());
+        } else {
+            // A-to-Z and Z-to-A containers are only needed for temp-service-create notification
+            publisher.sendEvent(notificationProcessServiceBuilder
+                    .setAToZ(notification.getAToZ())
+                    .setZToA(notification.getZToA())
+                    .build(), notification.getConnectionType().getName());
+        }
+    }
+
+    void onPublishNotificationAlarmService(PublishNotificationAlarmService notification) {
+        LOG.info("Receiving request for publishing notification alarm service");
+        String publisherName = notification.getPublisherName();
+        if (!publishersAlarmMap.containsKey(publisherName)) {
+            LOG.error("Unknown topic {}", publisherName);
+            return;
+        }
+        Publisher<NotificationAlarmService> publisherAlarm = publishersAlarmMap.get(publisherName);
+        publisherAlarm.sendEvent(new NotificationAlarmServiceBuilder()
+                .setConnectionType(notification.getConnectionType())
+                .setMessage(notification.getMessage())
+                .setOperationalState(notification.getOperationalState())
+                .setServiceName(notification.getServiceName())
+                        .build(), "alarm" + notification.getConnectionType().getName());
+    }
+
+    void onPublishTapiNotificationService(PublishTapiNotificationService notification) {
+        LOG.info("Receiving request for publishing TAPI notification");
+        String topic = notification.getTopic();
+        if (!tapiPublisherMap.containsKey(topic)) {
+            LOG.error("Unknown topic {}", topic);
+            return;
+        }
+        Publisher<NotificationTapiService> publisher = tapiPublisherMap.get(topic);
+        publisher.sendEvent(new NotificationTapiServiceBuilder(
+                NbiNotificationsUtils.transformTapiNotification(notification)).build(), topic);
+    }
+
+    public void setPublishersServiceMap(Map<String, Publisher<NotificationProcessService>> publishersServiceMap) {
+        this.publishersServiceMap = publishersServiceMap;
+    }
+
+    public void setPublishersAlarmMap(Map<String, Publisher<NotificationAlarmService>> publishersAlarmMap) {
+        this.publishersAlarmMap = publishersAlarmMap;
+    }
+
+    public void setTapiPublishersMap(Map<String, Publisher<NotificationTapiService>> tapiPublishersMap) {
+        this.tapiPublisherMap = tapiPublishersMap;
+    }
+
+    public Publisher<NotificationTapiService> getTapiPublisherFromTopic(String topic) {
+        return this.tapiPublisherMap.get(topic);
+    }
+}
diff --git a/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/listener/NbiNotificationsListenerImpl.java b/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/listener/NbiNotificationsListenerImpl.java
deleted file mode 100644 (file)
index 37b4c01..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright © 2020 Orange, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.transportpce.nbinotifications.listener;
-
-import java.util.Map;
-import org.opendaylight.transportpce.nbinotifications.producer.Publisher;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NbiNotificationsListener;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationAlarmService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationAlarmServiceBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationProcessService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationProcessServiceBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationAlarmService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationProcessService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class NbiNotificationsListenerImpl implements NbiNotificationsListener {
-    private static final Logger LOG = LoggerFactory.getLogger(NbiNotificationsListenerImpl.class);
-    private final Map<String, Publisher<NotificationProcessService>> publishersServiceMap;
-    private final Map<String, Publisher<NotificationAlarmService>> publishersAlarmMap;
-
-    public NbiNotificationsListenerImpl(Map<String, Publisher<NotificationProcessService>> publishersServiceMap,
-                                        Map<String, Publisher<NotificationAlarmService>> publishersAlarmMap) {
-        this.publishersServiceMap = publishersServiceMap;
-        this.publishersAlarmMap = publishersAlarmMap;
-    }
-
-    @Override
-    public void onPublishNotificationProcessService(PublishNotificationProcessService notification) {
-        LOG.info("Receiving request for publishing notification service");
-        String publisherName = notification.getPublisherName();
-        if (!publishersServiceMap.containsKey(publisherName)) {
-            LOG.error("Unknown publisher {}", publisherName);
-            return;
-        }
-        Publisher<NotificationProcessService> publisher = publishersServiceMap.get(publisherName);
-        publisher.sendEvent(new NotificationProcessServiceBuilder()
-                .setCommonId(notification.getCommonId())
-                .setConnectionType(notification.getConnectionType())
-                .setMessage(notification.getMessage())
-                .setOperationalState(notification.getOperationalState())
-                .setResponseFailed(notification.getResponseFailed())
-                .setServiceAEnd(notification.getServiceAEnd())
-                .setServiceName(notification.getServiceName())
-                .setServiceZEnd(notification.getServiceZEnd())
-                        .build(), notification.getConnectionType().getName());
-    }
-
-    @Override
-    public void onPublishNotificationAlarmService(PublishNotificationAlarmService notification) {
-        LOG.info("Receiving request for publishing notification alarm service");
-        String publisherName = notification.getPublisherName();
-        if (!publishersAlarmMap.containsKey(publisherName)) {
-            LOG.error("Unknown topic {}", publisherName);
-            return;
-        }
-        Publisher<NotificationAlarmService> publisherAlarm = publishersAlarmMap.get(publisherName);
-        publisherAlarm.sendEvent(new NotificationAlarmServiceBuilder()
-                .setConnectionType(notification.getConnectionType())
-                .setMessage(notification.getMessage())
-                .setOperationalState(notification.getOperationalState())
-                .setServiceName(notification.getServiceName())
-                        .build(), "alarm" + notification.getConnectionType().getName());
-    }
-}
index c08dbfb2fa9ceda56cd4a45569f65738437271a1..018e7f3bd4e6c82303da6ad92cfb18792ef8e109 100644 (file)
@@ -11,9 +11,9 @@ import java.nio.charset.StandardCharsets;
 import java.util.Map;
 import org.apache.kafka.common.serialization.Deserializer;
 import org.opendaylight.transportpce.common.converter.JsonStringConverter;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationAlarmService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.get.notifications.alarm.service.output.NotificationsAlarmService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.get.notifications.alarm.service.output.NotificationsAlarmServiceBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationAlarmService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.get.notifications.alarm.service.output.NotificationsAlarmService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.get.notifications.alarm.service.output.NotificationsAlarmServiceBuilder;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
 import org.slf4j.Logger;
index 9d0371a125cab43fab04588c34d0267a470c83d4..2d403abc3f5a915fcdab281a3f09acd1c7a39971 100644 (file)
@@ -12,7 +12,7 @@ import java.nio.charset.StandardCharsets;
 import java.util.Map;
 import org.apache.kafka.common.serialization.Serializer;
 import org.opendaylight.transportpce.common.converter.JsonStringConverter;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationAlarmService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationAlarmService;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
 import org.slf4j.Logger;
index eab7f3618f9eb031e94a0c789a850f8d2b8d62fc..1a6f996f6119e162ce739f5eb6f88969210806a9 100644 (file)
@@ -11,9 +11,9 @@ import java.nio.charset.StandardCharsets;
 import java.util.Map;
 import org.apache.kafka.common.serialization.Deserializer;
 import org.opendaylight.transportpce.common.converter.JsonStringConverter;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationProcessService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.get.notifications.process.service.output.NotificationsProcessService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.get.notifications.process.service.output.NotificationsProcessServiceBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.get.notifications.process.service.output.NotificationsProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.get.notifications.process.service.output.NotificationsProcessServiceBuilder;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
 import org.slf4j.Logger;
@@ -51,7 +51,7 @@ public class NotificationServiceDeserializer implements Deserializer<Notificatio
             return null;
         }
         LOG.info("Reading event {}", mappedString);
-        return new NotificationsProcessServiceBuilder()
+        NotificationsProcessServiceBuilder notificationsProcessServiceBuilder = new NotificationsProcessServiceBuilder()
                 .setCommonId(mappedString.getCommonId())
                 .setConnectionType(mappedString.getConnectionType())
                 .setMessage(mappedString.getMessage())
@@ -59,8 +59,14 @@ public class NotificationServiceDeserializer implements Deserializer<Notificatio
                 .setResponseFailed(mappedString.getResponseFailed())
                 .setServiceName(mappedString.getServiceName())
                 .setServiceAEnd(mappedString.getServiceAEnd())
-                .setServiceZEnd(mappedString.getServiceZEnd())
-                .build();
+                .setServiceZEnd(mappedString.getServiceZEnd());
+        if (mappedString.getIsTempService()) {
+            return notificationsProcessServiceBuilder
+                    .setAToZ(mappedString.getAToZ())
+                    .setZToA(mappedString.getZToA())
+                    .build();
+        }
+        return notificationsProcessServiceBuilder.build();
     }
 
 }
index dc2c3d775737d8a290baf77416d4f4726a90224b..55c9c1c7d8451c20e32f1cef182afacfce193bab 100644 (file)
@@ -12,7 +12,7 @@ import java.nio.charset.StandardCharsets;
 import java.util.Map;
 import org.apache.kafka.common.serialization.Serializer;
 import org.opendaylight.transportpce.common.converter.JsonStringConverter;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationProcessService;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
 import org.slf4j.Logger;
diff --git a/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/serialization/TapiNotificationDeserializer.java b/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/serialization/TapiNotificationDeserializer.java
new file mode 100644 (file)
index 0000000..ac08d83
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ * Copyright © 2021 Nokia, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.nbinotifications.serialization;
+
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.kafka.common.serialization.Deserializer;
+import org.opendaylight.transportpce.common.converter.JsonStringConverter;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationTapiService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.get.notification.list.output.Notification;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.get.notification.list.output.NotificationBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.AdditionalInfo;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.AdditionalInfoBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.AdditionalInfoKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.ChangedAttributes;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.ChangedAttributesBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.ChangedAttributesKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.TargetObjectName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.TargetObjectNameBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.TargetObjectNameKey;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TapiNotificationDeserializer implements Deserializer<Notification> {
+    private static final Logger LOG = LoggerFactory.getLogger(TapiNotificationDeserializer.class);
+    private JsonStringConverter<NotificationTapiService> converter;
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public void configure(Map<String, ?> configs, boolean isKey) {
+        LOG.info("Tapi Deserializer configuration {}", configs);
+        if (configs.containsKey(ConfigConstants.CONVERTER)
+            && configs.get(ConfigConstants.CONVERTER) instanceof JsonStringConverter<?>) {
+            converter = (JsonStringConverter<NotificationTapiService>) configs.get(ConfigConstants.CONVERTER);
+        }
+    }
+
+    @Override
+    public Notification deserialize(String topic, byte[] data) {
+        if (converter == null) {
+            throw new IllegalArgumentException(
+                "Converter should be configured through configure method of deserializer");
+        }
+        String value = new String(data, StandardCharsets.UTF_8);
+        // The message published is
+        // org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationTapiService
+        // we have to map it to
+        // org.opendaylight.yang.gen.v1
+        // .urn.onf.otcc.yang.tapi.notification.rev221121.get.notification.list.output.Notification
+        NotificationTapiService mappedString = converter.createDataObjectFromJsonString(
+            YangInstanceIdentifier.of(NotificationTapiService.QNAME), value, JSONCodecFactorySupplier.RFC7951);
+        if (mappedString == null) {
+            return null;
+        }
+        LOG.info("Reading Tapi event {}", mappedString);
+        return transformNotificationTapiService(mappedString);
+    }
+
+    private Notification transformNotificationTapiService(NotificationTapiService mappedString) {
+        LOG.info("Transforming TAPI notification for getNotificationList rpc");
+        Map<AdditionalInfoKey, AdditionalInfo> addInfoMap = new HashMap<>();
+        if (mappedString.getAdditionalInfo() != null) {
+            for (org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.tapi.service.AdditionalInfo
+                    addInfo:mappedString.getAdditionalInfo().values()) {
+                AdditionalInfo transAddInfo = new AdditionalInfoBuilder()
+                    .setValue(addInfo.getValue())
+                    .setValueName(addInfo.getValueName())
+                    .build();
+                addInfoMap.put(transAddInfo.key(), transAddInfo);
+            }
+        }
+        Map<ChangedAttributesKey, ChangedAttributes> changedAttMap = new HashMap<>();
+        if (mappedString.getChangedAttributes() != null) {
+            for (org.opendaylight.yang.gen.v1
+                    .nbi.notifications.rev230728.notification.tapi.service.ChangedAttributes changedAtt:mappedString
+                        .getChangedAttributes().values()) {
+                ChangedAttributes transChangedAtt = new ChangedAttributesBuilder(changedAtt).build();
+                changedAttMap.put(transChangedAtt.key(), transChangedAtt);
+            }
+        }
+        Map<NameKey, Name> nameMap = new HashMap<>();
+        if (mappedString.getName() != null) {
+            for (Name name:mappedString.getName().values()) {
+                Name transName = new NameBuilder(name).build();
+                nameMap.put(transName.key(), transName);
+            }
+        }
+        Map<TargetObjectNameKey, TargetObjectName> targetObjNameMap = new HashMap<>();
+        if (mappedString.getTargetObjectName() != null) {
+            for (org.opendaylight.yang.gen.v1
+                    .nbi.notifications.rev230728.notification.tapi.service.TargetObjectName
+                        targetObjectName:mappedString.getTargetObjectName().values()) {
+                TargetObjectName transTargetObjName = new TargetObjectNameBuilder(targetObjectName).build();
+                targetObjNameMap.put(transTargetObjName.key(), transTargetObjName);
+            }
+        }
+
+//       In TAPI 2.4 get-notifcation-list, there is no more alarm-info and Tca-info
+        LOG.info("Notification uuid = {}", mappedString.getUuid().getValue());
+        return new NotificationBuilder()
+//            .setAlarmInfo(mappedString.getAlarmInfo() == null ? null
+//                : new AlarmInfoBuilder(mappedString.getAlarmInfo()).build())
+            .setAdditionalText(mappedString.getAdditionalText())
+            .setAdditionalInfo(addInfoMap)
+            .setNotificationType(mappedString.getNotificationType())
+            .setChangedAttributes(changedAttMap)
+            .setEventTimeStamp(mappedString.getEventTimeStamp())
+            .setLayerProtocolName(mappedString.getLayerProtocolName())
+            .setName(nameMap)
+            .setSequenceNumber(mappedString.getSequenceNumber())
+            .setSourceIndicator(mappedString.getSourceIndicator())
+            .setTargetObjectIdentifier(mappedString.getTargetObjectIdentifier())
+            .setTargetObjectName(targetObjNameMap)
+            .setTargetObjectType(mappedString.getTargetObjectType())
+//            .setTcaInfo(mappedString.getTcaInfo() == null ? null
+//                : new TcaInfoBuilder(mappedString.getTcaInfo()).build())
+            .setUuid(mappedString.getUuid())
+            .build();
+    }
+}
+
diff --git a/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/serialization/TapiNotificationSerializer.java b/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/serialization/TapiNotificationSerializer.java
new file mode 100644 (file)
index 0000000..38bcce0
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright © 2021 Nokia, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.nbinotifications.serialization;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.Map;
+import org.apache.kafka.common.serialization.Serializer;
+import org.opendaylight.transportpce.common.converter.JsonStringConverter;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationTapiService;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TapiNotificationSerializer implements Serializer<NotificationTapiService> {
+    private static final Logger LOG = LoggerFactory.getLogger(TapiNotificationSerializer.class);
+    private JsonStringConverter<NotificationTapiService> converter;
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public void configure(Map<String, ?> configs, boolean isKey) {
+        LOG.info("Deserializer configuration {}", configs);
+        if (configs.containsKey(ConfigConstants.CONVERTER)
+                && configs.get(ConfigConstants.CONVERTER) instanceof JsonStringConverter<?>) {
+            converter = (JsonStringConverter<NotificationTapiService>) configs.get(ConfigConstants.CONVERTER);
+        }
+    }
+
+    @Override
+    public byte[] serialize(String topic, NotificationTapiService data) {
+        if (converter == null) {
+            throw new IllegalArgumentException(
+                    "Converter should be configured through configure method of serializer");
+        }
+        if (data == null) {
+            LOG.error("Notification data is empty");
+            return new byte[0];
+        }
+        try {
+            InstanceIdentifier<NotificationTapiService> iid = InstanceIdentifier.builder(NotificationTapiService.class)
+                .build();
+            String serialized = converter.createJsonStringFromDataObject(iid, data, JSONCodecFactorySupplier.RFC7951);
+            LOG.info("Serialized event {}", serialized);
+            return serialized.getBytes(StandardCharsets.UTF_8);
+        } catch (IOException e) {
+            LOG.error("Event couldnt be serialized", e);
+            return new byte[0];
+        }
+    }
+}
index af097c35b86d1ec0b222a59126c97f77ad95338b..582aaa02d37289838eaf70b668b892abeb41317a 100644 (file)
@@ -9,7 +9,24 @@ package org.opendaylight.transportpce.nbinotifications.utils;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.Map;
 import java.util.Properties;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationTapiService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationTapiServiceBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishTapiNotificationService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.tapi.service.AdditionalInfo;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.tapi.service.AdditionalInfoBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.tapi.service.AdditionalInfoKey;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.tapi.service.ChangedAttributes;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.tapi.service.ChangedAttributesBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.tapi.service.ChangedAttributesKey;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.tapi.service.TargetObjectName;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.tapi.service.TargetObjectNameBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.tapi.service.TargetObjectNameKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -34,4 +51,40 @@ public final class NbiNotificationsUtils {
         }
         return props;
     }
+
+    public static NotificationTapiService transformTapiNotification(PublishTapiNotificationService notification) {
+        Map<AdditionalInfoKey, AdditionalInfo> addInfoMap = notification.nonnullAdditionalInfo().values().stream()
+            .collect(Collectors.toMap(
+                    e -> new AdditionalInfoKey(e.getValueName()),
+                    e -> new AdditionalInfoBuilder(e).build()));
+        Map<ChangedAttributesKey, ChangedAttributes> changedAttMap = notification.nonnullChangedAttributes().values()
+                .stream().collect(Collectors.toMap(
+                        e -> new ChangedAttributesKey(e.getValueName()),
+                        e -> new ChangedAttributesBuilder(e).build()));
+        Map<NameKey, Name> nameMap = notification.nonnullName().values().stream()
+                .collect(Collectors.toMap(Name::key, Function.identity()));
+        Map<TargetObjectNameKey, TargetObjectName> targetObjNameMap = notification.nonnullTargetObjectName().values()
+                .stream().collect(Collectors.toMap(
+                        e -> new TargetObjectNameKey(e.getValueName()),
+                        e -> new TargetObjectNameBuilder(e).build()));
+        LOG.info("Notification uuid = {}", notification.getUuid());
+
+        return new NotificationTapiServiceBuilder()
+                .setAlarmInfo(notification.getAlarmInfo())
+                .setAdditionalText(notification.getAdditionalText())
+                .setAdditionalInfo(addInfoMap)
+                .setNotificationType(notification.getNotificationType())
+                .setChangedAttributes(changedAttMap)
+                .setEventTimeStamp(notification.getEventTimeStamp())
+                .setLayerProtocolName(notification.getLayerProtocolName())
+                .setName(nameMap)
+                .setSequenceNumber(notification.getSequenceNumber())
+                .setSourceIndicator(notification.getSourceIndicator())
+                .setTargetObjectIdentifier(notification.getTargetObjectIdentifier())
+                .setTargetObjectName(targetObjNameMap)
+                .setTargetObjectType(notification.getTargetObjectType())
+                .setTcaInfo(notification.getTcaInfo())
+                .setUuid(notification.getUuid())
+                .build();
+    }
 }
diff --git a/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/utils/TopicManager.java b/nbinotifications/src/main/java/org/opendaylight/transportpce/nbinotifications/utils/TopicManager.java
new file mode 100644 (file)
index 0000000..89dc7cb
--- /dev/null
@@ -0,0 +1,119 @@
+/*
+ * Copyright © 2021 Nokia, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.nbinotifications.utils;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.opendaylight.transportpce.common.converter.JsonStringConverter;
+import org.opendaylight.transportpce.nbinotifications.listener.NbiNotificationsHandler;
+import org.opendaylight.transportpce.nbinotifications.producer.Publisher;
+import org.opendaylight.transportpce.nbinotifications.serialization.NotificationAlarmServiceSerializer;
+import org.opendaylight.transportpce.nbinotifications.serialization.NotificationServiceSerializer;
+import org.opendaylight.transportpce.nbinotifications.serialization.TapiNotificationSerializer;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationAlarmService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationTapiService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class TopicManager {
+
+    private static final Logger LOG = LoggerFactory.getLogger(TopicManager.class);
+    private static TopicManager instance = new TopicManager();
+
+    private Map<String, Publisher<NotificationTapiService>> tapiPublisherMap = new HashMap<>();
+    private String publisherServer;
+    private JsonStringConverter<NotificationTapiService> tapiConverter;
+    private NbiNotificationsHandler nbiNotificationsListener;
+    private Map<String, Publisher<NotificationAlarmService>> alarmPublisherMap = new HashMap<>();
+    private Map<String, Publisher<NotificationProcessService>> processPublisherMap = new HashMap<>();
+    private JsonStringConverter<NotificationProcessService> processConverter;
+    private JsonStringConverter<NotificationAlarmService> alarmConverter;
+
+    private TopicManager() {
+    }
+
+    public static TopicManager getInstance() {
+        return instance;
+    }
+
+    public void setNbiNotificationsListener(NbiNotificationsHandler nbiNotificationsListener) {
+        this.nbiNotificationsListener = nbiNotificationsListener;
+    }
+
+    public void setProcessConverter(JsonStringConverter<NotificationProcessService> processConverter) {
+        this.processConverter = processConverter;
+    }
+
+    public void setAlarmConverter(JsonStringConverter<NotificationAlarmService> alarmConverter) {
+        this.alarmConverter = alarmConverter;
+    }
+
+    public void setTapiConverter(JsonStringConverter<NotificationTapiService> tapiConverter) {
+        this.tapiConverter = tapiConverter;
+    }
+
+    public void setPublisherServer(String publisherServer) {
+        this.publisherServer = publisherServer;
+    }
+
+    public void addProcessTopic(String topic) {
+        LOG.info("Adding process topic: {}", topic);
+        processPublisherMap.put(topic, new Publisher<>(topic, publisherServer, processConverter,
+            NotificationServiceSerializer.class));
+        if (this.nbiNotificationsListener != null) {
+            this.nbiNotificationsListener.setPublishersServiceMap(processPublisherMap);
+        }
+    }
+
+    public void addAlarmTopic(String topic) {
+        LOG.info("Adding alarm topic: {}", topic);
+        alarmPublisherMap.put(topic, new Publisher<>(topic, publisherServer, alarmConverter,
+                NotificationAlarmServiceSerializer.class));
+        if (this.nbiNotificationsListener != null) {
+            this.nbiNotificationsListener.setPublishersAlarmMap(alarmPublisherMap);
+        }
+    }
+
+    public void addTapiTopic(String topic) {
+        if (tapiPublisherMap.containsKey(topic)) {
+            LOG.info("Tapi topic: {} already exists", topic);
+            return;
+        }
+        LOG.info("Adding new tapi topic: {}", topic);
+        tapiPublisherMap.put(topic, new Publisher<>(topic, publisherServer, tapiConverter,
+            TapiNotificationSerializer.class));
+        if (this.nbiNotificationsListener != null) {
+            this.nbiNotificationsListener.setTapiPublishersMap(tapiPublisherMap);
+        }
+    }
+
+    public void deleteTapiTopic(String topic) {
+        if (!tapiPublisherMap.containsKey(topic)) {
+            LOG.info("Tapi topic: {} doesnt exist", topic);
+            return;
+        }
+        LOG.info("Deleting tapi topic: {}", topic);
+        tapiPublisherMap.remove(topic);
+        if (this.nbiNotificationsListener != null) {
+            this.nbiNotificationsListener.setTapiPublishersMap(tapiPublisherMap);
+        }
+    }
+
+    public Map<String, Publisher<NotificationTapiService>> getTapiTopicMap() {
+        return this.tapiPublisherMap;
+    }
+
+    public Map<String, Publisher<NotificationAlarmService>> getAlarmTopicMap() {
+        return this.alarmPublisherMap;
+    }
+
+    public Map<String, Publisher<NotificationProcessService>> getProcessTopicMap() {
+        return this.processPublisherMap;
+    }
+}
diff --git a/nbinotifications/src/main/resources/OSGI-INF/blueprint/nobinotifications-blueprint.xml b/nbinotifications/src/main/resources/OSGI-INF/blueprint/nobinotifications-blueprint.xml
deleted file mode 100644 (file)
index d938b9d..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- vi: set et smarttab sw=4 tabstop=4: -->
-<!-- Copyright © 2020 Orange and others. All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution,
-    and is available at http://www.eclipse.org/legal/epl-v10.html -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
-xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
-    odl:use-default-for-reference-types="true">
-    <cm:property-placeholder persistent-id="org.opendaylight.transportpce.nbinotifications" update-strategy="reload">
-        <cm:default-properties>
-            <cm:property name="suscriber.server" value="" />
-            <cm:property name="publisher.server" value="" />
-        </cm:default-properties>
-    </cm:property-placeholder>
-    <reference id="rpcService" interface="org.opendaylight.mdsal.binding.api.RpcProviderService"/>
-    <reference id="notificationService" interface="org.opendaylight.mdsal.binding.api.NotificationService"/>
-    <reference id="bindingDOMCodecServices" interface="org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices" />
-    <bean id="provider"
-        class="org.opendaylight.transportpce.nbinotifications.impl.NbiNotificationsProvider"
-        init-method="init" destroy-method="close">
-        <argument>
-            <list value-type="java.lang.String">
-                <value>PceListener</value>
-                <value>ServiceHandlerOperations</value>
-                <value>ServiceHandler</value>
-                <value>RendererListener</value>
-            </list>
-        </argument>
-        <argument>
-            <list value-type="java.lang.String">
-                <value>ServiceListener</value>
-            </list>
-        </argument>
-        <argument value="${suscriber.server}"/>
-        <argument value="${publisher.server}"/>
-        <argument ref="rpcService" />
-        <argument ref="notificationService" />
-        <argument ref="bindingDOMCodecServices" />
-    </bean>
-</blueprint>
index 7e5fcf615a00f5bbb55194a2df6fe253b3fe44f5..af6fdca091e3e627ee3f8825d4a037e839f587cd 100644 (file)
@@ -7,8 +7,9 @@
  */
 package org.opendaylight.transportpce.nbinotifications.consumer;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.Collections;
 import java.util.HashMap;
@@ -18,33 +19,39 @@ import org.apache.kafka.clients.consumer.ConsumerRecord;
 import org.apache.kafka.clients.consumer.MockConsumer;
 import org.apache.kafka.clients.consumer.OffsetResetStrategy;
 import org.apache.kafka.common.TopicPartition;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.transportpce.nbinotifications.utils.NotificationServiceDataUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationAlarmService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationProcessService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.get.notifications.alarm.service.output.NotificationsAlarmService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.get.notifications.process.service.output.NotificationsProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationAlarmService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationTapiService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.get.notifications.alarm.service.output.NotificationsAlarmService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.get.notifications.process.service.output.NotificationsProcessService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.get.notification.list.output.Notification;
 
 public class SubscriberTest extends AbstractTest {
     private static final String TOPIC = "topic";
     private static final int PARTITION = 0;
     private MockConsumer<String, NotificationsProcessService> mockConsumer;
     private MockConsumer<String, NotificationsAlarmService> mockConsumerAlarm;
+    private MockConsumer<String, Notification> mockConsumerTapi;
     private Subscriber<NotificationProcessService, NotificationsProcessService> subscriberService;
     private Subscriber<NotificationAlarmService, NotificationsAlarmService> subscriberAlarmService;
+    private Subscriber<NotificationTapiService, Notification> subscriberTapiService;
 
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp() {
         mockConsumer = new MockConsumer<>(OffsetResetStrategy.EARLIEST);
         mockConsumerAlarm = new MockConsumer<>(OffsetResetStrategy.EARLIEST);
+        mockConsumerTapi = new MockConsumer<>(OffsetResetStrategy.EARLIEST);
         subscriberService = new Subscriber<>(mockConsumer);
         subscriberAlarmService = new Subscriber<>(mockConsumerAlarm);
+        subscriberTapiService = new Subscriber<>(mockConsumerTapi);
     }
 
     @Test
-    public void subscribeServiceShouldBeSuccessful() {
+    void subscribeServiceShouldBeSuccessful() {
         // from https://www.baeldung.com/kafka-mockconsumer
         ConsumerRecord<String, NotificationsProcessService> record = new ConsumerRecord<>(
                 TOPIC, PARTITION, 0L, "key", NotificationServiceDataUtils.buildReceivedEvent());
@@ -59,12 +66,12 @@ public class SubscriberTest extends AbstractTest {
         mockConsumer.updateBeginningOffsets(startOffsets);
         List<NotificationsProcessService> result = subscriberService.subscribe(TOPIC,
                 NotificationsProcessService.QNAME);
-        assertEquals("There should be 1 record", 1, result.size());
-        assertTrue("Consumer should be closed", mockConsumer.closed());
+        assertEquals(1, result.size(), "There should be 1 record");
+        assertTrue(mockConsumer.closed(), "Consumer should be closed");
     }
 
     @Test
-    public void subscribeAlarmShouldBeSuccessful() {
+    void subscribeAlarmShouldBeSuccessful() {
         // from https://www.baeldung.com/kafka-mockconsumer
         ConsumerRecord<String, NotificationsAlarmService> record = new ConsumerRecord<>(
                 TOPIC, PARTITION, 0L, "key", NotificationServiceDataUtils.buildReceivedAlarmEvent());
@@ -79,7 +86,27 @@ public class SubscriberTest extends AbstractTest {
         mockConsumerAlarm.updateBeginningOffsets(startOffsets);
         List<NotificationsAlarmService> result = subscriberAlarmService.subscribe(TOPIC,
                 NotificationsAlarmService.QNAME);
-        assertEquals("There should be 1 record", 1, result.size());
-        assertTrue("Consumer should be closed", mockConsumerAlarm.closed());
+        assertEquals(1, result.size(), "There should be 1 record");
+        assertTrue(mockConsumerAlarm.closed(), "Consumer should be closed");
+    }
+
+    @Test
+    void subscribeTapiAlarmShouldBeSuccessful() {
+        // from https://www.baeldung.com/kafka-mockconsumer
+        ConsumerRecord<String, Notification> record = new ConsumerRecord<>(
+            TOPIC, PARTITION, 0L, "key", NotificationServiceDataUtils.buildReceivedTapiAlarmEvent());
+        mockConsumerTapi.schedulePollTask(() -> {
+            mockConsumerTapi.rebalance(Collections.singletonList(new TopicPartition(TOPIC, PARTITION)));
+            mockConsumerTapi.addRecord(record);
+        });
+
+        Map<TopicPartition, Long> startOffsets = new HashMap<>();
+        TopicPartition tp = new TopicPartition(TOPIC, PARTITION);
+        startOffsets.put(tp, 0L);
+        mockConsumerTapi.updateBeginningOffsets(startOffsets);
+        List<Notification> result = subscriberTapiService.subscribe(TOPIC,
+            NotificationTapiService.QNAME);
+        assertEquals(1, result.size(), "There should be 1 record");
+        assertTrue(mockConsumerTapi.closed(), "Consumer should be closed");
     }
 }
index 825193f01fdc95c221dd0d0d144321cdda322474..4bb418e842280fa8f8d035feec6167d5941ce69f 100644 (file)
  */
 package org.opendaylight.transportpce.nbinotifications.impl;
 
-import static org.junit.Assert.assertNull;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
 
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.concurrent.ExecutionException;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.opendaylight.mdsal.binding.api.NotificationService;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
 import org.opendaylight.transportpce.common.converter.JsonStringConverter;
+import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
+import org.opendaylight.transportpce.nbinotifications.impl.rpc.CreateNotificationSubscriptionServiceImpl;
+import org.opendaylight.transportpce.nbinotifications.impl.rpc.GetNotificationListImpl;
+import org.opendaylight.transportpce.nbinotifications.impl.rpc.GetNotificationsAlarmServiceImpl;
+import org.opendaylight.transportpce.nbinotifications.impl.rpc.GetNotificationsProcessServiceImpl;
+import org.opendaylight.transportpce.nbinotifications.utils.NotificationServiceDataUtils;
+import org.opendaylight.transportpce.nbinotifications.utils.TopicManager;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ConnectionType;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.GetNotificationsAlarmServiceInputBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.GetNotificationsAlarmServiceOutput;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.GetNotificationsProcessServiceInputBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.GetNotificationsProcessServiceOutput;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationAlarmService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationProcessService;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ConnectionType;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.GetNotificationsAlarmServiceInputBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.GetNotificationsAlarmServiceOutput;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.GetNotificationsProcessServiceInputBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.GetNotificationsProcessServiceOutput;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationAlarmService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationTapiService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.CreateNotificationSubscriptionServiceOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.GetNotificationListInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.GetNotificationListOutput;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 
+@ExtendWith(MockitoExtension.class)
 public class NbiNotificationsImplTest extends AbstractTest {
-    private NbiNotificationsImpl nbiNotificationsImpl;
 
-    @Before
-    public void setUp() {
-        JsonStringConverter<NotificationProcessService> converter = new JsonStringConverter<>(
-                getDataStoreContextUtil().getBindingDOMCodecServices());
-        JsonStringConverter<NotificationAlarmService> converterAlarm = new JsonStringConverter<>(
-                getDataStoreContextUtil().getBindingDOMCodecServices());
-        nbiNotificationsImpl = new NbiNotificationsImpl(converter, converterAlarm,"localhost:8080");
+    @Mock
+    RpcProviderService rpcProviderRegistry;
+    @Mock
+    private NotificationService notificationService;
+
+    private NbiNotificationsProvider nbiNotifications;
+    public static NetworkTransactionService networkTransactionService;
+    private TopicManager topicManager;
+    private JsonStringConverter<NotificationProcessService> converterProcess;
+    private JsonStringConverter<NotificationAlarmService> converterAlarm;
+    private JsonStringConverter<NotificationTapiService> converterTapi;
+
+    @BeforeEach
+    void setUp() throws ExecutionException, InterruptedException {
+        topicManager = TopicManager.getInstance();
+        networkTransactionService = new NetworkTransactionImpl(getDataBroker());
+        converterProcess = new JsonStringConverter<>(getDataStoreContextUtil().getBindingDOMCodecServices());
+        converterAlarm = new JsonStringConverter<>(getDataStoreContextUtil().getBindingDOMCodecServices());
+        converterTapi = new JsonStringConverter<>(getDataStoreContextUtil().getBindingDOMCodecServices());
+        topicManager.setTapiConverter(converterTapi);
+        NotificationServiceDataUtils.createTapiContext(networkTransactionService);
+
+        nbiNotifications = new NbiNotificationsProvider("localhost:8080", "localhost:8080",
+                rpcProviderRegistry, notificationService, getDataStoreContextUtil().getBindingDOMCodecServices(),
+                networkTransactionService);
     }
 
     @Test
-    public void getNotificationsServiceEmptyDataTest() throws InterruptedException, ExecutionException {
+    void getNotificationsServiceEmptyDataTest() throws InterruptedException, ExecutionException {
         ListenableFuture<RpcResult<GetNotificationsProcessServiceOutput>> result =
-                nbiNotificationsImpl.getNotificationsProcessService(
-                        new GetNotificationsProcessServiceInputBuilder().build());
-        assertNull("Should be null", result.get().getResult().getNotificationsProcessService());
+            new GetNotificationsProcessServiceImpl(converterProcess, "localhost:8080")
+                .invoke(new GetNotificationsProcessServiceInputBuilder().build());
+        assertNull(result.get().getResult().getNotificationsProcessService(), "Should be null");
     }
 
     @Test
-    public void getNotificationsServiceTest() throws InterruptedException, ExecutionException {
-        GetNotificationsProcessServiceInputBuilder builder = new GetNotificationsProcessServiceInputBuilder()
-                .setGroupId("groupId")
-                .setIdConsumer("consumerId")
-                .setConnectionType(ConnectionType.Service);
+    void getNotificationsServiceTest() throws InterruptedException, ExecutionException {
         ListenableFuture<RpcResult<GetNotificationsProcessServiceOutput>> result =
-                nbiNotificationsImpl.getNotificationsProcessService(builder.build());
-        assertNull("Should be null", result.get().getResult().getNotificationsProcessService());
+            new GetNotificationsProcessServiceImpl(converterProcess, "localhost:8080")
+                .invoke(new GetNotificationsProcessServiceInputBuilder()
+                    .setGroupId("groupId")
+                    .setIdConsumer("consumerId")
+                    .setConnectionType(ConnectionType.Service)
+                    .build());
+        assertNull(result.get().getResult().getNotificationsProcessService(), "Should be null");
     }
 
     @Test
-    public void getNotificationsAlarmServiceTest() throws InterruptedException, ExecutionException {
-        GetNotificationsAlarmServiceInputBuilder builder = new GetNotificationsAlarmServiceInputBuilder()
-                .setGroupId("groupId")
-                .setIdConsumer("consumerId")
-                .setConnectionType(ConnectionType.Service);
+    void getNotificationsAlarmServiceTest() throws InterruptedException, ExecutionException {
         ListenableFuture<RpcResult<GetNotificationsAlarmServiceOutput>> result =
-                nbiNotificationsImpl.getNotificationsAlarmService(builder.build());
-        assertNull("Should be null", result.get().getResult().getNotificationsAlarmService());
+            new GetNotificationsAlarmServiceImpl(converterAlarm, "localhost:8080")
+                .invoke(new GetNotificationsAlarmServiceInputBuilder()
+                    .setGroupId("groupId")
+                    .setIdConsumer("consumerId")
+                    .setConnectionType(ConnectionType.Service)
+                    .build());
+        assertNull(result.get().getResult().getNotificationsAlarmService(), "Should be null");
+    }
+
+    @Test
+    void createTapiNotificationSubscriptionServiceTest() throws InterruptedException, ExecutionException {
+        ListenableFuture<RpcResult<CreateNotificationSubscriptionServiceOutput>> result =
+            new CreateNotificationSubscriptionServiceImpl(nbiNotifications, topicManager)
+                .invoke(NotificationServiceDataUtils.buildNotificationSubscriptionServiceInputBuilder().build());
+        assertNotNull(result.get().getResult().getSubscriptionService().getUuid().toString(),
+            "Should receive UUID for subscription service");
+    }
+
+    @Test
+    void getTapiNotificationsServiceTest() throws InterruptedException, ExecutionException {
+        ListenableFuture<RpcResult<CreateNotificationSubscriptionServiceOutput>> result =
+                new CreateNotificationSubscriptionServiceImpl(nbiNotifications, topicManager)
+            .invoke(NotificationServiceDataUtils.buildNotificationSubscriptionServiceInputBuilder().build());
+        ListenableFuture<RpcResult<GetNotificationListOutput>> result2 =
+            new GetNotificationListImpl(converterTapi, "localhost:8080", networkTransactionService, topicManager)
+                .invoke(new GetNotificationListInputBuilder()
+                    .setTimeRange(null)
+                    .setSubscriptionId(result.get().getResult().getSubscriptionService().getUuid())
+                    .build());
+        assertNull(result2.get().getResult().getNotification(), "Should be null");
     }
 }
index 2b917aab040360084fd2006133e0f0421b1b6414..bed0d1ccde3ecf60cced51ddbf698e9c1dfe5698 100644 (file)
@@ -11,40 +11,54 @@ import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 
-import java.util.Arrays;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.opendaylight.mdsal.binding.api.NotificationService;
 import org.opendaylight.mdsal.binding.api.RpcProviderService;
-import org.opendaylight.transportpce.nbinotifications.listener.NbiNotificationsListenerImpl;
+import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
+import org.opendaylight.transportpce.nbinotifications.impl.rpc.CreateNotificationSubscriptionServiceImpl;
+import org.opendaylight.transportpce.nbinotifications.impl.rpc.DeleteNotificationSubscriptionServiceImpl;
+import org.opendaylight.transportpce.nbinotifications.impl.rpc.GetNotificationListImpl;
+import org.opendaylight.transportpce.nbinotifications.impl.rpc.GetNotificationSubscriptionServiceDetailsImpl;
+import org.opendaylight.transportpce.nbinotifications.impl.rpc.GetNotificationSubscriptionServiceListImpl;
+import org.opendaylight.transportpce.nbinotifications.impl.rpc.GetNotificationsAlarmServiceImpl;
+import org.opendaylight.transportpce.nbinotifications.impl.rpc.GetNotificationsProcessServiceImpl;
+import org.opendaylight.transportpce.nbinotifications.impl.rpc.GetSupportedNotificationTypesImpl;
 import org.opendaylight.transportpce.test.AbstractTest;
 
+
 public class NbiNotificationsProviderTest  extends AbstractTest {
+    public static NetworkTransactionService networkTransactionService;
 
     @Mock
     RpcProviderService rpcProviderRegistry;
-
     @Mock
     private NotificationService notificationService;
 
-    @Before
-    public void init() {
+    @BeforeEach
+    void init() {
         MockitoAnnotations.openMocks(this);
-
     }
 
     @Test
-    public void initTest() {
-        NbiNotificationsProvider provider = new NbiNotificationsProvider(
-                Arrays.asList("topic1", "topic2"), Arrays.asList("topic1", "topic2"), "localhost:8080",
-                "localhost:8080", rpcProviderRegistry, notificationService,
-                getDataStoreContextUtil().getBindingDOMCodecServices());
-        provider.init();
-        verify(rpcProviderRegistry, times(1))
-                .registerRpcImplementation(any(), any(NbiNotificationsImpl.class));
+    void initTest() {
+        networkTransactionService = new NetworkTransactionImpl(getDataBroker());
+        new NbiNotificationsProvider("localhost:8080", "localhost:8080",
+                rpcProviderRegistry, notificationService, getDataStoreContextUtil().getBindingDOMCodecServices(),
+                networkTransactionService);
+        verify(rpcProviderRegistry, times(1)).registerRpcImplementations(
+                any(GetNotificationsProcessServiceImpl.class),
+                any(GetNotificationsAlarmServiceImpl.class),
+                any(GetSupportedNotificationTypesImpl.class),
+                any(CreateNotificationSubscriptionServiceImpl.class),
+                any(DeleteNotificationSubscriptionServiceImpl.class),
+                any(GetNotificationSubscriptionServiceDetailsImpl.class),
+                any(GetNotificationSubscriptionServiceListImpl.class),
+                any(GetNotificationListImpl.class));
         verify(notificationService, times(1))
-                .registerNotificationListener(any(NbiNotificationsListenerImpl.class));
+                .registerCompositeListener(any(NotificationService.CompositeListener.class));
     }
 }
diff --git a/nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/listener/NbiNotificationsHandlerTest.java b/nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/listener/NbiNotificationsHandlerTest.java
new file mode 100644 (file)
index 0000000..b79f964
--- /dev/null
@@ -0,0 +1,148 @@
+/*
+ * Copyright © 2021 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.nbinotifications.listener;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.opendaylight.transportpce.nbinotifications.producer.Publisher;
+import org.opendaylight.transportpce.nbinotifications.utils.NotificationServiceDataUtils;
+import org.opendaylight.transportpce.test.AbstractTest;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ConnectionType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationAlarmService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationTapiService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationAlarmService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationAlarmServiceBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationProcessServiceBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishTapiNotificationService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishTapiNotificationServiceBuilder;
+
+public class NbiNotificationsHandlerTest extends AbstractTest {
+    @Mock
+    private Publisher<NotificationProcessService> publisherService;
+    @Mock
+    private Publisher<NotificationAlarmService> publisherAlarm;
+    @Mock
+    private Publisher<NotificationTapiService> publisherTapiService;
+
+    @BeforeEach
+    void setUp() throws ExecutionException, InterruptedException {
+        MockitoAnnotations.openMocks(this);
+    }
+
+    @Test
+    void onPublishNotificationServiceTest() {
+        NbiNotificationsHandler listener = new NbiNotificationsHandler(Map.of("test", publisherService),
+                Map.of("test", publisherAlarm), Map.of("test", publisherTapiService));
+        PublishNotificationProcessService notification = new PublishNotificationProcessServiceBuilder()
+                .setPublisherName("test")
+                .setCommonId("commonId")
+                .setConnectionType(ConnectionType.Service)
+                .setIsTempService(false)
+                .setMessage("Service deleted")
+                .setOperationalState(State.OutOfService)
+                .setServiceName("service name")
+                .build();
+        listener.onPublishNotificationProcessService(notification);
+        verify(publisherService, times(1)).sendEvent(any(), anyString());
+    }
+
+    @Test
+    void onPublishNotificationServiceWrongPublisherTest() {
+        NbiNotificationsHandler listener = new NbiNotificationsHandler(Map.of("test", publisherService),
+                Map.of("test", publisherAlarm), Map.of("test", publisherTapiService));
+        PublishNotificationProcessService notification = new PublishNotificationProcessServiceBuilder()
+                .setPublisherName("wrongPublisher")
+                .setCommonId("commonId")
+                .setConnectionType(ConnectionType.Service)
+                .setMessage("Service deleted")
+                .setOperationalState(State.OutOfService)
+                .setServiceName("service name")
+                .build();
+        listener.onPublishNotificationProcessService(notification);
+        verify(publisherService, times(0)).sendEvent(any(), anyString());
+    }
+
+    @Test
+    void onPublishNotificationAlarmServiceTest() {
+        NbiNotificationsHandler listener = new NbiNotificationsHandler(Map.of("test", publisherService),
+                Map.of("test", publisherAlarm), Map.of("test", publisherTapiService));
+        PublishNotificationAlarmService notification = new PublishNotificationAlarmServiceBuilder()
+                .setPublisherName("test")
+                .setConnectionType(ConnectionType.Service)
+                .setMessage("The service is now inService")
+                .setOperationalState(State.OutOfService)
+                .setServiceName("service name")
+                .build();
+        listener.onPublishNotificationAlarmService(notification);
+        verify(publisherAlarm, times(1)).sendEvent(any(), anyString());
+    }
+
+    @Test
+    void onPublishNotificationAlarmServiceWrongPublisherTest() {
+        NbiNotificationsHandler listener = new NbiNotificationsHandler(Map.of("test", publisherService),
+                Map.of("test", publisherAlarm), Map.of("test", publisherTapiService));
+        PublishNotificationAlarmService notification = new PublishNotificationAlarmServiceBuilder()
+                .setPublisherName("wrongPublisher")
+                .setConnectionType(ConnectionType.Service)
+                .setMessage("The service is now inService")
+                .setOperationalState(State.OutOfService)
+                .setServiceName("service name")
+                .build();
+        listener.onPublishNotificationAlarmService(notification);
+        verify(publisherAlarm, times(0)).sendEvent(any(), anyString());
+    }
+
+    @Test
+    void onPublishTapiNotificationServiceTest() throws ExecutionException, InterruptedException {
+        NbiNotificationsHandler listener = new NbiNotificationsHandler(Map.of("test", publisherService),
+                Map.of("test", publisherAlarm), Map.of("test", publisherTapiService));
+
+        PublishTapiNotificationService notification
+            = new PublishTapiNotificationServiceBuilder(NotificationServiceDataUtils.buildReceivedTapiAlarmEvent())
+                .setTopic("test")
+                .build();
+        listener.onPublishTapiNotificationService(notification);
+        verify(publisherTapiService, times(1)).sendEvent(any(), anyString());
+    }
+
+    @Test
+    void onPublishTapiNotificationServiceTestWrongPublisherTest() {
+        NbiNotificationsHandler listener = new NbiNotificationsHandler(Map.of("test", publisherService),
+            Map.of("test", publisherAlarm), Map.of("test", publisherTapiService));
+        PublishTapiNotificationService notification
+            = new PublishTapiNotificationServiceBuilder(NotificationServiceDataUtils.buildReceivedTapiAlarmEvent())
+                .setTopic(UUID.randomUUID().toString())
+                .build();
+        listener.onPublishTapiNotificationService(notification);
+        verify(publisherTapiService, times(0)).sendEvent(any(), eq(notification.getTopic()));
+    }
+
+    @Test
+    void getTapiPublisherFromTopicTest() {
+        NbiNotificationsHandler listener = new NbiNotificationsHandler(Map.of("test", publisherService),
+                Map.of("test", publisherAlarm), Map.of("test", publisherTapiService));
+        assertNull(listener.getTapiPublisherFromTopic("toto"));
+        assertEquals(publisherTapiService, listener.getTapiPublisherFromTopic("test"));
+    }
+}
diff --git a/nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/listener/NbiNotificationsListenerImplTest.java b/nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/listener/NbiNotificationsListenerImplTest.java
deleted file mode 100644 (file)
index c0fa4d1..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright © 2021 Orange, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.transportpce.nbinotifications.listener;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-import java.util.Map;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.opendaylight.transportpce.nbinotifications.producer.Publisher;
-import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ConnectionType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationAlarmService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationProcessService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationAlarmService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationAlarmServiceBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationProcessService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationProcessServiceBuilder;
-
-public class NbiNotificationsListenerImplTest extends AbstractTest {
-    @Mock
-    private Publisher<NotificationProcessService> publisherService;
-    @Mock
-    private Publisher<NotificationAlarmService> publisherAlarm;
-
-    @Before
-    public void setUp() {
-        MockitoAnnotations.openMocks(this);
-    }
-
-    @Test
-    public void onPublishNotificationServiceTest() {
-        NbiNotificationsListenerImpl listener = new NbiNotificationsListenerImpl(Map.of("test", publisherService),
-                Map.of("test", publisherAlarm));
-        PublishNotificationProcessService notification = new PublishNotificationProcessServiceBuilder()
-                .setPublisherName("test")
-                .setCommonId("commonId")
-                .setConnectionType(ConnectionType.Service)
-                .setMessage("Service deleted")
-                .setOperationalState(State.OutOfService)
-                .setServiceName("service name")
-                .build();
-        listener.onPublishNotificationProcessService(notification);
-        verify(publisherService, times(1)).sendEvent(any(), anyString());
-    }
-
-    @Test
-    public void onPublishNotificationServiceWrongPublisherTest() {
-        NbiNotificationsListenerImpl listener = new NbiNotificationsListenerImpl(Map.of("test", publisherService),
-                Map.of("test", publisherAlarm));
-        PublishNotificationProcessService notification = new PublishNotificationProcessServiceBuilder()
-                .setPublisherName("wrongPublisher")
-                .setCommonId("commonId")
-                .setConnectionType(ConnectionType.Service)
-                .setMessage("Service deleted")
-                .setOperationalState(State.OutOfService)
-                .setServiceName("service name")
-                .build();
-        listener.onPublishNotificationProcessService(notification);
-        verify(publisherService, times(0)).sendEvent(any(), anyString());
-    }
-
-    @Test
-    public void onPublishNotificationAlarmServiceTest() {
-        NbiNotificationsListenerImpl listener = new NbiNotificationsListenerImpl(Map.of("test", publisherService),
-                Map.of("test", publisherAlarm));
-        PublishNotificationAlarmService notification = new PublishNotificationAlarmServiceBuilder()
-                .setPublisherName("test")
-                .setConnectionType(ConnectionType.Service)
-                .setMessage("The service is now inService")
-                .setOperationalState(State.OutOfService)
-                .setServiceName("service name")
-                .build();
-        listener.onPublishNotificationAlarmService(notification);
-        verify(publisherAlarm, times(1)).sendEvent(any(), anyString());
-    }
-
-    @Test
-    public void onPublishNotificationAlarmServiceWrongPublisherTest() {
-        NbiNotificationsListenerImpl listener = new NbiNotificationsListenerImpl(Map.of("test", publisherService),
-                Map.of("test", publisherAlarm));
-        PublishNotificationAlarmService notification = new PublishNotificationAlarmServiceBuilder()
-                .setPublisherName("wrongPublisher")
-                .setConnectionType(ConnectionType.Service)
-                .setMessage("The service is now inService")
-                .setOperationalState(State.OutOfService)
-                .setServiceName("service name")
-                .build();
-        listener.onPublishNotificationAlarmService(notification);
-        verify(publisherAlarm, times(0)).sendEvent(any(), anyString());
-    }
-}
index 4b9e160f585428727d90592833295b15055f8f62..8030b9253f5ac51902697d0ccb0bb94b24ee9bfb 100644 (file)
  */
 package org.opendaylight.transportpce.nbinotifications.producer;
 
-import static org.junit.Assert.assertEquals;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
+import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
+import java.util.concurrent.ExecutionException;
 import org.apache.kafka.clients.producer.MockProducer;
 import org.apache.kafka.common.serialization.StringSerializer;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.opendaylight.mdsal.binding.api.NotificationService;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
 import org.opendaylight.transportpce.common.converter.JsonStringConverter;
+import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
+import org.opendaylight.transportpce.nbinotifications.impl.NbiNotificationsProvider;
+import org.opendaylight.transportpce.nbinotifications.impl.rpc.CreateNotificationSubscriptionServiceImpl;
 import org.opendaylight.transportpce.nbinotifications.serialization.ConfigConstants;
 import org.opendaylight.transportpce.nbinotifications.serialization.NotificationAlarmServiceSerializer;
 import org.opendaylight.transportpce.nbinotifications.serialization.NotificationServiceSerializer;
+import org.opendaylight.transportpce.nbinotifications.serialization.TapiNotificationSerializer;
+import org.opendaylight.transportpce.nbinotifications.utils.NotificationServiceDataUtils;
+import org.opendaylight.transportpce.nbinotifications.utils.TopicManager;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationAlarmService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationAlarmService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationTapiService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.CreateNotificationSubscriptionServiceInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.create.notification.subscription.service.input.SubscriptionFilter;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.create.notification.subscription.service.input.SubscriptionFilterBuilder;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
 
 public class PublisherTest extends AbstractTest {
+
+    private static NetworkTransactionService networkTransactionService;
+
+    @Mock
+    RpcProviderService rpcProviderRegistry;
+    @Mock
+    private NotificationService notificationService;
+
     private JsonStringConverter<NotificationProcessService> converterService;
     private JsonStringConverter<NotificationAlarmService> converterAlarm;
+    private JsonStringConverter<NotificationTapiService> converterTapiService;
     private Publisher<NotificationProcessService> publisherService;
     private Publisher<NotificationAlarmService> publisherAlarm;
+    private Publisher<NotificationTapiService> publisherTapiService;
     private MockProducer<String, NotificationProcessService> mockProducer;
     private MockProducer<String, NotificationAlarmService> mockAlarmProducer;
+    private MockProducer<String, NotificationTapiService> mockTapiProducer;
+    private NbiNotificationsProvider nbiNotifications;
+    private TopicManager topicManager;
+
 
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp() throws ExecutionException, InterruptedException {
+        topicManager = TopicManager.getInstance();
         converterService = new JsonStringConverter<>(getDataStoreContextUtil().getBindingDOMCodecServices());
         converterAlarm = new JsonStringConverter<>(getDataStoreContextUtil().getBindingDOMCodecServices());
+        converterTapiService = new JsonStringConverter<>(getDataStoreContextUtil().getBindingDOMCodecServices());
         NotificationServiceSerializer serializerService = new NotificationServiceSerializer();
         NotificationAlarmServiceSerializer serializerAlarm = new NotificationAlarmServiceSerializer();
+        TapiNotificationSerializer serializerTapi = new TapiNotificationSerializer();
         Map<String, Object> properties = Map.of(ConfigConstants.CONVERTER, converterService);
         Map<String, Object> propertiesAlarm = Map.of(ConfigConstants.CONVERTER, converterAlarm);
+        Map<String, Object> propertiesTapi = Map.of(ConfigConstants.CONVERTER, converterTapiService);
         serializerService.configure(properties, false);
         serializerAlarm.configure(propertiesAlarm, false);
+        serializerTapi.configure(propertiesTapi, false);
         mockProducer = new MockProducer<>(true, new StringSerializer(), serializerService);
         mockAlarmProducer = new MockProducer<>(true, new StringSerializer(), serializerAlarm);
+        mockTapiProducer = new MockProducer<>(true, new StringSerializer(), serializerTapi);
         publisherService = new Publisher<>("test", mockProducer);
         publisherAlarm = new Publisher<>("test", mockAlarmProducer);
+        publisherTapiService = new Publisher<>("test", mockTapiProducer);
+        MockitoAnnotations.openMocks(this);
+        networkTransactionService = new NetworkTransactionImpl(getDataBroker());
+        topicManager.setTapiConverter(converterTapiService);
+        NotificationServiceDataUtils.createTapiContext(networkTransactionService);
+        nbiNotifications = new NbiNotificationsProvider("localhost:8080", "localhost:8080",
+                rpcProviderRegistry, notificationService, getDataStoreContextUtil().getBindingDOMCodecServices(),
+                networkTransactionService);
     }
 
     @Test
-    public void sendEventServiceShouldBeSuccessful() throws IOException {
+    void sendEventServiceShouldBeSuccessful() throws IOException {
         String json = Files.readString(Paths.get("src/test/resources/event.json"));
         NotificationProcessService notificationProcessService = converterService
                 .createDataObjectFromJsonString(YangInstanceIdentifier.of(NotificationProcessService.QNAME),
                         json, JSONCodecFactorySupplier.RFC7951);
         publisherService.sendEvent(notificationProcessService, notificationProcessService.getConnectionType().name());
-        assertEquals("We should have one message", 1, mockProducer.history().size());
-        assertEquals("Key should be test", "test", mockProducer.history().get(0).key());
+        assertEquals(1, mockProducer.history().size(), "We should have one message");
+        assertEquals("test", mockProducer.history().get(0).key(), "Key should be test");
     }
 
     @Test
-    public void sendEventAlarmShouldBeSuccessful() throws IOException {
+    void sendEventAlarmShouldBeSuccessful() throws IOException {
         String json = Files.readString(Paths.get("src/test/resources/event_alarm_service.json"));
         NotificationAlarmService notificationAlarmService = converterAlarm
                 .createDataObjectFromJsonString(YangInstanceIdentifier.of(NotificationAlarmService.QNAME),
                         json, JSONCodecFactorySupplier.RFC7951);
         publisherAlarm.sendEvent(notificationAlarmService, "alarm"
                 + notificationAlarmService.getConnectionType().getName());
-        assertEquals("We should have one message", 1, mockAlarmProducer.history().size());
-        assertEquals("Key should be test", "test", mockAlarmProducer.history().get(0).key());
+        assertEquals(1, mockAlarmProducer.history().size(), "We should have one message");
+        assertEquals("test", mockAlarmProducer.history().get(0).key(), "Key should be test");
+    }
+
+    @Test
+    void sendTapiEventShouldBeSuccessful() throws IOException {
+        CreateNotificationSubscriptionServiceInputBuilder builder
+            = NotificationServiceDataUtils.buildNotificationSubscriptionServiceInputBuilder();
+        SubscriptionFilter subscriptionFilter = new SubscriptionFilterBuilder(builder.getSubscriptionFilter())
+            .setRequestedObjectIdentifier(new HashSet<>(List.of(new Uuid("76d8f07b-ead5-4132-8eb8-cf3fdef7e079"))))
+            .build();
+        builder.setSubscriptionFilter(subscriptionFilter);
+
+        new CreateNotificationSubscriptionServiceImpl(nbiNotifications, topicManager).invoke(builder.build());
+        String json = Files.readString(Paths.get("src/test/resources/tapi_event.json"));
+        NotificationTapiService notificationTapiService = converterTapiService
+            .createDataObjectFromJsonString(YangInstanceIdentifier.of(NotificationTapiService.QNAME),
+                json, JSONCodecFactorySupplier.RFC7951);
+        publisherTapiService.sendEvent(notificationTapiService, "");
+        assertEquals(1, mockTapiProducer.history().size(), "We should have one message");
+        assertEquals("test", mockTapiProducer.history().get(0).key(), "Key should be test");
     }
 }
index b0d156a2a66af52ad617f562c0fc76bbc85f5604..47c6f0a7d11ce96bd36a976ce545b6a3354bfd48 100755 (executable)
@@ -7,22 +7,23 @@
  */
 package org.opendaylight.transportpce.nbinotifications.serialization;
 
-import static org.junit.Assert.assertEquals;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.Map;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.transportpce.common.converter.JsonStringConverter;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationAlarmService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.get.notifications.alarm.service.output.NotificationsAlarmService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationAlarmService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.get.notifications.alarm.service.output.NotificationsAlarmService;
 
 public class NotificationAlarmServiceDeserializerTest extends AbstractTest {
 
     @Test
-    public void deserializeTest() throws IOException {
+    void deserializeTest() throws IOException {
         JsonStringConverter<NotificationAlarmService> converter =
                 new JsonStringConverter<>(getDataStoreContextUtil().getBindingDOMCodecServices());
         NotificationAlarmServiceDeserializer deserializer = new NotificationAlarmServiceDeserializer();
@@ -31,8 +32,8 @@ public class NotificationAlarmServiceDeserializerTest extends AbstractTest {
         NotificationsAlarmService readEvent = deserializer.deserialize("Test",
                 Files.readAllBytes(Paths.get("src/test/resources/event_alarm_service.json")));
         deserializer.close();
-        assertEquals("Service name should be service1", "service1", readEvent.getServiceName());
-        assertEquals("message should be The service is now inService", "The service is now inService",
-                readEvent.getMessage());
+        assertEquals("service1", readEvent.getServiceName(), "Service name should be service1");
+        assertEquals("The service is now inService", readEvent.getMessage(),
+            "message should be The service is now inService");
     }
 }
index 605c85158d6b34c1ea11fea8c8e60bb23f1cb4ea..91d4e42f94550c6af21c113ffbde3cff22c9a58e 100755 (executable)
@@ -7,8 +7,7 @@
  */
 package org.opendaylight.transportpce.nbinotifications.serialization;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -17,17 +16,19 @@ import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.Map;
-import org.junit.Test;
+import org.json.JSONException;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.transportpce.common.converter.JsonStringConverter;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationAlarmService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationAlarmService;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
+import org.skyscreamer.jsonassert.JSONAssert;
 
 public class NotificationAlarmServiceSerializerTest extends AbstractTest {
 
     @Test
-    public void serializeTest() throws IOException {
+    void serializeTest() throws IOException, JSONException {
         JsonStringConverter<NotificationAlarmService> converter =
                 new JsonStringConverter<>(getDataStoreContextUtil().getBindingDOMCodecServices());
         String json = Files.readString(Paths.get("src/test/resources/event_alarm_service.json"));
@@ -39,10 +40,10 @@ public class NotificationAlarmServiceSerializerTest extends AbstractTest {
         serializer.configure(configs, false);
         byte[] data = serializer.serialize("test", notificationAlarmService);
         serializer.close();
-        assertNotNull("Serialized data should not be null", data);
+        assertNotNull(data, "Serialized data should not be null");
         String expectedJson = Files.readString(Paths.get("src/test/resources/expected_event_alarm_service.json"));
         // Minify the json string
         expectedJson = new ObjectMapper().readValue(expectedJson, JsonNode.class).toString();
-        assertEquals("The event should be equals", expectedJson, new String(data, StandardCharsets.UTF_8));
+        JSONAssert.assertEquals(expectedJson, new String(data, StandardCharsets.UTF_8), true);
     }
 }
index 12f7a80f33c2bdf19a2f1d0709878833f711ab8e..fc987fb87f3d7f5cc7f728f4e91298b3c4e4096b 100644 (file)
@@ -7,22 +7,23 @@
  */
 package org.opendaylight.transportpce.nbinotifications.serialization;
 
-import static org.junit.Assert.assertEquals;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.Map;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.transportpce.common.converter.JsonStringConverter;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationProcessService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.get.notifications.process.service.output.NotificationsProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.get.notifications.process.service.output.NotificationsProcessService;
 
 public class NotificationServiceDeserializerTest extends AbstractTest {
 
     @Test
-    public void deserializeTest() throws IOException {
+    void deserializeTest() throws IOException {
         JsonStringConverter<NotificationProcessService> converter = new JsonStringConverter<>(
                 getDataStoreContextUtil().getBindingDOMCodecServices());
         NotificationServiceDeserializer deserializer = new NotificationServiceDeserializer();
@@ -31,6 +32,6 @@ public class NotificationServiceDeserializerTest extends AbstractTest {
         NotificationsProcessService readEvent = deserializer.deserialize("Test",
                 Files.readAllBytes(Paths.get("src/test/resources/event.json")));
         deserializer.close();
-        assertEquals("Service name should be service1", "service1", readEvent.getServiceName());
+        assertEquals("service1", readEvent.getServiceName(), "Service name should be service1");
     }
 }
index 4a4868bbd29d36a66f69bcd44da38b910de70372..b110b1391b8fb45dd6ad139ab84b27492cb70c76 100644 (file)
@@ -7,8 +7,7 @@
  */
 package org.opendaylight.transportpce.nbinotifications.serialization;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
@@ -17,17 +16,19 @@ import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.Map;
-import org.junit.Test;
+import org.json.JSONException;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.transportpce.common.converter.JsonStringConverter;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationProcessService;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
+import org.skyscreamer.jsonassert.JSONAssert;
 
 public class NotificationServiceSerializerTest extends AbstractTest {
 
     @Test
-    public void serializeTest() throws IOException {
+    void serializeTest() throws IOException, JSONException {
         JsonStringConverter<NotificationProcessService> converter =
                 new JsonStringConverter<>(getDataStoreContextUtil().getBindingDOMCodecServices());
         String json = Files.readString(Paths.get("src/test/resources/event.json"));
@@ -39,10 +40,10 @@ public class NotificationServiceSerializerTest extends AbstractTest {
         serializer.configure(configs, false);
         byte[] data = serializer.serialize("test", notificationService);
         serializer.close();
-        assertNotNull("Serialized data should not be null", data);
+        assertNotNull(data, "Serialized data should not be null");
         String expectedJson = Files.readString(Paths.get("src/test/resources/expected_event.json"));
         // Minify the json string
         expectedJson = new ObjectMapper().readValue(expectedJson, JsonNode.class).toString();
-        assertEquals("The event should be equals", expectedJson, new String(data, StandardCharsets.UTF_8));
+        JSONAssert.assertEquals(expectedJson, new String(data, StandardCharsets.UTF_8), true);
     }
 }
diff --git a/nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/serialization/NotificationTapiServiceDeserializerTest.java b/nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/serialization/NotificationTapiServiceDeserializerTest.java
new file mode 100644 (file)
index 0000000..f134eb9
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * Copyright © 2021 Nokia, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.nbinotifications.serialization;
+
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Map;
+import org.junit.jupiter.api.Test;
+import org.opendaylight.transportpce.common.converter.JsonStringConverter;
+import org.opendaylight.transportpce.test.AbstractTest;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationTapiService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.get.notification.list.output.Notification;
+
+public class NotificationTapiServiceDeserializerTest extends AbstractTest {
+
+    @Test
+    void deserializeTest() throws IOException {
+        JsonStringConverter<NotificationTapiService> converter = new JsonStringConverter<>(
+                getDataStoreContextUtil().getBindingDOMCodecServices());
+        TapiNotificationDeserializer deserializer = new TapiNotificationDeserializer();
+        Map<String, Object> configs = Map.of(ConfigConstants.CONVERTER, converter);
+        deserializer.configure(configs, false);
+        Notification readEvent = deserializer.deserialize("76d8f07b-ead5-4132-8eb8-cf3fdef7e079",
+                Files.readAllBytes(Paths.get("src/test/resources/tapi_event.json")));
+        deserializer.close();
+        assertEquals("76d8f07b-ead5-4132-8eb8-cf3fdef7e079", readEvent.getTargetObjectIdentifier().getValue(),
+            "Service uuid should be 76d8f07b-ead5-4132-8eb8-cf3fdef7e079");
+    }
+}
diff --git a/nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/serialization/NotificationTapiServiceSerializerTest.java b/nbinotifications/src/test/java/org/opendaylight/transportpce/nbinotifications/serialization/NotificationTapiServiceSerializerTest.java
new file mode 100644 (file)
index 0000000..1309c37
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright © 2021 Nokia, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.nbinotifications.serialization;
+
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Map;
+import org.json.JSONException;
+import org.junit.jupiter.api.Test;
+import org.opendaylight.transportpce.common.converter.JsonStringConverter;
+import org.opendaylight.transportpce.test.AbstractTest;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationTapiService;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
+import org.skyscreamer.jsonassert.JSONAssert;
+
+public class NotificationTapiServiceSerializerTest extends AbstractTest {
+
+    @Test
+    void serializeTest() throws IOException, JSONException {
+        JsonStringConverter<NotificationTapiService> converter =
+                new JsonStringConverter<>(getDataStoreContextUtil().getBindingDOMCodecServices());
+        String json = Files.readString(Paths.get("src/test/resources/tapi_event.json"));
+        NotificationTapiService notificationService = converter
+                .createDataObjectFromJsonString(YangInstanceIdentifier.of(NotificationTapiService.QNAME),
+                        json, JSONCodecFactorySupplier.RFC7951);
+        TapiNotificationSerializer serializer = new TapiNotificationSerializer();
+        Map<String, Object> configs = Map.of(ConfigConstants.CONVERTER, converter);
+        serializer.configure(configs, false);
+        byte[] data = serializer.serialize("test", notificationService);
+        serializer.close();
+        assertNotNull(data, "Serialized data should not be null");
+        String expectedJson = Files.readString(Paths.get("src/test/resources/expected_tapi_event.json"));
+        // Minify the json string
+        expectedJson = new ObjectMapper().readValue(expectedJson, JsonNode.class).toString();
+        JSONAssert.assertEquals(expectedJson, new String(data, StandardCharsets.UTF_8), true);
+    }
+}
index de4cb5f01565d5d2c90a9a7d4829688e38cf5532..d36599912857e582e33b0b8f3cd26b4b2a89414a 100644 (file)
@@ -7,32 +7,76 @@
  */
 package org.opendaylight.transportpce.nbinotifications.utils;
 
+import java.nio.charset.Charset;
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ConnectionType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.RxDirection;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.RxDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.RxDirectionKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.TxDirection;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.TxDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.TxDirectionKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.lgx.LgxBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.port.PortBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ConnectionType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.RxDirection;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.RxDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.RxDirectionKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.TxDirection;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.TxDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.TxDirectionKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.lgx.LgxBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.port.PortBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationProcessService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.NotificationProcessServiceBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.get.notifications.alarm.service.output.NotificationsAlarmService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.get.notifications.alarm.service.output.NotificationsAlarmServiceBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.get.notifications.process.service.output.NotificationsProcessService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.get.notifications.process.service.output.NotificationsProcessServiceBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.notification.process.service.ServiceAEndBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.notification.process.service.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.NotificationProcessServiceBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.get.notifications.alarm.service.output.NotificationsAlarmService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.get.notifications.alarm.service.output.NotificationsAlarmServiceBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.get.notifications.process.service.output.NotificationsProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.get.notifications.process.service.output.NotificationsProcessServiceBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.process.service.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.process.service.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Context;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.ContextBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.DateAndTime;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.local._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.local._class.NameBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CONNECTIVITYOBJECTTYPECONNECTIVITYSERVICE;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.Context1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.Context1Builder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContextBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.CreateNotificationSubscriptionServiceInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.GetNotificationListInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.NOTIFICATIONTYPEATTRIBUTEVALUECHANGE;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.NOTIFICATIONTYPEOBJECTCREATION;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.NOTIFICATIONTYPEOBJECTDELETION;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.SubscriptionState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.context.NotificationContextBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.create.notification.subscription.service.input.SubscriptionFilter;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.create.notification.subscription.service.input.SubscriptionFilterBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.get.notification.list.output.Notification;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.get.notification.list.output.NotificationBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.ChangedAttributes;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.ChangedAttributesBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.TargetObjectName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.TargetObjectNameBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.context.TopologyContextBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.NwTopologyServiceBuilder;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.opendaylight.yangtools.yang.common.Uint8;
 
 public final class NotificationServiceDataUtils {
 
+    public static final String TAPI_CONTEXT = "T-API context";
+
     private NotificationServiceDataUtils() {
     }
 
@@ -71,6 +115,38 @@ public final class NotificationServiceDataUtils {
                 .build();
     }
 
+    public static Notification buildReceivedTapiAlarmEvent() {
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx");
+        OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneOffset.UTC);
+        DateAndTime datetime = new DateAndTime(dtf.format(offsetDateTime));
+        Uuid targetObjectId = new Uuid(UUID.randomUUID().toString());
+        TargetObjectName objectName = new TargetObjectNameBuilder()
+            .setValue(targetObjectId.getValue())
+            .setValueName("Connectivity Service Name")
+            .build();
+        ChangedAttributes adminStateChange = new ChangedAttributesBuilder()
+            .setValueName("administrativeState")
+            .setOldValue(AdministrativeState.LOCKED.getName())
+            .setNewValue(AdministrativeState.UNLOCKED.getName())
+            .build();
+        ChangedAttributes operStateChange = new ChangedAttributesBuilder()
+            .setValueName("operationalState")
+            .setOldValue(OperationalState.DISABLED.getName())
+            .setNewValue(OperationalState.ENABLED.getName())
+            .build();
+        return new NotificationBuilder()
+            .setNotificationType(NOTIFICATIONTYPEATTRIBUTEVALUECHANGE.VALUE)
+            .setLayerProtocolName(LayerProtocolName.ETH)
+            .setTargetObjectType(CONNECTIVITYOBJECTTYPECONNECTIVITYSERVICE.VALUE)
+            .setEventTimeStamp(datetime)
+            .setUuid(new Uuid(UUID.randomUUID().toString()))
+            .setTargetObjectIdentifier(targetObjectId)
+            .setTargetObjectName(Map.of(objectName.key(), objectName))
+            .setChangedAttributes(Map.of(adminStateChange.key(), adminStateChange,
+                operStateChange.key(), operStateChange))
+            .build();
+    }
+
     public static ServiceAEndBuilder getServiceAEndBuild() {
         return new ServiceAEndBuilder()
                 .setClli("clli")
@@ -91,6 +167,26 @@ public final class NotificationServiceDataUtils {
                 .setRxDirection(getRxDirection());
     }
 
+    public static CreateNotificationSubscriptionServiceInputBuilder buildNotificationSubscriptionServiceInputBuilder() {
+        Name name = new NameBuilder()
+            .setValue("test subscription")
+            .setValueName("Subscription name")
+            .build();
+        SubscriptionFilter subscriptionFilter = new SubscriptionFilterBuilder()
+            .setRequestedObjectTypes(new HashSet<>(List.of(CONNECTIVITYOBJECTTYPECONNECTIVITYSERVICE.VALUE)))
+            .setRequestedNotificationTypes(new HashSet<>(List.of(NOTIFICATIONTYPEATTRIBUTEVALUECHANGE.VALUE,
+                NOTIFICATIONTYPEOBJECTCREATION.VALUE, NOTIFICATIONTYPEOBJECTDELETION.VALUE)))
+            .setRequestedLayerProtocols(new HashSet<>(List.of(LayerProtocolName.ETH)))
+            .setRequestedObjectIdentifier(new HashSet<>(List.of(new Uuid(UUID.randomUUID().toString()))))
+            .setIncludeContent(true)
+            .setLocalId("localId")
+            .setName(Map.of(name.key(), name))
+            .build();
+        return new CreateNotificationSubscriptionServiceInputBuilder()
+            .setSubscriptionFilter(subscriptionFilter)
+            .setSubscriptionState(SubscriptionState.ACTIVE);
+    }
+
     private static Map<TxDirectionKey, TxDirection> getTxDirection() {
         return Map.of(new TxDirectionKey(Uint8.ZERO), new TxDirectionBuilder()
                 .setPort(new PortBuilder()
@@ -132,4 +228,71 @@ public final class NotificationServiceDataUtils {
                 .setIndex(Uint8.ZERO)
                 .build());
     }
+
+    public static void createTapiContext(
+            NetworkTransactionService networkTransactionService) throws ExecutionException, InterruptedException {
+        // Augmenting tapi context to include topology and connectivity contexts
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name contextName
+            = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder()
+            .setValue(TAPI_CONTEXT).setValueName("TAPI Context Name").build();
+
+        Context1 connectivityContext =
+            new Context1Builder()
+                .setConnectivityContext(
+                    new ConnectivityContextBuilder()
+                        .setConnection(new HashMap<>())
+                        .setConnectivityService(new HashMap<>())
+                        .build())
+                .build();
+
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name nwTopoServiceName =
+            new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder()
+                .setValue("Network Topo Service")
+                .setValueName("Network Topo Service Name")
+                .build();
+
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1 topologyContext
+            = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1Builder()
+                .setTopologyContext(new TopologyContextBuilder()
+                    .setNwTopologyService(new NwTopologyServiceBuilder()
+                        .setTopology(new HashMap<>())
+                        .setUuid(
+                            new Uuid(
+                                UUID.nameUUIDFromBytes("Network Topo Service".getBytes(Charset.forName("UTF-8")))
+                                    .toString()))
+                    .setName(Map.of(nwTopoServiceName.key(), nwTopoServiceName))
+                    .build())
+                .setTopology(new HashMap<>())
+                .build())
+            .build();
+
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.Context1 notificationContext
+            = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.Context1Builder()
+                .setNotificationContext(new NotificationContextBuilder()
+                    .setNotification(new HashMap<>())
+                    .setNotifSubscription(new HashMap<>())
+                    .build())
+                .build();
+
+        ContextBuilder contextBuilder = new ContextBuilder()
+            .setName(Map.of(contextName.key(), contextName))
+            .setUuid(
+                new Uuid(UUID.nameUUIDFromBytes(TAPI_CONTEXT.getBytes(Charset.forName("UTF-8"))).toString()))
+            .setServiceInterfacePoint(new HashMap<>())
+            .addAugmentation(connectivityContext)
+            .addAugmentation(topologyContext)
+            .addAugmentation(notificationContext);
+
+        // todo: add notification context
+        InstanceIdentifier<Context> contextIID = InstanceIdentifier.builder(Context.class).build();
+        // put in datastore
+        networkTransactionService.put(LogicalDatastoreType.OPERATIONAL, contextIID, contextBuilder.build());
+        networkTransactionService.commit().get();
+    }
+
+    public static GetNotificationListInputBuilder buildGetNotificationListInputBuilder(String subscriptionUuid) {
+        return new GetNotificationListInputBuilder()
+                .setSubscriptionId(new Uuid(UUID.fromString(subscriptionUuid).toString()))
+                .setTimeRange(null);
+    }
 }
index c09ee69721b0b2f785d295f0414ff4d0aa1f2238..9f628332879ac0ae607c81293585eb1ae3cf733b 100644 (file)
         },
         "service-name": "service1",
         "message": "message",
-        "response-failed": ""
+        "response-failed": "",
+        "is-temp-service": true,
+        "aToZ": {
+            "frequency": 196.125,
+            "width": 87.5,
+            "optical-operational-mode": "test",
+            "rx-estimated-osnr": 23.5,
+            "rx-estimated-gsnr": 23.5,
+            "max-output-power": 0.5,
+            "min-output-power": 0.5
+        },
+        "zToA": {
+            "frequency": 196.125,
+            "width": 87.5,
+            "optical-operational-mode": "test",
+            "rx-estimated-osnr": 23.5,
+            "rx-estimated-gsnr": 23.5,
+            "max-output-power": 0.5,
+            "min-output-power": 0.5
+        }
     }
 }
index 47209dd7dc7b96c60378e63a8ec22c97cd4034f5..ffeb3ee6591ba361220edcfe5777739b52bea0da 100644 (file)
 {
   "nbi-notifications:notification-process-service": {
-    "common-id": "commond-id",
-    "message": "message",
-    "operational-state": "inService",
+    "connection-type": "service",
     "service-z-end": {
-      "node-id": "XPONDER-1-2",
-      "service-rate": 1,
-      "clli": "clli",
-      "is-split-lambda": false,
-      "service-format": "OC",
       "tx-direction": [
         {
           "index": 0,
+          "lgx": {
+            "lgx-port-rack": "lgx port rack",
+            "lgx-device-name": "lgx device name",
+            "lgx-port-shelf": "lgx port shelf",
+            "lgx-port-name": "lgx port name"
+          },
           "port": {
-            "port-name": "port name",
-            "port-slot": "port slot",
+            "port-type": "port type",
             "port-sub-slot": "port subslot",
+            "port-name": "port name",
+            "port-rack": "port rack",
             "port-device-name": "device name",
-            "port-shelf": "port shelf",
-            "port-type": "port type",
-            "port-rack": "port rack"
-          },
-          "lgx": {
-            "lgx-port-shelf": "lgx port shelf",
-            "lgx-port-rack": "lgx port rack",
-            "lgx-port-name": "lgx port name",
-            "lgx-device-name": "lgx device name"
+            "port-slot": "port slot",
+            "port-shelf": "port shelf"
           }
         }
       ],
+      "node-id": "XPONDER-1-2",
+      "service-format": "OC",
+      "service-rate": 1,
       "rx-direction": [
         {
           "index": 0,
+          "lgx": {
+            "lgx-port-rack": "lgx port rack",
+            "lgx-device-name": "lgx device name",
+            "lgx-port-shelf": "lgx port shelf",
+            "lgx-port-name": "lgx port name"
+          },
           "port": {
-            "port-name": "port name",
-            "port-slot": "port slot",
+            "port-type": "port type",
             "port-sub-slot": "port subslot",
+            "port-name": "port name",
+            "port-rack": "port rack",
             "port-device-name": "device name",
-            "port-shelf": "port shelf",
-            "port-type": "port type",
-            "port-rack": "port rack"
-          },
-          "lgx": {
-            "lgx-port-shelf": "lgx port shelf",
-            "lgx-port-rack": "lgx port rack",
-            "lgx-port-name": "lgx port name",
-            "lgx-device-name": "lgx device name"
+            "port-slot": "port slot",
+            "port-shelf": "port shelf"
           }
         }
-      ]
+      ],
+      "is-split-lambda": false,
+      "clli": "clli"
     },
-    "service-name": "service1",
-    "connection-type": "service",
+    "message": "message",
     "service-a-end": {
-      "node-id": "XPONDER-1-2",
-      "service-rate": 1,
-      "clli": "clli",
-      "is-split-lambda": false,
-      "service-format": "OC",
       "tx-direction": [
         {
           "index": 0,
+          "lgx": {
+            "lgx-port-rack": "lgx port rack",
+            "lgx-device-name": "lgx device name",
+            "lgx-port-shelf": "lgx port shelf",
+            "lgx-port-name": "lgx port name"
+          },
           "port": {
-            "port-name": "port name",
-            "port-slot": "port slot",
+            "port-type": "port type",
             "port-sub-slot": "port subslot",
+            "port-name": "port name",
+            "port-rack": "port rack",
             "port-device-name": "device name",
-            "port-shelf": "port shelf",
-            "port-type": "port type",
-            "port-rack": "port rack"
-          },
-          "lgx": {
-            "lgx-port-shelf": "lgx port shelf",
-            "lgx-port-rack": "lgx port rack",
-            "lgx-port-name": "lgx port name",
-            "lgx-device-name": "lgx device name"
+            "port-slot": "port slot",
+            "port-shelf": "port shelf"
           }
         }
       ],
+      "node-id": "XPONDER-1-2",
+      "service-format": "OC",
+      "service-rate": 1,
       "rx-direction": [
         {
           "index": 0,
+          "lgx": {
+            "lgx-port-rack": "lgx port rack",
+            "lgx-device-name": "lgx device name",
+            "lgx-port-shelf": "lgx port shelf",
+            "lgx-port-name": "lgx port name"
+          },
           "port": {
-            "port-name": "port name",
-            "port-slot": "port slot",
+            "port-type": "port type",
             "port-sub-slot": "port subslot",
+            "port-name": "port name",
+            "port-rack": "port rack",
             "port-device-name": "device name",
-            "port-shelf": "port shelf",
-            "port-type": "port type",
-            "port-rack": "port rack"
-          },
-          "lgx": {
-            "lgx-port-shelf": "lgx port shelf",
-            "lgx-port-rack": "lgx port rack",
-            "lgx-port-name": "lgx port name",
-            "lgx-device-name": "lgx device name"
+            "port-slot": "port slot",
+            "port-shelf": "port shelf"
           }
         }
-      ]
+      ],
+      "is-split-lambda": false,
+      "clli": "clli"
+    },
+    "operational-state": "inService",
+    "common-id": "commond-id",
+    "response-failed": "",
+    "is-temp-service": true,
+    "service-name": "service1",
+    "aToZ": {
+      "frequency": "196.125",
+      "width": "87.5",
+      "optical-operational-mode": "test",
+      "rx-estimated-osnr": "23.5",
+      "rx-estimated-gsnr": "23.5",
+      "max-output-power": "0.5",
+      "min-output-power": "0.5"
     },
-    "response-failed": ""
+    "zToA": {
+      "frequency": "196.125",
+      "width": "87.5",
+      "optical-operational-mode": "test",
+      "rx-estimated-osnr": "23.5",
+      "rx-estimated-gsnr": "23.5",
+      "max-output-power": "0.5",
+      "min-output-power": "0.5"
+    }
   }
-}
+}
\ No newline at end of file
index 68480455ff4ab4654738d55fecdc428ffb52b17c..4b71fd0d8352615e80a9869cdecfb9453bb07ac5 100755 (executable)
@@ -1,8 +1,8 @@
 {
   "nbi-notifications:notification-alarm-service": {
+    "connection-type": "service",
     "message": "The service is now inService",
-    "operational-state": "inService",
     "service-name": "service1",
-    "connection-type": "service"
+    "operational-state": "inService"
   }
 }
\ No newline at end of file
diff --git a/nbinotifications/src/test/resources/expected_tapi_event.json b/nbinotifications/src/test/resources/expected_tapi_event.json
new file mode 100755 (executable)
index 0000000..d7d4abe
--- /dev/null
@@ -0,0 +1,28 @@
+{
+  "nbi-notifications:notification-tapi-service": {
+    "layer-protocol-name": "ETH",
+    "notification-type": "tapi-notification:NOTIFICATION_TYPE_ATTRIBUTE_VALUE_CHANGE",
+    "changed-attributes": [
+      {
+        "value-name": "administrativeState",
+        "old-value": "LOCKED",
+        "new-value": "UNLOCKED"
+      },
+      {
+        "value-name": "operationalState",
+        "old-value": "DISABLED",
+        "new-value": "ENABLED"
+      }
+    ],
+    "target-object-name": [
+      {
+        "value-name": "Connectivity Service Name",
+        "value": "76d8f07b-ead5-4132-8eb8-cf3fdef7e079"
+      }
+    ],
+    "uuid": "6ae49721-7f96-4924-b23b-31e5bee4946b",
+    "target-object-type": "tapi-connectivity:CONNECTIVITY_OBJECT_TYPE_CONNECTIVITY_SERVICE",
+    "event-time-stamp": "2022-04-06T09:06:01+00:00",
+    "target-object-identifier": "76d8f07b-ead5-4132-8eb8-cf3fdef7e079"
+  }
+}
\ No newline at end of file
diff --git a/nbinotifications/src/test/resources/tapi_event.json b/nbinotifications/src/test/resources/tapi_event.json
new file mode 100644 (file)
index 0000000..d7d4abe
--- /dev/null
@@ -0,0 +1,28 @@
+{
+  "nbi-notifications:notification-tapi-service": {
+    "layer-protocol-name": "ETH",
+    "notification-type": "tapi-notification:NOTIFICATION_TYPE_ATTRIBUTE_VALUE_CHANGE",
+    "changed-attributes": [
+      {
+        "value-name": "administrativeState",
+        "old-value": "LOCKED",
+        "new-value": "UNLOCKED"
+      },
+      {
+        "value-name": "operationalState",
+        "old-value": "DISABLED",
+        "new-value": "ENABLED"
+      }
+    ],
+    "target-object-name": [
+      {
+        "value-name": "Connectivity Service Name",
+        "value": "76d8f07b-ead5-4132-8eb8-cf3fdef7e079"
+      }
+    ],
+    "uuid": "6ae49721-7f96-4924-b23b-31e5bee4946b",
+    "target-object-type": "tapi-connectivity:CONNECTIVITY_OBJECT_TYPE_CONNECTIVITY_SERVICE",
+    "event-time-stamp": "2022-04-06T09:06:01+00:00",
+    "target-object-identifier": "76d8f07b-ead5-4132-8eb8-cf3fdef7e079"
+  }
+}
\ No newline at end of file
index 584baccd09fceec9c17ef49d0f22f6882ec2a25b..5ea16edda309e586bc662ee4dbfa1531c90ba192 100644 (file)
@@ -13,35 +13,46 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.odlparent</groupId>
     <artifactId>bundle-parent</artifactId>
-    <version>9.0.13</version>
+    <version>13.0.11</version>
     <relativePath/>
   </parent>
 
   <groupId>org.opendaylight.transportpce</groupId>
   <artifactId>transportpce-networkmodel</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
+  <version>10.0.0-SNAPSHOT</version>
   <packaging>bundle</packaging>
 
+  <properties>
+    <transportpce.models.version>20.0.0-SNAPSHOT</transportpce.models.version>
+  </properties>
+
   <dependencyManagement>
     <dependencies>
+      <dependency>
+        <groupId>org.opendaylight.transportpce.models</groupId>
+        <artifactId>transportpce-models-artifacts</artifactId>
+        <version>${transportpce.models.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
       <dependency>
         <groupId>org.opendaylight.yangtools</groupId>
         <artifactId>yangtools-artifacts</artifactId>
-        <version>7.0.14</version>
+        <version>13.0.2</version>
         <scope>import</scope>
         <type>pom</type>
       </dependency>
       <dependency>
         <groupId>org.opendaylight.mdsal</groupId>
         <artifactId>mdsal-artifacts</artifactId>
-        <version>8.0.11</version>
+        <version>13.0.1</version>
         <scope>import</scope>
         <type>pom</type>
       </dependency>
       <dependency>
         <groupId>org.opendaylight.netconf</groupId>
         <artifactId>netconf-artifacts</artifactId>
-        <version>2.0.13</version>
+        <version>7.0.4</version>
         <scope>import</scope>
         <type>pom</type>
       </dependency>
@@ -50,58 +61,58 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
 
   <dependencies>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-common</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-1.2.1</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-device</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-2.2.1</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-network</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-7.1.0</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-service</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-13.1.0</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>transportpce-api</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-device-1.2.1</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>transportpce-common</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-device-2.2.1</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>concepts</artifactId>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-device-7.1.0</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>yang-common</artifactId>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-network-13.1.0</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>yang-model-api</artifactId>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-service-13.1.0</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>yang-data-api</artifactId>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>transportpce-api</artifactId>
+      <version>${project.version}</version>
+    </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>transportpce-common</artifactId>
+      <version>${project.version}</version>
     </dependency>
     <dependency>
       <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>yang-data-impl</artifactId>
+      <artifactId>concepts</artifactId>
     </dependency>
     <dependency>
       <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>yang-data-codec-gson</artifactId>
+      <artifactId>yang-common</artifactId>
     </dependency>
     <dependency>
       <groupId>org.opendaylight.mdsal.model</groupId>
@@ -136,52 +147,29 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <artifactId>mdsal-binding-api</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.opendaylight.mdsal</groupId>
-      <artifactId>mdsal-binding-dom-codec</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.mdsal</groupId>
-      <artifactId>mdsal-binding-dom-codec-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.mdsal</groupId>
-      <artifactId>mdsal-binding-dom-codec-spi</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.mdsal</groupId>
-      <artifactId>mdsal-binding-runtime-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.mdsal</groupId>
-      <artifactId>mdsal-binding-runtime-spi</artifactId>
+      <groupId>org.opendaylight.netconf.model</groupId>
+      <artifactId>rfc5277</artifactId>
     </dependency>
     <dependency>
       <groupId>org.opendaylight.netconf</groupId>
-      <artifactId>ietf-netconf</artifactId>
+      <artifactId>netconf-topology</artifactId>
     </dependency>
     <dependency>
       <groupId>org.opendaylight.netconf</groupId>
-      <artifactId>ietf-netconf-notifications</artifactId>
+      <artifactId>netconf-client-mdsal</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.opendaylight.netconf</groupId>
-      <artifactId>sal-netconf-connector</artifactId>
+      <groupId>com.github.spotbugs</groupId>
+      <artifactId>spotbugs-annotations</artifactId>
+      <optional>true</optional>
     </dependency>
     <dependency>
       <groupId>com.google.guava</groupId>
       <artifactId>guava</artifactId>
     </dependency>
     <dependency>
-      <groupId>com.google.code.gson</groupId>
-      <artifactId>gson</artifactId>
-    </dependency>
-
-    <!-- Sodium bump: javax.annotation.Nullable and friends -->
-    <dependency>
-      <groupId>com.google.code.findbugs</groupId>
-      <artifactId>jsr305</artifactId>
-      <version>3.0.2</version>
-      <optional>true</optional>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.service.component.annotations</artifactId>
     </dependency>
 
     <!-- Testing Dependencies -->
@@ -191,6 +179,26 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.yangtools</groupId>
+      <artifactId>yang-model-api</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.yangtools</groupId>
+      <artifactId>yang-data-api</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.yangtools</groupId>
+      <artifactId>yang-data-impl</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.yangtools</groupId>
+      <artifactId>yang-data-codec-gson</artifactId>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>org.opendaylight.mdsal</groupId>
       <artifactId>mdsal-binding-dom-adapter</artifactId>
@@ -201,5 +209,40 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <artifactId>mdsal-binding-generator</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>mdsal-binding-dom-codec</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>mdsal-binding-dom-codec-api</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>mdsal-binding-dom-codec-spi</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>mdsal-binding-runtime-api</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>mdsal-binding-runtime-spi</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.netconf.model</groupId>
+      <artifactId>rfc6241</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>com.google.code.gson</groupId>
+      <artifactId>gson</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 </project>
index b48c61ffee6d9066e1c7084e1001a3f08aa32a1c..367388f8d7ea5515324901041b24ff5a61b0ba81 100644 (file)
@@ -10,20 +10,18 @@ package org.opendaylight.transportpce.networkmodel;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutionException;
-import javax.annotation.Nonnull;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.mdsal.binding.api.MountPoint;
 import org.opendaylight.mdsal.binding.api.NotificationService;
-import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
+import org.opendaylight.mdsal.binding.api.RpcService;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.transportpce.common.Timeouts;
@@ -31,16 +29,16 @@ import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.networkmodel.dto.NodeRegistration;
 import org.opendaylight.transportpce.networkmodel.service.NetworkModelService;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscription;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscriptionInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.CreateSubscriptionOutput;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.NotificationsService;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.notification._1._0.rev080714.StreamNameType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.rev080714.Netconf;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.rev080714.netconf.Streams;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netmod.notification.rev080714.netconf.streams.Stream;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus.ConnectionStatus;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapability;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.ConnectionOper.ConnectionStatus;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.connection.oper.available.capabilities.AvailableCapability;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev231121.NetconfNode;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.RpcResult;
@@ -69,16 +67,17 @@ public class NetConfTopologyListener implements DataTreeChangeListener<Node> {
         this.portMapping = portMapping;
     }
 
-    public void onDataTreeChanged(@Nonnull Collection<DataTreeModification<Node>> changes) {
+    @Override
+    public void onDataTreeChanged(List<DataTreeModification<Node>> changes) {
         LOG.info("onDataTreeChanged - {}", this.getClass().getSimpleName());
         for (DataTreeModification<Node> change : changes) {
             DataObjectModification<Node> rootNode = change.getRootNode();
-            if (rootNode.getDataBefore() == null) {
+            if (rootNode.dataBefore() == null) {
                 continue;
             }
-            String nodeId = rootNode.getDataBefore().key().getNodeId().getValue();
-            NetconfNode netconfNodeBefore = rootNode.getDataBefore().augmentation(NetconfNode.class);
-            switch (rootNode.getModificationType()) {
+            String nodeId = rootNode.dataBefore().key().getNodeId().getValue();
+            NetconfNode netconfNodeBefore = rootNode.dataBefore().augmentation(NetconfNode.class);
+            switch (rootNode.modificationType()) {
                 case DELETE:
                     if (this.networkModelService.deleteOpenRoadmnode(nodeId)) {
                         onDeviceDisConnected(nodeId);
@@ -86,7 +85,7 @@ public class NetConfTopologyListener implements DataTreeChangeListener<Node> {
                     }
                     break;
                 case WRITE:
-                    NetconfNode netconfNodeAfter = rootNode.getDataAfter().augmentation(NetconfNode.class);
+                    NetconfNode netconfNodeAfter = rootNode.dataAfter().augmentation(NetconfNode.class);
                     if (ConnectionStatus.Connecting.equals(netconfNodeBefore.getConnectionStatus())
                             && ConnectionStatus.Connected.equals(netconfNodeAfter.getConnectionStatus())) {
                         LOG.info("Connecting Node: {}", nodeId);
@@ -100,8 +99,8 @@ public class NetConfTopologyListener implements DataTreeChangeListener<Node> {
                             return;
                         }
                         this.networkModelService
-                            .createOpenRoadmNode(nodeId, deviceCapabilityOpt.get().getCapability());
-                        onDeviceConnected(nodeId, deviceCapabilityOpt.get().getCapability());
+                            .createOpenRoadmNode(nodeId, deviceCapabilityOpt.orElseThrow().getCapability());
+                        onDeviceConnected(nodeId, deviceCapabilityOpt.orElseThrow().getCapability());
                         LOG.info("Device {} correctly connected to controller", nodeId);
                     }
                     if (ConnectionStatus.Connected.equals(netconfNodeBefore.getConnectionStatus())
@@ -110,7 +109,7 @@ public class NetConfTopologyListener implements DataTreeChangeListener<Node> {
                     }
                     break;
                 default:
-                    LOG.debug("Unknown modification type {}", rootNode.getModificationType().name());
+                    LOG.debug("Unknown modification type {}", rootNode.modificationType().name());
                     break;
             }
         }
@@ -123,7 +122,7 @@ public class NetConfTopologyListener implements DataTreeChangeListener<Node> {
             LOG.error("Failed to get mount point for node {}", nodeId);
             return;
         }
-        MountPoint mountPoint = mountPointOpt.get();
+        MountPoint mountPoint = mountPointOpt.orElseThrow();
         final Optional<NotificationService> notificationService = mountPoint.getService(NotificationService.class);
         if (notificationService.isEmpty()) {
             LOG.error(RPC_SERVICE_FAILED, nodeId);
@@ -131,7 +130,7 @@ public class NetConfTopologyListener implements DataTreeChangeListener<Node> {
         }
         NodeRegistration nodeRegistration =
             new NodeRegistration(
-                nodeId, openRoadmVersion, notificationService.get(), this.dataBroker, this.portMapping);
+                nodeId, openRoadmVersion, notificationService.orElseThrow(), this.dataBroker, this.portMapping);
         nodeRegistration.registerListeners();
         registrations.put(nodeId, nodeRegistration);
 
@@ -144,11 +143,11 @@ public class NetConfTopologyListener implements DataTreeChangeListener<Node> {
     }
 
     private boolean subscribeStream(MountPoint mountPoint, String nodeId) {
-        final Optional<RpcConsumerRegistry> service = mountPoint.getService(RpcConsumerRegistry.class);
+        final Optional<RpcService> service = mountPoint.getService(RpcService.class);
         if (service.isEmpty()) {
             return false;
         }
-        final NotificationsService rpcService = service.get().getRpcService(NotificationsService.class);
+        final CreateSubscription rpcService = service.orElseThrow().getRpc(CreateSubscription.class);
         if (rpcService == null) {
             LOG.error(RPC_SERVICE_FAILED, nodeId);
             return false;
@@ -156,8 +155,7 @@ public class NetConfTopologyListener implements DataTreeChangeListener<Node> {
         // Set the default stream as OPENROADM
         for (String streamName : getSupportedStream(nodeId)) {
             LOG.info("Triggering notification stream {} for node {}", streamName, nodeId);
-            ListenableFuture<RpcResult<CreateSubscriptionOutput>> subscription =
-                rpcService.createSubscription(
+            ListenableFuture<RpcResult<CreateSubscriptionOutput>> subscription = rpcService.invoke(
                     new CreateSubscriptionInputBuilder().setStream(new StreamNameType(streamName)).build());
             if (checkSupportedStream(streamName, subscription)) {
                 return true;
@@ -199,13 +197,13 @@ public class NetConfTopologyListener implements DataTreeChangeListener<Node> {
         Optional<Streams> ordmInfoObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, streamsIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-        if (ordmInfoObject == null || ordmInfoObject.isEmpty() || ordmInfoObject.get().getStream().isEmpty()) {
+        if (ordmInfoObject == null || ordmInfoObject.isEmpty() || ordmInfoObject.orElseThrow().getStream().isEmpty()) {
             LOG.error("List of streams supports by device is not present");
             return List.of("OPENROADM","NETCONF");
         }
         List<String> streams = new ArrayList<>();
         List<String> netconfStreams = new ArrayList<>();
-        for (Stream strm : ordmInfoObject.get().getStream().values()) {
+        for (Stream strm : ordmInfoObject.orElseThrow().getStream().values()) {
             LOG.debug("Streams are {}", strm);
             if ("OPENROADM".equalsIgnoreCase(strm.getName().getValue())) {
                 streams.add(strm.getName().getValue());
index f1c56764f1e7305e2ce99413552c1fd34e056c74..7a95388351da7c61c5409c619d0a9e9a58199be3 100644 (file)
@@ -7,99 +7,98 @@
  */
 package org.opendaylight.transportpce.networkmodel;
 
+import java.util.ArrayList;
+import java.util.List;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
 import org.opendaylight.mdsal.binding.api.NotificationService;
-import org.opendaylight.mdsal.binding.api.RpcProviderService;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.InstanceIdentifiers;
 import org.opendaylight.transportpce.common.NetworkUtils;
+import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
+import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.networkmodel.listeners.PortMappingListener;
 import org.opendaylight.transportpce.networkmodel.listeners.ServiceHandlerListener;
 import org.opendaylight.transportpce.networkmodel.service.FrequenciesService;
+import org.opendaylight.transportpce.networkmodel.service.NetworkModelService;
 import org.opendaylight.transportpce.networkmodel.util.TpceNetwork;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.TransportpceNetworkutilsService;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.TransportpceServicehandlerListener;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.Network;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.concepts.ObjectRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@Component
 public class NetworkModelProvider {
 
     private static final Logger LOG = LoggerFactory.getLogger(NetworkModelProvider.class);
     private static final InstanceIdentifier<Mapping> MAPPING_II = InstanceIdentifier.create(Network.class)
-        .child(org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network
+        .child(org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network
                 .Nodes.class)
         .child(Mapping.class);
 
     private final DataBroker dataBroker;
-    private final RpcProviderService rpcProviderService;
-    private final TransportpceNetworkutilsService networkutilsService;
     private final NetConfTopologyListener topologyListener;
-    private ListenerRegistration<NetConfTopologyListener> dataTreeChangeListenerRegistration;
-    private ListenerRegistration<PortMappingListener> mappingListenerRegistration;
-    private ObjectRegistration<TransportpceNetworkutilsService> networkutilsServiceRpcRegistration;
+    private List<Registration> listeners;
     private TpceNetwork tpceNetwork;
-    private ListenerRegistration<TransportpceServicehandlerListener> serviceHandlerListenerRegistration;
+    private Registration serviceHandlerListenerRegistration;
     private NotificationService notificationService;
     private FrequenciesService frequenciesService;
     private PortMappingListener portMappingListener;
 
-    public NetworkModelProvider(NetworkTransactionService networkTransactionService, final DataBroker dataBroker,
-        final RpcProviderService rpcProviderService, final TransportpceNetworkutilsService networkutilsService,
-        final NetConfTopologyListener topologyListener, NotificationService notificationService,
-        FrequenciesService frequenciesService, PortMappingListener portMappingListener) {
+    @Activate
+    public NetworkModelProvider(@Reference NetworkTransactionService networkTransactionService,
+            @Reference final DataBroker dataBroker,
+            @Reference final NetworkModelService networkModelService,
+            @Reference DeviceTransactionManager deviceTransactionManager,
+            @Reference PortMapping portMapping,
+            @Reference NotificationService notificationService,
+            @Reference FrequenciesService frequenciesService) {
         this.dataBroker = dataBroker;
-        this.rpcProviderService = rpcProviderService;
-        this.networkutilsService = networkutilsService;
-        this.topologyListener = topologyListener;
-        this.tpceNetwork = new TpceNetwork(networkTransactionService);
         this.notificationService = notificationService;
         this.frequenciesService = frequenciesService;
-        this.portMappingListener = portMappingListener;
+        this.listeners = new ArrayList<>();
+        this.topologyListener = new NetConfTopologyListener(networkModelService, dataBroker, deviceTransactionManager,
+            portMapping);
+        this.tpceNetwork = new TpceNetwork(networkTransactionService);
+        this.portMappingListener = new PortMappingListener(networkModelService);
+        this.init();
     }
 
     /**
      * Method called when the blueprint container is created.
      */
-    public void init() {
+    private void init() {
         LOG.info("NetworkModelProvider Session Initiated");
         tpceNetwork.createLayer(NetworkUtils.CLLI_NETWORK_ID);
         tpceNetwork.createLayer(NetworkUtils.UNDERLAY_NETWORK_ID);
         tpceNetwork.createLayer(NetworkUtils.OVERLAY_NETWORK_ID);
         tpceNetwork.createLayer(NetworkUtils.OTN_NETWORK_ID);
-        dataTreeChangeListenerRegistration = dataBroker.registerDataTreeChangeListener(
-                DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL,
-                InstanceIdentifiers.NETCONF_TOPOLOGY_II.child(Node.class)), topologyListener);
-        mappingListenerRegistration = dataBroker.registerDataTreeChangeListener(
-                DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION, MAPPING_II), portMappingListener);
-        networkutilsServiceRpcRegistration =
-            rpcProviderService.registerRpcImplementation(TransportpceNetworkutilsService.class, networkutilsService);
-        TransportpceServicehandlerListener serviceHandlerListner =
-                new ServiceHandlerListener(frequenciesService);
-        serviceHandlerListenerRegistration = notificationService.registerNotificationListener(serviceHandlerListner);
+        listeners.add(dataBroker.registerTreeChangeListener(
+                DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL,
+                    InstanceIdentifiers.NETCONF_TOPOLOGY_II.child(Node.class)),
+                topologyListener));
+        listeners.add(dataBroker.registerTreeChangeListener(
+                DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, MAPPING_II), portMappingListener));
+        serviceHandlerListenerRegistration = notificationService.registerCompositeListener(
+            new ServiceHandlerListener(frequenciesService).getCompositeListener());
     }
 
         /**
          * Method called when the blueprint container is destroyed.
          */
+    @Deactivate
     public void close() {
         LOG.info("NetworkModelProvider Closed");
-        if (dataTreeChangeListenerRegistration != null) {
-            dataTreeChangeListenerRegistration.close();
-        }
-        if (mappingListenerRegistration != null) {
-            mappingListenerRegistration.close();
-        }
-        if (networkutilsServiceRpcRegistration != null) {
-            networkutilsServiceRpcRegistration.close();
-        }
+        listeners.forEach(lis -> lis.close());
+        listeners.clear();
         serviceHandlerListenerRegistration.close();
     }
 }
index 24aa97a74367ee4fceda1afba34aa423865cff56..9b6287c62ab0634e65d0eb0c4fa8e10d35652317 100644 (file)
@@ -12,22 +12,26 @@ import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.ReadTransaction;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
 import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.NetworkUtils;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.DeleteLinkInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.DeleteLinkOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.DeleteLinkOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.InitRdmXpdrLinksInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.InitRdmXpdrLinksOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.InitRdmXpdrLinksOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.InitRoadmNodesInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.InitRoadmNodesOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.InitRoadmNodesOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.InitXpdrRdmLinksInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.InitXpdrRdmLinksOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.InitXpdrRdmLinksOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.TransportpceNetworkutilsService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.DeleteLink;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.DeleteLinkInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.DeleteLinkOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.DeleteLinkOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitRdmXpdrLinks;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitRdmXpdrLinksInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitRdmXpdrLinksOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitRdmXpdrLinksOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitRoadmNodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitRoadmNodesInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitRoadmNodesOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitRoadmNodesOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitXpdrRdmLinks;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitXpdrRdmLinksInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitXpdrRdmLinksOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitXpdrRdmLinksOutputBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
@@ -36,27 +40,48 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.top
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkKey;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class NetworkUtilsImpl implements TransportpceNetworkutilsService {
+@Component
+public class NetworkUtilsImpl {
 
     private static final Logger LOG = LoggerFactory.getLogger(NetworkUtilsImpl.class);
     private final DataBroker dataBroker;
+    private final Registration rpcReg;
 
-    public NetworkUtilsImpl(DataBroker dataBroker) {
+    @Activate
+    public NetworkUtilsImpl(@Reference DataBroker dataBroker, @Reference RpcProviderService rpcProvider) {
         this.dataBroker = dataBroker;
+        rpcReg = rpcProvider.registerRpcImplementations(
+                (DeleteLink) this::deleteLink,
+                (InitRoadmNodes) this::initRoadmNodes,
+                (InitXpdrRdmLinks) this::initXpdrRdmLinks,
+                (InitRdmXpdrLinks) this::initRdmXpdrLinks
+                );
+        LOG.info("NetworkUtilsImpl instanciated");
     }
 
-    @Override
-    public ListenableFuture<RpcResult<DeleteLinkOutput>> deleteLink(DeleteLinkInput input) {
+
+    @Deactivate
+    public void close() {
+        rpcReg.close();
+        LOG.info("{} closed", getClass().getSimpleName());
+    }
+
+    private ListenableFuture<RpcResult<DeleteLinkOutput>> deleteLink(DeleteLinkInput input) {
 
         LinkId linkId = new LinkId(input.getLinkId());
         // Building link instance identifier
-        InstanceIdentifier.InstanceIdentifierBuilder<Link> linkIID = InstanceIdentifier.builder(Networks.class)
+        InstanceIdentifier.Builder<Link> linkIID = InstanceIdentifier.builder(Networks.class)
             .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
             .augmentation(Network1.class).child(Link.class, new LinkKey(linkId));
 
@@ -69,15 +94,13 @@ public class NetworkUtilsImpl implements TransportpceNetworkutilsService {
             if (!linkOptional.isPresent()) {
                 LOG.info("Link not present");
                 return RpcResultBuilder
-                    .success(new DeleteLinkOutputBuilder().setResult(
-                        "Fail"))
+                    .success(new DeleteLinkOutputBuilder().setResult("Fail").build())
                     .buildFuture();
             }
         } catch (ExecutionException | InterruptedException e) {
             LOG.error("readMdSal: Error reading link {}", input.getLinkId());
             return RpcResultBuilder
-                .success(new DeleteLinkOutputBuilder().setResult(
-                    "Fail"))
+                .success(new DeleteLinkOutputBuilder().setResult("Fail").build())
                 .buildFuture();
         }
 
@@ -88,35 +111,35 @@ public class NetworkUtilsImpl implements TransportpceNetworkutilsService {
             LOG.info("Link with linkId: {} deleted from {} layer.",
                 input.getLinkId(), NetworkUtils.OVERLAY_NETWORK_ID);
             return RpcResultBuilder
-                .success(new DeleteLinkOutputBuilder().setResult(
-                    "Link {} deleted successfully"))
+                .success(new DeleteLinkOutputBuilder().setResult("Link {} deleted successfully").build())
                 .buildFuture();
         } catch (InterruptedException | ExecutionException e) {
             return RpcResultBuilder.<DeleteLinkOutput>failed().buildFuture();
         }
     }
 
-    @Override
-    public ListenableFuture<RpcResult<InitRoadmNodesOutput>> initRoadmNodes(InitRoadmNodesInput input) {
+    private ListenableFuture<RpcResult<InitRoadmNodesOutput>> initRoadmNodes(InitRoadmNodesInput input) {
         boolean createRdmLinks = OrdLink.createRdm2RdmLinks(input, this.dataBroker);
         if (createRdmLinks) {
             return RpcResultBuilder
-                .success(new InitRoadmNodesOutputBuilder().setResult(
-                    "Unidirectional Roadm-to-Roadm Link created successfully"))
+                .success(new InitRoadmNodesOutputBuilder()
+                    .setResult("Unidirectional Roadm-to-Roadm Link created successfully")
+                    .build())
                 .buildFuture();
         } else {
             return RpcResultBuilder.<InitRoadmNodesOutput>failed().buildFuture();
         }
     }
 
-    @Override
-    public ListenableFuture<RpcResult<InitXpdrRdmLinksOutput>> initXpdrRdmLinks(InitXpdrRdmLinksInput input) {
+    private ListenableFuture<RpcResult<InitXpdrRdmLinksOutput>> initXpdrRdmLinks(InitXpdrRdmLinksInput input) {
         // Assigns user provided input in init-network-view RPC to nodeId
         LOG.info("Xpdr to Roadm links rpc called");
         boolean createXpdrRdmLinks = Rdm2XpdrLink.createXpdrRdmLinks(input.getLinksInput(), this.dataBroker);
         if (createXpdrRdmLinks) {
             return RpcResultBuilder
-                .success(new InitXpdrRdmLinksOutputBuilder().setResult("Xponder Roadm Link created successfully"))
+                .success(new InitXpdrRdmLinksOutputBuilder()
+                    .setResult("Xponder Roadm Link created successfully")
+                    .build())
                 .buildFuture();
         } else {
             LOG.error("init-xpdr-rdm-links rpc failed due to a bad input parameter");
@@ -124,13 +147,14 @@ public class NetworkUtilsImpl implements TransportpceNetworkutilsService {
         }
     }
 
-    @Override
-    public ListenableFuture<RpcResult<InitRdmXpdrLinksOutput>> initRdmXpdrLinks(InitRdmXpdrLinksInput input) {
+    private ListenableFuture<RpcResult<InitRdmXpdrLinksOutput>> initRdmXpdrLinks(InitRdmXpdrLinksInput input) {
         LOG.info("Roadm to Xpdr links rpc called");
         boolean createRdmXpdrLinks = Rdm2XpdrLink.createRdmXpdrLinks(input.getLinksInput(), this.dataBroker);
         if (createRdmXpdrLinks) {
             return RpcResultBuilder
-                .success(new InitRdmXpdrLinksOutputBuilder().setResult("Roadm Xponder links created successfully"))
+                .success(new InitRdmXpdrLinksOutputBuilder()
+                    .setResult("Roadm Xponder links created successfully")
+                    .build())
                 .buildFuture();
         } else {
             LOG.error("init-rdm-xpdr-links rpc failed due to a bad input parameter");
index ba108903f330fd8bddc774bbff1a424b6fe558da..c3fb618d14bdc2862b5a2d296ac3eeba419ef41a 100644 (file)
@@ -19,12 +19,12 @@ import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.NetworkUtils;
 import org.opendaylight.transportpce.networkmodel.util.LinkIdUtil;
 import org.opendaylight.transportpce.networkmodel.util.TopologyUtils;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.InitRoadmNodesInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitRoadmNodesInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
@@ -82,7 +82,7 @@ final class OrdLink {
         LinkId linkId = LinkIdUtil.buildLinkId(srcNode, srcTp, destNode, destTp);
 
         // Building link instance identifier
-        InstanceIdentifier.InstanceIdentifierBuilder<Link> linkIID = InstanceIdentifier.builder(Networks.class)
+        InstanceIdentifier.Builder<Link> linkIID = InstanceIdentifier.builder(Networks.class)
             .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
             .augmentation(Network1.class).child(Link.class, new LinkKey(linkId));
 
@@ -116,7 +116,7 @@ final class OrdLink {
                 Optional<TerminationPoint> tpOpt;
                 tpOpt = tpFf.get();
                 if (tpOpt.isPresent()) {
-                    return tpOpt.get();
+                    return tpOpt.orElseThrow();
                 }
             } catch (InterruptedException | ExecutionException e) {
                 LOG.error("Impossible to get tp-id {} of node {} from {}", srcTp, srcNode,
index 39f26e2c4ef814956dedb18d87e860e13f80ac7e..9cd3d447fc9784e5a32b60ee1e5992d6eaa0f946 100644 (file)
@@ -16,7 +16,6 @@ import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
-import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.MountPoint;
 import org.opendaylight.mdsal.binding.api.ReadTransaction;
@@ -25,18 +24,19 @@ import org.opendaylight.transportpce.common.Timeouts;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.networkmodel.util.TopologyUtils;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.InitRoadmNodesInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.cp.to.degree.CpToDegree;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev170929.Direction;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitRoadmNodesInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.Network;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.cp.to.degree.CpToDegree;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.OrgOpenroadmDevice;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.Protocols;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev161014.Protocols1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev161014.lldp.container.lldp.NbrList;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev161014.lldp.container.lldp.nbr.list.IfName;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.Direction;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Uint8;
@@ -61,40 +61,44 @@ public class R2RLinkDiscovery {
     public boolean readLLDP(NodeId nodeId, String nodeVersion) {
         switch (nodeVersion) {
             case OPENROADM_DEVICE_VERSION_1_2_1:
-                InstanceIdentifier<Protocols> protocols121IID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                    .child(Protocols.class);
+                InstanceIdentifier<Protocols> protocols121IID = InstanceIdentifier
+                    .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                    .child(Protocols.class)
+                    .build();
                 Optional<Protocols> protocol121Object = this.deviceTransactionManager.getDataFromDevice(
                     nodeId.getValue(), LogicalDatastoreType.OPERATIONAL, protocols121IID, Timeouts.DEVICE_READ_TIMEOUT,
                     Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-                if (!protocol121Object.isPresent()
-                        || (protocol121Object.get().augmentation(Protocols1.class) == null)) {
-                    LOG.warn("LLDP subtree is missing : isolated openroadm device");
+                if (hasNoNeighbor121(protocol121Object)) {
+                    LOG.warn("LLDP subtree is missing or incomplete: isolated openroadm device");
                     return false;
                 }
                 // get neighbor list
-                NbrList nbr121List = protocol121Object.get().augmentation(Protocols1.class).getLldp().getNbrList();
+                NbrList nbr121List = protocol121Object.orElseThrow().augmentation(Protocols1.class).getLldp()
+                    .getNbrList();
                 LOG.info("LLDP subtree is present. Device has {} neighbours", nbr121List.getIfName().size());
                 // try to create rdm2rdm link
                 return rdm2rdmLinkCreatedv121(nodeId, nbr121List);
             case OPENROADM_DEVICE_VERSION_2_2_1:
                 InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device
-                    .container.org.openroadm.device.Protocols> protocols221IID =
-                        InstanceIdentifier.create(org.opendaylight.yang.gen.v1.http
-                            .org.openroadm.device.rev181019.org.openroadm.device.container.OrgOpenroadmDevice.class)
-                            .child(org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019
-                                .org.openroadm.device.container.org.openroadm.device.Protocols.class);
-                Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device
-                    .container.org.openroadm.device.Protocols> protocol221Object = this.deviceTransactionManager
+                        .container.org.openroadm.device.Protocols> protocols221IID = InstanceIdentifier
+                    .builderOfInherited(
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.OrgOpenroadmDeviceData.class,
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container
+                            .OrgOpenroadmDevice.class)
+                    .child(
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container
+                            .org.openroadm.device.Protocols.class)
+                    .build();
+                var protocol221Object = this.deviceTransactionManager
                     .getDataFromDevice(nodeId.getValue(), LogicalDatastoreType.OPERATIONAL, protocols221IID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-                if (!protocol221Object.isPresent() || (protocol221Object.get().augmentation(
-                        org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev181019.Protocols1.class) == null)) {
-                    LOG.warn("LLDP subtree is missing : isolated openroadm device");
+                if (hasNoNeighbor221(protocol221Object)) {
+                    LOG.warn("LLDP subtree is missing or incomplete: isolated openroadm device");
                     return false;
                 }
-                org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev181019.lldp.container.lldp.@Nullable NbrList
-                    nbr221List = protocol221Object.get().augmentation(org.opendaylight.yang.gen.v1.http
-                        .org.openroadm.lldp.rev181019.Protocols1.class).getLldp().getNbrList();
+                var nbr221List = protocol221Object.orElseThrow().augmentation(
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev181019.Protocols1.class)
+                    .getLldp().getNbrList();
                 LOG.info("LLDP subtree is present. Device has {} neighbours", nbr221List.getIfName().size());
                 return rdm2rdmLinkCreatedv221(nodeId, nbr221List);
             case OPENROADM_DEVICE_VERSION_7_1:
@@ -106,6 +110,27 @@ public class R2RLinkDiscovery {
         }
     }
 
+    private boolean hasNoNeighbor121(Optional<Protocols> protocol121Object) {
+        return protocol121Object.isEmpty()
+                || protocol121Object.orElseThrow().augmentation(Protocols1.class) == null
+                || protocol121Object.orElseThrow().augmentation(Protocols1.class).getLldp() == null
+                || protocol121Object.orElseThrow().augmentation(Protocols1.class).getLldp().getNbrList() == null;
+    }
+
+    private boolean hasNoNeighbor221(Optional<
+            org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org
+                    .openroadm.device.Protocols> protocol221Object) {
+        return protocol221Object.isEmpty()
+                || protocol221Object.orElseThrow().augmentation(
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev181019.Protocols1.class) == null
+                || protocol221Object.orElseThrow().augmentation(
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev181019.Protocols1.class)
+                    .getLldp() == null
+                || protocol221Object.orElseThrow().augmentation(
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev181019.Protocols1.class)
+                    .getLldp().getNbrList() == null;
+    }
+
     private boolean rdm2rdmLinkCreatedv221(NodeId nodeId,
             org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev181019.lldp.container.lldp.NbrList nbrList) {
         boolean success = true;
@@ -167,8 +192,8 @@ public class R2RLinkDiscovery {
             .child(Nodes.class, new NodesKey(nodeId.getValue())).build();
         try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
             Optional<Nodes> nodesObject = readTx.read(LogicalDatastoreType.CONFIGURATION, nodesIID).get();
-            if (nodesObject.isPresent() && (nodesObject.get().getMapping() != null)) {
-                Collection<Mapping> mappingList = nodesObject.get().nonnullMapping().values();
+            if (nodesObject.isPresent() && (nodesObject.orElseThrow().getMapping() != null)) {
+                Collection<Mapping> mappingList = nodesObject.orElseThrow().nonnullMapping().values();
                 mappingList = mappingList.stream().filter(mp -> mp.getLogicalConnectionPoint().contains("DEG"
                     + degreeCounter)).collect(Collectors.toList());
                 if (mappingList.size() == 1) {
@@ -322,15 +347,15 @@ public class R2RLinkDiscovery {
             .child(Nodes.class, new NodesKey(nodeId.getValue())).build();
         try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
             Optional<Nodes> nodesObject = readTx.read(LogicalDatastoreType.CONFIGURATION, nodesIID).get();
-            if (nodesObject.isPresent() && (nodesObject.get().getCpToDegree() != null)) {
-                Collection<CpToDegree> cpToDeg = nodesObject.get().nonnullCpToDegree().values();
+            if (nodesObject.isPresent() && (nodesObject.orElseThrow().getCpToDegree() != null)) {
+                Collection<CpToDegree> cpToDeg = nodesObject.orElseThrow().nonnullCpToDegree().values();
                 Stream<CpToDegree> cpToDegStream = cpToDeg.stream().filter(cp -> cp.getInterfaceName() != null)
                     .filter(cp -> cp.getInterfaceName().equals(interfaceName));
                 if (cpToDegStream != null) {
                     @SuppressWarnings("unchecked") Optional<CpToDegree> firstCpToDegree = cpToDegStream.findFirst();
                     if (firstCpToDegree.isPresent() && (firstCpToDegree != null)) {
-                        LOG.debug("Found and returning {}",firstCpToDegree.get().getDegreeNumber().intValue());
-                        return firstCpToDegree.get().getDegreeNumber().intValue();
+                        LOG.debug("Found and returning {}",firstCpToDegree.orElseThrow().getDegreeNumber().intValue());
+                        return firstCpToDegree.orElseThrow().getDegreeNumber().intValue();
                     } else {
                         LOG.debug("Not found so returning nothing");
                         return null;
index 8f126883815e2b37d7d28b318201e2805d5d2022..227eefe2079ee2ee147c44c40f819522c29673d7 100644 (file)
@@ -21,14 +21,14 @@ import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.NetworkUtils;
 import org.opendaylight.transportpce.networkmodel.util.LinkIdUtil;
 import org.opendaylight.transportpce.networkmodel.util.TopologyUtils;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.links.input.grouping.LinksInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.links.input.grouping.LinksInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1Builder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.XpdrNetworkAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrNetworkAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
@@ -72,7 +72,7 @@ final class Rdm2XpdrLink {
             return false;
         }
         Network network = networkBldr.build();
-        InstanceIdentifier.InstanceIdentifierBuilder<Network> nwIID = InstanceIdentifier.builder(Networks.class)
+        InstanceIdentifier.Builder<Network> nwIID = InstanceIdentifier.builder(Networks.class)
             .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)));
         WriteTransaction wrtx = dataBroker.newWriteOnlyTransaction();
         wrtx.merge(LogicalDatastoreType.CONFIGURATION, nwIID.build(), network);
@@ -105,7 +105,7 @@ final class Rdm2XpdrLink {
             return false;
         }
         Network network = networkBldr.build();
-        InstanceIdentifier.InstanceIdentifierBuilder<Network> nwIID =
+        InstanceIdentifier.Builder<Network> nwIID =
             InstanceIdentifier.builder(Networks.class).child(Network.class,
                 new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)));
         WriteTransaction wrtx = dataBroker.newWriteOnlyTransaction();
@@ -158,9 +158,9 @@ final class Rdm2XpdrLink {
                 .setOppositeLink(LinkIdUtil.getOppositeLinkId(srcNode, srcTp, destNode, destTp));
         // If both TPs of the Xpdr2Rdm link are inService --> link inService. Otherwise outOfService
         if (State.InService.equals(xpdrTp.augmentation(org.opendaylight.yang.gen.v1.http
-                    .org.openroadm.common.network.rev211210.TerminationPoint1.class).getOperationalState())
+                    .org.openroadm.common.network.rev230526.TerminationPoint1.class).getOperationalState())
                 && State.InService.equals(rdmTp.augmentation(org.opendaylight.yang.gen.v1.http
-                    .org.openroadm.common.network.rev211210.TerminationPoint1.class).getOperationalState())) {
+                    .org.openroadm.common.network.rev230526.TerminationPoint1.class).getOperationalState())) {
             lnk2bldr.setOperationalState(State.InService).setAdministrativeState(AdminStates.InService);
         } else {
             lnk2bldr.setOperationalState(State.OutOfService).setAdministrativeState(AdminStates.OutOfService);
@@ -198,7 +198,7 @@ final class Rdm2XpdrLink {
                 Optional<TerminationPoint> tpOpt;
                 tpOpt = tpFf.get();
                 if (tpOpt.isPresent()) {
-                    return tpOpt.get();
+                    return tpOpt.orElseThrow();
                 }
             } catch (InterruptedException | ExecutionException e) {
                 LOG.error("Impossible to get tp-id {} of node {} from {}", srcTp, srcNode,
index eb2a59330bf08ad262ac36e1f811a6aed8f30862..61fd4b7f48c3e9a96494e402ae5c6199ad94b925 100644 (file)
@@ -25,10 +25,7 @@ import org.opendaylight.transportpce.networkmodel.listeners.DeviceListener710;
 import org.opendaylight.transportpce.networkmodel.listeners.TcaListener;
 import org.opendaylight.transportpce.networkmodel.listeners.TcaListener221;
 import org.opendaylight.transportpce.networkmodel.listeners.TcaListener710;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.alarm.rev161014.OrgOpenroadmAlarmListener;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.de.operations.rev161014.OrgOpenroadmDeOperationsListener;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.OrgOpenroadmDeviceListener;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -39,7 +36,7 @@ public class NodeRegistration {
     private final NotificationService notificationService;
     private final DataBroker dataBroker;
     private final PortMapping portMapping;
-    private final List<ListenerRegistration<?>> listeners;
+    private final List<Registration> listeners;
 
     public NodeRegistration(String nodeId, String nodeVersion, NotificationService notificationService,
             DataBroker dataBroker, PortMapping portMapping) {
@@ -48,7 +45,7 @@ public class NodeRegistration {
         this.notificationService = notificationService;
         this.dataBroker = dataBroker;
         this.portMapping = portMapping;
-        listeners = new ArrayList<ListenerRegistration<?>>();
+        listeners = new ArrayList<Registration>();
     }
 
     public void registerListeners() {
@@ -70,62 +67,62 @@ public class NodeRegistration {
 
     public void unregisterListeners() {
         LOG.info("Unregistering notification listeners for node: {}", this.nodeId);
-        for (ListenerRegistration<?> listenerRegistration : listeners) {
+        for (Registration listenerRegistration : listeners) {
             listenerRegistration.close();
         }
     }
 
     private void registerListeners121() {
-        OrgOpenroadmAlarmListener alarmListener = new AlarmNotificationListener(this.dataBroker);
+        AlarmNotificationListener alarmListener = new AlarmNotificationListener(this.dataBroker);
         LOG.info("Registering notification listener on OrgOpenroadmAlarmListener for node: {}", nodeId);
-        listeners.add(notificationService.registerNotificationListener(alarmListener));
+        listeners.add(notificationService.registerCompositeListener(alarmListener.getCompositeListener()));
 
-        OrgOpenroadmDeOperationsListener deOperationsListener = new DeOperationsListener();
+        DeOperationsListener deOperationsListener = new DeOperationsListener();
         LOG.info("Registering notification listener on OrgOpenroadmDeOperationsListener for node: {}", nodeId);
-        listeners.add(notificationService.registerNotificationListener(deOperationsListener));
+        listeners.add(notificationService.registerCompositeListener(deOperationsListener.getCompositeListener()));
 
-        OrgOpenroadmDeviceListener deviceListener = new DeviceListener121(nodeId, this.portMapping);
+        DeviceListener121 deviceListener = new DeviceListener121(nodeId, this.portMapping);
         LOG.info("Registering notification listener on OrgOpenroadmDeviceListener for node: {}", nodeId);
-        listeners.add(notificationService.registerNotificationListener(deviceListener));
+        listeners.add(notificationService.registerCompositeListener(deviceListener.getCompositeListener()));
 
         TcaListener tcaListener = new TcaListener();
         LOG.info("Registering notification listener on OrgOpenroadmTcaListener for node: {}", nodeId);
-        listeners.add(notificationService.registerNotificationListener(tcaListener));
+        listeners.add(notificationService.registerCompositeListener(tcaListener.getCompositeListener()));
     }
 
     private void registerListeners221() {
         AlarmNotificationListener221 alarmListener = new AlarmNotificationListener221(dataBroker);
         LOG.info("Registering notification listener on OrgOpenroadmAlarmListener for node: {}", nodeId);
-        listeners.add(notificationService.registerNotificationListener(alarmListener));
+        listeners.add(notificationService.registerCompositeListener(alarmListener.getCompositeListener()));
 
         DeOperationsListener221 deOperationsListener = new DeOperationsListener221();
         LOG.info("Registering notification listener on OrgOpenroadmDeOperationsListener for node: {}", nodeId);
-        listeners.add(notificationService.registerNotificationListener(deOperationsListener));
+        listeners.add(notificationService.registerCompositeListener(deOperationsListener.getCompositeListener()));
 
         DeviceListener221 deviceListener = new DeviceListener221(nodeId, this.portMapping);
         LOG.info("Registering notification listener on OrgOpenroadmDeviceListener for node: {}", nodeId);
-        listeners.add(notificationService.registerNotificationListener(deviceListener));
+        listeners.add(notificationService.registerCompositeListener(deviceListener.getCompositeListener()));
 
         TcaListener221 tcaListener = new TcaListener221();
         LOG.info("Registering notification listener on OrgOpenroadmTcaListener for node: {}", nodeId);
-        listeners.add(notificationService.registerNotificationListener(tcaListener));
+        listeners.add(notificationService.registerCompositeListener(tcaListener.getCompositeListener()));
     }
 
     private void registerListeners710() {
         AlarmNotificationListener710 alarmListener = new AlarmNotificationListener710(dataBroker);
         LOG.info("Registering notification listener on OrgOpenroadmAlarmListener for node: {}", nodeId);
-        listeners.add(notificationService.registerNotificationListener(alarmListener));
+        listeners.add(notificationService.registerCompositeListener(alarmListener.getCompositeListener()));
 
         DeOperationsListener710 deOperationsListener = new DeOperationsListener710();
         LOG.info("Registering notification listener on OrgOpenroadmDeOperationsListener for node: {}", nodeId);
-        listeners.add(notificationService.registerNotificationListener(deOperationsListener));
+        listeners.add(notificationService.registerCompositeListener(deOperationsListener.getCompositeListener()));
 
         DeviceListener710 deviceListener = new DeviceListener710(nodeId, this.portMapping);
         LOG.info("Registering notification listener on OrgOpenroadmDeviceListener for node: {}", nodeId);
-        listeners.add(notificationService.registerNotificationListener(deviceListener));
+        listeners.add(notificationService.registerCompositeListener(deviceListener.getCompositeListener()));
 
         TcaListener710 tcaListener = new TcaListener710();
         LOG.info("Registering notification listener on OrgOpenroadmTcaListener for node: {}", nodeId);
-        listeners.add(notificationService.registerNotificationListener(tcaListener));
+        listeners.add(notificationService.registerCompositeListener(tcaListener.getCompositeListener()));
     }
 }
index b0fa0ae7bec076e0e23270992955d08fc8c9a1d9..3b6d868ce7dd627c4d81b7479f5705ab862b5590 100644 (file)
@@ -9,7 +9,7 @@ package org.opendaylight.transportpce.networkmodel.dto;
 
 import java.util.List;
 import java.util.Map;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.XpdrNodeTypes;
 
 public class OtnTopoNode {
index c3d6ac1eeeb410e4f895347e3da18af839a06634..f0f57d62d0b3afb35b909024e1121bc9849ac0ee 100644 (file)
@@ -10,8 +10,10 @@ package org.opendaylight.transportpce.networkmodel.listeners;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.NotificationService.CompositeListener;
 import org.opendaylight.mdsal.binding.api.ReadTransaction;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.alarmsuppression.rev171102.ServiceNodelist;
@@ -19,7 +21,6 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.alarmsupp
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.alarmsuppression.rev171102.service.nodelist.nodelist.Nodes;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.alarmsuppression.rev171102.service.nodelist.nodelist.NodesBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.alarm.rev161014.AlarmNotification;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.alarm.rev161014.OrgOpenroadmAlarmListener;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.alarm.rev161014.alarm.ProbableCause;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resource.ResourceType;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resource.resource.Resource;
@@ -37,7 +38,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class AlarmNotificationListener implements OrgOpenroadmAlarmListener {
+public class AlarmNotificationListener {
 
     private static final Logger LOG = LoggerFactory.getLogger(AlarmNotificationListener.class);
     private static final String PIPE = "|";
@@ -47,21 +48,24 @@ public class AlarmNotificationListener implements OrgOpenroadmAlarmListener {
         this.dataBroker = dataBroker;
     }
 
+    public CompositeListener getCompositeListener() {
+        return new CompositeListener(Set.of(
+            new CompositeListener.Component<>(AlarmNotification.class, this::onAlarmNotification)));
+    }
 
     /**
      * Callback for alarm-notification.
      *
      * @param notification AlarmNotification object
      */
-    @Override
-    public void onAlarmNotification(AlarmNotification notification) {
+    private void onAlarmNotification(AlarmNotification notification) {
         List<Nodes> allNodeList = new ArrayList<>();
         InstanceIdentifier<ServiceNodelist> serviceNodeListIID = InstanceIdentifier.create(ServiceNodelist.class);
         try (ReadTransaction rtx = dataBroker.newReadOnlyTransaction()) {
             Optional<ServiceNodelist> serviceListObject =
                     rtx.read(LogicalDatastoreType.OPERATIONAL, serviceNodeListIID).get();
             if (serviceListObject.isPresent()) {
-                for (Nodelist nodelist : serviceListObject.get().nonnullNodelist().values()) {
+                for (Nodelist nodelist : serviceListObject.orElseThrow().nonnullNodelist().values()) {
                     allNodeList.addAll(nodelist.nonnullNodes().values());
                 }
             }
@@ -128,71 +132,71 @@ public class AlarmNotificationListener implements OrgOpenroadmAlarmListener {
             case CircuitPack:
                 Optional<CircuitPack> circuitPackOptional = tryCastToParticularResource(CircuitPack.class, resource);
                 if (circuitPackOptional.isPresent()) {
-                    circuitPack = circuitPackOptional.get().getCircuitPackName();
+                    circuitPack = circuitPackOptional.orElseThrow().getCircuitPackName();
                 }
                 break;
 
             case Connection:
                 Optional<Connection> connectionOptional = tryCastToParticularResource(Connection.class, resource);
                 if (connectionOptional.isPresent()) {
-                    connection = connectionOptional.get().getConnectionNumber();
+                    connection = connectionOptional.orElseThrow().getConnectionNumber();
                 }
                 break;
 
             case Degree:
                 Optional<Degree> degreeOptional = tryCastToParticularResource(Degree.class, resource);
                 if (degreeOptional.isPresent()) {
-                    degree = degreeOptional.get().getDegreeNumber().toString();
+                    degree = degreeOptional.orElseThrow().getDegreeNumber().toString();
                 }
                 break;
 
             case Interface:
                 Optional<Interface> interfaceOptional = tryCastToParticularResource(Interface.class, resource);
                 if (interfaceOptional.isPresent()) {
-                    iface = interfaceOptional.get().getInterfaceName();
+                    iface = interfaceOptional.orElseThrow().getInterfaceName();
                 }
                 break;
 
             case InternalLink:
                 Optional<InternalLink> internalLinkOptional = tryCastToParticularResource(InternalLink.class, resource);
                 if (internalLinkOptional.isPresent()) {
-                    internalLink = internalLinkOptional.get().getInternalLinkName();
+                    internalLink = internalLinkOptional.orElseThrow().getInternalLinkName();
                 }
                 break;
 
             case PhysicalLink:
                 Optional<PhysicalLink> physicalLinkOptional = tryCastToParticularResource(PhysicalLink.class, resource);
                 if (physicalLinkOptional.isPresent()) {
-                    physicalLink = physicalLinkOptional.get().getPhysicalLinkName();
+                    physicalLink = physicalLinkOptional.orElseThrow().getPhysicalLinkName();
                 }
                 break;
 
             case Service:
                 Optional<Service> serviceOptional = tryCastToParticularResource(Service.class, resource);
                 if (serviceOptional.isPresent()) {
-                    service = serviceOptional.get().getServiceName();
+                    service = serviceOptional.orElseThrow().getServiceName();
                 }
                 break;
 
             case Shelf:
                 Optional<Shelf> shelfOptional = tryCastToParticularResource(Shelf.class, resource);
                 if (shelfOptional.isPresent()) {
-                    shelf = shelfOptional.get().getShelfName();
+                    shelf = shelfOptional.orElseThrow().getShelfName();
                 }
                 break;
 
             case SharedRiskGroup:
                 Optional<Srg> sharedRiskGroupOptional = tryCastToParticularResource(Srg.class, resource);
                 if (sharedRiskGroupOptional.isPresent()) {
-                    sharedRiskGroup = sharedRiskGroupOptional.get().getSrgNumber().toString();
+                    sharedRiskGroup = sharedRiskGroupOptional.orElseThrow().getSrgNumber().toString();
                 }
                 break;
 
             case Port:
                 Optional<Port> portContainerOptional = tryCastToParticularResource(Port.class, resource);
                 if (portContainerOptional.isPresent()) {
-                    port = portContainerOptional.get().getPort().getPortName();
-                    portCircuitPack = portContainerOptional.get().getPort().getCircuitPackName();
+                    port = portContainerOptional.orElseThrow().getPort().getPortName();
+                    portCircuitPack = portContainerOptional.orElseThrow().getPort().getCircuitPackName();
                 }
                 break;
 
index f93301d1afeab921038a2aa354812ee233c5d835..d7336eb559d6cbdff72f373920e29569bde88d81 100644 (file)
@@ -10,8 +10,10 @@ package org.opendaylight.transportpce.networkmodel.listeners;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.NotificationService.CompositeListener;
 import org.opendaylight.mdsal.binding.api.ReadTransaction;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.alarmsuppression.rev171102.ServiceNodelist;
@@ -19,7 +21,6 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.alarmsupp
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.alarmsuppression.rev171102.service.nodelist.nodelist.Nodes;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.alarmsuppression.rev171102.service.nodelist.nodelist.NodesBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.alarm.rev181019.AlarmNotification;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.alarm.rev181019.OrgOpenroadmAlarmListener;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.alarm.rev181019.alarm.ProbableCause;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev181019.resource.ResourceType;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev181019.resource.resource.Resource;
@@ -37,7 +38,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class AlarmNotificationListener221 implements OrgOpenroadmAlarmListener {
+public class AlarmNotificationListener221 {
 
     private static final Logger LOG = LoggerFactory.getLogger(AlarmNotificationListener221.class);
     private static final String PIPE = "|";
@@ -47,14 +48,17 @@ public class AlarmNotificationListener221 implements OrgOpenroadmAlarmListener {
         this.dataBroker = dataBroker;
     }
 
+    public CompositeListener getCompositeListener() {
+        return new CompositeListener(Set.of(
+            new CompositeListener.Component<>(AlarmNotification.class, this::onAlarmNotification)));
+    }
 
     /**
      * Callback for alarm-notification.
      *
      * @param notification AlarmNotification object
      */
-    @Override
-    public void onAlarmNotification(AlarmNotification notification) {
+    private void onAlarmNotification(AlarmNotification notification) {
         List<Nodes> allNodeList = new ArrayList<>();
         InstanceIdentifier<ServiceNodelist> serviceNodeListIID = InstanceIdentifier.create(ServiceNodelist.class);
         try {
@@ -62,7 +66,7 @@ public class AlarmNotificationListener221 implements OrgOpenroadmAlarmListener {
             Optional<ServiceNodelist> serviceListObject =
                     rtx.read(LogicalDatastoreType.OPERATIONAL, serviceNodeListIID).get();
             if (serviceListObject.isPresent()) {
-                for (Nodelist nodelist : serviceListObject.get().nonnullNodelist().values()) {
+                for (Nodelist nodelist : serviceListObject.orElseThrow().nonnullNodelist().values()) {
                     allNodeList.addAll(nodelist.nonnullNodes().values());
                 }
             }
@@ -130,71 +134,71 @@ public class AlarmNotificationListener221 implements OrgOpenroadmAlarmListener {
             case CircuitPack:
                 Optional<CircuitPack> circuitPackOptional = tryCastToParticularResource(CircuitPack.class, resource);
                 if (circuitPackOptional.isPresent()) {
-                    circuitPack = circuitPackOptional.get().getCircuitPackName();
+                    circuitPack = circuitPackOptional.orElseThrow().getCircuitPackName();
                 }
                 break;
 
             case Connection:
                 Optional<Connection> connectionOptional = tryCastToParticularResource(Connection.class, resource);
                 if (connectionOptional.isPresent()) {
-                    connection = connectionOptional.get().getConnectionName();
+                    connection = connectionOptional.orElseThrow().getConnectionName();
                 }
                 break;
 
             case Degree:
                 Optional<Degree> degreeOptional = tryCastToParticularResource(Degree.class, resource);
                 if (degreeOptional.isPresent()) {
-                    degree = degreeOptional.get().getDegreeNumber().toString();
+                    degree = degreeOptional.orElseThrow().getDegreeNumber().toString();
                 }
                 break;
 
             case Interface:
                 Optional<Interface> interfaceOptional = tryCastToParticularResource(Interface.class, resource);
                 if (interfaceOptional.isPresent()) {
-                    iface = interfaceOptional.get().getInterfaceName();
+                    iface = interfaceOptional.orElseThrow().getInterfaceName();
                 }
                 break;
 
             case InternalLink:
                 Optional<InternalLink> internalLinkOptional = tryCastToParticularResource(InternalLink.class, resource);
                 if (internalLinkOptional.isPresent()) {
-                    internalLink = internalLinkOptional.get().getInternalLinkName();
+                    internalLink = internalLinkOptional.orElseThrow().getInternalLinkName();
                 }
                 break;
 
             case PhysicalLink:
                 Optional<PhysicalLink> physicalLinkOptional = tryCastToParticularResource(PhysicalLink.class, resource);
                 if (physicalLinkOptional.isPresent()) {
-                    physicalLink = physicalLinkOptional.get().getPhysicalLinkName();
+                    physicalLink = physicalLinkOptional.orElseThrow().getPhysicalLinkName();
                 }
                 break;
 
             case Service:
                 Optional<Service> serviceOptional = tryCastToParticularResource(Service.class, resource);
                 if (serviceOptional.isPresent()) {
-                    service = serviceOptional.get().getServiceName();
+                    service = serviceOptional.orElseThrow().getServiceName();
                 }
                 break;
 
             case Shelf:
                 Optional<Shelf> shelfOptional = tryCastToParticularResource(Shelf.class, resource);
                 if (shelfOptional.isPresent()) {
-                    shelf = shelfOptional.get().getShelfName();
+                    shelf = shelfOptional.orElseThrow().getShelfName();
                 }
                 break;
 
             case SharedRiskGroup:
                 Optional<Srg> sharedRiskGroupOptional = tryCastToParticularResource(Srg.class, resource);
                 if (sharedRiskGroupOptional.isPresent()) {
-                    sharedRiskGroup = sharedRiskGroupOptional.get().getSrgNumber().toString();
+                    sharedRiskGroup = sharedRiskGroupOptional.orElseThrow().getSrgNumber().toString();
                 }
                 break;
 
             case Port:
                 Optional<Port> portContainerOptional = tryCastToParticularResource(Port.class, resource);
                 if (portContainerOptional.isPresent()) {
-                    port = portContainerOptional.get().getPort().getPortName();
-                    portCircuitPack = portContainerOptional.get().getPort().getCircuitPackName();
+                    port = portContainerOptional.orElseThrow().getPort().getPortName();
+                    portCircuitPack = portContainerOptional.orElseThrow().getPort().getCircuitPackName();
                 }
                 break;
 
index c3f978c6603658dd6fd33b4fbf683081526262d3..e5328bd6e24436f5557913c4a8cf1ba395a98e02 100644 (file)
@@ -10,8 +10,10 @@ package org.opendaylight.transportpce.networkmodel.listeners;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
+import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.NotificationService.CompositeListener;
 import org.opendaylight.mdsal.binding.api.ReadTransaction;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.alarmsuppression.rev171102.ServiceNodelist;
@@ -19,7 +21,6 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.alarmsupp
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.alarmsuppression.rev171102.service.nodelist.nodelist.Nodes;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.alarmsuppression.rev171102.service.nodelist.nodelist.NodesBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.alarm.rev200529.AlarmNotification;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.alarm.rev200529.OrgOpenroadmAlarmListener;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.alarm.rev200529.alarm.ProbableCause;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev200529.resource.ResourceType;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev200529.resource.resource.Resource;
@@ -37,7 +38,7 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class AlarmNotificationListener710 implements OrgOpenroadmAlarmListener {
+public class AlarmNotificationListener710 {
 
     private static final Logger LOG = LoggerFactory.getLogger(AlarmNotificationListener710.class);
     private static final String PIPE = "|";
@@ -47,14 +48,18 @@ public class AlarmNotificationListener710 implements OrgOpenroadmAlarmListener {
         this.dataBroker = dataBroker;
     }
 
+    public CompositeListener getCompositeListener() {
+        return new CompositeListener(Set.of(
+            new CompositeListener.Component<>(AlarmNotification.class, this::onAlarmNotification)));
+    }
+
 
     /**
      * Callback for alarm-notification.
      *
      * @param notification AlarmNotification object
      */
-    @Override
-    public void onAlarmNotification(AlarmNotification notification) {
+    private void onAlarmNotification(AlarmNotification notification) {
         List<Nodes> allNodeList = new ArrayList<>();
         InstanceIdentifier<ServiceNodelist> serviceNodeListIID = InstanceIdentifier.create(ServiceNodelist.class);
         try {
@@ -62,7 +67,7 @@ public class AlarmNotificationListener710 implements OrgOpenroadmAlarmListener {
             Optional<ServiceNodelist> serviceListObject =
                     rtx.read(LogicalDatastoreType.OPERATIONAL, serviceNodeListIID).get();
             if (serviceListObject.isPresent()) {
-                for (Nodelist nodelist : serviceListObject.get().nonnullNodelist().values()) {
+                for (Nodelist nodelist : serviceListObject.orElseThrow().nonnullNodelist().values()) {
                     allNodeList.addAll(nodelist.nonnullNodes().values());
                 }
             }
@@ -130,71 +135,71 @@ public class AlarmNotificationListener710 implements OrgOpenroadmAlarmListener {
             case CircuitPack:
                 Optional<CircuitPack> circuitPackOptional = tryCastToParticularResource(CircuitPack.class, resource);
                 if (circuitPackOptional.isPresent()) {
-                    circuitPack = circuitPackOptional.get().getCircuitPackName();
+                    circuitPack = circuitPackOptional.orElseThrow().getCircuitPackName();
                 }
                 break;
 
             case Connection:
                 Optional<Connection> connectionOptional = tryCastToParticularResource(Connection.class, resource);
                 if (connectionOptional.isPresent()) {
-                    connection = connectionOptional.get().getConnectionName();
+                    connection = connectionOptional.orElseThrow().getConnectionName();
                 }
                 break;
 
             case Degree:
                 Optional<Degree> degreeOptional = tryCastToParticularResource(Degree.class, resource);
                 if (degreeOptional.isPresent()) {
-                    degree = degreeOptional.get().getDegreeNumber().toString();
+                    degree = degreeOptional.orElseThrow().getDegreeNumber().toString();
                 }
                 break;
 
             case Interface:
                 Optional<Interface> interfaceOptional = tryCastToParticularResource(Interface.class, resource);
                 if (interfaceOptional.isPresent()) {
-                    iface = interfaceOptional.get().getInterfaceName();
+                    iface = interfaceOptional.orElseThrow().getInterfaceName();
                 }
                 break;
 
             case InternalLink:
                 Optional<InternalLink> internalLinkOptional = tryCastToParticularResource(InternalLink.class, resource);
                 if (internalLinkOptional.isPresent()) {
-                    internalLink = internalLinkOptional.get().getInternalLinkName();
+                    internalLink = internalLinkOptional.orElseThrow().getInternalLinkName();
                 }
                 break;
 
             case PhysicalLink:
                 Optional<PhysicalLink> physicalLinkOptional = tryCastToParticularResource(PhysicalLink.class, resource);
                 if (physicalLinkOptional.isPresent()) {
-                    physicalLink = physicalLinkOptional.get().getPhysicalLinkName();
+                    physicalLink = physicalLinkOptional.orElseThrow().getPhysicalLinkName();
                 }
                 break;
 
             case Service:
                 Optional<Service> serviceOptional = tryCastToParticularResource(Service.class, resource);
                 if (serviceOptional.isPresent()) {
-                    service = serviceOptional.get().getServiceName();
+                    service = serviceOptional.orElseThrow().getServiceName();
                 }
                 break;
 
             case Shelf:
                 Optional<Shelf> shelfOptional = tryCastToParticularResource(Shelf.class, resource);
                 if (shelfOptional.isPresent()) {
-                    shelf = shelfOptional.get().getShelfName();
+                    shelf = shelfOptional.orElseThrow().getShelfName();
                 }
                 break;
 
             case SharedRiskGroup:
                 Optional<Srg> sharedRiskGroupOptional = tryCastToParticularResource(Srg.class, resource);
                 if (sharedRiskGroupOptional.isPresent()) {
-                    sharedRiskGroup = sharedRiskGroupOptional.get().getSrgNumber().toString();
+                    sharedRiskGroup = sharedRiskGroupOptional.orElseThrow().getSrgNumber().toString();
                 }
                 break;
 
             case Port:
                 Optional<Port> portContainerOptional = tryCastToParticularResource(Port.class, resource);
                 if (portContainerOptional.isPresent()) {
-                    port = portContainerOptional.get().getPort().getPortName();
-                    portCircuitPack = portContainerOptional.get().getPort().getCircuitPackName();
+                    port = portContainerOptional.orElseThrow().getPort().getPortName();
+                    portCircuitPack = portContainerOptional.orElseThrow().getPort().getCircuitPackName();
                 }
                 break;
 
index c861c2f8e5c80aa94d73cf4c8024c32310fcc96c..3844e3f8b3a2a26f0c16f08c8e511543289a22a2 100644 (file)
@@ -8,22 +8,27 @@
 
 package org.opendaylight.transportpce.networkmodel.listeners;
 
-import org.opendaylight.yang.gen.v1.http.org.openroadm.de.operations.rev161014.OrgOpenroadmDeOperationsListener;
+import java.util.Set;
+import org.opendaylight.mdsal.binding.api.NotificationService.CompositeListener;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.de.operations.rev161014.RestartNotification;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class DeOperationsListener implements OrgOpenroadmDeOperationsListener {
+public class DeOperationsListener {
 
     private static final Logger LOG = LoggerFactory.getLogger(DeOperationsListener.class);
 
+    public CompositeListener getCompositeListener() {
+        return new CompositeListener(Set.of(
+            new CompositeListener.Component<>(RestartNotification.class, this::onRestartNotification)));
+    }
+
     /**
      * Callback for restart-notification.
      *
      * @param notification RestartNotification object
      */
-    @Override
-    public void onRestartNotification(RestartNotification notification) {
+    private void onRestartNotification(RestartNotification notification) {
         LOG.info("Notification {} received {}", RestartNotification.QNAME, notification);
     }
 
index 61961c3d55006821d8a2f3da1da82d76a0305f4d..0a8fd0f657e4e7d3401750044f3eac9fa4262856 100644 (file)
@@ -8,22 +8,27 @@
 
 package org.opendaylight.transportpce.networkmodel.listeners;
 
-import org.opendaylight.yang.gen.v1.http.org.openroadm.de.operations.rev181019.OrgOpenroadmDeOperationsListener;
+import java.util.Set;
+import org.opendaylight.mdsal.binding.api.NotificationService.CompositeListener;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.de.operations.rev181019.RestartNotification;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class DeOperationsListener221 implements OrgOpenroadmDeOperationsListener {
+public class DeOperationsListener221 {
 
     private static final Logger LOG = LoggerFactory.getLogger(DeOperationsListener221.class);
 
+    public CompositeListener getCompositeListener() {
+        return new CompositeListener(Set.of(
+            new CompositeListener.Component<>(RestartNotification.class, this::onRestartNotification)));
+    }
+
     /**
      * Callback for restart-notification.
      *
      * @param notification RestartNotification object
      */
-    @Override
-    public void onRestartNotification(RestartNotification notification) {
+    private void onRestartNotification(RestartNotification notification) {
         LOG.info("Notification {} received {}", RestartNotification.QNAME, notification);
     }
 
index f6c8be94a6af2e884c456ada935e38665b92a05d..cd33475fd4bc067f9be78d384df52b35e2bcaac7 100644 (file)
@@ -8,22 +8,27 @@
 
 package org.opendaylight.transportpce.networkmodel.listeners;
 
-import org.opendaylight.yang.gen.v1.http.org.openroadm.de.operations.rev200529.OrgOpenroadmDeOperationsListener;
+import java.util.Set;
+import org.opendaylight.mdsal.binding.api.NotificationService.CompositeListener;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.de.operations.rev200529.RestartNotification;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class DeOperationsListener710 implements OrgOpenroadmDeOperationsListener {
+public class DeOperationsListener710 {
 
     private static final Logger LOG = LoggerFactory.getLogger(DeOperationsListener710.class);
 
+    public CompositeListener getCompositeListener() {
+        return new CompositeListener(Set.of(
+            new CompositeListener.Component<>(RestartNotification.class, this::onRestartNotification)));
+    }
+
     /**
      * Callback for restart-notification.
      *
      * @param notification RestartNotification object
      */
-    @Override
-    public void onRestartNotification(RestartNotification notification) {
+    private void onRestartNotification(RestartNotification notification) {
         LOG.info("Notification {} received {}", RestartNotification.QNAME, notification);
     }
 
index 543dba266ca6509e417229de6135700022352f27..6223854326e890d1b09167648db86ae030faa29f 100644 (file)
@@ -9,20 +9,21 @@
 package org.opendaylight.transportpce.networkmodel.listeners;
 
 import java.util.LinkedList;
+import java.util.Set;
+import org.opendaylight.mdsal.binding.api.NotificationService.CompositeListener;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.ChangeNotification;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.OrgOpenroadmDeviceListener;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.OtdrScanResult;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.change.notification.Edit;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.Ports;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.packs.CircuitPacks;
+import org.opendaylight.yangtools.yang.binding.DataObjectStep;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class DeviceListener121 implements OrgOpenroadmDeviceListener {
+public class DeviceListener121 {
 
     private static final Logger LOG = LoggerFactory.getLogger(DeviceListener121.class);
     private final String nodeId;
@@ -34,14 +35,20 @@ public class DeviceListener121 implements OrgOpenroadmDeviceListener {
         this.portMapping = portMapping;
     }
 
+    public CompositeListener getCompositeListener() {
+        return new CompositeListener(Set.of(
+            new CompositeListener.Component<>(ChangeNotification.class, this::onChangeNotification),
+            new CompositeListener.Component<>(OtdrScanResult.class, this::onOtdrScanResult)
+        ));
+    }
+
     /**
      * Callback for change-notification.
      *
      * @param notification ChangeNotification object
      */
-    @Override
-    @SuppressWarnings("unchecked")
-    public void onChangeNotification(ChangeNotification notification) {
+
+    void onChangeNotification(ChangeNotification notification) {
         if (notification.getEdit() == null) {
             LOG.warn("unable to handle {} notificatin received - list of edit is null", ChangeNotification.QNAME);
             return;
@@ -53,14 +60,12 @@ public class DeviceListener121 implements OrgOpenroadmDeviceListener {
             // 1. Detect the org-openroadm-device object modified
             switch (edit.getTarget().getTargetType().getSimpleName()) {
                 case "Ports":
-                    LinkedList<PathArgument> path = new LinkedList<>();
+                    LinkedList<DataObjectStep<?>> path = new LinkedList<>();
                     edit.getTarget().getPathArguments().forEach(p -> path.add(p));
-                    InstanceIdentifier<Ports> portIID = (InstanceIdentifier<Ports>) InstanceIdentifier
-                        .create(path);
+                    InstanceIdentifier<Ports> portIID = InstanceIdentifier.unsafeOf(path);
                     String portName = InstanceIdentifier.keyOf(portIID).getPortName();
                     path.removeLast();
-                    InstanceIdentifier<CircuitPacks> cpIID = (InstanceIdentifier<CircuitPacks>) InstanceIdentifier
-                        .create(path);
+                    InstanceIdentifier<CircuitPacks> cpIID = InstanceIdentifier.unsafeOf(path);
                     String cpName = InstanceIdentifier.keyOf(cpIID).getCircuitPackName();
                     LOG.info("port {} of circruit-pack {} modified on device {}", portName, cpName, this.nodeId);
                     Mapping oldMapping = portMapping.getMapping(nodeId, cpName, portName);
@@ -90,8 +95,7 @@ public class DeviceListener121 implements OrgOpenroadmDeviceListener {
      *
      * @param notification OtdrScanResult object
      */
-    @Override
-    public void onOtdrScanResult(OtdrScanResult notification) {
+    private void onOtdrScanResult(OtdrScanResult notification) {
         LOG.info("Notification {} received {}", OtdrScanResult.QNAME, notification);
     }
 
index df1b10a8c37d87d5bba8d6992780f56ecd7a27f6..d069c0196470f4460e82a33442c5c84d317d4833 100644 (file)
@@ -9,21 +9,23 @@
 package org.opendaylight.transportpce.networkmodel.listeners;
 
 import java.util.LinkedList;
+import java.util.Set;
+import org.opendaylight.mdsal.binding.api.NotificationService.CompositeListener;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.ChangeNotification;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.CreateTechInfoNotification;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.OrgOpenroadmDeviceListener;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.OtdrScanResult;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.change.notification.Edit;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.circuit.pack.Ports;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.circuit.packs.CircuitPacks;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp.Interface;
+import org.opendaylight.yangtools.yang.binding.DataObjectStep;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class DeviceListener221 implements OrgOpenroadmDeviceListener {
+public class DeviceListener221 {
 
     private static final Logger LOG = LoggerFactory.getLogger(DeviceListener221.class);
     private final String nodeId;
@@ -35,15 +37,22 @@ public class DeviceListener221 implements OrgOpenroadmDeviceListener {
         this.portMapping = portMapping;
     }
 
+    public CompositeListener getCompositeListener() {
+        return new CompositeListener(Set.of(
+            new CompositeListener.Component<>(ChangeNotification.class, this::onChangeNotification),
+            new CompositeListener.Component<>(CreateTechInfoNotification.class, this::onCreateTechInfoNotification),
+            new CompositeListener.Component<>(OtdrScanResult.class, this::onOtdrScanResult)
+        ));
+    }
+
     /**
      * Callback for change-notification.
      *
      * @param notification
      *            ChangeNotification object
      */
-    @Override
-    @SuppressWarnings("unchecked")
-    public void onChangeNotification(ChangeNotification notification) {
+    void onChangeNotification(ChangeNotification notification) {
+        LOG.info("notification received from device {}: {}", this.nodeId, notification.toString());
         if (notification.getEdit() == null) {
             LOG.warn("unable to handle {} notificatin received - list of edit is null", ChangeNotification.QNAME);
             return;
@@ -55,14 +64,12 @@ public class DeviceListener221 implements OrgOpenroadmDeviceListener {
             // 1. Detect the org-openroadm-device object modified
             switch (edit.getTarget().getTargetType().getSimpleName()) {
                 case "Ports":
-                    LinkedList<PathArgument> path = new LinkedList<>();
+                    LinkedList<DataObjectStep<?>> path = new LinkedList<>();
                     edit.getTarget().getPathArguments().forEach(p -> path.add(p));
-                    InstanceIdentifier<Ports> portIID = (InstanceIdentifier<Ports>) InstanceIdentifier
-                        .create(path);
+                    InstanceIdentifier<Ports> portIID = InstanceIdentifier.unsafeOf(path);
                     String portName = InstanceIdentifier.keyOf(portIID).getPortName();
                     path.removeLast();
-                    InstanceIdentifier<CircuitPacks> cpIID = (InstanceIdentifier<CircuitPacks>) InstanceIdentifier
-                        .create(path);
+                    InstanceIdentifier<CircuitPacks> cpIID = InstanceIdentifier.unsafeOf(path);
                     String cpName = InstanceIdentifier.keyOf(cpIID).getCircuitPackName();
                     LOG.info("port {} of circruit-pack {} modified on device {}", portName, cpName, this.nodeId);
                     Mapping oldMapping = portMapping.getMapping(nodeId, cpName, portName);
@@ -80,6 +87,27 @@ public class DeviceListener221 implements OrgOpenroadmDeviceListener {
                     Thread thread = new Thread(handleNetconfEvent);
                     thread.start();
                     break;
+                case "Interface":
+                    LinkedList<DataObjectStep<?>> pathInter = new LinkedList<>();
+                    edit.getTarget().getPathArguments().forEach(p -> pathInter.add(p));
+                    InstanceIdentifier<Interface> interfIID = InstanceIdentifier.unsafeOf(pathInter);
+                    String interfName = InstanceIdentifier.keyOf(interfIID).getName();
+                    LOG.info("interface {} modified on device {}", interfName, this.nodeId);
+                    Mapping oldMapping2 = portMapping.getMappingFromOtsInterface(nodeId, interfName);
+                    if (oldMapping2 == null) {
+                        return;
+                    }
+                    Runnable handleNetconfEvent2 = new Runnable() {
+                        @Override
+                        public void run() {
+                            portMapping.updateMapping(nodeId, oldMapping2);
+                            LOG.info("{} : mapping data for {} updated", nodeId,
+                                oldMapping2.getLogicalConnectionPoint());
+                        }
+                    };
+                    Thread thread2 = new Thread(handleNetconfEvent2);
+                    thread2.start();
+                    break;
                 default:
                     LOG.debug("modification of type {} not managed yet", edit.getTarget().getTargetType());
                     break;
@@ -87,8 +115,7 @@ public class DeviceListener221 implements OrgOpenroadmDeviceListener {
         }
     }
 
-    @Override
-    public void onCreateTechInfoNotification(CreateTechInfoNotification notification) {
+    private void onCreateTechInfoNotification(CreateTechInfoNotification notification) {
     }
 
     /**
@@ -97,8 +124,7 @@ public class DeviceListener221 implements OrgOpenroadmDeviceListener {
      * @param notification
      *            OtdrScanResult object
      */
-    @Override
-    public void onOtdrScanResult(OtdrScanResult notification) {
+    private void onOtdrScanResult(OtdrScanResult notification) {
         LOG.info("Notification {} received {}", OtdrScanResult.QNAME, notification);
     }
 
index c03b519e3d17c2ec218ccf18130e635857728f40..97183a45fea21f757ac1da2a6afd7487f91b2941 100644 (file)
@@ -13,11 +13,12 @@ import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
+import org.opendaylight.mdsal.binding.api.NotificationService.CompositeListener;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.ChangeNotification;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.CreateTechInfoNotification;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.OrgOpenroadmDeviceListener;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.OtdrScanResult;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.change.notification.Edit;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.circuit.pack.Ports;
@@ -25,13 +26,13 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.circuit.
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.OduSwitchingPools;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.odu.switching.pools.NonBlockingList;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.odu.switching.pools.non.blocking.list.PortList;
+import org.opendaylight.yangtools.yang.binding.DataObjectStep;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
 import org.opendaylight.yangtools.yang.common.Uint16;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class DeviceListener710 implements OrgOpenroadmDeviceListener {
+public class DeviceListener710 {
 
     private static final Logger LOG = LoggerFactory.getLogger(DeviceListener710.class);
     private final String nodeId;
@@ -43,15 +44,21 @@ public class DeviceListener710 implements OrgOpenroadmDeviceListener {
         this.portMapping = portMapping;
     }
 
+    public CompositeListener getCompositeListener() {
+        return new CompositeListener(Set.of(
+            new CompositeListener.Component<>(ChangeNotification.class, this::onChangeNotification),
+            new CompositeListener.Component<>(CreateTechInfoNotification.class, this::onCreateTechInfoNotification),
+            new CompositeListener.Component<>(OtdrScanResult.class, this::onOtdrScanResult)
+        ));
+    }
+
     /**
      * Callback for change-notification.
      *
      * @param notification
      *            ChangeNotification object
      */
-    @Override
-    @SuppressWarnings("unchecked")
-    public void onChangeNotification(ChangeNotification notification) {
+    void onChangeNotification(ChangeNotification notification) {
         LOG.debug("device71 notification received = {}", notification);
         if (notification.getEdit() == null) {
             LOG.warn("unable to handle {} notificatin received - list of edit is null", ChangeNotification.QNAME);
@@ -64,16 +71,14 @@ public class DeviceListener710 implements OrgOpenroadmDeviceListener {
                 continue;
             }
             // 1. Detect the org-openroadm-device object modified
-            LinkedList<PathArgument> path = new LinkedList<>();
+            LinkedList<DataObjectStep<?>> path = new LinkedList<>();
             switch (edit.getTarget().getTargetType().getSimpleName()) {
                 case "Ports":
                     edit.getTarget().getPathArguments().forEach(p -> path.add(p));
-                    InstanceIdentifier<Ports> portIID = (InstanceIdentifier<Ports>) InstanceIdentifier
-                        .create(path);
+                    InstanceIdentifier<Ports> portIID = InstanceIdentifier.unsafeOf(path);
                     String portName = InstanceIdentifier.keyOf(portIID).getPortName();
                     path.removeLast();
-                    InstanceIdentifier<CircuitPacks> cpIID = (InstanceIdentifier<CircuitPacks>) InstanceIdentifier
-                        .create(path);
+                    InstanceIdentifier<CircuitPacks> cpIID = InstanceIdentifier.unsafeOf(path);
                     String cpName = InstanceIdentifier.keyOf(cpIID).getCircuitPackName();
                     LOG.info("port {} of circruit-pack {} modified on device {}", portName, cpName, this.nodeId);
                     Mapping oldMapping = portMapping.getMapping(nodeId, cpName, portName);
@@ -94,14 +99,13 @@ public class DeviceListener710 implements OrgOpenroadmDeviceListener {
                 case "OduSwitchingPools":
                     LOG.info("odu-switching-pools modified on device {}", nodeId);
                     edit.getTarget().getPathArguments().forEach(p -> path.add(p));
-                    ospIID = (InstanceIdentifier<OduSwitchingPools>) InstanceIdentifier.create(path);
+                    ospIID = InstanceIdentifier.unsafeOf(path);
                     break;
                 case "PortList":
                     edit.getTarget().getPathArguments().forEach(p -> path.add(p));
-                    InstanceIdentifier<PortList> plIID = (InstanceIdentifier<PortList>) InstanceIdentifier.create(path);
+                    InstanceIdentifier<PortList> plIID = InstanceIdentifier.unsafeOf(path);
                     path.removeLast();
-                    InstanceIdentifier<NonBlockingList> nblIID =
-                        (InstanceIdentifier<NonBlockingList>) InstanceIdentifier.create(path);
+                    InstanceIdentifier<NonBlockingList> nblIID = InstanceIdentifier.unsafeOf(path);
                     Uint16 nblNb = InstanceIdentifier.keyOf(nblIID).getNblNumber();
                     List<InstanceIdentifier<PortList>> iidList = nbliidMap.containsKey(nblNb)
                         ? nbliidMap.get(nblNb) : new ArrayList<>();
@@ -127,8 +131,7 @@ public class DeviceListener710 implements OrgOpenroadmDeviceListener {
         }
     }
 
-    @Override
-    public void onCreateTechInfoNotification(CreateTechInfoNotification notification) {
+    private void onCreateTechInfoNotification(CreateTechInfoNotification notification) {
     }
 
     /**
@@ -137,8 +140,7 @@ public class DeviceListener710 implements OrgOpenroadmDeviceListener {
      * @param notification
      *            OtdrScanResult object
      */
-    @Override
-    public void onOtdrScanResult(OtdrScanResult notification) {
+    private void onOtdrScanResult(OtdrScanResult notification) {
         LOG.info("Notification {} received {}", OtdrScanResult.QNAME, notification);
     }
 
index 726389ebbca0a27f90ab0aac3188f3937f7c16c5..e3b08e560980d1970cf82aac68f3f375a2352ae6 100644 (file)
@@ -8,13 +8,14 @@
 
 package org.opendaylight.transportpce.networkmodel.listeners;
 
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.mdsal.binding.api.NotificationService.Listener;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev161014.LldpNbrInfoChange;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev161014.OrgOpenroadmLldpListener;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class LldpListener implements OrgOpenroadmLldpListener {
+public class LldpListener implements Listener<LldpNbrInfoChange> {
 
     private static final Logger LOG = LoggerFactory.getLogger(LldpListener.class);
     private final NodeId nodeId;
@@ -28,7 +29,7 @@ public class LldpListener implements OrgOpenroadmLldpListener {
      * @param notification LldpNbrInfoChange object
      */
     @Override
-    public void onLldpNbrInfoChange(LldpNbrInfoChange notification) {
-        LOG.info("Notification {} received {}", LldpNbrInfoChange.QNAME, notification);
+    public void onNotification(@NonNull LldpNbrInfoChange notification) {
+        LOG.info("Notification {} received {} on node {}", LldpNbrInfoChange.QNAME, notification, nodeId);
     }
 }
index 775d0ed76dbdf41a4744f9c176f92032e700c6d5..30a7f7093ff1038e4784df10b6c03f3fc344ed85 100644 (file)
@@ -8,15 +8,16 @@
 
 package org.opendaylight.transportpce.networkmodel.listeners;
 
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.mdsal.binding.api.NotificationService.Listener;
 import org.opendaylight.transportpce.networkmodel.R2RLinkDiscovery;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev181019.LldpNbrInfoChange;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev181019.OrgOpenroadmLldpListener;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019.ResourceNotificationType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class LldpListener221 implements OrgOpenroadmLldpListener {
+public class LldpListener221 implements Listener<LldpNbrInfoChange> {
 
     private static final Logger LOG = LoggerFactory.getLogger(LldpListener221.class);
     private final R2RLinkDiscovery linkDiscovery;
@@ -32,7 +33,7 @@ public class LldpListener221 implements OrgOpenroadmLldpListener {
      * @param notification LldpNbrInfoChange object
      */
     @Override
-    public void onLldpNbrInfoChange(LldpNbrInfoChange notification) {
+    public void onNotification(@NonNull LldpNbrInfoChange notification) {
         LOG.info("Notification {} received {}", LldpNbrInfoChange.QNAME, notification);
         if (notification.getNotificationType().equals(ResourceNotificationType.ResourceCreation)) {
             linkDiscovery.createR2RLink(nodeId,notification.getResource(),
index f619253349d25a12060e7f43237fb65255ea3f42..c140a53bdc20cfe615e50cf76c382fed246128b4 100644 (file)
@@ -8,15 +8,16 @@
 
 package org.opendaylight.transportpce.networkmodel.listeners;
 
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.mdsal.binding.api.NotificationService.Listener;
 import org.opendaylight.transportpce.networkmodel.R2RLinkDiscovery;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev200529.LldpNbrInfoChange;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev200529.OrgOpenroadmLldpListener;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev191129.ResourceNotificationType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class LldpListener710 implements OrgOpenroadmLldpListener {
+public class LldpListener710 implements Listener<LldpNbrInfoChange> {
 
     private static final Logger LOG = LoggerFactory.getLogger(LldpListener710.class);
     private final R2RLinkDiscovery linkDiscovery;
@@ -32,7 +33,7 @@ public class LldpListener710 implements OrgOpenroadmLldpListener {
      * @param notification LldpNbrInfoChange object
      */
     @Override
-    public void onLldpNbrInfoChange(LldpNbrInfoChange notification) {
+    public void onNotification(@NonNull LldpNbrInfoChange notification) {
         LOG.info("Notification {} received {}", LldpNbrInfoChange.QNAME, notification);
         if (notification.getNotificationType().equals(ResourceNotificationType.ResourceCreation)) {
             linkDiscovery.createR2RLink(nodeId,notification.getResource(),
index c72743665f5f9e61e1595365f73660bbd9e45c08..5122c39c24e3e624761b33f9806976e7745ac7b5 100644 (file)
@@ -7,23 +7,20 @@
  */
 package org.opendaylight.transportpce.networkmodel.listeners;
 
-import java.util.Collection;
 import java.util.LinkedList;
+import java.util.List;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
+import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.transportpce.networkmodel.service.NetworkModelService;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
+import org.opendaylight.yangtools.yang.binding.DataObjectStep;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.PathArgument;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 public class PortMappingListener implements DataTreeChangeListener<Mapping> {
 
-    private static final Logger LOG = LoggerFactory.getLogger(PortMappingListener.class);
-
     private final NetworkModelService networkModelService;
 
     public PortMappingListener(NetworkModelService networkModelService) {
@@ -31,25 +28,31 @@ public class PortMappingListener implements DataTreeChangeListener<Mapping> {
     }
 
     @Override
-    public void onDataTreeChanged(@NonNull Collection<DataTreeModification<Mapping>> changes) {
+    public void onDataTreeChanged(@NonNull List<DataTreeModification<Mapping>> changes) {
         for (DataTreeModification<Mapping> change : changes) {
-            if (change.getRootNode().getDataBefore() != null && change.getRootNode().getDataAfter() != null) {
-                Mapping oldMapping = change.getRootNode().getDataBefore();
-                Mapping newMapping = change.getRootNode().getDataAfter();
-                if (oldMapping.getPortAdminState().equals(newMapping.getPortAdminState())
-                    || oldMapping.getPortOperState().equals(newMapping.getPortOperState())) {
-                    return;
-                } else {
-                    LinkedList<PathArgument> path = new LinkedList<>();
-                    path.addAll((Collection<? extends PathArgument>) change.getRootPath().getRootIdentifier()
-                        .getPathArguments());
-                    path.removeLast();
-                    @SuppressWarnings("unchecked") InstanceIdentifier<Nodes> portmappintNodeID =
-                        (InstanceIdentifier<Nodes>) InstanceIdentifier.create(path);
-                    String nodeId = InstanceIdentifier.keyOf(portmappintNodeID).getNodeId();
-                    networkModelService.updateOpenRoadmTopologies(nodeId, newMapping);
-                }
+            Mapping oldMapping = change.getRootNode().dataBefore();
+            if (oldMapping == null) {
+                continue;
+            }
+            Mapping newMapping = change.getRootNode().dataAfter();
+            if (newMapping == null) {
+                continue;
+            }
+            if (oldMapping.getPortAdminState().equals(newMapping.getPortAdminState())
+                    && oldMapping.getPortOperState().equals(newMapping.getPortOperState())) {
+                return;
             }
+            networkModelService.updateOpenRoadmTopologies(
+                getNodeIdFromMappingDataTreeIdentifier(change.getRootPath()),
+                newMapping);
         }
     }
+
+    protected String getNodeIdFromMappingDataTreeIdentifier(DataTreeIdentifier<Mapping> dataTreeIdentifier) {
+        LinkedList<DataObjectStep<?>> path = new LinkedList<>();
+        dataTreeIdentifier.path().getPathArguments().forEach(p -> path.add(p));
+        path.removeLast();
+        InstanceIdentifier<Nodes> portMappingNodeID = InstanceIdentifier.unsafeOf(path);
+        return InstanceIdentifier.keyOf(portMappingNodeID).getNodeId();
+    }
 }
index 0161c2ff53ba70cccbe3a99d36de0bec11f2ca9b..1f5c6b0f66f9aa622fa511aeac9f80cccd3f0ae9 100644 (file)
@@ -8,24 +8,30 @@
 
 package org.opendaylight.transportpce.networkmodel.listeners;
 
+import java.util.Set;
+import org.opendaylight.mdsal.binding.api.NotificationService.CompositeListener;
 import org.opendaylight.transportpce.networkmodel.service.FrequenciesService;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.ServiceRpcResultSh;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.TransportpceServicehandlerListener;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ServiceNotificationTypes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ServiceNotificationTypes;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.RpcStatusEx;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class ServiceHandlerListener implements TransportpceServicehandlerListener {
+public class ServiceHandlerListener {
     private static final Logger LOG = LoggerFactory.getLogger(ServiceHandlerListener.class);
     private final FrequenciesService service;
 
+
     public ServiceHandlerListener(FrequenciesService service) {
         LOG.info("Init service handler listener for network");
         this.service = service;
     }
 
-    @Override
+    public CompositeListener getCompositeListener() {
+        return new CompositeListener(Set.of(
+            new CompositeListener.Component<>(ServiceRpcResultSh.class, this::onServiceRpcResultSh)));
+    }
+
     public void onServiceRpcResultSh(ServiceRpcResultSh notification) {
         if (notification.getStatus() != RpcStatusEx.Successful) {
             LOG.info("RpcStatusEx of notification not equals successful. Nothing to do for notification {}",
index ecfa36584faa228d07fa545506e706587f98bed5..6fc8ba60c10b87f82e74302f01f9c1baed7d7919 100644 (file)
@@ -8,21 +8,26 @@
 
 package org.opendaylight.transportpce.networkmodel.listeners;
 
-import org.opendaylight.yang.gen.v1.http.org.openroadm.tca.rev161014.OrgOpenroadmTcaListener;
+import java.util.Set;
+import org.opendaylight.mdsal.binding.api.NotificationService.CompositeListener;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.tca.rev161014.TcaNotification;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class TcaListener implements OrgOpenroadmTcaListener {
+public class TcaListener {
 
     private static final Logger LOG = LoggerFactory.getLogger(TcaListener.class);
 
+    public CompositeListener getCompositeListener() {
+        return new CompositeListener(Set.of(
+            new CompositeListener.Component<>(TcaNotification.class, this::onTcaNotification)));
+    }
+
     /**
      * Callback for tca-notification.
      * @param notification TcaNotification object
      */
-    @Override
-    public void onTcaNotification(TcaNotification notification) {
+    private void onTcaNotification(TcaNotification notification) {
         LOG.info("Notification {} received {}", TcaNotification.QNAME, notification);
     }
 
index 68cec92f4669821c4fb6b7e5f926c94af872c1b3..b3429c6878becee7d8e8a0e66df76ee43dfad21f 100644 (file)
@@ -8,21 +8,26 @@
 
 package org.opendaylight.transportpce.networkmodel.listeners;
 
-import org.opendaylight.yang.gen.v1.http.org.openroadm.tca.rev181019.OrgOpenroadmTcaListener;
+import java.util.Set;
+import org.opendaylight.mdsal.binding.api.NotificationService.CompositeListener;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.tca.rev181019.TcaNotification;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class TcaListener221 implements OrgOpenroadmTcaListener {
+public class TcaListener221 {
 
     private static final Logger LOG = LoggerFactory.getLogger(TcaListener221.class);
 
+    public CompositeListener getCompositeListener() {
+        return new CompositeListener(Set.of(
+            new CompositeListener.Component<>(TcaNotification.class, this::onTcaNotification)));
+    }
+
     /**
      * Callback for tca-notification.
      * @param notification TcaNotification object
      */
-    @Override
-    public void onTcaNotification(TcaNotification notification) {
+    private void onTcaNotification(TcaNotification notification) {
         LOG.info("Notification {} received {}", TcaNotification.QNAME, notification);
     }
 
index 220e23b7b558dd9c4b5a1c9fdc7c821ba8c53f62..14ec27289d64a3bcea072d2458567472e4a906db 100644 (file)
@@ -8,21 +8,26 @@
 
 package org.opendaylight.transportpce.networkmodel.listeners;
 
-import org.opendaylight.yang.gen.v1.http.org.openroadm.tca.rev200327.OrgOpenroadmTcaListener;
+import java.util.Set;
+import org.opendaylight.mdsal.binding.api.NotificationService.CompositeListener;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.tca.rev200327.TcaNotification;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class TcaListener710 implements OrgOpenroadmTcaListener {
+public class TcaListener710 {
 
     private static final Logger LOG = LoggerFactory.getLogger(TcaListener710.class);
 
+    public CompositeListener getCompositeListener() {
+        return new CompositeListener(Set.of(
+            new CompositeListener.Component<>(TcaNotification.class, this::onTcaNotification)));
+    }
+
     /**
      * Callback for tca-notification.
      * @param notification TcaNotification object
      */
-    @Override
-    public void onTcaNotification(TcaNotification notification) {
+    private void onTcaNotification(TcaNotification notification) {
         LOG.info("Notification {} received {}", TcaNotification.QNAME, notification);
     }
 
index a48f5c38518fcb900ab498b175792d046211ce12..c3e326a3c3b265e97d6099ad6e64842ea3dca5b1 100644 (file)
@@ -7,8 +7,8 @@
  */
 package org.opendaylight.transportpce.networkmodel.service;
 
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirection;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirection;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirection;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirection;
 
 public interface FrequenciesService {
 
index f0d2cb8d3ff60b83e9e5661808641272cfa2175f..b8de4f0aee9e696c71318461c73f1411aae045c3 100644 (file)
@@ -7,10 +7,8 @@
  */
 package org.opendaylight.transportpce.networkmodel.service;
 
-import java.math.BigDecimal;
 import java.util.Arrays;
 import java.util.BitSet;
-import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -24,6 +22,7 @@ import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.ReadTransaction;
 import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.transportpce.common.InstanceIdentifiers;
 import org.opendaylight.transportpce.common.NetworkUtils;
 import org.opendaylight.transportpce.common.NodeIdPair;
 import org.opendaylight.transportpce.common.Timeouts;
@@ -31,49 +30,53 @@ import org.opendaylight.transportpce.common.fixedflex.GridConstant;
 import org.opendaylight.transportpce.common.fixedflex.GridUtils;
 import org.opendaylight.transportpce.networkmodel.util.OpenRoadmTopology;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.ModulationFormat;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.DegreeAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.DegreeAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.SrgAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.SrgAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.CpAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.CpAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.CtpAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.CtpAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.PpAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.PpAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.RxTtpAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.RxTtpAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.TxTtpAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.TxTtpAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.XpdrNetworkAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.XpdrNetworkAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.XpdrPortAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.XpdrPortAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.available.freq.map.AvailFreqMaps;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.available.freq.map.AvailFreqMapsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.available.freq.map.AvailFreqMapsKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev211210.xpdr.port.connection.attributes.WavelengthBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirection;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirection;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZ;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToA;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.TerminationPoint;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.DegreeAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.DegreeAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.SrgAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.SrgAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.CpAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.CpAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.CtpAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.CtpAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.PpAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.PpAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.RxTtpAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.RxTtpAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.TxTtpAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.TxTtpAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrNetworkAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrNetworkAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrPortAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrPortAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.available.freq.map.AvailFreqMaps;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.available.freq.map.AvailFreqMapsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.available.freq.map.AvailFreqMapsKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev230526.xpdr.port.connection.attributes.WavelengthBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirection;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirection;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.TerminationPoint;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.Uint32;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@Component
 public class FrequenciesServiceImpl implements FrequenciesService {
 
     private static final Logger LOG = LoggerFactory.getLogger(FrequenciesServiceImpl.class);
     private final DataBroker dataBroker;
     private final AvailFreqMapsKey availFreqMapKey = new AvailFreqMapsKey(GridConstant.C_BAND);
 
-    public FrequenciesServiceImpl(DataBroker dataBroker) {
+    @Activate
+    public FrequenciesServiceImpl(@Reference DataBroker dataBroker) {
         this.dataBroker = dataBroker;
     }
 
@@ -98,38 +101,40 @@ public class FrequenciesServiceImpl implements FrequenciesService {
         if (atoZDirection != null && atoZDirection.getAToZMinFrequency() != null) {
             LOG.info("Update frequencies for a to z direction {}, used {}", atoZDirection, used);
             List<NodeIdPair> atozTpIds = getAToZTpList(atoZDirection);
-            BigDecimal atozMinFrequency = atoZDirection.getAToZMinFrequency().getValue();
-            BigDecimal atozMaxFrequency = atoZDirection.getAToZMaxFrequency().getValue();
-            Optional<ModulationFormat> optionalModulationFormat = ModulationFormat
-                    .forName(atoZDirection.getModulationFormat());
-            if (!optionalModulationFormat.isPresent()) {
+            Decimal64 atozMinFrequency = atoZDirection.getAToZMinFrequency().getValue();
+            Decimal64 atozMaxFrequency = atoZDirection.getAToZMaxFrequency().getValue();
+            ModulationFormat modulationFormat = ModulationFormat.forName(atoZDirection.getModulationFormat());
+            if (modulationFormat == null) {
                 LOG.error("Unknown modulation format {} for a to z direction, frequencies not updated",
                         atoZDirection.getModulationFormat());
                 return;
             }
-            setFrequencies4Tps(atozMinFrequency, atozMaxFrequency, atoZDirection.getRate(),
-                    optionalModulationFormat.get(), atozTpIds, used);
-            setFrequencies4Nodes(atozMinFrequency,
-                    atozMaxFrequency,
+            setFrequencies4Tps(
+                    atozMinFrequency, atozMaxFrequency,
+                    atoZDirection.getRate(), modulationFormat, atozTpIds,
+                    used);
+            setFrequencies4Nodes(
+                    atozMinFrequency, atozMaxFrequency,
                     atozTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()),
                     used);
         }
         if (ztoADirection != null && ztoADirection.getZToAMinFrequency() != null) {
             LOG.info("Update frequencies for z to a direction {}, used {}", ztoADirection, used);
             List<NodeIdPair> ztoaTpIds = getZToATpList(ztoADirection);
-            BigDecimal ztoaMinFrequency = ztoADirection.getZToAMinFrequency().getValue();
-            BigDecimal ztoaMaxFrequency = ztoADirection.getZToAMaxFrequency().getValue();
-            Optional<ModulationFormat> optionalModulationFormat = ModulationFormat
-                    .forName(ztoADirection.getModulationFormat());
-            if (!optionalModulationFormat.isPresent()) {
+            Decimal64 ztoaMinFrequency = ztoADirection.getZToAMinFrequency().getValue();
+            Decimal64 ztoaMaxFrequency = ztoADirection.getZToAMaxFrequency().getValue();
+            ModulationFormat modulationFormat = ModulationFormat.forName(ztoADirection.getModulationFormat());
+            if (modulationFormat == null) {
                 LOG.error("Unknown modulation format {} for z to a direction, frequencies not updated",
                         ztoADirection.getModulationFormat());
                 return;
             }
-            setFrequencies4Tps(ztoaMinFrequency, ztoaMaxFrequency, ztoADirection.getRate(),
-                    optionalModulationFormat.get(), ztoaTpIds, used);
-            setFrequencies4Nodes(ztoaMinFrequency,
-                    ztoaMaxFrequency,
+            setFrequencies4Tps(
+                    ztoaMinFrequency, ztoaMaxFrequency,
+                    ztoADirection.getRate(), modulationFormat, ztoaTpIds,
+                    used);
+            setFrequencies4Nodes(
+                    ztoaMinFrequency, ztoaMaxFrequency,
                     ztoaTpIds.stream().map(NodeIdPair::getNodeID).distinct().collect(Collectors.toList()),
                     used);
         }
@@ -143,22 +148,22 @@ public class FrequenciesServiceImpl implements FrequenciesService {
     private Node1 getNetworkNodeFromDatastore(String nodeId) {
         InstanceIdentifier<Node1> nodeIID = OpenRoadmTopology.createNetworkNodeIID(nodeId);
         try (ReadTransaction nodeReadTx = this.dataBroker.newReadOnlyTransaction()) {
-            Optional<Node1> optionalNode = nodeReadTx.read(LogicalDatastoreType.CONFIGURATION, nodeIID)
-                    .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
-            if (optionalNode.isPresent()) {
-                return optionalNode.get();
-            } else {
-                LOG.error("Unable to get network node for node id {} from topology {}", nodeId,
-                        NetworkUtils.OVERLAY_NETWORK_ID);
+            Optional<Node1> optionalNode = nodeReadTx
+                .read(LogicalDatastoreType.CONFIGURATION, nodeIID)
+                .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
+            if (optionalNode.isEmpty()) {
+                LOG.warn("Unable to get network node for node id {} from topology {}",
+                     nodeId, NetworkUtils.OVERLAY_NETWORK_ID);
                 return null;
             }
+            return optionalNode.orElseThrow();
         } catch (ExecutionException | TimeoutException e) {
-            LOG.warn("Exception while getting network node for node id {} from {} topology", nodeId,
-                    NetworkUtils.OVERLAY_NETWORK_ID, e);
+            LOG.warn("Exception while getting network node for node id {} from {} topology",
+                    nodeId, NetworkUtils.OVERLAY_NETWORK_ID, e);
             return null;
         } catch (InterruptedException e) {
-            LOG.warn("Getting network node for node id {} from {} topology was interrupted", nodeId,
-                    NetworkUtils.OVERLAY_NETWORK_ID, e);
+            LOG.warn("Getting network node for node id {} from {} topology was interrupted",
+                    nodeId, NetworkUtils.OVERLAY_NETWORK_ID, e);
             Thread.currentThread().interrupt();
             return null;
         }
@@ -169,29 +174,28 @@ public class FrequenciesServiceImpl implements FrequenciesService {
      * @param nodeId String
      * @return Node1, null otherwise.
      */
-    private org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1
-        getCommonNetworkNodeFromDatastore(String nodeId) {
-        InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1> nodeIID =
-                OpenRoadmTopology.createCommonNetworkNodeIID(nodeId);
+    private org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1
+            getCommonNetworkNodeFromDatastore(String nodeId) {
+        InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1> nodeIID =
+            OpenRoadmTopology.createCommonNetworkNodeIID(nodeId);
         try (ReadTransaction nodeReadTx = this.dataBroker.newReadOnlyTransaction()) {
-            Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1> optionalNode =
-                    nodeReadTx
+            Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1> optionalNode =
+                nodeReadTx
                     .read(LogicalDatastoreType.CONFIGURATION, nodeIID)
                     .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
-            if (optionalNode.isPresent()) {
-                return optionalNode.get();
-            } else {
-                LOG.error("Unable to get common network node for node id {} from topology {}", nodeId,
-                        NetworkUtils.OVERLAY_NETWORK_ID);
+            if (optionalNode.isEmpty()) {
+                LOG.error("Unable to get common network node for node id {} from topology {}",
+                        nodeId, NetworkUtils.OVERLAY_NETWORK_ID);
                 return null;
             }
+            return optionalNode.orElseThrow();
         } catch (ExecutionException | TimeoutException e) {
-            LOG.warn("Exception while getting common network node for node id {} from {} topology", nodeId,
-                    NetworkUtils.OVERLAY_NETWORK_ID, e);
+            LOG.warn("Exception while getting common network node for node id {} from {} topology",
+                    nodeId, NetworkUtils.OVERLAY_NETWORK_ID, e);
             return null;
         } catch (InterruptedException e) {
-            LOG.warn("Getting common network node for node id {} from {} topology was interrupted", nodeId,
-                    NetworkUtils.OVERLAY_NETWORK_ID, e);
+            LOG.warn("Getting common network node for node id {} from {} topology was interrupted",
+                    nodeId, NetworkUtils.OVERLAY_NETWORK_ID, e);
             Thread.currentThread().interrupt();
             return null;
         }
@@ -199,14 +203,14 @@ public class FrequenciesServiceImpl implements FrequenciesService {
 
     /**
      * Set frequency map for nodes in nodeIds.
-     * @param minFrequency BigDecimal
-     * @param maxFrequency BigDecimal
+     * @param atozMinFrequency BigDecimal
+     * @param atozMaxFrequency BigDecimal
      * @param nodeIds List of node id
      * @param used boolean true if min and max frequencies are used, false otherwise.
      */
-    private void setFrequencies4Nodes(BigDecimal minFrequency, BigDecimal maxFrequency,
+    private void setFrequencies4Nodes(Decimal64 atozMinFrequency, Decimal64 atozMaxFrequency,
             List<String> nodeIds, boolean used) {
-        updateFreqMaps4Nodes(nodeIds, minFrequency, maxFrequency, used);
+        updateFreqMaps4Nodes(nodeIds, atozMinFrequency, atozMaxFrequency, used);
     }
 
 
@@ -217,24 +221,20 @@ public class FrequenciesServiceImpl implements FrequenciesService {
      * @return network termination point, null otherwise
      */
     private TerminationPoint1 getNetworkTerminationPointFromDatastore(String nodeId, String tpId) {
-        InstanceIdentifier<TerminationPoint1> tpIID = OpenRoadmTopology
-                .createNetworkTerminationPointIIDBuilder(nodeId, tpId).build();
+        InstanceIdentifier<TerminationPoint1> tpIID =
+            InstanceIdentifiers.createNetworkTerminationPoint1IIDBuilder(nodeId, tpId);
         try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
             Optional<TerminationPoint1> optionalTerminationPoint = readTx
                     .read(LogicalDatastoreType.CONFIGURATION, tpIID)
                     .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
-            if (optionalTerminationPoint.isPresent()) {
-                return optionalTerminationPoint.get();
-            } else {
-                return null;
-            }
+            return optionalTerminationPoint.isEmpty() ? null : optionalTerminationPoint.orElseThrow();
         } catch (ExecutionException | TimeoutException e) {
-            LOG.warn("Exception while getting termination {} for node id {} point from {} topology", tpId, nodeId,
-                    NetworkUtils.OVERLAY_NETWORK_ID, e);
+            LOG.warn("Exception while getting termination {} for node id {} point from {} topology",
+                    tpId, nodeId, NetworkUtils.OVERLAY_NETWORK_ID, e);
             return null;
         } catch (InterruptedException e) {
-            LOG.warn("Getting termination {} for node id {} point from {} topology was interrupted", tpId, nodeId,
-                    NetworkUtils.OVERLAY_NETWORK_ID, e);
+            LOG.warn("Getting termination {} for node id {} point from {} topology was interrupted",
+                    tpId, nodeId, NetworkUtils.OVERLAY_NETWORK_ID, e);
             Thread.currentThread().interrupt();
             return null;
         }
@@ -246,23 +246,21 @@ public class FrequenciesServiceImpl implements FrequenciesService {
      * @param tpId String
      * @return common network termination point, null otherwise
      */
-    private org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1
-        getCommonNetworkTerminationPointFromDatastore(String nodeId, String tpId) {
-        InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1>
+    private org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1
+            getCommonNetworkTerminationPointFromDatastore(String nodeId, String tpId) {
+        InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1>
             tpIID = OpenRoadmTopology.createCommonNetworkTerminationPointIIDBuilder(nodeId, tpId).build();
         try (ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction()) {
-            Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1>
+            Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1>
                 optionalTerminationPoint = readTx
                     .read(LogicalDatastoreType.CONFIGURATION, tpIID)
                     .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
-            if (optionalTerminationPoint.isPresent()) {
-                return optionalTerminationPoint.get();
-            } else {
-                LOG.error("Unable to get common-network termination point {} for node id {}from topology {}", tpId,
-                        nodeId, NetworkUtils.OVERLAY_NETWORK_ID);
+            if (optionalTerminationPoint.isEmpty()) {
+                LOG.error("Unable to get common-network termination point {} for node id {}from topology {}",
+                        tpId, nodeId, NetworkUtils.OVERLAY_NETWORK_ID);
                 return null;
             }
-
+            return optionalTerminationPoint.orElseThrow();
         } catch (ExecutionException | TimeoutException e) {
             LOG.warn("Exception while getting common-network termination {} for node id {} point from {} topology",
                     tpId, nodeId, NetworkUtils.OVERLAY_NETWORK_ID, e);
@@ -277,94 +275,93 @@ public class FrequenciesServiceImpl implements FrequenciesService {
 
     /**
      * Update availFreqMapsMap for min and max frequencies for termination point in tpIds.
-     * @param minFrequency BigDecimal
-     * @param maxFrequency BigDecimal
+     * @param atozMinFrequency BigDecimal
+     * @param atozMaxFrequency BigDecimal
      * @param rate Uint32
      * @param modulationFormat ModulationFormat
      * @param tpIds List of NodeIdPair
      * @param sed boolean true if min and max frequencies are used, false otherwise.
      */
-    private void setFrequencies4Tps(BigDecimal minFrequency, BigDecimal maxFrequency, Uint32 rate,
+    private void setFrequencies4Tps(Decimal64 atozMinFrequency, Decimal64 atozMaxFrequency, Uint32 rate,
             ModulationFormat modulationFormat, List<NodeIdPair> tpIds, boolean used) {
         String strTpIdsList = String.join(", ", tpIds.stream().map(NodeIdPair::toString).collect(Collectors.toList()));
-        LOG.debug("Update frequencies for termination points {}, rate {}, modulation format {},"
-                + "min frequency {}, max frequency {}, used {}", strTpIdsList, rate, modulationFormat,
-                minFrequency, maxFrequency, used);
+        LOG.debug(
+            "Update frequencies for termination points {}, rate {}, modulation format {},"
+                + " min frequency {}, max frequency {}, used {}",
+            strTpIdsList, rate, modulationFormat, atozMinFrequency, atozMaxFrequency, used);
         WriteTransaction updateFrequenciesTransaction = this.dataBroker.newWriteOnlyTransaction();
         for (NodeIdPair idPair : tpIds) {
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1
-                commonNetworkTerminationPoint = getCommonNetworkTerminationPointFromDatastore(idPair.getNodeID(),
-                    idPair.getTpID());
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1
+                    commonNetworkTerminationPoint =
+                getCommonNetworkTerminationPointFromDatastore(idPair.getNodeID(), idPair.getTpID());
             if (commonNetworkTerminationPoint == null) {
-                LOG.warn("Cannot update frequencies for termination point {}, node id {}", idPair.getTpID(),
-                        idPair.getNodeID());
+                LOG.warn("Cannot update frequencies for termination point {}, node id {}",
+                    idPair.getTpID(), idPair.getNodeID());
                 continue;
             }
             TerminationPoint1 networkTerminationPoint =
                     getNetworkTerminationPointFromDatastore(idPair.getNodeID(), idPair.getTpID());
-            TerminationPoint1Builder networkTerminationPointBuilder;
-            if (networkTerminationPoint != null) {
-                networkTerminationPointBuilder = new TerminationPoint1Builder(networkTerminationPoint);
-            } else {
-                networkTerminationPointBuilder = new TerminationPoint1Builder();
-            }
+            TerminationPoint1Builder networkTerminationPointBuilder =
+                networkTerminationPoint == null
+                    ? new TerminationPoint1Builder()
+                    : new TerminationPoint1Builder(networkTerminationPoint);
             switch (commonNetworkTerminationPoint.getTpType()) {
                 case DEGREETXTTP:
                 case DEGREETXRXTTP:
                     networkTerminationPointBuilder.setTxTtpAttributes(updateTxTtpAttributes(networkTerminationPoint,
-                            minFrequency,maxFrequency,used));
+                            atozMinFrequency,atozMaxFrequency,used));
                     break;
                 case DEGREERXTTP:
                     networkTerminationPointBuilder.setRxTtpAttributes(updateRxTtpAttributes(networkTerminationPoint,
-                            minFrequency,maxFrequency,used));
+                            atozMinFrequency,atozMaxFrequency,used));
                     break;
                 case DEGREETXCTP:
                 case DEGREERXCTP:
                 case DEGREETXRXCTP:
                     networkTerminationPointBuilder.setCtpAttributes(updateCtpAttributes(networkTerminationPoint,
-                            minFrequency,maxFrequency,used));
+                            atozMinFrequency,atozMaxFrequency,used));
                     break;
                 case SRGTXCP:
                 case SRGRXCP:
                 case SRGTXRXCP:
                     networkTerminationPointBuilder.setCpAttributes(updateCpAttributes(networkTerminationPoint,
-                            minFrequency,maxFrequency,used));
+                            atozMinFrequency,atozMaxFrequency,used));
                     break;
                 case SRGTXRXPP:
                 case SRGRXPP:
                 case SRGTXPP:
                     networkTerminationPointBuilder.setPpAttributes(updatePpAttributes(networkTerminationPoint,
-                            minFrequency,maxFrequency,used));
+                            atozMinFrequency,atozMaxFrequency,used));
                     break;
                 case XPONDERNETWORK:
                     networkTerminationPointBuilder.setXpdrNetworkAttributes(
                             updateXpdrNetworkAttributes(networkTerminationPoint,
-                                    minFrequency, maxFrequency, rate, modulationFormat, used)).build();
+                                    atozMinFrequency, atozMaxFrequency, rate, modulationFormat, used)).build();
                     break;
                 case XPONDERCLIENT:
                     break;
                 case XPONDERPORT:
                     networkTerminationPointBuilder.setXpdrPortAttributes(
                             updateXpdrPortAttributes(networkTerminationPoint,
-                                    minFrequency, maxFrequency, rate, modulationFormat, used)).build();
+                                    atozMinFrequency, atozMaxFrequency, rate, modulationFormat, used)).build();
                     break;
                 default:
                     LOG.warn("Termination point type {} not managed", commonNetworkTerminationPoint.getTpType());
                     return;
             }
-            updateFrequenciesTransaction.put(LogicalDatastoreType.CONFIGURATION, OpenRoadmTopology
-                    .createNetworkTerminationPointIIDBuilder(idPair.getNodeID(),
-                            idPair.getTpID()).build(), networkTerminationPointBuilder.build());
+            updateFrequenciesTransaction.put(LogicalDatastoreType.CONFIGURATION, InstanceIdentifiers
+                    .createNetworkTerminationPoint1IIDBuilder(idPair.getNodeID(),
+                            idPair.getTpID()), networkTerminationPointBuilder.build());
         }
         try {
             updateFrequenciesTransaction.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS);
         } catch (ExecutionException | TimeoutException e) {
             LOG.error(
                 "Something went wrong for frequencies update (min frequency {}, max frequency {}, used {} for TPs {}",
-                minFrequency, maxFrequency, used, strTpIdsList, e);
+                atozMinFrequency, atozMaxFrequency, used, strTpIdsList, e);
         } catch (InterruptedException e) {
             LOG.error("Frequencies update (min frequency {}, max frequency {}, used {} for TPs {} was interrupted",
-                    minFrequency, maxFrequency, used,
+                    atozMinFrequency, atozMaxFrequency, used,
                     strTpIdsList, e);
             Thread.currentThread().interrupt();
         }
@@ -373,19 +370,19 @@ public class FrequenciesServiceImpl implements FrequenciesService {
     /**
      * Update availFreqMapsMap for min and max frequencies for nodes in nodeIds.
      * @param nodeIds  List of node id
-     * @param minFrequency BigDecimal
-     * @param maxFrequency BigDecimal
+     * @param atozMinFrequency BigDecimal
+     * @param atozMaxFrequency BigDecimal
      * @param used boolean true if min and max frequencies are used, false otherwise.
      */
-    private void updateFreqMaps4Nodes(List<String> nodeIds, BigDecimal minFrequency, BigDecimal maxFrequency,
+    private void updateFreqMaps4Nodes(List<String> nodeIds, Decimal64 atozMinFrequency, Decimal64 atozMaxFrequency,
             boolean used) {
         String strNodesList = String.join(", ", nodeIds);
         LOG.debug("Update frequencies for nodes {}, min frequency {}, max frequency {}, used {}",
-                strNodesList, minFrequency, maxFrequency, used);
+                strNodesList, atozMinFrequency, atozMaxFrequency, used);
         WriteTransaction updateFrequenciesTransaction = this.dataBroker.newWriteOnlyTransaction();
         for (String nodeId : nodeIds) {
             Node1 networkNode = getNetworkNodeFromDatastore(nodeId);
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1 commonNetworkNode =
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1 commonNetworkNode =
                     getCommonNetworkNodeFromDatastore(nodeId);
             if (networkNode == null || commonNetworkNode == null) {
                 LOG.warn(
@@ -398,12 +395,12 @@ public class FrequenciesServiceImpl implements FrequenciesService {
             switch (commonNetworkNode.getNodeType()) {
                 case DEGREE:
                     networkNodeBuilder.setDegreeAttributes(
-                            updateDegreeAttributes(networkNode.getDegreeAttributes(), minFrequency,
-                                    maxFrequency, used));
+                            updateDegreeAttributes(networkNode.getDegreeAttributes(), atozMinFrequency,
+                                    atozMaxFrequency, used));
                     break;
                 case SRG:
-                    networkNodeBuilder.setSrgAttributes(
-                            updateSrgAttributes(networkNode.getSrgAttributes(), minFrequency, maxFrequency, used));
+                    networkNodeBuilder.setSrgAttributes(updateSrgAttributes(
+                            networkNode.getSrgAttributes(), atozMinFrequency, atozMaxFrequency, used));
                     break;
                 default:
                     LOG.warn("Node type not managed {}", commonNetworkNode.getNodeType());
@@ -415,10 +412,10 @@ public class FrequenciesServiceImpl implements FrequenciesService {
         try {
             updateFrequenciesTransaction.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS);
         } catch (ExecutionException | TimeoutException e) {
-            LOG.error("Cannot update frequencies {} {} for nodes {}", minFrequency, maxFrequency,
+            LOG.error("Cannot update frequencies {} {} for nodes {}", atozMinFrequency, atozMaxFrequency,
                     strNodesList, e);
         } catch (InterruptedException e) {
-            LOG.error("Update of frequencies {} {} for nodes {} was interrupted", minFrequency, maxFrequency,
+            LOG.error("Update of frequencies {} {} for nodes {} was interrupted", atozMinFrequency, atozMaxFrequency,
                     strNodesList, e);
             Thread.currentThread().interrupt();
         }
@@ -430,18 +427,16 @@ public class FrequenciesServiceImpl implements FrequenciesService {
      * @return List of NodeIdPair
      */
     private List<NodeIdPair> getAToZTpList(AToZDirection atoZDirection) {
-        Collection<AToZ> atozList = atoZDirection.nonnullAToZ().values();
-        return atozList.stream()
+        return atoZDirection.nonnullAToZ().values().stream()
                 .filter(aToZ -> {
-                    if ((aToZ.getResource() == null) || (aToZ.getResource().getResource() == null)) {
+                    if (aToZ.getResource() == null || aToZ.getResource().getResource() == null) {
                         LOG.warn("Resource of AToZ node {} is null! Skipping this node!", aToZ.getId());
                         return false;
                     }
                     return aToZ.getResource().getResource() instanceof TerminationPoint;
                 }).map(aToZ -> {
                     TerminationPoint tp = (TerminationPoint) aToZ.getResource().getResource();
-                    if ((tp == null) || (tp.getTpNodeId() == null) ||  (tp.getTpId() == null)
-                        || tp.getTpId().isEmpty()) {
+                    if (tp == null || tp.getTpNodeId() == null || tp.getTpId() == null || tp.getTpId().isEmpty()) {
                         LOG.warn("Termination point in AToZ node {} contains nulls! Skipping this node!", aToZ.getId());
                         return null;
                     }
@@ -456,18 +451,16 @@ public class FrequenciesServiceImpl implements FrequenciesService {
      * @return List of NodeIdPair
      */
     private List<NodeIdPair> getZToATpList(ZToADirection ztoADirection) {
-        Collection<ZToA> ztoaList = ztoADirection.nonnullZToA().values();
-        return ztoaList.stream()
+        return ztoADirection.nonnullZToA().values().stream()
                 .filter(zToA -> {
-                    if ((zToA.getResource() == null) || (zToA.getResource().getResource() == null)) {
+                    if (zToA.getResource() == null || zToA.getResource().getResource() == null) {
                         LOG.warn("Resource of ZToA node {} is null! Skipping this node!", zToA.getId());
                         return false;
                     }
                     return zToA.getResource().getResource() instanceof TerminationPoint;
                 }).map(zToA -> {
                     TerminationPoint tp = (TerminationPoint) zToA.getResource().getResource();
-                    if ((tp == null) || (tp.getTpNodeId() == null) ||  (tp.getTpId() == null)
-                        || tp.getTpId().isEmpty()) {
+                    if (tp == null || tp.getTpNodeId() == null || tp.getTpId() == null || tp.getTpId().isEmpty()) {
                         LOG.warn("Termination point in ZToA node {} contains nulls! Skipping this node!", zToA.getId());
                         return null;
                     }
@@ -479,258 +472,272 @@ public class FrequenciesServiceImpl implements FrequenciesService {
     /**
      * Update Wavelength for xpdr port attributes.
      * @param networkTerminationPoint TerminationPoint1
-     * @param minFrequency BigDecimal
-     * @param maxFrequency BigDecimal
+     * @param atozMinFrequency BigDecimal
+     * @param atozMaxFrequency BigDecimal
      * @param rate Uint32
      * @param modulationFormat ModulationFormat
      * @param used boolean true if min and max frequencies are used, false otherwise.
      * @return XpdrPortAttributes with Wavelength updated
      */
     private XpdrPortAttributes updateXpdrPortAttributes(TerminationPoint1 networkTerminationPoint,
-            BigDecimal minFrequency, BigDecimal maxFrequency, Uint32 rate, ModulationFormat modulationFormat,
+            Decimal64 atozMinFrequency, Decimal64 atozMaxFrequency, Uint32 rate, ModulationFormat modulationFormat,
             boolean used) {
         LOG.debug("Update xpdr node attributes for termination point {}, min frequency {}, max frequency {}, used {}",
-                networkTerminationPoint, minFrequency, maxFrequency, used);
-        XpdrPortAttributesBuilder xpdrPortAttributesBuilder;
-        if (networkTerminationPoint != null) {
-            xpdrPortAttributesBuilder = new XpdrPortAttributesBuilder(networkTerminationPoint.getXpdrPortAttributes());
-        } else {
-            xpdrPortAttributesBuilder = new XpdrPortAttributesBuilder();
-        }
-        WavelengthBuilder waveLengthBuilder = new WavelengthBuilder();
-        if (used) {
-            waveLengthBuilder.setWidth(GridUtils.getWidthFromRateAndModulationFormat(rate, modulationFormat))
-                    .setFrequency(GridUtils.getCentralFrequency(minFrequency, maxFrequency));
-        }
-        return xpdrPortAttributesBuilder.setWavelength(waveLengthBuilder.build()).build();
+                networkTerminationPoint, atozMinFrequency, atozMaxFrequency, used);
+        XpdrPortAttributesBuilder xpdrPortAttributesBuilder =
+            networkTerminationPoint == null
+                ? new XpdrPortAttributesBuilder()
+                : new XpdrPortAttributesBuilder(networkTerminationPoint.getXpdrPortAttributes());
+        return xpdrPortAttributesBuilder
+            .setWavelength(
+                used
+                    ? new WavelengthBuilder()
+                        .setWidth(GridUtils.getWidthFromRateAndModulationFormat(rate, modulationFormat))
+                        .setFrequency(
+                            GridUtils.getCentralFrequency(
+                                atozMinFrequency.decimalValue(),
+                                atozMaxFrequency.decimalValue()))
+                        .build()
+                    : new WavelengthBuilder().build())
+            .build();
     }
 
     /**
      * Update Wavelength for xpdr network attributes.
      * @param networkTerminationPoint TerminationPoint1
-     * @param minFrequency BigDecimal
-     * @param maxFrequency BigDecimal
+     * @param atozMinFrequency BigDecimal
+     * @param atozMaxFrequency BigDecimal
      * @param rate Uint32
      * @param modulationFormat ModulationFormat
      * @param used boolean true if min and max frequencies are used, false otherwise.
      * @return XpdrNetworkAttributes with Wavelength updated
      */
     private XpdrNetworkAttributes updateXpdrNetworkAttributes(TerminationPoint1 networkTerminationPoint,
-            BigDecimal minFrequency, BigDecimal maxFrequency, Uint32 rate, ModulationFormat modulationFormat,
+            Decimal64 atozMinFrequency, Decimal64 atozMaxFrequency, Uint32 rate, ModulationFormat modulationFormat,
             boolean used) {
         LOG.debug("Update xpdr node attributes for termination point {}, min frequency {}, max frequency {}, used {}",
-                networkTerminationPoint, minFrequency, maxFrequency, used);
-        XpdrNetworkAttributesBuilder xpdrNetworkAttributesBuilder;
-        if (networkTerminationPoint != null) {
-            xpdrNetworkAttributesBuilder = new XpdrNetworkAttributesBuilder(
-                    networkTerminationPoint.getXpdrNetworkAttributes());
-        } else {
-            xpdrNetworkAttributesBuilder = new XpdrNetworkAttributesBuilder();
-        }
-        WavelengthBuilder waveLengthBuilder = new WavelengthBuilder();
-        if (used) {
-            waveLengthBuilder.setWidth(GridUtils.getWidthFromRateAndModulationFormat(rate, modulationFormat))
-                    .setFrequency(GridUtils.getCentralFrequency(minFrequency, maxFrequency));
-            xpdrNetworkAttributesBuilder.setWavelength(waveLengthBuilder.build());
-        } else {
-            xpdrNetworkAttributesBuilder.setWavelength(null);
-        }
-        return xpdrNetworkAttributesBuilder.build();
+                networkTerminationPoint, atozMinFrequency, atozMaxFrequency, used);
+        XpdrNetworkAttributesBuilder xpdrNetworkAttributesBuilder =
+            networkTerminationPoint == null
+                ? new XpdrNetworkAttributesBuilder()
+                : new XpdrNetworkAttributesBuilder(networkTerminationPoint.getXpdrNetworkAttributes());
+        return xpdrNetworkAttributesBuilder
+            .setWavelength(
+                used
+                    ? new WavelengthBuilder()
+                        .setWidth(GridUtils.getWidthFromRateAndModulationFormat(rate, modulationFormat))
+                        .setFrequency(
+                            GridUtils.getCentralFrequency(
+                                atozMinFrequency.decimalValue(),
+                                atozMaxFrequency.decimalValue()))
+                        .build()
+                    : null)
+            .build();
+
     }
 
     /**
      * Update freqMaps for pp attributes.
      * @param networkTerminationPoint TerminationPoint1
-     * @param minFrequency BigDecimal
-     * @param maxFrequency BigDecimal
+     * @param atozMinFrequency BigDecimal
+     * @param atozMaxFrequency BigDecimal
      * @param used boolean true if min and max frequencies are used, false otherwise.
      * @return PpAttributes with frequency map updated
      */
-    private PpAttributes updatePpAttributes(TerminationPoint1 networkTerminationPoint, BigDecimal minFrequency,
-            BigDecimal maxFrequency, boolean used) {
+    private PpAttributes updatePpAttributes(TerminationPoint1 networkTerminationPoint, Decimal64 atozMinFrequency,
+            Decimal64 atozMaxFrequency, boolean used) {
         LOG.debug("Update pp attributes for termination point {}, min frequency {}, max frequency {}, used {}",
-                networkTerminationPoint, minFrequency, maxFrequency, used);
-        PpAttributesBuilder ppAttributesBuilder;
-        if (networkTerminationPoint != null) {
-            ppAttributesBuilder = new PpAttributesBuilder(networkTerminationPoint.getPpAttributes());
-        } else {
-            ppAttributesBuilder = new PpAttributesBuilder();
-        }
-        Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMapsMap = ppAttributesBuilder.getAvailFreqMaps();
-        return ppAttributesBuilder.setAvailFreqMaps(updateFreqMaps(minFrequency, maxFrequency, availFreqMapsMap, used))
-                .build();
+                networkTerminationPoint, atozMinFrequency, atozMaxFrequency, used);
+        PpAttributesBuilder ppAttributesBuilder =
+            networkTerminationPoint == null
+                ? new PpAttributesBuilder()
+                : new PpAttributesBuilder(networkTerminationPoint.getPpAttributes());
+        return ppAttributesBuilder
+            .setAvailFreqMaps(
+                updateFreqMaps(
+                    atozMinFrequency, atozMaxFrequency,
+                    ppAttributesBuilder.getAvailFreqMaps(),
+                    used))
+            .build();
     }
 
     /**
      * Update freqMaps for cp attributes.
      * @param networkTerminationPoint TerminationPoint1
-     * @param minFrequency BigDecimal
-     * @param maxFrequency BigDecimal
+     * @param atozMinFrequency BigDecimal
+     * @param atozMaxFrequency BigDecimal
      * @param used boolean true if min and max frequencies are used, false otherwise.
      * @return CpAttributes with frequency map updated
      */
-    private CpAttributes updateCpAttributes(TerminationPoint1 networkTerminationPoint, BigDecimal minFrequency,
-            BigDecimal maxFrequency, boolean used) {
+    private CpAttributes updateCpAttributes(TerminationPoint1 networkTerminationPoint, Decimal64 atozMinFrequency,
+            Decimal64 atozMaxFrequency, boolean used) {
         LOG.debug("Update cp attributes for termination point {}, min frequency {}, max frequency {}, used {}",
-                networkTerminationPoint, minFrequency, maxFrequency, used);
-        CpAttributesBuilder cpAttributesBuilder;
-        if (networkTerminationPoint != null) {
-            cpAttributesBuilder = new CpAttributesBuilder(networkTerminationPoint.getCpAttributes());
-        } else {
-            cpAttributesBuilder = new CpAttributesBuilder();
-        }
-        Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMapsMap = cpAttributesBuilder.getAvailFreqMaps();
-        return cpAttributesBuilder.setAvailFreqMaps(updateFreqMaps(minFrequency, maxFrequency, availFreqMapsMap, used))
-                .build();
+                networkTerminationPoint, atozMinFrequency, atozMaxFrequency, used);
+        CpAttributesBuilder cpAttributesBuilder =
+            networkTerminationPoint == null
+                ? new CpAttributesBuilder()
+                : new CpAttributesBuilder(networkTerminationPoint.getCpAttributes());
+        return cpAttributesBuilder
+            .setAvailFreqMaps(
+                updateFreqMaps(
+                    atozMinFrequency, atozMaxFrequency,
+                    cpAttributesBuilder.getAvailFreqMaps(),
+                    used))
+            .build();
     }
 
     /**
      * Update freqMaps for ctp attributes.
      * @param networkTerminationPoint TerminationPoint1
-     * @param minFrequency BigDecimal
-     * @param maxFrequency BigDecimal
+     * @param atozMinFrequency BigDecimal
+     * @param atozMaxFrequency BigDecimal
      * @param used boolean true if min and max frequencies are used, false otherwise.
      * @return CtpAttributes with frequency map updated
      */
-    private CtpAttributes updateCtpAttributes(TerminationPoint1 networkTerminationPoint, BigDecimal minFrequency,
-            BigDecimal maxFrequency, boolean used) {
+    private CtpAttributes updateCtpAttributes(TerminationPoint1 networkTerminationPoint, Decimal64 atozMinFrequency,
+            Decimal64 atozMaxFrequency, boolean used) {
         LOG.debug("Update ctp attributes for termination point {}, min frequency {}, max frequency {}, used {}",
-                networkTerminationPoint, minFrequency, maxFrequency, used);
-        CtpAttributesBuilder ctpAttributesBuilder;
-        if (networkTerminationPoint != null) {
-            ctpAttributesBuilder = new CtpAttributesBuilder(networkTerminationPoint.getCtpAttributes());
-        } else {
-            ctpAttributesBuilder = new CtpAttributesBuilder();
-        }
-        Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMapsMap = ctpAttributesBuilder.getAvailFreqMaps();
-        return ctpAttributesBuilder.setAvailFreqMaps(updateFreqMaps(minFrequency, maxFrequency, availFreqMapsMap, used))
-                .build();
+                networkTerminationPoint, atozMinFrequency, atozMaxFrequency, used);
+        CtpAttributesBuilder ctpAttributesBuilder =
+            networkTerminationPoint == null
+                ?  new CtpAttributesBuilder()
+                :  new CtpAttributesBuilder(networkTerminationPoint.getCtpAttributes());
+        return ctpAttributesBuilder
+            .setAvailFreqMaps(
+                updateFreqMaps(
+                    atozMinFrequency, atozMaxFrequency,
+                    ctpAttributesBuilder.getAvailFreqMaps(),
+                    used))
+            .build();
     }
 
     /**
      * Update freqMaps for rxtp attributes.
      * @param networkTerminationPoint TerminationPoint1
-     * @param minFrequency BigDecimal
-     * @param maxFrequency BigDecimal
+     * @param atozMinFrequency BigDecimal
+     * @param atozMaxFrequency BigDecimal
      * @param used boolean true if min and max frequencies are used, false otherwise.
      * @return RxTtpAttributes with frequency map updated
      */
-    private RxTtpAttributes updateRxTtpAttributes(TerminationPoint1 networkTerminationPoint, BigDecimal minFrequency,
-            BigDecimal maxFrequency, boolean used) {
+    private RxTtpAttributes updateRxTtpAttributes(TerminationPoint1 networkTerminationPoint, Decimal64 atozMinFrequency,
+            Decimal64 atozMaxFrequency, boolean used) {
         LOG.debug("Update rx attributes for termination point {}, min frequency {}, max frequency {}, used {}",
-                networkTerminationPoint, minFrequency, maxFrequency, used);
-        RxTtpAttributesBuilder rxTtpAttributesBuilder;
-        if (networkTerminationPoint != null) {
-            rxTtpAttributesBuilder = new RxTtpAttributesBuilder(networkTerminationPoint.getRxTtpAttributes());
-        } else {
-            rxTtpAttributesBuilder = new RxTtpAttributesBuilder();
-        }
-        Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMapsMap = rxTtpAttributesBuilder.getAvailFreqMaps();
+                networkTerminationPoint, atozMinFrequency, atozMaxFrequency, used);
+        RxTtpAttributesBuilder rxTtpAttributesBuilder =
+            networkTerminationPoint == null
+                ? new RxTtpAttributesBuilder()
+                : new RxTtpAttributesBuilder(networkTerminationPoint.getRxTtpAttributes());
         return rxTtpAttributesBuilder
-                .setAvailFreqMaps(updateFreqMaps(minFrequency, maxFrequency, availFreqMapsMap, used)).build();
+            .setAvailFreqMaps(
+                updateFreqMaps(
+                    atozMinFrequency, atozMaxFrequency,
+                    rxTtpAttributesBuilder.getAvailFreqMaps(),
+                    used))
+            .build();
     }
 
     /**
      * Update freqMaps for txtp attributes.
      * @param networkTerminationPoint TerminationPoint1
-     * @param minFrequency BigDecimal
-     * @param maxFrequency BigDecimal
+     * @param atozMinFrequency BigDecimal
+     * @param atozMaxFrequency BigDecimal
      * @param used boolean true if min and max frequencies are used, false otherwise.
      * @return TxTtpAttributes with frequency map updated
      */
-    private TxTtpAttributes updateTxTtpAttributes(TerminationPoint1 networkTerminationPoint, BigDecimal minFrequency,
-            BigDecimal maxFrequency, boolean used) {
+    private TxTtpAttributes updateTxTtpAttributes(TerminationPoint1 networkTerminationPoint, Decimal64 atozMinFrequency,
+            Decimal64 atozMaxFrequency, boolean used) {
         LOG.debug("Update tx attributes for termination point {}, min frequency {}, max frequency {}, used {}",
-                networkTerminationPoint, minFrequency, maxFrequency, used);
-        TxTtpAttributesBuilder txTtpAttributesBuilder;
-        if (networkTerminationPoint != null) {
-            txTtpAttributesBuilder = new TxTtpAttributesBuilder(networkTerminationPoint.getTxTtpAttributes());
-        } else {
-            txTtpAttributesBuilder = new TxTtpAttributesBuilder();
-        }
-        Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMapsMap = txTtpAttributesBuilder.getAvailFreqMaps();
+                networkTerminationPoint, atozMinFrequency, atozMaxFrequency, used);
+        TxTtpAttributesBuilder txTtpAttributesBuilder =
+            networkTerminationPoint == null
+                ? new TxTtpAttributesBuilder()
+                : new TxTtpAttributesBuilder(networkTerminationPoint.getTxTtpAttributes());
         return txTtpAttributesBuilder
-                .setAvailFreqMaps(updateFreqMaps(minFrequency, maxFrequency, availFreqMapsMap, used)).build();
+            .setAvailFreqMaps(
+                updateFreqMaps(
+                    atozMinFrequency, atozMaxFrequency,
+                    txTtpAttributesBuilder.getAvailFreqMaps(),
+                    used))
+            .build();
     }
 
     /**
      * Update freqMaps for srg attributes of srgAttributes.
      * @param srgAttributes SrgAttributes
-     * @param minFrequency BigDecimal
-     * @param maxFrequency BigDecimal
+     * @param atozMinFrequency BigDecimal
+     * @param atozMaxFrequency BigDecimal
      * @param used boolean true if min and max frequencies are used, false otherwise.
      * @return SrgAttributes with frequency map updated
      */
-    private SrgAttributes updateSrgAttributes(SrgAttributes srgAttributes, BigDecimal minFrequency,
-            BigDecimal maxFrequency, boolean used) {
-        Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMapsMap;
-        SrgAttributesBuilder srgAttributesBuilder;
-        if (srgAttributes == null) {
-            srgAttributesBuilder = new SrgAttributesBuilder();
-        } else {
-            srgAttributesBuilder = new SrgAttributesBuilder(srgAttributes);
-        }
-        availFreqMapsMap = srgAttributesBuilder.getAvailFreqMaps();
-        return srgAttributesBuilder.setAvailFreqMaps(updateFreqMaps(minFrequency, maxFrequency, availFreqMapsMap, used))
-                .build();
+    private SrgAttributes updateSrgAttributes(SrgAttributes srgAttributes, Decimal64 atozMinFrequency,
+            Decimal64 atozMaxFrequency, boolean used) {
+        SrgAttributesBuilder srgAttributesBuilder =
+            srgAttributes == null
+                ? new SrgAttributesBuilder()
+                : new SrgAttributesBuilder(srgAttributes);
+        return srgAttributesBuilder
+            .setAvailFreqMaps(
+                updateFreqMaps(
+                    atozMinFrequency, atozMaxFrequency,
+                    srgAttributesBuilder.getAvailFreqMaps(),
+                    used))
+            .build();
     }
 
     /**
      * Update freqMaps for degree attributes of degreeAttributes.
      * @param degreeAttributes DegreeAttributes
-     * @param minFrequency BigDecimal
-     * @param maxFrequency BigDecimal
+     * @param atozMinFrequency BigDecimal
+     * @param atozMaxFrequency BigDecimal
      * @param used boolean true if min and max frequencies are used, false otherwise.
      * @return DegreeAttributes with frequency map updated
      */
-    private DegreeAttributes updateDegreeAttributes(DegreeAttributes degreeAttributes, BigDecimal minFrequency,
-            BigDecimal maxFrequency, boolean used) {
-        Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMapsMap;
-        DegreeAttributesBuilder degreeAttributesBuilder;
-        if (degreeAttributes == null) {
-            degreeAttributesBuilder = new DegreeAttributesBuilder();
-        } else {
-            degreeAttributesBuilder = new DegreeAttributesBuilder(degreeAttributes);
-        }
-        availFreqMapsMap = degreeAttributesBuilder.getAvailFreqMaps();
+    private DegreeAttributes updateDegreeAttributes(DegreeAttributes degreeAttributes, Decimal64 atozMinFrequency,
+            Decimal64 atozMaxFrequency, boolean used) {
+        DegreeAttributesBuilder degreeAttributesBuilder =
+            degreeAttributes == null
+                ? new DegreeAttributesBuilder()
+                : new DegreeAttributesBuilder(degreeAttributes);
         return degreeAttributesBuilder
-                .setAvailFreqMaps(updateFreqMaps(minFrequency, maxFrequency, availFreqMapsMap, used)).build();
+            .setAvailFreqMaps(
+                updateFreqMaps(
+                    atozMinFrequency, atozMaxFrequency,
+                    degreeAttributesBuilder.getAvailFreqMaps(),
+                    used))
+            .build();
     }
 
     /**
      * Update availFreqMapsMap for min and max frequencies for cband AvailFreqMaps.
-     * @param minFrequency BigDecimal
-     * @param maxFrequency BigDecimal
+     * @param atozMinFrequency BigDecimal
+     * @param atozMaxFrequency BigDecimal
      * @param availFreqMapsMap Map
      * @param used boolean
      * @return updated Update availFreqMapsMap for min and max frequencies for cband AvailFreqMaps.
      */
-    private Map<AvailFreqMapsKey, AvailFreqMaps> updateFreqMaps(BigDecimal minFrequency, BigDecimal maxFrequency,
+    private Map<AvailFreqMapsKey, AvailFreqMaps> updateFreqMaps(Decimal64 atozMinFrequency, Decimal64 atozMaxFrequency,
             Map<AvailFreqMapsKey, AvailFreqMaps> availFreqMapsMap, boolean used) {
-        int beginIndex = GridUtils.getIndexFromFrequency(minFrequency);
-        int endIndex = GridUtils.getIndexFromFrequency(maxFrequency);
+        int beginIndex = GridUtils.getIndexFromFrequency(atozMinFrequency);
+        int endIndex = GridUtils.getIndexFromFrequency(atozMaxFrequency);
         if (availFreqMapsMap == null) {
             availFreqMapsMap = GridUtils.initFreqMaps4FixedGrid2Available();
         }
         AvailFreqMaps availFreqMaps = availFreqMapsMap.get(availFreqMapKey);
-        if (availFreqMaps != null && availFreqMaps.getFreqMap() != null) {
-            BitSet bitSetFreq = BitSet.valueOf(availFreqMaps.getFreqMap());
-            LOG.debug(
-                 "Update frequency map from index {}, to index {}, min frequency {}, max frequency {}, available {} {}",
-                 beginIndex, endIndex, minFrequency, maxFrequency, !used, bitSetFreq);
-            //if used = true then bit must be set to false to indicate the slot is no more available
-            bitSetFreq.set(beginIndex, endIndex, !used);
-            LOG.debug(
-                "Updated frequency map from index {}, to index {}, min frequency {}, max frequency {}, available {} {}",
-                beginIndex, endIndex, minFrequency, maxFrequency, !used, bitSetFreq);
-            Map<AvailFreqMapsKey, AvailFreqMaps> updatedFreqMaps = new HashMap<>();
-            byte[] frequenciesByteArray = bitSetFreq.toByteArray();
-            AvailFreqMaps updatedAvailFreqMaps = new AvailFreqMapsBuilder(availFreqMaps)
-                    .setFreqMap(Arrays.copyOf(frequenciesByteArray,GridConstant.NB_OCTECTS))
-                    .build();
-            updatedFreqMaps.put(availFreqMaps.key(), updatedAvailFreqMaps);
-            return updatedFreqMaps;
+        if (availFreqMaps == null || availFreqMaps.getFreqMap() == null) {
+            return availFreqMapsMap;
         }
-        return availFreqMapsMap;
+        BitSet bitSetFreq = BitSet.valueOf(availFreqMaps.getFreqMap());
+        LOG.debug(
+             "Update frequency map from index {}, to index {}, min frequency {}, max frequency {}, available {} {}",
+             beginIndex, endIndex, atozMinFrequency, atozMaxFrequency, !used, bitSetFreq);
+        //if used = true then bit must be set to false to indicate the slot is no more available
+        bitSetFreq.set(beginIndex, endIndex, !used);
+        LOG.debug(
+            "Updated frequency map from index {}, to index {}, min frequency {}, max frequency {}, available {} {}",
+            beginIndex, endIndex, atozMinFrequency, atozMaxFrequency, !used, bitSetFreq);
+        AvailFreqMaps updatedAvailFreqMaps = new AvailFreqMapsBuilder(availFreqMaps)
+                .setFreqMap(Arrays.copyOf(bitSetFreq.toByteArray(), GridConstant.NB_OCTECTS))
+                .build();
+        return new HashMap<>(Map.of(availFreqMaps.key(), updatedAvailFreqMaps));
     }
-}
\ No newline at end of file
+}
index a0f506ae64460acbb336a4364cafc3e65e9381f2..0e67633900f3198648fc162400aa9d8bc27011d3 100644 (file)
@@ -8,10 +8,10 @@
 package org.opendaylight.transportpce.networkmodel.service;
 
 import java.util.List;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.OtnLinkType;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.renderer.rpc.result.sp.Link;
-import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.OtnLinkType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.ConnectionOper.ConnectionStatus;
 import org.opendaylight.yangtools.yang.common.Uint32;
 
 /**
@@ -59,7 +59,7 @@ public interface NetworkModelService {
      * @param connectionStatus
      *     connection status of the node
      */
-    void setOpenRoadmNodeStatus(String nodeId, NetconfNodeConnectionStatus.ConnectionStatus connectionStatus);
+    void setOpenRoadmNodeStatus(String nodeId, ConnectionStatus connectionStatus);
 
     /**
      * create new otn link in otn-topology.
index c9ddfe112c7c94a7b11916e54f7365cfdb92bee6..ef07a03f20fb5cee999ddf9ba407cf938f8948cc 100644 (file)
@@ -19,10 +19,12 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.stream.Collectors;
 import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.InstanceIdentifiers;
 import org.opendaylight.transportpce.common.NetworkUtils;
+import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.networkmodel.R2RLinkDiscovery;
@@ -38,15 +40,15 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmo
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.topology.update.result.TopologyChanges;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.topology.update.result.TopologyChangesBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.topology.update.result.TopologyChangesKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.OpenroadmNodeVersion;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfo;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.OtnLinkType;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.OpenroadmNodeVersion;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfo;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.Link1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.TerminationPoint1;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.link.tp.LinkTp;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.link.tp.LinkTpBuilder;
-import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.OtnLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.Link1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.link.tp.LinkTp;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.link.tp.LinkTpBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
@@ -63,12 +65,16 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.top
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.termination.point.SupportingTerminationPoint;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.ConnectionOper.ConnectionStatus;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Uint32;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@Component(immediate = true)
 public class NetworkModelServiceImpl implements NetworkModelService {
 
     private static final Logger LOG = LoggerFactory.getLogger(NetworkModelServiceImpl.class);
@@ -83,24 +89,21 @@ public class NetworkModelServiceImpl implements NetworkModelService {
     private Map<TopologyChangesKey, TopologyChanges> topologyChanges;
     private TopologyUpdateResult notification = null;
 
-    public NetworkModelServiceImpl(final NetworkTransactionService networkTransactionService,
-            final R2RLinkDiscovery linkDiscovery, PortMapping portMapping,
-            final NotificationPublishService notificationPublishService) {
+    @Activate
+    public NetworkModelServiceImpl(@Reference DataBroker dataBroker,
+            @Reference DeviceTransactionManager deviceTransactionManager,
+            @Reference final NetworkTransactionService networkTransactionService,
+            @Reference PortMapping portMapping,
+            @Reference final NotificationPublishService notificationPublishService) {
 
         this.networkTransactionService = networkTransactionService;
-        this.linkDiscovery = linkDiscovery;
+        this.linkDiscovery = new R2RLinkDiscovery(dataBroker, deviceTransactionManager, networkTransactionService);
         this.portMapping = portMapping;
         this.topologyShardMountedDevice = new HashMap<String, TopologyShard>();
         this.otnTopologyShardMountedDevice = new HashMap<String, TopologyShard>();
         this.notificationPublishService = notificationPublishService;
         this.topologyChanges = new HashMap<TopologyChangesKey, TopologyChanges>();
-    }
-
-    public void init() {
-        LOG.info("init ...");
-    }
-
-    public void close() {
+        LOG.debug("NetworkModelServiceImpl instantiated");
     }
 
     @Override
@@ -185,7 +188,7 @@ public class NetworkModelServiceImpl implements NetworkModelService {
     }
 
     @Override
-    public void setOpenRoadmNodeStatus(String nodeId, NetconfNodeConnectionStatus.ConnectionStatus connectionStatus) {
+    public void setOpenRoadmNodeStatus(String nodeId, ConnectionStatus connectionStatus) {
         LOG.info("setOpenROADMNodeStatus: {} {}", nodeId, connectionStatus.name());
         /*
           TODO: set connection status of the device in model,
@@ -291,13 +294,13 @@ public class NetworkModelServiceImpl implements NetworkModelService {
         try {
             openroadmTopology = this.networkTransactionService
                 .read(LogicalDatastoreType.CONFIGURATION, InstanceIdentifiers.OVERLAY_NETWORK_II)
-                .get().get();
+                .get().orElseThrow();
             if (openroadmTopology.augmentation(Network1.class) != null) {
                 openroadmTopologyLinks = openroadmTopology.augmentation(Network1.class).getLink();
             }
             otnTopology = this.networkTransactionService
                 .read(LogicalDatastoreType.CONFIGURATION, InstanceIdentifiers.OTN_NETWORK_II)
-                .get().get();
+                .get().orElseThrow();
             if (otnTopology.augmentation(Network1.class) != null) {
                 otnTopologyLinks = otnTopology.augmentation(Network1.class).getLink();
             }
@@ -340,7 +343,7 @@ public class NetworkModelServiceImpl implements NetworkModelService {
                         .setNodeId(abstractNodeid)
                         .setTpId(tp.getTpId().getValue())
                         .setState(tp.augmentation(
-                            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1
+                            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1
                                 .class).getOperationalState())
                         .build();
                     if (!this.topologyChanges.containsKey(tc.key())) {
@@ -381,7 +384,7 @@ public class NetworkModelServiceImpl implements NetworkModelService {
                         .setNodeId(abstractNodeid)
                         .setTpId(tp.getTpId().getValue())
                         .setState(tp.augmentation(
-                            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1
+                            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1
                                 .class).getOperationalState())
                         .build();
                     if (!this.topologyChanges.containsKey(tc.key())) {
@@ -680,7 +683,7 @@ public class NetworkModelServiceImpl implements NetworkModelService {
             if (linkOptLf.isDone()) {
                 try {
                     if (linkOptLf.get().isPresent()) {
-                        links.add(linkOptLf.get().get());
+                        links.add(linkOptLf.get().orElseThrow());
                     }
                 } catch (InterruptedException | ExecutionException e) {
                     LOG.error("Error retreiving OTN links from otn-topology", e);
@@ -750,8 +753,8 @@ public class NetworkModelServiceImpl implements NetworkModelService {
         }
 
         if (tpAOpt.isPresent() && tpZOpt.isPresent()) {
-            tps.add(tpAOpt.get());
-            tps.add(tpZOpt.get());
+            tps.add(tpAOpt.orElseThrow());
+            tps.add(tpZOpt.orElseThrow());
         }
         return tps;
     }
@@ -772,7 +775,7 @@ public class NetworkModelServiceImpl implements NetworkModelService {
                 try {
                     tpOpt = networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, iiTp).get();
                     if (tpOpt.isPresent()) {
-                        tps.add(tpOpt.get());
+                        tps.add(tpOpt.orElseThrow());
                     }
                 } catch (InterruptedException | ExecutionException e) {
                     LOG.error("Error retreiving tp {} of node {} from otn-topology", tp, nodeId, e);
@@ -787,7 +790,7 @@ public class NetworkModelServiceImpl implements NetworkModelService {
     private void deleteLinks(List<Link> links) {
         for (Link otnTopologyLink : links) {
             LOG.info("deleting link {} from {}", otnTopologyLink.getLinkId().getValue(),
-                NetworkUtils.OVERLAY_NETWORK_ID);
+                NetworkUtils.OTN_NETWORK_ID);
             InstanceIdentifier<Link> iiOtnTopologyLink = InstanceIdentifier.builder(Networks.class)
                 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OTN_NETWORK_ID)))
                 .augmentation(Network1.class)
@@ -818,9 +821,9 @@ public class NetworkModelServiceImpl implements NetworkModelService {
             }
         }
         List<Link> odu4links = null;
-        if (netw1Opt.isPresent() && netw1Opt.get().getLink() != null) {
+        if (netw1Opt.isPresent() && netw1Opt.orElseThrow().getLink() != null) {
             odu4links = netw1Opt
-                .get()
+                .orElseThrow()
                 .nonnullLink().values()
                 .stream().filter(lk -> lk.getLinkId().getValue()
                     .startsWith(Uint32.valueOf(100).equals(serviceRate) ? "ODUC4" : "ODTU4"))
@@ -835,12 +838,12 @@ public class NetworkModelServiceImpl implements NetworkModelService {
             String nodeId = new StringBuilder(linkTp.getNodeId()).append("-")
                 .append(tp.split("-")[0]).toString();
             Link slink = odu4links.stream().filter(lk -> lk.getSource().getSourceNode().getValue()
-                .equals(nodeId) && lk.getSource().getSourceTp().getValue().equals(tp)).findFirst().get();
+                .equals(nodeId) && lk.getSource().getSourceTp().getValue().equals(tp)).findFirst().orElseThrow();
             if (!links.contains(slink)) {
                 links.add(slink);
             }
             Link dlink = odu4links.stream().filter(lk -> lk.getDestination().getDestNode().getValue()
-                .equals(nodeId) && lk.getDestination().getDestTp().getValue().equals(tp)).findFirst().get();
+                .equals(nodeId) && lk.getDestination().getDestTp().getValue().equals(tp)).findFirst().orElseThrow();
             if (!links.contains(dlink)) {
                 links.add(dlink);
             }
index 34deb25c4ff96ed2686d8c20de141dccbc2dc64b..09751e04b78f5d60166ecfa635b20426e341485b 100644 (file)
@@ -8,7 +8,7 @@
 
 package org.opendaylight.transportpce.networkmodel.util;
 
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfo;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfo;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.clli.network.rev191129.Node1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.clli.network.rev191129.Node1Builder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
index 22742cfe4d14bb5b362038ed4ea4c45a0d5af416..5e8bf12ecc18af3c20d8c18f3a978f8d44d11711 100644 (file)
@@ -8,7 +8,7 @@
 
 package org.opendaylight.transportpce.networkmodel.util;
 
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.InitRoadmNodesInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitRoadmNodesInput;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
 
 
index 0a62dd2a41547c13ef0666cdc514c7a3b4c6be30..d9543f4447c7d02acf9808a97a69bbcc13b633be 100644 (file)
@@ -10,9 +10,9 @@ package org.opendaylight.transportpce.networkmodel.util;
 
 import com.google.common.collect.ImmutableMap;
 import org.opendaylight.transportpce.common.NetworkUtils;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfo;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.rev211210.Node1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfo;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.rev230526.Node1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
@@ -44,8 +44,8 @@ public final class OpenRoadmNetwork {
     public static Node createNode(String nodeId, NodeInfo nodeInfo) {
 
         Node1Builder node1Bldr = new Node1Builder();
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder node2Bldr =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder();
+        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1Builder node2Bldr =
+            new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1Builder();
 
         /*
          * Recognize the node type: 1:ROADM, 2:XPONDER
@@ -76,11 +76,11 @@ public final class OpenRoadmNetwork {
         // Sets the value of Network-ref and Node-ref as a part of the supporting node
         // attribute
         SupportingNode supportingNode = new SupportingNodeBuilder()
-            .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))
-            .setNodeRef(new NodeId(nodeInfo.getNodeClli()))
-            .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID),
-                new NodeId(nodeInfo.getNodeClli())))
-            .build();
+                .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))
+                .setNodeRef(new NodeId(nodeInfo.getNodeClli()))
+                .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID),
+                        new NodeId(nodeInfo.getNodeClli())))
+                .build();
 
         return new NodeBuilder()
             .setNodeId(new NodeId(nodeId))
index 251230bfcbffbdb009ddbf42dadb3be4219bb6a3..7de24b823fcae0c7f212af748a9d2df9d383a1f2 100644 (file)
@@ -11,30 +11,33 @@ package org.opendaylight.transportpce.networkmodel.util;
 import com.google.common.collect.ImmutableMap;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.stream.Collectors;
 import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.transportpce.common.NetworkUtils;
 import org.opendaylight.transportpce.networkmodel.dto.OtnTopoNode;
 import org.opendaylight.transportpce.networkmodel.dto.TopologyShard;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.OtnLinkType;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.XpdrNodeTypes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.OduSwitchingPools;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.OduSwitchingPoolsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.OduSwitchingPoolsKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.OduSwitchingPools;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.OduSwitchingPoolsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.OduSwitchingPoolsKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODTU4TsAllocated;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODTUCnTs;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODU0;
@@ -43,21 +46,19 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev21092
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODU4;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OdtuTypeIdentity;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OduRateIdentity;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.Link1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.Link1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.Node1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.TerminationPoint1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.TerminationPoint1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.SwitchingPoolsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.TpBandwidthSharingBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.XpdrAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.termination.point.TpSupportedInterfacesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.termination.point.XpdrTpPortConnectionAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.SupportedIfCapability;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.Link1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.Link1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.Node1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.TerminationPoint1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.networks.network.node.SwitchingPoolsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.networks.network.node.TpBandwidthSharingBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.networks.network.node.XpdrAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.networks.network.node.termination.point.TpSupportedInterfacesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.networks.network.node.termination.point.XpdrTpPortConnectionAttributesBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.switching.pool.types.rev191129.SwitchingPoolTypes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev211210.xpdr.otn.tp.attributes.OdtuTpnPool;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev211210.xpdr.otn.tp.attributes.OdtuTpnPoolBuilder;
-import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.OtnLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev230526.xpdr.otn.tp.attributes.OdtuTpnPool;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev230526.xpdr.otn.tp.attributes.OdtuTpnPoolBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
@@ -90,12 +91,12 @@ public final class OpenRoadmOtnTopology {
     private static final int NB_TRIB_PORTS = 80;
     private static final int NB_TRIB_SLOTS = 80;
 
-    private static final Map<String, Class<? extends OduRateIdentity>> RATE_MAP = Map.of(
-        "If100GEODU4", ODU4.class,
-        "IfOCHOTU4ODU4", ODU4.class,
-        "If1GEODU0", ODU0.class,
-        "If10GEODU2", ODU2.class,
-        "If10GEODU2e", ODU2e.class);
+    private static final Map<String, OduRateIdentity> RATE_MAP = Map.of(
+        "If100GEODU4", ODU4.VALUE,
+        "IfOCHOTU4ODU4", ODU4.VALUE,
+        "If1GEODU0", ODU0.VALUE,
+        "If10GEODU2", ODU2.VALUE,
+        "If10GEODU2e", ODU2e.VALUE);
     private static final Map<OtnLinkType, Long> OTNLINKTYPE_BW_MAP = Map.of(
         OtnLinkType.ODTU4, 100000L,
         OtnLinkType.ODUC4, 400000L,
@@ -108,10 +109,10 @@ public final class OpenRoadmOtnTopology {
         Uint32.valueOf(1), 1000L,
         Uint32.valueOf(10), 10000L,
         Uint32.valueOf(100), 100000L);
-    private static final Map<Uint32, Class<? extends OdtuTypeIdentity>> SERVICERATE_ODTUTYPECLASS_MAP = Map.of(
-        Uint32.valueOf(1), ODTU4TsAllocated.class,
-        Uint32.valueOf(10), ODTU4TsAllocated.class,
-        Uint32.valueOf(100), ODTUCnTs.class);
+    private static final Map<Uint32, OdtuTypeIdentity> SERVICERATE_ODTUTYPECLASS_MAP = Map.of(
+        Uint32.valueOf(1), ODTU4TsAllocated.VALUE,
+        Uint32.valueOf(10), ODTU4TsAllocated.VALUE,
+        Uint32.valueOf(100), ODTUCnTs.VALUE);
 
     private OpenRoadmOtnTopology() {
     }
@@ -131,6 +132,11 @@ public final class OpenRoadmOtnTopology {
                 case Switch:
                     nodes.add(createSwitch(node));
                     break;
+                case Regen:
+                case RegenUni:
+                    // TODO: Need to revisit this method
+                    nodes.add(createRegen(node));
+                    break;
                 default:
                     LOG.error("unknown otn node type {}", node.getNodeType().getName());
                     return null;
@@ -296,12 +302,14 @@ public final class OpenRoadmOtnTopology {
         for (Link link : suppOtuLinks) {
             if (link.augmentation(Link1.class) == null
                     || link.augmentation(
-                        org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.Link1.class) == null) {
+                            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630
+                                    .Link1.class) == null) {
                 LOG.error(OTN_PARAMS_ERROR, link.getLinkId().getValue());
                 return new TopologyShard(null, null, null);
             }
             OtnLinkType otnLinkType = link.augmentation(
-                    org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.Link1.class).getOtnLinkType();
+                    org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.Link1.class)
+                    .getOtnLinkType();
             if (!OTNLINKTYPE_OTU_BW_MAP.containsKey(otnLinkType)) {
             //TODO shouldn't other link type listed in OTNLINKTYPE_BW_MAP be handled too ?
                 LOG.warn("Unexpected otn-link-type {} for link {}", otnLinkType, link.getLinkId());
@@ -325,8 +333,8 @@ public final class OpenRoadmOtnTopology {
         List<Link> links = new ArrayList<>();
         String nodeATopo = formatNodeName(nodeA, tpA);
         String nodeZTopo = formatNodeName(nodeZ, tpZ);
-        org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.Link1 tpceLink1
-            = new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.Link1Builder()
+        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.Link1 tpceLink1
+            = new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.Link1Builder()
                 .setOtnLinkType(linkType).build();
         Link1Builder otnLink1Bldr = new Link1Builder()
             .setUsedBandwidth(Uint32.valueOf(0));
@@ -343,9 +351,9 @@ public final class OpenRoadmOtnTopology {
             .addAugmentation(tpceLink1)
             .addAugmentation(otnLink1Bldr.build())
             .addAugmentation(
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1Builder(
                         ietfLinkAZBldr.augmentation(
-                            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1.class))
+                            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1.class))
                     .setLinkType(OpenroadmLinkType.OTNLINK)
                     .setOperationalState(State.InService)
                     .setAdministrativeState(AdminStates.InService)
@@ -357,9 +365,9 @@ public final class OpenRoadmOtnTopology {
             .addAugmentation(tpceLink1)
             .addAugmentation(otnLink1Bldr.build())
             .addAugmentation(
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1Builder(
                         ietfLinkZABldr.augmentation(
-                            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1.class))
+                            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1.class))
                     .setLinkType(OpenroadmLinkType.OTNLINK)
                     .setOperationalState(State.InService)
                     .setAdministrativeState(AdminStates.InService)
@@ -409,12 +417,12 @@ public final class OpenRoadmOtnTopology {
         XpdrTpPortConnectionAttributesBuilder xtpcaBldr =
             new XpdrTpPortConnectionAttributesBuilder(otnTp1Bldr.getXpdrTpPortConnectionAttributes());
         if (addingTsTpnPoolTermination) {
-            List<Uint16> tsPool = new ArrayList<>();
+            Set<Uint16> tsPool = new HashSet<>();
             for (int i = 1; i <= NB_TRIB_SLOTS; i++) {
                 tsPool.add(Uint16.valueOf(i));
             }
             xtpcaBldr.setTsPool(tsPool);
-            List<Uint16> tpnPool = new ArrayList<>();
+            Set<Uint16> tpnPool = new HashSet<>();
             int nbTribPort = NB_TRIB_PORTS;
             if (OtnLinkType.ODUC4.equals(linkType)) {
                 nbTribPort = 4;
@@ -423,7 +431,7 @@ public final class OpenRoadmOtnTopology {
                 tpnPool.add(Uint16.valueOf(i));
             }
             OdtuTpnPool oduTpnPool = new OdtuTpnPoolBuilder()
-                .setOdtuType(ODTU4TsAllocated.class)
+                .setOdtuType(ODTU4TsAllocated.VALUE)
                 .setTpnPool(tpnPool)
                 .build();
             xtpcaBldr.setOdtuTpnPool(ImmutableMap.of(oduTpnPool.key(),oduTpnPool));
@@ -443,7 +451,7 @@ public final class OpenRoadmOtnTopology {
         XpdrTpPortConnectionAttributesBuilder xtpcaBldr =
             new XpdrTpPortConnectionAttributesBuilder(
                 tpBldr.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes());
-        List<Uint16> tsPool = new ArrayList<>(xtpcaBldr.getTsPool());
+        Set<Uint16> tsPool = new HashSet<>(xtpcaBldr.getTsPool());
         if (isDeletion) {
             for (int i = minTribSlotNb; i <= maxTribSlotNb; i++) {
                 tsPool.add(Uint16.valueOf(i));
@@ -454,19 +462,19 @@ public final class OpenRoadmOtnTopology {
             }
         }
         xtpcaBldr.setTsPool(tsPool);
-        List<Uint16> tpnPool;
+        Set<Uint16> tpnPool;
         List<OdtuTpnPool> odtuTpnPoolValues = new ArrayList<>(xtpcaBldr.getOdtuTpnPool().values());
         if (odtuTpnPoolValues.get(0).getTpnPool() == null) {
-            tpnPool = new ArrayList<>();
+            tpnPool = new HashSet<>();
         } else {
-            tpnPool = new ArrayList<>(odtuTpnPoolValues.get(0).getTpnPool());
+            tpnPool = new HashSet<>(odtuTpnPoolValues.get(0).getTpnPool());
             if (isDeletion) {
                 tpnPool.add(Uint16.valueOf(tribPortNb));
             } else {
                 tpnPool.remove(Uint16.valueOf(tribPortNb));
             }
         }
-        Class<? extends OdtuTypeIdentity> odtuType;
+        OdtuTypeIdentity odtuType;
         if (SERVICERATE_ODTUTYPECLASS_MAP.containsKey(serviceRate)) {
             odtuType = SERVICERATE_ODTUTYPECLASS_MAP.get(serviceRate);
         } else {
@@ -512,9 +520,9 @@ public final class OpenRoadmOtnTopology {
                         mappingNode.getNodeId(),
                         mappingNode.getNodeInfo().getNodeClli(),
                         xpdrNb,
-                        mapping.getXponderType() == null
+                        mapping.getXpdrType() == null
                             ? XpdrNodeTypes.Tpdr
-                            : mapping.getXponderType(),
+                            : mapping.getXpdrType(),
                         fillConnectionMapLcp(xpdrNetMaps),
                         fillConnectionMapLcp(xpdrClMaps),
                         xpdrNetMaps,
@@ -554,7 +562,7 @@ public final class OpenRoadmOtnTopology {
                             .build())
                     .build())
             .addAugmentation(
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1Builder()
                     .setNodeType(OpenroadmNodeType.TPDR)
                     .setOperationalState(State.InService)
                     .setAdministrativeState(AdminStates.InService)
@@ -567,13 +575,45 @@ public final class OpenRoadmOtnTopology {
             .build();
     }
 
+    // TODO: This is same as createTpdr. After Open ROADM network models are updated,
+    //    we will revisit this method to include regen based data.
+    private static Node createRegen(OtnTopoNode node) {
+        Map<TerminationPointKey,TerminationPoint> tpMap = new HashMap<>();
+        createTP(tpMap, node, OpenroadmTpType.XPONDERCLIENT, false);
+        createTP(tpMap, node, OpenroadmTpType.XPONDERNETWORK, true);
+        // return ietfNode
+        return new NodeBuilder()
+                .setNodeId(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb()))
+                .withKey(new NodeKey(new NodeId(node.getNodeId() + XPDR + node.getXpdrNb())))
+                .setSupportingNode(createSupportingNodes(node))
+                .addAugmentation(
+                        new Node1Builder()
+                                .setXpdrAttributes(
+                                        new XpdrAttributesBuilder()
+                                                .setXpdrNumber(Uint16.valueOf(node.getXpdrNb()))
+                                                .build())
+                                .build())
+                .addAugmentation(
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1Builder()
+                                .setNodeType(OpenroadmNodeType.TPDR)
+                                .setOperationalState(State.InService)
+                                .setAdministrativeState(AdminStates.InService)
+                                .build())
+                .addAugmentation(
+                        new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                                .Node1Builder()
+                                .setTerminationPoint(tpMap)
+                                .build())
+                .build();
+    }
+
     private static Node createMuxpdr(OtnTopoNode node) {
 
         // prepare otn-topology node augmentation
         // TODO: will need to be completed
         Map<NonBlockingListKey, NonBlockingList> nbMap = new HashMap<>();
         for (int i = 1; i <= node.getNbTpClient(); i++) {
-            List<TpId> tpList = new ArrayList<>();
+            Set<TpId> tpList = new HashSet<>();
             tpList.add(new TpId("XPDR" + node.getXpdrNb() + CLIENT + i));
             tpList.add(new TpId("XPDR" + node.getXpdrNb() + "-NETWORK1"));
             NonBlockingList nbl = new NonBlockingListBuilder()
@@ -610,7 +650,7 @@ public final class OpenRoadmOtnTopology {
                             .build())
                     .build())
             .addAugmentation(
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1Builder()
                     .setNodeType(OpenroadmNodeType.MUXPDR)
                     .setAdministrativeState(AdminStates.InService)
                     .setOperationalState(State.InService)
@@ -625,7 +665,7 @@ public final class OpenRoadmOtnTopology {
 
     private static Node createSwitch(OtnTopoNode node) {
 
-        List<TpId> tpl = new ArrayList<>();
+        Set<TpId> tpl = new HashSet<>();
         for (int i = 1; i <= node.getNbTpClient(); i++) {
             tpl.add(new TpId("XPDR" + node.getXpdrNb() + CLIENT + i));
         }
@@ -666,7 +706,7 @@ public final class OpenRoadmOtnTopology {
                             .build())
                     .build())
             .addAugmentation(
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1Builder()
                     .setNodeType(OpenroadmNodeType.SWITCH)
                     .setOperationalState(State.InService)
                     .setAdministrativeState(AdminStates.InService)
@@ -709,7 +749,8 @@ public final class OpenRoadmOtnTopology {
                     mapping.getLogicalConnectionPoint(), node.getNodeId());
             } else {
                 XpdrTpPortConnectionAttributesBuilder xtpcaBldr = new XpdrTpPortConnectionAttributesBuilder();
-                for (Class<? extends SupportedIfCapability> supInterCapa : mapping.getSupportedInterfaceCapability()) {
+                for (org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.SupportedIfCapability
+                        supInterCapa : mapping.getSupportedInterfaceCapability()) {
                     SupportedInterfaceCapability supIfCapa = new SupportedInterfaceCapabilityBuilder()
                         .withKey(new SupportedInterfaceCapabilityKey(supInterCapa))
                         .setIfCapType(supInterCapa)
@@ -735,20 +776,20 @@ public final class OpenRoadmOtnTopology {
                 new TpId(mapping.getLogicalConnectionPoint()),
                 tpType,
                 otnTp1Bldr.build(),
-                new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1Builder(),
                 mapping);
         }
     }
 
     private static void setclientNwTpAttr(Map<TerminationPointKey, TerminationPoint> tpMap, OtnTopoNode node, TpId tpId,
-            OpenroadmTpType tpType, TerminationPoint1 otnTp1,
-            org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1Builder tpceTp1Bldr,
-            Mapping mapping) {
-
+            OpenroadmTpType tpType, TerminationPoint1 otnTp1, Mapping mapping) {
+        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1Builder cnTP1BLdr
+                = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
+                    .TerminationPoint1Builder();
         switch (tpType) {
             case XPONDERNETWORK:
                 if (node.getXpdrNetConnectionMap().get(tpId.getValue()) != null) {
-                    tpceTp1Bldr.setAssociatedConnectionMapPort(node.getXpdrNetConnectionMap().get(tpId.getValue()));
+                    cnTP1BLdr.setAssociatedConnectionMapTp(Set.of(
+                            new TpId(node.getXpdrNetConnectionMap().get(tpId.getValue()))));
                 }
                 SupportingTerminationPoint stp = new SupportingTerminationPointBuilder()
                     .setNetworkRef(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))
@@ -756,14 +797,15 @@ public final class OpenRoadmOtnTopology {
                     .setTpRef(tpId)
                     .build();
                 TerminationPoint ietfTpNw =
-                    buildIetfTp(tpceTp1Bldr, otnTp1, tpType, tpId, Map.of(stp.key(), stp), mapping);
+                    buildIetfTp(cnTP1BLdr, otnTp1, tpType, tpId, Map.of(stp.key(), stp), mapping);
                 tpMap.put(ietfTpNw.key(),ietfTpNw);
                 break;
             case XPONDERCLIENT:
                 if (node.getXpdrCliConnectionMap().get(tpId.getValue()) != null) {
-                    tpceTp1Bldr.setAssociatedConnectionMapPort(node.getXpdrCliConnectionMap().get(tpId.getValue()));
+                    cnTP1BLdr.setAssociatedConnectionMapTp(Set.of(
+                            new TpId(node.getXpdrCliConnectionMap().get(tpId.getValue()))));
                 }
-                TerminationPoint ietfTpCl = buildIetfTp(tpceTp1Bldr, otnTp1, tpType, tpId, null, mapping);
+                TerminationPoint ietfTpCl = buildIetfTp(cnTP1BLdr, otnTp1, tpType, tpId, null, mapping);
                 tpMap.put(ietfTpCl.key(),ietfTpCl);
                 break;
             default:
@@ -772,11 +814,13 @@ public final class OpenRoadmOtnTopology {
         }
     }
 
-    private static Class<? extends OduRateIdentity> fixRate(List<Class<? extends SupportedIfCapability>> list) {
-
-        for (Class<? extends  SupportedIfCapability> class1 : list) {
-            if (RATE_MAP.containsKey(class1.getSimpleName())) {
-                return RATE_MAP.get(class1.getSimpleName());
+    private static OduRateIdentity fixRate(
+            Set<org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.SupportedIfCapability> list) {
+        for (org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.SupportedIfCapability
+                supIfCap: list) {
+            String simpleName = supIfCap.toString().split("\\{")[0];
+            if (RATE_MAP.containsKey(simpleName)) {
+                return RATE_MAP.get(simpleName);
             }
         }
         return null;
@@ -816,14 +860,11 @@ public final class OpenRoadmOtnTopology {
     }
 
     private static TerminationPoint buildIetfTp(
-            org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1Builder tpceTp1Bldr,
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1Builder cnTP1BLdr,
             TerminationPoint1 otnTp1, OpenroadmTpType tpType, TpId tpId,
             Map<SupportingTerminationPointKey, SupportingTerminationPoint> supportTpMap, Mapping mapping) {
 
         TerminationPointBuilder ietfTpBldr = new TerminationPointBuilder();
-        if (tpceTp1Bldr.getAssociatedConnectionMapPort() != null) {
-            ietfTpBldr.addAugmentation(tpceTp1Bldr.build());
-        }
         if (supportTpMap != null) {
             ietfTpBldr.setSupportingTerminationPoint(supportTpMap);
         }
@@ -831,13 +872,11 @@ public final class OpenRoadmOtnTopology {
             .setTpId(tpId)
             .withKey(new TerminationPointKey(tpId))
             .addAugmentation(otnTp1)
-            .addAugmentation(
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder()
-                    .setTpType(tpType)
+            .addAugmentation(cnTP1BLdr.setTpType(tpType)
                     .setAdministrativeState(TopologyUtils.setNetworkAdminState(mapping.getPortAdminState()))
                     .setOperationalState(TopologyUtils.setNetworkOperState(mapping.getPortOperState()))
                     .build())
-            .build();
+                .build();
     }
 
     private static String formatNodeName(String nodeName, String tpName) {
index a101315121a1abba0baf215d6b757ebf35197b88..28bd870196caa4937ec6c70a9c8a0e77e6c473be 100644 (file)
@@ -8,11 +8,14 @@
 
 package org.opendaylight.transportpce.networkmodel.util;
 
+import static org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.XpdrNodeTypes.Tpdr;
+
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
@@ -22,24 +25,21 @@ import org.opendaylight.transportpce.common.NetworkUtils;
 import org.opendaylight.transportpce.common.fixedflex.GridUtils;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.networkmodel.dto.TopologyShard;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1Builder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.NodeTypes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.XpdrNodeTypes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.DegreeAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.DegreeAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.SrgAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.SrgAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.DegreeAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.DegreeAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.SrgAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.SrgAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
@@ -63,7 +63,6 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.top
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
 import org.opendaylight.yangtools.yang.common.Uint16;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -72,6 +71,17 @@ public final class OpenRoadmTopology {
 
     private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmTopology.class);
 
+    private static Map<String, OpenroadmTpType> PORTQUAL_ORD_TYPE_MAP = Map.of(
+        "xpdr-network", OpenroadmTpType.XPONDERNETWORK,
+        "switch-network", OpenroadmTpType.XPONDERNETWORK,
+        "xpdr-client", OpenroadmTpType.XPONDERCLIENT
+    );
+    private static Map<String, List<OpenroadmTpType>> PORTDIR_ORD_TYPE_MAP = Map.of(
+        "bidirectional", List.of(OpenroadmTpType.DEGREETXRXTTP, OpenroadmTpType.SRGTXRXPP),
+        "tx", List.of(OpenroadmTpType.DEGREETXTTP, OpenroadmTpType.SRGTXPP),
+        "rx", List.of(OpenroadmTpType.DEGREERXTTP, OpenroadmTpType.SRGRXPP)
+    );
+
     private OpenRoadmTopology() {
     }
 
@@ -80,333 +90,297 @@ public final class OpenRoadmTopology {
     }
 
     public static TopologyShard createTopologyShard(Nodes mappingNode, boolean firstMount) {
-        int numOfDegrees;
-        int numOfSrgs;
-        List<Node> nodes = new ArrayList<>();
-        List<Link> links = new ArrayList<>();
-
-        // Check if node is ROADM
-        if (NodeTypes.Rdm.getIntValue() == mappingNode.getNodeInfo().getNodeType().getIntValue()) {
-            LOG.info("creating rdm node in openroadmtopology for node {}", mappingNode.getNodeId());
-            // transform flat mapping list to per degree and per srg mapping lists
-            Map<String, List<Mapping>> mapDeg = new HashMap<>();
-            Map<String, List<Mapping>> mapSrg = new HashMap<>();
-            List<Mapping> mappingList = new ArrayList<>(mappingNode.nonnullMapping().values());
-            mappingList.sort(Comparator.comparing(Mapping::getLogicalConnectionPoint));
+        switch (mappingNode.getNodeInfo().getNodeType()) {
+            case Rdm :
+                return createRdmTopologyShard(mappingNode, firstMount);
+            case Xpdr :
+                return createXpdrTopologyShard(mappingNode);
+            default :
+                LOG.error("Device node Type not managed yet");
+                return null;
+        }
+    }
 
-            List<String> nodeShardList = new ArrayList<>();
-            for (Mapping mapping : mappingList) {
-                String str = mapping.getLogicalConnectionPoint().split("-")[0];
-                if (!nodeShardList.contains(str)) {
-                    nodeShardList.add(str);
-                }
-            }
-            for (String str : nodeShardList) {
-                List<Mapping> interList = mappingList.stream().filter(x -> x.getLogicalConnectionPoint()
-                    .split("-")[0].equals(str)).collect(Collectors.toList());
-                if (str.contains("DEG")) {
-                    mapDeg.put(str, interList);
-                } else if (str.contains("SRG")) {
-                    mapSrg.put(str,  interList);
-                } else {
-                    LOG.error("unknown element");
-                }
-            }
-            // create degree nodes
-            for (Map.Entry<String, List<Mapping>> entry : mapDeg.entrySet()) {
-                NodeBuilder ietfNode = createDegree(entry.getKey(), entry.getValue(), mappingNode.getNodeId(),
-                    mappingNode.getNodeInfo().getNodeClli(), firstMount);
-                nodes.add(ietfNode.build());
+    public static TopologyShard createRdmTopologyShard(Nodes mappingNode, boolean firstMount) {
+        List<Node> nodes = new ArrayList<>();
+        LOG.info("creating rdm node in openroadmtopology for node {}",
+                mappingNode.getNodeId());
+        // transform flat mapping list to per degree and per srg mapping lists
+        Map<String, List<Mapping>> mapDeg = new HashMap<>();
+        Map<String, List<Mapping>> mapSrg = new HashMap<>();
+        List<Mapping> mappingList = new ArrayList<>(mappingNode.nonnullMapping().values());
+        mappingList.sort(Comparator.comparing(Mapping::getLogicalConnectionPoint));
+        List<String> nodeShardList = new ArrayList<>();
+        for (Mapping mapping : mappingList) {
+            String str = mapping.getLogicalConnectionPoint().split("-")[0];
+            if (!nodeShardList.contains(str)) {
+                nodeShardList.add(str);
             }
-            // create srg nodes
-            for (Map.Entry<String, List<Mapping>> entry : mapSrg.entrySet()) {
-                NodeBuilder ietfNode = createSrg(entry.getKey(), entry.getValue(), mappingNode.getNodeId(),
-                    mappingNode.getNodeInfo().getNodeClli(), firstMount);
-                nodes.add(ietfNode.build());
+        }
+        for (String str : nodeShardList) {
+            List<Mapping> interList =
+                    mappingList.stream()
+                            .filter(x -> x.getLogicalConnectionPoint().split("-")[0].equals(str))
+                            .collect(Collectors.toList());
+            if (str.contains("DEG")) {
+                mapDeg.put(str, interList);
+            } else if (str.contains("SRG")) {
+                mapSrg.put(str, interList);
+            } else {
+                LOG.error("unknow element");
             }
+        }
+        // create degree nodes
+        for (Map.Entry<String, List<Mapping>> entry : mapDeg.entrySet()) {
+            nodes.add(
+                createDegree(entry.getKey(), entry.getValue(), mappingNode.getNodeId(),
+                        mappingNode.getNodeInfo().getNodeClli(), firstMount)
+                    .build());
+        }
+        // create srg nodes
+        for (Map.Entry<String, List<Mapping>> entry : mapSrg.entrySet()) {
+            nodes.add(
+                createSrg(entry.getKey(), entry.getValue(), mappingNode.getNodeId(),
+                        mappingNode.getNodeInfo().getNodeClli(), firstMount)
+                    .build());
+        }
+        LOG.info("adding links numOfDegrees={} numOfSrgs={}", mapDeg.size(), mapSrg.size());
+        List<Link> links = createNewLinks(nodes);
+        LOG.info("created nodes/links: {}/{}", nodes.size(), links.size());
+        return new TopologyShard(nodes, links);
+    }
 
-            numOfDegrees = mapDeg.size();
-            numOfSrgs = mapSrg.size();
-
-            LOG.info("adding links numOfDegrees={} numOfSrgs={}", numOfDegrees, numOfSrgs);
-            links.addAll(createNewLinks(nodes));
-            LOG.info("created nodes/links: {}/{}", nodes.size(), links.size());
-            return new TopologyShard(nodes, links);
-        } else if (NodeTypes.Xpdr.getIntValue() ==  mappingNode.getNodeInfo().getNodeType().getIntValue()) {
-            // Check if node is Xpdr is a Transponder
-            List<Mapping> networkMappings = mappingNode.nonnullMapping().values()
-                    .stream().filter(k -> k.getLogicalConnectionPoint()
-                .contains("NETWORK")).collect(Collectors.toList());
-            List<Integer> tpdrList = new ArrayList<>();
-            for (Mapping mapping : networkMappings) {
-                List<Mapping> extractedMappings = null;
-                Integer xpdrNb = Integer.parseInt(mapping.getLogicalConnectionPoint().split("XPDR")[1].split("-")[0]);
-                if (!tpdrList.contains(xpdrNb)) {
-                    tpdrList.add(xpdrNb);
-                    extractedMappings = mappingNode.nonnullMapping().values().stream().filter(lcp -> lcp
-                        .getLogicalConnectionPoint().contains("XPDR" + xpdrNb)).collect(Collectors.toList());
-                    NodeBuilder ietfNode;
-                    if (mapping.getXponderType() == null
-                        || XpdrNodeTypes.Tpdr.getIntValue() == mapping.getXponderType().getIntValue()) {
-                        LOG.info("creating xpdr node {} of type Tpdr in openroadm-topology",
-                            mappingNode.getNodeId() + "-XPDR" + xpdrNb);
-                        ietfNode = createXpdr(mappingNode.getNodeId(), mappingNode.getNodeInfo().getNodeClli(), xpdrNb,
-                            extractedMappings, false);
-                        nodes.add(ietfNode.build());
-                    } else if (XpdrNodeTypes.Mpdr.getIntValue() == mapping.getXponderType().getIntValue()
-                        || XpdrNodeTypes.Switch.getIntValue() == mapping.getXponderType().getIntValue()) {
-                        LOG.info("creating xpdr node {} of type {} in openroadm-topology",
-                            mappingNode.getNodeId() + "-XPDR" + xpdrNb, mapping.getXponderType().getName());
-                        ietfNode = createXpdr(mappingNode.getNodeId(), mappingNode.getNodeInfo().getNodeClli(), xpdrNb,
-                            extractedMappings, true);
-                        nodes.add(ietfNode.build());
-                    }
+    public static TopologyShard createXpdrTopologyShard(Nodes mappingNode) {
+        List<Node> nodes = new ArrayList<>();
+        List<Mapping> networkMappings =
+                mappingNode.nonnullMapping().values()
+                        .stream().filter(k -> k.getLogicalConnectionPoint().contains("NETWORK"))
+                        .collect(Collectors.toList());
+        List<Integer> tpdrList = new ArrayList<>();
+        for (Mapping mapping : networkMappings) {
+            Integer xpdrNb = Integer.parseInt(mapping.getLogicalConnectionPoint().split("XPDR")[1].split("-")[0]);
+            if (!tpdrList.contains(xpdrNb)) {
+                tpdrList.add(xpdrNb);
+                List<Mapping> extractedMappings = mappingNode.nonnullMapping().values()
+                        .stream().filter(lcp -> lcp.getLogicalConnectionPoint().contains("XPDR" + xpdrNb))
+                        .collect(Collectors.toList());
+                Boolean isOtn;
+                String xpdrType;
+                switch (mapping.getXpdrType() == null ? Tpdr : mapping.getXpdrType()) {
+                    case Tpdr :
+                        isOtn = false;
+                        xpdrType = "Tpdr";
+                        break;
+                    case Mpdr :
+                    case Switch :
+                        isOtn = true;
+                        xpdrType = mapping.getXpdrType().getName();
+                        break;
+                    // Both regen and regen-uni are added here, though initial support is
+                    // only for regen xpdr-type
+                    case Regen:
+                    case RegenUni:
+                        isOtn = false;
+                        xpdrType = mapping.getXpdrType().getName();
+                        break;
+                    default :
+                        LOG.warn("cannot create xpdr node {} in openroadm-topology: type {} not supported",
+                             mappingNode.getNodeId() + "-XPDR" + xpdrNb, mapping.getXpdrType().getName());
+                        continue;
                 }
-            }
-            if (nodes.isEmpty()) {
-                return null;
-            } else {
-                return new TopologyShard(nodes, links);
+                LOG.info("creating xpdr node {} of type {} in openroadm-topology",
+                        mappingNode.getNodeId() + "-XPDR" + xpdrNb, xpdrType);
+                nodes.add(createXpdr(
+                                mappingNode.getNodeId(),
+                                mappingNode.getNodeInfo().getNodeClli(),
+                                xpdrNb,
+                                extractedMappings,
+                                isOtn)
+                          .build());
             }
         }
-        LOG.error("Device node Type not managed yet");
-        return null;
+        return nodes.isEmpty() ? null : new TopologyShard(nodes, new ArrayList<Link>());
     }
 
     private static NodeBuilder createXpdr(String nodeId, String clli, Integer xpdrNb, List<Mapping> mappings,
-        boolean isOtn) {
-        // Create openroadm-network-topo augmentation to set node type to Xponder
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1 ocnNode1 =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
-                    .setNodeType(OpenroadmNodeType.XPONDER)
-                    .setAdministrativeState(AdminStates.InService)
-                    .setOperationalState(State.InService)
-                    .build();
+                                          boolean isOtn) {
         // Create ietf node setting supporting-node data
-        NodeBuilder ietfNodeBldr = createTopoLayerNode(nodeId, clli);
-        // set node-id
         String nodeIdtopo = new StringBuilder().append(nodeId).append("-XPDR").append(xpdrNb).toString();
-        ietfNodeBldr.setNodeId(new NodeId(nodeIdtopo))
-            .withKey((new NodeKey(new NodeId(nodeIdtopo))))
-            .addAugmentation(ocnNode1);
-
+        NodeBuilder ietfNodeBldr = createTopoLayerNode(nodeId, clli)
+                .setNodeId(new NodeId(nodeIdtopo))
+                .withKey((new NodeKey(new NodeId(nodeIdtopo))))
+                .addAugmentation(
+                    // Create openroadm-network-topo augmentation to set node type to Xponder
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1Builder()
+                        .setNodeType(OpenroadmNodeType.XPONDER)
+                        .setAdministrativeState(AdminStates.InService)
+                        .setOperationalState(State.InService)
+                        .build());
         // Create tp-map
         Map<TerminationPointKey, TerminationPoint> tpMap = new HashMap<>();
-        TerminationPointBuilder ietfTpBldr;
         for (Mapping m : mappings) {
-            if (!isOtn) {
-                ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint());
-                // Add openroadm-network-topology tp augmentations
-                org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder
-                    ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http
-                        .org.openroadm.common.network.rev211210.TerminationPoint1Builder()
-                        .setAdministrativeState(TopologyUtils.setNetworkAdminState(m.getPortAdminState()))
-                        .setOperationalState(TopologyUtils.setNetworkOperState(m.getPortOperState()));
-                if (m.getPortQual().equals("xpdr-network")) {
-                    ocnTp1Bldr.setTpType(OpenroadmTpType.XPONDERNETWORK);
-                    org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1 tpceTp1 =
-                        new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1Builder()
-                            .setAssociatedConnectionMapPort(m.getConnectionMapLcp()).build();
-                    ietfTpBldr
-                        .addAugmentation(ocnTp1Bldr.build())
-                        .addAugmentation(tpceTp1);
-                    TerminationPoint ietfTp = ietfTpBldr.build();
-                    tpMap.put(ietfTp.key(),ietfTp);
-                } else if (m.getPortQual().equals("xpdr-client")) {
-                    ocnTp1Bldr.setTpType(OpenroadmTpType.XPONDERCLIENT);
-                    org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1 tpceTp1 =
-                        new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1Builder()
-                            .setAssociatedConnectionMapPort(m.getConnectionMapLcp()).build();
-                    ietfTpBldr
-                        .addAugmentation(ocnTp1Bldr.build())
-                        .addAugmentation(tpceTp1);
-                    TerminationPoint ietfTp = ietfTpBldr.build();
-                    tpMap.put(ietfTp.key(),ietfTp);
-                }
-            } else {
-                if (m.getPortQual().equals("xpdr-network") || m.getPortQual().equals("switch-network")) {
-                    ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint());
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder
-                        ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http
-                                .org.openroadm.common.network.rev211210.TerminationPoint1Builder()
-                            .setTpType(OpenroadmTpType.XPONDERNETWORK)
-                            .setAdministrativeState(TopologyUtils.setNetworkAdminState(m.getPortAdminState()))
-                            .setOperationalState(TopologyUtils.setNetworkOperState(m.getPortOperState()));
-                    ietfTpBldr
-                        .addAugmentation(ocnTp1Bldr.build());
-                    TerminationPoint ietfTp = ietfTpBldr.build();
-                    tpMap.put(ietfTp.key(),ietfTp);
-                }
+            if (!PORTQUAL_ORD_TYPE_MAP.containsKey(m.getPortQual())) {
+                continue;
             }
+            if (isOtn && m.getPortQual().equals("xpdr-client")) {
+                continue;
+            }
+            var ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
+                    .TerminationPoint1Builder()
+                .setTpType(PORTQUAL_ORD_TYPE_MAP.get(m.getPortQual()))
+                .setAdministrativeState(TopologyUtils.setNetworkAdminState(m.getPortAdminState()))
+                .setOperationalState(TopologyUtils.setNetworkOperState(m.getPortOperState()));
+            if (!isOtn && m.getConnectionMapLcp() != null) {
+                ocnTp1Bldr.setAssociatedConnectionMapTp(Set.of(new TpId(m.getConnectionMapLcp())));
+            }
+            TerminationPointBuilder ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint())
+                .addAugmentation(
+                    // Add openroadm-network-topology tp augmentations
+                        ocnTp1Bldr.build());
+            TerminationPoint ietfTp = ietfTpBldr.build();
+            tpMap.put(ietfTp.key(),ietfTp);
         }
         // Create ietf node augmentation to support ietf tp-list
-        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder
-            ietfNode1 = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
-                .Node1Builder().setTerminationPoint(tpMap);
-        ietfNodeBldr.addAugmentation(ietfNode1.build());
-        return ietfNodeBldr;
+        return ietfNodeBldr.addAugmentation(
+            new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder()
+                    .setTerminationPoint(tpMap)
+                    .build());
     }
 
     private static NodeBuilder createDegree(String degNb, List<Mapping> degListMap, String nodeId, String clli,
                                             boolean firstMount) {
         // Create tp-list
         Map<TerminationPointKey,TerminationPoint> tpMap = new HashMap<>();
-        TerminationPointBuilder ietfTpBldr;
         for (Mapping m : degListMap) {
-            ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint());
             // Add openroadm-common-network tp type augmentations
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder
-                ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
-                    .TerminationPoint1Builder()
-                        .setAdministrativeState(TopologyUtils.setNetworkAdminState(m.getPortAdminState()))
-                        .setOperationalState(TopologyUtils.setNetworkOperState(m.getPortOperState()));
-
             // Added states to degree port. TODO: add to mapping relation between abstracted and physical node states
-            switch (m.getPortDirection()) {
-                case "bidirectional":
-                    ocnTp1Bldr.setTpType(OpenroadmTpType.DEGREETXRXTTP);
-                    break;
-                case "tx":
-                    ocnTp1Bldr.setTpType(OpenroadmTpType.DEGREETXTTP);
-                    break;
-                case "rx":
-                    ocnTp1Bldr.setTpType(OpenroadmTpType.DEGREERXTTP);
-                    break;
-                default:
-                    LOG.error("impossible to set tp-type to {}", m.getLogicalConnectionPoint());
+            if (!PORTDIR_ORD_TYPE_MAP.containsKey(m.getPortDirection())) {
+                LOG.error("impossible to set tp-type to {}", m.getLogicalConnectionPoint());
             }
-            ietfTpBldr.addAugmentation(ocnTp1Bldr.build());
-            TerminationPoint ietfTp = ietfTpBldr.build();
+            TerminationPoint ietfTp =  createTpBldr(m.getLogicalConnectionPoint())
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
+                            .TerminationPoint1Builder()
+                        .setTpType(PORTDIR_ORD_TYPE_MAP.get(m.getPortDirection()).get(0))
+                        .setAdministrativeState(TopologyUtils.setNetworkAdminState(m.getPortAdminState()))
+                        .setOperationalState(TopologyUtils.setNetworkOperState(m.getPortOperState()))
+                        .build())
+                .build();
             tpMap.put(ietfTp.key(),ietfTp);
         }
         // Add CTP to tp-list + added states. TODO: same comment as before with the relation between states
-        ietfTpBldr = createTpBldr(degNb + "-CTP-TXRX");
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1 ocnTp1 =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder()
-            .setTpType(OpenroadmTpType.DEGREETXRXCTP)
-                    .setAdministrativeState(AdminStates.InService)
-                    .setOperationalState(State.InService)
-                    .build();
-        ietfTpBldr.addAugmentation(ocnTp1);
-        TerminationPoint ietfTp = ietfTpBldr.build();
+        TerminationPoint ietfTp = createTpBldr(degNb + "-CTP-TXRX")
+                .addAugmentation(new org.opendaylight.yang.gen.v1.http
+                    .org.openroadm.common.network.rev230526.TerminationPoint1Builder()
+                         .setTpType(OpenroadmTpType.DEGREETXRXCTP)
+                         .setAdministrativeState(AdminStates.InService)
+                         .setOperationalState(State.InService)
+                         .build())
+                 .build();
         tpMap.put(ietfTp.key(),ietfTp);
         // set degree-attributes
         DegreeAttributesBuilder degAttBldr = new DegreeAttributesBuilder()
-            .setDegreeNumber(Uint16.valueOf(degNb.split("DEG")[1]));
+                .setDegreeNumber(Uint16.valueOf(degNb.split("DEG")[1]));
         if (firstMount) {
             degAttBldr.setAvailFreqMaps(GridUtils.initFreqMaps4FixedGrid2Available());
         }
         DegreeAttributes degAtt = degAttBldr.build();
-        // Create ietf node augmentation to support ietf tp-list
-        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder
-            ietfNode1 = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
-                .Node1Builder().setTerminationPoint(tpMap);
         // set node-id
         String nodeIdtopo = new StringBuilder().append(nodeId).append("-").append(degNb).toString();
-        Node1 ontNode1 = new Node1Builder().setDegreeAttributes(degAtt).build();
-        // Create openroadm-common-network augmentation to set node type to DEGREE
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1 ocnNode1 =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
-            .setNodeType(OpenroadmNodeType.DEGREE)
-                    .setAdministrativeState(AdminStates.InService)
-                    .setOperationalState(State.InService)
-                    .build();
         // Create ietf node setting supporting-node data
         return createTopoLayerNode(nodeId, clli)
-            .setNodeId(new NodeId(nodeIdtopo))
-            .withKey((new NodeKey(new NodeId(nodeIdtopo))))
-            .addAugmentation(ontNode1)
-            .addAugmentation(ocnNode1)
-            .addAugmentation(ietfNode1.build());
+                .setNodeId(new NodeId(nodeIdtopo))
+                .withKey((new NodeKey(new NodeId(nodeIdtopo))))
+                .addAugmentation(new Node1Builder().setDegreeAttributes(degAtt).build())
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
+                            .Node1Builder()
+                        .setNodeType(OpenroadmNodeType.DEGREE)
+                        .setAdministrativeState(AdminStates.InService)
+                        .setOperationalState(State.InService)
+                        .build())
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                            .Node1Builder()
+                        .setTerminationPoint(tpMap)
+                        .build());
     }
 
     private static NodeBuilder createSrg(String srgNb, List<Mapping> srgListMap, String nodeId, String clli,
                                          boolean firstMount) {
         // Create tp-list
         Map<TerminationPointKey,TerminationPoint> tpMap = new HashMap<>();
-        TerminationPointBuilder ietfTpBldr;
         for (Mapping m : srgListMap) {
-            ietfTpBldr = createTpBldr(m.getLogicalConnectionPoint());
-            // Add openroadm-common-network tp type augmentations
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
-                .TerminationPoint1Builder ocnTp1Bldr = new org.opendaylight.yang.gen.v1.http
-                .org.openroadm.common.network.rev211210.TerminationPoint1Builder()
-                    .setAdministrativeState(TopologyUtils.setNetworkAdminState(m.getPortAdminState()))
-                    .setOperationalState(TopologyUtils.setNetworkOperState(m.getPortOperState()));
             // Added states to srg port. TODO: add to mapping relation between abstracted and physical node states
-            switch (m.getPortDirection()) {
-                case "bidirectional":
-                    ocnTp1Bldr.setTpType(OpenroadmTpType.SRGTXRXPP);
-                    break;
-                case "tx":
-                    ocnTp1Bldr.setTpType(OpenroadmTpType.SRGTXPP);
-                    break;
-                case "rx":
-                    ocnTp1Bldr.setTpType(OpenroadmTpType.SRGRXPP);
-                    break;
-                default:
-                    LOG.error("impossible to set tp-type to {}", m.getLogicalConnectionPoint());
+            if (!PORTDIR_ORD_TYPE_MAP.containsKey(m.getPortDirection())) {
+                LOG.error("impossible to set tp-type to {}", m.getLogicalConnectionPoint());
             }
-            ietfTpBldr.addAugmentation(ocnTp1Bldr.build());
-            TerminationPoint ietfTp = ietfTpBldr.build();
+            TerminationPoint ietfTp = createTpBldr(m.getLogicalConnectionPoint())
+                .addAugmentation(
+                    // Add openroadm-common-network tp type augmentations
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
+                            .TerminationPoint1Builder()
+                        .setTpType(PORTDIR_ORD_TYPE_MAP.get(m.getPortDirection()).get(1))
+                        .setAdministrativeState(TopologyUtils.setNetworkAdminState(m.getPortAdminState()))
+                        .setOperationalState(TopologyUtils.setNetworkOperState(m.getPortOperState()))
+                        .build())
+                .build();
             tpMap.put(ietfTp.key(),ietfTp);
         }
         // Add CP to tp-list + added states. TODO: same comment as before with the relation between states
-        ietfTpBldr = createTpBldr(srgNb + "-CP-TXRX");
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
-            .TerminationPoint1 ocnTp1 = new org.opendaylight.yang.gen.v1
-            .http.org.openroadm.common.network.rev211210.TerminationPoint1Builder()
-                .setTpType(OpenroadmTpType.SRGTXRXCP)
-                .setAdministrativeState(AdminStates.InService)
-                .setOperationalState(State.InService)
-                .build();
-        ietfTpBldr.addAugmentation(ocnTp1);
-        TerminationPoint ietfTp = ietfTpBldr.build();
-        tpMap.put(ietfTp.key(),ietfTp);
-        // Create openroadm-common-network augmentation to set node type to SRG
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1 ocnNode1 =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
-                    .setNodeType(OpenroadmNodeType.SRG)
+        TerminationPoint ietfTp = createTpBldr(srgNb + "-CP-TXRX")
+            .addAugmentation(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
+                        .TerminationPoint1Builder()
+                    .setTpType(OpenroadmTpType.SRGTXRXCP)
                     .setAdministrativeState(AdminStates.InService)
                     .setOperationalState(State.InService)
-                    .build();
+                    .build())
+            .build();
+        tpMap.put(ietfTp.key(),ietfTp);
         // set srg-attributes
         SrgAttributesBuilder srgAttrBldr = new SrgAttributesBuilder();
         if (firstMount) {
             srgAttrBldr.setAvailFreqMaps(GridUtils.initFreqMaps4FixedGrid2Available());
         }
         SrgAttributes srgAttr = srgAttrBldr.build();
-        Node1 ontNode1 = new Node1Builder().setSrgAttributes(srgAttr).build();
         // Create ietf node augmentation to support ietf tp-list
-        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder
-            ietfNode1 = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
-                .Node1Builder().setTerminationPoint(tpMap);
         // Create ietf node setting supporting-node data
         String nodeIdtopo = new StringBuilder().append(nodeId).append("-").append(srgNb).toString();
         return createTopoLayerNode(nodeId, clli)
             .setNodeId(new NodeId(nodeIdtopo))
             .withKey((new NodeKey(new NodeId(nodeIdtopo))))
-            .addAugmentation(ontNode1)
-            .addAugmentation(ocnNode1)
-            .addAugmentation(ietfNode1.build());
+            .addAugmentation(new Node1Builder().setSrgAttributes(srgAttr).build())
+            .addAugmentation(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
+                        .Node1Builder()
+                    .setNodeType(OpenroadmNodeType.SRG)
+                    .setAdministrativeState(AdminStates.InService)
+                    .setOperationalState(State.InService)
+                    .build())
+            .addAugmentation(
+                new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                       .Node1Builder()
+                    .setTerminationPoint(tpMap)
+                    .build());
     }
 
     private static NodeBuilder createTopoLayerNode(String nodeId, String clli) {
         // Sets the value of Network-ref and Node-ref as a part of the supporting node
         // attribute
-        SupportingNodeBuilder support1bldr = new SupportingNodeBuilder()
-            .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID), new NodeId(nodeId)))
-            .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))
-            .setNodeRef(new NodeId(nodeId));
-        SupportingNodeBuilder support2bldr = new SupportingNodeBuilder()
-            .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID), new NodeId(clli)))
-            .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))
-            .setNodeRef(new NodeId(clli));
+        SupportingNode support1 = new SupportingNodeBuilder()
+                .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID), new NodeId(nodeId)))
+                .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))
+                .setNodeRef(new NodeId(nodeId))
+                .build();
+        SupportingNode support2 = new SupportingNodeBuilder()
+                .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID), new NodeId(clli)))
+                .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))
+                .setNodeRef(new NodeId(clli))
+                .build();
         Map<SupportingNodeKey, SupportingNode> supportlist = new HashMap<>();
-        SupportingNode support1 = support1bldr.build();
-        supportlist.put(support1.key(),support1);
-        SupportingNode support2 = support2bldr.build();
-        supportlist.put(support2.key(),support2);
+        supportlist.put(support1.key(), support1);
+        supportlist.put(support2.key(), support2);
         return new NodeBuilder().setSupportingNode(supportlist);
     }
 
@@ -418,18 +392,20 @@ public final class OpenRoadmTopology {
     }
 
     private static LinkBuilder createLink(String srcNode, String destNode, String srcTp, String destTp) {
-        //create source link
-        SourceBuilder ietfSrcLinkBldr = new SourceBuilder().setSourceNode(new NodeId(srcNode))
-            .setSourceTp(new TpId(srcTp));
-        //create destination link
-        DestinationBuilder ietfDestLinkBldr = new DestinationBuilder().setDestNode(new NodeId(destNode))
-            .setDestTp(new TpId(destTp));
         LinkId linkId = LinkIdUtil.buildLinkId(srcNode, srcTp, destNode, destTp);
         return new LinkBuilder()
-            .setSource(ietfSrcLinkBldr.build())
-            .setDestination(ietfDestLinkBldr.build())
-            .setLinkId(linkId)
-            .withKey(new LinkKey(linkId));
+                .setSource(
+                    new SourceBuilder()
+                        .setSourceNode(new NodeId(srcNode))
+                        .setSourceTp(new TpId(srcTp))
+                        .build())
+                .setDestination(
+                    new DestinationBuilder()
+                        .setDestNode(new NodeId(destNode))
+                        .setDestTp(new TpId(destTp))
+                        .build())
+                .setLinkId(linkId)
+                .withKey(new LinkKey(linkId));
     }
 
     private static List<Link> createNewLinks(List<Node> nodes) {
@@ -444,53 +420,57 @@ public final class OpenRoadmTopology {
                 destNode = nodes.get(j).getNodeId().getValue();
                 // A to Z direction
                 srcTp = nodes.get(i)
-                    .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
-                            .ietf.network.topology.rev180226.Node1.class).nonnullTerminationPoint().values().stream()
-                    .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP"))
-                    .findFirst().get().getTpId().getValue();
+                        .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
+                                .ietf.network.topology.rev180226.Node1.class)
+                        .nonnullTerminationPoint().values().stream()
+                        .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP"))
+                        .findFirst().orElseThrow().getTpId().getValue();
                 destTp = nodes.get(j)
-                    .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
-                            .ietf.network.topology.rev180226.Node1.class)
-                    .nonnullTerminationPoint().values().stream()
-                    .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP"))
-                    .findFirst().get().getTpId().getValue();
+                        .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
+                                .ietf.network.topology.rev180226.Node1.class)
+                        .nonnullTerminationPoint().values().stream()
+                        .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP"))
+                        .findFirst().orElseThrow().getTpId().getValue();
                 Link1Builder ocnAzLinkBldr = new Link1Builder();
+                Link1Builder ocnZaLinkBldr = new Link1Builder();
                 int srcNodeType = nodes.get(i).augmentation(org.opendaylight.yang.gen.v1.http
-                        .org.openroadm.common.network.rev211210.Node1.class).getNodeType().getIntValue();
+                        .org.openroadm.common.network.rev230526.Node1.class).getNodeType().getIntValue();
                 int destNodeType = nodes.get(j).augmentation(org.opendaylight.yang.gen.v1.http
-                        .org.openroadm.common.network.rev211210.Node1.class).getNodeType().getIntValue();
+                        .org.openroadm.common.network.rev230526.Node1.class).getNodeType().getIntValue();
+
                 if (srcNodeType == 11 && destNodeType == 11) {
                     ocnAzLinkBldr.setLinkType(OpenroadmLinkType.EXPRESSLINK);
+                    ocnZaLinkBldr.setLinkType(OpenroadmLinkType.EXPRESSLINK);
                 } else if (srcNodeType == 11 && destNodeType == 12) {
                     ocnAzLinkBldr.setLinkType(OpenroadmLinkType.DROPLINK);
+                    ocnZaLinkBldr.setLinkType(OpenroadmLinkType.ADDLINK);
                 } else if (srcNodeType == 12 && destNodeType == 11) {
                     ocnAzLinkBldr.setLinkType(OpenroadmLinkType.ADDLINK);
-                } else {
-                    continue;
-                }
-                // Z to A direction
-                Link1Builder ocnZaLinkBldr = new Link1Builder();
-                if (srcNodeType == 11 && destNodeType == 11) {
-                    ocnZaLinkBldr.setLinkType(OpenroadmLinkType.EXPRESSLINK);
-                } else if (destNodeType == 11 && srcNodeType == 12) {
                     ocnZaLinkBldr.setLinkType(OpenroadmLinkType.DROPLINK);
-                } else if (destNodeType == 12 && srcNodeType == 11) {
-                    ocnZaLinkBldr.setLinkType(OpenroadmLinkType.ADDLINK);
                 } else {
                     continue;
                 }
+
                 // Add state to link. Based on the operational state of the TPs at the edge of the link.
                 // Similar to getting srcTp and destTp
-                State srcTpState = nodes.get(i).augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
-                        .ietf.network.topology.rev180226.Node1.class).getTerminationPoint().values().stream()
-                    .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP"))
-                    .findFirst().get().augmentation(org.opendaylight.yang.gen.v1.http
-                            .org.openroadm.common.network.rev211210.TerminationPoint1.class).getOperationalState();
-                State destTpState = nodes.get(j).augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
-                        .ietf.network.topology.rev180226.Node1.class).getTerminationPoint().values().stream()
-                    .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP"))
-                    .findFirst().get().augmentation(org.opendaylight.yang.gen.v1.http
-                            .org.openroadm.common.network.rev211210.TerminationPoint1.class).getOperationalState();
+                State srcTpState = nodes.get(i)
+                        .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
+                            .ietf.network.topology.rev180226.Node1.class)
+                        .getTerminationPoint().values().stream()
+                        .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP"))
+                        .findFirst().orElseThrow()
+                        .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
+                            .TerminationPoint1.class)
+                        .getOperationalState();
+                State destTpState = nodes.get(j)
+                        .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
+                            .ietf.network.topology.rev180226.Node1.class)
+                        .getTerminationPoint().values().stream()
+                        .filter(tp -> tp.getTpId().getValue().contains("CP") || tp.getTpId().getValue().contains("CTP"))
+                        .findFirst().orElseThrow()
+                        .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
+                            .TerminationPoint1.class)
+                        .getOperationalState();
                 if (State.InService.equals(srcTpState) && State.InService.equals(destTpState)) {
                     ocnAzLinkBldr.setAdministrativeState(AdminStates.InService)
                             .setOperationalState(State.InService);
@@ -534,28 +514,31 @@ public final class OpenRoadmTopology {
     public static boolean deleteLinkLinkId(LinkId linkId , NetworkTransactionService networkTransactionService) {
         LOG.info("deleting link for LinkId: {}", linkId.getValue());
         try {
-            InstanceIdentifierBuilder<Link> linkIID = InstanceIdentifier.builder(Networks.class).child(Network.class,
-                new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).augmentation(Network1.class)
+            InstanceIdentifier.Builder<Link> linkIID = InstanceIdentifier.builder(Networks.class)
+                .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
+                .augmentation(Network1.class)
                 .child(Link.class, new LinkKey(linkId));
             java.util.Optional<Link> link =
                     networkTransactionService.read(LogicalDatastoreType.CONFIGURATION,linkIID.build()).get();
-            if (link.isPresent()) {
-                LinkBuilder linkBuilder = new LinkBuilder(link.get());
-                org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Link1Builder link1Builder =
-                    new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Link1Builder(
-                    linkBuilder.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210
-                    .Link1.class));
-                linkBuilder.removeAugmentation(Link1.class)
-                    .addAugmentation(link1Builder.build());
-                networkTransactionService.merge(LogicalDatastoreType.CONFIGURATION, linkIID.build(),
-                        linkBuilder.build());
-                networkTransactionService.commit().get(1, TimeUnit.SECONDS);
-                return true;
-            } else {
-                LOG.error("No link found for given LinkId: {}",
-                        linkId);
+            if (link.isEmpty()) {
+                LOG.error("No link found for given LinkId: {}", linkId);
                 return false;
             }
+            LinkBuilder linkBuilder = new LinkBuilder(link.orElseThrow());
+            networkTransactionService.merge(
+                LogicalDatastoreType.CONFIGURATION,
+                linkIID.build(),
+                linkBuilder
+                    .removeAugmentation(Link1.class)
+                    .addAugmentation(
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526
+                            .Link1Builder(linkBuilder
+                                .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526
+                                    .Link1.class))
+                                .build())
+                    .build());
+            networkTransactionService.commit().get(1, TimeUnit.SECONDS);
+            return true;
 
         } catch (InterruptedException | ExecutionException | TimeoutException e) {
             LOG.error("Error deleting link {}", linkId.getValue(), e);
@@ -569,39 +552,20 @@ public final class OpenRoadmTopology {
      * @param tpId String
      * @return InstanceIdentifierBuilder
      */
-    public static InstanceIdentifierBuilder<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
-        .TerminationPoint1> createCommonNetworkTerminationPointIIDBuilder(String nodeId, String tpId) {
-        return InstanceIdentifier
-            .builder(Networks.class).child(Network.class, new NetworkKey(
-                    new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
-            .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network
-                    .Node.class, new NodeKey(new NodeId(nodeId)))
-            .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
-            .Node1.class)
-            .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks
-                    .network.node.TerminationPoint.class, new TerminationPointKey(new TpId(tpId)))
-            .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
-                .TerminationPoint1.class);
-    }
-
-    /**
-     * Get a builder for instance identifier related to network termination point.
-     * @param nodeId String
-     * @param tpId String
-     * @return InstanceIdentifierBuilder
-     */
-    public static InstanceIdentifierBuilder<TerminationPoint1> createNetworkTerminationPointIIDBuilder(String nodeId,
-            String tpId) {
-        return InstanceIdentifier
-                .builder(Networks.class).child(Network.class, new NetworkKey(
-                        new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
-                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network
-                        .Node.class, new NodeKey(new NodeId(nodeId)))
+    public static InstanceIdentifier.Builder<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
+            .TerminationPoint1> createCommonNetworkTerminationPointIIDBuilder(String nodeId, String tpId) {
+        return InstanceIdentifier.builder(Networks.class)
+                .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
+                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
+                        .networks.network.Node.class,
+                    new NodeKey(new NodeId(nodeId)))
                 .augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
-                .Node1.class)
-                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks
-                        .network.node.TerminationPoint.class, new TerminationPointKey(new TpId(tpId)))
-                .augmentation(TerminationPoint1.class);
+                    .Node1.class)
+                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                        .networks.network.node.TerminationPoint.class,
+                    new TerminationPointKey(new TpId(tpId)))
+                .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
+                        .TerminationPoint1.class);
     }
 
     /**
@@ -610,11 +574,12 @@ public final class OpenRoadmTopology {
      * @return InstanceIdentifier
      */
     public static InstanceIdentifier<Node1> createNetworkNodeIID(String nodeId) {
-        return InstanceIdentifier
-                .builder(Networks.class).child(Network.class, new NetworkKey(
-                        new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
-                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network
-                .Node.class, new NodeKey(new NodeId(nodeId))).augmentation(Node1.class).build();
+        return InstanceIdentifier.builder(Networks.class)
+                .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
+                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
+                        .networks.network.Node.class,
+                     new NodeKey(new NodeId(nodeId)))
+                .augmentation(Node1.class).build();
     }
 
     /**
@@ -622,14 +587,14 @@ public final class OpenRoadmTopology {
      * @param nodeId String
      * @return InstanceIdentifier
      */
-    public static InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
-        .Node1> createCommonNetworkNodeIID(String nodeId) {
-        return InstanceIdentifier
-                .builder(Networks.class).child(Network.class, new NetworkKey(
-                        new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
-                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network
-                        .Node.class, new NodeKey(new NodeId(nodeId)))
-                .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1.class)
+    public static InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
+            .Node1> createCommonNetworkNodeIID(String nodeId) {
+        return InstanceIdentifier.builder(Networks.class)
+                .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
+                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
+                        .networks.network.Node.class,
+                    new NodeKey(new NodeId(nodeId)))
+                .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class)
                 .build();
     }
 }
index 9cca982f5d385ece698573c487849cabf06386db..c173bf80f36dd19d82e9756b9c98269190675d97 100644 (file)
@@ -18,11 +18,11 @@ import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.NetworkUtils;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.networkmodel.dto.TopologyShard;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1Builder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
@@ -109,13 +109,13 @@ public final class TopologyUtils {
     public static boolean deleteLinkLinkId(LinkId linkId , NetworkTransactionService networkTransactionService) {
         LOG.info("deleting link for LinkId: {}", linkId.getValue());
         try {
-            InstanceIdentifier.InstanceIdentifierBuilder<Link> linkIID = InstanceIdentifier.builder(Networks.class)
+            InstanceIdentifier.Builder<Link> linkIID = InstanceIdentifier.builder(Networks.class)
                 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
                 .augmentation(Network1.class).child(Link.class, new LinkKey(linkId));
             java.util.Optional<Link> link =
                 networkTransactionService.read(LogicalDatastoreType.CONFIGURATION,linkIID.build()).get();
             if (link.isPresent()) {
-                LinkBuilder linkBuilder = new LinkBuilder(link.get());
+                LinkBuilder linkBuilder = new LinkBuilder(link.orElseThrow());
                 Link1Builder link1Builder = new Link1Builder(linkBuilder.augmentation(Link1.class));
                 linkBuilder.removeAugmentation(Link1.class);
                 linkBuilder.addAugmentation(link1Builder.build());
index 8545b4635a3f6157b8ee04fa593eeb3193f6243f..a19a8636f27c1f4d43674543fb1e946dc72e4b64 100644 (file)
@@ -16,7 +16,7 @@ import org.opendaylight.transportpce.common.NetworkUtils;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.clli.network.rev191129.NetworkTypes1Builder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.clli.network.rev191129.networks.network.network.types.ClliNetworkBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.networks.network.network.types.OpenroadmCommonNetworkBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.networks.network.network.types.OpenroadmCommonNetworkBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
@@ -26,7 +26,6 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NetworkTypesBuilder;
 import org.opendaylight.yangtools.yang.binding.Augmentation;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -48,9 +47,9 @@ public class TpceNetwork {
     public void createLayer(String networkId) {
         try {
             Network network = createNetwork(networkId);
-            InstanceIdentifierBuilder<Network> nwIID = InstanceIdentifier.builder(Networks.class).child(Network.class,
+            InstanceIdentifier.Builder<Network> nwIID = InstanceIdentifier.builder(Networks.class).child(Network.class,
                 new NetworkKey(new NetworkId(networkId)));
-            networkTransactionService.put(LogicalDatastoreType.CONFIGURATION, nwIID.build(), network);
+            networkTransactionService.merge(LogicalDatastoreType.CONFIGURATION, nwIID.build(), network);
             this.networkTransactionService.commit().get(1, TimeUnit.SECONDS);
             LOG.info("{} network layer created successfully.", networkId);
         } catch (ExecutionException | TimeoutException | InterruptedException e) {
@@ -75,7 +74,7 @@ public class TpceNetwork {
             case NetworkUtils.OVERLAY_NETWORK_ID:
             case NetworkUtils.OTN_NETWORK_ID:
                 Augmentation<NetworkTypes> ordTopology = new org.opendaylight.yang.gen.v1.http
-                    .org.openroadm.common.network.rev211210.NetworkTypes1Builder()
+                    .org.openroadm.common.network.rev230526.NetworkTypes1Builder()
                     .setOpenroadmCommonNetwork(new OpenroadmCommonNetworkBuilder().build())
                     .build();
                 networkTypesBldr.addAugmentation(ordTopology);
diff --git a/networkmodel/src/main/resources/OSGI-INF/blueprint/networkmodel-blueprint.xml b/networkmodel/src/main/resources/OSGI-INF/blueprint/networkmodel-blueprint.xml
deleted file mode 100644 (file)
index 9dc2d69..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- vi: set et smarttab sw=4 tabstop=4: -->
-<!-- Copyright © 2016 Orange and others. All rights reserved. This program and the accompanying materials
-    are made available under the terms of the Eclipse Public License v1.0 which accompanies this distribution,
-    and is available at http://www.eclipse.org/legal/epl-v10.html -->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
-    odl:use-default-for-reference-types="true">
-
-    <reference id="dataBroker" interface="org.opendaylight.mdsal.binding.api.DataBroker" />
-    <reference id="rpcProviderService" interface="org.opendaylight.mdsal.binding.api.RpcProviderService" />
-    <reference id="deviceTransactionManager" interface="org.opendaylight.transportpce.common.device.DeviceTransactionManager" />
-    <reference id="portMapping" interface="org.opendaylight.transportpce.common.mapping.PortMapping" />
-    <reference id="networkTransactionImpl" interface="org.opendaylight.transportpce.common.network.NetworkTransactionService" />
-    <reference id="mappingUtils" interface="org.opendaylight.transportpce.common.mapping.MappingUtils" />
-    <reference id="notificationService" interface="org.opendaylight.mdsal.binding.api.NotificationService"/>
-    <reference id="notificationPublishService" interface="org.opendaylight.mdsal.binding.api.NotificationPublishService"/>
-
-    <bean id="networkModelService" class="org.opendaylight.transportpce.networkmodel.service.NetworkModelServiceImpl">
-        <argument ref="networkTransactionImpl" />
-        <argument ref="linkDiscoveryImpl" />
-        <argument ref="portMapping" />
-        <argument ref="notificationPublishService" />
-    </bean>
-
-    <bean id="provider" class="org.opendaylight.transportpce.networkmodel.NetworkModelProvider"
-        init-method="init" destroy-method="close">
-        <argument ref="networkTransactionImpl" />
-        <argument ref="dataBroker" />
-        <argument ref="rpcProviderService" />
-        <argument ref="networkutilsServiceImpl" />
-        <argument ref="netconfTopologyListener" />
-        <argument ref="notificationService" />
-        <argument ref="frequenciesService" />
-        <argument ref="portMappingListener" />
-    </bean>
-
-    <bean id="portMappingListener" class="org.opendaylight.transportpce.networkmodel.listeners.PortMappingListener">
-        <argument ref="networkModelService" />
-    </bean>
-
-    <bean id="netconfTopologyListener" class="org.opendaylight.transportpce.networkmodel.NetConfTopologyListener">
-        <argument ref="networkModelService" />
-        <argument ref="dataBroker" />
-        <argument ref="deviceTransactionManager" />
-        <argument ref="portMapping" />
-    </bean>
-
-    <bean id="networkutilsServiceImpl" class="org.opendaylight.transportpce.networkmodel.NetworkUtilsImpl">
-        <argument ref="dataBroker" />
-    </bean>
-
-    <bean id="linkDiscoveryImpl" class="org.opendaylight.transportpce.networkmodel.R2RLinkDiscovery">
-        <argument ref="dataBroker" />
-        <argument ref="deviceTransactionManager" />
-        <argument ref="networkTransactionImpl" />
-   </bean>
-
-    <bean id="frequenciesService" class="org.opendaylight.transportpce.networkmodel.service.FrequenciesServiceImpl">
-        <argument ref="dataBroker" />
-    </bean>
-
-    <service ref="networkModelService" interface="org.opendaylight.transportpce.networkmodel.service.NetworkModelService" />
-
-    <service ref="frequenciesService" interface="org.opendaylight.transportpce.networkmodel.service.FrequenciesService" />
-
-</blueprint>
index 3656c8f02c4abb198e3b1081b6ec6daf383f6b53..445bb8b65a11fa7c30b48f8f5a8a473c2cc68ea8 100644 (file)
@@ -17,14 +17,12 @@ import static org.mockito.Mockito.when;
 import static org.opendaylight.transportpce.common.StringConstants.OPENROADM_DEVICE_VERSION_2_2_1;
 
 import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
@@ -36,14 +34,15 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.AvailableCapabilities;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.AvailableCapabilitiesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapability;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapabilityBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.credentials.credentials.LoginPasswordBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.ConnectionOper.ConnectionStatus;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.connection.oper.AvailableCapabilities;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.connection.oper.AvailableCapabilitiesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.connection.oper.available.capabilities.AvailableCapability;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.connection.oper.available.capabilities.AvailableCapabilityBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.credentials.credentials.LoginPwBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.credentials.credentials.login.pw.LoginPasswordBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev231121.NetconfNode;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev231121.NetconfNodeBuilder;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.NodeBuilder;
@@ -51,7 +50,7 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 import org.opendaylight.yangtools.yang.common.Uint16;
 import org.opendaylight.yangtools.yang.common.Uint32;
 
-@RunWith(MockitoJUnitRunner.StrictStubs.class)
+@ExtendWith(MockitoExtension.class)
 public class NetConfTopologyListenerTest {
 
     @Mock
@@ -66,107 +65,107 @@ public class NetConfTopologyListenerTest {
     private Map<String, NodeRegistration> registrations;
 
     @Test
-    public void testOnDataTreeChangedWhenDeleteNode() {
+    void testOnDataTreeChangedWhenDeleteNode() {
         @SuppressWarnings("unchecked") final DataObjectModification<Node> node = mock(DataObjectModification.class);
-        final Collection<DataTreeModification<Node>> changes = new HashSet<>();
+        final List<DataTreeModification<Node>> changes = new ArrayList<>();
         @SuppressWarnings("unchecked") final DataTreeModification<Node> ch = mock(DataTreeModification.class);
         final NodeRegistration nodeRegistration = mock(NodeRegistration.class);
         changes.add(ch);
         when(ch.getRootNode()).thenReturn(node);
 
-        final Node netconfNode = getNetconfNode("netconfNode1", NetconfNodeConnectionStatus.ConnectionStatus.Connecting,
+        final Node netconfNode = getNetconfNode("netconfNode1", ConnectionStatus.Connecting,
             OPENROADM_DEVICE_VERSION_2_2_1);
-        when(node.getModificationType()).thenReturn(DataObjectModification.ModificationType.DELETE);
-        when(node.getDataBefore()).thenReturn(netconfNode);
+        when(node.modificationType()).thenReturn(DataObjectModification.ModificationType.DELETE);
+        when(node.dataBefore()).thenReturn(netconfNode);
 
         NetConfTopologyListener listener = new NetConfTopologyListener(networkModelService, dataBroker,
             deviceTransactionManager, portMapping, registrations);
         listener.onDataTreeChanged(changes);
         verify(ch, times(1)).getRootNode();
-        verify(node, times(1)).getModificationType();
-        verify(node, times(3)).getDataBefore();
+        verify(node, times(1)).modificationType();
+        verify(node, times(3)).dataBefore();
         verify(networkModelService, times(1)).deleteOpenRoadmnode(anyString());
         verify(nodeRegistration, times(0)).unregisterListeners();
     }
 
     @Test
-    public void testOnDataTreeChangedWhenAddNode() {
+    void testOnDataTreeChangedWhenAddNode() {
         @SuppressWarnings("unchecked") final DataObjectModification<Node> node = mock(DataObjectModification.class);
-        final Collection<DataTreeModification<Node>> changes = new HashSet<>();
+        final List<DataTreeModification<Node>> changes = new ArrayList<>();
         @SuppressWarnings("unchecked") final DataTreeModification<Node> ch = mock(DataTreeModification.class);
         changes.add(ch);
         when(ch.getRootNode()).thenReturn(node);
 
         final Node netconfNodeBefore = getNetconfNode("netconfNode1",
-            NetconfNodeConnectionStatus.ConnectionStatus.Connecting, OPENROADM_DEVICE_VERSION_2_2_1);
+            ConnectionStatus.Connecting, OPENROADM_DEVICE_VERSION_2_2_1);
         final Node netconfNodeAfter = getNetconfNode("netconfNode1",
-            NetconfNodeConnectionStatus.ConnectionStatus.Connected, OPENROADM_DEVICE_VERSION_2_2_1);
-        when(node.getModificationType()).thenReturn(DataObjectModification.ModificationType.WRITE);
-        when(node.getDataBefore()).thenReturn(netconfNodeBefore);
-        when(node.getDataAfter()).thenReturn(netconfNodeAfter);
+            ConnectionStatus.Connected, OPENROADM_DEVICE_VERSION_2_2_1);
+        when(node.modificationType()).thenReturn(DataObjectModification.ModificationType.WRITE);
+        when(node.dataBefore()).thenReturn(netconfNodeBefore);
+        when(node.dataAfter()).thenReturn(netconfNodeAfter);
 
         NetConfTopologyListener listener = new NetConfTopologyListener(networkModelService, dataBroker,
             deviceTransactionManager, portMapping);
         listener.onDataTreeChanged(changes);
         verify(ch, times(1)).getRootNode();
-        verify(node, times(1)).getModificationType();
-        verify(node, times(3)).getDataBefore();
-        verify(node, times(1)).getDataAfter();
+        verify(node, times(1)).modificationType();
+        verify(node, times(3)).dataBefore();
+        verify(node, times(1)).dataAfter();
         verify(networkModelService, times(1)).createOpenRoadmNode(anyString(), anyString());
     }
 
     @Test
-    public void testOnDataTreeChangedWhenDisconnectingNode() {
+    void testOnDataTreeChangedWhenDisconnectingNode() {
         @SuppressWarnings("unchecked") final DataObjectModification<Node> node = mock(DataObjectModification.class);
-        final Collection<DataTreeModification<Node>> changes = new HashSet<>();
+        final List<DataTreeModification<Node>> changes = new ArrayList<>();
         @SuppressWarnings("unchecked") final DataTreeModification<Node> ch = mock(DataTreeModification.class);
         changes.add(ch);
         when(ch.getRootNode()).thenReturn(node);
 
         final Node netconfNodeBefore = getNetconfNode("netconfNode1",
-            NetconfNodeConnectionStatus.ConnectionStatus.Connected, OPENROADM_DEVICE_VERSION_2_2_1);
+            ConnectionStatus.Connected, OPENROADM_DEVICE_VERSION_2_2_1);
         final Node netconfNodeAfter = getNetconfNode("netconfNode1",
-            NetconfNodeConnectionStatus.ConnectionStatus.Connecting, OPENROADM_DEVICE_VERSION_2_2_1);
-        when(node.getModificationType()).thenReturn(DataObjectModification.ModificationType.WRITE);
-        when(node.getDataBefore()).thenReturn(netconfNodeBefore);
-        when(node.getDataAfter()).thenReturn(netconfNodeAfter);
+            ConnectionStatus.Connecting, OPENROADM_DEVICE_VERSION_2_2_1);
+        when(node.modificationType()).thenReturn(DataObjectModification.ModificationType.WRITE);
+        when(node.dataBefore()).thenReturn(netconfNodeBefore);
+        when(node.dataAfter()).thenReturn(netconfNodeAfter);
 
         NetConfTopologyListener listener = new NetConfTopologyListener(networkModelService, dataBroker,
             deviceTransactionManager, portMapping);
         listener.onDataTreeChanged(changes);
         verify(ch, times(1)).getRootNode();
-        verify(node, times(1)).getModificationType();
-        verify(node, times(3)).getDataBefore();
-        verify(node, times(1)).getDataAfter();
+        verify(node, times(1)).modificationType();
+        verify(node, times(3)).dataBefore();
+        verify(node, times(1)).dataAfter();
         verify(networkModelService, never()).createOpenRoadmNode(anyString(), anyString());
         verify(networkModelService, never()).deleteOpenRoadmnode(anyString());
     }
 
     @Test
-    public void testOnDataTreeChangedWhenShouldNeverHappen() {
+    void testOnDataTreeChangedWhenShouldNeverHappen() {
         @SuppressWarnings("unchecked") final DataObjectModification<Node> node = mock(DataObjectModification.class);
-        final Collection<DataTreeModification<Node>> changes = new HashSet<>();
+        final List<DataTreeModification<Node>> changes = new ArrayList<>();
         @SuppressWarnings("unchecked") final DataTreeModification<Node> ch = mock(DataTreeModification.class);
         changes.add(ch);
         when(ch.getRootNode()).thenReturn(node);
 
         final Node netconfNodeBefore = getNetconfNode("netconfNode1",
-            NetconfNodeConnectionStatus.ConnectionStatus.Connected, OPENROADM_DEVICE_VERSION_2_2_1);
-        when(node.getModificationType()).thenReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED);
-        when(node.getDataBefore()).thenReturn(netconfNodeBefore);
+            ConnectionStatus.Connected, OPENROADM_DEVICE_VERSION_2_2_1);
+        when(node.modificationType()).thenReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED);
+        when(node.dataBefore()).thenReturn(netconfNodeBefore);
 
         NetConfTopologyListener listener = new NetConfTopologyListener(networkModelService, dataBroker,
             deviceTransactionManager, portMapping);
         listener.onDataTreeChanged(changes);
         verify(ch, times(1)).getRootNode();
-        verify(node, times(2)).getModificationType();
-        verify(node, times(3)).getDataBefore();
-        verify(node, never()).getDataAfter();
+        verify(node, times(2)).modificationType();
+        verify(node, times(3)).dataBefore();
+        verify(node, never()).dataAfter();
         verify(networkModelService, never()).createOpenRoadmNode(anyString(), anyString());
         verify(networkModelService, never()).deleteOpenRoadmnode(anyString());
     }
 
-    private Node getNetconfNode(final String nodeId, final NetconfNodeConnectionStatus.ConnectionStatus cs,
+    private Node getNetconfNode(final String nodeId, final ConnectionStatus cs,
         final String openRoadmVersion) {
         final List<AvailableCapability> avCapList = new ArrayList<>();
         avCapList.add(new AvailableCapabilityBuilder()
@@ -182,12 +181,13 @@ public class NetConfTopologyListenerTest {
             .setPort(new PortNumber(Uint16.valueOf(9999)))
             .setReconnectOnChangedSchema(true)
             .setDefaultRequestTimeoutMillis(Uint32.valueOf(1000))
-            .setBetweenAttemptsTimeoutMillis(Uint16.valueOf(100))
             .setKeepaliveDelay(Uint32.valueOf(1000))
             .setTcpOnly(true)
-            .setCredentials(new LoginPasswordBuilder()
-                .setUsername("testuser")
-                .setPassword("testpassword")
+            .setCredentials(new LoginPwBuilder()
+                .setLoginPassword(new LoginPasswordBuilder()
+                    .setUsername("testuser")
+                    .setPassword("testpassword".getBytes())
+                    .build())
                 .build())
             .build();
         return new NodeBuilder()
index 2db827b4c57c1c376554d748283c53719818f5a2..52fb633356df438da78e5f35dbc7f2a7f73b7ba3 100644 (file)
@@ -13,44 +13,42 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import com.google.common.util.concurrent.FluentFuture;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
 import org.mockito.invocation.InvocationOnMock;
-import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.mockito.stubbing.Answer;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.NotificationService;
-import org.opendaylight.mdsal.binding.api.RpcProviderService;
 import org.opendaylight.mdsal.common.api.CommitInfo;
+import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
+import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
-import org.opendaylight.transportpce.networkmodel.listeners.PortMappingListener;
 import org.opendaylight.transportpce.networkmodel.service.FrequenciesService;
-import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev170818.TransportpceNetworkutilsService;
+import org.opendaylight.transportpce.networkmodel.service.NetworkModelService;
 
-@RunWith(MockitoJUnitRunner.StrictStubs.class)
-public class NetworkModelProviderTest extends AbstractTest {
+@ExtendWith(MockitoExtension.class)
+public class NetworkModelProviderTest {
     @Mock
     NetworkTransactionService networkTransactionService;
     @Mock
-    RpcProviderService rpcProviderService;
+    DataBroker dataBroker;
     @Mock
-    TransportpceNetworkutilsService networkutilsService;
+    NetworkModelService networkModelService;
     @Mock
-    NetConfTopologyListener topologyListener;
+    DeviceTransactionManager deviceTransactionManager;
     @Mock
-    private NotificationService notificationService;
+    PortMapping portMapping;
     @Mock
-    private FrequenciesService frequenciesService;
+    NetConfTopologyListener topologyListener;
     @Mock
-    private PortMappingListener portMappingListener;
-
+    NotificationService notificationService;
+    @Mock
+    FrequenciesService frequenciesService;
 
     @Test
-    public void networkmodelProviderInitTest() {
-        NetworkModelProvider provider = new NetworkModelProvider(networkTransactionService, getDataBroker(),
-            rpcProviderService, networkutilsService, topologyListener, notificationService,
-            frequenciesService, portMappingListener);
+    void networkmodelProviderInitTest() {
         Answer<FluentFuture<CommitInfo>> answer = new Answer<FluentFuture<CommitInfo>>() {
 
             @Override
@@ -61,10 +59,9 @@ public class NetworkModelProviderTest extends AbstractTest {
         };
         when(networkTransactionService.commit()).then(answer);
 
-        provider.init();
+        new NetworkModelProvider(networkTransactionService, dataBroker, networkModelService, deviceTransactionManager,
+                portMapping, notificationService, frequenciesService);
 
-        verify(rpcProviderService, times(1))
-            .registerRpcImplementation(any(), any(TransportpceNetworkutilsService.class));
+        verify(dataBroker, times(2)).registerTreeChangeListener(any(), any());
     }
-
 }
diff --git a/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/NetworkUtilsImplTest.java b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/NetworkUtilsImplTest.java
new file mode 100644 (file)
index 0000000..83da135
--- /dev/null
@@ -0,0 +1,41 @@
+/*
+ * Copyright © 2023 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.networkmodel;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.DeleteLink;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitRdmXpdrLinks;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitRoadmNodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.InitXpdrRdmLinks;
+
+
+@ExtendWith(MockitoExtension.class)
+class NetworkUtilsImplTest {
+    @Mock
+    DataBroker dataBroker;
+    @Mock
+    RpcProviderService rpcProvider;
+
+    @Test
+    void networkUtilsInitTest() {
+        new NetworkUtilsImpl(dataBroker, rpcProvider);
+
+        verify(rpcProvider, times(1)).registerRpcImplementations(
+                any(DeleteLink.class), any(InitRoadmNodes.class), any(InitXpdrRdmLinks.class),
+                any(InitRdmXpdrLinks.class));
+    }
+}
index 196966ea04e1647b377222226af47fa6a4f638a1..cf5248c5cec4e07ec38e70cbafdbda4a9c188cb1 100644 (file)
@@ -17,13 +17,14 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import com.google.common.collect.ImmutableList;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.ChangeNotification;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.change.notification.Edit;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.change.notification.EditBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.Ports;
@@ -34,13 +35,13 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.open
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.EditOperationType;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
-@RunWith(MockitoJUnitRunner.StrictStubs.class)
+@ExtendWith(MockitoExtension.class)
 public class DeviceListener121Test {
     @Mock
     private PortMapping portMapping;
 
     @Test
-    public void testOnChangeNotificationWhenPortUpdated() throws InterruptedException {
+    void testOnChangeNotificationWhenPortUpdated() throws InterruptedException {
         ChangeNotification notification = mock(ChangeNotification.class);
         Mapping oldMapping = mock(Mapping.class);
         ImmutableList<Edit> editList = createEditList();
@@ -55,7 +56,7 @@ public class DeviceListener121Test {
     }
 
     @Test
-    public void testOnChangeNotificationWhenNoEditList() {
+    void testOnChangeNotificationWhenNoEditList() {
         ChangeNotification notification = mock(ChangeNotification.class);
         when(notification.getEdit()).thenReturn(null);
         DeviceListener121 listener = new DeviceListener121("node1", portMapping);
@@ -65,7 +66,7 @@ public class DeviceListener121Test {
     }
 
     @Test
-    public void testOnChangeNotificationWhenOtherthingUpdated() {
+    void testOnChangeNotificationWhenOtherthingUpdated() {
         ChangeNotification notification = mock(ChangeNotification.class);
         ImmutableList<Edit> editList = createBadEditList();
         when(notification.getEdit()).thenReturn(editList);
@@ -76,9 +77,11 @@ public class DeviceListener121Test {
     }
 
     private ImmutableList<Edit> createEditList() {
-        InstanceIdentifier<Ports> portId = InstanceIdentifier.create(OrgOpenroadmDevice.class)
+        InstanceIdentifier<Ports> portId = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
             .child(CircuitPacks.class, new CircuitPacksKey("circuit-pack1"))
-            .child(Ports.class, new PortsKey("port1"));
+            .child(Ports.class, new PortsKey("port1"))
+            .build();
         Edit edit = new EditBuilder()
             .setOperation(EditOperationType.Merge)
             .setTarget(portId)
@@ -88,8 +91,10 @@ public class DeviceListener121Test {
     }
 
     private ImmutableList<Edit> createBadEditList() {
-        InstanceIdentifier<CircuitPacks> cpId = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-            .child(CircuitPacks.class, new CircuitPacksKey("circuit-pack1"));
+        InstanceIdentifier<CircuitPacks> cpId = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey("circuit-pack1"))
+            .build();
         Edit edit = new EditBuilder()
             .setOperation(EditOperationType.Merge)
             .setTarget(cpId)
index be9fedd2aa3e2149c1c2131b271c15de6a5f5da7..86d9512433e3cc624cedd5209dd243edbdf2830a 100644 (file)
@@ -17,13 +17,14 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import com.google.common.collect.ImmutableList;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.ChangeNotification;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.change.notification.Edit;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.change.notification.EditBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.circuit.pack.Ports;
@@ -34,13 +35,13 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.open
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.EditOperationType;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
-@RunWith(MockitoJUnitRunner.StrictStubs.class)
+@ExtendWith(MockitoExtension.class)
 public class DeviceListener221Test {
     @Mock
     private PortMapping portMapping;
 
     @Test
-    public void testOnChangeNotificationWhenPortUpdated() throws InterruptedException {
+    void testOnChangeNotificationWhenPortUpdated() throws InterruptedException {
         ChangeNotification notification = mock(ChangeNotification.class);
         Mapping oldMapping = mock(Mapping.class);
         ImmutableList<Edit> editList = createEditList();
@@ -55,7 +56,7 @@ public class DeviceListener221Test {
     }
 
     @Test
-    public void testOnChangeNotificationWhenNoEditList() {
+    void testOnChangeNotificationWhenNoEditList() {
         ChangeNotification notification = mock(ChangeNotification.class);
         when(notification.getEdit()).thenReturn(null);
         DeviceListener221 listener = new DeviceListener221("node1", portMapping);
@@ -65,7 +66,7 @@ public class DeviceListener221Test {
     }
 
     @Test
-    public void testOnChangeNotificationWhenOtherthingUpdated() {
+    void testOnChangeNotificationWhenOtherthingUpdated() {
         ChangeNotification notification = mock(ChangeNotification.class);
         ImmutableList<Edit> editList = createBadEditList();
         when(notification.getEdit()).thenReturn(editList);
@@ -76,9 +77,11 @@ public class DeviceListener221Test {
     }
 
     private ImmutableList<Edit> createEditList() {
-        InstanceIdentifier<Ports> portId = InstanceIdentifier.create(OrgOpenroadmDevice.class)
+        InstanceIdentifier<Ports> portId = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
             .child(CircuitPacks.class, new CircuitPacksKey("circuit-pack1"))
-            .child(Ports.class, new PortsKey("port1"));
+            .child(Ports.class, new PortsKey("port1"))
+            .build();
         Edit edit = new EditBuilder()
             .setOperation(EditOperationType.Merge)
             .setTarget(portId)
@@ -88,8 +91,10 @@ public class DeviceListener221Test {
     }
 
     private ImmutableList<Edit> createBadEditList() {
-        InstanceIdentifier<CircuitPacks> cpId = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-            .child(CircuitPacks.class, new CircuitPacksKey("circuit-pack1"));
+        InstanceIdentifier<CircuitPacks> cpId = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey("circuit-pack1"))
+            .build();
         Edit edit = new EditBuilder()
             .setOperation(EditOperationType.Merge)
             .setTarget(cpId)
index 10f8b35da1bae7d11f17fb4c055bdf4ce119b895..13442a7c563b4eb68eaae520e754498b68f302d2 100644 (file)
@@ -17,13 +17,14 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import com.google.common.collect.ImmutableList;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.ChangeNotification;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.change.notification.Edit;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.change.notification.EditBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.circuit.pack.Ports;
@@ -34,13 +35,13 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.open
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.netconf.base._1._0.rev110601.EditOperationType;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
-@RunWith(MockitoJUnitRunner.StrictStubs.class)
+@ExtendWith(MockitoExtension.class)
 public class DeviceListener710Test {
     @Mock
     private PortMapping portMapping;
 
     @Test
-    public void testOnChangeNotificationWhenPortUpdated() throws InterruptedException {
+    void testOnChangeNotificationWhenPortUpdated() throws InterruptedException {
         ChangeNotification notification = mock(ChangeNotification.class);
         Mapping oldMapping = mock(Mapping.class);
         ImmutableList<Edit> editList = createEditList();
@@ -55,7 +56,7 @@ public class DeviceListener710Test {
     }
 
     @Test
-    public void testOnChangeNotificationWhenNoEditList() {
+    void testOnChangeNotificationWhenNoEditList() {
         ChangeNotification notification = mock(ChangeNotification.class);
         when(notification.getEdit()).thenReturn(null);
         DeviceListener710 listener = new DeviceListener710("node1", portMapping);
@@ -65,7 +66,7 @@ public class DeviceListener710Test {
     }
 
     @Test
-    public void testOnChangeNotificationWhenOtherthingUpdated() {
+    void testOnChangeNotificationWhenOtherthingUpdated() {
         ChangeNotification notification = mock(ChangeNotification.class);
         ImmutableList<Edit> editList = createBadEditList();
         when(notification.getEdit()).thenReturn(editList);
@@ -76,9 +77,11 @@ public class DeviceListener710Test {
     }
 
     private ImmutableList<Edit> createEditList() {
-        InstanceIdentifier<Ports> portId = InstanceIdentifier.create(OrgOpenroadmDevice.class)
+        InstanceIdentifier<Ports> portId = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
             .child(CircuitPacks.class, new CircuitPacksKey("circuit-pack1"))
-            .child(Ports.class, new PortsKey("port1"));
+            .child(Ports.class, new PortsKey("port1"))
+            .build();
         Edit edit = new EditBuilder()
             .setOperation(EditOperationType.Merge)
             .setTarget(portId)
@@ -88,8 +91,10 @@ public class DeviceListener710Test {
     }
 
     private ImmutableList<Edit> createBadEditList() {
-        InstanceIdentifier<CircuitPacks> cpId = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-            .child(CircuitPacks.class, new CircuitPacksKey("circuit-pack1"));
+        InstanceIdentifier<CircuitPacks> cpId = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey("circuit-pack1"))
+            .build();
         Edit edit = new EditBuilder()
             .setOperation(EditOperationType.Merge)
             .setTarget(cpId)
diff --git a/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/listeners/PortMappingListenerTest.java b/networkmodel/src/test/java/org/opendaylight/transportpce/networkmodel/listeners/PortMappingListenerTest.java
new file mode 100644 (file)
index 0000000..a641793
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+ * Copyright © 2022 Orange.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.networkmodel.listeners;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.anyString;
+import static org.mockito.Mockito.lenient;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.opendaylight.mdsal.binding.api.DataObjectModification;
+import org.opendaylight.mdsal.binding.api.DataTreeModification;
+import org.opendaylight.transportpce.networkmodel.service.NetworkModelService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+
+
+@ExtendWith(MockitoExtension.class)
+public class PortMappingListenerTest {
+
+    @Mock
+    private NetworkModelService networkModelService;
+    private PortMappingListener portMappingListenerSpy;
+
+    @BeforeEach
+    void setUp() {
+        portMappingListenerSpy = Mockito.spy(new PortMappingListener(networkModelService));
+        lenient().doReturn("NodeID").when(portMappingListenerSpy).getNodeIdFromMappingDataTreeIdentifier(any());
+    }
+
+    @Test
+    void testOnDataTreeChangedWhenMappingOperAndAdminDidntChange() {
+        final List<DataTreeModification<Mapping>> changes = new ArrayList<>();
+        @SuppressWarnings("unchecked") final DataTreeModification<Mapping> ch = mock(DataTreeModification.class);
+        changes.add(ch);
+        @SuppressWarnings("unchecked") final DataObjectModification<Mapping> mappingObject =
+                mock(DataObjectModification.class);
+        final Mapping oldMapping = mock(Mapping.class);
+        final Mapping newMapping = mock(Mapping.class);
+
+        when(ch.getRootNode()).thenReturn(mappingObject);
+        when(mappingObject.dataBefore()).thenReturn(oldMapping);
+        when(mappingObject.dataAfter()).thenReturn(newMapping);
+        when(oldMapping.getPortAdminState()).thenReturn("InService");
+        when(oldMapping.getPortOperState()).thenReturn("InService");
+        when(newMapping.getPortAdminState()).thenReturn("InService");
+        when(newMapping.getPortOperState()).thenReturn("InService");
+
+        portMappingListenerSpy.onDataTreeChanged(changes);
+        verify(networkModelService, never()).updateOpenRoadmTopologies(anyString(), any(Mapping.class));
+    }
+
+    @Test
+    void testOnDataTreeChangedWhenMappingAdminChanged() {
+        final List<DataTreeModification<Mapping>> changes = new ArrayList<>();
+        @SuppressWarnings("unchecked") final DataTreeModification<Mapping> ch = mock(DataTreeModification.class);
+        changes.add(ch);
+        @SuppressWarnings("unchecked") final DataObjectModification<Mapping> mappingObject =
+                mock(DataObjectModification.class);
+        final Mapping oldMapping = mock(Mapping.class);
+        final Mapping newMapping = mock(Mapping.class);
+
+        when(ch.getRootNode()).thenReturn(mappingObject);
+        when(mappingObject.dataBefore()).thenReturn(oldMapping);
+        when(mappingObject.dataAfter()).thenReturn(newMapping);
+        when(oldMapping.getPortAdminState()).thenReturn("InService");
+        when(newMapping.getPortAdminState()).thenReturn("OutOfService");
+
+        portMappingListenerSpy.onDataTreeChanged(changes);
+        verify(networkModelService, times(1)).updateOpenRoadmTopologies(anyString(), any(Mapping.class));
+    }
+
+    @Test
+    void testOnDataTreeChangedWhenMappingOperChanged() {
+        final List<DataTreeModification<Mapping>> changes = new ArrayList<>();
+        @SuppressWarnings("unchecked") final DataTreeModification<Mapping> ch = mock(DataTreeModification.class);
+        changes.add(ch);
+        @SuppressWarnings("unchecked") final DataObjectModification<Mapping> mappingObject =
+                mock(DataObjectModification.class);
+        final Mapping oldMapping = mock(Mapping.class);
+        final Mapping newMapping = mock(Mapping.class);
+
+        when(ch.getRootNode()).thenReturn(mappingObject);
+        when(mappingObject.dataBefore()).thenReturn(oldMapping);
+        when(mappingObject.dataAfter()).thenReturn(newMapping);
+        when(oldMapping.getPortAdminState()).thenReturn("InService");
+        when(oldMapping.getPortOperState()).thenReturn("InService");
+        when(newMapping.getPortAdminState()).thenReturn("InService");
+        when(newMapping.getPortOperState()).thenReturn("OutOfService");
+
+        portMappingListenerSpy.onDataTreeChanged(changes);
+        verify(networkModelService, times(1)).updateOpenRoadmTopologies(anyString(), any(Mapping.class));
+    }
+}
index 762c3aca7d36ee1d082fb347eb5ec611acf7609c..d300b52cef833e7efea0645a06f83310b0b9ce3b 100644 (file)
@@ -8,9 +8,10 @@
 
 package org.opendaylight.transportpce.networkmodel.service;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.io.FileNotFoundException;
 import java.io.FileReader;
@@ -22,8 +23,8 @@ import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.mdsal.binding.api.ReadTransaction;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.InstanceIdentifiers;
@@ -35,16 +36,17 @@ import org.opendaylight.transportpce.test.AbstractTest;
 import org.opendaylight.transportpce.test.converter.DataObjectConverter;
 import org.opendaylight.transportpce.test.converter.JSONDataObjectConverter;
 import org.opendaylight.transportpce.test.utils.TopologyDataUtils;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.available.freq.map.AvailFreqMapsKey;
-import org.opendaylight.yang.gen.v1.pathdescription.stub.rev201211.PathDescription;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.stub.rev230228.PathDescription;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.available.freq.map.AvailFreqMapsKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+
 public class FrequenciesServiceTest extends AbstractTest {
     private static final Logger LOG = LoggerFactory.getLogger(FrequenciesServiceTest.class);
     private static final String OPENROADM_TOPOLOGY_FILE = "src/test/resources/openroadm-topology.xml";
@@ -54,16 +56,15 @@ public class FrequenciesServiceTest extends AbstractTest {
     private final BitSet usedBits = new BitSet(8);
     private static BitSet availableBits = new BitSet(8);
 
-    @BeforeClass
-    public static void setUp() throws InterruptedException, ExecutionException, FileNotFoundException {
+    @BeforeAll
+    static void setUp() throws InterruptedException, ExecutionException, FileNotFoundException {
         availableBits.set(0, 8, true);
         TopologyDataUtils.writeTopologyFromFileToDatastore(getDataStoreContextUtil(), OPENROADM_TOPOLOGY_FILE,
                 InstanceIdentifiers.OVERLAY_NETWORK_II);
         DataObjectConverter dataObjectConverter = JSONDataObjectConverter
                 .createWithDataStoreUtil(getDataStoreContextUtil());
         try (Reader reader = new FileReader(PATH_DESCRIPTION_FILE, StandardCharsets.UTF_8)) {
-            NormalizedNode normalizedNode = dataObjectConverter
-                    .transformIntoNormalizedNode(reader).get();
+            NormalizedNode normalizedNode = dataObjectConverter.transformIntoNormalizedNode(reader).orElseThrow();
             pathDescription = (PathDescription) getDataStoreContextUtil()
                     .getBindingDOMCodecServices().fromNormalizedNode(YangInstanceIdentifier
                             .of(PathDescription.QNAME), normalizedNode).getValue();
@@ -74,52 +75,64 @@ public class FrequenciesServiceTest extends AbstractTest {
     }
 
     @Test
-    public void allocateFrequenciesTest() throws IOException {
+    void allocateFrequenciesTest() throws IOException {
         FrequenciesService service = new FrequenciesServiceImpl(getDataBroker());
         service.allocateFrequencies(pathDescription.getAToZDirection(), pathDescription.getZToADirection());
         TerminationPoint1 terminationPoint = getNetworkTerminationPointFromDatastore("ROADM-A1-DEG2", "DEG2-CTP-TXRX");
-        assertEquals("Lambda 1 should not be available for ctp-attributes",
-                BitSet.valueOf(terminationPoint.getCtpAttributes().getAvailFreqMaps().get(availFreqMapKey)
-                .getFreqMap()).get(760, 768),usedBits);
-        assertNull("cp-attributes should be null", terminationPoint.getCpAttributes());
+        assertEquals(
+            BitSet.valueOf(terminationPoint.getCtpAttributes().getAvailFreqMaps().get(availFreqMapKey).getFreqMap())
+                .get(760, 768),
+            usedBits,
+            "Lambda 1 should not be available for ctp-attributes");
+        assertNull(terminationPoint.getCpAttributes(), "cp-attributes should be null");
         terminationPoint = getNetworkTerminationPointFromDatastore("ROADM-A1-SRG1", "SRG1-PP1-TXRX");
-        assertEquals("Lambda 1 should not be available for pp-attributes",
-                BitSet.valueOf(terminationPoint.getPpAttributes().getAvailFreqMaps().get(availFreqMapKey)
-                .getFreqMap()).get(760, 768),usedBits);
+        assertEquals(
+            BitSet.valueOf(terminationPoint.getPpAttributes().getAvailFreqMaps().get(availFreqMapKey).getFreqMap())
+                .get(760, 768),
+            usedBits,
+            "Lambda 1 should not be available for pp-attributes");
         Node1 node = getNetworkNodeFromDatastore("ROADM-A1-SRG1");
-        assertEquals("Lambda 1 should not be available for srg-attributes",
-                BitSet.valueOf(node.getSrgAttributes().getAvailFreqMaps().get(availFreqMapKey)
-                .getFreqMap()).get(760, 768),usedBits);
+        assertEquals(
+            BitSet.valueOf(node.getSrgAttributes().getAvailFreqMaps().get(availFreqMapKey).getFreqMap())
+                .get(760, 768),
+            usedBits,
+            "Lambda 1 should not be available for srg-attributes");
     }
 
     @Test
-    public void releaseFrequenciesTest() throws IOException {
+    void releaseFrequenciesTest() throws IOException {
         FrequenciesService service = new FrequenciesServiceImpl(getDataBroker());
         service.allocateFrequencies(pathDescription.getAToZDirection(), pathDescription.getZToADirection());
         service.releaseFrequencies(pathDescription.getAToZDirection(), pathDescription.getZToADirection());
         TerminationPoint1 terminationPoint = getNetworkTerminationPointFromDatastore("ROADM-A1-DEG2", "DEG2-CTP-TXRX");
-        assertEquals("Lambda 1 should be available for ctp-attributes",
-                BitSet.valueOf(terminationPoint.getCtpAttributes().getAvailFreqMaps().get(availFreqMapKey)
-                .getFreqMap()).get(760, 768),availableBits);
+        assertEquals(
+            BitSet.valueOf(terminationPoint.getCtpAttributes().getAvailFreqMaps().get(availFreqMapKey)
+                .getFreqMap()).get(760, 768),
+            availableBits,
+            "Lambda 1 should be available for ctp-attributes");
         terminationPoint = getNetworkTerminationPointFromDatastore("ROADM-A1-SRG1", "SRG1-PP1-TXRX");
-        assertEquals("Lambda 1 should be available for pp-attributes",
-                BitSet.valueOf(terminationPoint.getPpAttributes().getAvailFreqMaps().get(availFreqMapKey)
-                .getFreqMap()).get(760, 768),availableBits);
+        assertEquals(
+            BitSet.valueOf(terminationPoint.getPpAttributes().getAvailFreqMaps().get(availFreqMapKey)
+                .getFreqMap()).get(760, 768),
+            availableBits,
+            "Lambda 1 should be available for pp-attributes");
         Node1 node = getNetworkNodeFromDatastore("ROADM-A1-SRG1");
-        assertEquals("Lambda 1 should be available for srg-attributes",
-                BitSet.valueOf(node.getSrgAttributes().getAvailFreqMaps().get(availFreqMapKey)
-                .getFreqMap()).get(760, 768),availableBits);
+        assertEquals(
+            BitSet.valueOf(node.getSrgAttributes().getAvailFreqMaps().get(availFreqMapKey)
+                .getFreqMap()).get(760, 768),
+            availableBits,
+            "Lambda 1 should be available for srg-attributes");
     }
 
     private TerminationPoint1 getNetworkTerminationPointFromDatastore(String nodeId, String tpId) {
-        InstanceIdentifier<TerminationPoint1> tpIID = OpenRoadmTopology
-                .createNetworkTerminationPointIIDBuilder(nodeId, tpId).build();
+        InstanceIdentifier<TerminationPoint1> tpIID = InstanceIdentifiers
+                .createNetworkTerminationPoint1IIDBuilder(nodeId, tpId);
         try (ReadTransaction readTx = getDataBroker().newReadOnlyTransaction()) {
             Optional<TerminationPoint1> optionalTerminationPoint = readTx
                     .read(LogicalDatastoreType.CONFIGURATION, tpIID)
                     .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
             if (optionalTerminationPoint.isPresent()) {
-                return optionalTerminationPoint.get();
+                return optionalTerminationPoint.orElseThrow();
             } else {
                 return null;
             }
@@ -141,7 +154,7 @@ public class FrequenciesServiceTest extends AbstractTest {
             Optional<Node1> optionalNode = nodeReadTx.read(LogicalDatastoreType.CONFIGURATION, nodeIID)
                     .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
             if (optionalNode.isPresent()) {
-                return optionalNode.get();
+                return optionalNode.orElseThrow();
             } else {
                 LOG.error("Unable to get network node for node id {}from topology {}", nodeId,
                         NetworkUtils.OVERLAY_NETWORK_ID);
@@ -158,5 +171,4 @@ public class FrequenciesServiceTest extends AbstractTest {
             return null;
         }
     }
-
 }
index df1c8d7c18ebd7fc326e8e4a0955e654d6e3a65d..1a0baf55a78f80db806ab755fef1e037366810c6 100644 (file)
@@ -7,13 +7,14 @@
  */
 package org.opendaylight.transportpce.networkmodel.util;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
 
-import org.junit.Test;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.OpenroadmNodeVersion;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfo;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfoBuilder;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+import org.junit.jupiter.api.Test;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.OpenroadmNodeVersion;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfo;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfoBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.clli.network.rev191129.Node1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.clli.network.rev191129.Node1Builder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes;
@@ -26,7 +27,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev
 public class ClliNetworkTest {
 
     @Test
-    public void createNodeTest() {
+    void createNodeTest() {
         //prepare data test
         NodeInfo nodeInfo = computeNodeInfoBuilder().build();
         Node1 clliAugmentation = new Node1Builder()
@@ -35,18 +36,18 @@ public class ClliNetworkTest {
 
         //run test
         Node createdNode = ClliNetwork.createNode("XPDRA01", nodeInfo);
-        assertNull("SupportingNode should be null", createdNode.getSupportingNode());
-        assertEquals("Node key should be equals to NodeClliId ", new NodeKey(new NodeId("NodeClliId")),
-            createdNode.key());
-        assertEquals("Expect org.opendaylight.yang.gen.v1.http.org.openroadm.clli.network.rev191129.Node1 augmentation",
-            clliAugmentation, createdNode.augmentation(Node1.class));
+        assertNull(createdNode.getSupportingNode(), "SupportingNode should be null");
+        assertEquals(new NodeKey(new NodeId("NodeClliId")), createdNode.key(),
+            "Node key should be equals to NodeClliId");
+        assertEquals(clliAugmentation, createdNode.augmentation(Node1.class),
+            "Expect org.opendaylight.yang.gen.v1.http.org.openroadm.clli.network.rev191129.Node1 augmentation");
     }
 
     @Test
-    public void createNodeWithNullDeviceIdTest() {
+    void createNodeWithNullDeviceIdTest() {
         Node createdNode = ClliNetwork.createNode(null, computeNodeInfoBuilder().build());
-        assertNull("SupportingNode should be null", createdNode.getSupportingNode());
-        assertEquals("Node id should be equals to NodeClliId ", new NodeId("NodeClliId"), createdNode.getNodeId());
+        assertNull(createdNode.getSupportingNode(), "SupportingNode should be null");
+        assertEquals(new NodeId("NodeClliId"), createdNode.getNodeId(), "Node id should be equals to NodeClliId");
     }
 
     private NodeInfoBuilder computeNodeInfoBuilder() {
index 06492ccd336691fb180b7734a621fd5a9a84d7a4..dfb75ed674386b59fcd13999b65c4fec04472983 100644 (file)
@@ -8,18 +8,20 @@
 package org.opendaylight.transportpce.networkmodel.util;
 
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.ArrayList;
 import java.util.List;
-import org.junit.Ignore;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.transportpce.common.NetworkUtils;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.OpenroadmNodeVersion;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfo;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfoBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.OpenroadmNodeVersion;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfo;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfoBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
@@ -32,7 +34,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev
 public class OpenRoadmNetworkTest {
 
     @Test
-    public void createXpdrNodeTest() {
+    void createXpdrNodeTest() {
         NodeInfo nodeInfo = computeNodeInfo(NodeTypes.Xpdr, "nodeA");
         Node createdNode = OpenRoadmNetwork.createNode("XPDRA01", nodeInfo);
         assertEquals("XPDRA01", createdNode.getNodeId().getValue());
@@ -42,7 +44,7 @@ public class OpenRoadmNetworkTest {
     }
 
     @Test
-    public void createRdmNodeTest() {
+    void createRdmNodeTest() {
         NodeInfo nodeInfo = computeNodeInfo(NodeTypes.Rdm, "nodeA");
         Node createdNode = OpenRoadmNetwork.createNode("XPDRA01", nodeInfo);
         assertEquals("XPDRA01", createdNode.getNodeId().getValue());
@@ -52,23 +54,22 @@ public class OpenRoadmNetworkTest {
     }
 
     @Test
-    public void createNodeWithBadNodeTypeTest() {
+    void createNodeWithBadNodeTypeTest() {
         NodeInfo nodeInfo = computeNodeInfo(NodeTypes.Ila, "nodeA");
         Node createdNode = OpenRoadmNetwork.createNode("XPDRA01", nodeInfo);
         assertEquals("XPDRA01", createdNode.getNodeId().getValue());
-        assertNull("NodeType should be ROADM or XPONDER", createdNode.augmentation(Node1.class).getNodeType());
+        assertNull(createdNode.augmentation(Node1.class).getNodeType(), "NodeType should be ROADM or XPONDER");
 
         supportingNodeTest(nodeInfo.getNodeClli(), createdNode);
     }
 
-    @Ignore
     @Test
-    public void createNodeWithoutClliTest() {
+    void createNodeWithoutClliTest() {
         NodeInfo nodeInfo = computeNodeInfo(NodeTypes.Xpdr, null);
-        Node createdNode = OpenRoadmNetwork.createNode("XPDRA01", nodeInfo);
-        assertEquals("XPDRA01", createdNode.getNodeId().getValue());
-        assertEquals("XPONDER", createdNode.augmentation(Node1.class).getNodeType().getName());
-        assertEquals(0, createdNode.getSupportingNode().size());
+        Exception exception = assertThrows(NullPointerException.class, () -> {
+            OpenRoadmNetwork.createNode("XPDRA01", nodeInfo);
+        });
+        assertTrue("Supplied value may not be null".contains(exception.getMessage()));
     }
 
     private NodeInfo computeNodeInfo(NodeTypes nodeType, String clli) {
index bccb0ff2afe96f32ce0a24dea2fd3fdf060f35b9..2985a61fe6259c93bb352e4bce55db7c82c321ca 100644 (file)
@@ -15,11 +15,11 @@ import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
 import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import com.google.gson.stream.JsonReader;
 import java.io.FileReader;
@@ -31,46 +31,45 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.transportpce.networkmodel.dto.TopologyShard;
 import org.opendaylight.transportpce.networkmodel.util.test.JsonUtil;
 import org.opendaylight.transportpce.networkmodel.util.test.NetworkmodelTestUtil;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfoBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.OtnLinkType;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.Network;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfoBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.OduSwitchingPools;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.OduSwitchingPools;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODU2;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODU2e;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODU4;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.Link1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.SwitchingPools;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If100GE;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If100GEODU4;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If10GE;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If10GEODU2;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If10GEODU2e;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOCH;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOCHOTU4ODU4;
-import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.OtnLinkType;
-import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.Link1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.networks.network.node.SwitchingPools;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If100GE;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If100GEODU4;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If10GE;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If10GEODU2;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If10GEODU2e;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOCH;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOCHOTU4ODU4;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNode;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
-import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.Uint16;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.slf4j.Logger;
@@ -86,8 +85,8 @@ public class OpenRoadmOtnTopologyTest {
     public OpenRoadmOtnTopologyTest() {
         try (Reader reader = new FileReader("src/test/resources/portMapping.json", StandardCharsets.UTF_8);
                 JsonReader portMappingReader = new JsonReader(reader)) {
-            Network portMapping = (Network) JsonUtil.getInstance().getDataObjectFromJson(portMappingReader,
-                    QName.create("http://org/opendaylight/transportpce/portmapping", "2022-03-16", "network"));
+            Network portMapping = (Network) JsonUtil.getInstance()
+                .getDataObjectFromJson(portMappingReader, Network.QNAME);
             for (Nodes nodes : portMapping.nonnullNodes().values()) {
                 if (nodes.getNodeId().equals("XPDR-A1")) {
                     this.portMappingTpdr = nodes;
@@ -113,113 +112,87 @@ public class OpenRoadmOtnTopologyTest {
     }
 
     @Test
-    public void createTopologyShardForTpdrTest() {
+    void createTopologyShardForTpdrTest() {
         TopologyShard topologyShard = OpenRoadmOtnTopology.createTopologyShard(this.portMappingTpdr);
-        assertNotNull("TopologyShard should never be null", topologyShard);
-        assertEquals("Should contain a single node", 1, topologyShard.getNodes().size());
-        assertEquals("Should contain no link", 0, topologyShard.getLinks().size());
+        assertNotNull(topologyShard, "TopologyShard should never be null");
+        assertEquals(1, topologyShard.getNodes().size(), "Should contain a single node");
+        assertEquals(0, topologyShard.getLinks().size(), "Should contain no link");
         Node node = topologyShard.getNodes().get(0);
         assertEquals("XPDR-A1-XPDR1", node.getNodeId().getValue());
         // tests supporting nodes
         List<SupportingNode> supportingNodes = node.nonnullSupportingNode().values().stream()
             .sorted((sn1, sn2) -> sn1.getNetworkRef().getValue().compareTo(sn2.getNetworkRef().getValue()))
             .collect(Collectors.toList());
-        assertEquals("Should contain 3 supporting nodes", 3, supportingNodes.size());
-        assertEquals("clli-network", supportingNodes.get(0).getNetworkRef().getValue());
-        assertEquals("NodeA", supportingNodes.get(0).getNodeRef().getValue());
-        assertEquals("openroadm-network", supportingNodes.get(1).getNetworkRef().getValue());
-        assertEquals("XPDR-A1", supportingNodes.get(1).getNodeRef().getValue());
-        assertEquals("openroadm-topology", supportingNodes.get(2).getNetworkRef().getValue());
-        assertEquals("XPDR-A1-XPDR1", supportingNodes.get(2).getNodeRef().getValue());
+        assertEquals(3, supportingNodes.size(),"Should contain 3 supporting nodes");
+        assertEquals(supportingNodes.get(0).getNetworkRef().getValue(), "clli-network");
+        assertEquals(supportingNodes.get(0).getNodeRef().getValue(), "NodeA");
+        assertEquals(supportingNodes.get(1).getNetworkRef().getValue(), "openroadm-network");
+        assertEquals(supportingNodes.get(1).getNodeRef().getValue(), "XPDR-A1");
+        assertEquals(supportingNodes.get(2).getNetworkRef().getValue(), "openroadm-topology");
+        assertEquals(supportingNodes.get(2).getNodeRef().getValue(), "XPDR-A1-XPDR1");
         assertEquals(OpenroadmNodeType.TPDR, node.augmentation(Node1.class).getNodeType());
         assertEquals(
             Uint16.valueOf(1),
             node.augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.Node1.class)
-                .getXpdrAttributes()
-                .getXpdrNumber());
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.Node1.class)
+                    .getXpdrAttributes().getXpdrNumber());
         //tests list of TPs
         List<TerminationPoint> tps = node.augmentation(
                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
             .nonnullTerminationPoint().values().stream()
-            .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
-            .collect(Collectors.toList());
-        assertEquals("node should contain 4 TPs", 4, tps.size());
+                .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
+                .collect(Collectors.toList());
+        assertEquals(4, tps.size(), "node should contain 4 TPs");
         //tests client tp
         assertEquals("XPDR1-CLIENT1", tps.get(0).getTpId().getValue());
         assertEquals(
             "XPDR1-NETWORK1",
-            tps.get(0).augmentation(TerminationPoint1.class).getAssociatedConnectionMapPort());
-        assertEquals(
-            "only If100GE interface capabitily expected",
-            1,
             tps.get(0).augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
-                        .TerminationPoint1.class)
-                .getTpSupportedInterfaces()
-                .getSupportedInterfaceCapability()
-                .size());
+                        TerminationPoint1.class).getAssociatedConnectionMapTp().iterator().next().getValue());
         assertEquals(
-            If100GE.class.getName(),
-            tps.get(0).augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            1,
+            tps.get(0).augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getTpSupportedInterfaces().nonnullSupportedInterfaceCapability()
-                .values().stream().findFirst()
-                .get().getIfCapType().getName());
+                    .getTpSupportedInterfaces().getSupportedInterfaceCapability().size(),
+            "only If100GE interface capabitily expected");
         assertEquals(
-            "first TP must be of type client",
-            OpenroadmTpType.XPONDERCLIENT,
-            tps.get(0).augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
+            If100GE.VALUE,
+            tps.get(0).augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getTpType());
+                    .getTpSupportedInterfaces().nonnullSupportedInterfaceCapability().values().stream().findFirst()
+                        .orElseThrow().getIfCapType());
+        assertEquals(OpenroadmTpType.XPONDERCLIENT,tps.get(0).augmentation(TerminationPoint1.class).getTpType(),
+            "first TP must be of type client");
         //tests network tp
         assertEquals("XPDR1-NETWORK1", tps.get(2).getTpId().getValue());
+        assertEquals("XPDR1-CLIENT1", tps.get(2).augmentation(TerminationPoint1.class)
+                    .getAssociatedConnectionMapTp().iterator().next().getValue());
         assertEquals(
-            "XPDR1-CLIENT1",
-            tps.get(2).augmentation(TerminationPoint1.class).getAssociatedConnectionMapPort());
-        assertEquals(
-            "only IfOCH interface capabitily expected",
             1,
-            tps.get(2).augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            tps.get(2).augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getTpSupportedInterfaces()
-                .getSupportedInterfaceCapability()
-                .size());
+                    .getTpSupportedInterfaces().getSupportedInterfaceCapability().size());
         assertEquals(
-            IfOCH.class.getName(),
-            tps.get(2).augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            IfOCH.VALUE,
+            tps.get(2).augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getTpSupportedInterfaces()
-                .getSupportedInterfaceCapability()
-                .values().stream().findFirst()
-                .get()
-                .getIfCapType()
-                .getName());
+                    .getTpSupportedInterfaces().getSupportedInterfaceCapability().values().stream().findFirst()
+                        .orElseThrow().getIfCapType());
         assertNull(
-            "the rate should be null",
-            tps.get(2).augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
-                        .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getRate());
-        assertEquals(
-            "third TP must be of type network",
-            OpenroadmTpType.XPONDERNETWORK,
-            tps.get(2).augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1.class)
-                .getTpType());
+            tps.get(2).augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
+                    .TerminationPoint1.class)
+                .getXpdrTpPortConnectionAttributes().getRate(),
+            "the rate should be null");
+        assertEquals(OpenroadmTpType.XPONDERNETWORK,tps.get(2).augmentation(TerminationPoint1.class).getTpType(),
+            "third TP must be of type network");
     }
 
     @Test
-    public void createTopologyShardForSpdrTest() {
+    void createTopologyShardForSpdrTest() {
         TopologyShard topologyShard = OpenRoadmOtnTopology.createTopologyShard(this.portMappingSpdr);
-        assertNotNull("TopologyShard should never be null", topologyShard);
-        assertEquals("Should contain two nodes", 2, topologyShard.getNodes().size());
-        assertEquals("Should contain no link", 0, topologyShard.getLinks().size());
+        assertNotNull(topologyShard, "TopologyShard should never be null");
+        assertEquals(2, topologyShard.getNodes().size(), "Should contain two nodes");
+        assertEquals(0, topologyShard.getLinks().size(), "Should contain no link");
         List<Node> nodes = topologyShard.getNodes().stream()
             .sorted((n1, n2) -> n1.getNodeId().getValue().compareTo(n2.getNodeId().getValue()))
             .collect(Collectors.toList());
@@ -229,90 +202,88 @@ public class OpenRoadmOtnTopologyTest {
     }
 
     @Test
-    public void createOtnLinksForOTU4NormalTest() {
+    void createOtnLinksForOTU4NormalTest() {
         String nodeA = "SPDRA";
         String tpA = "XPDR1-NETWORK1";
         String nodeZ = "SPDRZ";
         String tpZ = "XPDR1-NETWORK1";
         List<Link> links = OpenRoadmOtnTopology.createOtnLinks(nodeA, tpA, nodeZ, tpZ, OtnLinkType.OTU4).getLinks();
-        assertEquals("2 OTU4 links should have been created", 2, links.size());
+        assertEquals(2, links.size(), "2 OTU4 links should have been created");
         List<Link> sortedLinks = links.stream()
             .sorted((l1, l2) -> l1.getLinkId().getValue().compareTo(l2.getLinkId().getValue()))
             .collect(Collectors.toList());
         assertEquals(
-            "name of OTU4 linkid AZ",
             "OTU4-SPDRA-XPDR1-XPDR1-NETWORK1toSPDRZ-XPDR1-XPDR1-NETWORK1",
-            sortedLinks.get(0).getLinkId().getValue());
+            sortedLinks.get(0).getLinkId().getValue(),
+            "name of OTU4 linkid AZ");
         assertEquals(
-            "name of OTU4 linkid ZA",
             "OTU4-SPDRZ-XPDR1-XPDR1-NETWORK1toSPDRA-XPDR1-XPDR1-NETWORK1",
-            sortedLinks.get(1).getLinkId().getValue());
+            sortedLinks.get(1).getLinkId().getValue(),
+            "name of OTU4 linkid ZA");
         assertEquals("SPDRA-XPDR1", sortedLinks.get(0).getSource().getSourceNode().getValue());
         assertEquals("SPDRZ-XPDR1", sortedLinks.get(0).getDestination().getDestNode().getValue());
         assertEquals("SPDRZ-XPDR1", sortedLinks.get(1).getSource().getSourceNode().getValue());
         assertEquals("SPDRA-XPDR1", sortedLinks.get(1).getDestination().getDestNode().getValue());
         assertEquals(
-            "available BW at OTU4 creation should be 100G (100000)",
             Uint32.valueOf(100000),
-            sortedLinks.get(0).augmentation(Link1.class).getAvailableBandwidth());
+            sortedLinks.get(0).augmentation(Link1.class).getAvailableBandwidth(),
+            "available BW at OTU4 creation should be 100G (100000)");
         assertEquals(
-            "used BW at OTU4 creation should be 0",
             Uint32.valueOf(0),
-            sortedLinks.get(0).augmentation(Link1.class).getUsedBandwidth());
+            sortedLinks.get(0).augmentation(Link1.class).getUsedBandwidth(),
+            "used BW at OTU4 creation should be 0");
         assertEquals(
             OpenroadmLinkType.OTNLINK,
             sortedLinks.get(0).augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1.class)
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1.class)
                 .getLinkType());
         assertEquals(
-            "opposite link must be present",
             "OTU4-SPDRZ-XPDR1-XPDR1-NETWORK1toSPDRA-XPDR1-XPDR1-NETWORK1",
             sortedLinks.get(0).augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1.class)
-                .getOppositeLink()
-                .getValue());
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1.class)
+                .getOppositeLink().getValue(),
+            "opposite link must be present");
         assertEquals(
-            "otn link type should be OTU4",
             OtnLinkType.OTU4,
             sortedLinks.get(0).augmentation(
-                    org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.Link1.class)
-                .getOtnLinkType());
+                    org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.Link1.class)
+                .getOtnLinkType(),
+            "otn link type should be OTU4");
     }
 
     @Test
-    public void createOtnLinksForNotManagedOtnlinktypeTest() {
+    void createOtnLinksForNotManagedOtnlinktypeTest() {
         String nodeA = "SPDRA";
         String tpA = "XPDR1-NETWORK1";
         String nodeZ = "SPDRZ";
         String tpZ = "XPDR1-NETWORK1";
         TopologyShard topoShard = OpenRoadmOtnTopology.createOtnLinks(nodeA, tpA, nodeZ, tpZ, OtnLinkType.ODU0);
-        assertNotNull("TopologyShard should never be null", topoShard);
-        assertNull("TopologyShard should not contain any node", topoShard.getNodes());
-        assertNull("TopologyShard should not contain any link", topoShard.getLinks());
+        assertNotNull(topoShard, "TopologyShard should never be null");
+        assertNull(topoShard.getNodes(), "TopologyShard should not contain any node");
+        assertNull(topoShard.getLinks(), "TopologyShard should not contain any link");
     }
 
     @Test
-    public void createOtnLinksForODU4NormalTest() {
+    void createOtnLinksForODU4NormalTest() {
         TopologyShard topoShard = OpenRoadmOtnTopology
             .createOtnLinks(
                 NetworkmodelTestUtil.createSuppOTNLinks(OtnLinkType.OTU4, Uint32.valueOf(100000)),
                 NetworkmodelTestUtil.createTpList(false), OtnLinkType.ODTU4);
-        assertNotNull("TopologyShard should never be null", topoShard);
-        assertNull("list of nodes should be null", topoShard.getNodes());
+        assertNotNull(topoShard, "TopologyShard should never be null");
+        assertNull(topoShard.getNodes(), "list of nodes should be null");
         List<Link> sortedLinks = topoShard.getLinks().stream()
             .sorted((l1, l2) -> l1.getLinkId().getValue().compareTo(l2.getLinkId().getValue()))
             .collect(Collectors.toList());
-        assertEquals("list of links should contain 4 links", 4, sortedLinks.size());
-        assertTrue("link 3 should be of type OTU4", sortedLinks.get(2).getLinkId().getValue().startsWith("OTU4-"));
+        assertEquals(4, sortedLinks.size(), "list of links should contain 4 links");
+        assertTrue(sortedLinks.get(2).getLinkId().getValue().startsWith("OTU4-"), "link 3 should be of type OTU4");
         assertEquals(
-            "after odu4 creation, available BW of supported OTU4 should be 0",
             Uint32.valueOf(0),
-            sortedLinks.get(2).augmentation(Link1.class).getAvailableBandwidth());
+            sortedLinks.get(2).augmentation(Link1.class).getAvailableBandwidth(),
+            "after odu4 creation, available BW of supported OTU4 should be 0");
         assertEquals(
-            "after odu4 creation, used BW of supported OTU4 should be 100 000",
             Uint32.valueOf(100000),
-            sortedLinks.get(2).augmentation(Link1.class).getUsedBandwidth());
-
+            sortedLinks.get(2).augmentation(Link1.class).getUsedBandwidth(),
+            "after odu4 creation, used BW of supported OTU4 should be 100 000");
         assertEquals(
             "ODTU4-SPDRA-XPDR1-XPDR1-NETWORK1toSPDRZ-XPDR1-XPDR1-NETWORK1",
             sortedLinks.get(0).getLinkId().getValue());
@@ -324,435 +295,363 @@ public class OpenRoadmOtnTopologyTest {
         assertEquals("SPDRZ-XPDR1", sortedLinks.get(1).getSource().getSourceNode().getValue());
         assertEquals("SPDRA-XPDR1", sortedLinks.get(1).getDestination().getDestNode().getValue());
         assertEquals(
-            "after odu4 creation, its available BW should be 100 000",
             Uint32.valueOf(100000),
-            sortedLinks.get(0).augmentation(Link1.class).getAvailableBandwidth());
+            sortedLinks.get(0).augmentation(Link1.class).getAvailableBandwidth(),
+            "after odu4 creation, its available BW should be 100 000");
         assertEquals(
-            "after odu4 creation, its used BW should be 0",
             Uint32.valueOf(0),
-            sortedLinks.get(0).augmentation(Link1.class).getUsedBandwidth());
+            sortedLinks.get(0).augmentation(Link1.class).getUsedBandwidth(),
+            "after odu4 creation, its used BW should be 0");
         assertEquals(
             OpenroadmLinkType.OTNLINK,
-            sortedLinks.get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1.class)
+            sortedLinks.get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1.class)
                 .getLinkType());
         assertEquals(
-            "opposite link must be present",
             "ODTU4-SPDRZ-XPDR1-XPDR1-NETWORK1toSPDRA-XPDR1-XPDR1-NETWORK1",
-            sortedLinks.get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1.class)
-                .getOppositeLink()
-                .getValue());
+            sortedLinks.get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1.class)
+                .getOppositeLink().getValue(),
+            "opposite link must be present");
         assertEquals(
-            "otn link type should be ODTU4",
             OtnLinkType.ODTU4,
-            sortedLinks.get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.Link1.class)
-                .getOtnLinkType());
+            sortedLinks.get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.Link1.class)
+                .getOtnLinkType(),
+            "otn link type should be ODTU4");
 
-        assertEquals("list of TPs should contain 2 updated TPs", 2, topoShard.getTps().size());
+        assertEquals(2, topoShard.getTps().size(), "list of TPs should contain 2 updated TPs");
         assertNotNull(
-            "after ODU4 creation, its termination point should contain a TsPool list",
-            topoShard.getTps().get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            topoShard.getTps().get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getTsPool());
+                .getXpdrTpPortConnectionAttributes().getTsPool(),
+            "after ODU4 creation, its termination point should contain a TsPool list");
         assertEquals(
-            "Ts pool list should be full, with 80 trib slots",
             80,
-            topoShard.getTps().get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            topoShard.getTps().get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getTsPool()
-                .size());
+                .getXpdrTpPortConnectionAttributes().getTsPool().size(),
+            "Ts pool list should be full, with 80 trib slots");
         assertNotNull(
-            "after ODU4 creation, its termination point should contain a TpnPool list",
-            topoShard.getTps().get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            topoShard.getTps().get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getOdtuTpnPool().values().stream().findFirst()
-                .get()
-                .getTpnPool());
+                .getXpdrTpPortConnectionAttributes().getOdtuTpnPool().values().stream().findFirst().orElseThrow()
+                .getTpnPool(),
+            "after ODU4 creation, its termination point should contain a TpnPool list");
         assertEquals(
-            "Tpn pool list should be full, with 80 trib ports",
             80,
-            topoShard.getTps().get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            topoShard.getTps().get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getOdtuTpnPool().values().stream().findFirst()
-                .get()
-                .getTpnPool()
-                .size());
+                .getXpdrTpPortConnectionAttributes().getOdtuTpnPool().values().stream().findFirst().orElseThrow()
+                .getTpnPool().size(),
+            "Tpn pool list should be full, with 80 trib ports");
     }
 
     @Test
-    public void createOtnLinksForODU4WhenOTU4HaveBadBWParamsTest() {
+    void createOtnLinksForODU4WhenOTU4HaveBadBWParamsTest() {
         List<Link> otu4Links = NetworkmodelTestUtil.createSuppOTNLinks(OtnLinkType.OTU4, Uint32.valueOf(100000));
         List<Link> otu4LinksWithBadBWParam = new ArrayList<>();
         for (Link link : otu4Links) {
             otu4LinksWithBadBWParam.add(new LinkBuilder(link).removeAugmentation(Link1.class).build());
         }
-        TopologyShard topoShard =
-            OpenRoadmOtnTopology.createOtnLinks(otu4LinksWithBadBWParam, NetworkmodelTestUtil.createTpList(false),
+        TopologyShard topoShard = OpenRoadmOtnTopology.createOtnLinks(
+                otu4LinksWithBadBWParam,
+                NetworkmodelTestUtil.createTpList(false),
                 OtnLinkType.OTU4);
-        assertNotNull("TopologyShard should never be null", topoShard);
-        assertNull("list of nodes should be null", topoShard.getNodes());
-        assertNull("list of links should be null", topoShard.getLinks());
-        assertNull("list of tps should be null", topoShard.getTps());
+        assertNotNull(topoShard, "TopologyShard should never be null");
+        assertNull(topoShard.getNodes(), "list of nodes should be null");
+        assertNull(topoShard.getLinks(), "list of links should be null");
+        assertNull(topoShard.getTps(), "list of tps should be null");
 
         otu4LinksWithBadBWParam.clear();
-        topoShard =
-            OpenRoadmOtnTopology.createOtnLinks(
-                    NetworkmodelTestUtil.createSuppOTNLinks(OtnLinkType.OTU4, Uint32.valueOf(99000)),
-                    NetworkmodelTestUtil.createTpList(false), OtnLinkType.OTU4);
-        assertNull("list of nodes should be null", topoShard.getNodes());
-        assertNull("list of links should be null", topoShard.getLinks());
-        assertNull("list of tps should be null", topoShard.getTps());
+        topoShard = OpenRoadmOtnTopology.createOtnLinks(
+                NetworkmodelTestUtil.createSuppOTNLinks(OtnLinkType.OTU4, Uint32.valueOf(99000)),
+                NetworkmodelTestUtil.createTpList(false),
+                OtnLinkType.OTU4);
+        assertNull(topoShard.getNodes(), "list of nodes should be null");
+        assertNull(topoShard.getLinks(), "list of links should be null");
+        assertNull(topoShard.getTps(), "list of tps should be null");
     }
 
     @Test
-    public void deleteOtnLinksForODU4NormalTest() {
-        TopologyShard topoShard =
-            OpenRoadmOtnTopology.deleteOtnLinks(
+    void deleteOtnLinksForODU4NormalTest() {
+        TopologyShard topoShard = OpenRoadmOtnTopology.deleteOtnLinks(
                     NetworkmodelTestUtil.createSuppOTNLinks(OtnLinkType.OTU4, Uint32.valueOf(0)),
-                    NetworkmodelTestUtil.createTpList(true), OtnLinkType.OTU4);
-        assertNotNull("TopologyShard should never be null", topoShard);
-        assertEquals("list of links should contain 2 links", 2, topoShard.getLinks().size());
+                    NetworkmodelTestUtil.createTpList(true),
+                    OtnLinkType.OTU4);
+        assertNotNull(topoShard, "TopologyShard should never be null");
+        assertEquals(2, topoShard.getLinks().size(), "list of links should contain 2 links");
         assertEquals(
-            "after ODU4 deletion, available BW of supported OTU4 should be 100 000",
             Uint32.valueOf(100000),
-            topoShard.getLinks().get(0).augmentation(Link1.class).getAvailableBandwidth());
+            topoShard.getLinks().get(0).augmentation(Link1.class).getAvailableBandwidth(),
+            "after ODU4 deletion, available BW of supported OTU4 should be 100 000");
         assertEquals(
-            "after ODU4 deletion, used BW of supported OTU4 should be 0",
             Uint32.valueOf(0),
-            topoShard.getLinks().get(0).augmentation(Link1.class).getUsedBandwidth());
+            topoShard.getLinks().get(0).augmentation(Link1.class).getUsedBandwidth(),
+            "after ODU4 deletion, used BW of supported OTU4 should be 0");
 
-        assertEquals("list of TPs should contain 2 updated TPs", 2, topoShard.getTps().size());
+        assertEquals(2, topoShard.getTps().size(), "list of TPs should contain 2 updated TPs");
         assertNull(
-            "after ODU4 deletion, its termination points should not contain any TsPool list",
-            topoShard.getTps().get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            topoShard.getTps().get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getTsPool());
+                .getXpdrTpPortConnectionAttributes().getTsPool(),
+            "after ODU4 deletion, its termination points should not contain any TsPool list");
         assertNull(
-            "after ODU4 deletion, its termination points should not contain any TpnPool list",
-            topoShard.getTps().get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            topoShard.getTps().get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getOdtuTpnPool());
+                .getXpdrTpPortConnectionAttributes().getOdtuTpnPool(),
+            "after ODU4 deletion, its termination points should not contain any TpnPool list");
     }
 
     @Test
-    public void deleteOtnLinksForODU4WhenOTU4HaveBadBWParamsTest() {
+    void deleteOtnLinksForODU4WhenOTU4HaveBadBWParamsTest() {
         List<Link> otu4Links = NetworkmodelTestUtil.createSuppOTNLinks(OtnLinkType.OTU4, Uint32.valueOf(0));
         List<Link> otu4LinksWithBadBWParam = new ArrayList<>();
         for (Link link : otu4Links) {
             otu4LinksWithBadBWParam.add(new LinkBuilder(link).removeAugmentation(Link1.class).build());
         }
-        TopologyShard topoShard =
-            OpenRoadmOtnTopology.deleteOtnLinks(otu4LinksWithBadBWParam, NetworkmodelTestUtil.createTpList(true),
+        TopologyShard topoShard = OpenRoadmOtnTopology.deleteOtnLinks(
+                otu4LinksWithBadBWParam,
+                NetworkmodelTestUtil.createTpList(true),
                 OtnLinkType.OTU4);
-        assertNotNull("TopologyShard should never be null", topoShard);
-        assertNull("list of nodes should be null", topoShard.getNodes());
-        assertNull("list of links should be null", topoShard.getLinks());
-        assertNull("list of tps should be null", topoShard.getTps());
+        assertNotNull(topoShard, "TopologyShard should never be null");
+        assertNull(topoShard.getNodes(), "list of nodes should be null");
+        assertNull(topoShard.getLinks(), "list of links should be null");
+        assertNull(topoShard.getTps(), "list of tps should be null");
     }
 
     @Test
-    public void updateOtnLinksFor10GTest() {
+    void updateOtnLinksFor10GTest() {
         // tests update for 10G creation
-        TopologyShard topoShard =
-            OpenRoadmOtnTopology.updateOtnLinks(
+        TopologyShard topoShard = OpenRoadmOtnTopology.updateOtnLinks(
                     NetworkmodelTestUtil.createSuppOTNLinks(OtnLinkType.ODTU4, Uint32.valueOf(100000)),
                     NetworkmodelTestUtil.createTpList(true),
                     Uint32.valueOf(10), (short)1, (short)1, (short)8, false);
-        assertNotNull("TopologyShard should never be null", topoShard);
-        assertNull("list of nodes should be null", topoShard.getNodes());
+        assertNotNull(topoShard, "TopologyShard should never be null");
+        assertNull(topoShard.getNodes(), "list of nodes should be null");
         List<Link> sortedLinks = topoShard.getLinks().stream()
             .sorted((l1, l2) -> l1.getLinkId().getValue().compareTo(l2.getLinkId().getValue()))
             .collect(Collectors.toList());
-        assertEquals("list of links should contain 2 links", 2, sortedLinks.size());
+        assertEquals(2, sortedLinks.size(), "list of links should contain 2 links");
         assertTrue(sortedLinks.get(0).getLinkId().getValue().startsWith("ODTU4-"));
         assertEquals(
-            "after 10G creation, available BW of supported ODU4 should be 90000",
             Uint32.valueOf(90000),
-            sortedLinks.get(0).augmentation(Link1.class).getAvailableBandwidth());
+            sortedLinks.get(0).augmentation(Link1.class).getAvailableBandwidth(),
+            "after 10G creation, available BW of supported ODU4 should be 90000");
         assertEquals(
-            "after 10G creation, used BW of supported ODU4 should be 10000",
             Uint32.valueOf(10000),
-            sortedLinks.get(0).augmentation(Link1.class).getUsedBandwidth());
+            sortedLinks.get(0).augmentation(Link1.class).getUsedBandwidth(),
+            "after 10G creation, used BW of supported ODU4 should be 10000");
 
         assertEquals(
-            "after 10G creation, 8 (over 80) trib slot should be occupied",
             72,
-            topoShard.getTps().get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            topoShard.getTps().get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getTsPool()
-                .size());
+                .getXpdrTpPortConnectionAttributes().getTsPool().size(),
+            "after 10G creation, 8 (over 80) trib slot should be occupied");
         assertThat(
             "trib slot 1-8 should no longer be present in Trib slot list",
-            topoShard.getTps().get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            topoShard.getTps().get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getTsPool(),
+                .getXpdrTpPortConnectionAttributes().getTsPool(),
             not(hasItems(Uint16.valueOf(1), Uint16.valueOf(8))));
         assertThat(
             "trib slot 9 should always be present in trib slot list",
-            topoShard.getTps().get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            topoShard.getTps().get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getTsPool(),
+                .getXpdrTpPortConnectionAttributes().getTsPool(),
             hasItem(Uint16.valueOf(9)));
         assertEquals(
-            "after 10G creation, 1 (over 80) trib port should be occupied",
             79,
-            topoShard.getTps().get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            topoShard.getTps().get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getOdtuTpnPool().values().stream().findFirst()
-                .get()
-                .getTpnPool()
-                .size());
+                .getXpdrTpPortConnectionAttributes().getOdtuTpnPool().values().stream().findFirst().orElseThrow()
+                .getTpnPool().size(),
+            "after 10G creation, 1 (over 80) trib port should be occupied");
         assertThat(
             "trib port 1 should no longer be present",
-            topoShard.getTps().get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            topoShard.getTps().get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getOdtuTpnPool().values().stream().findFirst()
-                .get()
+                .getXpdrTpPortConnectionAttributes().getOdtuTpnPool().values().stream().findFirst().orElseThrow()
                 .getTpnPool(),
             not(hasItem(Uint16.valueOf(1))));
 
         // tests update for 10G deletion
         sortedLinks.clear();
         topoShard = OpenRoadmOtnTopology.updateOtnLinks(topoShard.getLinks(), topoShard.getTps(), Uint32.valueOf(10),
-            (short)1, (short)1, (short)8, true);
+                (short)1, (short)1, (short)8, true);
         sortedLinks = topoShard.getLinks().stream()
             .sorted((l1, l2) -> l1.getLinkId().getValue().compareTo(l2.getLinkId().getValue()))
             .collect(Collectors.toList());
-        assertEquals("list of links should contain 2 links", 2, sortedLinks.size());
+        assertEquals(2, sortedLinks.size(), "list of links should contain 2 links");
         assertTrue(sortedLinks.get(0).getLinkId().getValue().startsWith("ODTU4-"));
         assertEquals(
-            "after 10G deletion, available BW of supported ODU4 should be 100 000",
             Uint32.valueOf(100000),
-            sortedLinks.get(0).augmentation(Link1.class).getAvailableBandwidth());
+            sortedLinks.get(0).augmentation(Link1.class).getAvailableBandwidth(),
+            "after 10G deletion, available BW of supported ODU4 should be 100 000");
         assertEquals(
-            "after 10G deletion, used BW of supported ODU4 should be 0",
             Uint32.valueOf(0),
-            sortedLinks.get(0).augmentation(Link1.class).getUsedBandwidth());
+            sortedLinks.get(0).augmentation(Link1.class).getUsedBandwidth(),
+            "after 10G deletion, used BW of supported ODU4 should be 0");
 
         assertEquals(
-            "after 10G deletion, trib slot list should be full",
             80,
-            topoShard.getTps().get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            topoShard.getTps().get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getTsPool()
-                .size());
+                .getXpdrTpPortConnectionAttributes().getTsPool().size(),
+            "after 10G deletion, trib slot list should be full");
         assertThat(
             "after 10G deletion, trib slot list should contain items 1-8",
-            topoShard.getTps().get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            topoShard.getTps().get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getTsPool(),
+                .getXpdrTpPortConnectionAttributes().getTsPool(),
             hasItems(Uint16.valueOf(1), Uint16.valueOf(8), Uint16.valueOf(9)));
         assertEquals(
-            "after 10G deletion, trib port list should be full",
                 80,
-                topoShard.getTps().get(0)
-                    .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
-                        .TerminationPoint1.class)
-                    .getXpdrTpPortConnectionAttributes()
-                    .getOdtuTpnPool().values().stream().findFirst()
-                    .get()
-                    .getTpnPool()
-                    .size());
+                topoShard.getTps().get(0).augmentation(
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
+                            .TerminationPoint1.class)
+                    .getXpdrTpPortConnectionAttributes().getOdtuTpnPool().values().stream().findFirst().orElseThrow()
+                    .getTpnPool().size(),
+                "after 10G deletion, trib port list should be full");
         assertThat(
             "after 10G deletion, trib port list should contain items 1",
-            topoShard.getTps().get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            topoShard.getTps().get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getOdtuTpnPool().values().stream().findFirst()
-                .get()
+                .getXpdrTpPortConnectionAttributes().getOdtuTpnPool().values().stream().findFirst().orElseThrow()
                 .getTpnPool(),
             hasItem(Uint16.valueOf(1)));
     }
 
     @Test
-    public void updateOtnLinksFor1GCreationTest() {
+    void updateOtnLinksFor1GCreationTest() {
         // tests update for 1G creation
-        TopologyShard topoShard =
-            OpenRoadmOtnTopology.updateOtnLinks(
+        TopologyShard topoShard = OpenRoadmOtnTopology.updateOtnLinks(
                     NetworkmodelTestUtil.createSuppOTNLinks(OtnLinkType.ODTU4, Uint32.valueOf(100000)),
                     NetworkmodelTestUtil.createTpList(true),
                     Uint32.valueOf(1), (short)1, (short)1, (short)1, false);
-        assertNotNull("TopologyShard should never be null", topoShard);
-        assertNull("list of nodes should be null", topoShard.getNodes());
+        assertNotNull(topoShard, "TopologyShard should never be null");
+        assertNull(topoShard.getNodes(), "list of nodes should be null");
         List<Link> sortedLinks = topoShard.getLinks().stream()
             .sorted((l1, l2) -> l1.getLinkId().getValue().compareTo(l2.getLinkId().getValue()))
             .collect(Collectors.toList());
-        assertEquals("list of links should contain 2 links", 2, sortedLinks.size());
+        assertEquals(2, sortedLinks.size(), "list of links should contain 2 links");
         assertTrue(sortedLinks.get(0).getLinkId().getValue().startsWith("ODTU4-"));
         assertEquals(
-            "after 1G creation, available BW of supported ODU4 should be 99000",
             Uint32.valueOf(99000),
-            sortedLinks.get(0).augmentation(Link1.class).getAvailableBandwidth());
+            sortedLinks.get(0).augmentation(Link1.class).getAvailableBandwidth(),
+            "after 1G creation, available BW of supported ODU4 should be 99000");
         assertEquals(
-            "after 1G creation, used BW of supported ODU4 should be 1000",
             Uint32.valueOf(1000),
-            sortedLinks.get(0).augmentation(Link1.class).getUsedBandwidth());
+            sortedLinks.get(0).augmentation(Link1.class).getUsedBandwidth(),
+            "after 1G creation, used BW of supported ODU4 should be 1000");
 
         assertEquals(
-            "after 1G creation, 1 (over 80) trib slot should be occupied",
             79,
-            topoShard.getTps().get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            topoShard.getTps().get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getTsPool()
-                .size());
+                .getXpdrTpPortConnectionAttributes().getTsPool().size(),
+            "after 1G creation, 1 (over 80) trib slot should be occupied");
         assertThat(
             "trib slot 1 should no longer be present in Trib slot list",
-            topoShard.getTps().get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            topoShard.getTps().get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getTsPool(),
+                .getXpdrTpPortConnectionAttributes().getTsPool(),
             not(hasItem(Uint16.valueOf(1))));
         assertThat(
             "trib slot 2 should always be present in Trib slot list",
-            topoShard.getTps().get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            topoShard.getTps().get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
                 .getXpdrTpPortConnectionAttributes().getTsPool(),
             hasItem(Uint16.valueOf(2)));
         assertEquals(
-            "after 1G creation, 1 (over 80) trib port should be occupied",
             79,
-            topoShard.getTps().get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            topoShard.getTps().get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getOdtuTpnPool().values().stream().findFirst()
-                .get()
-                .getTpnPool()
-                .size());
+                .getXpdrTpPortConnectionAttributes().getOdtuTpnPool().values().stream().findFirst().orElseThrow()
+                .getTpnPool().size(),
+            "after 1G creation, 1 (over 80) trib port should be occupied");
         assertThat(
             "trib port 1 should no longer be present in Trib port list",
-            topoShard.getTps().get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            topoShard.getTps().get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getOdtuTpnPool().values().stream().findFirst()
-                .get()
+                .getXpdrTpPortConnectionAttributes().getOdtuTpnPool().values().stream().findFirst().orElseThrow()
                 .getTpnPool(),
             not(hasItem(Uint16.valueOf(1))));
 
         // tests update for 1G deletion
         sortedLinks.clear();
-        topoShard =
-            OpenRoadmOtnTopology.updateOtnLinks(
+        topoShard = OpenRoadmOtnTopology.updateOtnLinks(
                     topoShard.getLinks(),
                     topoShard.getTps(),
                     Uint32.valueOf(1), (short)1, (short)1, (short)1, true);
         sortedLinks = topoShard.getLinks().stream()
             .sorted((l1, l2) -> l1.getLinkId().getValue().compareTo(l2.getLinkId().getValue()))
             .collect(Collectors.toList());
-        assertEquals("list of links should contain 2 links", 2, sortedLinks.size());
+        assertEquals(2, sortedLinks.size(), "list of links should contain 2 links");
         assertTrue(sortedLinks.get(0).getLinkId().getValue().startsWith("ODTU4-"));
         assertEquals(
-            "after 1G deletion, available BW of supported ODU4 should be 100 000",
             Uint32.valueOf(100000),
-            sortedLinks.get(0).augmentation(Link1.class).getAvailableBandwidth());
+            sortedLinks.get(0).augmentation(Link1.class).getAvailableBandwidth(),
+            "after 1G deletion, available BW of supported ODU4 should be 100 000");
         assertEquals(
-            "after 1G deletion, used BW of supported ODU4 should be 0",
             Uint32.valueOf(0),
-            sortedLinks.get(0).augmentation(Link1.class).getUsedBandwidth());
+            sortedLinks.get(0).augmentation(Link1.class).getUsedBandwidth(),
+            "after 1G deletion, used BW of supported ODU4 should be 0");
 
         assertEquals(
-            "after 1G deletion, trib slot list should be full",
             80,
-            topoShard.getTps().get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            topoShard.getTps().get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getTsPool()
-                .size());
+                .getXpdrTpPortConnectionAttributes().getTsPool().size(),
+            "after 1G deletion, trib slot list should be full");
         assertThat(
             "after 1G deletion, trib slot list should contain items 1 and 2",
-            topoShard.getTps().get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
-                    .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getTsPool(),
+            topoShard.getTps().get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
+                        .TerminationPoint1.class)
+                .getXpdrTpPortConnectionAttributes().getTsPool(),
             hasItems(Uint16.valueOf(1), Uint16.valueOf(2)));
         assertEquals(
-            "after 1G deletion, trib port list should be full",
             80,
-            topoShard.getTps().get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            topoShard.getTps().get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getOdtuTpnPool().values().stream().findFirst()
-                .get()
-                .getTpnPool()
-                .size());
+                .getXpdrTpPortConnectionAttributes().getOdtuTpnPool().values().stream().findFirst().orElseThrow()
+                .getTpnPool().size(),
+            "after 1G deletion, trib port list should be full");
         assertThat(
             "after 1G deletion, trib port list should contain items 1",
-            topoShard.getTps().get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            topoShard.getTps().get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getOdtuTpnPool().values().stream().findFirst()
-                .get()
+                .getXpdrTpPortConnectionAttributes().getOdtuTpnPool().values().stream().findFirst().orElseThrow()
                 .getTpnPool(),
             hasItem(Uint16.valueOf(1)));
     }
 
     @Test
-    public void updateOtnLinksForODU4WhenBWParamsNotPresentTest() {
+    void updateOtnLinksForODU4WhenBWParamsNotPresentTest() {
         List<Link> odu4Links = NetworkmodelTestUtil.createSuppOTNLinks(OtnLinkType.ODTU4, Uint32.valueOf(100000));
         List<Link> odu4LinksWithBadBWParam = new ArrayList<>();
         for (Link link : odu4Links) {
@@ -763,30 +662,30 @@ public class OpenRoadmOtnTopologyTest {
                     odu4LinksWithBadBWParam,
                     NetworkmodelTestUtil.createTpList(true),
                     Uint32.valueOf(1), (short)1, (short)1, (short)10, false);
-        assertNotNull("TopologyShard should never be null", topoShard);
-        assertNull("list of nodes should be null", topoShard.getNodes());
-        assertNull("list of links should be null", topoShard.getLinks());
-        assertNull("list of tps should be null", topoShard.getTps());
+        assertNotNull(topoShard, "TopologyShard should never be null");
+        assertNull(topoShard.getNodes(), "list of nodes should be null");
+        assertNull(topoShard.getLinks(), "list of links should be null");
+        assertNull(topoShard.getTps(), "list of tps should be null");
     }
 
     @Test
-    public void updateOtnLinksForODU4WhenAvailBWNotSufficientTest() {
-        List<Link> odu4LinksWithBadBWParam = NetworkmodelTestUtil
-            .createSuppOTNLinks(OtnLinkType.ODTU4, Uint32.valueOf(8000));
-        TopologyShard topoShard =
-            OpenRoadmOtnTopology.updateOtnLinks(
+    void updateOtnLinksForODU4WhenAvailBWNotSufficientTest() {
+        List<Link> odu4LinksWithBadBWParam = NetworkmodelTestUtil.createSuppOTNLinks(
+                OtnLinkType.ODTU4,
+                Uint32.valueOf(8000));
+        TopologyShard topoShard = OpenRoadmOtnTopology.updateOtnLinks(
                     odu4LinksWithBadBWParam,
                     NetworkmodelTestUtil.createTpList(true),
                     Uint32.valueOf(10), (short)1, (short)1, (short)10, false);
-        assertNotNull("TopologyShard should never be null", topoShard);
-        assertNull("list of nodes should be null", topoShard.getNodes());
-        assertNull("list of links should be null", topoShard.getLinks());
-        assertNull("list of tps should be null", topoShard.getTps());
+        assertNotNull(topoShard, "TopologyShard should never be null");
+        assertNull(topoShard.getNodes(), "list of nodes should be null");
+        assertNull(topoShard.getLinks(), "list of links should be null");
+        assertNull(topoShard.getTps(), "list of tps should be null");
     }
 
     private void checkSpdrNode(Node node) {
-        Uint16 xpdrNb = node
-            .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.Node1.class)
+        Uint16 xpdrNb = node.augmentation(
+                org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.Node1.class)
             .getXpdrAttributes().getXpdrNumber();
         assertEquals("SPDR-SA1-XPDR" + xpdrNb, node.getNodeId().getValue());
         if (xpdrNb.equals(Uint16.valueOf(1))) {
@@ -798,7 +697,7 @@ public class OpenRoadmOtnTopologyTest {
         List<SupportingNode> supportingNodes = node.nonnullSupportingNode().values().stream()
             .sorted((sn1, sn2) -> sn1.getNetworkRef().getValue().compareTo(sn2.getNetworkRef().getValue()))
             .collect(Collectors.toList());
-        assertEquals("Should contain 3 supporting nodes", 3, supportingNodes.size());
+        assertEquals(3, supportingNodes.size(), "Should contain 3 supporting nodes");
         assertEquals("clli-network", supportingNodes.get(0).getNetworkRef().getValue());
         assertEquals("NodeSA", supportingNodes.get(0).getNodeRef().getValue());
         assertEquals("openroadm-network", supportingNodes.get(1).getNetworkRef().getValue());
@@ -808,7 +707,7 @@ public class OpenRoadmOtnTopologyTest {
         checkSpdrSwitchingPools(
             xpdrNb,
             node.augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.Node1.class)
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.Node1.class)
                 .getSwitchingPools());
         List<TerminationPoint> tpList = node.augmentation(
                 org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
@@ -821,36 +720,31 @@ public class OpenRoadmOtnTopologyTest {
     private void checkSpdrSwitchingPools(Uint16 xpdrNb, SwitchingPools sp) {
         List<OduSwitchingPools> oduSwitchingPools = new ArrayList<>(sp.nonnullOduSwitchingPools().values());
         assertEquals(
-            "switching-pools augmentation should contain a single odu-switching-pools",
             1,
-            oduSwitchingPools.size());
+            oduSwitchingPools.size(),
+            "switching-pools augmentation should contain a single odu-switching-pools");
         assertEquals(
-            "switching-pool-number should be 1",
             Uint16.valueOf(1),
-            oduSwitchingPools.get(0).getSwitchingPoolNumber());
+            oduSwitchingPools.get(0).getSwitchingPoolNumber(),
+            "switching-pool-number should be 1");
         assertEquals(
-            "switching-pool-type should be non-blocking",
             "non-blocking",
-            oduSwitchingPools.get(0).getSwitchingPoolType().getName());
+            oduSwitchingPools.get(0).getSwitchingPoolType().getName(),
+            "switching-pool-type should be non-blocking");
 
         List<NonBlockingList> nonBlockingList =
                 new ArrayList<>(oduSwitchingPools.get(0).nonnullNonBlockingList().values());
         if (xpdrNb.equals(Uint16.valueOf(1))) {
-            assertEquals(
-                "Mux should contain 4 non blocking list",
-                4,
-                nonBlockingList.size());
-            assertEquals(
-                Uint16.valueOf(1),
-                nonBlockingList.get(0).getNblNumber());
+            assertEquals(4, nonBlockingList.size(), "Mux should contain 4 non blocking list");
+            assertEquals(Uint16.valueOf(1), nonBlockingList.get(0).getNblNumber());
             List<NonBlockingList> nblList = oduSwitchingPools.get(0).nonnullNonBlockingList().values().stream()
                 .sorted((nbl1, nbl2) -> nbl1.getNblNumber().compareTo(nbl2.getNblNumber()))
                 .collect(Collectors.toList());
             for (NonBlockingList nbl : nblList) {
                 assertEquals(
-                    "for a 10G mux, interconnect BW should be 10G",
                     Uint32.valueOf(10),
-                    nbl.getAvailableInterconnectBandwidth());
+                    nbl.getAvailableInterconnectBandwidth(),
+                    "for a 10G mux, interconnect BW should be 10G");
                 assertEquals(Uint32.valueOf(1000000000), nbl.getInterconnectBandwidthUnit());
                 assertThat(
                     "for a 10G mux, non blocking list should contain 2 entries (client + network ports)",
@@ -859,17 +753,11 @@ public class OpenRoadmOtnTopologyTest {
                 String nb = nbl.getNblNumber().toString();
                 assertThat(
                     nbl.getTpList(),
-                    containsInAnyOrder(new TpId("XPDR1-NETWORK1"),
-                        new TpId("XPDR1-CLIENT" + nb)));
+                    containsInAnyOrder(new TpId("XPDR1-NETWORK1"), new TpId("XPDR1-CLIENT" + nb)));
             }
         } else if (xpdrNb.equals(Uint16.valueOf(2))) {
-            assertEquals(
-                "Switch should contain a single non blocking list",
-                1,
-                nonBlockingList.size());
-            assertEquals(
-                Uint16.valueOf(1),
-                nonBlockingList.get(0).getNblNumber());
+            assertEquals(1, nonBlockingList.size(), "Switch should contain a single non blocking list");
+            assertEquals(Uint16.valueOf(1), nonBlockingList.get(0).getNblNumber());
             assertThat(
                 "for a 100G Switch, non blocking list should contain 8 entries (4 clients + 4 network ports)",
                 nonBlockingList.get(0).getTpList(),
@@ -886,162 +774,130 @@ public class OpenRoadmOtnTopologyTest {
     private void checkSpdrTpList(Uint16 xpdrNb, List<TerminationPoint> tpList) {
         LOG.info("tpList = {}", tpList);
         assertEquals(
-            "only IfOCHOTU4ODU4 interface capabitily expected",
-            IfOCHOTU4ODU4.class,
-            tpList.get(4)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            IfOCHOTU4ODU4.VALUE,
+            tpList.get(4).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getTpSupportedInterfaces()
-                .getSupportedInterfaceCapability().values().stream().findFirst()
-                .get()
-                .getIfCapType());
+                .getTpSupportedInterfaces().getSupportedInterfaceCapability().values().stream().findFirst()
+                .orElseThrow().getIfCapType(),
+            "only IfOCHOTU4ODU4 interface capabitily expected");
         assertEquals(
-            "the rate should be ODU4",
-            ODU4.class,
-            tpList.get(4)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            ODU4.VALUE,
+            tpList.get(4).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                         .TerminationPoint1.class)
-                .getXpdrTpPortConnectionAttributes()
-                .getRate());
+                .getXpdrTpPortConnectionAttributes().getRate(),
+            "the rate should be ODU4");
         assertEquals(
             "openroadm-topology",
-            tpList.get(4).getSupportingTerminationPoint().values().stream().findFirst()
-            .get().getNetworkRef().getValue());
+            tpList.get(4).getSupportingTerminationPoint().values().stream().findFirst().orElseThrow().getNetworkRef()
+                .getValue());
         assertEquals(
             "SPDR-SA1-XPDR" + xpdrNb,
-            tpList.get(4).getSupportingTerminationPoint().values().stream().findFirst()
-            .get().getNodeRef().getValue());
+            tpList.get(4).getSupportingTerminationPoint().values().stream().findFirst().orElseThrow().getNodeRef()
+                .getValue());
         assertEquals(
             "XPDR" + xpdrNb + "-NETWORK1",
-            tpList.get(4).getSupportingTerminationPoint().values().stream().findFirst()
-            .get().getTpRef().getValue());
+            tpList.get(4).getSupportingTerminationPoint().values().stream().findFirst().orElseThrow().getTpRef()
+                .getValue());
         if (xpdrNb.equals(Uint16.valueOf(1))) {
-            assertEquals("should contain 5 TPs", 5, tpList.size());
+            assertEquals(5, tpList.size(), "should contain 5 TPs");
             assertEquals("XPDR1-CLIENT1", tpList.get(0).getTpId().getValue());
             assertEquals("XPDR1-CLIENT2", tpList.get(1).getTpId().getValue());
             assertEquals("XPDR1-NETWORK1", tpList.get(4).getTpId().getValue());
             assertEquals(
-                "supported interface capability of tp-id XPDR1-CLIENT2 should contain 2 if-cap-type",
                 2,
-                tpList.get(1)
-                    .augmentation(
-                        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+                tpList.get(1).augmentation(
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                             .TerminationPoint1.class)
-                    .getTpSupportedInterfaces()
-                    .getSupportedInterfaceCapability().values().size());
+                    .getTpSupportedInterfaces().getSupportedInterfaceCapability().values().size(),
+                "supported interface capability of tp-id XPDR1-CLIENT2 should contain 2 if-cap-type");
             assertEquals(
-                "supported interface capability of tp-id XPDR1-CLIENT3 should contain 3 if-cap-type",
                 3,
-                tpList.get(2)
-                    .augmentation(
-                        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+                tpList.get(2).augmentation(
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                             .TerminationPoint1.class)
-                    .getTpSupportedInterfaces()
-                    .getSupportedInterfaceCapability().values().size());
-            List<SupportedInterfaceCapability> sicListClient1 = tpList.get(0)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
-                    .TerminationPoint1.class)
-                .getTpSupportedInterfaces()
-                .getSupportedInterfaceCapability().values().stream().collect(Collectors.toList());
+                    .getTpSupportedInterfaces().getSupportedInterfaceCapability().values().size(),
+                "supported interface capability of tp-id XPDR1-CLIENT3 should contain 3 if-cap-type");
+            List<SupportedInterfaceCapability> sicListClient1 = tpList.get(0).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
+                        .TerminationPoint1.class)
+                .getTpSupportedInterfaces().getSupportedInterfaceCapability().values().stream()
+                .collect(Collectors.toList());
             for (SupportedInterfaceCapability supportedInterfaceCapability : sicListClient1) {
                 assertThat("tp should have 2 if-cap-type: if-10GE-ODU2e, if-10GE-ODU2",
                     String.valueOf(supportedInterfaceCapability.getIfCapType()),
-                    either(containsString(String.valueOf(If10GEODU2e.class)))
-                    .or(containsString(String.valueOf(If10GEODU2.class))));
+                    either(containsString(String.valueOf(If10GEODU2e.VALUE)))
+                        .or(containsString(String.valueOf(If10GEODU2.VALUE))));
             }
-            List<SupportedInterfaceCapability> sicListClient3 = tpList.get(3)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
-                    .TerminationPoint1.class)
-                .getTpSupportedInterfaces()
-                .getSupportedInterfaceCapability().values().stream().collect(Collectors.toList());
+            List<SupportedInterfaceCapability> sicListClient3 = tpList.get(3).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
+                        .TerminationPoint1.class)
+                .getTpSupportedInterfaces().getSupportedInterfaceCapability().values().stream()
+                .collect(Collectors.toList());
             for (SupportedInterfaceCapability supportedInterfaceCapability : sicListClient3) {
                 assertThat("tp should have 3 if-cap-type: if-10GE-ODU2e, if-10GE-ODU2, if-10GE",
                     String.valueOf(supportedInterfaceCapability.getIfCapType()),
-                    either(containsString(String.valueOf(If10GEODU2e.class)))
-                    .or(containsString(String.valueOf(If10GEODU2.class)))
-                    .or(containsString(String.valueOf(If10GE.class))));
+                    either(containsString(String.valueOf(If10GEODU2e.VALUE)))
+                        .or(containsString(String.valueOf(If10GEODU2.VALUE)))
+                        .or(containsString(String.valueOf(If10GE.VALUE))));
             }
             assertThat("the rate should be ODU2 or ODU2e",
-                String.valueOf(tpList.get(2)
-                    .augmentation(
-                        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+                String.valueOf(tpList.get(2).augmentation(
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                             .TerminationPoint1.class)
-                    .getXpdrTpPortConnectionAttributes()
-                    .getRate()),
-                either(containsString(String.valueOf(ODU2e.class)))
-                .or(containsString(String.valueOf(ODU2.class))));
+                    .getXpdrTpPortConnectionAttributes().getRate()),
+                either(containsString(String.valueOf(ODU2e.VALUE)))
+                    .or(containsString(String.valueOf(ODU2.VALUE))));
             assertEquals(
-                "TP should be of type client",
                 OpenroadmTpType.XPONDERCLIENT,
-                tpList.get(2)
-                    .augmentation(
-                        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
-                            .TerminationPoint1.class)
-                    .getTpType());
+                tpList.get(2).augmentation(TerminationPoint1.class).getTpType(),
+                "TP should be of type client");
             assertEquals(
-                "TP should be of type network",
                 OpenroadmTpType.XPONDERNETWORK,
-                tpList.get(4)
-                    .augmentation(
-                        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
-                            .TerminationPoint1.class)
-                    .getTpType());
+                tpList.get(4).augmentation(TerminationPoint1.class).getTpType(),
+                "TP should be of type network");
         } else if (xpdrNb.equals(Uint16.valueOf(2))) {
-            assertEquals("should contain 8 TPs", 8, tpList.size());
+            assertEquals(8, tpList.size(), "should contain 8 TPs");
             assertEquals("XPDR2-CLIENT1", tpList.get(0).getTpId().getValue());
             assertEquals("XPDR2-CLIENT2", tpList.get(1).getTpId().getValue());
             assertEquals("XPDR2-NETWORK1", tpList.get(4).getTpId().getValue());
             assertEquals("XPDR2-NETWORK2", tpList.get(5).getTpId().getValue());
             assertEquals(
-                "only IfOCHOTU4ODU4 interface capabitily expected",
-                IfOCHOTU4ODU4.class,
-                tpList.get(5)
-                    .augmentation(
-                        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
-                                .TerminationPoint1.class)
-                    .getTpSupportedInterfaces()
-                    .getSupportedInterfaceCapability().values().stream().findFirst()
-                    .get()
-                    .getIfCapType());
+                IfOCHOTU4ODU4.VALUE,
+                tpList.get(5).augmentation(
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
+                            .TerminationPoint1.class)
+                    .getTpSupportedInterfaces().getSupportedInterfaceCapability().values().stream().findFirst()
+                    .orElseThrow().getIfCapType(),
+                "only IfOCHOTU4ODU4 interface capabitily expected");
             assertEquals(
-                "supported interface capability of tp should contain 2 IfCapType",
                 2,
-                tpList.get(2)
-                    .augmentation(
-                        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+                tpList.get(2).augmentation(
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                             .TerminationPoint1.class)
-                    .getTpSupportedInterfaces()
-                    .getSupportedInterfaceCapability().values().size());
-            List<SupportedInterfaceCapability> sicListClient3 = tpList.get(2)
-                .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
-                    .TerminationPoint1.class)
-                .getTpSupportedInterfaces()
-                .getSupportedInterfaceCapability().values().stream().collect(Collectors.toList());
+                    .getTpSupportedInterfaces().getSupportedInterfaceCapability().values().size(),
+                "supported interface capability of tp should contain 2 IfCapType");
+            List<SupportedInterfaceCapability> sicListClient3 = tpList.get(2).augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
+                        .TerminationPoint1.class)
+                .getTpSupportedInterfaces().getSupportedInterfaceCapability().values().stream()
+                .collect(Collectors.toList());
             for (SupportedInterfaceCapability supportedInterfaceCapability : sicListClient3) {
-                assertThat("tp should have 2 if-cap-type: if-100GE-ODU4, if-100GE",
+                assertThat(
+                    "tp should have 2 if-cap-type: if-100GE-ODU4, if-100GE",
                     String.valueOf(supportedInterfaceCapability.getIfCapType()),
-                    either(containsString(String.valueOf(If100GEODU4.class)))
-                    .or(containsString(String.valueOf(If100GE.class))));
+                    either(containsString(String.valueOf(If100GEODU4.VALUE)))
+                        .or(containsString(String.valueOf(If100GE.VALUE))));
             }
             assertEquals(
-                "TP should be of type client", OpenroadmTpType.XPONDERCLIENT,
-                tpList.get(2)
-                    .augmentation(
-                        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
-                            .TerminationPoint1.class)
-                    .getTpType());
+                OpenroadmTpType.XPONDERCLIENT,
+                tpList.get(2).augmentation(TerminationPoint1.class).getTpType(),
+                "TP should be of type client");
             assertEquals(
-                "TP should be of type network", OpenroadmTpType.XPONDERNETWORK,
-                tpList.get(6)
-                    .augmentation(
-                        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
-                            .TerminationPoint1.class)
-                    .getTpType());
+                OpenroadmTpType.XPONDERNETWORK,
+                tpList.get(6).augmentation(TerminationPoint1.class).getTpType(),
+                "TP should be of type network");
         }
     }
 }
index b8c3c62e13b252a1e3a36e1205586be4d6a633a4..e13c9be32959627ba4a04a640d41ffe69cd8321d 100644 (file)
@@ -7,11 +7,11 @@
  */
 package org.opendaylight.transportpce.networkmodel.util;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
@@ -28,12 +28,11 @@ import java.util.concurrent.Executor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.stream.Collectors;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
 import org.mockito.invocation.InvocationOnMock;
-import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.mockito.stubbing.Answer;
 import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
@@ -42,16 +41,16 @@ import org.opendaylight.transportpce.common.fixedflex.GridConstant;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.networkmodel.dto.TopologyShard;
 import org.opendaylight.transportpce.networkmodel.util.test.NetworkmodelTestUtil;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.XpdrNodeTypes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Link1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.available.freq.map.AvailFreqMaps;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Link1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.available.freq.map.AvailFreqMaps;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
@@ -72,18 +71,18 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Uint16;
 
 
-@RunWith(MockitoJUnitRunner.StrictStubs.class)
+@ExtendWith(MockitoExtension.class)
 public class OpenRoadmTopologyTest {
     @Mock
     private NetworkTransactionService networkTransactionService;
 
     @Test
-    public void createTopologyShardForDegreeTest() {
+    void createTopologyShardForDegreeTest() {
         Nodes mappingNode = NetworkmodelTestUtil.createMappingForRdm("ROADMA01", "nodeA", 2, List.of());
         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
         assertNotNull(topologyShard);
-        assertEquals("Should contain 2 Degree nodes only", 2, topologyShard.getNodes().size());
-        assertEquals("Should contain 2 links", 2, topologyShard.getLinks().size());
+        assertEquals(2, topologyShard.getNodes().size(), "Should contain 2 Degree nodes only");
+        assertEquals(2, topologyShard.getLinks().size(), "Should contain 2 links");
         List<Node> nodes = topologyShard.getNodes().stream()
             .sorted((n1, n2) -> n1.getNodeId().getValue().compareTo(n2.getNodeId().getValue()))
             .collect(Collectors.toList());
@@ -95,7 +94,7 @@ public class OpenRoadmTopologyTest {
         List<Link> links = topologyShard.getLinks().stream()
             .sorted((l1, l2) -> l1.getLinkId().getValue().compareTo(l2.getLinkId().getValue()))
             .collect(Collectors.toList());
-        assertEquals("Should contain 2 express links", 2, links.size());
+        assertEquals(2, links.size(), "Should contain 2 express links");
         assertEquals("ROADMA01-DEG1-DEG1-CTP-TXRXtoROADMA01-DEG2-DEG2-CTP-TXRX", links.get(0).getLinkId().getValue());
         assertEquals("ROADMA01-DEG1", links.get(0).getSource().getSourceNode().getValue());
         assertEquals("DEG1-CTP-TXRX", links.get(0).getSource().getSourceTp().getValue());
@@ -109,29 +108,29 @@ public class OpenRoadmTopologyTest {
     }
 
     @Test
-    public void createTopologyShardForSrgTest() {
-        Nodes mappingNode = NetworkmodelTestUtil.createMappingForRdm("ROADMA01", "nodeA", 0,
-            List.of(Integer.valueOf(1)));
+    void createTopologyShardForSrgTest() {
+        Nodes mappingNode = NetworkmodelTestUtil.createMappingForRdm(
+                "ROADMA01", "nodeA", 0, List.of(Integer.valueOf(1)));
         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
         assertNotNull(topologyShard);
         List<Node> nodes = topologyShard.getNodes();
-        assertEquals("Should contain 1 SRG node only", 1, nodes.size());
-        assertEquals("Should contain 0 link", 0, topologyShard.getLinks().size());
+        assertEquals(1, nodes.size(), "Should contain 1 SRG node only");
+        assertEquals(0, topologyShard.getLinks().size(), "Should contain 0 link");
         checkSrgNode("1", nodes.get(0));
     }
 
     @Test
-    public void createTopologyShardForMultipleSrgTest() {
+    void createTopologyShardForMultipleSrgTest() {
         List<Integer> srgNbs = List.of(Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(10),
-            Integer.valueOf(11));
+                Integer.valueOf(11));
         Nodes mappingNode = NetworkmodelTestUtil.createMappingForRdm("ROADMA01", "nodeA", 0, srgNbs);
         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
         assertNotNull(topologyShard);
         List<Node> nodes = topologyShard.getNodes().stream()
             .sorted((n1, n2) -> n1.getNodeId().getValue().compareTo(n2.getNodeId().getValue()))
             .collect(Collectors.toList());
-        assertEquals("Should contain 4 SRG nodes", 4, nodes.size());
-        assertEquals("Should contain 0 link", 0, topologyShard.getLinks().size());
+        assertEquals(4, nodes.size(), "Should contain 4 SRG nodes");
+        assertEquals(0, topologyShard.getLinks().size(), "Should contain 0 link");
         checkSrgNode("1", nodes.get(0));
         checkSrgNode("10", nodes.get(1));
         checkSrgNode("11", nodes.get(2));
@@ -139,82 +138,83 @@ public class OpenRoadmTopologyTest {
     }
 
     @Test
-    public void createTopologyShardForCompleteRdmNodeTest() {
+    void createTopologyShardForCompleteRdmNodeTest() {
         Nodes mappingNode = NetworkmodelTestUtil.createMappingForRdm("ROADMA01", "nodeA", 2,
             List.of(Integer.valueOf(1), Integer.valueOf(2)));
         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
         assertNotNull(topologyShard);
-        assertEquals("Should contain 2 Deg and 2 SRG nodes", 4, topologyShard.getNodes().size());
+        assertEquals(4, topologyShard.getNodes().size(), "Should contain 2 Deg and 2 SRG nodes");
         List<Link> addLinks = topologyShard.getLinks().stream()
             .filter(lk -> lk.augmentation(Link1.class).getLinkType().equals(OpenroadmLinkType.ADDLINK))
             .collect(Collectors.toList());
-        assertEquals("Should contain 4 add links", 4, addLinks.size());
+        assertEquals(4, addLinks.size(), "Should contain 4 add links");
         List<Link> dropLinks = topologyShard.getLinks().stream()
             .filter(lk -> lk.augmentation(Link1.class).getLinkType().equals(OpenroadmLinkType.DROPLINK))
             .collect(Collectors.toList());
-        assertEquals("Should contain 4 drop links", 4, dropLinks.size());
+        assertEquals(4, dropLinks.size(), "Should contain 4 drop links");
         List<Link> expressLinks = topologyShard.getLinks().stream()
             .filter(lk -> lk.augmentation(Link1.class).getLinkType().equals(OpenroadmLinkType.EXPRESSLINK))
             .collect(Collectors.toList());
-        assertEquals("Should contain 2 express links", 2, expressLinks.size());
+        assertEquals(2, expressLinks.size(), "Should contain 2 express links");
     }
 
     @Test
-    public void createTopologyShardForTpdrNodeTest() {
+    void createTopologyShardForTpdrNodeTest() {
         Nodes mappingNode = NetworkmodelTestUtil.createMappingForXpdr("XPDRA01", "nodeA", 2, 2, null);
         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
         assertNotNull(topologyShard);
-        assertEquals("Should contain a single node", 1, topologyShard.getNodes().size());
-        assertEquals("Should contain 0 link", 0, topologyShard.getLinks().size());
+        assertEquals(1, topologyShard.getNodes().size(), "Should contain a single node");
+        assertEquals(0, topologyShard.getLinks().size(), "Should contain 0 link");
         checkTpdrNode(topologyShard.getNodes().get(0));
     }
 
     @Test
-    public void createTopologyShardForTpdrNode2Test() {
+    void createTopologyShardForTpdrNode2Test() {
         Nodes mappingNode = NetworkmodelTestUtil.createMappingForXpdr("XPDRA01", "nodeA", 2, 2, XpdrNodeTypes.Tpdr);
         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
         assertNotNull(topologyShard);
-        assertEquals("Should contain a single node", 1, topologyShard.getNodes().size());
-        assertEquals("Should contain 0 link", 0, topologyShard.getLinks().size());
+        assertEquals(1, topologyShard.getNodes().size(), "Should contain a single node");
+        assertEquals(0, topologyShard.getLinks().size(), "Should contain 0 link");
         checkTpdrNode(topologyShard.getNodes().get(0));
     }
 
     @Test
-    public void createTopologyShardForMpdrNodeTest() {
+    void createTopologyShardForMpdrNodeTest() {
         Nodes mappingNode = NetworkmodelTestUtil.createMappingForXpdr("XPDRA01", "nodeA", 2, 2, XpdrNodeTypes.Mpdr);
         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
         assertNotNull(topologyShard);
-        assertEquals("Should contain a single node", 1, topologyShard.getNodes().size());
-        assertEquals("Should contain 0 link", 0, topologyShard.getLinks().size());
+        assertEquals(1, topologyShard.getNodes().size(), "Should contain a single node");
+        assertEquals(0, topologyShard.getLinks().size(), "Should contain 0 link");
         checkOtnXpdrNode(topologyShard.getNodes().get(0));
     }
 
     @Test
-    public void createTopologyShardForSwitchNodeTest() {
+    void createTopologyShardForSwitchNodeTest() {
         Nodes mappingNode = NetworkmodelTestUtil.createMappingForXpdr("XPDRA01", "nodeA", 2, 2, XpdrNodeTypes.Switch);
         TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
         assertNotNull(topologyShard);
-        assertEquals("Should contain a single node", 1, topologyShard.getNodes().size());
-        assertEquals("Should contain 0 link", 0, topologyShard.getLinks().size());
+        assertEquals(1, topologyShard.getNodes().size(), "Should contain a single node");
+        assertEquals(0, topologyShard.getLinks().size(), "Should contain 0 link");
         checkOtnXpdrNode(topologyShard.getNodes().get(0));
     }
 
-    @Ignore
     @Test
-    public void createTopologyShardForRdmWithoutClliTest() {
+    void createTopologyShardForRdmWithoutClliTest() {
         Nodes mappingNode = NetworkmodelTestUtil.createMappingForRdm("ROADMA01", null, 2, List.of());
-        TopologyShard topologyShard = OpenRoadmTopology.createTopologyShard(mappingNode);
-        assertNull("clli must not be null", topologyShard);
+        Exception exception = assertThrows(NullPointerException.class, () -> {
+            OpenRoadmTopology.createTopologyShard(mappingNode);
+        });
+        assertTrue("Supplied value may not be null".contains(exception.getMessage()));
     }
 
     @Test
-    public void deleteLinkOkTest() throws InterruptedException, ExecutionException {
+    void deleteLinkOkTest() throws InterruptedException, ExecutionException {
         String srcNode = "ROADM-A1-DEG1";
         String dstNode = "ROADM-A1-SRG1";
         String srcTp = "DEG1-CTP-TXRX";
         String destTp = "SRG1-CP-TXRX";
         LinkId linkId = LinkIdUtil.buildLinkId(srcNode, srcTp, dstNode, destTp);
-        org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Link1 link1 =
+        org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Link1 link1 =
             new Link1Builder().build();
         Link link = new LinkBuilder()
             .setLinkId(linkId)
@@ -223,9 +223,11 @@ public class OpenRoadmTopologyTest {
                 .build())
             .addAugmentation(link1)
             .build();
-        InstanceIdentifier<Link> linkIID = InstanceIdentifier.builder(Networks.class).child(Network.class,
-            new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).augmentation(Network1.class)
-            .child(Link.class, new LinkKey(linkId)).build();
+        InstanceIdentifier<Link> linkIID = InstanceIdentifier.builder(Networks.class)
+            .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
+            .augmentation(Network1.class)
+            .child(Link.class, new LinkKey(linkId))
+            .build();
         when(networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, linkIID))
             .thenReturn(new LinkFuture(link));
 
@@ -241,29 +243,31 @@ public class OpenRoadmTopologyTest {
 
         boolean result = OpenRoadmTopology.deleteLink("ROADM-A1-DEG1", "ROADM-A1-SRG1", "DEG1-CTP-TXRX", "SRG1-CP-TXRX",
             networkTransactionService);
-        assertTrue("link deletion should be ok", result);
+        assertTrue(result, "link deletion should be ok");
     }
 
     @Test
-    public void deleteLinkNotOkTest() throws InterruptedException, ExecutionException {
+    void deleteLinkNotOkTest() throws InterruptedException, ExecutionException {
         String srcNode = "ROADM-A1-DEG1";
         String dstNode = "ROADM-A1-SRG1";
         String srcTp = "DEG1-CTP-TXRX";
         String destTp = "SRG1-CP-TXRX";
         LinkId linkId = LinkIdUtil.buildLinkId(srcNode, srcTp, dstNode, destTp);
 
-        InstanceIdentifier<Link> linkIID = InstanceIdentifier.builder(Networks.class).child(Network.class,
-            new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).augmentation(Network1.class)
-            .child(Link.class, new LinkKey(linkId)).build();
+        InstanceIdentifier<Link> linkIID = InstanceIdentifier.builder(Networks.class)
+            .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
+            .augmentation(Network1.class)
+            .child(Link.class, new LinkKey(linkId))
+            .build();
         when(networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, linkIID)).thenReturn(new LinkFuture());
 
-        boolean result = OpenRoadmTopology.deleteLink("ROADM-A1-DEG1", "ROADM-A1-SRG1", "DEG1-CTP-TXRX", "SRG1-CP-TXRX",
-            networkTransactionService);
-        assertFalse("link deletion should not be ok", result);
+        boolean result = OpenRoadmTopology.deleteLink(
+                "ROADM-A1-DEG1", "ROADM-A1-SRG1", "DEG1-CTP-TXRX", "SRG1-CP-TXRX", networkTransactionService);
+        assertFalse(result, "link deletion should not be ok");
     }
 
     @Test
-    public void deleteLinkExceptionTest() throws InterruptedException, ExecutionException {
+    void deleteLinkExceptionTest() throws InterruptedException, ExecutionException {
         String srcNode = "ROADM-A1-DEG1";
         String dstNode = "ROADM-A1-SRG1";
         String srcTp = "DEG1-CTP-TXRX";
@@ -271,14 +275,16 @@ public class OpenRoadmTopologyTest {
         LinkId linkId = LinkIdUtil.buildLinkId(srcNode, srcTp, dstNode, destTp);
 
         InstanceIdentifier<Link> linkIID = InstanceIdentifier.builder(Networks.class)
-                .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
-                .augmentation(Network1.class).child(Link.class, new LinkKey(linkId)).build();
+            .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
+            .augmentation(Network1.class)
+            .child(Link.class, new LinkKey(linkId))
+            .build();
         when(networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, linkIID))
-                .thenReturn(new InterruptedLinkFuture());
-        boolean result = OpenRoadmTopology.deleteLink("ROADM-A1-DEG1", "ROADM-A1-SRG1", "DEG1-CTP-TXRX", "SRG1-CP-TXRX",
-                networkTransactionService);
+            .thenReturn(new InterruptedLinkFuture());
+        boolean result = OpenRoadmTopology.deleteLink(
+                "ROADM-A1-DEG1", "ROADM-A1-SRG1", "DEG1-CTP-TXRX", "SRG1-CP-TXRX", networkTransactionService);
         verify(networkTransactionService, never()).merge(any(), any(), any());
-        assertFalse("Result should be false du to InterruptedException", result);
+        assertFalse(result, "Result should be false du to InterruptedException");
     }
 
     private void checkDegreeNode(String nodeNb, Node node) {
@@ -292,18 +298,19 @@ public class OpenRoadmTopologyTest {
         assertEquals("openroadm-network", supportingNodes.get(1).getNetworkRef().getValue());
         assertEquals("ROADMA01", supportingNodes.get(1).getNodeRef().getValue());
         assertEquals(OpenroadmNodeType.DEGREE, node.augmentation(Node1.class).getNodeType());
-        assertEquals(Uint16.valueOf(nodeNb), node.augmentation(
-            org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1.class)
-            .getDegreeAttributes().getDegreeNumber());
+        assertEquals(
+            Uint16.valueOf(nodeNb),
+            node.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1.class)
+                .getDegreeAttributes().getDegreeNumber());
         List<AvailFreqMaps> availFreqMapsValues = new ArrayList<>(node.augmentation(
-            org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1.class)
+                org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1.class)
             .getDegreeAttributes().getAvailFreqMaps().values());
         assertEquals(GridConstant.NB_OCTECTS, availFreqMapsValues.get(0).getFreqMap().length);
         byte[] byteArray = new byte[GridConstant.NB_OCTECTS];
         Arrays.fill(byteArray, (byte) GridConstant.AVAILABLE_SLOT_VALUE);
         assertEquals(Arrays.toString(byteArray), Arrays.toString(availFreqMapsValues.get(0).getFreqMap()));
         List<TerminationPoint> tps = node.augmentation(
-            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
+                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
             .nonnullTerminationPoint().values().stream()
             .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
             .collect(Collectors.toList());
@@ -326,14 +333,14 @@ public class OpenRoadmTopologyTest {
         assertEquals("ROADMA01", supportingNodes.get(1).getNodeRef().getValue());
         assertEquals(OpenroadmNodeType.SRG, node.augmentation(Node1.class).getNodeType());
         List<AvailFreqMaps> availFreqMapsValues = new ArrayList<>(node.augmentation(
-                org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1.class)
-                .getSrgAttributes().getAvailFreqMaps().values());
+                org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1.class)
+            .getSrgAttributes().getAvailFreqMaps().values());
         assertEquals(GridConstant.NB_OCTECTS, availFreqMapsValues.get(0).getFreqMap().length);
         byte[] byteArray = new byte[GridConstant.NB_OCTECTS];
         Arrays.fill(byteArray, (byte) GridConstant.AVAILABLE_SLOT_VALUE);
         assertEquals(Arrays.toString(byteArray), Arrays.toString(availFreqMapsValues.get(0).getFreqMap()));
         List<TerminationPoint> tps = node.augmentation(
-            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
+                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
             .nonnullTerminationPoint().values().stream()
             .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
             .collect(Collectors.toList());
@@ -356,21 +363,23 @@ public class OpenRoadmTopologyTest {
         assertEquals("XPDRA01", supportingNodes.get(1).getNodeRef().getValue());
         assertEquals(OpenroadmNodeType.XPONDER, node.augmentation(Node1.class).getNodeType());
         List<TerminationPoint> tps = node.augmentation(
-            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
+                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
             .nonnullTerminationPoint().values().stream()
             .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
             .collect(Collectors.toList());
         assertEquals(4, tps.size());
         assertEquals("XPDR1-CLIENT1", tps.get(0).getTpId().getValue());
         assertEquals(OpenroadmTpType.XPONDERCLIENT, tps.get(0).augmentation(TerminationPoint1.class).getTpType());
-        assertEquals("XPDR1-NETWORK1", tps.get(0).augmentation(
-            org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1.class)
-            .getAssociatedConnectionMapPort());
+        assertEquals(
+            "XPDR1-NETWORK1",
+            tps.get(0).augmentation(TerminationPoint1.class).getAssociatedConnectionMapTp().iterator().next()
+                .getValue());
         assertEquals("XPDR1-NETWORK1", tps.get(2).getTpId().getValue());
         assertEquals(OpenroadmTpType.XPONDERNETWORK, tps.get(2).augmentation(TerminationPoint1.class).getTpType());
-        assertEquals("XPDR1-CLIENT1", tps.get(2).augmentation(
-            org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1.class)
-            .getAssociatedConnectionMapPort());
+        assertEquals(
+            "XPDR1-CLIENT1",
+            tps.get(2).augmentation(TerminationPoint1.class).getAssociatedConnectionMapTp().iterator().next()
+                .getValue());
     }
 
     private void checkOtnXpdrNode(Node node) {
@@ -385,7 +394,7 @@ public class OpenRoadmTopologyTest {
         assertEquals("XPDRA01", supportingNodes.get(1).getNodeRef().getValue());
         assertEquals(OpenroadmNodeType.XPONDER, node.augmentation(Node1.class).getNodeType());
         List<TerminationPoint> tps = node.augmentation(
-            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
+                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
             .nonnullTerminationPoint().values().stream()
             .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
             .collect(Collectors.toList());
@@ -444,7 +453,7 @@ public class OpenRoadmTopologyTest {
         }
     }
 
-    private class InterruptedLinkFuture implements  ListenableFuture<Optional<Link>> {
+    private final class InterruptedLinkFuture implements  ListenableFuture<Optional<Link>> {
 
         @Override
         public boolean cancel(boolean arg0) {
index a7c26139d36e9342403d15b6cc48d9769b720160..644d0af4be3f34ef194a51069c000547ce49ae4f 100644 (file)
@@ -7,20 +7,20 @@
  */
 package org.opendaylight.transportpce.networkmodel.util;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
 
 import java.util.concurrent.ExecutionException;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
-import org.opendaylight.transportpce.common.network.RequestProcessor;
 import org.opendaylight.transportpce.test.AbstractTest;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.clli.network.rev191129.NetworkTypes1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.clli.network.rev191129.NetworkTypes1Builder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.clli.network.rev191129.networks.network.network.types.ClliNetworkBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.networks.network.network.types.OpenroadmCommonNetworkBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.networks.network.network.types.OpenroadmCommonNetworkBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
@@ -30,84 +30,87 @@ import org.opendaylight.yangtools.yang.binding.Augmentation;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public class TpceNetworkTest extends AbstractTest {
-    TpceNetwork tpceNetwork = new TpceNetwork(new NetworkTransactionImpl(new RequestProcessor(getDataBroker())));
+    TpceNetwork tpceNetwork = new TpceNetwork(new NetworkTransactionImpl(getDataBroker()));
 
     @Test
-    public void createLayerClliTest() throws InterruptedException, ExecutionException {
+    void createLayerClliTest() throws InterruptedException, ExecutionException {
         tpceNetwork.createLayer("clli-network");
         InstanceIdentifier<Network> nwIID = InstanceIdentifier.create(Networks.class)
             .child(Network.class, new NetworkKey(new NetworkId("clli-network")));
         Network createdClli = getDataBroker().newReadOnlyTransaction()
-            .read(LogicalDatastoreType.CONFIGURATION, nwIID).get().get();
-        assertNotNull("Clli layer should be created and not null", createdClli);
+            .read(LogicalDatastoreType.CONFIGURATION, nwIID).get().orElseThrow();
+        assertNotNull(createdClli, "Clli layer should be created and not null");
 
         Augmentation<NetworkTypes> ordClli = new NetworkTypes1Builder()
             .setClliNetwork(new ClliNetworkBuilder().build())
             .build();
-        assertNotNull("clli augmentation should not be null", createdClli.getNetworkTypes()
-            .augmentation(NetworkTypes1.class));
-        assertEquals("bad clli augmentation for network-types", ordClli,
-            createdClli.getNetworkTypes().augmentation(NetworkTypes1.class));
+        assertNotNull(createdClli.getNetworkTypes().augmentation(NetworkTypes1.class),
+            "clli augmentation should not be null");
+        assertEquals(ordClli, createdClli.getNetworkTypes().augmentation(NetworkTypes1.class),
+            "bad clli augmentation for network-types");
     }
 
     @Test
-    public void createLayerNetworkTest() throws InterruptedException, ExecutionException {
+    void createLayerNetworkTest() throws InterruptedException, ExecutionException {
         tpceNetwork.createLayer("openroadm-network");
         InstanceIdentifier<Network> nwIID = InstanceIdentifier.create(Networks.class)
             .child(Network.class, new NetworkKey(new NetworkId("openroadm-network")));
         Network createdOrdNetwork = getDataBroker().newReadOnlyTransaction()
-            .read(LogicalDatastoreType.CONFIGURATION, nwIID).get().get();
-        assertNotNull("openroadm-network layer should be created and not null", createdOrdNetwork);
+            .read(LogicalDatastoreType.CONFIGURATION, nwIID).get().orElseThrow();
+        assertNotNull(createdOrdNetwork, "openroadm-network layer should be created and not null");
         commonNetworkAugmentationTest(createdOrdNetwork);
     }
 
     @Test
-    public void createLayerTopologyTest() throws InterruptedException, ExecutionException {
+    void createLayerTopologyTest() throws InterruptedException, ExecutionException {
         tpceNetwork.createLayer("openroadm-topology");
         InstanceIdentifier<Network> nwIID = InstanceIdentifier.create(Networks.class)
             .child(Network.class, new NetworkKey(new NetworkId("openroadm-topology")));
         Network createdOrdNetwork = getDataBroker().newReadOnlyTransaction()
-            .read(LogicalDatastoreType.CONFIGURATION, nwIID).get().get();
-        assertNotNull("openroadm-logpology layer should be created and not null", createdOrdNetwork);
+            .read(LogicalDatastoreType.CONFIGURATION, nwIID).get().orElseThrow();
+        assertNotNull(createdOrdNetwork, "openroadm-logpology layer should be created and not null");
         commonNetworkAugmentationTest(createdOrdNetwork);
     }
 
     @Test
-    public void createLayerOtnTest() throws InterruptedException, ExecutionException {
+    void createLayerOtnTest() throws InterruptedException, ExecutionException {
         tpceNetwork.createLayer("otn-topology");
         InstanceIdentifier<Network> nwIID = InstanceIdentifier.create(Networks.class)
             .child(Network.class, new NetworkKey(new NetworkId("otn-topology")));
         Network createdOrdNetwork = getDataBroker().newReadOnlyTransaction()
-            .read(LogicalDatastoreType.CONFIGURATION, nwIID).get().get();
-        assertNotNull("otn-logpology layer should be created and not null", createdOrdNetwork);
+            .read(LogicalDatastoreType.CONFIGURATION, nwIID).get().orElseThrow();
+        assertNotNull(createdOrdNetwork, "otn-logpology layer should be created and not null");
         commonNetworkAugmentationTest(createdOrdNetwork);
     }
 
     @Test
-    public void createBadLayerTest() throws InterruptedException, ExecutionException {
+    void createBadLayerTest() throws InterruptedException, ExecutionException {
         tpceNetwork.createLayer("toto");
         InstanceIdentifier<Network> nwIID = InstanceIdentifier.create(Networks.class)
             .child(Network.class, new NetworkKey(new NetworkId("toto")));
         Network createdOrdNetwork = getDataBroker().newReadOnlyTransaction()
-            .read(LogicalDatastoreType.CONFIGURATION, nwIID).get().get();
-        assertNotNull("toto layer should be created and not null", createdOrdNetwork);
-        assertNull("toto layer should not have any network-type augmentation", createdOrdNetwork.getNetworkTypes()
-            .augmentation(NetworkTypes1.class));
-        assertNull("toto layer should not have any network-type augmentation", createdOrdNetwork.getNetworkTypes()
-            .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
-            .NetworkTypes1.class));
+            .read(LogicalDatastoreType.CONFIGURATION, nwIID).get().orElseThrow();
+        assertNotNull(createdOrdNetwork, "toto layer should be created and not null");
+        assertNull(createdOrdNetwork.getNetworkTypes().augmentation(NetworkTypes1.class),
+            "toto layer should not have any network-type augmentation");
+        assertNull(
+            createdOrdNetwork.getNetworkTypes().augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.NetworkTypes1.class),
+            "toto layer should not have any network-type augmentation");
     }
 
     private void commonNetworkAugmentationTest(Network createdOrdNetwork) {
         Augmentation<NetworkTypes> ordComNet
-            = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.NetworkTypes1Builder()
-            .setOpenroadmCommonNetwork(new OpenroadmCommonNetworkBuilder().build())
-            .build();
-        assertNotNull("common-network augmentation should not be null", createdOrdNetwork.getNetworkTypes()
-            .augmentation(
-                org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.NetworkTypes1.class));
-        assertEquals("bad common-network augmentation for network-types", ordComNet, createdOrdNetwork.getNetworkTypes()
-            .augmentation(
-                org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.NetworkTypes1.class));
+            = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.NetworkTypes1Builder()
+                .setOpenroadmCommonNetwork(new OpenroadmCommonNetworkBuilder().build())
+                .build();
+        assertNotNull(
+            createdOrdNetwork.getNetworkTypes().augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.NetworkTypes1.class),
+            "common-network augmentation should not be null");
+        assertEquals(
+            ordComNet, createdOrdNetwork.getNetworkTypes().augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.NetworkTypes1.class),
+            "bad common-network augmentation for network-types");
     }
 }
index 714216face8091ee7e5e293cfc0d1dcbd1e94c3a..3f54bd1fc548c11bed63ac9c87ed5d6fda759a96 100644 (file)
@@ -11,6 +11,7 @@ import com.google.gson.stream.JsonReader;
 import java.io.IOException;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map.Entry;
 import java.util.ServiceLoader;
 import org.opendaylight.mdsal.binding.dom.adapter.CurrentAdapterSerializer;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
@@ -18,6 +19,7 @@ import org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext;
 import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext;
 import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers;
 import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.YangModelBindingProvider;
 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
 import org.opendaylight.yangtools.yang.common.QName;
@@ -26,7 +28,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStre
 import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
 import org.opendaylight.yangtools.yang.data.codec.gson.JsonParserStream;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
-import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
+import org.opendaylight.yangtools.yang.data.impl.schema.NormalizationResultHolder;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -62,17 +64,15 @@ public final class JsonUtil {
     }
 
     public DataObject getDataObjectFromJson(JsonReader reader, QName pathQname) {
-        NormalizedNodeResult result = new NormalizedNodeResult();
-        try (NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
+        NormalizationResultHolder resultHolder = new NormalizationResultHolder();
+        try (NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(resultHolder);
                 JsonParserStream jsonParser = JsonParserStream.create(streamWriter,
                         JSONCodecFactorySupplier.RFC7951.getShared(schemaCtx));) {
             jsonParser.parse(reader);
             YangInstanceIdentifier yangId = YangInstanceIdentifier.of(pathQname);
-            if (codecRegistry.fromNormalizedNode(yangId, result.getResult()) != null) {
-                return codecRegistry.fromNormalizedNode(yangId, result.getResult()).getValue();
-            } else {
-                return null;
-            }
+            Entry<InstanceIdentifier<?>, DataObject> entry =
+                codecRegistry.fromNormalizedNode(yangId, resultHolder.getResult().data());
+            return entry == null ? null : entry.getValue();
         } catch (IOException | IllegalArgumentException e) {
             LOG.error("Cannot deserialize JSON ", e);
             return null;
index 315bc2433735202fc1778121699532f28da86eec..d270287fea5923d66e5afeaaf68cf7baee36780f 100644 (file)
@@ -10,38 +10,37 @@ package org.opendaylight.transportpce.networkmodel.util.test;
 import com.google.common.collect.ImmutableMap;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import org.opendaylight.transportpce.common.NetworkUtils;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfoBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.OtnLinkType;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfoBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1Builder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.PortQual;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.XpdrNodeTypes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODTU4TsAllocated;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODU4;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.TerminationPoint1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.TerminationPoint1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.termination.point.TpSupportedInterfaces;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.termination.point.TpSupportedInterfacesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.termination.point.XpdrTpPortConnectionAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If100GE;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOCH;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOCHOTU4ODU4;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.SupportedIfCapability;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev211210.xpdr.otn.tp.attributes.OdtuTpnPool;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev211210.xpdr.otn.tp.attributes.OdtuTpnPoolBuilder;
-import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.OtnLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.TerminationPoint1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.networks.network.node.termination.point.TpSupportedInterfacesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.networks.network.node.termination.point.XpdrTpPortConnectionAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If100GE;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOCH;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOCHOTU4ODU4;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev230526.xpdr.otn.tp.attributes.OdtuTpnPool;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev230526.xpdr.otn.tp.attributes.OdtuTpnPoolBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
@@ -54,7 +53,6 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.top
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.termination.point.SupportingTerminationPoint;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.termination.point.SupportingTerminationPointBuilder;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.termination.point.SupportingTerminationPointKey;
 import org.opendaylight.yangtools.yang.common.Uint16;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.slf4j.Logger;
@@ -77,8 +75,8 @@ public final class NetworkmodelTestUtil {
             .build();
     }
 
-    public static Nodes createMappingForXpdr(String nodeId, String clli, int networkPortNb, int clientPortNb,
-        XpdrNodeTypes xpdrNodeType) {
+    public static Nodes createMappingForXpdr(
+            String nodeId, String clli, int networkPortNb, int clientPortNb, XpdrNodeTypes xpdrNodeType) {
         Map<MappingKey,Mapping> mappingMap = new HashMap<>();
         createXpdrMappings(mappingMap, networkPortNb, clientPortNb, xpdrNodeType);
         Nodes mappingNode = new NodesBuilder()
@@ -91,89 +89,94 @@ public final class NetworkmodelTestUtil {
     }
 
     public static List<Link> createSuppOTNLinks(OtnLinkType type, Uint32 availBW) {
-        Link linkAZ = new LinkBuilder()
-            .setLinkId(new LinkId(type.getName() + "-SPDRA-XPDR1-XPDR1-NETWORK1toSPDRZ-XPDR1-XPDR1-NETWORK1"))
-            .setSource(new SourceBuilder()
-                    .setSourceNode(new NodeId("SPDRA-XPDR1"))
-                    .setSourceTp(new TpId("XPDR1-NETWORK1")).build())
-            .setDestination(new DestinationBuilder()
-                    .setDestNode(new NodeId("SPDRZ-XPDR1"))
-                    .setDestTp(new TpId("XPDR1-NETWORK1")).build())
-            .addAugmentation(
-                new Link1Builder()
-                    .setLinkType(OpenroadmLinkType.OTNLINK)
-                    .setOppositeLink(new LinkId(type.getName()
-                        + "-SPDRZ-XPDR1-XPDR1-NETWORK1toSPDRA-XPDR1-XPDR1-NETWORK1"))
-                    .build())
-            .addAugmentation(
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.Link1Builder()
-                    .setAvailableBandwidth(availBW)
-                    .setUsedBandwidth(Uint32.valueOf(100000 - availBW.intValue()))
-                    .build())
-            .addAugmentation(
-                new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.Link1Builder()
-                    .setOtnLinkType(type)
-                    .build())
-            .build();
-        Link linkZA = new LinkBuilder()
-            .setLinkId(new LinkId(type.getName() + "-SPDRZ-XPDR1-XPDR1-NETWORK1toSPDRA-XPDR1-XPDR1-NETWORK1"))
-            .setSource(new SourceBuilder()
-                    .setSourceNode(new NodeId("SPDRZ-XPDR1"))
-                    .setSourceTp(new TpId("XPDR1-NETWORK1")).build())
-            .setDestination(new DestinationBuilder()
-                    .setDestNode(new NodeId("SPDRA-XPDR1"))
-                    .setDestTp(new TpId("XPDR1-NETWORK1")).build())
-            .addAugmentation(
-                new Link1Builder()
-                    .setLinkType(OpenroadmLinkType.OTNLINK)
-                    .setOppositeLink(new LinkId(type.getName()
-                        + "-SPDRA-XPDR1-XPDR1-NETWORK1toSPDRZ-XPDR1-XPDR1-NETWORK1"))
-                    .build())
-            .addAugmentation(
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.Link1Builder()
-                    .setAvailableBandwidth(availBW)
-                    .setUsedBandwidth(Uint32.valueOf(100000 - availBW.intValue()))
-                    .build())
-            .addAugmentation(
-                new org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.Link1Builder()
-                    .setOtnLinkType(type)
-                    .build())
-            .build();
-        List<Link> links = new ArrayList<>();
-        links.add(linkAZ);
-        links.add(linkZA);
-        return links;
+        return new ArrayList<>(List.of(
+            //linkAZ,
+            new LinkBuilder()
+                .setLinkId(new LinkId(type.getName() + "-SPDRA-XPDR1-XPDR1-NETWORK1toSPDRZ-XPDR1-XPDR1-NETWORK1"))
+                .setSource(
+                    new SourceBuilder()
+                        .setSourceNode(new NodeId("SPDRA-XPDR1"))
+                        .setSourceTp(new TpId("XPDR1-NETWORK1")).build())
+                .setDestination(
+                    new DestinationBuilder()
+                        .setDestNode(new NodeId("SPDRZ-XPDR1"))
+                        .setDestTp(new TpId("XPDR1-NETWORK1")).build())
+                .addAugmentation(
+                    new Link1Builder()
+                        .setLinkType(OpenroadmLinkType.OTNLINK)
+                        .setOppositeLink(
+                            new LinkId(type.getName() + "-SPDRZ-XPDR1-XPDR1-NETWORK1toSPDRA-XPDR1-XPDR1-NETWORK1"))
+                        .build())
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
+                            .Link1Builder()
+                        .setAvailableBandwidth(availBW)
+                        .setUsedBandwidth(Uint32.valueOf(100000 - availBW.intValue()))
+                        .build())
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630
+                            .Link1Builder()
+                        .setOtnLinkType(type)
+                        .build())
+                .build(),
+            //linkZA
+            new LinkBuilder()
+                .setLinkId(new LinkId(type.getName() + "-SPDRZ-XPDR1-XPDR1-NETWORK1toSPDRA-XPDR1-XPDR1-NETWORK1"))
+                .setSource(
+                    new SourceBuilder()
+                        .setSourceNode(new NodeId("SPDRZ-XPDR1"))
+                        .setSourceTp(new TpId("XPDR1-NETWORK1"))
+                        .build())
+                .setDestination(
+                    new DestinationBuilder()
+                        .setDestNode(new NodeId("SPDRA-XPDR1"))
+                        .setDestTp(new TpId("XPDR1-NETWORK1"))
+                        .build())
+                .addAugmentation(
+                    new Link1Builder()
+                        .setLinkType(OpenroadmLinkType.OTNLINK)
+                        .setOppositeLink(
+                            new LinkId(type.getName() + "-SPDRA-XPDR1-XPDR1-NETWORK1toSPDRZ-XPDR1-XPDR1-NETWORK1"))
+                        .build())
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
+                            .Link1Builder()
+                        .setAvailableBandwidth(availBW)
+                        .setUsedBandwidth(Uint32.valueOf(100000 - availBW.intValue()))
+                        .build())
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630
+                            .Link1Builder()
+                        .setOtnLinkType(type)
+                        .build())
+                .build()
+            ));
     }
 
     public static List<TerminationPoint> createTpList(boolean withTpnTsPool) {
-        SupportedInterfaceCapability supCapa = new SupportedInterfaceCapabilityBuilder()
-            .setIfCapType(IfOCHOTU4ODU4.class)
-            .build();
-        Map<SupportedInterfaceCapabilityKey,SupportedInterfaceCapability> supInterCapaList =
-                new HashMap<>();
-        supInterCapaList.put(supCapa.key(),supCapa);
-        TpSupportedInterfaces tpSuppInter = new TpSupportedInterfacesBuilder()
-            .setSupportedInterfaceCapability(supInterCapaList)
-            .build();
         XpdrTpPortConnectionAttributesBuilder xtpcaBldr = new XpdrTpPortConnectionAttributesBuilder()
-            .setRate(ODU4.class);
+            .setRate(ODU4.VALUE);
         if (withTpnTsPool) {
-            List<Uint16> tsPool = new ArrayList<>();
+            Set<Uint16> tsPool = new HashSet<>();
             for (int i = 0; i < 80; i++) {
                 tsPool.add(Uint16.valueOf(i + 1));
             }
             xtpcaBldr.setTsPool(tsPool);
-            List<Uint16> tpnPool = new ArrayList<>();
+            Set<Uint16> tpnPool = new HashSet<>();
             for (int i = 1; i <= 80; i++) {
                 tpnPool.add(Uint16.valueOf(i));
             }
-            OdtuTpnPool odtuTpn = new OdtuTpnPoolBuilder()
-                    .setOdtuType(ODTU4TsAllocated.class)
-                    .setTpnPool(tpnPool).build();
+            OdtuTpnPool odtuTpn =
+                new OdtuTpnPoolBuilder().setOdtuType(ODTU4TsAllocated.VALUE).setTpnPool(tpnPool).build();
             xtpcaBldr.setOdtuTpnPool(ImmutableMap.of(odtuTpn.key(),odtuTpn));
         }
+        SupportedInterfaceCapability supCapa =
+            new SupportedInterfaceCapabilityBuilder().setIfCapType(IfOCHOTU4ODU4.VALUE).build();
         TerminationPoint1 otnTp1 = new TerminationPoint1Builder()
-            .setTpSupportedInterfaces(tpSuppInter)
+            .setTpSupportedInterfaces(
+                new TpSupportedInterfacesBuilder()
+                    .setSupportedInterfaceCapability(new HashMap<>(Map.of(supCapa.key(),supCapa)))
+                    .build())
             .setXpdrTpPortConnectionAttributes(xtpcaBldr.build())
             .build();
         SupportingTerminationPoint supTermPointA = new SupportingTerminationPointBuilder()
@@ -181,41 +184,38 @@ public final class NetworkmodelTestUtil {
             .setNodeRef(new NodeId("SPDRA-XPDR1"))
             .setTpRef(new TpId("XPDR1-NETWORK1"))
             .build();
-        Map<SupportingTerminationPointKey,SupportingTerminationPoint> supTermPointMapA =
-                Map.of(supTermPointA.key(), supTermPointA);
-        TerminationPoint tpA = new TerminationPointBuilder()
-            .setTpId(new TpId("XPDR1-NETWORK1"))
-            .setSupportingTerminationPoint(supTermPointMapA)
-            .addAugmentation(otnTp1)
-            .addAugmentation(
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder()
-                .setTpType(OpenroadmTpType.XPONDERNETWORK)
-                .build())
-            .build();
         SupportingTerminationPoint supTermPointZ = new SupportingTerminationPointBuilder()
             .setNetworkRef(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))
             .setNodeRef(new NodeId("SPDRZ-XPDR1"))
             .setTpRef(new TpId("XPDR1-NETWORK1"))
             .build();
-        Map<SupportingTerminationPointKey,SupportingTerminationPoint> supTermPointMapZ =
-                Map.of(supTermPointZ.key(), supTermPointZ);
-        TerminationPoint tpZ = new TerminationPointBuilder()
-            .setTpId(new TpId("XPDR1-NETWORK1"))
-            .setSupportingTerminationPoint(supTermPointMapZ)
-            .addAugmentation(otnTp1)
-            .addAugmentation(
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder()
-                .setTpType(OpenroadmTpType.XPONDERNETWORK)
-                .build())
-            .build();
-        List<TerminationPoint> tps = new ArrayList<>();
-        tps.add(tpA);
-        tps.add(tpZ);
-        return tps;
+        return new ArrayList<>(List.of(
+            //tpA
+            new TerminationPointBuilder()
+                .setTpId(new TpId("XPDR1-NETWORK1"))
+                .setSupportingTerminationPoint(Map.of(supTermPointA.key(), supTermPointA))
+                .addAugmentation(otnTp1)
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
+                            .TerminationPoint1Builder()
+                        .setTpType(OpenroadmTpType.XPONDERNETWORK)
+                        .build())
+                .build(),
+            //tpZ
+            new TerminationPointBuilder()
+                .setTpId(new TpId("XPDR1-NETWORK1"))
+                .setSupportingTerminationPoint(Map.of(supTermPointZ.key(), supTermPointZ))
+                .addAugmentation(otnTp1)
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
+                            .TerminationPoint1Builder()
+                        .setTpType(OpenroadmTpType.XPONDERNETWORK)
+                        .build())
+                .build()));
     }
 
-    private static Map<MappingKey,Mapping> createDegreeMappings(Map<MappingKey,Mapping> mappingMap,
-            int degNbStart, int degNbStop) {
+    private static Map<MappingKey,Mapping> createDegreeMappings(
+            Map<MappingKey,Mapping> mappingMap, int degNbStart, int degNbStop) {
         for (int i = degNbStart; i <= degNbStop; i++) {
             Mapping mapping = new MappingBuilder()
                 .setLogicalConnectionPoint("DEG" + i + "-TTP-TXRX")
@@ -243,34 +243,29 @@ public final class NetworkmodelTestUtil {
         return mappingMap;
     }
 
-    private static Map<MappingKey,Mapping> createXpdrMappings(Map<MappingKey,Mapping> mappingMap,
-            int networkPortNb, int clientPortNb,
-        XpdrNodeTypes xpdrNodeType) {
+    private static Map<MappingKey,Mapping> createXpdrMappings(
+            Map<MappingKey,Mapping> mappingMap, int networkPortNb, int clientPortNb, XpdrNodeTypes xpdrNodeType) {
         for (int i = 1; i <= networkPortNb; i++) {
-            List<Class<? extends SupportedIfCapability>> supportedIntf = new ArrayList<>();
-            supportedIntf.add(IfOCH.class);
             MappingBuilder mappingBldr = new MappingBuilder()
                 .setLogicalConnectionPoint("XPDR1-NETWORK" + i)
                 .setPortDirection("bidirectional")
                 .setSupportingPort("1")
-                .setSupportedInterfaceCapability(supportedIntf)
+                .setSupportedInterfaceCapability(new HashSet<>(Set.of(IfOCH.VALUE)))
                 .setConnectionMapLcp("XPDR1-CLIENT" + i)
                 .setPortQual(PortQual.XpdrNetwork.getName())
                 .setSupportingCircuitPackName("1/0/" + i + "-PLUG-NET");
             if (xpdrNodeType != null) {
-                mappingBldr.setXponderType(xpdrNodeType);
+                mappingBldr.setXpdrType(xpdrNodeType);
             }
             Mapping mapping = mappingBldr.build();
             mappingMap.put(mapping.key(),mapping);
         }
         for (int i = 1; i <= clientPortNb; i++) {
-            List<Class<? extends SupportedIfCapability>> supportedIntf = new ArrayList<>();
-            supportedIntf.add(If100GE.class);
             Mapping mapping = new MappingBuilder()
                 .setLogicalConnectionPoint("XPDR1-CLIENT" + i)
                 .setPortDirection("bidirectional")
                 .setSupportingPort("C1")
-                .setSupportedInterfaceCapability(supportedIntf)
+                .setSupportedInterfaceCapability(new HashSet<>(Set.of(If100GE.VALUE)))
                 .setConnectionMapLcp("XPDR1-NETWORK" + i)
                 .setPortQual(PortQual.XpdrClient.getName())
                 .setSupportingCircuitPackName("1/0/" + i + "-PLUG-CLIENT")
index d8d90aa8ddc93686926c823d46de405af47c6cc4..7fc93b862757a8e1200168f9cb98b31e51b84151 100644 (file)
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
 <data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
 <networks xmlns="urn:ietf:params:xml:ns:yang:ietf-network">
 <network>
@@ -37,8 +38,8 @@
       xmlns="http://org/openroadm/network/topology">
     <avail-freq-maps>
         <map-name>cband</map-name>
-        <start-edge-freq> 191.325</start-edge-freq>
-        <freq-map-granularity> 6.25</freq-map-granularity>
+        <start-edge-freq>191.325</start-edge-freq>
+        <freq-map-granularity>6.25</freq-map-granularity>
         <effective-bits>768</effective-bits>
         <freq-map>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         </freq-map>
     <termination-point
       xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
       <tp-id>XPDR1-CLIENT1</tp-id>
-      <associated-connection-map-port
-        xmlns="http://transportpce/topology">XPDR1-NETWORK1</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-NETWORK1</associated-connection-map-tp>
       <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
     </termination-point>
     <termination-point
       xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
       <tp-id>XPDR1-CLIENT2</tp-id>
-      <associated-connection-map-port
-        xmlns="http://transportpce/topology">XPDR1-NETWORK2</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-NETWORK2</associated-connection-map-tp>
       <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
     </termination-point>
     <termination-point
       xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
       <tp-id>XPDR1-NETWORK2</tp-id>
-      <associated-connection-map-port
-        xmlns="http://transportpce/topology">XPDR1-CLIENT2</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-CLIENT2</associated-connection-map-tp>
       <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
     </termination-point>
     <termination-point
       xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
       <tp-id>XPDR1-NETWORK1</tp-id>
-      <associated-connection-map-port
-        xmlns="http://transportpce/topology">XPDR1-CLIENT1</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-CLIENT1</associated-connection-map-tp>
       <xpdr-network-attributes
         xmlns="http://org/openroadm/network/topology">
         <tail-equipment-id>ROADM-C1-SRG1--SRG1-PP1-TXRX
       xmlns="http://org/openroadm/network/topology">
     <avail-freq-maps>
         <map-name>cband</map-name>
-        <start-edge-freq> 191.325</start-edge-freq>
-        <freq-map-granularity> 6.25</freq-map-granularity>
+        <start-edge-freq>191.325</start-edge-freq>
+        <freq-map-granularity>6.25</freq-map-granularity>
         <effective-bits>768</effective-bits>
         <freq-map>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         </freq-map>
       <degree-number>1</degree-number>
     <avail-freq-maps>
         <map-name>cband</map-name>
-        <start-edge-freq> 191.325</start-edge-freq>
-        <freq-map-granularity> 6.25</freq-map-granularity>
+        <start-edge-freq>191.325</start-edge-freq>
+        <freq-map-granularity>6.25</freq-map-granularity>
         <effective-bits>768</effective-bits>
         <freq-map>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         </freq-map>
-    </avail-freq-maps>     </degree-attributes>
+    </avail-freq-maps></degree-attributes>
     <supporting-node>
       <network-ref>clli-network</network-ref>
       <node-ref>NodeA</node-ref>
     <termination-point
       xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
       <tp-id>XPDR1-CLIENT1</tp-id>
-      <associated-connection-map-port
-        xmlns="http://transportpce/topology">XPDR1-NETWORK1</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-NETWORK1</associated-connection-map-tp>
       <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
     </termination-point>
     <termination-point
       xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
       <tp-id>XPDR1-CLIENT2</tp-id>
-      <associated-connection-map-port
-        xmlns="http://transportpce/topology">XPDR1-NETWORK2</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-NETWORK2</associated-connection-map-tp>
       <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
     </termination-point>
     <termination-point
       xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
       <tp-id>XPDR1-NETWORK2</tp-id>
-      <associated-connection-map-port
-        xmlns="http://transportpce/topology">XPDR1-CLIENT2</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-CLIENT2</associated-connection-map-tp>
       <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
     </termination-point>
     <termination-point
       xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
       <tp-id>XPDR1-NETWORK1</tp-id>
-      <associated-connection-map-port
-        xmlns="http://transportpce/topology">XPDR1-CLIENT1</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-CLIENT1</associated-connection-map-tp>
       <xpdr-network-attributes
         xmlns="http://org/openroadm/network/topology">
         <tail-equipment-id>ROADM-A1-SRG1--SRG1-PP1-TXRX
       <degree-number>2</degree-number>
     <avail-freq-maps>
         <map-name>cband</map-name>
-        <start-edge-freq> 191.325</start-edge-freq>
-        <freq-map-granularity> 6.25</freq-map-granularity>
+        <start-edge-freq>191.325</start-edge-freq>
+        <freq-map-granularity>6.25</freq-map-granularity>
         <effective-bits>768</effective-bits>
         <freq-map>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         </freq-map>
-    </avail-freq-maps>     </degree-attributes>
+    </avail-freq-maps></degree-attributes>
     <supporting-node>
       <network-ref>clli-network</network-ref>
       <node-ref>NodeA</node-ref>
       xmlns="http://org/openroadm/network/topology">
     <avail-freq-maps>
         <map-name>cband</map-name>
-        <start-edge-freq> 191.325</start-edge-freq>
-        <freq-map-granularity> 6.25</freq-map-granularity>
+        <start-edge-freq>191.325</start-edge-freq>
+        <freq-map-granularity>6.25</freq-map-granularity>
         <effective-bits>768</effective-bits>
         <freq-map>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         </freq-map>
-    </avail-freq-maps>     </srg-attributes>
+    </avail-freq-maps></srg-attributes>
     <supporting-node>
       <network-ref>clli-network</network-ref>
       <node-ref>NodeC</node-ref>
       <degree-number>1</degree-number>
     <avail-freq-maps>
         <map-name>cband</map-name>
-        <start-edge-freq> 191.325</start-edge-freq>
-        <freq-map-granularity> 6.25</freq-map-granularity>
+        <start-edge-freq>191.325</start-edge-freq>
+        <freq-map-granularity>6.25</freq-map-granularity>
         <effective-bits>768</effective-bits>
         <freq-map>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         </freq-map>
-    </avail-freq-maps>     </degree-attributes>
+    </avail-freq-maps></degree-attributes>
     <supporting-node>
       <network-ref>clli-network</network-ref>
       <node-ref>NodeC</node-ref>
       <degree-number>2</degree-number>
     <avail-freq-maps>
         <map-name>cband</map-name>
-        <start-edge-freq> 191.325</start-edge-freq>
-        <freq-map-granularity> 6.25</freq-map-granularity>
+        <start-edge-freq>191.325</start-edge-freq>
+        <freq-map-granularity>6.25</freq-map-granularity>
         <effective-bits>768</effective-bits>
         <freq-map>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
         </freq-map>
index 5b9ff1ba24e9d42089a30a84f4f6772de297034d..8b0e7dd6df3f998fc851c5b439ab179184c6b62f 100644 (file)
@@ -1,5 +1,5 @@
  {
-    "pathdescription-stub:path-description": {
+    "transportpce-stub:path-description": {
         "zToA-direction": {
             "rate": 100,
             "zToA": [
             "zToA-max-frequency": 196.125,
             "modulation-format": "dp-qpsk"
         },
-            "aToZ-direction": {
-                "aToZ": [
-                    {
-                        "id": "0",
-                        "resource": {
-                            "tp-node-id": "ROADM-A1-SRG1",
-                            "tp-id": "SRG1-PP1-TXRX"
-                        }
-                    },
-                    {
-                        "id": "1",
-                        "resource": {
-                            "node-id": "ROADM-A1-SRG1"
-                        }
-                    },
-                    {
-                        "id": "2",
-                        "resource": {
-                            "tp-node-id": "ROADM-A1-SRG1",
-                            "tp-id": "SRG1-CP-TXRX"
-                        }
-                    },
-                    {
-                        "id": "14",
-                        "resource": {
-                            "tp-node-id": "OpenROADM-2-2-SRG1",
-                            "tp-id": "SRG1-PP1-TX"
-                        }
-                    },
-                    {
-                        "id": "10",
-                        "resource": {
-                            "tp-node-id": "ROADM-C1-DEG1",
-                            "tp-id": "DEG1-CTP-TXRX"
-                        }
-                    },
-                    {
-                        "id": "11",
-                        "resource": {
-                            "link-id": "ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX"
-                        }
-                    },
-                    {
-                        "id": "12",
-                        "resource": {
-                            "tp-node-id": "ROADM-C1-SRG1",
-                            "tp-id": "SRG1-CP-TXRX"
-                        }
-                    },
-                    {
-                        "id": "13",
-                        "resource": {
-                            "node-id": "ROADM-C1-SRG1"
-                        }
-                    },
-                    {
-                        "id": "14",
-                        "resource": {
-                            "tp-node-id": "ROADM-C1-SRG1",
-                            "tp-id": "SRG1-PP1-TXRX"
-                        }
-                    },
-                    {
-                        "id": "3",
-                        "resource": {
-                            "link-id": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX"
-                        }
-                    },
-                    {
-                        "id": "4",
-                        "resource": {
-                            "tp-node-id": "ROADM-A1-DEG2",
-                            "tp-id": "DEG2-CTP-TXRX"
-                        }
-                    },
-                    {
-                        "id": "5",
-                        "resource": {
-                            "node-id": "ROADM-A1-DEG2"
-                        }
-                    },
-                    {
-                        "id": "6",
-                        "resource": {
-                            "tp-node-id": "ROADM-A1-DEG2",
-                            "tp-id": "DEG2-TTP-TXRX"
-                        }
-                    },
-                    {
-                        "id": "7",
-                        "resource": {
-                            "link-id": "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX"
-                        }
-                    },
-                    {
-                        "id": "8",
-                        "resource": {
-                            "tp-node-id": "ROADM-C1-DEG1",
-                            "tp-id": "DEG1-TTP-TXRX"
-                        }
-                    },
-                    {
-                        "id": "9",
-                        "resource": {
-                            "node-id": "ROADM-C1-DEG1"
-                        }
+        "aToZ-direction": {
+            "aToZ": [
+                {
+                    "id": "0",
+                    "resource": {
+                        "tp-node-id": "ROADM-A1-SRG1",
+                        "tp-id": "SRG1-PP1-TXRX"
+                    }
+                },
+                {
+                    "id": "1",
+                    "resource": {
+                        "node-id": "ROADM-A1-SRG1"
+                    }
+                },
+                {
+                    "id": "2",
+                    "resource": {
+                        "tp-node-id": "ROADM-A1-SRG1",
+                        "tp-id": "SRG1-CP-TXRX"
                     }
-                ],
-                "aToZ-min-frequency": 196.075,
-                "aToZ-max-frequency": 196.125,
-                "rate": 100,
-                "aToZ-wavelength-number": 1,
-                "modulation-format": "dp-qpsk"
-            }
+                },
+                {
+                    "id": "14",
+                    "resource": {
+                        "tp-node-id": "OpenROADM-2-2-SRG1",
+                        "tp-id": "SRG1-PP1-TX"
+                    }
+                },
+                {
+                    "id": "10",
+                    "resource": {
+                        "tp-node-id": "ROADM-C1-DEG1",
+                        "tp-id": "DEG1-CTP-TXRX"
+                    }
+                },
+                {
+                    "id": "11",
+                    "resource": {
+                        "link-id": "ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX"
+                    }
+                },
+                {
+                    "id": "12",
+                    "resource": {
+                        "tp-node-id": "ROADM-C1-SRG1",
+                        "tp-id": "SRG1-CP-TXRX"
+                    }
+                },
+                {
+                    "id": "13",
+                    "resource": {
+                        "node-id": "ROADM-C1-SRG1"
+                    }
+                },
+                {
+                    "id": "14",
+                    "resource": {
+                        "tp-node-id": "ROADM-C1-SRG1",
+                        "tp-id": "SRG1-PP1-TXRX"
+                    }
+                },
+                {
+                    "id": "3",
+                    "resource": {
+                        "link-id": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX"
+                    }
+                },
+                {
+                    "id": "4",
+                    "resource": {
+                        "tp-node-id": "ROADM-A1-DEG2",
+                        "tp-id": "DEG2-CTP-TXRX"
+                    }
+                },
+                {
+                    "id": "5",
+                    "resource": {
+                        "node-id": "ROADM-A1-DEG2"
+                    }
+                },
+                {
+                    "id": "6",
+                    "resource": {
+                        "tp-node-id": "ROADM-A1-DEG2",
+                        "tp-id": "DEG2-TTP-TXRX"
+                    }
+                },
+                {
+                    "id": "7",
+                    "resource": {
+                        "link-id": "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX"
+                    }
+                },
+                {
+                    "id": "8",
+                    "resource": {
+                        "tp-node-id": "ROADM-C1-DEG1",
+                        "tp-id": "DEG1-TTP-TXRX"
+                    }
+                },
+                {
+                    "id": "9",
+                    "resource": {
+                        "node-id": "ROADM-C1-DEG1"
+                    }
+                }
+            ],
+            "aToZ-min-frequency": 196.075,
+            "aToZ-max-frequency": 196.125,
+            "rate": 100,
+            "aToZ-wavelength-number": 1,
+            "modulation-format": "dp-qpsk"
+        }
         }
 }
\ No newline at end of file
index 22e3280bfa538abdc557abf9bf20a84f9810c80e..308e75c2108e4cce0c7b3ef4c5da0f6a65f81f35 100644 (file)
                             "org-openroadm-port-types:if-OCH-OTU4-ODU4"
                         ],
                         "lcp-hash-val": "Swfw02qXGyI=",
-                        "xponder-type": "mpdr",
+                        "xpdr-type": "mpdr",
                         "supporting-circuit-pack-name": "CP1-CFP0"
                     },
                     {
                             "org-openroadm-port-types:if-OCH-OTU4-ODU4"
                         ],
                         "lcp-hash-val": "exT821pFtOQ=",
-                        "xponder-type": "switch",
+                        "xpdr-type": "switch",
                         "supporting-circuit-pack-name": "CP6-CFP"
                     },
                     {
                             "org-openroadm-port-types:if-OCH-OTU4-ODU4"
                         ],
                         "lcp-hash-val": "exT821pFtOc=",
-                        "xponder-type": "switch",
+                        "xpdr-type": "switch",
                         "supporting-circuit-pack-name": "CP5-CFP"
                     },
                     {
                             "org-openroadm-port-types:if-OCH-OTU4-ODU4"
                         ],
                         "lcp-hash-val": "exT821pFtOI=",
-                        "xponder-type": "switch",
+                        "xpdr-type": "switch",
                         "supporting-circuit-pack-name": "CP8-CFP"
                     },
                     {
                             "org-openroadm-port-types:if-OCH-OTU4-ODU4"
                         ],
                         "lcp-hash-val": "exT821pFtOU=",
-                        "xponder-type": "switch",
+                        "xpdr-type": "switch",
                         "supporting-circuit-pack-name": "CP7-CFP"
                     }
                 ]
index 686a533138a25e5a8ddd30610f5fef9c2fbf1ad5..c6b3cfce4b4bcb1b8fcc19becec62d7783095248 100644 (file)
@@ -13,30 +13,59 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>8.0.11</version>
+    <version>13.0.1</version>
     <relativePath/>
   </parent>
 
   <groupId>org.opendaylight.transportpce</groupId>
   <artifactId>transportpce-olm</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
+  <version>10.0.0-SNAPSHOT</version>
   <packaging>bundle</packaging>
 
+  <properties>
+    <transportpce.models.version>20.0.0-SNAPSHOT</transportpce.models.version>
+  </properties>
+
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.opendaylight.transportpce.models</groupId>
+        <artifactId>transportpce-models-artifacts</artifactId>
+        <version>${transportpce.models.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
   <dependencies>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-common</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-1.2.1</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-device</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-2.2.1</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-network</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-7.1.0</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-device-1.2.1</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-device-2.2.1</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-device-7.1.0</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-network-13.1.0</artifactId>
     </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
@@ -56,10 +85,6 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <groupId>org.opendaylight.yangtools</groupId>
       <artifactId>yang-common</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
-      <artifactId>rfc6991-ietf-yang-types</artifactId>
-    </dependency>
     <dependency>
       <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
       <artifactId>rfc8345-ietf-network</artifactId>
@@ -84,12 +109,13 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <groupId>com.google.guava</groupId>
       <artifactId>guava</artifactId>
     </dependency>
-    <!-- Sodium bump: javax.annotation.Nullable and friends -->
     <dependency>
-      <groupId>com.google.code.findbugs</groupId>
-      <artifactId>jsr305</artifactId>
-      <version>3.0.2</version>
-      <optional>true</optional>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.service.component.annotations</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.service.metatype.annotations</artifactId>
     </dependency>
 
     <!-- Testing Dependencies -->
@@ -100,29 +126,40 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>org.opendaylight.mdsal</groupId>
-      <artifactId>mdsal-binding-generator</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-core</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.powermock</groupId>
-      <artifactId>powermock-core</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.powermock</groupId>
-      <artifactId>powermock-api-mockito2</artifactId>
+      <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+      <artifactId>rfc6991-ietf-yang-types</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>org.powermock</groupId>
-      <artifactId>powermock-module-junit4</artifactId>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>mdsal-binding-generator</artifactId>
       <scope>test</scope>
     </dependency>
   </dependencies>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>attach-artifact</id>
+            <goals>
+              <goal>attach-artifact</goal>
+            </goals>
+            <configuration>
+              <artifacts>
+                <artifact>
+                  <file>${basedir}/src/main/resources/org.opendaylight.transportpce.cfg</file>
+                  <type>cfg</type>
+                  <classifier>config</classifier>
+                </artifact>
+              </artifacts>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+    </plugins>
+  </build>
 </project>
index 604f7dbc8d633704fa3690a9f80a2e24d246415a..5fd005995ee26de1cfff0360faa6945496f683c2 100644 (file)
 
 package org.opendaylight.transportpce.olm;
 
-import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
+import org.opendaylight.transportpce.olm.rpc.impl.CalculateSpanlossBaseImpl;
+import org.opendaylight.transportpce.olm.rpc.impl.CalculateSpanlossCurrentImpl;
+import org.opendaylight.transportpce.olm.rpc.impl.GetPmImpl;
+import org.opendaylight.transportpce.olm.rpc.impl.ServicePowerResetImpl;
+import org.opendaylight.transportpce.olm.rpc.impl.ServicePowerSetupImpl;
+import org.opendaylight.transportpce.olm.rpc.impl.ServicePowerTurndownImpl;
 import org.opendaylight.transportpce.olm.service.OlmPowerService;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossBaseInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossBaseOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossCurrentInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossCurrentOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerResetInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerResetOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.TransportpceOlmService;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.opendaylight.yangtools.concepts.Registration;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * The Class OlmPowerServiceRpcImpl.
  */
-public class OlmPowerServiceRpcImpl implements TransportpceOlmService {
-    private final OlmPowerService olmPowerService;
-
-    public OlmPowerServiceRpcImpl(OlmPowerService olmPowerService) {
-        this.olmPowerService = olmPowerService;
-    }
-
-    /**
-     * This method is the implementation of the 'get-pm' RESTCONF service, which
-     * is one of the external APIs into the olm application.
-     *
-     * <p>
-     * 1. get-pm This operation traverse through current PM list and gets PM for
-     * given NodeId and Resource name
-     *
-     * <p>
-     * The signature for this method was generated by yang tools from the
-     * olm API model.
-     *
-     * @param input
-     *            Input parameter from the olm yang model
-     *
-     * @return Result of the request
-     */
-    @Override
-    public ListenableFuture<RpcResult<GetPmOutput>> getPm(GetPmInput input) {
-        return RpcResultBuilder.success(this.olmPowerService.getPm(input)).buildFuture();
-    }
-
-    /**
-     * This method is the implementation of the 'service-power-setup' RESTCONF service, which
-     * is one of the external APIs into the olm application.
-     *
-     * <p>
-     * 1. service-power-setup: This operation performs following steps:
-     *    Step1: Calculate Spanloss on all links which are part of service.
-     *    TODO Step2: Calculate power levels for each Tp-Id
-     *    TODO Step3: Post power values on roadm connections
-     *
-     * <p>
-     * The signature for this method was generated by yang tools from the
-     * olm API model.
-     *
-     * @param input
-     *            Input parameter from the olm yang model
-     *            Input will contain nodeId and termination point
-     *
-     * @return Result of the request
-     */
-    @Override
-    public ListenableFuture<RpcResult<ServicePowerSetupOutput>> servicePowerSetup(
-            ServicePowerSetupInput input) {
-        return RpcResultBuilder.success(this.olmPowerService.servicePowerSetup(input)).buildFuture();
-    }
-
-    /**
-     * This method is the implementation of the 'service-power-trundown' RESTCONF service, which
-     * is one of the external APIs into the olm application.
-     *
-     * <p>
-     * 1. service-power-turndown: This operation performs following steps:
-     *    Step1: For each TP within Node sets interface outofservice .
-     *    Step2: For each roam-connection sets power to -60dbm
-     *    Step3: Turns power mode off
-     *
-     * <p>
-     * The signature for this method was generated by yang tools from the
-     * olm API model.
-     *
-     * @param input
-     *            Input parameter from the olm yang model
-     *            Input will contain nodeId and termination point
-     *
-     * @return Result of the request
-     */
-    @Override
-    public ListenableFuture<RpcResult<ServicePowerTurndownOutput>>
-        servicePowerTurndown(ServicePowerTurndownInput input) {
-        return RpcResultBuilder.success(this.olmPowerService.servicePowerTurndown(input)).buildFuture();
-    }
-
-    /**
-     * This method calculates Spanloss for all Roadm to Roadm links,
-     * part of active inventory in Network Model or for newly added links
-     * based on input src-type.
-     *
-     * <p>
-     * 1. Calculate-Spanloss-Base: This operation performs following steps:
-     *    Step1: Read all Roadm-to-Roadm links from network model or get data for given linkID.
-     *    Step2: Retrieve PMs for each end point for OTS interface
-     *    Step3: Calculates Spanloss
-     *    Step4: Posts calculated spanloss in Device and in network model
-     *
-     * <p>
-     * The signature for this method was generated by yang tools from the
-     * renderer API model.
-     *
-     * @param input
-     *            Input parameter from the olm yang model
-     *            Input will contain SourceType and linkId if srcType is Link
-     *
-     * @return Result of the request
-     */
-    @Override
-    public ListenableFuture<RpcResult<CalculateSpanlossBaseOutput>>
-        calculateSpanlossBase(CalculateSpanlossBaseInput input) {
-        return RpcResultBuilder.success(this.olmPowerService.calculateSpanlossBase(input)).buildFuture();
+@Component
+public class OlmPowerServiceRpcImpl {
+    private static final Logger LOG = LoggerFactory.getLogger(OlmPowerServiceRpcImpl.class);
+    private Registration rpcRegistration;
+
+    @Activate
+    public OlmPowerServiceRpcImpl(@Reference OlmPowerService olmPowerService,
+            @Reference RpcProviderService rpcProviderService) {
+        this.rpcRegistration = rpcProviderService.registerRpcImplementations(
+            new GetPmImpl(olmPowerService),
+            new ServicePowerSetupImpl(olmPowerService),
+            new ServicePowerTurndownImpl(olmPowerService),
+            new CalculateSpanlossBaseImpl(olmPowerService),
+            new CalculateSpanlossCurrentImpl(olmPowerService),
+            new ServicePowerResetImpl(olmPowerService));
+        LOG.info("OlmPowerServiceRpcImpl instantiated");
     }
 
-    @Override
-    public ListenableFuture<RpcResult<CalculateSpanlossCurrentOutput>> calculateSpanlossCurrent(
-            CalculateSpanlossCurrentInput input) {
-        return RpcResultBuilder.success(this.olmPowerService.calculateSpanlossCurrent(input)).buildFuture();
+    @Deactivate
+    public void close() {
+        this.rpcRegistration.close();
+        LOG.info("OlmPowerServiceRpcImpl Closed");
     }
 
-    @Override
-    public ListenableFuture<RpcResult<ServicePowerResetOutput>> servicePowerReset(ServicePowerResetInput input) {
-        return RpcResultBuilder.success(this.olmPowerService.servicePowerReset(input)).buildFuture();
+    public Registration getRegisteredRpc() {
+        return rpcRegistration;
     }
 }
diff --git a/olm/src/main/java/org/opendaylight/transportpce/olm/OlmProvider.java b/olm/src/main/java/org/opendaylight/transportpce/olm/OlmProvider.java
deleted file mode 100644 (file)
index db28651..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright © 2017 AT&T and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.transportpce.olm;
-
-import org.opendaylight.mdsal.binding.api.RpcProviderService;
-import org.opendaylight.transportpce.olm.service.OlmPowerService;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.TransportpceOlmService;
-import org.opendaylight.yangtools.concepts.ObjectRegistration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * The Class OlmProvider.
- */
-public class OlmProvider {
-    private static final Logger LOG = LoggerFactory.getLogger(OlmProvider.class);
-    private final RpcProviderService rpcProviderService;
-    private final OlmPowerService olmPowerService;
-    private ObjectRegistration<TransportpceOlmService> olmRPCRegistration;
-
-    /**
-     * Instantiates a new olm provider.
-     * @param olmPowerService
-     *            implementation of OlmService
-     * @param rpcProviderService
-     *            the rpc provider service
-     */
-    public OlmProvider(final RpcProviderService rpcProviderService, final OlmPowerService olmPowerService) {
-        this.rpcProviderService = rpcProviderService;
-        this.olmPowerService = olmPowerService;
-    }
-
-    /**
-     * Method called when the blueprint container is created.
-     */
-    public void init() {
-        LOG.info("OlmProvider Session Initiated");
-        // Initializing Notification module
-        olmRPCRegistration = rpcProviderService.registerRpcImplementation(TransportpceOlmService.class,
-                new OlmPowerServiceRpcImpl(this.olmPowerService));
-    }
-
-    /**
-     * Method called when the blueprint container is destroyed.
-     */
-    public void close() {
-        LOG.info("OlmProvider Closed");
-        // Clean up the RPC service registration
-        if (olmRPCRegistration != null) {
-            olmRPCRegistration.close();
-        }
-    }
-}
index acd5c6d10f91bff8828731543df28f75d7287966..dda3592b2009a2f8af1404e7c4385e8dd87de256 100644 (file)
@@ -7,77 +7,96 @@
  */
 
 package org.opendaylight.transportpce.olm.power;
+
 import java.math.BigDecimal;
 import java.math.MathContext;
 import java.math.RoundingMode;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Optional;
-import org.opendaylight.mdsal.binding.api.DataBroker;
+import java.util.stream.Collectors;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.common.fixedflex.GridConstant;
+import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces;
-import org.opendaylight.transportpce.olm.util.OlmUtils;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.OpenroadmNodeVersion;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.OpenroadmNodeVersion;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.OpticalControlMode;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.Interface;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014.Interface1;
+import org.opendaylight.yangtools.yang.common.Decimal64;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@Component(configurationPid = "org.opendaylight.transportpce")
 public class PowerMgmtImpl implements PowerMgmt {
+
+    @ObjectClassDefinition
+    public @interface Configuration {
+        @AttributeDefinition
+        long timer1() default 120000;
+        @AttributeDefinition
+        long timer2() default 20000;
+    }
     private static final Logger LOG = LoggerFactory.getLogger(PowerMgmtImpl.class);
-    private final DataBroker db;
     private final OpenRoadmInterfaces openRoadmInterfaces;
     private final CrossConnect crossConnect;
     private final DeviceTransactionManager deviceTransactionManager;
+    private final PortMapping portMapping;
     private static final BigDecimal DEFAULT_TPDR_PWR_100G = new BigDecimal(-5);
     private static final BigDecimal DEFAULT_TPDR_PWR_400G = new BigDecimal(0);
     private static final String INTERFACE_NOT_PRESENT = "Interface {} on node {} is not present!";
     private static final double MC_WIDTH_GRAN = 2 * GridConstant.GRANULARITY;
 
-    private long timer1 = 120000;
+    private long timer1;
     // openroadm spec value is 120000, functest value is 3000
-    private long timer2 = 20000;
+    private long timer2;
     // openroadm spec value is 20000, functest value is 2000
 
-    public PowerMgmtImpl(DataBroker db, OpenRoadmInterfaces openRoadmInterfaces,
-                         CrossConnect crossConnect, DeviceTransactionManager deviceTransactionManager) {
-        this.db = db;
-        this.openRoadmInterfaces = openRoadmInterfaces;
-        this.crossConnect = crossConnect;
-        this.deviceTransactionManager = deviceTransactionManager;
+    @Activate
+    public PowerMgmtImpl(@Reference OpenRoadmInterfaces openRoadmInterfaces,
+            @Reference CrossConnect crossConnect,
+            @Reference DeviceTransactionManager deviceTransactionManager,
+            @Reference PortMapping portMapping, final Configuration configuration) {
+        this(openRoadmInterfaces, crossConnect, deviceTransactionManager, portMapping, configuration.timer1(),
+                configuration.timer2());
     }
 
-    public PowerMgmtImpl(DataBroker db, OpenRoadmInterfaces openRoadmInterfaces,
+    public PowerMgmtImpl(OpenRoadmInterfaces openRoadmInterfaces,
                          CrossConnect crossConnect, DeviceTransactionManager deviceTransactionManager,
-                         String timer1, String timer2) {
-        this.db = db;
+            PortMapping portMapping, long timer1, long timer2) {
         this.openRoadmInterfaces = openRoadmInterfaces;
         this.crossConnect = crossConnect;
         this.deviceTransactionManager = deviceTransactionManager;
+        this.portMapping = portMapping;
         try {
-            this.timer1 = Long.parseLong(timer1);
+            this.timer1 = Long.valueOf(timer1);
         } catch (NumberFormatException e) {
             this.timer1 = 120000;
             LOG.warn("Failed to retrieve Olm timer1 value from configuration - using default value {}",
                 this.timer1, e);
         }
         try {
-            this.timer2 = Long.parseLong(timer2);
+            this.timer2 = Long.valueOf(timer2);
         } catch (NumberFormatException e) {
             this.timer2 = 20000;
             LOG.warn("Failed to retrieve Olm timer2 value from configuration - using default value {}",
                 this.timer2, e);
         }
+        LOG.debug("PowerMgmtImpl instantiated with olm timers = {} - {}", this.timer1, this.timer2);
     }
 
     /**
@@ -96,16 +115,18 @@ public class PowerMgmtImpl implements PowerMgmt {
         String spectralSlotName = String.join(GridConstant.SPECTRAL_SLOT_SEPARATOR,
                 input.getLowerSpectralSlotNumber().toString(),
                 input.getHigherSpectralSlotNumber().toString());
+        if (input.getNodes() == null) {
+            LOG.error("No Nodes to configure");
+            return false;
+        }
         for (int i = 0; i < input.getNodes().size(); i++) {
             String nodeId = input.getNodes().get(i).getNodeId();
             String destTpId = input.getNodes().get(i).getDestTp();
-            Optional<Nodes> inputNodeOptional = OlmUtils.getNode(nodeId, this.db);
-            if (inputNodeOptional.isEmpty()
-                    || inputNodeOptional.get().getNodeInfo().getNodeType() == null) {
-                LOG.error("OLM-PowerMgmtImpl : Error node type cannot be retrieved for node {}", nodeId);
-                continue;
+            Nodes inputNode = this.portMapping.getNode(nodeId);
+            if (inputNode == null || inputNode.getNodeInfo() == null) {
+                LOG.error("OLM-PowerMgmtImpl : Error retrieving mapping node for {}", nodeId);
+                return false;
             }
-            Nodes inputNode = inputNodeOptional.get();
             OpenroadmNodeVersion openroadmVersion = inputNode.getNodeInfo().getOpenroadmVersion();
 
             switch (inputNode.getNodeInfo().getNodeType()) {
@@ -170,18 +191,18 @@ public class PowerMgmtImpl implements PowerMgmt {
                     }
                     // TODO can it be return false rather than continue?
                     // in that case, mappingObjectOptional could be moved inside method getSpanLossTx()
-                    LOG.info("Dest point is Degree {}", mappingObjectOptional.get());
-                    BigDecimal spanLossTx = getSpanLossTx(mappingObjectOptional.get().getSupportingOts(),
+                    LOG.info("Dest point is Degree {}", mappingObjectOptional.orElseThrow());
+                    BigDecimal spanLossTx = getSpanLossTx(mappingObjectOptional.orElseThrow().getSupportingOts(),
                         destTpId, nodeId, openroadmVersion.getIntValue());
 
                     LOG.info("Spanloss TX is {}", spanLossTx);
                     // TODO: The span-loss limits should be obtained from optical specifications
-                    if (spanLossTx == null || spanLossTx.intValue() <= 0 || spanLossTx.intValue() > 27) {
-                        LOG.error("Power Value is null: spanLossTx null or out of openROADM range ]0,27] {}",
+                    if (spanLossTx == null || spanLossTx.intValue() < 0 || spanLossTx.intValue() > 27) {
+                        LOG.error("Power Value is null: spanLossTx null or out of openROADM range [0,27] {}",
                             spanLossTx);
                         return false;
                     }
-                    BigDecimal powerValue = getRdmPowerValue(spanLossTx, input);
+                    Decimal64 powerValue = Decimal64.valueOf(getRdmPowerValue(spanLossTx, input));
                     try {
                         if (!crossConnect.setPowerLevel(nodeId, OpticalControlMode.Power.getName(), powerValue,
                                 connectionNumber)) {
@@ -229,8 +250,8 @@ public class PowerMgmtImpl implements PowerMgmt {
             // TODO Align protections with getSRGRxPowerRangeMap
         }
 
-        String circuitPackName = mappingObject.get().getSupportingCircuitPackName();
-        String portName = mappingObject.get().getSupportingPort();
+        String circuitPackName = mappingObject.orElseThrow().getSupportingCircuitPackName();
+        String portName = mappingObject.orElseThrow().getSupportingPort();
         switch (openroadmVersion) {
             case 1:
                 return PowerMgmtVersion121.getXponderPowerRange(circuitPackName, portName,
@@ -251,22 +272,19 @@ public class PowerMgmtImpl implements PowerMgmt {
 
     private Map<String, Double> getSRGRxPowerRangeMap(String srgId, String nodeId, Integer openroadmVersion) {
 
-        Optional<Nodes> inputNode = OlmUtils.getNode(nodeId, this.db);
-        int rdmOpenroadmVersion =
-                inputNode.isPresent()
-                    ? inputNode.get().getNodeInfo().getOpenroadmVersion().getIntValue()
-                    : openroadmVersion;
-        Optional<Mapping> mappingObject = inputNode
-                .flatMap(node -> node.nonnullMapping().values().stream()
-                    .filter(o -> o.key().equals(new MappingKey(srgId))).findFirst());
+        Nodes inputNode = this.portMapping.getNode(nodeId);
+        int rdmOpenroadmVersion = inputNode.getNodeInfo().getOpenroadmVersion().getIntValue();
+        Optional<Mapping> mappingObject = inputNode.nonnullMapping().values().stream()
+                .filter(o -> o.key().equals(new MappingKey(srgId)))
+                .findFirst();
 
         if (mappingObject.isEmpty()) {
             return new HashMap<>();
             // FIXME shouldn't it lead to a return false in setPower() ?
         }
 
-        String circuitPackName = mappingObject.get().getSupportingCircuitPackName();
-        String portName = mappingObject.get().getSupportingPort();
+        String circuitPackName = mappingObject.orElseThrow().getSupportingCircuitPackName();
+        String portName = mappingObject.orElseThrow().getSupportingPort();
         switch (rdmOpenroadmVersion) {
             case 1:
                 return PowerMgmtVersion121.getSRGRxPowerRange(nodeId, srgId,
@@ -295,14 +313,14 @@ public class PowerMgmtImpl implements PowerMgmt {
                         LOG.error(INTERFACE_NOT_PRESENT, supportingOts, nodeId);
                         return null;
                     }
-                    if (interfaceOpt.get().augmentation(Interface1.class).getOts()
+                    if (interfaceOpt.orElseThrow().augmentation(Interface1.class).getOts()
                             .getSpanLossTransmit() == null) {
-                        LOG.error("interface {} has no spanloss value", interfaceOpt.get().getName());
+                        LOG.error("interface {} has no spanloss value", interfaceOpt.orElseThrow().getName());
                         return null;
                     }
-                    return interfaceOpt.get()
+                    return interfaceOpt.orElseThrow()
                             .augmentation(Interface1.class)
-                            .getOts().getSpanLossTransmit().getValue();
+                            .getOts().getSpanLossTransmit().getValue().decimalValue();
                 case 2:
                     Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019
                             .interfaces.grp.Interface> interfaceOpt1 =
@@ -311,16 +329,16 @@ public class PowerMgmtImpl implements PowerMgmt {
                         LOG.error(INTERFACE_NOT_PRESENT, supportingOts, nodeId);
                         return null;
                     }
-                    if (interfaceOpt1.get().augmentation(org.opendaylight.yang.gen.v1.http.org
+                    if (interfaceOpt1.orElseThrow().augmentation(org.opendaylight.yang.gen.v1.http.org
                             .openroadm.optical.transport.interfaces.rev181019.Interface1.class).getOts()
                                 .getSpanLossTransmit() == null) {
-                        LOG.error("interface {} has no spanloss value", interfaceOpt1.get().getName());
+                        LOG.error("interface {} has no spanloss value", interfaceOpt1.orElseThrow().getName());
                         return null;
                     }
-                    return interfaceOpt1.get()
+                    return interfaceOpt1.orElseThrow()
                             .augmentation(org.opendaylight.yang.gen.v1.http.org
                                 .openroadm.optical.transport.interfaces.rev181019.Interface1.class)
-                            .getOts().getSpanLossTransmit().getValue();
+                            .getOts().getSpanLossTransmit().getValue().decimalValue();
                 // TODO no case 3 ?
                 default:
                     return null;
@@ -444,8 +462,8 @@ public class PowerMgmtImpl implements PowerMgmt {
                     input.getNodes().get(i).getSrcTp(), destTpId, spectralSlotName);
             try {
                 if (destTpId.toUpperCase(Locale.getDefault()).contains("DEG")) {
-                    if (!crossConnect.setPowerLevel(nodeId, OpticalControlMode.Power.getName(), new BigDecimal(-60),
-                            connectionNumber)) {
+                    if (!crossConnect.setPowerLevel(nodeId, OpticalControlMode.Power.getName(),
+                            Decimal64.valueOf("-60"), connectionNumber)) {
                         LOG.warn("Power down failed for Roadm-connection: {}", connectionNumber);
                         return false;
                     }
@@ -497,7 +515,7 @@ public class PowerMgmtImpl implements PowerMgmt {
                         return false;
                     }
                     powerSetupResult = PowerMgmtVersion121.setTransponderPower(nodeId, interfaceName,
-                            txPower, deviceTransactionManager, interfaceOptional121.get());
+                            txPower, deviceTransactionManager, interfaceOptional121.orElseThrow());
                     break;
                 case 2:
                     Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp
@@ -508,7 +526,7 @@ public class PowerMgmtImpl implements PowerMgmt {
                         return false;
                     }
                     powerSetupResult = PowerMgmtVersion221.setTransponderPower(nodeId, interfaceName,
-                            txPower, deviceTransactionManager, interfaceOptional221.get());
+                            txPower, deviceTransactionManager, interfaceOptional221.orElseThrow());
                     break;
                 case 3:
                     Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.interfaces.grp
@@ -518,8 +536,19 @@ public class PowerMgmtImpl implements PowerMgmt {
                         LOG.error(INTERFACE_NOT_PRESENT, interfaceName, nodeId);
                         return false;
                     }
+                    // Check the support-interface-cap type
+                    // Get the logical connection point name from the interface-name, by splitting it by "-"
+                    // and discard the last part. For instance XPDR1-NETWORK1-xxx:xxx
+                    String logicalConnectionPoint =
+                        Arrays.stream(interfaceName.split("-", 3)).limit(2).collect(Collectors.joining("-"));
+                    LOG.info("Logical connection point {} for Interface {}", logicalConnectionPoint, interfaceName);
+                    Mapping portMap = portMapping.getMapping(nodeId, logicalConnectionPoint);
+                    if (portMap == null) {
+                        throw new OpenRoadmInterfaceException(
+                                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnectionPoint));
+                    }
                     powerSetupResult = PowerMgmtVersion710.setTransponderPower(nodeId, interfaceName,
-                            txPower, deviceTransactionManager, interfaceOptional710.get());
+                        txPower, deviceTransactionManager, interfaceOptional710.orElseThrow(), portMap);
                     break;
                 default:
                     LOG.error("Unrecognized OpenRoadm version");
index f233adf6fb475921ea03c2cd01a5123c1692f8a7..315626b26a11c90301abd9ed0bcb3ddffccf02ea 100644 (file)
@@ -24,6 +24,7 @@ import org.opendaylight.transportpce.common.device.DeviceTransaction;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.OpticalControlMode;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.PowerDBm;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.Ports;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.pack.PortsKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.circuit.packs.CircuitPacks;
@@ -38,6 +39,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.open
 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev161014.Interface1Builder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev161014.och.container.OchBuilder;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -62,16 +64,18 @@ public final class PowerMgmtVersion121 {
      */
     public static Map<String, Double> getXponderPowerRange(String circuitPackName, String portName, String deviceId,
             DeviceTransactionManager deviceTransactionManager) {
-        InstanceIdentifier<Ports> portIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName))
-                .child(Ports.class, new PortsKey(portName));
+        InstanceIdentifier<Ports> portIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName))
+            .child(Ports.class, new PortsKey(portName))
+            .build();
         Map<String, Double> powerRangeMap = new HashMap<>();
         LOG.debug("Fetching logical Connection Point value for port {} at circuit pack {}", portName, circuitPackName);
         Optional<Ports> portObject =
                 deviceTransactionManager.getDataFromDevice(deviceId, LogicalDatastoreType.OPERATIONAL, portIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
         if (portObject.isPresent()) {
-            Ports port = portObject.get();
+            Ports port = portObject.orElseThrow();
             if (port.getTransponderPort().getPortPowerCapabilityMaxTx() != null) {
                 powerRangeMap.put("MaxTx", port.getTransponderPort().getPortPowerCapabilityMaxTx().getValue()
                         .doubleValue());
@@ -105,16 +109,18 @@ public final class PowerMgmtVersion121 {
         Map<String, Double> powerRangeMap = new HashMap<>();
         LOG.debug("Coming inside SRG power range");
         LOG.debug("Mapping object exists.");
-        InstanceIdentifier<Ports> portIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName))
-                .child(Ports.class, new PortsKey(portName));
+        InstanceIdentifier<Ports> portIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName))
+            .child(Ports.class, new PortsKey(portName))
+            .build();
         LOG.debug("Fetching logical Connection Point value for port {} at circuit pack {}{}", portName,
                 circuitPackName, portIID);
         Optional<Ports> portObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, portIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
         if (portObject.isPresent()) {
-            Ports port = portObject.get();
+            Ports port = portObject.orElseThrow();
             if (port.getRoadmPort() != null) {
                 LOG.debug("Port found on the node ID");
                 powerRangeMap.put("MinRx", port.getRoadmPort()
@@ -158,14 +164,14 @@ public final class PowerMgmtVersion121 {
         OchBuilder ochBuilder = new OchBuilder(ochInterfaceBuilder.augmentation(
                 org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev161014
                         .Interface1.class).getOch());
-        ochBuilder.setTransmitPower(new PowerDBm(txPower));
+        ochBuilder.setTransmitPower(new PowerDBm(Decimal64.valueOf(txPower)));
         ochInterfaceBuilder.addAugmentation(new Interface1Builder().setOch(ochBuilder.build()).build());
         Future<Optional<DeviceTransaction>> deviceTxFuture = deviceTransactionManager.getDeviceTransaction(nodeId);
         DeviceTransaction deviceTx;
         try {
             Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
             if (deviceTxOpt.isPresent()) {
-                deviceTx = deviceTxOpt.get();
+                deviceTx = deviceTxOpt.orElseThrow();
             } else {
                 LOG.error("Transaction for device {} was not found during transponder"
                         + " power setup for Node:", nodeId);
@@ -176,8 +182,10 @@ public final class PowerMgmtVersion121 {
                     + "setup!", nodeId, e);
             return false;
         }
-        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(Interface.class, new InterfaceKey(interfaceName));
+        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Interface.class, new InterfaceKey(interfaceName))
+            .build();
         deviceTx.merge(LogicalDatastoreType.CONFIGURATION, interfacesIID, ochInterfaceBuilder.build());
         FluentFuture<? extends @NonNull CommitInfo> commit =
             deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
@@ -218,10 +226,10 @@ public final class PowerMgmtVersion121 {
         @SuppressWarnings("unchecked") Optional<RoadmConnections> rdmConnOpt =
             (Optional<RoadmConnections>) crossConnect.getCrossConnect(deviceId, connectionNumber);
         if (rdmConnOpt.isPresent()) {
-            RoadmConnectionsBuilder rdmConnBldr = new RoadmConnectionsBuilder(rdmConnOpt.get());
+            RoadmConnectionsBuilder rdmConnBldr = new RoadmConnectionsBuilder(rdmConnOpt.orElseThrow());
             rdmConnBldr.setOpticalControlMode(mode);
             if (powerValue != null) {
-                rdmConnBldr.setTargetOutputPower(new PowerDBm(powerValue));
+                rdmConnBldr.setTargetOutputPower(new PowerDBm(Decimal64.valueOf(powerValue)));
             }
             RoadmConnections newRdmConn = rdmConnBldr.build();
             Future<Optional<DeviceTransaction>> deviceTxFuture =
@@ -230,7 +238,7 @@ public final class PowerMgmtVersion121 {
             try {
                 Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
                 if (deviceTxOpt.isPresent()) {
-                    deviceTx = deviceTxOpt.get();
+                    deviceTx = deviceTxOpt.orElseThrow();
                 } else {
                     LOG.error("Transaction for device {} was not found!", deviceId);
                     return false;
@@ -240,8 +248,10 @@ public final class PowerMgmtVersion121 {
                 return false;
             }
             // post the cross connect on the device
-            InstanceIdentifier<RoadmConnections> roadmConnIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                    .child(RoadmConnections.class, new RoadmConnectionsKey(connectionNumber));
+            InstanceIdentifier<RoadmConnections> roadmConnIID = InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(RoadmConnections.class, new RoadmConnectionsKey(connectionNumber))
+                .build();
             deviceTx.merge(LogicalDatastoreType.CONFIGURATION, roadmConnIID, newRdmConn);
             FluentFuture<? extends @NonNull CommitInfo> commit =
                 deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
index 265cf9dedcd6ac6cb7d9bf45d0d7078103b7effd..7e37699f35cb5b4d2853da37224a49de4654ac78 100644 (file)
@@ -24,6 +24,7 @@ import org.opendaylight.transportpce.common.device.DeviceTransaction;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.OpticalControlMode;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.PowerDBm;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.circuit.pack.Ports;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.circuit.pack.PortsKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.circuit.packs.CircuitPacks;
@@ -39,6 +40,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interface
 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev181019.Interface1Builder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev181019.och.container.OchBuilder;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -65,16 +67,18 @@ public final class PowerMgmtVersion221 {
      */
     public static Map<String, Double> getXponderPowerRange(String circuitPackName, String portName, String deviceId,
             DeviceTransactionManager deviceTransactionManager) {
-        InstanceIdentifier<Ports> portIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName))
-                .child(Ports.class, new PortsKey(portName));
+        InstanceIdentifier<Ports> portIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName))
+            .child(Ports.class, new PortsKey(portName))
+            .build();
         Map<String, Double> powerRangeMap = new HashMap<>();
         LOG.debug("Fetching logical Connection Point value for port {} at circuit pack {}", portName, circuitPackName);
         Optional<Ports> portObject =
                 deviceTransactionManager.getDataFromDevice(deviceId, LogicalDatastoreType.OPERATIONAL, portIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
         if (portObject.isPresent()) {
-            Ports port = portObject.get();
+            Ports port = portObject.orElseThrow();
             if (port.getTransponderPort() != null && port.getTransponderPort().getPortPowerCapabilityMaxTx() != null) {
                 powerRangeMap.put("MaxTx", port.getTransponderPort().getPortPowerCapabilityMaxTx().getValue()
                         .doubleValue());
@@ -108,16 +112,18 @@ public final class PowerMgmtVersion221 {
         Map<String, Double> powerRangeMap = new HashMap<>();
         LOG.debug("Coming inside SRG power range");
         LOG.debug("Mapping object exists.");
-        InstanceIdentifier<Ports> portIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName))
-                .child(Ports.class, new PortsKey(portName));
+        InstanceIdentifier<Ports> portIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName))
+            .child(Ports.class, new PortsKey(portName))
+            .build();
         LOG.debug("Fetching logical Connection Point value for port {} at circuit pack {}{}", portName,
                 circuitPackName, portIID);
         Optional<Ports> portObject =
                 deviceTransactionManager.getDataFromDevice(nodeId, LogicalDatastoreType.OPERATIONAL, portIID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
         if (portObject.isPresent()) {
-            Ports port = portObject.get();
+            Ports port = portObject.orElseThrow();
             if (port.getRoadmPort() != null) {
                 LOG.debug("Port found on the node ID");
                 powerRangeMap.put("MinRx", port.getRoadmPort()
@@ -160,14 +166,14 @@ public final class PowerMgmtVersion221 {
                 new InterfaceBuilder(interfaceObj);
         OchBuilder ochBuilder = new OchBuilder(ochInterfaceBuilder.augmentation(
                 Interface1.class).getOch());
-        ochBuilder.setTransmitPower(new PowerDBm(txPower));
+        ochBuilder.setTransmitPower(new PowerDBm(Decimal64.valueOf(txPower)));
         ochInterfaceBuilder.addAugmentation(new Interface1Builder().setOch(ochBuilder.build()).build());
         Future<Optional<DeviceTransaction>> deviceTxFuture = deviceTransactionManager.getDeviceTransaction(nodeId);
         DeviceTransaction deviceTx;
         try {
             Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
             if (deviceTxOpt.isPresent()) {
-                deviceTx = deviceTxOpt.get();
+                deviceTx = deviceTxOpt.orElseThrow();
             } else {
                 LOG.error("Transaction for device {} was not found during transponder"
                         + " power setup for Node:", nodeId);
@@ -178,8 +184,10 @@ public final class PowerMgmtVersion221 {
                     + "setup!", nodeId, e);
             return false;
         }
-        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(Interface.class, new InterfaceKey(interfaceName));
+        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Interface.class, new InterfaceKey(interfaceName))
+            .build();
         deviceTx.merge(LogicalDatastoreType.CONFIGURATION, interfacesIID, ochInterfaceBuilder.build());
         FluentFuture<? extends @NonNull CommitInfo> commit =
             deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
@@ -219,10 +227,10 @@ public final class PowerMgmtVersion221 {
         @SuppressWarnings("unchecked") Optional<RoadmConnections> rdmConnOpt =
             (Optional<RoadmConnections>) crossConnect.getCrossConnect(deviceId, connectionNumber);
         if (rdmConnOpt.isPresent()) {
-            RoadmConnectionsBuilder rdmConnBldr = new RoadmConnectionsBuilder(rdmConnOpt.get());
+            RoadmConnectionsBuilder rdmConnBldr = new RoadmConnectionsBuilder(rdmConnOpt.orElseThrow());
             rdmConnBldr.setOpticalControlMode(mode);
             if (powerValue != null) {
-                rdmConnBldr.setTargetOutputPower(new PowerDBm(powerValue));
+                rdmConnBldr.setTargetOutputPower(new PowerDBm(Decimal64.valueOf(powerValue)));
             }
             RoadmConnections newRdmConn = rdmConnBldr.build();
             Future<Optional<DeviceTransaction>> deviceTxFuture =
@@ -231,7 +239,7 @@ public final class PowerMgmtVersion221 {
             try {
                 Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
                 if (deviceTxOpt.isPresent()) {
-                    deviceTx = deviceTxOpt.get();
+                    deviceTx = deviceTxOpt.orElseThrow();
                 } else {
                     LOG.error("Transaction for device {} was not found!", deviceId);
                     return false;
@@ -241,8 +249,10 @@ public final class PowerMgmtVersion221 {
                 return false;
             }
             // post the cross connect on the device
-            InstanceIdentifier<RoadmConnections> roadmConnIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                    .child(RoadmConnections.class, new RoadmConnectionsKey(connectionNumber));
+            InstanceIdentifier<RoadmConnections> roadmConnIID = InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(RoadmConnections.class, new RoadmConnectionsKey(connectionNumber))
+                .build();
             deviceTx.merge(LogicalDatastoreType.CONFIGURATION, roadmConnIID, newRdmConn);
             FluentFuture<? extends @NonNull CommitInfo> commit =
                 deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
index fc33e1890debc5edca8b50d3da8bfe971796a54d..b62a01472228abfd8c86748357e72115b3b665e4 100644 (file)
@@ -22,8 +22,10 @@ import org.opendaylight.transportpce.common.Timeouts;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
 import org.opendaylight.transportpce.common.device.DeviceTransaction;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.link.types.rev191129.OpticalControlMode;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.link.types.rev191129.PowerDBm;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.circuit.pack.Ports;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.circuit.pack.PortsKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.circuit.packs.CircuitPacks;
@@ -35,10 +37,15 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.open
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.RoadmConnections;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.RoadmConnectionsBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.org.openroadm.device.container.org.openroadm.device.RoadmConnectionsKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev200529.och.container.OchBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.tributary.signal.interfaces.rev200529.Interface1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.tributary.signal.interfaces.rev200529.Interface1Builder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.tributary.signal.interfaces.rev200529.otsi.container.OtsiBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOCH;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOCHOTU4ODU4;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOtsiOtsigroup;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -65,9 +72,11 @@ public final class PowerMgmtVersion710 {
      */
     public static Map<String, Double> getXponderPowerRange(String circuitPackName, String portName, String deviceId,
             DeviceTransactionManager deviceTransactionManager) {
-        InstanceIdentifier<Ports> portIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName))
-                .child(Ports.class, new PortsKey(portName));
+        InstanceIdentifier<Ports> portIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName))
+            .child(Ports.class, new PortsKey(portName))
+            .build();
         LOG.debug("Fetching logical Connection Point value for port {} at circuit pack {}", portName, circuitPackName);
         Optional<Ports> portObject =
                 deviceTransactionManager.getDataFromDevice(deviceId, LogicalDatastoreType.OPERATIONAL, portIID,
@@ -75,7 +84,7 @@ public final class PowerMgmtVersion710 {
         if (!portObject.isPresent()) {
             return new HashMap<>();
         }
-        Ports port = portObject.get();
+        Ports port = portObject.orElseThrow();
         if (port.getTransponderPort() == null || port.getTransponderPort().getPortPowerCapabilityMaxTx() == null) {
             LOG.warn("Logical Connection Point value missing for {} {}", circuitPackName, port.getPortName());
             return new HashMap<>();
@@ -106,9 +115,11 @@ public final class PowerMgmtVersion710 {
             String circuitPackName, String portName) {
         LOG.debug("Coming inside SRG power range");
         LOG.debug("Mapping object exists.");
-        InstanceIdentifier<Ports> portIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName))
-                .child(Ports.class, new PortsKey(portName));
+        InstanceIdentifier<Ports> portIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(CircuitPacks.class, new CircuitPacksKey(circuitPackName))
+            .child(Ports.class, new PortsKey(portName))
+            .build();
         LOG.debug("Fetching logical Connection Point value for port {} at circuit pack {}{}", portName,
                 circuitPackName, portIID);
         Optional<Ports> portObject =
@@ -118,7 +129,7 @@ public final class PowerMgmtVersion710 {
             LOG.info("Port not found");
             return new HashMap<>();
         }
-        Ports port = portObject.get();
+        Ports port = portObject.orElseThrow();
         if (port.getRoadmPort() == null) {
             LOG.warn("Roadm ports power value is missing for {} {}", circuitPackName, port.getPortName());
             return new HashMap<>();
@@ -148,31 +159,56 @@ public final class PowerMgmtVersion710 {
      * @return true/false based on status of operation
      */
     public static boolean setTransponderPower(String nodeId, String interfaceName, BigDecimal txPower,
-            DeviceTransactionManager deviceTransactionManager,
-            Interface interfaceObj) {
+            DeviceTransactionManager deviceTransactionManager, Interface interfaceObj, Mapping portMap) {
         LOG.debug("Setting target-power for transponder nodeId: {} InterfaceName: {}",
                 nodeId, interfaceName);
-        InterfaceBuilder otsiInterfaceBuilder = new InterfaceBuilder(interfaceObj);
-        OtsiBuilder otsiBuilder = new OtsiBuilder(otsiInterfaceBuilder.augmentation(Interface1.class).getOtsi());
-        otsiBuilder.setTransmitPower(new PowerDBm(txPower));
-        otsiInterfaceBuilder.addAugmentation(new Interface1Builder().setOtsi(otsiBuilder.build()).build());
+        // Transponder port can have a port-capability of 100 or 400G
+        // from port-mapping check if has OCH-OTU-ODU cap or OTSI cap
+        // need to set power for OCH port
+        InterfaceBuilder ochOtsiInterfaceBuilder = new InterfaceBuilder(interfaceObj);
+        if (portMap.getSupportedInterfaceCapability().contains(IfOCHOTU4ODU4.VALUE)
+                || portMap.getSupportedInterfaceCapability().contains(IfOCH.VALUE)) {
+            ochOtsiInterfaceBuilder
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev200529
+                            .Interface1Builder()
+                        .setOch(
+                            new OchBuilder(
+                                    ochOtsiInterfaceBuilder
+                                        .augmentation(org.opendaylight.yang.gen.v1.http
+                                            .org.openroadm.optical.channel.interfaces.rev200529.Interface1.class)
+                                        .getOch())
+                                .setTransmitPower(new PowerDBm(Decimal64.valueOf(txPower)))
+                                .build())
+                        .build());
+        } else if (portMap.getSupportedInterfaceCapability().contains(IfOtsiOtsigroup.VALUE)) {
+            ochOtsiInterfaceBuilder
+                .addAugmentation(
+                    new Interface1Builder()
+                        .setOtsi(
+                            new OtsiBuilder(ochOtsiInterfaceBuilder.augmentation(Interface1.class).getOtsi())
+                                .setTransmitPower(new PowerDBm(Decimal64.valueOf(txPower)))
+                                .build())
+                        .build());
+        }
         Future<Optional<DeviceTransaction>> deviceTxFuture = deviceTransactionManager.getDeviceTransaction(nodeId);
         DeviceTransaction deviceTx;
         try {
             Optional<DeviceTransaction> deviceTxOpt = deviceTxFuture.get();
-            if (deviceTxOpt.isPresent()) {
-                deviceTx = deviceTxOpt.get();
-            } else {
+            if (deviceTxOpt.isEmpty()) {
                 LOG.error("Transaction for device {} was not found during transponder power setup for Node:", nodeId);
                 return false;
             }
+            deviceTx = deviceTxOpt.orElseThrow();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Unable to get transaction for device {} during transponder power setup!", nodeId, e);
             return false;
         }
-        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(Interface.class, new InterfaceKey(interfaceName));
-        deviceTx.merge(LogicalDatastoreType.CONFIGURATION, interfacesIID, otsiInterfaceBuilder.build());
+        InstanceIdentifier<Interface> interfacesIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Interface.class, new InterfaceKey(interfaceName))
+            .build();
+        deviceTx.merge(LogicalDatastoreType.CONFIGURATION, interfacesIID, ochOtsiInterfaceBuilder.build());
         FluentFuture<? extends @NonNull CommitInfo> commit =
             deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
         try {
@@ -214,10 +250,10 @@ public final class PowerMgmtVersion710 {
             LOG.warn("Roadm-Connection is null in set power level ({})", connectionNumber);
             return false;
         }
-        RoadmConnectionsBuilder rdmConnBldr = new RoadmConnectionsBuilder(rdmConnOpt.get());
+        RoadmConnectionsBuilder rdmConnBldr = new RoadmConnectionsBuilder(rdmConnOpt.orElseThrow());
         rdmConnBldr.setOpticalControlMode(mode);
         if (powerValue != null) {
-            rdmConnBldr.setTargetOutputPower(new PowerDBm(powerValue));
+            rdmConnBldr.setTargetOutputPower(new PowerDBm(Decimal64.valueOf(powerValue)));
         }
         RoadmConnections newRdmConn = rdmConnBldr.build();
         Future<Optional<DeviceTransaction>> deviceTxFuture = deviceTransactionManager.getDeviceTransaction(deviceId);
@@ -228,14 +264,16 @@ public final class PowerMgmtVersion710 {
                 LOG.error("Transaction for device {} was not found!", deviceId);
                 return false;
             }
-            deviceTx = deviceTxOpt.get();
+            deviceTx = deviceTxOpt.orElseThrow();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Unable to get transaction for device {}!", deviceId, e);
             return false;
         }
         // post the cross connect on the device
-        InstanceIdentifier<RoadmConnections> roadmConnIID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(RoadmConnections.class, new RoadmConnectionsKey(connectionNumber));
+        InstanceIdentifier<RoadmConnections> roadmConnIID = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(RoadmConnections.class, new RoadmConnectionsKey(connectionNumber))
+            .build();
         deviceTx.merge(LogicalDatastoreType.CONFIGURATION, roadmConnIID, newRdmConn);
         FluentFuture<? extends @NonNull CommitInfo> commit =
             deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT);
diff --git a/olm/src/main/java/org/opendaylight/transportpce/olm/rpc/impl/CalculateSpanlossBaseImpl.java b/olm/src/main/java/org/opendaylight/transportpce/olm/rpc/impl/CalculateSpanlossBaseImpl.java
new file mode 100644 (file)
index 0000000..95d0e59
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.olm.rpc.impl;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.transportpce.olm.service.OlmPowerService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossBase;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossBaseInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossBaseOutput;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+
+
+
+/**
+ * This class calculates Spanloss for all Roadm to Roadm links,
+ * part of active inventory in Network Model or for newly added links
+ * based on input src-type.
+ *
+ * <p>
+ * 1. Calculate-Spanloss-Base: This operation performs following steps:
+ *    Step1: Read all Roadm-to-Roadm links from network model or get data for given linkID.
+ *    Step2: Retrieve PMs for each end point for OTS interface
+ *    Step3: Calculates Spanloss
+ *    Step4: Posts calculated spanloss in Device and in network model
+ *
+ * <p>
+ * The signature for this method was generated by yang tools from the
+ * renderer API model.
+ */
+public class CalculateSpanlossBaseImpl implements CalculateSpanlossBase {
+    private final OlmPowerService olmPowerService;
+
+    public CalculateSpanlossBaseImpl(final OlmPowerService olmPowerService) {
+        this.olmPowerService = requireNonNull(olmPowerService);
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<CalculateSpanlossBaseOutput>> invoke(CalculateSpanlossBaseInput input) {
+        return RpcResultBuilder.success(this.olmPowerService.calculateSpanlossBase(input)).buildFuture();
+    }
+
+}
diff --git a/olm/src/main/java/org/opendaylight/transportpce/olm/rpc/impl/CalculateSpanlossCurrentImpl.java b/olm/src/main/java/org/opendaylight/transportpce/olm/rpc/impl/CalculateSpanlossCurrentImpl.java
new file mode 100644 (file)
index 0000000..701e7b0
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.olm.rpc.impl;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.transportpce.olm.service.OlmPowerService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossCurrent;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossCurrentInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossCurrentOutput;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+
+
+public class CalculateSpanlossCurrentImpl implements CalculateSpanlossCurrent {
+    private final OlmPowerService olmPowerService;
+
+    public CalculateSpanlossCurrentImpl(final OlmPowerService olmPowerService) {
+        this.olmPowerService = requireNonNull(olmPowerService);
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<CalculateSpanlossCurrentOutput>> invoke(CalculateSpanlossCurrentInput input) {
+        return RpcResultBuilder.success(this.olmPowerService.calculateSpanlossCurrent(input)).buildFuture();
+    }
+
+}
diff --git a/olm/src/main/java/org/opendaylight/transportpce/olm/rpc/impl/GetPmImpl.java b/olm/src/main/java/org/opendaylight/transportpce/olm/rpc/impl/GetPmImpl.java
new file mode 100644 (file)
index 0000000..5aae1cf
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.olm.rpc.impl;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.transportpce.olm.service.OlmPowerService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPm;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmOutput;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * This class is the implementation of the 'get-pm' RESTCONF service, which
+ * is one of the external APIs into the olm application.
+ *
+ *<p>
+ * This operation traverse through current PM list and gets PM for
+ * given NodeId and Resource name
+ */
+public final class GetPmImpl implements GetPm {
+    private static final Logger LOG = LoggerFactory.getLogger(GetPmImpl.class);
+    private final OlmPowerService olmPowerService;
+
+    public GetPmImpl(final OlmPowerService olmPowerService) {
+        this.olmPowerService = requireNonNull(olmPowerService);
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<GetPmOutput>> invoke(final GetPmInput input) {
+        if (input.getNodeId() == null) {
+            LOG.error("getPm: NodeId can not be null");
+            return RpcResultBuilder.<GetPmOutput>failed()
+                    .withError(ErrorType.RPC, "Error with input parameters")
+                    .buildFuture();
+        }
+        return RpcResultBuilder.success(this.olmPowerService.getPm(input)).buildFuture();
+    }
+}
diff --git a/olm/src/main/java/org/opendaylight/transportpce/olm/rpc/impl/ServicePowerResetImpl.java b/olm/src/main/java/org/opendaylight/transportpce/olm/rpc/impl/ServicePowerResetImpl.java
new file mode 100644 (file)
index 0000000..3ac09c0
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.olm.rpc.impl;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.transportpce.olm.service.OlmPowerService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerReset;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerResetInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerResetOutput;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+
+
+public class ServicePowerResetImpl implements ServicePowerReset {
+    private final OlmPowerService olmPowerService;
+
+    public ServicePowerResetImpl(final OlmPowerService olmPowerService) {
+        this.olmPowerService = requireNonNull(olmPowerService);
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<ServicePowerResetOutput>> invoke(ServicePowerResetInput input) {
+        return RpcResultBuilder.success(this.olmPowerService.servicePowerReset(input)).buildFuture();
+    }
+
+}
diff --git a/olm/src/main/java/org/opendaylight/transportpce/olm/rpc/impl/ServicePowerSetupImpl.java b/olm/src/main/java/org/opendaylight/transportpce/olm/rpc/impl/ServicePowerSetupImpl.java
new file mode 100644 (file)
index 0000000..4b798c5
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.olm.rpc.impl;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.transportpce.olm.service.OlmPowerService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetup;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupOutput;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+
+/**
+ * This class is the implementation of the 'service-power-setup' RESTCONF service, which
+ * is one of the external APIs into the olm application.
+ *
+ * <p>
+ * 1. service-power-setup: This operation performs following steps:
+ *    Step1: Calculate Spanloss on all links which are part of service.
+ *    TODO Step2: Calculate power levels for each Tp-Id
+ *    TODO Step3: Post power values on roadm connections
+ *
+ * <p>
+ * The signature for this method was generated by yang tools from the
+ * olm API model.
+ */
+public class ServicePowerSetupImpl implements ServicePowerSetup {
+    private final OlmPowerService olmPowerService;
+
+    public ServicePowerSetupImpl(final OlmPowerService olmPowerService) {
+        this.olmPowerService = requireNonNull(olmPowerService);
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<ServicePowerSetupOutput>> invoke(ServicePowerSetupInput input) {
+        return RpcResultBuilder.success(this.olmPowerService.servicePowerSetup(input)).buildFuture();
+    }
+
+}
diff --git a/olm/src/main/java/org/opendaylight/transportpce/olm/rpc/impl/ServicePowerTurndownImpl.java b/olm/src/main/java/org/opendaylight/transportpce/olm/rpc/impl/ServicePowerTurndownImpl.java
new file mode 100644 (file)
index 0000000..a250d93
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.olm.rpc.impl;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.transportpce.olm.service.OlmPowerService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndown;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownOutput;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+
+/**
+ * This class is the implementation of the 'service-power-trundown' RESTCONF service, which
+ * is one of the external APIs into the olm application.
+ *
+ * <p>
+ * 1. service-power-turndown: This operation performs following steps:
+ *    Step1: For each TP within Node sets interface outofservice .
+ *    Step2: For each roam-connection sets power to -60dbm
+ *    Step3: Turns power mode off
+ *
+ * <p>
+ * The signature for this method was generated by yang tools from the
+ * olm API model.
+ */
+public class ServicePowerTurndownImpl implements ServicePowerTurndown {
+    private final OlmPowerService olmPowerService;
+
+    public ServicePowerTurndownImpl(final OlmPowerService olmPowerService) {
+        this.olmPowerService = requireNonNull(olmPowerService);
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<ServicePowerTurndownOutput>> invoke(ServicePowerTurndownInput input) {
+        return RpcResultBuilder.success(this.olmPowerService.servicePowerTurndown(input)).buildFuture();
+    }
+
+}
index 910495ee56e1cc49a9d11b469bcf588aac53d19c..e04a12c94c301cfe277038650331cbd46c58d167 100644 (file)
@@ -62,21 +62,21 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev21
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.calculate.spanloss.base.output.Spans;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.calculate.spanloss.base.output.SpansBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.get.pm.output.Measurements;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.OpenroadmNodeVersion;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.OpenroadmNodeVersion;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.RatioDB;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.Interface;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.InterfaceBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014.Interface1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014.Interface1Builder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014.ots.container.Ots;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014.ots.container.OtsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.PmGranularity;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev161014.ResourceTypeEnum;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.PmNamesEnum;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.olm.get.pm.input.ResourceIdentifierBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.PmGranularity;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.PmNamesEnum;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.olm.get.pm.input.ResourceIdentifierBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
@@ -91,9 +91,14 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.top
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Decimal64;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@Component
 public class OlmPowerServiceImpl implements OlmPowerService {
     private static final Logger LOG = LoggerFactory.getLogger(OlmPowerServiceImpl.class);
     private final MappingUtils mappingUtils;
@@ -103,39 +108,38 @@ public class OlmPowerServiceImpl implements OlmPowerService {
     private final DeviceTransactionManager deviceTransactionManager;
     private final PortMapping portMapping;
 
-    public OlmPowerServiceImpl(DataBroker dataBroker, PowerMgmt powerMgmt,
-                               DeviceTransactionManager deviceTransactionManager, PortMapping portMapping,
-                               MappingUtils mappingUtils, OpenRoadmInterfaces openRoadmInterfaces) {
+    @Activate
+    public OlmPowerServiceImpl(@Reference DataBroker dataBroker,
+            @Reference PowerMgmt powerMgmt,
+            @Reference DeviceTransactionManager deviceTransactionManager,
+            @Reference PortMapping portMapping,
+            @Reference MappingUtils mappingUtils,
+            @Reference OpenRoadmInterfaces openRoadmInterfaces) {
         this.dataBroker = dataBroker;
         this.powerMgmt = powerMgmt;
         this.portMapping = portMapping;
         this.deviceTransactionManager = deviceTransactionManager;
         this.mappingUtils = mappingUtils;
         this.openRoadmInterfaces = openRoadmInterfaces;
+        LOG.debug("OlmPowerServiceImpl Instantiated");
     }
 
-    public void init() {
-        LOG.info("init ...");
-    }
-
-    public void close() {
-        LOG.info("close ...");
-    }
-
-
     @Override
     public GetPmOutput getPm(GetPmInput pmInput) {
-        OpenroadmNodeVersion openroadmVersion;
         GetPmOutputBuilder pmOutputBuilder = new GetPmOutputBuilder();
+        if (mappingUtils.getOpenRoadmVersion(pmInput.getNodeId()) == null) {
+            return pmOutputBuilder.build();
+        }
+        OpenroadmNodeVersion nodeVersion;
         switch (mappingUtils.getOpenRoadmVersion(pmInput.getNodeId())) {
             case StringConstants.OPENROADM_DEVICE_VERSION_1_2_1:
-                openroadmVersion = OpenroadmNodeVersion._121;
+                nodeVersion = OpenroadmNodeVersion._121;
                 break;
             case StringConstants.OPENROADM_DEVICE_VERSION_2_2_1:
-                openroadmVersion = OpenroadmNodeVersion._221;
+                nodeVersion = OpenroadmNodeVersion._221;
                 break;
             case StringConstants.OPENROADM_DEVICE_VERSION_7_1:
-                openroadmVersion = OpenroadmNodeVersion._71;
+                nodeVersion = OpenroadmNodeVersion._71;
                 break;
             default:
                 LOG.error("Unknown device version");
@@ -143,7 +147,7 @@ public class OlmPowerServiceImpl implements OlmPowerService {
         }
         LOG.info("Now calling get pm data");
         pmOutputBuilder = OlmUtils.pmFetch(pmInput, deviceTransactionManager,
-            openroadmVersion);
+            nodeVersion);
         return pmOutputBuilder.build();
     }
 
@@ -326,7 +330,7 @@ public class OlmPowerServiceImpl implements OlmPowerService {
             return Collections.emptyList();
         }
 
-        @Nullable Map<LinkKey, Link> networkLinks = networkOptional.get().getLink();
+        @Nullable Map<LinkKey, Link> networkLinks = networkOptional.orElseThrow().getLink();
         if ((networkLinks == null) || networkLinks.isEmpty()) {
             LOG.warn("Links are not present in {} topology.", NetworkUtils.OVERLAY_NETWORK_ID);
             return Collections.emptyList();
@@ -406,9 +410,9 @@ public class OlmPowerServiceImpl implements OlmPowerService {
                 Optional<Interface> interfaceObject;
                 interfaceObject = openRoadmInterfaces.getInterface(realNodeId, interfaceName);
                 if (interfaceObject.isPresent()) {
-                    InterfaceBuilder interfaceBuilder = new InterfaceBuilder(interfaceObject.get());
+                    InterfaceBuilder interfaceBuilder = new InterfaceBuilder(interfaceObject.orElseThrow());
                     OtsBuilder otsBuilder = new OtsBuilder();
-                    Interface intf = interfaceObject.get();
+                    Interface intf = interfaceObject.orElseThrow();
                     if (intf.augmentation(Interface1.class) != null
                         && intf.augmentation(Interface1.class).getOts() != null) {
                         Ots ots = intf.augmentation(Interface1.class).getOts();
@@ -416,15 +420,17 @@ public class OlmPowerServiceImpl implements OlmPowerService {
                         spanLossRx = ots.getSpanLossReceive();
                         spanLossTx = ots.getSpanLossTransmit();
                     } else {
-                        spanLossRx = new RatioDB(spanLoss);
-                        spanLossTx = new RatioDB(spanLoss);
+                        spanLossRx = new RatioDB(Decimal64.valueOf(spanLoss));
+                        spanLossTx = new RatioDB(Decimal64.valueOf(spanLoss));
                     }
                     Interface1Builder intf1Builder = new Interface1Builder();
                     if (direction.equals("TX")) {
-                        otsBuilder.setSpanLossTransmit(new RatioDB(spanLoss));
+                        otsBuilder.setSpanLossTransmit(new RatioDB(Decimal64.valueOf(spanLoss)));
                         otsBuilder.setSpanLossReceive(spanLossRx);
                     } else {
-                        otsBuilder.setSpanLossTransmit(spanLossTx).setSpanLossReceive(new RatioDB(spanLoss));
+                        otsBuilder
+                            .setSpanLossTransmit(spanLossTx)
+                            .setSpanLossReceive(new RatioDB(Decimal64.valueOf(spanLoss)));
                     }
                     interfaceBuilder.addAugmentation(intf1Builder.setOts(otsBuilder.build()).build());
                     openRoadmInterfaces.postInterface(realNodeId,interfaceBuilder);
@@ -447,13 +453,13 @@ public class OlmPowerServiceImpl implements OlmPowerService {
                     org.opendaylight.yang.gen.v1.http.org.openroadm.device
                         .rev181019.interfaces.grp.InterfaceBuilder interfaceBuilder =
                         new org.opendaylight.yang.gen.v1.http.org.openroadm.device
-                            .rev181019.interfaces.grp.InterfaceBuilder(interfaceObject.get());
+                            .rev181019.interfaces.grp.InterfaceBuilder(interfaceObject.orElseThrow());
                     org.opendaylight.yang.gen.v1.http.org.openroadm.optical
                         .transport.interfaces.rev181019.ots.container.OtsBuilder otsBuilder =
                         new org.opendaylight.yang.gen.v1.http.org.openroadm
                             .optical.transport.interfaces.rev181019.ots.container.OtsBuilder();
                     org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp.Interface intf =
-                        interfaceObject.get();
+                        interfaceObject.orElseThrow();
                     if (intf.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.optical
                         .transport.interfaces.rev181019.Interface1.class) != null
                             && intf.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport
@@ -468,9 +474,9 @@ public class OlmPowerServiceImpl implements OlmPowerService {
                         spanLossTx = ots.getSpanLossTransmit();
                     } else {
                         spanLossRx = new org.opendaylight.yang.gen.v1.http.org
-                            .openroadm.common.types.rev181019.RatioDB(spanLoss);
+                            .openroadm.common.types.rev181019.RatioDB(Decimal64.valueOf(spanLoss));
                         spanLossTx = new org.opendaylight.yang.gen.v1.http.org
-                            .openroadm.common.types.rev181019.RatioDB(spanLoss);
+                            .openroadm.common.types.rev181019.RatioDB(Decimal64.valueOf(spanLoss));
                     }
                     org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces
                         .rev181019.Interface1Builder intf1Builder =
@@ -478,12 +484,14 @@ public class OlmPowerServiceImpl implements OlmPowerService {
                             .transport.interfaces.rev181019.Interface1Builder();
                     if (direction.equals("TX")) {
                         otsBuilder.setSpanLossTransmit(new org.opendaylight.yang.gen.v1.http.org
-                            .openroadm.common.types.rev181019.RatioDB(spanLoss));
+                            .openroadm.common.types.rev181019.RatioDB(Decimal64.valueOf(spanLoss)));
                         otsBuilder.setSpanLossReceive(spanLossRx);
                     } else {
-                        otsBuilder.setSpanLossTransmit(spanLossTx).setSpanLossReceive(
-                            new org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.RatioDB(spanLoss)
-                        );
+                        otsBuilder
+                            .setSpanLossTransmit(spanLossTx)
+                            .setSpanLossReceive(
+                                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.RatioDB(
+                                    Decimal64.valueOf(spanLoss)));
                     }
                     interfaceBuilder.addAugmentation(intf1Builder.setOts(otsBuilder.build()).build());
                     openRoadmInterfaces.postInterface(realNodeId,interfaceBuilder);
@@ -576,12 +584,12 @@ public class OlmPowerServiceImpl implements OlmPowerService {
             LOG.error("Error on getRealNodeId {} :", mappedNodeId, e);
             throw new IllegalStateException(e);
         }
-        if (!realNode.isPresent() || (realNode.get().getSupportingNode() == null)) {
+        if (!realNode.isPresent() || (realNode.orElseThrow().getSupportingNode() == null)) {
             LOG.error("supporting node is null");
             throw new IllegalArgumentException(
                 String.format("Could not find node %s, or supporting node is not present", mappedNodeId));
         }
-        List<SupportingNode> collect = realNode.get().nonnullSupportingNode().values().stream()
+        List<SupportingNode> collect = realNode.orElseThrow().nonnullSupportingNode().values().stream()
             .filter(node -> (node.getNetworkRef() != null)
                 && NetworkUtils.UNDERLAY_NETWORK_ID.equals(node.getNetworkRef().getValue())
                 && (node.getNodeRef() != null) && !Strings.isNullOrEmpty(node.getNodeRef().getValue()))
@@ -606,7 +614,7 @@ public class OlmPowerServiceImpl implements OlmPowerService {
             //TODO change to constant from Timeouts class when it will be merged.
             linkOptional = rtx.read(LogicalDatastoreType.CONFIGURATION, linkIID).get(Timeouts.DATASTORE_READ,
                 TimeUnit.MILLISECONDS);
-            return linkOptional.get();
+            return linkOptional.orElseThrow();
         } catch (InterruptedException | ExecutionException | TimeoutException e) {
             LOG.warn("Read of {} topology failed", NetworkUtils.OVERLAY_NETWORK_ID);
             return null;
index fe6be2eabc206f152ad2345af1fde327b6bb06b5..da279062b56db767b27911072426546c1e0635be 100644 (file)
@@ -7,21 +7,10 @@
  */
 package org.opendaylight.transportpce.olm.util;
 
-import java.util.Optional;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.api.ReadTransaction;
-import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.OpenroadmNodeVersion;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesKey;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.OpenroadmNodeVersion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -30,26 +19,6 @@ public final class OlmUtils {
     private static final Logger LOG = LoggerFactory.getLogger(OlmUtils.class);
     private static long DATABROKER_READ_TIMEOUT_SECONDS = 120;
 
-    /**
-     * This static method returns the port mapping {@link Nodes} for node.
-     *
-     * @param nodeId
-     *            Unique identifier for the mounted netconf node
-     * @param db
-     *            Databroker used to read data from data store.
-     * @return {@link Nodes } from portMapping for given nodeId
-     */
-    public static Optional<Nodes> getNode(String nodeId, DataBroker db) {
-        InstanceIdentifier<Nodes> nodesIID = InstanceIdentifier.create(Network.class)
-            .child(Nodes.class, new NodesKey(nodeId));
-        try (ReadTransaction readTransaction = db.newReadOnlyTransaction()) {
-            return readTransaction.read(LogicalDatastoreType.CONFIGURATION, nodesIID)
-                .get(DATABROKER_READ_TIMEOUT_SECONDS, TimeUnit.SECONDS);
-        } catch (InterruptedException | ExecutionException | TimeoutException ex) {
-            LOG.error("Unable to read Portmapping for nodeId {}", nodeId, ex);
-            return Optional.empty();
-        }
-    }
 
     /**
      * This method retrieves list of current PMs for given nodeId,
index 31ed0423dedf5361a22c9d1fa96f0ce0b60bbde9..ca20d6cdd3ef64c506e4ac48b7824c0b00ea048c 100644 (file)
@@ -36,7 +36,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resour
 import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resource.resource.resource.Shelf;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resource.resource.resource.Srg;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev161014.ResourceTypeEnum;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.olm.get.pm.input.ResourceIdentifier;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.olm.get.pm.input.ResourceIdentifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -72,8 +72,8 @@ final class OlmUtils121 {
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
         if (currentPmList.isPresent()) {
             String pmExtension = null;
-            org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.Location location = null;
-            org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.Direction direction = null;
+            org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.Location location = null;
+            org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.Direction direction = null;
             if (input.getPmExtension() != null) {
                 pmExtension = input.getPmExtension();
             }
@@ -86,7 +86,7 @@ final class OlmUtils121 {
             //PmNamesEnum pmName = null;
             List<org.opendaylight.yang.gen.v1.http
                     .org.opendaylight.transportpce.olm.rev210618.get.pm.output.Measurements> measurements =
-                extractWantedMeasurements(currentPmList.get(),
+                extractWantedMeasurements(currentPmList.orElseThrow(),
                     ResourceTypeEnum.forValue(input.getResourceType().getIntValue()),
                     input.getResourceIdentifier(),
                     PmGranularity.forValue(input.getGranularity().getIntValue()),
@@ -128,8 +128,8 @@ final class OlmUtils121 {
         List<org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.get.pm.output.Measurements>
             extractWantedMeasurements(CurrentPmlist currentPmList, ResourceTypeEnum resourceTypeEnum,
             ResourceIdentifier wantedResourceIdentifier,PmGranularity pmGranularity, PmNamesEnum pmNamesEnum,
-            String extension, org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.Location
-            location, org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.Direction direction) {
+            String extension, org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.Location
+            location, org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.Direction direction) {
         List<org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.get.pm.output.Measurements>
             measurements = new ArrayList<>();
         for (CurrentPm pm : currentPmList.nonnullCurrentPm().values()) {
@@ -151,8 +151,8 @@ final class OlmUtils121 {
     private static
          List<org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.get.pm.output.Measurements>
             extractMeasurements(List<Measurements> measurementsFromDevice, PmNamesEnum pmNamesEnum, String extension,
-            org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.Location location,
-            org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.Direction direction) {
+            org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.Location location,
+            org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.Direction direction) {
         List<org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.get.pm.output.Measurements>
             extractedMeasurements = new ArrayList<>();
         List<Measurements> pmMeasurements = measurementsFromDevice;
@@ -185,7 +185,7 @@ final class OlmUtils121 {
             measurement.setPmparameterName(measure.getMeasurement().getPmParameterName().getType().toString());
             if (measure.getMeasurement().getPmParameterValue().getDecimal64() != null) {
                 measurement.setPmparameterValue(measure.getMeasurement().getPmParameterValue().getDecimal64()
-                    .toPlainString());
+                    .toString());
             } else if (measure.getMeasurement().getPmParameterValue().getUint64() != null) {
                 measurement.setPmparameterValue(measure.getMeasurement().getPmParameterValue().getUint64().toString());
             }
index 014a8c7fc4d68f4ff58a5e738e9bc1e82f4d346f..0b821b3a7b4ab602e4748a2ce2bfc4f6d2321be5 100644 (file)
@@ -22,6 +22,7 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev21
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmOutputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.get.pm.output.Measurements;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.get.pm.output.MeasurementsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.circuit.pack.Ports;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.circuit.pack.PortsKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.circuit.packs.CircuitPacks;
@@ -47,10 +48,11 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev181019.current.pm.l
 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev181019.current.pm.list.CurrentPmEntryKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev181019.current.pm.val.group.Measurement;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev161014.ResourceTypeEnum;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.Direction;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.Location;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.PmNamesEnum;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.olm.get.pm.input.ResourceIdentifier;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.Direction;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.Location;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.PmGranularity;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.PmNamesEnum;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.olm.get.pm.input.ResourceIdentifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Uint16;
 import org.slf4j.Logger;
@@ -95,7 +97,7 @@ final class OlmUtils221 {
                 LogicalDatastoreType.OPERATIONAL, iidCurrentPmList, Timeouts.DEVICE_READ_TIMEOUT,
                 Timeouts.DEVICE_READ_TIMEOUT_UNIT);
         if (currentPmListOpt.isPresent()) {
-            CurrentPmList currentPmList = currentPmListOpt.get();
+            CurrentPmList currentPmList = currentPmListOpt.orElseThrow();
             @NonNull
             Map<CurrentPmEntryKey,CurrentPmEntry> currentPmEntryList = currentPmList.nonnullCurrentPmEntry();
             LOG.info("Current PM list exists for node {} and contains {} entries.", input.getNodeId(),
@@ -166,7 +168,7 @@ final class OlmUtils221 {
     }
 
     private static List<Measurements> extractWantedMeasurements(List<CurrentPm> currentPmList,
-        org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.PmGranularity wantedGranularity) {
+        PmGranularity wantedGranularity) {
         List<Measurements> olmMeasurements = new ArrayList<>();
         for (CurrentPm pm : currentPmList) {
             for (Measurement measurements: pm.nonnullMeasurement().values()) {
@@ -191,37 +193,57 @@ final class OlmUtils221 {
         }
         switch (wantedResourceType) {
             case Device:
-                return InstanceIdentifier.create(OrgOpenroadmDevice.class);
+                return InstanceIdentifier
+                    .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                    .build();
             case Degree:
-                return InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                        .child(Degree.class, new DegreeKey(Uint16.valueOf(wantedResourceIdentifier.getResourceName())));
+                return InstanceIdentifier
+                    .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                    .child(Degree.class, new DegreeKey(Uint16.valueOf(wantedResourceIdentifier.getResourceName())))
+                    .build();
             case SharedRiskGroup:
-                return InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                        .child(SharedRiskGroup.class,
-                                new SharedRiskGroupKey(Uint16.valueOf(wantedResourceIdentifier.getResourceName())));
+                return InstanceIdentifier
+                    .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                    .child(
+                        SharedRiskGroup.class,
+                        new SharedRiskGroupKey(Uint16.valueOf(wantedResourceIdentifier.getResourceName())))
+                    .build();
             case Connection:
-                return InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                        .child(RoadmConnections.class, new RoadmConnectionsKey(wantedResourceIdentifier
-                                .getResourceName()));
+                return InstanceIdentifier
+                    .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                    .child(RoadmConnections.class, new RoadmConnectionsKey(wantedResourceIdentifier.getResourceName()))
+                    .build();
             case CircuitPack:
-                return InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                        .child(CircuitPacks.class, new CircuitPacksKey(wantedResourceIdentifier.getResourceName()));
+                return InstanceIdentifier
+                    .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                    .child(CircuitPacks.class, new CircuitPacksKey(wantedResourceIdentifier.getResourceName()))
+                    .build();
             case Port:
-                return InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                        .child(CircuitPacks.class, new CircuitPacksKey(wantedResourceIdentifier.getCircuitPackName()))
-                        .child(Ports.class, new PortsKey(wantedResourceIdentifier.getResourceName()));
+                return InstanceIdentifier
+                    .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                    .child(CircuitPacks.class, new CircuitPacksKey(wantedResourceIdentifier.getCircuitPackName()))
+                    .child(Ports.class, new PortsKey(wantedResourceIdentifier.getResourceName()))
+                    .build();
             case Interface:
-                return InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                        .child(Interface.class, new InterfaceKey(wantedResourceIdentifier.getResourceName()));
+                return InstanceIdentifier
+                    .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                    .child(Interface.class, new InterfaceKey(wantedResourceIdentifier.getResourceName()))
+                    .build();
             case InternalLink:
-                return InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                        .child(InternalLink.class, new InternalLinkKey(wantedResourceIdentifier.getResourceName()));
+                return InstanceIdentifier
+                    .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                    .child(InternalLink.class, new InternalLinkKey(wantedResourceIdentifier.getResourceName()))
+                    .build();
             case PhysicalLink:
-                return InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                        .child(PhysicalLink.class, new PhysicalLinkKey(wantedResourceIdentifier.getResourceName()));
+                return InstanceIdentifier
+                    .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                    .child(PhysicalLink.class, new PhysicalLinkKey(wantedResourceIdentifier.getResourceName()))
+                    .build();
             case Shelf:
-                return InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                        .child(Shelves.class, new ShelvesKey(wantedResourceIdentifier.getResourceName()));
+                return InstanceIdentifier
+                    .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                    .child(Shelves.class, new ShelvesKey(wantedResourceIdentifier.getResourceName()))
+                    .build();
             default:
                 LOG.error("Unknown resource type {}", wantedResourceType);
                 return null;
index 8bc563557c2614ca8e5d65be99f2f40761526141..cc842c8616177c1969dfa782ae37bd6ebe39b5e0 100644 (file)
@@ -22,6 +22,7 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev21
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmOutputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.get.pm.output.Measurements;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.get.pm.output.MeasurementsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.circuit.pack.Ports;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.circuit.pack.PortsKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.circuit.packs.CircuitPacks;
@@ -47,10 +48,11 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev200529.current.pm.l
 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev200529.current.pm.list.CurrentPmEntryKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev200529.current.pm.val.group.Measurement;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev161014.ResourceTypeEnum;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.Direction;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.Location;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.PmNamesEnum;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.olm.get.pm.input.ResourceIdentifier;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.Direction;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.Location;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.PmGranularity;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.PmNamesEnum;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.olm.get.pm.input.ResourceIdentifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Uint16;
 import org.slf4j.Logger;
@@ -93,7 +95,7 @@ final class OlmUtils710 {
                 LogicalDatastoreType.OPERATIONAL, iidCurrentPmList, Timeouts.DEVICE_READ_TIMEOUT,
                 Timeouts.DEVICE_READ_TIMEOUT_UNIT);
         if (currentPmListOpt.isPresent()) {
-            CurrentPmList  currentPmList = currentPmListOpt.get();
+            CurrentPmList  currentPmList = currentPmListOpt.orElseThrow();
             @NonNull
             Map<CurrentPmEntryKey, CurrentPmEntry> currentPmEntryList = currentPmList.nonnullCurrentPmEntry();
             LOG.info("Current PM list exists for node {} and contains {} entries.", input.getNodeId(),
@@ -162,7 +164,7 @@ final class OlmUtils710 {
     }
 
     private static List<Measurements> extractWantedMeasurements(List<CurrentPm> currentPmList,
-        org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.PmGranularity wantedGranularity) {
+        PmGranularity wantedGranularity) {
         List<Measurements> olmMeasurements = new ArrayList<>();
         for (CurrentPm pm : currentPmList) {
             for (Measurement measurements: pm.nonnullMeasurement().values()) {
@@ -182,36 +184,57 @@ final class OlmUtils710 {
         ResourceIdentifier wantedResourceIdentifier) {
         switch (wantedResourceType) {
             case Device:
-                return InstanceIdentifier.create(OrgOpenroadmDevice.class);
+                return InstanceIdentifier
+                    .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                    .build();
             case Degree:
-                return InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                    .child(Degree.class, new DegreeKey(Uint16.valueOf(wantedResourceIdentifier.getResourceName())));
+                return InstanceIdentifier
+                    .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                    .child(Degree.class, new DegreeKey(Uint16.valueOf(wantedResourceIdentifier.getResourceName())))
+                    .build();
             case SharedRiskGroup:
-                return InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                    .child(SharedRiskGroup.class,
-                        new SharedRiskGroupKey(Uint16.valueOf(wantedResourceIdentifier.getResourceName())));
+                return InstanceIdentifier
+                    .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                    .child(
+                        SharedRiskGroup.class,
+                        new SharedRiskGroupKey(Uint16.valueOf(wantedResourceIdentifier.getResourceName())))
+                    .build();
             case Connection:
-                return InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                    .child(RoadmConnections.class, new RoadmConnectionsKey(wantedResourceIdentifier.getResourceName()));
+                return InstanceIdentifier
+                    .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                    .child(RoadmConnections.class, new RoadmConnectionsKey(wantedResourceIdentifier.getResourceName()))
+                    .build();
             case CircuitPack:
-                return InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                    .child(CircuitPacks.class, new CircuitPacksKey(wantedResourceIdentifier.getResourceName()));
+                return InstanceIdentifier
+                    .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                    .child(CircuitPacks.class, new CircuitPacksKey(wantedResourceIdentifier.getResourceName()))
+                    .build();
             case Port:
-                return InstanceIdentifier.create(OrgOpenroadmDevice.class)
+                return InstanceIdentifier
+                    .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
                     .child(CircuitPacks.class, new CircuitPacksKey(wantedResourceIdentifier.getCircuitPackName()))
-                    .child(Ports.class, new PortsKey(wantedResourceIdentifier.getResourceName()));
+                    .child(Ports.class, new PortsKey(wantedResourceIdentifier.getResourceName()))
+                    .build();
             case Interface:
-                return InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                    .child(Interface.class, new InterfaceKey(wantedResourceIdentifier.getResourceName()));
+                return InstanceIdentifier
+                    .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                    .child(Interface.class, new InterfaceKey(wantedResourceIdentifier.getResourceName()))
+                    .build();
             case InternalLink:
-                return InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                    .child(InternalLink.class, new InternalLinkKey(wantedResourceIdentifier.getResourceName()));
+                return InstanceIdentifier
+                    .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                    .child(InternalLink.class, new InternalLinkKey(wantedResourceIdentifier.getResourceName()))
+                    .build();
             case PhysicalLink:
-                return InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                    .child(PhysicalLink.class, new PhysicalLinkKey(wantedResourceIdentifier.getResourceName()));
+                return InstanceIdentifier
+                    .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                    .child(PhysicalLink.class, new PhysicalLinkKey(wantedResourceIdentifier.getResourceName()))
+                    .build();
             case Shelf:
-                return InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                    .child(Shelves.class, new ShelvesKey(wantedResourceIdentifier.getResourceName()));
+                return InstanceIdentifier
+                    .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                    .child(Shelves.class, new ShelvesKey(wantedResourceIdentifier.getResourceName()))
+                    .build();
             default:
                 LOG.error("Unknown resource type {}", wantedResourceType);
                 return null;
diff --git a/olm/src/main/resources/OSGI-INF/blueprint/olm-blueprint.xml b/olm/src/main/resources/OSGI-INF/blueprint/olm-blueprint.xml
deleted file mode 100644 (file)
index dee2972..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- vi: set et smarttab sw=4 tabstop=4: -->
-<!--
-Copyright © 2016 Orange and others. All rights reserved.
-
-This program and the accompanying materials are made available under the
-terms of the Eclipse Public License v1.0 which accompanies this distribution,
-and is available at http://www.eclipse.org/legal/epl-v10.html
--->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
-      xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
-      xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
-      odl:use-default-for-reference-types="true">
-
-    <cm:property-placeholder persistent-id="org.opendaylight.transportpce" update-strategy="reload">
-        <cm:default-properties>
-            <cm:property name="timer1" value="" />
-            <cm:property name="timer2" value="" />
-            <!--The following values are used to speed-up tests with simulators without convergence times-->
-            <!--cm:property name="timer1" value="3000" /-->
-            <!--cm:property name="timer2" value="2000" /-->
-        </cm:default-properties>
-    </cm:property-placeholder>
-
-
-  <reference id="dataBroker"
-        interface="org.opendaylight.mdsal.binding.api.DataBroker"/>
-  <reference id="rpcProviderService"
-        interface="org.opendaylight.mdsal.binding.api.RpcProviderService" />
-  <reference id="openRoadmInterfaces"
-        interface="org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces" />
-  <reference id="crossConnect"
-        interface="org.opendaylight.transportpce.common.crossconnect.CrossConnect" />
-  <reference id="deviceTransactionManager"
-        interface="org.opendaylight.transportpce.common.device.DeviceTransactionManager" />
-  <reference id="portMapping"
-        interface="org.opendaylight.transportpce.common.mapping.PortMapping" />
-  <reference id="mappingUtils" interface="org.opendaylight.transportpce.common.mapping.MappingUtils" />
-
-  <bean id="olmPowerServiceImpl"
-        class="org.opendaylight.transportpce.olm.service.OlmPowerServiceImpl"
-        init-method="init" destroy-method="close">
-    <argument ref="dataBroker" />
-    <argument ref="powerMgmt" />
-    <argument ref="deviceTransactionManager" />
-    <argument ref="portMapping" />
-    <argument ref="mappingUtils" />
-    <argument ref="openRoadmInterfaces" />
-  </bean>
-
-  <bean id="powerMgmt" class="org.opendaylight.transportpce.olm.power.PowerMgmtImpl" >
-    <argument ref="dataBroker" />
-    <argument ref="openRoadmInterfaces" />
-    <argument ref="crossConnect" />
-    <argument ref="deviceTransactionManager" />
-    <argument value="${timer1}"/>
-    <argument value="${timer2}"/>
-  </bean>
-
-  <bean id="provider"
-        class="org.opendaylight.transportpce.olm.OlmProvider"
-        init-method="init" destroy-method="close">
-    <argument ref="rpcProviderService" />
-    <argument ref="olmPowerServiceImpl" />
-  </bean>
-
-  <service ref="olmPowerServiceImpl"
-        interface="org.opendaylight.transportpce.olm.service.OlmPowerService"/>
-</blueprint>
index 6fb3cb865abf68ba65b7dd270e807be39c9326ba..19ed220051652313d58371cb154aac760a8f6562 100644 (file)
 
 package org.opendaylight.transportpce.olm;
 
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.when;
+
 import com.google.common.util.concurrent.ListenableFuture;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
 import java.util.concurrent.ExecutionException;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mockito;
-import org.opendaylight.mdsal.binding.api.MountPoint;
-import org.opendaylight.mdsal.binding.api.MountPointService;
-import org.opendaylight.transportpce.common.StringConstants;
-import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
-import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl;
-import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl121;
-import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl221;
-import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl710;
-import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
-import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl;
-import org.opendaylight.transportpce.common.mapping.MappingUtils;
-import org.opendaylight.transportpce.common.mapping.MappingUtilsImpl;
-import org.opendaylight.transportpce.common.mapping.PortMapping;
-import org.opendaylight.transportpce.common.mapping.PortMappingImpl;
-import org.opendaylight.transportpce.common.mapping.PortMappingVersion121;
-import org.opendaylight.transportpce.common.mapping.PortMappingVersion221;
-import org.opendaylight.transportpce.common.mapping.PortMappingVersion710;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl121;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl221;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl710;
-import org.opendaylight.transportpce.olm.power.PowerMgmt;
-import org.opendaylight.transportpce.olm.power.PowerMgmtImpl;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
+import org.opendaylight.transportpce.olm.rpc.impl.CalculateSpanlossBaseImpl;
+import org.opendaylight.transportpce.olm.rpc.impl.CalculateSpanlossCurrentImpl;
+import org.opendaylight.transportpce.olm.rpc.impl.GetPmImpl;
+import org.opendaylight.transportpce.olm.rpc.impl.ServicePowerResetImpl;
+import org.opendaylight.transportpce.olm.rpc.impl.ServicePowerSetupImpl;
+import org.opendaylight.transportpce.olm.rpc.impl.ServicePowerTurndownImpl;
 import org.opendaylight.transportpce.olm.service.OlmPowerService;
-import org.opendaylight.transportpce.olm.service.OlmPowerServiceImpl;
-import org.opendaylight.transportpce.olm.stub.MountPointServiceStub;
-import org.opendaylight.transportpce.olm.stub.MountPointStub;
 import org.opendaylight.transportpce.olm.util.OlmPowerServiceRpcImplUtil;
 import org.opendaylight.transportpce.test.AbstractTest;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossBaseInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossBaseOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossCurrentInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossCurrentInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossCurrentOutputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmInputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmOutput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerResetInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerResetOutputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupOutput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupOutputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownOutput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.CurrentPmlist;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.CurrentPmlistBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.current.pm.LayerRateBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.current.pm.Measurements;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.current.pm.MeasurementsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.current.pm.measurements.MeasurementBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.currentpmlist.CurrentPm;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.currentpmlist.CurrentPmBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.currentpmlist.CurrentPmKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.PmDataType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.PmGranularity;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.PmNamesEnum;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.pm.measurement.PmParameterNameBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resource.DeviceBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resource.ResourceTypeBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resource.resource.resource.CircuitPackBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev161014.ResourceTypeEnum;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.PmGranularity;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.olm.get.pm.input.ResourceIdentifierBuilder;
+import org.opendaylight.yangtools.yang.common.ErrorSeverity;
+import org.opendaylight.yangtools.yang.common.ErrorTag;
+import org.opendaylight.yangtools.yang.common.ErrorType;
 import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
-import org.opendaylight.yangtools.yang.common.Uint64;
 
-public class OlmPowerServiceRpcImplTest extends AbstractTest {
+@ExtendWith(MockitoExtension.class)
+class OlmPowerServiceRpcImplTest extends AbstractTest {
 
-    private MountPoint mountPoint;
-    private MountPointService mountPointService;
-    private DeviceTransactionManager deviceTransactionManager;
-    private CrossConnect crossConnect;
-    private OpenRoadmInterfaces openRoadmInterfaces;
-    private PortMapping portMapping;
-    private PowerMgmt powerMgmt;
+    @Mock
     private OlmPowerService olmPowerService;
-    private OlmPowerServiceRpcImpl olmPowerServiceRpc;
-    private CrossConnectImpl121 crossConnectImpl121;
-    private CrossConnectImpl221 crossConnectImpl22;
-    private CrossConnectImpl710 crossConnectImpl710;
-    private MappingUtils mappingUtils;
-    private OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121;
-    private OpenRoadmInterfacesImpl221 openRoadmInterfacesImpl22;
-    private OpenRoadmInterfacesImpl710 openRoadmInterfacesImpl710;
-    private PortMappingVersion710 portMappingVersion710;
-    private PortMappingVersion221 portMappingVersion22;
-    private PortMappingVersion121 portMappingVersion121;
-
-    @Before
-    public void setUp() {
-        this.mountPoint = new MountPointStub(getDataBroker());
-        this.mountPointService = new MountPointServiceStub(mountPoint);
-        this.deviceTransactionManager = new DeviceTransactionManagerImpl(mountPointService, 3000);
-        this.mappingUtils = Mockito.spy(new MappingUtilsImpl(getDataBroker()));
-        Mockito.doReturn(StringConstants.OPENROADM_DEVICE_VERSION_1_2_1).when(mappingUtils)
-                .getOpenRoadmVersion(Mockito.anyString());
-        this.deviceTransactionManager = new DeviceTransactionManagerImpl(mountPointService, 3000);
-        this.crossConnectImpl121 = new CrossConnectImpl121(deviceTransactionManager);
-        this.crossConnectImpl22 = new CrossConnectImpl221(deviceTransactionManager);
-        this.crossConnectImpl710 = new CrossConnectImpl710(deviceTransactionManager);
-        this.crossConnect = new CrossConnectImpl(deviceTransactionManager, this.mappingUtils, this.crossConnectImpl121,
-                this.crossConnectImpl22, this.crossConnectImpl710);
-        this.portMappingVersion710 = new PortMappingVersion710(getDataBroker(), deviceTransactionManager);
-        this.portMappingVersion22 = new PortMappingVersion221(getDataBroker(), deviceTransactionManager);
-        this.portMappingVersion121 = new PortMappingVersion121(getDataBroker(), deviceTransactionManager);
-        this.portMapping = new PortMappingImpl(getDataBroker(), this.portMappingVersion710,
-            this.portMappingVersion22, this.portMappingVersion121);
-        this.openRoadmInterfacesImpl121 = new OpenRoadmInterfacesImpl121(deviceTransactionManager);
-        this.openRoadmInterfacesImpl22 = new OpenRoadmInterfacesImpl221(deviceTransactionManager, this.portMapping,
-            this.portMappingVersion22);
-        this.openRoadmInterfacesImpl710 = new OpenRoadmInterfacesImpl710(deviceTransactionManager, this.portMapping,
-            this.portMappingVersion710);
-        this.openRoadmInterfaces = new OpenRoadmInterfacesImpl((this.deviceTransactionManager),
-                this.mappingUtils,this.openRoadmInterfacesImpl121,this.openRoadmInterfacesImpl22,
-            this.openRoadmInterfacesImpl710);
-        this.portMapping = Mockito.spy(this.portMapping);
-        this.powerMgmt = new PowerMgmtImpl(getDataBroker(), this.openRoadmInterfaces, this.crossConnect,
-            this.deviceTransactionManager);
-        this.olmPowerService = new OlmPowerServiceImpl(getDataBroker(), this.powerMgmt,
-            this.deviceTransactionManager, this.portMapping,mappingUtils,openRoadmInterfaces);
-        this.olmPowerServiceRpc = new OlmPowerServiceRpcImpl(this.olmPowerService);
-        //TODO
-        this.olmPowerServiceRpc = Mockito.mock(OlmPowerServiceRpcImpl.class);
-    }
-
-    @Test
-    public void pmIsNotPresentTest() throws ExecutionException, InterruptedException {
-        GetPmInput input = OlmPowerServiceRpcImplUtil.getGetPmInput();
-        //TODO
-//        ListenableFuture<RpcResult<GetPmOutput>> output = this.olmPowerServiceRpc.getPm(input);
-//        Assert.assertEquals(new GetPmOutputBuilder().build(), output.get().getResult());
-//        Assert.assertEquals(null, output.get().getResult().getResourceId());
-//        Assert.assertEquals(null, output.get().getResult().getMeasurements());
-//        Assert.assertEquals(null, output.get().getResult().getGranularity());
-//        Assert.assertEquals(null, output.get().getResult().getNodeId());
-//        Assert.assertEquals(null, output.get().getResult().getResourceIdentifier());
-//        Assert.assertEquals(null, output.get().getResult().getResourceType());
-    }
+    @Mock
+    private RpcProviderService rpcProviderService;
 
     @Test
-    public void testGetPm1() throws ExecutionException, InterruptedException {
-        Measurements measurements = new MeasurementsBuilder().setMeasurement(
-            new MeasurementBuilder()
-                .setPmParameterUnit("unit")
-                .setPmParameterName(new PmParameterNameBuilder()
-                .setExtension("123")
-                .setType(PmNamesEnum.DefectSeconds).build())
-                .setPmParameterValue(new PmDataType(Uint64.valueOf(1234))).build())
-            .build();
-        List<Measurements> measurementsList = new ArrayList<Measurements>();
-        measurementsList.add(measurements);
-
-        org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resource.Resource resource =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resource.ResourceBuilder()
-                .setResource(new CircuitPackBuilder().setCircuitPackName("circuit pack name").build()).build();
-
-        org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.current.pm.Resource resource2 =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.current.pm.ResourceBuilder()
-                .setDevice(new DeviceBuilder().setNodeId("node 1").build())
-                .setResourceType(new ResourceTypeBuilder()
-                    .setExtension("123")
-                    .setType(ResourceTypeEnum.Device).build())
-                .setResource(resource).build();
-        CurrentPm currentPm = new CurrentPmBuilder()
+    void testGetPmFailWithNodeIdNull() throws InterruptedException, ExecutionException {
+        GetPmInput input = new GetPmInputBuilder()
             .setGranularity(PmGranularity._15min)
-            .setId("id")
-            .setLayerRate(new LayerRateBuilder().build())
-            .setMeasurements(measurementsList)
-            .setResource(resource2)
-            .setRetrievalTime(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715
-                .DateAndTime("2018-11-01T12:00:31.456449+06:00")).build();
-
-        Map<CurrentPmKey, CurrentPm> currentPmList = new HashMap<>();
-        currentPmList.put(currentPm.key(),currentPm);
-
-        Optional<CurrentPmlist> currentPmlistOptional = Optional.of(new CurrentPmlistBuilder()
-            .setCurrentPm(currentPmList).build());
-
-        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.get.pm.output.Measurements
-            measurements1 = new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.get.pm
-                .output.MeasurementsBuilder().setPmparameterName("name").setPmparameterValue("1234").build();
-
-
-        List<org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.get.pm.output
-            .Measurements> measurementsList1 = new ArrayList<>();
-        measurementsList1.add(measurements1);
-
-        GetPmInput input = OlmPowerServiceRpcImplUtil.getGetPmInput();
-        GetPmOutputBuilder pmOutputBuilder = new GetPmOutputBuilder().setNodeId(input.getNodeId())
-            .setResourceType(input.getResourceType())
-            .setResourceIdentifier(input.getResourceIdentifier())
-            .setGranularity(input.getGranularity())
-            .setMeasurements(measurementsList1);
-
-
-        ListenableFuture<RpcResult<GetPmOutput>> output = this.olmPowerServiceRpc.getPm(input);
-        //TODO
-//        Assert.assertEquals(new GetPmOutputBuilder().build(), output.get().getResult());
-//        Assert.assertEquals(null, output.get().getResult().getResourceId());
+            .setResourceIdentifier(new ResourceIdentifierBuilder()
+                    .setResourceName("ots-deg1").build())
+            .setResourceType(ResourceTypeEnum.Interface)
+            .build();
+        ListenableFuture<RpcResult<GetPmOutput>> output = new GetPmImpl(olmPowerService).invoke(input);
+        assertFalse(output.get().isSuccessful());
+        assertNull(output.get().getResult());
+        assertEquals(ErrorType.RPC, output.get().getErrors().get(0).getErrorType());
+        assertEquals("Error with input parameters", output.get().getErrors().get(0).getMessage());
+        assertEquals(ErrorSeverity.ERROR, output.get().getErrors().get(0).getSeverity());
+        assertEquals(ErrorTag.OPERATION_FAILED, output.get().getErrors().get(0).getTag());
     }
 
-//    @Test
-//    public void testGetPm2() throws ExecutionException, InterruptedException {
-//        this.olmPowerService = Mockito.spy(this.olmPowerService);
-//        GetPmInput input = new GetPmInputBuilder().setGranularity(PmGranularity._15min).setNodeId("node1")
-//            .setResourceIdentifier(new ResourceIdentifierBuilder().setCircuitPackName("circuit pack name")
-//                .setResourceName("resource name").build()).setResourceType(ResourceTypeEnum.Device).build();
-//        org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.olm.rev170418.get.pm.output.Measurements
-//        measurements1 = new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.olm.rev170418.get.pm
-//            .output.MeasurementsBuilder().setPmparameterName("name").setPmparameterValue("1234").build();
-//
-//
-//        List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.olm.rev170418.get.pm.output
-//            .Measurements> measurementsList1 = new ArrayList<>();
-//        measurementsList1.add(measurements1);
-//
-//        GetPmOutputBuilder pmOutputBuilder = new GetPmOutputBuilder().setNodeId(input.getNodeId())
-//            .setResourceType(input.getResourceType())
-//            .setResourceIdentifier(input.getResourceIdentifier())
-//            .setGranularity(input.getGranularity())
-//            .setMeasurements(measurementsList1);
-//
-//        Mockito.doReturn(pmOutputBuilder.build()).when(this.olmPowerService).getPm(Mockito.any());
-//        ListenableFuture<RpcResult<GetPmOutput>> output = this.olmPowerServiceRpc.getPm(input);
-//        Assert.assertEquals(pmOutputBuilder.build(), output.get().getResult());
-//        Assert.assertEquals(true, output.get().isSuccessful());
-//    }
-
     @Test
-    public void testGetPm3() throws ExecutionException, InterruptedException {
-        GetPmInput input = OlmPowerServiceRpcImplUtil.getGetPmInput();
-        ListenableFuture<RpcResult<GetPmOutput>> output = this.olmPowerServiceRpc.getPm(input);
-        //TODO
-//        Assert.assertEquals(new GetPmOutputBuilder().build(), output.get().getResult());
-//        Assert.assertEquals(null, output.get().getResult().getResourceId());
-//        Assert.assertEquals(null, output.get().getResult().getMeasurements());
-//        Assert.assertEquals(null, output.get().getResult().getGranularity());
-//        Assert.assertEquals(null, output.get().getResult().getNodeId());
-//        Assert.assertEquals(null, output.get().getResult().getResourceIdentifier());
-//        Assert.assertEquals(null, output.get().getResult().getResourceType());
+    void testGetPmWithSuccess() throws InterruptedException, ExecutionException {
+        GetPmInput input = new GetPmInputBuilder()
+            .setNodeId("nodeId")
+            .build();
+        when(this.olmPowerService.getPm(any())).thenReturn(new GetPmOutputBuilder().build());
+        ListenableFuture<RpcResult<GetPmOutput>> output = new GetPmImpl(olmPowerService).invoke(input);
+        assertTrue(output.get().isSuccessful());
+        assertEquals(new GetPmOutputBuilder().build(), output.get().getResult());
     }
 
     @Test
-    public void testServicePowerSetup1() throws ExecutionException, InterruptedException {
+    void testServicePowerSetup() throws InterruptedException, ExecutionException {
         ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput();
-        //TODO
-        Mockito.when(this.olmPowerServiceRpc.servicePowerSetup(Mockito.any()))
-                .thenReturn(RpcResultBuilder.success(new ServicePowerSetupOutputBuilder()
-                        .setResult("Success").build()).buildFuture());
-        ListenableFuture<RpcResult<ServicePowerSetupOutput>> output = this.olmPowerServiceRpc.servicePowerSetup(input);
-        Assert.assertEquals(new ServicePowerSetupOutputBuilder().setResult("Success").build(), output.get()
-                .getResult());
-        Assert.assertEquals("Success", output.get().getResult().getResult());
-        Assert.assertEquals(true, output.get().isSuccessful());
+        when(this.olmPowerService.servicePowerSetup(any())).thenReturn(new ServicePowerSetupOutputBuilder().build());
+        ListenableFuture<RpcResult<ServicePowerSetupOutput>> output =
+            new ServicePowerSetupImpl(olmPowerService).invoke(input);
+        assertTrue(output.get().isSuccessful());
+        assertEquals(new ServicePowerSetupOutputBuilder().build(), output.get().getResult());
     }
 
-
     @Test
-    public void testServicePowerTurndown1() throws ExecutionException, InterruptedException {
+    void testServicePowerTurndown() throws InterruptedException, ExecutionException {
         ServicePowerTurndownInput input = OlmPowerServiceRpcImplUtil.getServicePowerTurndownInput();
-        //TODO
-        Mockito.when(this.olmPowerServiceRpc.servicePowerTurndown(Mockito.any()))
-                .thenReturn(RpcResultBuilder.success(new ServicePowerTurndownOutputBuilder()
-                        .setResult("Success").build()).buildFuture());
-        ListenableFuture<RpcResult<ServicePowerTurndownOutput>> output = this.olmPowerServiceRpc
-            .servicePowerTurndown(input);
-        Assert.assertEquals(new ServicePowerTurndownOutputBuilder().setResult("Success").build(), output.get()
-            .getResult());
-        Assert.assertEquals("Success", output.get().getResult().getResult());
-        Assert.assertEquals(true, output.get().isSuccessful());
+        when(this.olmPowerService.servicePowerTurndown(any()))
+            .thenReturn(new ServicePowerTurndownOutputBuilder().build());
+        var output = new ServicePowerTurndownImpl(olmPowerService).invoke(input);
+        assertTrue(output.get().isSuccessful());
+        assertEquals(new ServicePowerTurndownOutputBuilder().build(), output.get().getResult());
     }
 
-    /*
     @Test
-    public void testCalculateSpanlossBase1() throws ExecutionException, InterruptedException {
-        CalculateSpanlossBaseInput input = OlmPowerServiceRpcImplUtil.getCalculateSpanlossBaseInput();
-        //TODO
-        Mockito.when(this.olmPowerServiceRpc.calculateSpanlossBase(Mockito.any()))
-                .thenReturn(RpcResultBuilder.success(new CalculateSpanlossBaseOutputBuilder()
-                        .setResult("Failed").build()).buildFuture());
-        ListenableFuture<RpcResult<CalculateSpanlossBaseOutput>> output = this.olmPowerServiceRpc
-            .calculateSpanlossBase(input);
-        Assert.assertEquals(new CalculateSpanlossBaseOutputBuilder().setResult("Failed").build(),
-            output.get().getResult());
-        Assert.assertEquals("Failed", output.get().getResult().getResult());
-        Assert.assertEquals(true, output.get().isSuccessful());
-    }*/
+    void testCalculateSpanlossBase() throws InterruptedException, ExecutionException {
+        CalculateSpanlossBaseInput input = OlmPowerServiceRpcImplUtil.getCalculateSpanlossBaseInputAll();
+        when(this.olmPowerService.calculateSpanlossBase(any()))
+            .thenReturn(new CalculateSpanlossBaseOutputBuilder().build());
+        var output = new CalculateSpanlossBaseImpl(olmPowerService).invoke(input);
+        assertTrue(output.get().isSuccessful());
+        assertEquals(new CalculateSpanlossBaseOutputBuilder().build(), output.get().getResult());
+    }
 
-    //TODO
-/**    @Test
-    public void testCalculateSpanlossCurrent1() throws ExecutionException, InterruptedException {
-        CalculateSpanlossCurrentInput input = OlmPowerServiceRpcImplUtil.getCalculateSpanlossCurrentInput();
-        //TODO
-        Mockito.when(this.olmPowerServiceRpc.calculateSpanlossCurrent(Mockito.any()))
-                .thenReturn(RpcResultBuilder.success(new CalculateSpanlossCurrentOutputBuilder()
-                        .setResult("success").build()).buildFuture());
-        ListenableFuture<RpcResult<CalculateSpanlossCurrentOutput>> output = this.olmPowerServiceRpc
-            .calculateSpanlossCurrent(input);
-        Assert.assertEquals(null, output.get().getResult());
-        Assert.assertEquals(true, output.get().isSuccessful());
+    @Test
+    void testCalculateSpanlossCurrent() throws InterruptedException, ExecutionException {
+        CalculateSpanlossCurrentInput input = new CalculateSpanlossCurrentInputBuilder().build();
+        when(this.olmPowerService.calculateSpanlossCurrent(any()))
+            .thenReturn(new CalculateSpanlossCurrentOutputBuilder().build());
+        var output = new CalculateSpanlossCurrentImpl(olmPowerService).invoke(input);
+        assertTrue(output.get().isSuccessful());
+        assertEquals(new CalculateSpanlossCurrentOutputBuilder().build(), output.get().getResult());
     }
 
     @Test
-    public void testServicePowerResetInput() throws ExecutionException, InterruptedException {
+    void testServicePowerReset() throws InterruptedException, ExecutionException {
         ServicePowerResetInput input = OlmPowerServiceRpcImplUtil.getServicePowerResetInput();
-        //TODO
-        Mockito.when(this.olmPowerServiceRpc.calculateSpanlossCurrent(Mockito.any()))
-                .thenReturn(RpcResultBuilder.success(new CalculateSpanlossCurrentOutputBuilder()
-                        .setResult(null).build()).buildFuture());
-        ListenableFuture<RpcResult<ServicePowerResetOutput>> output = this.olmPowerServiceRpc
-            .servicePowerReset(input);
-        Assert.assertEquals(null, output.get().getResult());
-        Assert.assertEquals(true, output.get().isSuccessful());
+        when(this.olmPowerService.servicePowerReset(any()))
+            .thenReturn(new ServicePowerResetOutputBuilder().build());
+        var output = new ServicePowerResetImpl(olmPowerService).invoke(input);
+        assertTrue(output.get().isSuccessful());
+        assertEquals(new ServicePowerResetOutputBuilder().build(), output.get().getResult());
     }
-**/
 }
diff --git a/olm/src/test/java/org/opendaylight/transportpce/olm/power/PowerMgmtPowerMockTest.java b/olm/src/test/java/org/opendaylight/transportpce/olm/power/PowerMgmtPowerMockTest.java
deleted file mode 100644 (file)
index faf61e7..0000000
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- * Copyright © 2019 Orange, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.transportpce.olm.power;
-
-import java.math.BigDecimal;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.ArgumentMatchers;
-import org.mockito.Mockito;
-import org.opendaylight.mdsal.binding.api.MountPoint;
-import org.opendaylight.mdsal.binding.api.MountPointService;
-import org.opendaylight.transportpce.common.StringConstants;
-import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
-import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl;
-import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl121;
-import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl221;
-import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl710;
-import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
-import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl;
-import org.opendaylight.transportpce.common.mapping.MappingUtils;
-import org.opendaylight.transportpce.common.mapping.MappingUtilsImpl;
-import org.opendaylight.transportpce.common.mapping.PortMapping;
-import org.opendaylight.transportpce.common.mapping.PortMappingImpl;
-import org.opendaylight.transportpce.common.mapping.PortMappingVersion121;
-import org.opendaylight.transportpce.common.mapping.PortMappingVersion221;
-import org.opendaylight.transportpce.common.mapping.PortMappingVersion710;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl121;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl221;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl710;
-import org.opendaylight.transportpce.olm.stub.MountPointServiceStub;
-import org.opendaylight.transportpce.olm.stub.MountPointStub;
-import org.opendaylight.transportpce.olm.util.OlmPowerServiceRpcImplUtil;
-import org.opendaylight.transportpce.olm.util.OlmUtils;
-import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.OpenroadmNodeVersion;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfoBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.OpticalControlMode;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.RatioDB;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.InterfaceBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014.Interface1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014.ots.container.Ots;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014.ots.container.OtsBuilder;
-import org.powermock.api.mockito.PowerMockito;
-import org.powermock.core.classloader.annotations.PowerMockIgnore;
-import org.powermock.core.classloader.annotations.PrepareForTest;
-import org.powermock.modules.junit4.PowerMockRunner;
-
-@Ignore
-@RunWith(PowerMockRunner.class)
-@PrepareForTest({OlmUtils.class,PowerMgmtVersion121.class})
-@PowerMockIgnore("org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.*")
-public class PowerMgmtPowerMockTest extends AbstractTest {
-
-    private MountPoint mountPoint;
-    private MountPointService mountPointService;
-    private DeviceTransactionManager deviceTransactionManager;
-    private CrossConnect crossConnect;
-    private OpenRoadmInterfaces openRoadmInterfaces;
-    private PortMapping portMapping;
-    private PowerMgmt powerMgmt;
-    private CrossConnectImpl121 crossConnectImpl121;
-    private CrossConnectImpl221 crossConnectImpl22;
-    private CrossConnectImpl710 crossConnectImpl710;
-    private MappingUtils mappingUtils;
-    private OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121;
-    private OpenRoadmInterfacesImpl221 openRoadmInterfacesImpl22;
-    private OpenRoadmInterfacesImpl710 openRoadmInterfacesImpl710;
-    private PortMappingVersion710 portMappingVersion710;
-    private PortMappingVersion221 portMappingVersion22;
-    private PortMappingVersion121 portMappingVersion121;
-
-    @Before
-    public void setUp() {
-        this.mountPoint = new MountPointStub(getDataBroker());
-        this.mountPointService = new MountPointServiceStub(mountPoint);
-        this.mappingUtils = new MappingUtilsImpl(getDataBroker());
-        this.mappingUtils = Mockito.spy(new MappingUtilsImpl(getDataBroker()));
-        Mockito.doReturn(StringConstants.OPENROADM_DEVICE_VERSION_1_2_1).when(mappingUtils)
-                .getOpenRoadmVersion(Mockito.anyString());
-        this.deviceTransactionManager = new DeviceTransactionManagerImpl(mountPointService, 3000);
-        this.crossConnectImpl121 = new CrossConnectImpl121(deviceTransactionManager);
-        this.crossConnectImpl22 = new CrossConnectImpl221(deviceTransactionManager);
-        this.crossConnect = new CrossConnectImpl(deviceTransactionManager, this.mappingUtils, this.crossConnectImpl121,
-                this.crossConnectImpl22, this.crossConnectImpl710);
-        this.portMappingVersion22 = new PortMappingVersion221(getDataBroker(), deviceTransactionManager);
-        this.portMappingVersion121 = new PortMappingVersion121(getDataBroker(), deviceTransactionManager);
-        this.portMappingVersion710 = new PortMappingVersion710(getDataBroker(), deviceTransactionManager);
-        this.portMapping = new PortMappingImpl(getDataBroker(), this.portMappingVersion710,
-            this.portMappingVersion22, this.portMappingVersion121);
-        this.openRoadmInterfacesImpl121 = new OpenRoadmInterfacesImpl121(deviceTransactionManager);
-        this.openRoadmInterfacesImpl22 = new OpenRoadmInterfacesImpl221(deviceTransactionManager, this.portMapping,
-            this.portMappingVersion22);
-        this.openRoadmInterfacesImpl710 = new OpenRoadmInterfacesImpl710(deviceTransactionManager, this.portMapping,
-            this.portMappingVersion710);
-        this.openRoadmInterfaces = new OpenRoadmInterfacesImpl((this.deviceTransactionManager),
-                this.mappingUtils,this.openRoadmInterfacesImpl121,this.openRoadmInterfacesImpl22,
-            this.openRoadmInterfacesImpl710);
-        this.openRoadmInterfaces = Mockito.spy(this.openRoadmInterfaces);
-        this.portMapping = Mockito.spy(this.portMapping);
-        this.powerMgmt = new PowerMgmtImpl(getDataBroker(), this.openRoadmInterfaces, this.crossConnect,
-                this.deviceTransactionManager);
-    }
-
-    @Test
-    public void testSetPowerMockingUtil() {
-        PowerMockito.mockStatic(OlmUtils.class);
-        PowerMockito.when(OlmUtils.getNode(Mockito.anyString(), ArgumentMatchers.eq(getDataBroker())))
-                .thenReturn(Optional.of(getXpdrNodesFromNodesBuilderDeg()));
-        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput2();
-        boolean output = this.powerMgmt.setPower(input);
-        Assert.assertEquals(false, output);
-
-    }
-
-    @Test
-    public void testSetPowerMockingUtilNetwokType() throws OpenRoadmInterfaceException {
-        PowerMockito.mockStatic(OlmUtils.class);
-        PowerMockito.mockStatic(PowerMgmtVersion121.class);
-        PowerMockito.when(OlmUtils.getNode(Mockito.anyString(), ArgumentMatchers.eq(getDataBroker())))
-                .thenReturn(Optional.of(getXpdrNodesFromNodesBuilderNetwork()));
-        Map<String, Double> txPowerRangeMap = new HashMap<>();
-        PowerMockito.when(PowerMgmtVersion121.getXponderPowerRange(
-                Mockito.anyString(), Mockito.anyString(), Mockito.anyString(),
-                ArgumentMatchers.eq(deviceTransactionManager)))
-                .thenReturn(txPowerRangeMap);
-        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput2();
-        OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121Spy = PowerMockito.mock(OpenRoadmInterfacesImpl121.class);
-        Mockito.when(openRoadmInterfacesImpl121Spy.getInterface(Mockito.anyString(), Mockito.anyString()))
-                .thenReturn(Optional.empty());
-        PowerMgmtImpl powerMgmtImpl = getNewPowerMgmt(openRoadmInterfacesImpl121Spy,this.crossConnect);
-        boolean output = powerMgmtImpl.setPower(input);
-        Assert.assertEquals(true, output);
-
-    }
-
-    @Test
-    public void testSetPowerMockingUtilNetwokTypeMoreThanOneNode() throws OpenRoadmInterfaceException {
-        PowerMockito.mockStatic(OlmUtils.class);
-        PowerMockito.mockStatic(PowerMgmtVersion121.class);
-        PowerMockito.when(OlmUtils.getNode(Mockito.anyString(), ArgumentMatchers.eq(getDataBroker())))
-                .thenReturn(Optional.of(getXpdrNodesFromNodesBuilderNetwork()));
-        Map<String, Double> txPowerRangeMap = new HashMap<>();
-        PowerMockito.when(PowerMgmtVersion121
-                .getXponderPowerRange(Mockito.anyString(), Mockito.anyString(), Mockito.anyString(),
-                        ArgumentMatchers.eq(deviceTransactionManager)))
-                .thenReturn(txPowerRangeMap);
-        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput2();
-        OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121Spy = PowerMockito.mock(OpenRoadmInterfacesImpl121.class);
-        Mockito.when(openRoadmInterfacesImpl121Spy.getInterface(Mockito.anyString(), Mockito.anyString()))
-                .thenReturn(Optional.empty());
-        PowerMgmtImpl powerMgmtImpl = getNewPowerMgmt(openRoadmInterfacesImpl121Spy,this.crossConnect);
-        boolean output = powerMgmtImpl.setPower(input);
-        Assert.assertEquals(true, output);
-
-    }
-
-    @Test
-    public void testSetPowerXpdrNodes() {
-        PowerMockito.mockStatic(OlmUtils.class);
-        PowerMockito.when(OlmUtils.getNode(Mockito.anyString(), ArgumentMatchers.eq(getDataBroker())))
-                .thenReturn(Optional.of(getXpdrNodesFromNodesBuilderDeg()));
-        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput3();
-        boolean output = this.powerMgmt.setPower(input);
-        Assert.assertEquals(true, output);
-
-    }
-
-    @Test
-    public void testSetPowerRdmNodesReturnInterfaceEmpty() throws OpenRoadmInterfaceException {
-        PowerMockito.mockStatic(OlmUtils.class);
-        Mockito.when(OlmUtils.getNode(Mockito.anyString(), ArgumentMatchers.eq(getDataBroker())))
-                .thenReturn(Optional.of(getRdmNodesFromNodesBuilder()));
-        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput3();
-        OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121Spy = PowerMockito.mock(OpenRoadmInterfacesImpl121.class);
-        Mockito.when(openRoadmInterfacesImpl121Spy.getInterface(Mockito.anyString(), Mockito.anyString()))
-                .thenReturn(Optional.empty());
-        PowerMgmtImpl powerMgmtImpl = getNewPowerMgmt(openRoadmInterfacesImpl121Spy,this.crossConnect);
-        boolean output = powerMgmtImpl.setPower(input);
-        Assert.assertEquals(false, output);
-    }
-
-    @Test
-    public void testSetPowerRdmNodesThrowsException() throws OpenRoadmInterfaceException {
-        PowerMockito.mockStatic(OlmUtils.class);
-        Mockito.when(OlmUtils.getNode(Mockito.anyString(), ArgumentMatchers.eq(getDataBroker())))
-                .thenReturn(Optional.of(getRdmNodesFromNodesBuilder()));
-        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput3();
-        OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121Spy = PowerMockito.mock(OpenRoadmInterfacesImpl121.class);
-        Mockito.when(openRoadmInterfacesImpl121Spy.getInterface(Mockito.anyString(), Mockito.anyString()))
-                .thenThrow(new OpenRoadmInterfaceException("error thrown by unit tests "));
-        PowerMgmtImpl powerMgmtImpl = getNewPowerMgmt(openRoadmInterfacesImpl121Spy,this.crossConnect);
-        boolean output = powerMgmtImpl.setPower(input);
-        Assert.assertEquals(false, output);
-    }
-
-    @Test
-    public void testSetPowerRdmNodesReturnInterface() throws OpenRoadmInterfaceException {
-        PowerMockito.mockStatic(OlmUtils.class);
-        Mockito.when(OlmUtils.getNode(Mockito.anyString(), ArgumentMatchers.eq(getDataBroker())))
-                .thenReturn(Optional.of(getRdmNodesFromNodesBuilder()));
-        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput3();
-        OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121Spy = PowerMockito.mock(OpenRoadmInterfacesImpl121.class);
-
-        Ots ots = new OtsBuilder().setSpanLossTransmit(new RatioDB(new BigDecimal(23))).build();
-        Interface1Builder intf1Builder = new Interface1Builder();
-        Mockito.when(openRoadmInterfacesImpl121Spy.getInterface(Mockito.anyString(), Mockito.anyString())).thenReturn(
-                Optional.of(new InterfaceBuilder().addAugmentation(intf1Builder.setOts(ots).build())
-                        .build()));
-        CrossConnect crossConnectMock = Mockito.mock(CrossConnectImpl.class);
-        Mockito.when(crossConnectMock
-                .setPowerLevel(Mockito.anyString(), OpticalControlMode.Power.getName(), Mockito.any(),
-                        Mockito.anyString())).thenReturn(true);
-        PowerMgmtImpl powerMgmtImpl = getNewPowerMgmt(openRoadmInterfacesImpl121Spy,crossConnectMock);
-        boolean output = powerMgmtImpl.setPower(input);
-        Assert.assertEquals(true, output);
-    }
-
-    private PowerMgmtImpl getNewPowerMgmt(OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121Spy,
-            CrossConnect crossConnectMock) {
-        OpenRoadmInterfacesImpl openRoadmInterfacesSpy = new OpenRoadmInterfacesImpl((this.deviceTransactionManager),
-                this.mappingUtils, openRoadmInterfacesImpl121Spy, this.openRoadmInterfacesImpl22,
-            this.openRoadmInterfacesImpl710);
-        openRoadmInterfacesSpy = PowerMockito.spy(openRoadmInterfacesSpy);
-        return new PowerMgmtImpl(getDataBroker(), openRoadmInterfacesSpy, crossConnectMock,
-                this.deviceTransactionManager);
-    }
-
-    private Nodes getXpdrNodesFromNodesBuilderDeg() {
-        MappingBuilder mappingBuilder = getMappingBuilderDeg();
-        Mapping mapping = mappingBuilder.build();
-        return new NodesBuilder().setNodeId("node 1")
-                .setNodeInfo(new NodeInfoBuilder().setNodeType(NodeTypes.Xpdr).build())
-                .setMapping(Map.of(mapping.key(),mapping))
-                .build();
-    }
-
-    private Nodes getXpdrNodesFromNodesBuilderNetwork() {
-        MappingBuilder mappingBuilder = getMappingBuilderNetWork();
-        Mapping mapping = mappingBuilder.build();
-        return new NodesBuilder().setNodeId("node 1")
-                .setNodeInfo(new NodeInfoBuilder().setNodeType(NodeTypes.Xpdr)
-                        .setOpenroadmVersion(OpenroadmNodeVersion._121)
-                        .build())
-                .setMapping(Map.of(mapping.key(),mapping))
-                .build();
-    }
-
-    private Nodes getRdmNodesFromNodesBuilder() {
-        MappingBuilder mappingBuilder = getMappingBuilderDeg();
-        Mapping mapping = mappingBuilder.build();
-        return new NodesBuilder().setNodeId("node 1").setNodeInfo(
-                new NodeInfoBuilder().setNodeType(NodeTypes.Rdm)
-                        .setOpenroadmVersion(OpenroadmNodeVersion._121)
-                        .build())
-                .setMapping(Map.of(mapping.key(),mapping))
-                .build();
-    }
-
-    private MappingBuilder getMappingBuilderDeg() {
-        return new MappingBuilder()
-            .withKey(new MappingKey("deg"))
-            .setLogicalConnectionPoint("logicalConnPoint")
-            .setSupportingOts("OTS")
-            .setSupportingCircuitPackName("2/0")
-            .setSupportingOms("OMS")
-            .setSupportingPort("8080")
-            .setSupportingCircuitPackName("circuit1");
-    }
-
-    private MappingBuilder getMappingBuilderNetWork() {
-        return new MappingBuilder()
-            .withKey(new MappingKey("network"))
-            .setLogicalConnectionPoint("logicalConnPoint")
-            .setSupportingOts("OTS")
-            .setSupportingCircuitPackName("2/0")
-            .setSupportingOms("OMS")
-            .setSupportingPort("8080")
-            .setSupportingCircuitPackName("circuit1");
-    }
-}
index 81532602f511f1de54b062e048507d4ca89238a2..e064b9df153641677103bda307a438ed9e9e1307 100644 (file)
 
 package org.opendaylight.transportpce.olm.power;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoInteractions;
+import static org.mockito.Mockito.when;
+
+import java.math.BigDecimal;
+import java.util.HashMap;
 import java.util.List;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import java.util.Map;
+import java.util.Optional;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.MockedStatic;
 import org.mockito.Mockito;
 import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.api.MountPoint;
-import org.opendaylight.mdsal.binding.api.MountPointService;
-import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl;
-import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl121;
-import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl221;
-import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl710;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
-import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl;
-import org.opendaylight.transportpce.common.mapping.MappingUtils;
-import org.opendaylight.transportpce.common.mapping.MappingUtilsImpl;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
-import org.opendaylight.transportpce.common.mapping.PortMappingImpl;
-import org.opendaylight.transportpce.common.mapping.PortMappingVersion121;
-import org.opendaylight.transportpce.common.mapping.PortMappingVersion221;
-import org.opendaylight.transportpce.common.mapping.PortMappingVersion710;
+import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl121;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl221;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl710;
-import org.opendaylight.transportpce.olm.stub.MountPointServiceStub;
-import org.opendaylight.transportpce.olm.stub.MountPointStub;
 import org.opendaylight.transportpce.olm.util.OlmPowerServiceRpcImplUtil;
-import org.opendaylight.transportpce.olm.util.TransactionUtils;
-import org.opendaylight.transportpce.test.AbstractTest;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownInput;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.OpenroadmNodeVersion;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.OpticalControlMode;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.RatioDB;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.Interface;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.InterfaceBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev161014.Interface1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev161014.och.container.OchBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014.ots.container.OtsBuilder;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 
-public class PowerMgmtTest extends AbstractTest {
-    private MountPoint mountPoint;
-    private MountPointService mountPointService;
-    private DeviceTransactionManager deviceTransactionManager;
-    private CrossConnect crossConnect;
+class PowerMgmtTest {
     private OpenRoadmInterfaces openRoadmInterfaces;
+    private CrossConnect crossConnect;
+    private DeviceTransactionManager deviceTransactionManager;
     private PortMapping portMapping;
     private PowerMgmt powerMgmt;
-    private CrossConnectImpl121 crossConnectImpl121;
-    private CrossConnectImpl221 crossConnectImpl22;
-    private CrossConnectImpl710 crossConnectImpl710;
-    private MappingUtils mappingUtils;
-    private OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121;
-    private OpenRoadmInterfacesImpl221 openRoadmInterfacesImpl22;
-    private OpenRoadmInterfacesImpl710 openRoadmInterfacesImpl710;
-    private PortMappingVersion710 portMappingVersion710;
-    private PortMappingVersion221 portMappingVersion22;
-    private PortMappingVersion121 portMappingVersion121;
-    private DataBroker dataBroker;
 
-    @Before
-    public void setUp() {
-        dataBroker = this.getNewDataBroker();
-        this.mountPoint = new MountPointStub(dataBroker);
-        this.mountPointService = new MountPointServiceStub(mountPoint);
-        this.mappingUtils = Mockito.spy(new MappingUtilsImpl(dataBroker));
-        Mockito.doReturn(StringConstants.OPENROADM_DEVICE_VERSION_1_2_1).when(mappingUtils)
-                .getOpenRoadmVersion(Mockito.anyString());
-        this.deviceTransactionManager = new DeviceTransactionManagerImpl(mountPointService, 3000);
-        this.crossConnectImpl121 = new CrossConnectImpl121(deviceTransactionManager);
-        this.crossConnectImpl22 = new CrossConnectImpl221(deviceTransactionManager);
-        this.crossConnect = new CrossConnectImpl(deviceTransactionManager, this.mappingUtils, this.crossConnectImpl121,
-                this.crossConnectImpl22, this.crossConnectImpl710);
-        this.portMappingVersion22 = new PortMappingVersion221(dataBroker, deviceTransactionManager);
-        this.portMappingVersion121 = new PortMappingVersion121(dataBroker, deviceTransactionManager);
-        this.portMapping = new PortMappingImpl(getDataBroker(), this.portMappingVersion710,
-                this.portMappingVersion22, this.portMappingVersion121);
-        this.openRoadmInterfacesImpl121 = new OpenRoadmInterfacesImpl121(deviceTransactionManager);
-        this.openRoadmInterfacesImpl22 = new OpenRoadmInterfacesImpl221(deviceTransactionManager, this.portMapping,
-            this.portMappingVersion22);
-        this.openRoadmInterfacesImpl710 = new OpenRoadmInterfacesImpl710(deviceTransactionManager, this.portMapping,
-            this.portMappingVersion710);
-        this.openRoadmInterfaces = new OpenRoadmInterfacesImpl((this.deviceTransactionManager),
-                this.mappingUtils,this.openRoadmInterfacesImpl121,this.openRoadmInterfacesImpl22,
-            this.openRoadmInterfacesImpl710);
-        this.openRoadmInterfaces = Mockito.spy(this.openRoadmInterfaces);
-        this.portMapping = Mockito.spy(this.portMapping);
-        this.powerMgmt = new PowerMgmtImpl(this.dataBroker, this.openRoadmInterfaces, this.crossConnect,
-                this.deviceTransactionManager);
+    @BeforeEach
+    void setUp() {
+        mock(DataBroker.class);
+        this.openRoadmInterfaces = Mockito.mock(OpenRoadmInterfaces.class);
+        this.crossConnect = Mockito.mock((CrossConnectImpl.class));
+        this.deviceTransactionManager = Mockito.mock(DeviceTransactionManager.class);
+        this.portMapping = Mockito.mock(PortMapping.class);
+        this.powerMgmt = new PowerMgmtImpl(this.openRoadmInterfaces, this.crossConnect,
+                this.deviceTransactionManager, this.portMapping, 1000, 1000);
     }
 
     @Test
-    public void testSetPower() {
-        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput();
-        boolean output = this.powerMgmt.setPower(input);
-        Assert.assertEquals(true, output);
+    void testSetPowerWhenMappingReturnNull() {
+        when(this.portMapping.getNode(Mockito.anyString())).thenReturn(null);
+        boolean output = this.powerMgmt.setPower(OlmPowerServiceRpcImplUtil.getServicePowerSetupInput());
+        assertEquals(false, output);
     }
 
     @Test
-    public void testSetPower2() {
-        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput2();
-        boolean output = this.powerMgmt.setPower(input);
-        Assert.assertEquals(true, output);
-    }
+    void testSetPowerForTransponderAEnd() throws OpenRoadmInterfaceException {
+        when(this.portMapping.getNode("xpdr-A"))
+            .thenReturn(OlmPowerServiceRpcImplUtil.getMappingNodeTpdr("xpdr-A", OpenroadmNodeVersion._121,
+                    List.of("network-A")));
+        when(this.portMapping.getNode("roadm-A"))
+            .thenReturn(OlmPowerServiceRpcImplUtil.getMappingNodeRdm("roadm-A", OpenroadmNodeVersion._121,
+                    List.of("srg1-A", "deg2-A")));
+        Interface interfOch = new InterfaceBuilder()
+                .setName("interface name")
+                .addAugmentation(new Interface1Builder()
+                        .setOch(new OchBuilder().build())
+                        .build())
+                .build();
+        when(this.openRoadmInterfaces.getInterface(Mockito.matches("xpdr-A"), Mockito.anyString()))
+            .thenReturn(Optional.of(interfOch));
+        Interface interfOts = new InterfaceBuilder()
+                .setName("interface name")
+                .addAugmentation(
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014
+                                .Interface1Builder()
+                                .setOts(new OtsBuilder()
+                                        .setSpanLossTransmit(new RatioDB(Decimal64.valueOf("6")))
+                                        .build())
+                                .build())
+                .build();
+        when(this.openRoadmInterfaces.getInterface(Mockito.matches("roadm-A"), Mockito.anyString()))
+            .thenReturn(Optional.of(interfOts));
+        MockedStatic<PowerMgmtVersion121> pmv121 = Mockito.mockStatic(PowerMgmtVersion121.class);
+        pmv121.when(() -> PowerMgmtVersion121.setTransponderPower(Mockito.anyString(), Mockito.anyString(),
+                    Mockito.any(), Mockito.any(), Mockito.any()))
+                .thenReturn(true);
+        Map<String, Double> powerRangeMap = new HashMap<>();
+        powerRangeMap.put("MaxTx", 0.1);
+        powerRangeMap.put("MinTx", -5.1);
+        pmv121.when(() -> PowerMgmtVersion121.getXponderPowerRange(Mockito.anyString(), Mockito.anyString(),
+                    Mockito.anyString(), Mockito.any()))
+                .thenReturn(powerRangeMap);
+        when(this.crossConnect
+                .setPowerLevel(Mockito.anyString(), Mockito.anyString(), Mockito.any(), Mockito.anyString()))
+            .thenReturn(true);
 
-    @Test
-    public void testSetPower3() {
-        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput3();
-        boolean output = this.powerMgmt.setPower(input);
-        Assert.assertEquals(true, output);
+        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInputForTransponder();
+        boolean result = this.powerMgmt.setPower(input);
+        assertEquals(true, result);
     }
 
     @Test
-    public void testSetPower4() {
-        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput4();
-        boolean output = this.powerMgmt.setPower(input);
-        Assert.assertEquals(true, output);
-    }
+    void testSetPowerForTransponderZEnd() throws OpenRoadmInterfaceException {
+        when(this.portMapping.getNode("xpdr-C"))
+            .thenReturn(OlmPowerServiceRpcImplUtil
+                .getMappingNodeTpdr("xpdr-C", OpenroadmNodeVersion._121, List.of("client-C")));
 
-    @Test
-    public void testPowerTurnDown() {
-        ServicePowerTurndownInput input = OlmPowerServiceRpcImplUtil.getServicePowerTurndownInput();
-        boolean output = this.powerMgmt.powerTurnDown(input);
-        Assert.assertEquals(true, output);
+        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil
+                .getServicePowerSetupInputForOneNode("xpdr-C", "network-C", "client-C");
+        boolean result = this.powerMgmt.setPower(input);
+        assertEquals(true, result);
     }
 
     @Test
-    public void testPowerTurnDown2() {
-        ServicePowerTurndownInput input = OlmPowerServiceRpcImplUtil.getServicePowerTurndownInput2();
-        boolean output = this.powerMgmt.powerTurnDown(input);
-        Assert.assertEquals(false, output);
-    }
+    void testSetPowerForRoadmAEnd() throws OpenRoadmInterfaceException {
+        when(this.portMapping.getNode("roadm-A"))
+            .thenReturn(OlmPowerServiceRpcImplUtil.getMappingNodeRdm("roadm-A", OpenroadmNodeVersion._121,
+                        List.of("srg1-A", "deg2-A")));
+        when(this.deviceTransactionManager
+                .getDataFromDevice(Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.anyLong(), Mockito.any()))
+            .thenReturn(Optional.empty());
+        Interface interfOts = new InterfaceBuilder()
+                .setName("interface name")
+                .addAugmentation(
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014
+                            .Interface1Builder()
+                    .setOts(new OtsBuilder()
+                            .setSpanLossTransmit(new RatioDB(Decimal64.valueOf("6")))
+                            .build())
+                    .build())
+                .build();
+        when(this.openRoadmInterfaces.getInterface(Mockito.anyString(), Mockito.anyString()))
+            .thenReturn(Optional.of(interfOts));
+        when(this.crossConnect
+                .setPowerLevel(Mockito.anyString(), Mockito.anyString(), Mockito.any(), Mockito.anyString()))
+            .thenReturn(true);
 
-    @Test
-    public void testPowerTurnDown3() {
-        ServicePowerTurndownInput input = OlmPowerServiceRpcImplUtil.getServicePowerTurndownInput3();
-        boolean output = this.powerMgmt.powerTurnDown(input);
-        Assert.assertEquals(true, output);
+        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil
+                .getServicePowerSetupInputForOneNode("roadm-A", "srg1-A", "deg2-A");
+        boolean result = this.powerMgmt.setPower(input);
+        assertEquals(true, result);
+        verify(this.crossConnect, times(1)).setPowerLevel(Mockito.matches("roadm-A"),
+                Mockito.matches(OpticalControlMode.Power.getName()), eq(Decimal64.valueOf("-3.00")),
+                Mockito.matches("srg1-A-deg2-A-761:768"));
+        verify(this.crossConnect, times(1)).setPowerLevel(Mockito.matches("roadm-A"),
+                Mockito.matches(OpticalControlMode.GainLoss.getName()), eq(Decimal64.valueOf("-3.00")),
+                Mockito.matches("srg1-A-deg2-A-761:768"));
     }
 
     @Test
-    public void testPowerTurnDown4() {
-        ServicePowerTurndownInput input = OlmPowerServiceRpcImplUtil.getServicePowerTurndownInput4();
-        boolean output = this.powerMgmt.powerTurnDown(input);
-        Assert.assertEquals(false, output);
-    }
+    void testSetPowerForRoadmZEnd() throws OpenRoadmInterfaceException {
+        when(this.portMapping.getNode("roadm-C"))
+            .thenReturn(OlmPowerServiceRpcImplUtil.getMappingNodeRdm("roadm-C", OpenroadmNodeVersion._121,
+                    List.of("deg1-C", "srg1-C")));
+        when(this.deviceTransactionManager
+                .getDataFromDevice(Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.anyLong(), Mockito.any()))
+            .thenReturn(Optional.empty());
+        when(this.crossConnect
+                .setPowerLevel(Mockito.anyString(), Mockito.anyString(), Mockito.any(), Mockito.anyString()))
+            .thenReturn(true);
 
-    @Test
-    public void testSetPowerPresentNodes() throws InterruptedException {
-        List<NodeId> nodes = TransactionUtils.getNodeIds();
-        for (NodeId nodeId : nodes) {
-            TransactionUtils.writeNodeTransaction(nodeId.getValue(), this.dataBroker, null);
-            Thread.sleep(1000);
-        }
-        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput();
-        boolean output = this.powerMgmt.setPower(input);
-        Assert.assertEquals(true, output);
+        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil
+                .getServicePowerSetupInputForOneNode("roadm-C", "deg1-C", "srg1-C");
+        boolean result = this.powerMgmt.setPower(input);
+        assertEquals(true, result);
+        verify(this.crossConnect, times(1)).setPowerLevel(Mockito.matches("roadm-C"),
+                Mockito.matches(OpticalControlMode.Power.getName()), Mockito.isNull(),
+                Mockito.matches("deg1-C-srg1-C-761:768"));
     }
 
     @Test
-    public void testSetPowerPresentNodes2() throws InterruptedException {
-        List<NodeId> nodes = TransactionUtils.getNodeIds();
-        for (NodeId nodeId : nodes) {
-            TransactionUtils.writeNodeTransaction2(nodeId.getValue(), this.dataBroker, null);
-            Thread.sleep(500);
-        }
-        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput();
-        boolean output = this.powerMgmt.setPower(input);
-        Assert.assertEquals(true, output);
-    }
+    void testSetPowerForTransponderWhenNoTransponderPort() throws OpenRoadmInterfaceException {
+        when(this.portMapping.getNode("xpdr-A"))
+            .thenReturn(OlmPowerServiceRpcImplUtil.getMappingNodeTpdr("xpdr-A", OpenroadmNodeVersion._121,
+                    List.of("network-A")));
+        when(this.portMapping.getNode("roadm-A"))
+            .thenReturn(OlmPowerServiceRpcImplUtil.getMappingNodeRdm("roadm-A", OpenroadmNodeVersion._121,
+                    List.of("srg1-A", "deg2-A")));
+        Interface interfOch = new InterfaceBuilder()
+                .setName("interface name")
+                .addAugmentation(new Interface1Builder()
+                        .setOch(new OchBuilder().build())
+                        .build())
+                .build();
+        when(this.openRoadmInterfaces.getInterface(Mockito.matches("xpdr-A"), Mockito.anyString()))
+            .thenReturn(Optional.of(interfOch));
+        Interface interfOts = new InterfaceBuilder()
+                .setName("interface name")
+                .addAugmentation(
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014
+                                .Interface1Builder()
+                                .setOts(new OtsBuilder()
+                                        .setSpanLossTransmit(new RatioDB(Decimal64.valueOf("6")))
+                                        .build())
+                                .build())
+                .build();
+        when(this.openRoadmInterfaces.getInterface(Mockito.matches("roadm-A"), Mockito.anyString()))
+            .thenReturn(Optional.of(interfOts));
+        try (MockedStatic<PowerMgmtVersion121> pmv121 = Mockito.mockStatic(PowerMgmtVersion121.class)) {
+            pmv121.when(() -> PowerMgmtVersion121.setTransponderPower(Mockito.anyString(), Mockito.anyString(),
+                            Mockito.any(), Mockito.any(), Mockito.any()))
+                    .thenReturn(true);
+            pmv121.when(() -> PowerMgmtVersion121.getXponderPowerRange(Mockito.anyString(), Mockito.anyString(),
+                            Mockito.anyString(), Mockito.any()))
+                    .thenReturn(new HashMap<>());
 
-    @Test
-    public void testSetPowerPresentNodes3() throws InterruptedException {
-        List<NodeId> nodes = TransactionUtils.getNodeIds();
-        for (NodeId nodeId : nodes) {
-            TransactionUtils.writeNodeTransaction3(nodeId.getValue(), this.dataBroker, null);
-            Thread.sleep(500);
-        }
-        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput();
-        boolean output = this.powerMgmt.setPower(input);
-        Assert.assertEquals(true, output);
-    }
-    /*
-    TODO: see if this test is always relevant
-    @Test
-    public void testSetPowerPresentNodes31() throws InterruptedException {
-        List<NodeId> nodes = TransactionUtils.getNodeIds();
-        for (NodeId nodeId : nodes) {
-            TransactionUtils.writeNodeTransaction3(nodeId.getValue(), this.getDataBroker(), "deg");
-            Thread.sleep(500);
-        }
-        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput3();
-        boolean output = this.powerMgmt.setPower(input);
-        Assert.assertEquals(false, output);
-    }*/
+            when(this.crossConnect
+                    .setPowerLevel(Mockito.anyString(), Mockito.anyString(), Mockito.any(), Mockito.anyString()))
+                .thenReturn(true);
 
-    @Test
-    public void testSetPowerPresentNodes312() throws InterruptedException {
-        List<NodeId> nodes = TransactionUtils.getNodeIds();
-        for (NodeId nodeId : nodes) {
-            TransactionUtils.writeNodeTransaction3(nodeId.getValue(), this.dataBroker, "deg");
-            Thread.sleep(500);
+
+            ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInputForTransponder();
+            boolean result = this.powerMgmt.setPower(input);
+            assertEquals(true, result);
+            pmv121.verify(() -> PowerMgmtVersion121.setTransponderPower(Mockito.matches("xpdr-A"),
+                    Mockito.anyString(), eq(new BigDecimal("-5")), Mockito.any(), Mockito.any()));
+            verify(this.crossConnect, times(1)).setPowerLevel(Mockito.matches("roadm-A"),
+                    Mockito.matches(OpticalControlMode.GainLoss.getName()), eq(Decimal64.valueOf("-3.00")),
+                    Mockito.matches("srg1-A-deg2-A-761:768"));
         }
-        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput4();
-        boolean output = this.powerMgmt.setPower(input);
-        Assert.assertEquals(true, output);
     }
 
     @Test
-    public void testSetPowerPresentNodes32() throws InterruptedException {
-        List<NodeId> nodes = TransactionUtils.getNodeIds();
-        for (NodeId nodeId : nodes) {
-            TransactionUtils.writeNodeTransaction3(nodeId.getValue(), this.dataBroker, null);
-            Thread.sleep(500);
+    void testSetPowerForTransponderAEndWithRoadmPort() throws OpenRoadmInterfaceException {
+        when(this.portMapping.getNode("xpdr-A"))
+            .thenReturn(OlmPowerServiceRpcImplUtil.getMappingNodeTpdr("xpdr-A", OpenroadmNodeVersion._121,
+                    List.of("network-A")));
+        when(this.portMapping.getNode("roadm-A"))
+            .thenReturn(OlmPowerServiceRpcImplUtil.getMappingNodeRdm("roadm-A", OpenroadmNodeVersion._121,
+                    List.of("srg1-A", "deg2-A")));
+        Interface interfOch = new InterfaceBuilder()
+                .setName("interface name")
+                .addAugmentation(new Interface1Builder()
+                        .setOch(new OchBuilder().build())
+                        .build())
+                .build();
+        when(this.openRoadmInterfaces.getInterface(Mockito.matches("xpdr-A"), Mockito.anyString()))
+            .thenReturn(Optional.of(interfOch));
+        Interface interfOts = new InterfaceBuilder()
+                .setName("interface name")
+                .addAugmentation(
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014
+                                .Interface1Builder()
+                                .setOts(new OtsBuilder()
+                                        .setSpanLossTransmit(new RatioDB(Decimal64.valueOf("6")))
+                                        .build())
+                                .build())
+                .build();
+        when(this.openRoadmInterfaces.getInterface(Mockito.matches("roadm-A"), Mockito.anyString()))
+            .thenReturn(Optional.of(interfOts));
+        try (MockedStatic<PowerMgmtVersion121> pmv121 = Mockito.mockStatic(PowerMgmtVersion121.class)) {
+
+            pmv121.when(() -> PowerMgmtVersion121.setTransponderPower(Mockito.anyString(), Mockito.anyString(),
+                            Mockito.any(), Mockito.any(), Mockito.any()))
+                    .thenReturn(true);
+            Map<String, Double> powerRangeMapTpdrTx = new HashMap<>();
+            powerRangeMapTpdrTx.put("MaxTx", 0.1);
+            powerRangeMapTpdrTx.put("MinTx", -5.1);
+            pmv121.when(() -> PowerMgmtVersion121.getXponderPowerRange(Mockito.anyString(), Mockito.anyString(),
+                            Mockito.anyString(), Mockito.any()))
+                    .thenReturn(powerRangeMapTpdrTx);
+            Map<String, Double> powerRangeMapSrgRx = new HashMap<>();
+            powerRangeMapSrgRx.put("MaxRx", -4.2);
+            powerRangeMapSrgRx.put("MinRx", -22.2);
+            pmv121.when(() -> PowerMgmtVersion121.getSRGRxPowerRange(Mockito.anyString(), Mockito.anyString(),
+                            Mockito.any(), Mockito.anyString(), Mockito.anyString()))
+                    .thenReturn(powerRangeMapSrgRx);
+            when(this.crossConnect
+                    .setPowerLevel(Mockito.anyString(), Mockito.anyString(), Mockito.any(), Mockito.anyString()))
+                .thenReturn(true);
+
+            ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInputForTransponder();
+            boolean result = this.powerMgmt.setPower(input);
+            assertEquals(true, result);
+            pmv121.verify(() -> PowerMgmtVersion121.setTransponderPower(Mockito.matches("xpdr-A"),
+                    Mockito.anyString(), eq(new BigDecimal("-4.20000000000000017763568394002504646778106689453125")),
+                    Mockito.any(), Mockito.any()));
         }
-        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput3();
-        boolean output = this.powerMgmt.setPower(input);
-        Assert.assertEquals(true, output);
     }
 
     @Test
-    public void testSetPowerPresentNodes4() throws InterruptedException {
-        List<NodeId> nodes = TransactionUtils.getNodeIds();
-        for (NodeId nodeId : nodes) {
-            TransactionUtils.writeNodeTransaction(nodeId.getValue(), this.dataBroker, "network");
-            Thread.sleep(500);
-        }
-        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput2();
-        boolean output = this.powerMgmt.setPower(input);
-        Assert.assertEquals(true, output);
+    void testSetPowerWithoutNode() {
+        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInputWthoutNode();
+        boolean result = this.powerMgmt.setPower(input);
+        assertEquals(false, result);
+        verifyNoInteractions(this.crossConnect);
     }
 
-    /*
-    TODO: see if this test is always relevant
     @Test
-    public void testSetPowerPresentNodes41() throws InterruptedException {
-        List<NodeId> nodes = TransactionUtils.getNodeIds();
-        for (NodeId nodeId : nodes) {
-            TransactionUtils.writeNodeTransaction(nodeId.getValue(), this.getDataBroker(), null);
-            Thread.sleep(500);
-        }
-        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput2();
-        boolean output = this.powerMgmt.setPower(input);
-        Assert.assertEquals(false, output);
-    }*/
+    void testSetPowerForBadNodeType() throws OpenRoadmInterfaceException {
+        when(this.portMapping.getNode("ila node")).thenReturn(OlmPowerServiceRpcImplUtil.getMappingNodeIla());
 
-    @Test
-    public void testSetPowerPresentNodes42() throws InterruptedException {
-        List<NodeId> nodes = TransactionUtils.getNodeIds();
-        for (NodeId nodeId : nodes) {
-            TransactionUtils.writeNodeTransaction(nodeId.getValue(), this.dataBroker, "deg");
-            Thread.sleep(500);
-        }
-        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput3();
-        boolean output = this.powerMgmt.setPower(input);
-        Assert.assertEquals(true, output);
+        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil
+                .getServicePowerSetupInputForOneNode("ila node", "rx-port", "tx-port");
+        boolean result = this.powerMgmt.setPower(input);
+        assertEquals(true, result);
+        verifyNoInteractions(this.crossConnect);
+        verifyNoInteractions(this.openRoadmInterfaces);
     }
 
+
     @Test
-    public void testSetPowerPresentNodes422() throws InterruptedException {
-        List<NodeId> nodes = TransactionUtils.getNodeIds();
-        for (NodeId nodeId : nodes) {
-            TransactionUtils.writeNodeTransaction(nodeId.getValue(), this.dataBroker, "deg");
-            Thread.sleep(500);
-        }
-        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput4();
-        boolean output = this.powerMgmt.setPower(input);
-        Assert.assertEquals(true, output);
+    void testPowerTurnDownWhenSuccess() {
+        when(this.crossConnect
+                .setPowerLevel(Mockito.anyString(), Mockito.anyString(), Mockito.any(), Mockito.anyString()))
+            .thenReturn(true);
+        ServicePowerTurndownInput input = OlmPowerServiceRpcImplUtil.getServicePowerTurndownInput();
+        boolean result = this.powerMgmt.powerTurnDown(input);
+        assertEquals(true, result);
+        verify(this.crossConnect, times(1)).setPowerLevel(Mockito.matches("roadm-C"),
+                Mockito.matches(OpticalControlMode.Off.getName()), Mockito.isNull(), Mockito.anyString());
+        verify(this.crossConnect, times(1)).setPowerLevel(Mockito.matches("roadm-A"),
+                Mockito.matches(OpticalControlMode.Power.getName()), eq(Decimal64.valueOf("-60")),
+                Mockito.anyString());
+        verify(this.crossConnect, times(1)).setPowerLevel(Mockito.matches("roadm-A"),
+                Mockito.matches(OpticalControlMode.Off.getName()), Mockito.isNull(), Mockito.anyString());
     }
 
     @Test
-    public void testSetPowerPresentNodes43() throws InterruptedException {
-        List<NodeId> nodes = TransactionUtils.getNodeIds();
-        for (NodeId nodeId : nodes) {
-            TransactionUtils.writeNodeTransaction(nodeId.getValue(), this.dataBroker, null);
-            Thread.sleep(500);
-        }
-        ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput3();
-        boolean output = this.powerMgmt.setPower(input);
-        Assert.assertEquals(true, output);
+    void testPowerTurnDownWhenFailure() {
+        when(this.crossConnect
+                .setPowerLevel(Mockito.anyString(), Mockito.anyString(), Mockito.any(), Mockito.anyString()))
+            .thenReturn(false);
+        ServicePowerTurndownInput input = OlmPowerServiceRpcImplUtil.getServicePowerTurndownInput();
+        boolean result = this.powerMgmt.powerTurnDown(input);
+        assertEquals(false, result);
+        verify(this.crossConnect, times(2))
+                .setPowerLevel(Mockito.anyString(), Mockito.any(), Mockito.any(), Mockito.anyString());
     }
-
 }
index 68db7160c624dc0d5540c3c3fdc3d478455b929c..24fa516f8bec66a423a5f69fcd67f87abfa8e7d1 100644 (file)
@@ -8,13 +8,16 @@
 
 package org.opendaylight.transportpce.olm.service;
 
-import java.math.BigDecimal;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
 import java.util.Optional;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.NetworkUtils;
@@ -40,6 +43,7 @@ import org.opendaylight.transportpce.test.AbstractTest;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossBaseInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossBaseOutput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.RatioDB;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp.Interface;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp.InterfaceBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp.InterfaceKey;
@@ -55,10 +59,11 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class OlmPowerServiceImplSpanLossBaseTest extends AbstractTest {
+class OlmPowerServiceImplSpanLossBaseTest extends AbstractTest {
 
     private static final Logger LOG = LoggerFactory.getLogger(OlmPowerServiceImplSpanLossBaseTest.class);
     private DeviceTransactionManager deviceTransactionManager;
@@ -72,71 +77,72 @@ public class OlmPowerServiceImplSpanLossBaseTest extends AbstractTest {
     private OlmPowerService olmPowerService;
     private DataBroker dataBroker;
 
-    @Before
-    public void setUp() throws OpenRoadmInterfaceException {
-        this.openRoadmInterfacesImpl121 = Mockito.mock(OpenRoadmInterfacesImpl121.class);
-        this.openRoadmInterfacesImpl221 = Mockito.mock(OpenRoadmInterfacesImpl221.class);
-        this.mappingUtils = Mockito.mock(MappingUtilsImpl.class);
-        this.portMapping = Mockito.mock(PortMappingImpl.class);
-        this.deviceTransactionManager = Mockito.mock(DeviceTransactionManagerImpl.class);
-        this.powerMgmt = Mockito.mock(PowerMgmtImpl.class);
+    @BeforeEach
+    void setUp() throws OpenRoadmInterfaceException {
+        this.openRoadmInterfacesImpl121 = mock(OpenRoadmInterfacesImpl121.class);
+        this.openRoadmInterfacesImpl221 = mock(OpenRoadmInterfacesImpl221.class);
+        this.mappingUtils = mock(MappingUtilsImpl.class);
+        this.portMapping = mock(PortMappingImpl.class);
+        this.deviceTransactionManager = mock(DeviceTransactionManagerImpl.class);
+        this.powerMgmt = mock(PowerMgmtImpl.class);
         this.openRoadmInterfaces = new OpenRoadmInterfacesImpl(this.deviceTransactionManager, this.mappingUtils,
                 this.openRoadmInterfacesImpl121, this.openRoadmInterfacesImpl221, this.openRoadmInterfacesImpl710);
         this.olmPowerService = new OlmPowerServiceImpl(getDataBroker(), this.powerMgmt,
                 this.deviceTransactionManager, this.portMapping, this.mappingUtils, this.openRoadmInterfaces);
         this.dataBroker = getDataBroker();
-        MockitoAnnotations.openMocks(this);
-        Mockito.doReturn(StringConstants.OPENROADM_DEVICE_VERSION_2_2_1).when(this.mappingUtils)
-                .getOpenRoadmVersion(Mockito.anyString());
+        doReturn(StringConstants.OPENROADM_DEVICE_VERSION_2_2_1)
+            .when(this.mappingUtils).getOpenRoadmVersion(anyString());
 
-        Mockito.when(this.portMapping.getMapping("ROADM-A1", "DEG2-TTP-TXRX"))
-                .thenReturn(OlmTransactionUtils.getMapping1());
-        Mockito.when(this.portMapping.getMapping("ROADM-C1", "DEG1-TTP-TXRX"))
-                .thenReturn(OlmTransactionUtils.getMapping2());
+        when(this.portMapping.getMapping("ROADM-A1", "DEG2-TTP-TXRX")).thenReturn(OlmTransactionUtils.getMapping1());
+        when(this.portMapping.getMapping("ROADM-C1", "DEG1-TTP-TXRX")).thenReturn(OlmTransactionUtils.getMapping2());
 
         InstanceIdentifier<CurrentPmList> iidCurrentPmList = InstanceIdentifier.create(CurrentPmList.class);
-        Mockito.when(this.deviceTransactionManager.getDataFromDevice("ROADM-A1", LogicalDatastoreType.OPERATIONAL,
-                iidCurrentPmList, Timeouts.DEVICE_READ_TIMEOUT,
-                Timeouts.DEVICE_READ_TIMEOUT_UNIT)).thenReturn(OlmTransactionUtils.getCurrentPmListA());
-        Mockito.when(this.deviceTransactionManager.getDataFromDevice("ROADM-C1", LogicalDatastoreType.OPERATIONAL,
-                iidCurrentPmList, Timeouts.DEVICE_READ_TIMEOUT,
-                Timeouts.DEVICE_READ_TIMEOUT_UNIT)).thenReturn(OlmTransactionUtils.getCurrentPmListC());
-
-        InstanceIdentifier<Interface> interfacesIIDA = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(Interface.class, new InterfaceKey("OTS-DEG2-TTP-TXRX"));
-        InstanceIdentifier<Interface> interfacesIIDC = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(Interface.class, new InterfaceKey("OTS-DEG1-TTP-TXRX"));
+        when(this.deviceTransactionManager.getDataFromDevice("ROADM-A1", LogicalDatastoreType.OPERATIONAL,
+                iidCurrentPmList, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
+            .thenReturn(OlmTransactionUtils.getCurrentPmListA());
+        when(this.deviceTransactionManager.getDataFromDevice("ROADM-C1", LogicalDatastoreType.OPERATIONAL,
+                iidCurrentPmList, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
+            .thenReturn(OlmTransactionUtils.getCurrentPmListC());
+
+        InstanceIdentifier<Interface> interfacesIIDA = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Interface.class, new InterfaceKey("OTS-DEG2-TTP-TXRX"))
+            .build();
+        InstanceIdentifier<Interface> interfacesIIDC = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Interface.class, new InterfaceKey("OTS-DEG1-TTP-TXRX"))
+            .build();
         Optional<Interface> interfaceA = Optional.of(new InterfaceBuilder().setName("OTS-DEG2-TTP-TXRX").build());
         Optional<Interface> interfaceC = Optional.of(new InterfaceBuilder().setName("OTS-DEG1-TTP-TXRX").build());
-        Mockito.when(this.deviceTransactionManager.getDataFromDevice("ROADM-A1", LogicalDatastoreType.CONFIGURATION,
-                interfacesIIDA, Timeouts.DEVICE_READ_TIMEOUT,
-                Timeouts.DEVICE_READ_TIMEOUT_UNIT)).thenReturn(interfaceA);
-        Mockito.when(this.deviceTransactionManager.getDataFromDevice("ROADM-C1", LogicalDatastoreType.CONFIGURATION,
-                interfacesIIDC, Timeouts.DEVICE_READ_TIMEOUT,
-                Timeouts.DEVICE_READ_TIMEOUT_UNIT)).thenReturn(interfaceC);
-
-        Ots otsValue = new OtsBuilder().setSpanLossTransmit(new RatioDB(new BigDecimal(25)))
-                .setSpanLossReceive(new RatioDB(new BigDecimal(25))).build();
+        when(this.deviceTransactionManager.getDataFromDevice("ROADM-A1", LogicalDatastoreType.CONFIGURATION,
+                interfacesIIDA, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
+            .thenReturn(interfaceA);
+        when(this.deviceTransactionManager.getDataFromDevice("ROADM-C1", LogicalDatastoreType.CONFIGURATION,
+                interfacesIIDC, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT))
+            .thenReturn(interfaceC);
+
+        Ots otsValue = new OtsBuilder()
+            .setSpanLossTransmit(new RatioDB(Decimal64.valueOf("25")))
+            .setSpanLossReceive(new RatioDB(Decimal64.valueOf("25")))
+            .build();
         Interface1 ots = new Interface1Builder().setOts(otsValue).build();
-        Interface interA = new InterfaceBuilder().setName("OTS-DEG2-TTP-TXRX").setType(OpticalTransport.class)
+        Interface interA = new InterfaceBuilder().setName("OTS-DEG2-TTP-TXRX").setType(OpticalTransport.VALUE)
                 .addAugmentation(ots).build();
-        Interface interC = new InterfaceBuilder().setName("OTS-DEG1-TTP-TXRX").setType(OpticalTransport.class)
+        Interface interC = new InterfaceBuilder().setName("OTS-DEG1-TTP-TXRX").setType(OpticalTransport.VALUE)
                 .addAugmentation(ots).build();
         Optional<Interface> interOptA = Optional.of(interA);
         Optional<Interface> interOptC = Optional.of(interC);
-        Mockito.when(this.openRoadmInterfacesImpl221.getInterface("ROADM-A1", "OTS-DEG2-TTP-TXRX"))
-                .thenReturn(interOptA);
-        Mockito.when(this.openRoadmInterfacesImpl221.getInterface("ROADM-C1", "OTS-DEG1-TTP-TXRX"))
-                .thenReturn(interOptC);
+        when(this.openRoadmInterfacesImpl221.getInterface("ROADM-A1", "OTS-DEG2-TTP-TXRX")).thenReturn(interOptA);
+        when(this.openRoadmInterfacesImpl221.getInterface("ROADM-C1", "OTS-DEG1-TTP-TXRX")).thenReturn(interOptC);
 
         InterfaceBuilder ifABldr = new InterfaceBuilder();
-        Mockito.doNothing().when(this.openRoadmInterfacesImpl221).postInterface("ROADM-A1", ifABldr);
-        Mockito.doNothing().when(this.openRoadmInterfacesImpl221).postInterface("ROADM-C1", ifABldr);
+        doNothing().when(this.openRoadmInterfacesImpl221).postInterface("ROADM-A1", ifABldr);
+        doNothing().when(this.openRoadmInterfacesImpl221).postInterface("ROADM-C1", ifABldr);
 
     }
 
     @Test
-    public void testCalculateSpanlossBaseLink() {
+    void testCalculateSpanlossBaseLink() {
         // initialise and store openroadm-topology in datastore
         NetworkKey overlayTopologyKey = new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID));
         InstanceIdentifier<Network> ietfNetworkIID = InstanceIdentifier.builder(Networks.class)
@@ -152,13 +158,13 @@ public class OlmPowerServiceImplSpanLossBaseTest extends AbstractTest {
         CalculateSpanlossBaseInput input = OlmPowerServiceRpcImplUtil.getCalculateSpanlossBaseInputLink();
         CalculateSpanlossBaseOutput output = this.olmPowerService.calculateSpanlossBase(input);
 
-        Assert.assertEquals("Success", output.getResult());
-        Assert.assertEquals("ROADM-A1-to-ROADM-C1", output.getSpans().get(0).getLinkId().getValue());
-        Assert.assertEquals("14.6", output.getSpans().get(0).getSpanloss());
+        assertEquals("Success", output.getResult());
+        assertEquals("ROADM-A1-to-ROADM-C1", output.getSpans().get(0).getLinkId().getValue());
+        assertEquals("14.6", output.getSpans().get(0).getSpanloss());
     }
 
     @Test
-    public void testCalculateSpanlossBaseAll() {
+    void testCalculateSpanlossBaseAll() {
 
         // initialise and store openroadm-topology in datastore
         NetworkKey overlayTopologyKey = new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID));
@@ -175,8 +181,8 @@ public class OlmPowerServiceImplSpanLossBaseTest extends AbstractTest {
         CalculateSpanlossBaseInput input = OlmPowerServiceRpcImplUtil.getCalculateSpanlossBaseInputAll();
         CalculateSpanlossBaseOutput output = this.olmPowerService.calculateSpanlossBase(input);
 
-        Assert.assertEquals("Success", output.getResult());
-        Assert.assertEquals("ROADM-A1-to-ROADM-C1", output.getSpans().get(0).getLinkId().getValue());
-        Assert.assertEquals("14.6", output.getSpans().get(0).getSpanloss());
+        assertEquals("Success", output.getResult());
+        assertEquals("ROADM-A1-to-ROADM-C1", output.getSpans().get(0).getLinkId().getValue());
+        assertEquals("14.6", output.getSpans().get(0).getSpanloss());
     }
 }
index edc89e8a2892dbe8bee87e97984ddab326fe1da5..034eec7b7c55f8474f7ae596bd89eb5168922582 100644 (file)
@@ -8,52 +8,28 @@
 
 package org.opendaylight.transportpce.olm.service;
 
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import java.util.Optional;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.api.MountPoint;
-import org.opendaylight.mdsal.binding.api.MountPointService;
-import org.opendaylight.transportpce.common.NetworkUtils;
-import org.opendaylight.transportpce.common.ResponseCodes;
 import org.opendaylight.transportpce.common.StringConstants;
-import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
-import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl;
-import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl121;
-import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl221;
-import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl710;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
-import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl;
 import org.opendaylight.transportpce.common.mapping.MappingUtils;
-import org.opendaylight.transportpce.common.mapping.MappingUtilsImpl;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
-import org.opendaylight.transportpce.common.mapping.PortMappingImpl;
-import org.opendaylight.transportpce.common.mapping.PortMappingVersion121;
-import org.opendaylight.transportpce.common.mapping.PortMappingVersion221;
-import org.opendaylight.transportpce.common.mapping.PortMappingVersion710;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl121;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl221;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl710;
 import org.opendaylight.transportpce.olm.power.PowerMgmt;
 import org.opendaylight.transportpce.olm.power.PowerMgmtImpl;
-import org.opendaylight.transportpce.olm.stub.MountPointServiceStub;
-import org.opendaylight.transportpce.olm.stub.MountPointStub;
 import org.opendaylight.transportpce.olm.util.OlmPowerServiceRpcImplUtil;
-import org.opendaylight.transportpce.olm.util.TransactionUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossBaseInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossBaseOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossBaseOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossCurrentInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossCurrentOutput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmOutputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerResetInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerResetOutput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupInput;
@@ -62,276 +38,92 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev21
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownOutput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.powermock.api.mockito.PowerMockito;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.PmNamesEnum;
 
-public class OlmPowerServiceImplTest  extends AbstractTest {
+class OlmPowerServiceImplTest  extends AbstractTest {
 
-    private static final Logger LOG = LoggerFactory.getLogger(OlmPowerServiceImplTest.class);
-    private MountPoint mountPoint;
-    private MountPointService mountPointService;
     private DeviceTransactionManager deviceTransactionManager;
-    private CrossConnect crossConnect;
     private OpenRoadmInterfaces openRoadmInterfaces;
     private PortMapping portMapping;
     private PowerMgmt powerMgmt;
-    private CrossConnectImpl121 crossConnectImpl121;
-    private CrossConnectImpl221 crossConnectImpl22;
-    private CrossConnectImpl710 crossConnectImpl710;
     private MappingUtils mappingUtils;
-    private OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121;
-    private OpenRoadmInterfacesImpl221 openRoadmInterfacesImpl22;
-    private OpenRoadmInterfacesImpl710 openRoadmInterfacesImpl710;
-    private PortMappingVersion710 portMappingVersion710;
-    private PortMappingVersion221 portMappingVersion22;
-    private PortMappingVersion121 portMappingVersion121;
     private OlmPowerService olmPowerService;
     private DataBroker dataBroker;
-    private PowerMgmt powerMgmtMock;
-    @InjectMocks
-    private OlmPowerService olmPowerServiceMock;
 
-
-    @Before
-    public void setUp() {
-        this.dataBroker =  getNewDataBroker();
-        this.mountPoint = new MountPointStub(this.dataBroker);
-        this.mountPointService = new MountPointServiceStub(mountPoint);
-        this.deviceTransactionManager = new DeviceTransactionManagerImpl(mountPointService, 3000);
-        this.mappingUtils = Mockito.spy(new MappingUtilsImpl(dataBroker));
-        Mockito.doReturn(StringConstants.OPENROADM_DEVICE_VERSION_1_2_1).when(mappingUtils)
-                .getOpenRoadmVersion(Mockito.anyString());
-        this.deviceTransactionManager = new DeviceTransactionManagerImpl(mountPointService, 3000);
-        this.crossConnectImpl121 = new CrossConnectImpl121(deviceTransactionManager);
-        this.crossConnectImpl22 = new CrossConnectImpl221(deviceTransactionManager);
-        this.crossConnect = new CrossConnectImpl(deviceTransactionManager, this.mappingUtils, this.crossConnectImpl121,
-                this.crossConnectImpl22, this.crossConnectImpl710);
-        this.portMappingVersion22 = new PortMappingVersion221(dataBroker, deviceTransactionManager);
-        this.portMappingVersion121 = new PortMappingVersion121(dataBroker, deviceTransactionManager);
-        this.portMappingVersion710 = new PortMappingVersion710(dataBroker, deviceTransactionManager);
-        this.portMapping = new PortMappingImpl(dataBroker, this.portMappingVersion710,
-            this.portMappingVersion22, this.portMappingVersion121);
-        this.openRoadmInterfacesImpl121 = new OpenRoadmInterfacesImpl121(deviceTransactionManager);
-        this.openRoadmInterfacesImpl22 = new OpenRoadmInterfacesImpl221(deviceTransactionManager, this.portMapping,
-            this.portMappingVersion22);
-        this.openRoadmInterfacesImpl710 = new OpenRoadmInterfacesImpl710(deviceTransactionManager, this.portMapping,
-            this.portMappingVersion710);
-        this.openRoadmInterfaces = new OpenRoadmInterfacesImpl((this.deviceTransactionManager),
-                this.mappingUtils,this.openRoadmInterfacesImpl121,this.openRoadmInterfacesImpl22,
-            this.openRoadmInterfacesImpl710);
-        this.portMapping = Mockito.spy(this.portMapping);
-        this.powerMgmt = new PowerMgmtImpl(this.dataBroker, this.openRoadmInterfaces, this.crossConnect,
-            this.deviceTransactionManager);
-        this.olmPowerService = new OlmPowerServiceImpl(this.dataBroker, this.powerMgmt,
-            this.deviceTransactionManager, this.portMapping, this.mappingUtils, this.openRoadmInterfaces);
-        this.powerMgmtMock = PowerMockito.mock(PowerMgmtImpl.class);
-        this.olmPowerServiceMock = new OlmPowerServiceImpl(this.dataBroker, this.powerMgmtMock,
-            this.deviceTransactionManager, this.portMapping, this.mappingUtils, this.openRoadmInterfaces);
-        this.olmPowerServiceMock = Mockito.mock(OlmPowerServiceImpl.class);
-        MockitoAnnotations.openMocks(this);
+    @BeforeEach
+    void setUp() {
+        this.dataBroker = mock(DataBroker.class);
+        this.powerMgmt = mock(PowerMgmtImpl.class);
+        this.deviceTransactionManager = mock(DeviceTransactionManager.class);
+        this.portMapping = mock(PortMapping.class);
+        this.mappingUtils = mock(MappingUtils.class);
+        this.openRoadmInterfaces = mock(OpenRoadmInterfaces.class);
+        this.olmPowerService = new OlmPowerServiceImpl(this.dataBroker, this.powerMgmt, this.deviceTransactionManager,
+                this.portMapping, this.mappingUtils, this.openRoadmInterfaces);
     }
 
     @Test
-    public void dummyTest() {
-        OlmPowerServiceImpl olmPowerServiceImpl = (OlmPowerServiceImpl) this.olmPowerService;
-        olmPowerServiceImpl.init();
-        olmPowerServiceImpl.close();
-    }
-
+    void testGetPm() {
+        when(this.mappingUtils.getOpenRoadmVersion(anyString()))
+            .thenReturn(StringConstants.OPENROADM_DEVICE_VERSION_1_2_1);
+        when(this.deviceTransactionManager.getDataFromDevice(anyString(), any(), any(), anyLong(), any()))
+            .thenReturn(Optional.of(OlmPowerServiceRpcImplUtil.getCurrentPmList121()));
 
-    @Test
-    public void testGetPm() {
         GetPmInput input = OlmPowerServiceRpcImplUtil.getGetPmInput();
-        GetPmOutput output = this.olmPowerService.getPm(input);
-        Assert.assertEquals(new GetPmOutputBuilder().build(), output);
-        Assert.assertEquals(null, output.getResourceId());
-    }
-
-    @Test
-    public void testServicePowerSetupSuccess() {
+        GetPmOutput result = this.olmPowerService.getPm(input);
+        assertEquals(
+            org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.PmGranularity._15min,
+            result.getGranularity());
+        assertEquals(
+            PmNamesEnum.OpticalPowerInput.toString(),
+            result.getMeasurements().stream().findFirst().orElseThrow().getPmparameterName());
+        assertEquals(
+            String.valueOf(3.0),
+            result.getMeasurements().stream().findFirst().orElseThrow().getPmparameterValue());
+        assertEquals(
+            "ots-deg1",
+            result.getResourceIdentifier().getResourceName());
+    }
+
+    @Test
+    void testServicePowerSetupSuccess() {
         ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput();
-        Mockito.when(this.powerMgmtMock.setPower(Mockito.any())).thenReturn(true);
-        //TODO
-        Mockito.when(this.olmPowerServiceMock.servicePowerSetup(Mockito.any()))
-                .thenReturn(new ServicePowerSetupOutputBuilder().setResult("Success").build());
-        ServicePowerSetupOutput output = this.olmPowerServiceMock.servicePowerSetup(input);
-        Assert.assertEquals(new ServicePowerSetupOutputBuilder().setResult("Success").build(), output);
-        Assert.assertEquals("Success", output.getResult());
+        when(this.powerMgmt.setPower(any())).thenReturn(true);
+        ServicePowerSetupOutput result = this.olmPowerService.servicePowerSetup(input);
+        assertEquals(new ServicePowerSetupOutputBuilder().setResult("Success").build(), result);
+        assertEquals("Success", result.getResult());
     }
 
     @Test
-    public void testServicePowerSetupFailed() {
+    void testServicePowerSetupFailed() {
         ServicePowerSetupInput input = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput();
-        Mockito.when(this.powerMgmtMock.setPower(Mockito.any())).thenReturn(false);
-        //TODO
-        Mockito.when(this.olmPowerServiceMock.servicePowerSetup(Mockito.any()))
-                .thenReturn(new ServicePowerSetupOutputBuilder().setResult("Failed").build());
-        ServicePowerSetupOutput output = this.olmPowerServiceMock.servicePowerSetup(input);
-        Assert.assertEquals("Failed", output.getResult());
+        when(this.powerMgmt.setPower(any())).thenReturn(false);
+        ServicePowerSetupOutput output = this.olmPowerService.servicePowerSetup(input);
+        assertEquals("Failed", output.getResult());
     }
 
     @Test
-    public void testServicePowerTurnDownSuccess() {
+    void testServicePowerTurnDownSuccess() {
         ServicePowerTurndownInput input = OlmPowerServiceRpcImplUtil.getServicePowerTurndownInput();
-        Mockito.when(this.powerMgmtMock.powerTurnDown(Mockito.any())).thenReturn(true);
-        //TODO
-        Mockito.when(this.olmPowerServiceMock.servicePowerTurndown(Mockito.any()))
-                .thenReturn(new ServicePowerTurndownOutputBuilder().setResult("Success").build());
-        ServicePowerTurndownOutput output = this.olmPowerServiceMock.servicePowerTurndown(input);
-        Assert.assertEquals(new ServicePowerTurndownOutputBuilder().setResult("Success").build(), output);
-        Assert.assertEquals("Success", output.getResult());
+        when(this.powerMgmt.powerTurnDown(any())).thenReturn(true);
+        ServicePowerTurndownOutput output = this.olmPowerService.servicePowerTurndown(input);
+        assertEquals(new ServicePowerTurndownOutputBuilder().setResult("Success").build(), output);
+        assertEquals("Success", output.getResult());
     }
 
     @Test
-    public void testServicePowerTurnDownFailed() {
+    void testServicePowerTurnDownFailed() {
         ServicePowerTurndownInput input = OlmPowerServiceRpcImplUtil.getServicePowerTurndownInput();
-        Mockito.when(this.powerMgmtMock.powerTurnDown(Mockito.any())).thenReturn(false);
-        //TODO
-        Mockito.when(this.olmPowerServiceMock.servicePowerTurndown(Mockito.any()))
-                .thenReturn(new ServicePowerTurndownOutputBuilder().setResult("Failed").build());
-        ServicePowerTurndownOutput output = this.olmPowerServiceMock.servicePowerTurndown(input);
-        Assert.assertEquals(new ServicePowerTurndownOutputBuilder().setResult("Failed").build(), output);
-        Assert.assertEquals("Failed", output.getResult());
-    }
-
-    @Test
-    public void testCalculateSpanlossBase3() {
-        NetworkKey overlayTopologyKey = new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID));
-        InstanceIdentifier<Network1> networkIID = InstanceIdentifier.builder(Networks.class)
-            .child(Network.class, overlayTopologyKey)
-            .augmentation(Network1.class)
-            .build();
-        Network1 network = TransactionUtils.getNetwork();
-        TransactionUtils.writeTransaction(this.dataBroker, networkIID, network);
-        try {
-            Thread.sleep(1000);
-        } catch (InterruptedException e) {
-            LOG.error("Write transaction failed !",e);
-        }
-        CalculateSpanlossBaseInput input = OlmPowerServiceRpcImplUtil.getCalculateSpanlossBaseInput2();
-        //TODO
-        Mockito.when(this.olmPowerServiceMock.calculateSpanlossBase(Mockito.any()))
-                .thenReturn(new CalculateSpanlossBaseOutputBuilder().setResult("Failed").build());
-        CalculateSpanlossBaseOutput output = this.olmPowerServiceMock.calculateSpanlossBase(input);
-        Assert.assertEquals("Failed", output.getResult());
-
-    }
-
-
-    @Test
-    public void testCalculateSpanlossBase4() {
-        NetworkKey overlayTopologyKey = new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID));
-        InstanceIdentifier<Network1> networkIID = InstanceIdentifier.builder(Networks.class)
-            .child(Network.class, overlayTopologyKey)
-            .augmentation(Network1.class)
-            .build();
-        Network1 network = TransactionUtils.getEmptyNetwork();
-        TransactionUtils.writeTransaction(this.dataBroker, networkIID, network);
-        try {
-            Thread.sleep(1000);
-        } catch (InterruptedException e) {
-            LOG.error("Write transaction failed !",e);
-        }
-        CalculateSpanlossBaseInput input = OlmPowerServiceRpcImplUtil.getCalculateSpanlossBaseInput2();
-        CalculateSpanlossBaseOutput output = this.olmPowerService.calculateSpanlossBase(input);
-        Assert.assertEquals("Failed", output.getResult());
-
-    }
-
-    @Test
-    public void testCalculateSpanlossBase5() {
-        NetworkKey overlayTopologyKey = new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID));
-        InstanceIdentifier<Network1> networkIID = InstanceIdentifier.builder(Networks.class)
-            .child(Network.class, overlayTopologyKey)
-            .augmentation(Network1.class)
-            .build();
-        Network1 network = TransactionUtils.getNullNetwork();
-        TransactionUtils.writeTransaction(this.dataBroker, networkIID, network);
-        try {
-            Thread.sleep(1000);
-        } catch (InterruptedException e) {
-            LOG.error("Write transaction failed !",e);
-        }
-        CalculateSpanlossBaseInput input = OlmPowerServiceRpcImplUtil.getCalculateSpanlossBaseInput2();
-        CalculateSpanlossBaseOutput output = this.olmPowerService.calculateSpanlossBase(input);
-        Assert.assertEquals("Failed", output.getResult());
-
-    }
-
-    @Test
-    public void testCalculateSpanlossCurrent1() {
-        CalculateSpanlossCurrentInput input = OlmPowerServiceRpcImplUtil.getCalculateSpanlossCurrentInput();
-        CalculateSpanlossCurrentOutput output = this.olmPowerService.calculateSpanlossCurrent(input);
-        Assert.assertEquals(null, output);
-    }
-
-    @Test
-    public void testCalculateSpanlossCurrent2() {
-        NetworkKey overlayTopologyKey = new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID));
-        InstanceIdentifier<Network1> networkIID = InstanceIdentifier.builder(Networks.class)
-            .child(Network.class, overlayTopologyKey)
-            .augmentation(Network1.class)
-            .build();
-        Network1 network = TransactionUtils.getNetwork();
-        TransactionUtils.writeTransaction(this.dataBroker, networkIID, network);
-        try {
-            Thread.sleep(1000);
-        } catch (InterruptedException e) {
-            LOG.error("Write transaction failed !",e);
-        }
-        CalculateSpanlossCurrentInput input = OlmPowerServiceRpcImplUtil.getCalculateSpanlossCurrentInput();
-        CalculateSpanlossCurrentOutput output = this.olmPowerService.calculateSpanlossCurrent(input);
-        Assert.assertEquals(null, output);
+        when(this.powerMgmt.powerTurnDown(any())).thenReturn(false);
+        ServicePowerTurndownOutput output = this.olmPowerService.servicePowerTurndown(input);
+        assertEquals(new ServicePowerTurndownOutputBuilder().setResult("Failed").build(), output);
+        assertEquals("Failed", output.getResult());
     }
 
     @Test
-    public void testServicePowerReset() {
+    void testServicePowerReset() {
         ServicePowerResetInput input = OlmPowerServiceRpcImplUtil.getServicePowerResetInput();
         ServicePowerResetOutput output = this.olmPowerService.servicePowerReset(input);
-        Assert.assertEquals(null, output);
-    }
-
-    @Test
-    public void testServicePowerTurndownSuccessResult() {
-        ServicePowerTurndownInput servicePowerTurndownInput = OlmPowerServiceRpcImplUtil.getServicePowerTurndownInput();
-        ServicePowerTurndownOutput servicePowerTurndownOutput =
-                this.olmPowerService.servicePowerTurndown(servicePowerTurndownInput);
-        Assert.assertEquals(ResponseCodes.SUCCESS_RESULT, servicePowerTurndownOutput.getResult());
-    }
-
-    @Test
-    public void testServicePowerTurndownFailResult() {
-        ServicePowerTurndownInput servicePowerTurndownInput =
-                OlmPowerServiceRpcImplUtil.getServicePowerTurndownInput2();
-        ServicePowerTurndownOutput servicePowerTurndownOutput =
-                this.olmPowerService.servicePowerTurndown(servicePowerTurndownInput);
-        Assert.assertEquals(ResponseCodes.FAILED_RESULT, servicePowerTurndownOutput.getResult());
-    }
-
-    @Test
-    public void testServicePowerSetupSuccessResult() {
-        ServicePowerSetupInput servicePowerSetupInput =
-                OlmPowerServiceRpcImplUtil.getServicePowerSetupInput();
-        ServicePowerSetupOutput servicePowerSetupOutput =
-                this.olmPowerService.servicePowerSetup(servicePowerSetupInput);
-        Assert.assertEquals(ResponseCodes.SUCCESS_RESULT, servicePowerSetupOutput.getResult());
-    }
-
-    @Test
-    public void testServicePowerSetupFailResult() {
-        ServicePowerSetupInput servicePowerSetupInput = OlmPowerServiceRpcImplUtil.getServicePowerSetupInput();
-        Mockito.when(powerMgmtMock.setPower(servicePowerSetupInput)).thenReturn(Boolean.FALSE);
-        OlmPowerService olmPowerServiceWithMock = new OlmPowerServiceImpl(dataBroker, powerMgmtMock,
-                this.deviceTransactionManager, this.portMapping, this.mappingUtils, this.openRoadmInterfaces);
-        ServicePowerSetupOutput servicePowerSetupOutput =
-                olmPowerServiceWithMock.servicePowerSetup(servicePowerSetupInput);
-        Assert.assertEquals(ResponseCodes.FAILED_RESULT, servicePowerSetupOutput.getResult());
+        assertEquals(null, output);
     }
 }
diff --git a/olm/src/test/java/org/opendaylight/transportpce/olm/stub/MountPointServiceStub.java b/olm/src/test/java/org/opendaylight/transportpce/olm/stub/MountPointServiceStub.java
deleted file mode 100644 (file)
index e000ebb..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright © 2018 Orange Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.transportpce.olm.stub;
-
-import java.util.Optional;
-import org.opendaylight.mdsal.binding.api.MountPoint;
-import org.opendaylight.mdsal.binding.api.MountPointService;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-
-public class MountPointServiceStub implements MountPointService {
-
-    MountPoint returnedMountPoint;
-
-    public MountPointServiceStub(MountPoint usedMountPoint) {
-        this.returnedMountPoint = usedMountPoint;
-    }
-
-    @Override
-    public Optional<MountPoint> getMountPoint(InstanceIdentifier<?> mountPoint) {
-        if (returnedMountPoint == null) {
-            return Optional.empty();
-        }
-        return Optional.of(returnedMountPoint);
-    }
-
-    @Override
-    public <T extends MountPointListener> ListenerRegistration<T> registerListener(InstanceIdentifier<?> path,
-        T listener) {
-        return null;
-    }
-}
diff --git a/olm/src/test/java/org/opendaylight/transportpce/olm/stub/MountPointStub.java b/olm/src/test/java/org/opendaylight/transportpce/olm/stub/MountPointStub.java
deleted file mode 100644 (file)
index 6ba508e..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright © 2018 Orange Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.transportpce.olm.stub;
-
-import java.util.Optional;
-import javax.annotation.Nonnull;
-import org.opendaylight.mdsal.binding.api.BindingService;
-import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.api.MountPoint;
-import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-
-public class MountPointStub  implements MountPoint {
-
-    private DataBroker dataBroker;
-
-    private RpcConsumerRegistry rpcConsumerRegistry;
-
-    public MountPointStub(DataBroker dataBroker) {
-
-        this.dataBroker = dataBroker;
-    }
-
-    public void setRpcConsumerRegistry(RpcConsumerRegistry rpcConsumerRegistry) {
-        this.rpcConsumerRegistry = rpcConsumerRegistry;
-    }
-
-    @Override
-    @SuppressWarnings("unchecked")
-    public <T extends BindingService> Optional<T> getService(Class<T> service) {
-        if (service.isInstance(dataBroker)) {
-            return Optional.ofNullable((T)dataBroker);
-        }
-        if (service.isInstance(rpcConsumerRegistry)) {
-            return Optional.ofNullable((T)rpcConsumerRegistry);
-        }
-        return Optional.empty();
-    }
-
-    @Nonnull
-    @Override
-    public InstanceIdentifier<?> getIdentifier() {
-        return null;
-    }
-}
diff --git a/olm/src/test/java/org/opendaylight/transportpce/olm/stub/OlmServiceStub.java b/olm/src/test/java/org/opendaylight/transportpce/olm/stub/OlmServiceStub.java
deleted file mode 100644 (file)
index e832f3b..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright © 2018 Orange Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.transportpce.olm.stub;
-
-import com.google.common.util.concurrent.ListenableFuture;
-import java.util.ArrayList;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossBaseInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossBaseOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossCurrentInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossCurrentOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerResetInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerResetOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.TransportpceOlmService;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
-
-public class OlmServiceStub implements TransportpceOlmService {
-
-    @Override public ListenableFuture<RpcResult<CalculateSpanlossCurrentOutput>> calculateSpanlossCurrent(
-        CalculateSpanlossCurrentInput input) {
-        return null;
-    }
-
-    @Override public ListenableFuture<RpcResult<GetPmOutput>> getPm(GetPmInput input) {
-        GetPmOutput output = new GetPmOutputBuilder()
-            .setNodeId("node1").setMeasurements(new ArrayList<>()).build();
-        return RpcResultBuilder.success(
-            output).buildFuture();
-    }
-
-    @Override public ListenableFuture<RpcResult<ServicePowerTurndownOutput>> servicePowerTurndown(
-        ServicePowerTurndownInput input) {
-        return RpcResultBuilder.success((new ServicePowerTurndownOutputBuilder())
-                .setResult("Success").build()).buildFuture();
-    }
-
-    @Override public ListenableFuture<RpcResult<CalculateSpanlossBaseOutput>> calculateSpanlossBase(
-        CalculateSpanlossBaseInput input) {
-        return null;
-    }
-
-    @Override public ListenableFuture<RpcResult<ServicePowerResetOutput>> servicePowerReset(
-            ServicePowerResetInput input) {
-        return null;
-    }
-
-    @Override public ListenableFuture<RpcResult<ServicePowerSetupOutput>> servicePowerSetup(
-            ServicePowerSetupInput input) {
-        return RpcResultBuilder.success(new ServicePowerSetupOutputBuilder().build()).buildFuture();
-    }
-}
index 1b579cf889dec1a2c768e721c0f01fd5a39cacf3..feebde34219267b860a2943290b994e5ed0728c8 100644 (file)
@@ -9,11 +9,11 @@
 package org.opendaylight.transportpce.olm.util;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossBaseInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossBaseInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossCurrentInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossCurrentInputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmInputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerResetInput;
@@ -22,12 +22,32 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev21
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupInputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.PmGranularity;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.OpenroadmNodeVersion;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfoBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.CurrentPmlist;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.CurrentPmlistBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.current.pm.MeasurementsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.current.pm.ResourceBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.current.pm.measurements.MeasurementBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.currentpmlist.CurrentPm;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.currentpmlist.CurrentPmBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev161014.currentpmlist.CurrentPmKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.PmDataType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.PmNamesEnum;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.pm.measurement.PmParameterNameBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resource.ResourceTypeBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resource.resource.resource.InterfaceBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev161014.ResourceTypeEnum;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.olm.get.pm.input.ResourceIdentifierBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.optical.renderer.nodes.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.optical.renderer.nodes.NodesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.PmGranularity;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.olm.get.pm.input.ResourceIdentifierBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.optical.renderer.nodes.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.optical.renderer.nodes.NodesBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.Uint32;
 
 public final class OlmPowerServiceRpcImplUtil {
@@ -36,12 +56,140 @@ public final class OlmPowerServiceRpcImplUtil {
     }
 
     public static GetPmInput  getGetPmInput() {
-        GetPmInput input = new GetPmInputBuilder().setGranularity(PmGranularity._15min).setNodeId("node1")
-            .setResourceIdentifier(new ResourceIdentifierBuilder().setCircuitPackName("circuit pack name")
-                .setResourceName("resource name").build()).setResourceType(ResourceTypeEnum.Device).build();
+        GetPmInput input = new GetPmInputBuilder()
+                .setNodeId("node1")
+                .setGranularity(PmGranularity._15min)
+                .setResourceIdentifier(new ResourceIdentifierBuilder()
+                        .setResourceName("ots-deg1").build())
+                .setResourceType(ResourceTypeEnum.Interface).build();
         return input;
     }
 
+    public static CurrentPmlist getCurrentPmList121() {
+        CurrentPm currentPm = new CurrentPmBuilder()
+                .setId("id")
+                .setGranularity(org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.PmGranularity._15min)
+                .setResource(new ResourceBuilder()
+                        .setResourceType(new ResourceTypeBuilder()
+                                .setType(ResourceTypeEnum.Interface)
+                                .build())
+                        .setResource(new org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev161014.resource
+                                .ResourceBuilder()
+                                .setResource(new InterfaceBuilder()
+                                        .setInterfaceName("ots-deg1")
+                                        .build())
+                                .build())
+                        .build())
+                .setMeasurements(List.of(
+                        new MeasurementsBuilder()
+                                .setMeasurement(new MeasurementBuilder()
+                                        .setPmParameterName(new PmParameterNameBuilder()
+                                                .setType(PmNamesEnum.OpticalPowerInput)
+                                                .build())
+                                        .setPmParameterValue(new PmDataType(Decimal64.valueOf("3")))
+                                        .build())
+                                .build()))
+                .build();
+        Map<CurrentPmKey, CurrentPm> currentPmMap = new HashMap<>();
+        currentPmMap.put(currentPm.key(), currentPm);
+        return new CurrentPmlistBuilder()
+                .setCurrentPm(currentPmMap)
+                .build();
+    }
+
+    public static ServicePowerSetupInput getServicePowerSetupInputForTransponder() {
+        return new ServicePowerSetupInputBuilder()
+                .setNodes(List.of(
+                        new NodesBuilder().setNodeId("xpdr-A").setSrcTp("client-A").setDestTp("network-A").build(),
+                        new NodesBuilder().setNodeId("roadm-A").setSrcTp("srg1-A").setDestTp("deg2-A").build()))
+                .setServiceName("service 1")
+                .setWaveNumber(Uint32.valueOf("1"))
+                .setLowerSpectralSlotNumber(Uint32.valueOf(761))
+                .setHigherSpectralSlotNumber(Uint32.valueOf(768))
+                .build();
+    }
+
+    public static ServicePowerSetupInput getServicePowerSetupInputForOneNode(String nodeId, String srcTp,
+            String destTp) {
+        return new ServicePowerSetupInputBuilder()
+                .setNodes(List.of(
+                        new NodesBuilder().setNodeId(nodeId).setSrcTp(srcTp).setDestTp(destTp).build()))
+                .setServiceName("service 1")
+                .setWaveNumber(Uint32.valueOf("1"))
+                .setLowerSpectralSlotNumber(Uint32.valueOf(761))
+                .setHigherSpectralSlotNumber(Uint32.valueOf(768))
+                .build();
+    }
+
+    public static ServicePowerSetupInput getServicePowerSetupInputWthoutNode() {
+        return new ServicePowerSetupInputBuilder()
+                .setNodes(List.of())
+                .setServiceName("service 1")
+                .setWaveNumber(Uint32.valueOf("1"))
+                .setLowerSpectralSlotNumber(Uint32.valueOf(761))
+                .setHigherSpectralSlotNumber(Uint32.valueOf(768))
+                .build();
+    }
+
+    public static org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network
+            .Nodes getMappingNodeTpdr(String nodeId, OpenroadmNodeVersion nodeVersion, List<String> lcps) {
+        Map<MappingKey, Mapping> mappings = new HashMap<>();
+        for (String lcp:lcps) {
+            Mapping mapping = new MappingBuilder()
+                    .setLogicalConnectionPoint(lcp)
+                    .setSupportingCircuitPackName("circuit pack")
+                    .setSupportingPort("port")
+                    .build();
+            mappings.put(mapping.key(), mapping);
+        }
+        return new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network
+                .NodesBuilder()
+            .setNodeId(nodeId)
+            .setNodeInfo(new NodeInfoBuilder()
+                .setNodeType(NodeTypes.Xpdr)
+                .setOpenroadmVersion(nodeVersion)
+                .build())
+            .setMapping(mappings)
+            .build();
+    }
+
+    public static org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network
+            .Nodes getMappingNodeRdm(String nodeId, OpenroadmNodeVersion nodeVersion, List<String> lcps) {
+        Map<MappingKey, Mapping> mappings = new HashMap<>();
+        for (String lcp:lcps) {
+            MappingBuilder mappingBldr = new MappingBuilder()
+                    .setLogicalConnectionPoint(lcp)
+                    .setSupportingCircuitPackName("circuit pack")
+                    .setSupportingPort("port");
+            if (lcp.contains("deg")) {
+                mappingBldr.setSupportingOts("interface ots")
+                        .setSupportingOms("interface oms");
+            }
+            mappings.put(mappingBldr.build().key(), mappingBldr.build());
+        }
+        return new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network
+                    .NodesBuilder()
+                .setNodeId(nodeId)
+                .setNodeInfo(new NodeInfoBuilder()
+                        .setNodeType(NodeTypes.Rdm)
+                        .setOpenroadmVersion(nodeVersion)
+                        .build())
+                .setMapping(mappings)
+                .build();
+    }
+
+    public static org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network
+            .Nodes getMappingNodeIla() {
+        return new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network
+                    .NodesBuilder()
+                .setNodeId("ila node")
+                .setNodeInfo(new NodeInfoBuilder()
+                        .setNodeType(NodeTypes.Ila)
+                        .setOpenroadmVersion(OpenroadmNodeVersion._121)
+                        .build())
+                .build();
+    }
+
     public static ServicePowerSetupInput getServicePowerSetupInput() {
         Nodes node1 = new NodesBuilder().setDestTp("dest").setSrcTp("src").setNodeId("node 1").build();
         Nodes node2 = new NodesBuilder().setDestTp("dest").setSrcTp("src").setNodeId("node 2").build();
@@ -85,82 +233,17 @@ public final class OlmPowerServiceRpcImplUtil {
         return input;
     }
 
-    public static ServicePowerSetupInput getServicePowerSetupInput4() {
-        Nodes node1 = new NodesBuilder().setDestTp("srg").setSrcTp("src").setNodeId("node 1").build();
-        Nodes node2 = new NodesBuilder().setDestTp("srg").setSrcTp("src").setNodeId("node 2").build();
-        List<Nodes> nodes = new ArrayList<>();
-        nodes.add(node1);
-        nodes.add(node2);
-        ServicePowerSetupInput input = new ServicePowerSetupInputBuilder().setNodes(nodes)
-            .setServiceName("service 1")
-            .setWaveNumber(Uint32.valueOf("1"))
-            .setLowerSpectralSlotNumber(Uint32.valueOf(761))
-            .setHigherSpectralSlotNumber(Uint32.valueOf(768)).build();
-        return input;
-    }
-
     public static ServicePowerTurndownInput getServicePowerTurndownInput() {
-        Nodes node1 = new NodesBuilder().setDestTp("dest").setSrcTp("src").setNodeId("node 1").build();
-        Nodes node2 = new NodesBuilder().setDestTp("dest").setSrcTp("src").setNodeId("node 2").build();
-        List<Nodes> nodes = new ArrayList<>();
-        nodes.add(node1);
-        nodes.add(node2);
-        ServicePowerTurndownInput input = new ServicePowerTurndownInputBuilder()
-                .setNodes(nodes)
-                .setServiceName("service 1")
-                .setWaveNumber(Uint32.valueOf("1"))
-                .setLowerSpectralSlotNumber(Uint32.valueOf(761))
-                .setHigherSpectralSlotNumber(Uint32.valueOf(768)).build();
-
-        return input;
-    }
-
-    public static ServicePowerTurndownInput getServicePowerTurndownInput2() {
-        Nodes node1 = new NodesBuilder().setDestTp("destdeg").setSrcTp("src").setNodeId("node 1").build();
-        Nodes node2 = new NodesBuilder().setDestTp("destdeg").setSrcTp("src").setNodeId("node 2").build();
-        List<Nodes> nodes = new ArrayList<>();
-        nodes.add(node1);
-        nodes.add(node2);
-        ServicePowerTurndownInput input = new ServicePowerTurndownInputBuilder()
-                .setNodes(nodes)
-                .setServiceName("service 1")
-                .setWaveNumber(Uint32.valueOf("1"))
-                .setLowerSpectralSlotNumber(Uint32.valueOf(761))
-                .setHigherSpectralSlotNumber(Uint32.valueOf(768)).build();
-
-        return input;
-    }
-
-    public static ServicePowerTurndownInput getServicePowerTurndownInput3() {
-        Nodes node1 = new NodesBuilder().setDestTp("destsrg").setSrcTp("src").setNodeId("node 1").build();
-        Nodes node2 = new NodesBuilder().setDestTp("destsrg").setSrcTp("src").setNodeId("node 2").build();
-        List<Nodes> nodes = new ArrayList<>();
-        nodes.add(node1);
-        nodes.add(node2);
-        ServicePowerTurndownInput input = new ServicePowerTurndownInputBuilder()
-                .setNodes(nodes)
-                .setServiceName("service 1")
-                .setWaveNumber(Uint32.valueOf("1"))
-                .setLowerSpectralSlotNumber(Uint32.valueOf(761))
-                .setHigherSpectralSlotNumber(Uint32.valueOf(768)).build();
-
-        return input;
-    }
-
-    public static ServicePowerTurndownInput getServicePowerTurndownInput4() {
-        Nodes node1 = new NodesBuilder().setDestTp("destdeg").setSrcTp("src").setNodeId("node 1").build();
-        Nodes node2 = new NodesBuilder().setDestTp("destdeg").setSrcTp("src").setNodeId("node 2").build();
-        List<Nodes> nodes = new ArrayList<>();
-        nodes.add(node1);
-        nodes.add(node2);
-        ServicePowerTurndownInput input = new ServicePowerTurndownInputBuilder()
-                .setNodes(nodes)
+        return new ServicePowerTurndownInputBuilder()
+                .setNodes(List.of(
+                        new NodesBuilder().setNodeId("roadm-A").setSrcTp("srg1-A").setDestTp("deg2-A").build(),
+                        new NodesBuilder().setNodeId("roadm-C").setSrcTp("deg1-C").setDestTp("srg1-C").build())
+                        )
                 .setServiceName("service 1")
                 .setWaveNumber(Uint32.valueOf("1"))
                 .setLowerSpectralSlotNumber(Uint32.valueOf(761))
-                .setHigherSpectralSlotNumber(Uint32.valueOf(768)).build();
-
-        return input;
+                .setHigherSpectralSlotNumber(Uint32.valueOf(768))
+                .build();
     }
 
     public static CalculateSpanlossBaseInput getCalculateSpanlossBaseInputLink() {
@@ -178,19 +261,6 @@ public final class OlmPowerServiceRpcImplUtil {
         return input;
     }
 
-    public static CalculateSpanlossBaseInput getCalculateSpanlossBaseInput2() {
-        CalculateSpanlossBaseInput input = new CalculateSpanlossBaseInputBuilder()
-            .setLinkId(new LinkId("link 1"))
-            .setSrcType(CalculateSpanlossBaseInput.SrcType.All).build();
-        return input;
-    }
-
-    public static CalculateSpanlossCurrentInput getCalculateSpanlossCurrentInput() {
-        CalculateSpanlossCurrentInput input = new CalculateSpanlossCurrentInputBuilder()
-            .build();
-        return input;
-    }
-
     public static ServicePowerResetInput getServicePowerResetInput() {
         ServicePowerResetInput input = new ServicePowerResetInputBuilder()
             .setServiceName("service 1").build();
index 88fe3353f555a1fe21f692e80f054f1148e0404a..5e2274d06f15f4fd87fc84cd71a1209e4c7a8ac5 100644 (file)
@@ -8,7 +8,6 @@
 
 package org.opendaylight.transportpce.olm.util;
 
-import java.math.BigDecimal;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
@@ -16,29 +15,30 @@ import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.link.types.rev191129.FiberPmd;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.link.types.rev191129.RatioDB;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.Direction;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.Location;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp.Interface;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp.InterfaceKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.OrgOpenroadmDevice;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.AmplifiedLink;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.AmplifiedLinkKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.amplified.link.SectionElementBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.span.attributes.LinkConcatenation1.FiberType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.span.attributes.LinkConcatenation1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Link1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.link.OMSAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.link.oms.attributes.AmplifiedLinkBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.link.oms.attributes.SpanBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.link.concatenation.LinkConcatenation;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.link.concatenation.LinkConcatenationBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.link.concatenation.LinkConcatenationKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link.attributes.AmplifiedLink;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link.attributes.AmplifiedLinkKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link.attributes.amplified.link.SectionElementBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.span.attributes.LinkConcatenation1.FiberType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.span.attributes.LinkConcatenation1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Link1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.link.OMSAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.link.oms.attributes.AmplifiedLinkBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.link.oms.attributes.SpanBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.link.concatenation.LinkConcatenation;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.link.concatenation.LinkConcatenationBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.link.concatenation.LinkConcatenationKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev181019.CurrentPmList;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev181019.CurrentPmListBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev181019.current.pm.group.CurrentPm;
@@ -63,7 +63,6 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeKey;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1Builder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
@@ -71,9 +70,9 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.top
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.link.DestinationBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.link.SourceBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
-import org.opendaylight.yangtools.yang.binding.Augmentation;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.Uint16;
 import org.opendaylight.yangtools.yang.common.Uint32;
 
@@ -86,218 +85,255 @@ public final class OlmTransactionUtils {
     // FIXME check if the InstanceIdentifier raw type can be avoided
     // Raw types use are discouraged since they lack type safety.
     // Resulting Problems are observed at run time and not at compile time
-    public static void writeTransaction(DataBroker dataBroker, InstanceIdentifier instanceIdentifier,
-                                        DataObject object) {
+    public static void writeTransaction(
+            DataBroker dataBroker, InstanceIdentifier instanceIdentifier, DataObject object) {
         @NonNull
         WriteTransaction transaction = dataBroker.newWriteOnlyTransaction();
         transaction.put(LogicalDatastoreType.CONFIGURATION, instanceIdentifier, object);
         transaction.commit();
     }
 
-    public static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks
-            .Network getNetworkForSpanLoss() {
-
+    public static org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
+            .networks.Network getNetworkForSpanLoss() {
         Map<LinkConcatenationKey,LinkConcatenation> linkConcentationValues = new HashMap<>();
-        LinkConcatenation linkConcatenation = new LinkConcatenationBuilder()
+        LinkConcatenation linkConcatenation =
+            new LinkConcatenationBuilder()
                 .withKey(new LinkConcatenationKey(Uint32.valueOf(1)))
                 .addAugmentation(new LinkConcatenation1Builder()
                     .setFiberType(FiberType.Truewave)
-                    .setPmd(new FiberPmd(BigDecimal.ONE))
+                    .setPmd(new FiberPmd(Decimal64.valueOf("1")))
                     .build())
                 .setSRLGId(Uint32.valueOf(1))
-                .setSRLGLength(BigDecimal.valueOf(1))
+                .setSRLGLength(Decimal64.valueOf("1"))
                 .build();
-        LinkConcatenation linkConcatenation2 = new LinkConcatenationBuilder()
+        LinkConcatenation linkConcatenation2 =
+            new LinkConcatenationBuilder()
                 .withKey(new LinkConcatenationKey(Uint32.valueOf(2)))
-                .addAugmentation(new LinkConcatenation1Builder()
-                    .setFiberType(FiberType.Truewave)
-                    .setPmd(new FiberPmd(BigDecimal.ONE))
-                    .build())
+                .addAugmentation(
+                    new LinkConcatenation1Builder()
+                        .setFiberType(FiberType.Truewave)
+                        .setPmd(new FiberPmd(Decimal64.valueOf("1")))
+                        .build())
                 .setSRLGId(Uint32.valueOf(1))
-                .setSRLGLength(BigDecimal.valueOf(1))
+                .setSRLGLength(Decimal64.valueOf("1"))
                 .build();
         linkConcentationValues.put(linkConcatenation.key(),linkConcatenation);
         linkConcentationValues.put(linkConcatenation2.key(),linkConcatenation2);
         // create 2 openroadm-topology degree nodes, end points of the link to be
         // measured;
-        SupportingNode supportingNode4RoadmA = new SupportingNodeBuilder()
-                .withKey(new SupportingNodeKey(new NetworkId("openroadm-network"),
-                        new NodeId("ROADM-A1")))
+        SupportingNode supportingNode4RoadmA =
+            new SupportingNodeBuilder()
+                .withKey(new SupportingNodeKey(new NetworkId("openroadm-network"), new NodeId("ROADM-A1")))
                 .setNetworkRef(new NetworkId("openroadm-network"))
-                .setNodeRef(new NodeId("ROADM-A1")).build();
-        Node ietfNodeA = new NodeBuilder().setNodeId(new NodeId("ROADM-A1-DEG2"))
+                .setNodeRef(new NodeId("ROADM-A1"))
+                .build();
+        Node ietfNodeA =
+            new NodeBuilder()
+                .setNodeId(new NodeId("ROADM-A1-DEG2"))
                 .setSupportingNode(Map.of(supportingNode4RoadmA.key(),supportingNode4RoadmA))
                 .build();
-        SupportingNode supportingNode4RoadmC = new SupportingNodeBuilder()
-                .withKey(new SupportingNodeKey(new NetworkId("openroadm-network"),
-                        new NodeId("ROADM-C1")))
+        SupportingNode supportingNode4RoadmC =
+            new SupportingNodeBuilder()
+                .withKey(new SupportingNodeKey(new NetworkId("openroadm-network"), new NodeId("ROADM-C1")))
                 .setNetworkRef(new NetworkId("openroadm-network"))
-                .setNodeRef(new NodeId("ROADM-C1")).build();
-        Node ietfNodeC = new NodeBuilder().setNodeId(new NodeId("ROADM-C1-DEG1"))
+                .setNodeRef(new NodeId("ROADM-C1"))
+                .build();
+        Node ietfNodeC =
+            new NodeBuilder()
+                .setNodeId(new NodeId("ROADM-C1-DEG1"))
                 .setSupportingNode(Map.of(supportingNode4RoadmC.key(),supportingNode4RoadmC))
                 .build();
         Map<NodeKey,Node> ietfNodeMap = new HashMap<>();
         ietfNodeMap.put(ietfNodeA.key(),ietfNodeA);
         ietfNodeMap.put(ietfNodeC.key(),ietfNodeC);
-        Map<AmplifiedLinkKey,AmplifiedLink>
-                amplifiedLinkValues = new HashMap<>();
-        org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.AmplifiedLink al =
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes
-                        .AmplifiedLinkBuilder()
-                        .setSectionElement(new SectionElementBuilder().setSectionElement(
-                                new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified
-                                        .link.attributes
-                                        .amplified.link.section.element.section.element.SpanBuilder()
-                                        .setSpan(new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210
-                                                .amplified.link.attributes.amplified.link.section.element
-                                                .section.element
-                                                .span.SpanBuilder()
-                                                .setAdministrativeState(AdminStates.InService)
-                                                .setAutoSpanloss(true)
-                                                .setEngineeredSpanloss(new RatioDB(BigDecimal.ONE))
-                                                .setLinkConcatenation(linkConcentationValues)
-                                                .setSpanlossBase(new RatioDB(BigDecimal.ONE))
-                                                .setSpanlossCurrent(new RatioDB(BigDecimal.ONE))
-                                                .build())
-                                        .build())
-                                .build())
-                        .setSectionEltNumber(Uint16.valueOf(1))
-                        .build();
-        org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.AmplifiedLink al2 =
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes
-                        .AmplifiedLinkBuilder()
-                        .setSectionElement(new SectionElementBuilder().setSectionElement(
-                                new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified
-                                        .link.attributes
-                                        .amplified.link.section.element.section.element.SpanBuilder()
-                                        .setSpan(new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210
-                                                .amplified.link.attributes.amplified.link.section.element
-                                                .section.element
-                                                .span.SpanBuilder()
-                                                .setAdministrativeState(AdminStates.InService)
-                                                .setAutoSpanloss(true)
-                                                .setEngineeredSpanloss(new RatioDB(BigDecimal.ONE))
-                                                .setLinkConcatenation(linkConcentationValues)
-                                                .setSpanlossBase(new RatioDB(BigDecimal.ONE))
-                                                .setSpanlossCurrent(new RatioDB(BigDecimal.ONE))
-                                                .build())
-                                        .build())
-                                .build())
-                        .setSectionEltNumber(Uint16.valueOf(1))
-                        .build();
+        Map<AmplifiedLinkKey,AmplifiedLink> amplifiedLinkValues = new HashMap<>();
+        var al = new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526
+                .amplified.link.attributes.AmplifiedLinkBuilder()
+            .setSectionElement(
+                new SectionElementBuilder()
+                    .setSectionElement(
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526
+                                .amplified.link.attributes.amplified.link.section.element.section.element
+                                .SpanBuilder()
+                            .setSpan(
+                                new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526
+                                        .amplified.link.attributes.amplified.link.section.element.section.element
+                                        .span.SpanBuilder()
+                                    .setAdministrativeState(AdminStates.InService)
+                                    .setAutoSpanloss(true)
+                                    .setEngineeredSpanloss(new RatioDB(Decimal64.valueOf("1")))
+                                    .setLinkConcatenation(linkConcentationValues)
+                                    .setSpanlossBase(new RatioDB(Decimal64.valueOf("1")))
+                                    .setSpanlossCurrent(new RatioDB(Decimal64.valueOf("1")))
+                                    .build())
+                            .build())
+                        .build())
+            .setSectionEltNumber(Uint16.valueOf(1))
+            .build();
+        var al2 = new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526
+                .amplified.link.attributes.AmplifiedLinkBuilder()
+            .setSectionElement(
+                new SectionElementBuilder()
+                    .setSectionElement(
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526
+                                .amplified.link.attributes.amplified.link.section.element.section.element
+                                .SpanBuilder()
+                            .setSpan(
+                                new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526
+                                        .amplified.link.attributes.amplified.link.section.element.section.element
+                                        .span.SpanBuilder()
+                                    .setAdministrativeState(AdminStates.InService)
+                                    .setAutoSpanloss(true)
+                                    .setEngineeredSpanloss(new RatioDB(Decimal64.valueOf("1")))
+                                    .setLinkConcatenation(linkConcentationValues)
+                                    .setSpanlossBase(new RatioDB(Decimal64.valueOf("1")))
+                                    .setSpanlossCurrent(new RatioDB(Decimal64.valueOf("1")))
+                                    .build())
+                            .build())
+                    .build())
+            .setSectionEltNumber(Uint16.valueOf(1))
+            .build();
         amplifiedLinkValues.put(al.key(),al);
         amplifiedLinkValues.put(al2.key(),al2);
-        Augmentation<Link> aug11 = new Link1Builder()
-                .setAmplified(true)
-                .setOMSAttributes(new OMSAttributesBuilder()
-                        .setAmplifiedLink(new AmplifiedLinkBuilder().setAmplifiedLink(amplifiedLinkValues).build())
-                        .setSpan(new SpanBuilder().build())
-                        .build())
-                .build();
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1 aug12 =
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder()
-                        .setLinkType(OpenroadmLinkType.ROADMTOROADM).build();
-        Augmentation<Link> aug21 = new Link1Builder()
-                .setAmplified(true)
-                .setOMSAttributes(new OMSAttributesBuilder()
-                        .setAmplifiedLink(new AmplifiedLinkBuilder().setAmplifiedLink(amplifiedLinkValues).build())
-                        .setSpan(new SpanBuilder().build()).build())
-                .build();
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1 aug22 =
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder()
-                        .setLinkType(OpenroadmLinkType.ROADMTOROADM).build();
+
         // create the roadm-to-roadm link to be measured
-        Link roadm2roadmLink = new LinkBuilder().setLinkId(new LinkId("ROADM-A1-to-ROADM-C1"))
-                .setSource(new SourceBuilder()
+        Link roadm2roadmLink =
+            new LinkBuilder()
+                .setLinkId(new LinkId("ROADM-A1-to-ROADM-C1"))
+                .setSource(
+                    new SourceBuilder()
                         .setSourceNode(ietfNodeA.getNodeId())
                         .setSourceTp(new TpId("DEG2-TTP-TXRX"))
                         .build())
-                .setDestination(new DestinationBuilder()
+                .setDestination(
+                    new DestinationBuilder()
                         .setDestNode(ietfNodeC.getNodeId())
                         .setDestTp(new TpId("DEG1-TTP-TXRX"))
                         .build())
-                .addAugmentation(aug11)
-                .addAugmentation(aug12)
-                .addAugmentation(aug21)
-                .addAugmentation(aug22)
+                .addAugmentation(
+                    //aug11
+                    new Link1Builder()
+                        .setAmplified(true)
+                        .setOMSAttributes(
+                            new OMSAttributesBuilder()
+                                .setAmplifiedLink(
+                                    new AmplifiedLinkBuilder().setAmplifiedLink(amplifiedLinkValues).build())
+                                .setSpan(new SpanBuilder().build())
+                                .build())
+                        .build())
+                .addAugmentation(
+                    //aug12
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1Builder()
+                        .setLinkType(OpenroadmLinkType.ROADMTOROADM)
+                        .build())
+                .addAugmentation(
+                    //aug21
+                    new Link1Builder()
+                        .setAmplified(true)
+                        .setOMSAttributes(
+                            new OMSAttributesBuilder()
+                                .setAmplifiedLink(
+                                    new AmplifiedLinkBuilder().setAmplifiedLink(amplifiedLinkValues).build())
+                                .setSpan(new SpanBuilder().build())
+                                .build())
+                        .build())
+                .addAugmentation(
+                    //aug22
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1Builder()
+                        .setLinkType(OpenroadmLinkType.ROADMTOROADM)
+                        .build())
                 .build();
-        // create the ietf network
-        Network1 openroadmAugmToIetfNetwork = new Network1Builder()
-                .setLink(Map.of(roadm2roadmLink.key(),roadm2roadmLink)).build();
-        // openroadm Topology builder
-        NetworkBuilder ietfNetworkBldr = new NetworkBuilder()
-                .setNetworkId(new NetworkId("openroadm-topology"))
-                .setNode(ietfNodeMap)
-                .addAugmentation(openroadmAugmToIetfNetwork);
-
-        return ietfNetworkBldr.build();
+        return new NetworkBuilder()
+            .setNetworkId(new NetworkId("openroadm-topology"))
+            .setNode(ietfNodeMap)
+            .addAugmentation(
+                new Network1Builder().setLink(Map.of(roadm2roadmLink.key(),roadm2roadmLink)).build())
+            .build();
     }
 
     public static Mapping getMapping1() {
-        return new MappingBuilder().setLogicalConnectionPoint("DEG2-TTP-TXRX").setSupportingOts("OTS-DEG2-TTP-TXRX")
-                .build();
+        return new MappingBuilder()
+            .setLogicalConnectionPoint("DEG2-TTP-TXRX")
+            .setSupportingOts("OTS-DEG2-TTP-TXRX")
+            .build();
     }
 
     public static Mapping getMapping2() {
-        return new MappingBuilder().setLogicalConnectionPoint("DEG1-TTP-TXRX").setSupportingOts("OTS-DEG1-TTP-TXRX")
-                .build();
+        return new MappingBuilder()
+            .setLogicalConnectionPoint("DEG1-TTP-TXRX")
+            .setSupportingOts("OTS-DEG1-TTP-TXRX")
+            .build();
     }
 
     public static Optional<CurrentPmList> getCurrentPmListA() {
-        Measurement measurementA = new MeasurementBuilder()
+        Measurement measurementA =
+            new MeasurementBuilder()
                 .withKey(new MeasurementKey(PmGranularity._15min))
-                .setGranularity(org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev171215
-                        .PmGranularity._15min)
-                .setPmParameterValue(new PmDataType(new BigDecimal("-3.5")))
+                .setGranularity(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev171215.PmGranularity._15min)
+                .setPmParameterValue(new PmDataType(Decimal64.valueOf("-3.5")))
                 .setValidity(Validity.Complete)
                 .build();
-        CurrentPm cpA = new CurrentPmBuilder()
-                .withKey(new CurrentPmKey(Direction.Bidirectional,
-                        "", Location.NotApplicable, PmNamesEnum.OpticalPowerOutput))
-                .setType(org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev171215.PmNamesEnum
-                        .OpticalPowerOutput)
+        CurrentPm cpA =
+            new CurrentPmBuilder()
+                .withKey(
+                    new CurrentPmKey(
+                        Direction.Bidirectional, "", Location.NotApplicable, PmNamesEnum.OpticalPowerOutput))
+                .setType(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev171215.PmNamesEnum.OpticalPowerOutput)
                 .setMeasurement(Map.of(measurementA.key(),measurementA))
                 .build();
-        InstanceIdentifier<Interface> interfaceIIDA = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(Interface.class, new InterfaceKey("OTS-DEG2-TTP-TXRX"));
-        CurrentPmEntry currentPmEntryA = new CurrentPmEntryBuilder()
+        CurrentPmEntry currentPmEntryA =
+            new CurrentPmEntryBuilder()
                 .setCurrentPm(Map.of(cpA.key(),cpA))
-                .setPmResourceInstance(interfaceIIDA)
+                .setPmResourceInstance(
+                    InstanceIdentifier
+                        .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                        .child(Interface.class, new InterfaceKey("OTS-DEG2-TTP-TXRX"))
+                        .build())
                 .setPmResourceType(
-                        org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019.ResourceTypeEnum
-                                .Interface)
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019.ResourceTypeEnum.Interface)
                 .setPmResourceTypeExtension("")
                 .setRetrievalTime(new DateAndTime("2018-06-07T13:22:58+00:00"))
                 .build();
-        return Optional.of(new CurrentPmListBuilder()
-                .setCurrentPmEntry(Map.of(currentPmEntryA.key(),currentPmEntryA)).build());
+        return Optional.of(
+            new CurrentPmListBuilder()
+                .setCurrentPmEntry(Map.of(currentPmEntryA.key(),currentPmEntryA))
+                .build());
     }
 
     public static Optional<CurrentPmList> getCurrentPmListC() {
-        Measurement measurementC = new MeasurementBuilder()
+        Measurement measurementC =
+            new MeasurementBuilder()
                 .setGranularity(org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev171215.PmGranularity._15min)
-                .setPmParameterValue(new PmDataType(new BigDecimal("-18.1")))
+                .setPmParameterValue(new PmDataType(Decimal64.valueOf("-18.1")))
                 .setValidity(Validity.Complete)
                 .build();
-        CurrentPm cpC = new CurrentPmBuilder()
-                .withKey(new CurrentPmKey(Direction.Bidirectional,
-                        "", Location.NotApplicable, PmNamesEnum.OpticalPowerInput))
-                .setType(org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev171215.PmNamesEnum
-                        .OpticalPowerInput)
+        CurrentPm cpC =
+            new CurrentPmBuilder()
+                .withKey(
+                    new CurrentPmKey(
+                        Direction.Bidirectional, "", Location.NotApplicable, PmNamesEnum.OpticalPowerInput))
+                .setType(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev171215.PmNamesEnum.OpticalPowerInput)
                 .setMeasurement(Map.of(measurementC.key(),measurementC))
                 .build();
-        InstanceIdentifier<Interface> interfaceIIDC = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(Interface.class, new InterfaceKey("OTS-DEG1-TTP-TXRX"));
-        CurrentPmEntry currentPmEntryC = new CurrentPmEntryBuilder()
+        CurrentPmEntry currentPmEntryC =
+            new CurrentPmEntryBuilder()
                 .setCurrentPm(Map.of(cpC.key(),cpC))
-                .setPmResourceInstance(interfaceIIDC)
+                .setPmResourceInstance(
+                    InstanceIdentifier
+                        .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                        .child(Interface.class, new InterfaceKey("OTS-DEG1-TTP-TXRX"))
+                        .build())
                 .setPmResourceType(
-                        org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019
-                                .ResourceTypeEnum.Interface)
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev181019.ResourceTypeEnum.Interface)
                 .setPmResourceTypeExtension("")
                 .setRetrievalTime(new DateAndTime("2018-06-07T13:22:58+00:00"))
                 .build();
-        return Optional.of(new CurrentPmListBuilder()
-                .setCurrentPmEntry(Map.of(currentPmEntryC.key(),currentPmEntryC)).build());
+        return Optional.of(
+            new CurrentPmListBuilder()
+                .setCurrentPmEntry(Map.of(currentPmEntryC.key(),currentPmEntryC))
+                .build());
     }
 }
index b0873f9f5e88a3581b6a5331af068bb48ea73c2a..bbaaf1a787ab93df8cb4ab7976ac07df0e9a52d4 100644 (file)
@@ -8,25 +8,26 @@
 
 package org.opendaylight.transportpce.olm.util;
 
-import org.junit.Assert;
-import org.junit.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
-public class OtsPmHolderTest {
+import org.junit.jupiter.api.Test;
+
+class OtsPmHolderTest {
 
     @Test
-    public void test() {
+    void test() {
         OtsPmHolder otspmholder0 = new OtsPmHolder("name", Double.valueOf(12), "interface");
 
-        Assert.assertEquals("name", otspmholder0.getOtsParameterName());
-        Assert.assertEquals(Double.valueOf(12), otspmholder0.getOtsParameterVal());
-        Assert.assertEquals("interface", otspmholder0.getOtsInterfaceName());
+        assertEquals("name", otspmholder0.getOtsParameterName());
+        assertEquals(Double.valueOf(12), otspmholder0.getOtsParameterVal());
+        assertEquals("interface", otspmholder0.getOtsInterfaceName());
 
         otspmholder0.setOtsParameterName("name 2");
         otspmholder0.setOtsParameterVal(Double.valueOf(120));
         otspmholder0.setOtsInterfaceName("interface 2");
 
-        Assert.assertEquals("name 2", otspmholder0.getOtsParameterName());
-        Assert.assertEquals(Double.valueOf(120), otspmholder0.getOtsParameterVal());
-        Assert.assertEquals("interface 2", otspmholder0.getOtsInterfaceName());
+        assertEquals("name 2", otspmholder0.getOtsParameterName());
+        assertEquals(Double.valueOf(120), otspmholder0.getOtsParameterVal());
+        assertEquals("interface 2", otspmholder0.getOtsInterfaceName());
     }
 }
index e96bddbedb3c4ea71cb02a71e40ce4cdcebfaad9..00568a44f1929c0e96f2d38d7f007911138e114d 100644 (file)
@@ -8,7 +8,6 @@
 
 package org.opendaylight.transportpce.olm.util;
 
-import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -18,33 +17,33 @@ import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.ReadWriteTransaction;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.NetworkUtils;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.OpenroadmNodeVersion;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.cp.to.degree.CpToDegree;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.cp.to.degree.CpToDegreeBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.cp.to.degree.CpToDegreeKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfoBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.Network;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.OpenroadmNodeVersion;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.cp.to.degree.CpToDegree;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.cp.to.degree.CpToDegreeBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.cp.to.degree.CpToDegreeKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfoBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.link.types.rev191129.FiberPmd;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.link.types.rev191129.RatioDB;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.AmplifiedLink;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.AmplifiedLinkKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.amplified.link.SectionElementBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.span.attributes.LinkConcatenation1.FiberType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.span.attributes.LinkConcatenation1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Link1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.link.OMSAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.link.oms.attributes.AmplifiedLinkBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.link.oms.attributes.SpanBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.link.concatenation.LinkConcatenation;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.link.concatenation.LinkConcatenationBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.link.concatenation.LinkConcatenationKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link.attributes.AmplifiedLink;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link.attributes.AmplifiedLinkKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link.attributes.amplified.link.SectionElementBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.span.attributes.LinkConcatenation1.FiberType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.span.attributes.LinkConcatenation1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Link1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.link.OMSAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.link.oms.attributes.AmplifiedLinkBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.link.oms.attributes.SpanBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.link.concatenation.LinkConcatenation;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.link.concatenation.LinkConcatenationBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.link.concatenation.LinkConcatenationKey;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
@@ -67,6 +66,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.top
 import org.opendaylight.yangtools.yang.binding.Augmentation;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.Uint16;
 import org.opendaylight.yangtools.yang.common.Uint32;
 
@@ -88,30 +88,6 @@ public final class TransactionUtils {
         return true;
     }
 
-//
-//    public static boolean writeTransaction(DataBroker dataBroker, LogicalDatastoreType logicalDatastoreType,
-//        InstanceIdentifier instanceIdentifier,
-//        DataObject object)
-
-//    public static DataObject readTransaction(DeviceTransactionManager deviceTransactionManager,
-//                                  String nodeId,
-//                                  LogicalDatastoreType logicalDatastoreType,
-//                                  InstanceIdentifier<? extends DataObject> instanceIdentifier)
-//            throws ExecutionException, InterruptedException {
-//        Future<Optional<DeviceTransaction>> deviceTxFuture =
-//                deviceTransactionManager.getDeviceTransaction(nodeId);
-//        if (!deviceTxFuture.get().isPresent()) {
-//            return null;
-//        }
-//        DeviceTransaction deviceTx = deviceTxFuture.get().get();
-//        com.google.common.base.Optional<? extends DataObject> readOpt
-//                = deviceTx.read(logicalDatastoreType, instanceIdentifier).get();
-//        if (!readOpt.isPresent()) {
-//            return null;
-//        }
-//        return readOpt.get();
-//    }
-
     public static Network1 getNullNetwork() {
         Map<LinkKey, Link> nullMap = null;
         Network1 network = new Network1Builder().setLink(nullMap).build();
@@ -233,53 +209,53 @@ public final class TransactionUtils {
         LinkConcatenation linkConcatenation = new LinkConcatenationBuilder()
             .addAugmentation(new LinkConcatenation1Builder()
                 .setFiberType(FiberType.Truewave)
-                .setPmd(new FiberPmd(BigDecimal.ONE))
+                .setPmd(new FiberPmd(Decimal64.valueOf("1")))
                 .build())
             .setSRLGId(Uint32.valueOf(1))
-            .setSRLGLength(BigDecimal.valueOf(1))
+            .setSRLGLength(Decimal64.valueOf("1"))
             .build();
         LinkConcatenation linkConcatenation2 = new LinkConcatenationBuilder()
             .addAugmentation(new LinkConcatenation1Builder()
                 .setFiberType(FiberType.Truewave)
-                .setPmd(new FiberPmd(BigDecimal.ONE))
+                .setPmd(new FiberPmd(Decimal64.valueOf("1")))
                 .build())
             .setSRLGId(Uint32.valueOf(1))
-            .setSRLGLength(BigDecimal.valueOf(1))
+            .setSRLGLength(Decimal64.valueOf("1"))
             .build();
         linkConcentationValues.put(linkConcatenation.key(),linkConcatenation);
         linkConcentationValues.put(linkConcatenation2.key(),linkConcatenation2);
         Map<AmplifiedLinkKey,AmplifiedLink>
             amplifiedLinkValues = new HashMap<>();
-        org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.AmplifiedLink al =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes
+        org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link.attributes.AmplifiedLink al =
+            new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link.attributes
                     .AmplifiedLinkBuilder().setSectionElement(new SectionElementBuilder()
-                .setSectionElement(new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link
+                .setSectionElement(new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link
                     .attributes.amplified.link.section.element.section.element.SpanBuilder()
-                        .setSpan(new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link
+                        .setSpan(new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link
                                 .attributes.amplified.link.section.element.section.element.span.SpanBuilder()
                                     .setAdministrativeState(AdminStates.InService)
                                     .setAutoSpanloss(true)
-                                    .setEngineeredSpanloss(new RatioDB(BigDecimal.ONE))
+                                    .setEngineeredSpanloss(new RatioDB(Decimal64.valueOf("1")))
                                     .setLinkConcatenation(linkConcentationValues)
-                                    .setSpanlossBase(new RatioDB(BigDecimal.ONE))
-                                    .setSpanlossCurrent(new RatioDB(BigDecimal.ONE))
+                                    .setSpanlossBase(new RatioDB(Decimal64.valueOf("1")))
+                                    .setSpanlossCurrent(new RatioDB(Decimal64.valueOf("1")))
                                     .build())
                     .build())
                 .build())
             .setSectionEltNumber(Uint16.valueOf(1)).build();
-        org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.AmplifiedLink al2 = new
-            org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes
-                .AmplifiedLinkBuilder().setSectionElement(new SectionElementBuilder()
-                .setSectionElement(new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link
+        org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link.attributes.AmplifiedLink al2 = new
+            org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link.attributes
+                    .AmplifiedLinkBuilder().setSectionElement(new SectionElementBuilder()
+                .setSectionElement(new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link
                      .attributes.amplified.link.section.element.section.element.SpanBuilder()
-                        .setSpan(new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link
+                        .setSpan(new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link
                                 .attributes.amplified.link.section.element.section.element.span.SpanBuilder()
                                     .setAdministrativeState(AdminStates.InService)
                                     .setAutoSpanloss(true)
-                                    .setEngineeredSpanloss(new RatioDB(BigDecimal.ONE))
+                                    .setEngineeredSpanloss(new RatioDB(Decimal64.valueOf("1")))
                                     .setLinkConcatenation(linkConcentationValues)
-                                    .setSpanlossBase(new RatioDB(BigDecimal.ONE))
-                                    .setSpanlossCurrent(new RatioDB(BigDecimal.ONE))
+                                    .setSpanlossBase(new RatioDB(Decimal64.valueOf("1")))
+                                    .setSpanlossCurrent(new RatioDB(Decimal64.valueOf("1")))
                                     .build())
                                     .build())
             .build())
diff --git a/ordmodels/common/pom.xml b/ordmodels/common/pom.xml
deleted file mode 100644 (file)
index 75653f5..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Copyright © 2016 Orange and others. All rights reserved.
-
-This program and the accompanying materials are made available under the
-terms of the Eclipse Public License v1.0 which accompanies this distribution,
-and is available at http://www.eclipse.org/legal/epl-v10.html
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.opendaylight.mdsal</groupId>
-    <artifactId>binding-parent</artifactId>
-    <version>8.0.11</version>
-    <relativePath/>
-  </parent>
-
-  <groupId>org.opendaylight.transportpce.ordmodels</groupId>
-  <artifactId>transportpce-ordmodels-common</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
-  <packaging>bundle</packaging>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>concepts</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>yang-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
-      <artifactId>rfc6991-ietf-yang-types</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/ordmodels/common/src/main/resources/NOTICE b/ordmodels/common/src/main/resources/NOTICE
deleted file mode 100644 (file)
index a8fc5c4..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-This work includes a modified version of the YANG model org-openroadm-port-types
-developed by the Open ROADM MSA.
-
-It contains an additional regen identity 'if-OTUCn-ODUCn-regen' found in some
-non-compliant devices.
-Though this identity should have been advertised through a YANG deviation,
-this does not raise any compatibility problem with compliant devices.
-This is an ideally temporary work-around until a compliant solution is found.
-cf https://jira.opendaylight.org/browse/TRNSPRTPCE-532
diff --git a/ordmodels/common/src/main/yang/org-openroadm-alarm@2016-10-14.yang b/ordmodels/common/src/main/yang/org-openroadm-alarm@2016-10-14.yang
deleted file mode 100644 (file)
index e86950f..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-module org-openroadm-alarm {
-  namespace "http://org/openroadm/alarm";
-  prefix org-openroadm-alarm;
-
-  import ietf-yang-types {
-    prefix yang;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2016-10-14;
-  }
-  import org-openroadm-resource {
-    prefix org-openroadm-resource;
-    revision-date 2016-10-14;
-  }
-  import org-openroadm-probable-cause {
-    prefix org-openroadm-probable-cause;
-    revision-date 2016-10-14;
-  }
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of an alarm.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping alarm {
-    leaf id {
-      description
-        "Uniquely id for this alarm, within the given management domain";
-      type string;
-      mandatory true;
-    }
-    container resource {
-      description
-        "Resource under alarm";
-      uses org-openroadm-resource:resource;
-    }
-    container probableCause {
-      description
-        "Probable cause of alarm";
-      uses org-openroadm-probable-cause:probable-cause;
-    }
-    leaf type {
-      description
-        "Type of alarm. Based on X.733 event Type.";
-      mandatory false;
-      type enumeration {
-        enum "communication" {
-          value 1;
-        }
-        enum "qualityOfService" {
-          value 2;
-        }
-        enum "processingError" {
-          value 3;
-        }
-        enum "equipment" {
-          value 4;
-        }
-        enum "environmental" {
-          value 5;
-        }
-      }
-    }
-    leaf raiseTime {
-      description
-        "Time alarm was raised";
-      type yang:date-and-time;
-      mandatory true;
-    }
-    leaf severity {
-      description
-        "Severity of alarm. Based on X.733 perceived severity.";
-      mandatory true;
-      type org-openroadm-common-types:severity;
-    }
-    leaf circuit-id {
-      description
-        "Circuit-id for alarm correlation.";
-      type string;
-    }
-  }
-
-  container active-alarm-list {
-    description
-      "List of currently active alarms. An alarm is removed from this table when the state transitions to clear.";
-    list activeAlarms {
-      key "id";
-      uses alarm;
-    }
-    config false;
-  }
-  notification alarm-notification {
-    description
-      "Notification sent on initial alarm creation, as well as any time the alarm changes state, including clear";
-    uses alarm;
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-alarm@2018-10-19.yang b/ordmodels/common/src/main/yang/org-openroadm-alarm@2018-10-19.yang
deleted file mode 100644 (file)
index 6168ed3..0000000
+++ /dev/null
@@ -1,136 +0,0 @@
-module org-openroadm-alarm {
-  namespace "http://org/openroadm/alarm";
-  prefix org-openroadm-alarm;
-
-  import ietf-yang-types {
-    prefix yang;
-    revision-date 2013-07-15;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-resource {
-    prefix org-openroadm-resource;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-probable-cause {
-    prefix org-openroadm-probable-cause;
-    revision-date 2018-10-19;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of an alarm.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping alarm {
-    leaf id {
-      type string;
-      mandatory true;
-      description
-        "Uniquely id for this alarm, within the given management domain";
-    }
-    container resource {
-      description
-        "Resource under alarm";
-      uses org-openroadm-resource:resource;
-    }
-    container probableCause {
-      description
-        "Probable cause of alarm";
-      uses org-openroadm-probable-cause:probable-cause;
-    }
-    leaf raiseTime {
-      type yang:date-and-time;
-      mandatory true;
-      description
-        "Time alarm was raised";
-    }
-    leaf severity {
-      type org-openroadm-common-types:severity;
-      mandatory true;
-      description
-        "Severity of alarm. Based on X.733 perceived severity.";
-    }
-    leaf circuit-id {
-      type string;
-      description
-        "Circuit-id for alarm correlation.";
-    }
-    leaf additional-detail {
-      type string;
-      description
-        "Provide additional descriptive text about the probable cause.";
-    }
-    leaf corrective-action {
-      type string;
-      description
-        "Provide recommended corrective actions for this probable cause, i.e. replace or restart a circuit pack, check wiring for the reported source, or secondary failure to be correlated ";
-    }
-  }
-
-  notification alarm-notification {
-    description
-      "Notification sent on initial alarm creation, as well as any time the alarm changes state, including clear";
-    uses alarm;
-  }
-  container active-alarm-list {
-    config false;
-    description
-      "List of currently active alarms. An alarm is removed from this table when the state transitions to clear.";
-    list activeAlarms {
-      key "id";
-      uses alarm;
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-alarm@2020-05-29.yang b/ordmodels/common/src/main/yang/org-openroadm-alarm@2020-05-29.yang
deleted file mode 100644 (file)
index 57cdc61..0000000
+++ /dev/null
@@ -1,190 +0,0 @@
-module org-openroadm-alarm {
-  namespace "http://org/openroadm/alarm";
-  prefix org-openroadm-alarm;
-
-  import ietf-yang-types {
-    prefix yang;
-    revision-date 2013-07-15;
-  }
-  import org-openroadm-resource {
-    prefix org-openroadm-resource;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-probable-cause {
-    prefix org-openroadm-probable-cause;
-    revision-date 2020-05-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of an alarm.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef severity {
-    type enumeration {
-      enum critical {
-        value 1;
-      }
-      enum major {
-        value 2;
-      }
-      enum minor {
-        value 3;
-      }
-      enum warning {
-        value 4;
-      }
-      enum clear {
-        value 5;
-      }
-      enum indeterminate {
-        value 6;
-      }
-    }
-    description
-      "Severity, based on X.733 perceived severity";
-  }
-
-  grouping alarm {
-    leaf id {
-      type string;
-      mandatory true;
-      description
-        "Uniquely id for this alarm, within the given management domain";
-    }
-    container resource {
-      description
-        "Resource under alarm";
-      uses org-openroadm-resource:resource;
-    }
-    container probableCause {
-      description
-        "Probable cause of alarm";
-      uses org-openroadm-probable-cause:probable-cause;
-    }
-    leaf raiseTime {
-      type yang:date-and-time;
-      mandatory true;
-      description
-        "Time alarm was raised";
-    }
-    leaf severity {
-      type severity;
-      mandatory true;
-      description
-        "Severity of alarm. Based on X.733 perceived severity.";
-    }
-    leaf circuit-id {
-      type string;
-      description
-        "Circuit-id for alarm correlation.";
-    }
-    leaf additional-detail {
-      type string;
-      description
-        "Provide additional descriptive text about the probable cause.";
-    }
-    leaf corrective-action {
-      type string;
-      description
-        "Provide recommended corrective actions for this probable cause, i.e. replace or restart a circuit pack, check wiring for the reported source, or secondary failure to be correlated ";
-    }
-  }
-
-  notification alarm-notification {
-    description
-      "Notification sent on initial alarm creation, as well as any time the alarm changes state, including clear";
-    uses alarm;
-  }
-
-  container active-alarm-list {
-    config false;
-    description
-      "List of currently active alarms. An alarm is removed from this table when the state transitions to clear.";
-    list activeAlarms {
-      key "id";
-      uses alarm;
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-alarm-pm-types@2019-11-29.yang b/ordmodels/common/src/main/yang/org-openroadm-common-alarm-pm-types@2019-11-29.yang
deleted file mode 100644 (file)
index d13b85b..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-module org-openroadm-common-alarm-pm-types {
-  namespace "http://org/openroadm/common-alarm-pm-types";
-  prefix org-openroadm-common-alarm-pm-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common alarm and pm types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-
-  typedef direction {
-    type enumeration {
-      enum tx {
-        value 1;
-      }
-      enum rx {
-        value 2;
-      }
-      enum bidirectional {
-        value 3;
-      }
-      enum notApplicable {
-        value 4;
-      }
-    }
-  }
-
-  typedef location {
-    type enumeration {
-      enum notApplicable {
-        value 1;
-      }
-      enum nearEnd {
-        value 2;
-      }
-      enum farEnd {
-        value 3;
-      }
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-amplifier-types@2018-11-30.yang b/ordmodels/common/src/main/yang/org-openroadm-common-amplifier-types@2018-11-30.yang
deleted file mode 100644 (file)
index c2c004f..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-module org-openroadm-common-amplifier-types {
-  namespace "http://org/openroadm/common-amplifier-types";
-  prefix org-openroadm-common-amplifier-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-
-  typedef amplifier-types {
-    type enumeration {
-      enum "standard" {
-        value 1;
-      }
-    }
-    description
-      "identifier for amplifier type
-       1. standard for amplifier as defined initially in the ROADM MSA specifications
-       To be completed if/when additional amplifier types are required ";
-  }
-
-  typedef line-amplifier-control-mode {
-    type enumeration {
-      enum "gainLoss" {
-        value 2;
-      }
-      enum "off" {
-        value 3;
-      }
-    }
-    description
-      "Identifies the line amplifier control mode, either off or gain.";
-  }
-
-  typedef amplifier-gain-range {
-    type enumeration {
-      enum "gain-range-1" {
-        value 1;
-      }
-      enum "gain-range-2" {
-        value 2;
-      }
-      enum "gain-range-3" {
-        value 3;
-      }
-      enum "gain-range-4" {
-        value 4;
-      }
-    }
-    description
-      "Operational mode for the amplifier:
-       this parameter allows modeling different operational modes (gain ranges) ,notably for switched-gain amplifiers.
-       It indicates which performance model shall be used by the path feasibility engine.
-       For standard amplifier, or when performance evaluation is based on incremental noise, use gain-range-1.
-       When performance evaluation is based on advanced parameters, specify used gain-range (1 to 4).
-       Up to release 2.1, only gain-range-1 is to be used (default value) ";
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-amplifier-types@2019-11-29.yang b/ordmodels/common/src/main/yang/org-openroadm-common-amplifier-types@2019-11-29.yang
deleted file mode 100644 (file)
index d5500a1..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-module org-openroadm-common-amplifier-types {
-  namespace "http://org/openroadm/common-amplifier-types";
-  prefix org-openroadm-common-amplifier-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-
-  typedef amplifier-types {
-    type enumeration {
-      enum standard {
-        value 1;
-      }
-    }
-    description
-      "identifier for amplifier type
-       1. standard for amplifier as defined initially in the ROADM MSA specifications
-       To be completed if/when additional amplifier types are required ";
-  }
-
-  typedef line-amplifier-control-mode {
-    type enumeration {
-      enum gainLoss {
-        value 2;
-      }
-      enum off {
-        value 3;
-      }
-    }
-    description
-      "Identifies the line amplifier control mode, either off or gain.";
-  }
-
-  typedef amplifier-gain-range {
-    type enumeration {
-      enum gain-range-1 {
-        value 1;
-      }
-      enum gain-range-2 {
-        value 2;
-      }
-      enum gain-range-3 {
-        value 3;
-      }
-      enum gain-range-4 {
-        value 4;
-      }
-    }
-    description
-      "Operational mode for the amplifier:
-       this parameter allows modeling different operational modes (gain ranges) ,notably for switched-gain amplifiers.
-       It indicates which performance model shall be used by the path feasibility engine.
-       For standard amplifier, or when performance evaluation is based on incremental noise, use gain-range-1.
-       When performance evaluation is based on advanced parameters, specify used gain-range (1 to 4).
-       Up to release 2.1, only gain-range-1 is to be used (default value) ";
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-attributes@2020-03-27.yang b/ordmodels/common/src/main/yang/org-openroadm-common-attributes@2020-03-27.yang
deleted file mode 100644 (file)
index 115271a..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-module org-openroadm-common-attributes {
-  namespace "http://org/openroadm/common-attributes";
-  prefix org-openroadm-common-attributes;
-
-  import org-openroadm-otn-common-types {
-    prefix org-openroadm-otn-common-types;
-    revision-date 2020-03-27;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common attributes.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-
-  grouping parent-odu-allocation {
-    description
-      "parent odu allocation group";
-    container parent-odu-allocation {
-      presence "Explicit assignment of parent ODU trib-slot and trib-port allocation. ";
-      description
-        "parent odu allocation";
-      leaf trib-port-number {
-        type uint16 {
-          range "1 .. 80";
-        }
-        mandatory true;
-        description
-          "Assigned tributary port number in parent OPU";
-      }
-      choice trib-slots-choice {
-        description
-          "trib slot selection";
-        case opu {
-          leaf-list trib-slots {
-            type uint16 {
-              range "1 .. 80";
-            }
-            min-elements 1;
-            max-elements 80;
-            description
-              "Assigned trib slots occupied in parent OPU MSI";
-          }
-        }
-        case opucn {
-          leaf-list opucn-trib-slots {
-            type org-openroadm-otn-common-types:opucn-trib-slot-def;
-            description
-              "Specify the list of OPUCn 5G tributary slots in the form of
-               TS #A.B (G.709 Figure 20-9) in the case of provisioning the low
-                order ODUk to the parent server ODUCn";
-          }
-        }
-      }
-    }
-  }
-
-  grouping deg-threshold {
-    description
-      "Deg threshold grouping";
-    leaf degm-intervals {
-      type uint8 {
-        range "2 .. 10";
-      }
-      default "2";
-      description
-        "G.806 - Consecutive bad intervals required for declare dDEG";
-    }
-    leaf degthr-percentage {
-      type uint16 {
-        range "1 .. 10000";
-      }
-      default "100";
-      description
-        "Percentage of errored blocks required to declare an interval bad, in units of 0.01%";
-    }
-  }
-
-  grouping trail-trace-tx {
-    description
-      "Trail trace tx grouping";
-    leaf tx-sapi {
-      type string {
-        length "0 .. 15";
-      }
-      description
-        "The provisioned 15 character transmit trace SAPI. Implementations shall add the [0] field automatically per ITU-T G.709";
-    }
-    leaf tx-dapi {
-      type string {
-        length "0 .. 15";
-      }
-      description
-        "The provisioned 15 character transmit trace DAPI. Implementations shall add the [0] field automatically per ITU-T G.709";
-    }
-    leaf tx-operator {
-      type string {
-        length "0 .. 32";
-      }
-      description
-        "The provisioned 32 character Operator Specific field";
-    }
-  }
-
-  grouping trail-trace-other {
-    description
-      "Trail trace other grouping";
-    leaf expected-sapi {
-      type string {
-        length "0 .. 15";
-      }
-      description
-        "The provisioned expected SAPI, to be compared with accepted TTI";
-    }
-    leaf expected-dapi {
-      type string {
-        length "0 .. 15";
-      }
-      description
-        "The provisioned expected DAPI, to be compared with accepted TTI";
-    }
-    leaf tim-act-enabled {
-      type boolean;
-      default "false";
-      description
-        "Enables TTI Mismatch consequent actions.";
-    }
-    leaf tim-detect-mode {
-      type enumeration {
-        enum Disabled {
-          description
-            "TTI is ignored";
-        }
-        enum SAPI {
-          description
-            "Expected SAPI is compared to the Accepted TTI. Other TTI fields are ignored";
-        }
-        enum DAPI {
-          description
-            "Expected DAPI is compared to the Accepted TTI. Other TTI fields are ignored";
-        }
-        enum SAPI-and-DAPI {
-          description
-            "Expected SAPI and Expected DAPI are compared to the Accepted TTI. Operator specific TTI field is ignored";
-        }
-      }
-      default "Disabled";
-      description
-        "tim detect mode leaf";
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-attributes@2021-09-24.yang b/ordmodels/common/src/main/yang/org-openroadm-common-attributes@2021-09-24.yang
deleted file mode 100644 (file)
index c46db9c..0000000
+++ /dev/null
@@ -1,192 +0,0 @@
-module org-openroadm-common-attributes {
-  namespace "http://org/openroadm/common-attributes";
-  prefix org-openroadm-common-attributes;
-
-  import org-openroadm-otn-common-types {
-    prefix org-openroadm-otn-common-types;
-    revision-date 2021-09-24;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common attributes.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2021-09-24 {
-    description
-      "Version 10.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-
-  grouping parent-odu-allocation {
-    description
-      "parent odu allocation group";
-    container parent-odu-allocation {
-      presence "Explicit assignment of parent ODU trib-slot and trib-port allocation. ";
-      description
-        "parent odu allocation";
-      leaf trib-port-number {
-        type uint16 {
-          range "1 .. 80";
-        }
-        mandatory true;
-        description
-          "Assigned tributary port number in parent OPU";
-      }
-      choice trib-slots-choice {
-        description
-          "trib slot selection";
-        case opu {
-          leaf-list trib-slots {
-            type uint16 {
-              range "1 .. 80";
-            }
-            min-elements 1;
-            max-elements 80;
-            description
-              "Assigned trib slots occupied in parent OPU MSI";
-          }
-        }
-        case opucn {
-          leaf-list opucn-trib-slots {
-            type org-openroadm-otn-common-types:opucn-trib-slot-def;
-            description
-              "Specify the list of OPUCn 5G tributary slots in the form of
-               TS #A.B (G.709 Figure 20-9) in the case of provisioning the low
-                order ODUk to the parent server ODUCn";
-          }
-        }
-      }
-    }
-  }
-
-  grouping deg-threshold {
-    description
-      "Deg threshold grouping";
-    leaf degm-intervals {
-      type uint8 {
-        range "2 .. 10";
-      }
-      default "2";
-      description
-        "G.806 - Consecutive bad intervals required for declare dDEG";
-    }
-    leaf degthr-percentage {
-      type uint16 {
-        range "1 .. 10000";
-      }
-      default "100";
-      description
-        "Percentage of errored blocks required to declare an interval bad, in units of 0.01%";
-    }
-  }
-
-  grouping trail-trace-tx {
-    description
-      "Trail trace tx grouping";
-    leaf tx-sapi {
-      type string {
-        length "0 .. 15";
-      }
-      description
-        "The provisioned 15 character transmit trace SAPI. Implementations shall add the [0] field automatically per ITU-T G.709";
-    }
-    leaf tx-dapi {
-      type string {
-        length "0 .. 15";
-      }
-      description
-        "The provisioned 15 character transmit trace DAPI. Implementations shall add the [0] field automatically per ITU-T G.709";
-    }
-    leaf tx-operator {
-      type string {
-        length "0 .. 32";
-      }
-      description
-        "The provisioned 32 character Operator Specific field";
-    }
-  }
-
-  grouping trail-trace-other {
-    description
-      "Trail trace other grouping";
-    leaf expected-sapi {
-      type string {
-        length "0 .. 15";
-      }
-      description
-        "The provisioned expected SAPI, to be compared with accepted TTI";
-    }
-    leaf expected-dapi {
-      type string {
-        length "0 .. 15";
-      }
-      description
-        "The provisioned expected DAPI, to be compared with accepted TTI";
-    }
-    leaf tim-act-enabled {
-      type boolean;
-      default "false";
-      description
-        "Enables TTI Mismatch consequent actions.";
-    }
-    leaf tim-detect-mode {
-      type enumeration {
-        enum Disabled {
-          description
-            "TTI is ignored";
-        }
-        enum SAPI {
-          description
-            "Expected SAPI is compared to the Accepted TTI. Other TTI fields are ignored";
-        }
-        enum DAPI {
-          description
-            "Expected DAPI is compared to the Accepted TTI. Other TTI fields are ignored";
-        }
-        enum SAPI-and-DAPI {
-          description
-            "Expected SAPI and Expected DAPI are compared to the Accepted TTI. Operator specific TTI field is ignored";
-        }
-      }
-      default "Disabled";
-      description
-        "tim detect mode leaf";
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-equipment-types@2018-11-30.yang b/ordmodels/common/src/main/yang/org-openroadm-common-equipment-types@2018-11-30.yang
deleted file mode 100644 (file)
index 842d9b1..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-module org-openroadm-common-equipment-types {
-  namespace "http://org/openroadm/common-equipment-types";
-  prefix org-openroadm-common-equipment-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-
-  typedef optic-types {
-    type enumeration {
-      enum "gray" {
-        value 1;
-      }
-      enum "dwdm" {
-        value 2;
-      }
-    }
-  }
-
-  typedef equipment-type-enum {
-    type enumeration {
-      enum "other" {
-        value 1;
-      }
-      enum "powerSupply" {
-        value 2;
-      }
-      enum "shelfProcessor" {
-        value 3;
-      }
-      enum "crossConnect" {
-        value 4;
-      }
-      enum "fan" {
-        value 5;
-      }
-      enum "accessPanel" {
-        value 6;
-      }
-      enum "circuitPack" {
-        value 7;
-      }
-    }
-  }
-
-  grouping equipment-type {
-    leaf type {
-      type equipment-type-enum;
-      config false;
-      mandatory true;
-    }
-    leaf extension {
-      type string;
-      config false;
-      mandatory false;
-      description
-        "Populated with equipment type when enum value is set to 'other'";
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-equipment-types@2019-11-29.yang b/ordmodels/common/src/main/yang/org-openroadm-common-equipment-types@2019-11-29.yang
deleted file mode 100644 (file)
index f5189c3..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-module org-openroadm-common-equipment-types {
-  namespace "http://org/openroadm/common-equipment-types";
-  prefix org-openroadm-common-equipment-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-
-  typedef optic-types {
-    type enumeration {
-      enum gray {
-        value 1;
-      }
-      enum dwdm {
-        value 2;
-      }
-    }
-  }
-
-  typedef equipment-type-enum {
-    type enumeration {
-      enum other {
-        value 1;
-      }
-      enum powerSupply {
-        value 2;
-      }
-      enum shelfProcessor {
-        value 3;
-      }
-      enum crossConnect {
-        value 4;
-      }
-      enum fan {
-        value 5;
-      }
-      enum accessPanel {
-        value 6;
-      }
-      enum circuitPack {
-        value 7;
-      }
-    }
-  }
-
-  grouping equipment-type {
-    leaf type {
-      type equipment-type-enum;
-      config false;
-      mandatory true;
-    }
-    leaf extension {
-      type string;
-      config false;
-      mandatory false;
-      description
-        "Populated with equipment type when enum value is set to 'other'";
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-link-types@2018-11-30.yang b/ordmodels/common/src/main/yang/org-openroadm-common-link-types@2018-11-30.yang
deleted file mode 100644 (file)
index cd8c6ac..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-module org-openroadm-common-link-types {
-  namespace "http://org/openroadm/common-link-types";
-  prefix org-openroadm-common-link-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common link types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-
-  typedef power-dBm {
-    type decimal64 {
-      fraction-digits 2;
-    }
-    units "dBm";
-    description
-      "Power value in dBm.";
-  }
-
-  typedef ratio-dB {
-    type decimal64 {
-      fraction-digits 3;
-    }
-    units "dB";
-    description
-      "Power ratio in dB.";
-  }
-
-  typedef fiber-pmd {
-    type decimal64 {
-      fraction-digits 2;
-    }
-    units "ps/(km[1/2])";
-    description
-      "Polarization Mode Dispersion expressed in ps/km(1/2).";
-  }
-
-  typedef optical-control-mode {
-    type enumeration {
-      enum "power" {
-        value 1;
-      }
-      enum "gainLoss" {
-        value 2;
-      }
-      enum "off" {
-        value 3;
-      }
-    }
-    description
-      "Optical Control Mode: identifies specific algorithm related to power management and general optical control.";
-    reference "openroadm.org: Open ROADM MSA Specification.";
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-link-types@2019-11-29.yang b/ordmodels/common/src/main/yang/org-openroadm-common-link-types@2019-11-29.yang
deleted file mode 100644 (file)
index 25bc8fb..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-module org-openroadm-common-link-types {
-  namespace "http://org/openroadm/common-link-types";
-  prefix org-openroadm-common-link-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common link types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-
-  typedef power-dBm {
-    type decimal64 {
-      fraction-digits 2;
-    }
-    units "dBm";
-    description
-      "Power value in dBm.";
-  }
-
-  typedef ratio-dB {
-    type decimal64 {
-      fraction-digits 3;
-    }
-    units "dB";
-    description
-      "Power ratio in dB.";
-  }
-
-  typedef fiber-pmd {
-    type decimal64 {
-      fraction-digits 2;
-    }
-    units "ps/(km[1/2])";
-    description
-      "Polarization Mode Dispersion expressed in ps/km(1/2).";
-  }
-
-  typedef optical-control-mode {
-    type enumeration {
-      enum power {
-        value 1;
-      }
-      enum gainLoss {
-        value 2;
-      }
-      enum off {
-        value 3;
-      }
-    }
-    description
-      "Optical Control Mode: identifies specific algorithm related to power management and general optical control.";
-    reference
-      "openroadm.org: Open ROADM MSA Specification.";
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-node-types@2018-11-30.yang b/ordmodels/common/src/main/yang/org-openroadm-common-node-types@2018-11-30.yang
deleted file mode 100644 (file)
index 2079c03..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-module org-openroadm-common-node-types {
-  namespace "http://org/openroadm/common-node-types";
-  prefix org-openroadm-common-node-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common node types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-
-  typedef node-id-type {
-    type string {
-      length "7..63";
-      pattern "([a-zA-Z][a-zA-Z0-9-]{5,61}[a-zA-Z0-9])" {
-        error-message
-          "A node-id must be 7 to 63 characters in length.
-           A node-id can contain letters, numbers, and hyphens.
-           The first character must be a letter.
-           The last character must be a letter or number.";
-      }
-    }
-    description
-      "Globally unique identifier for a device.";
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-node-types@2019-11-29.yang b/ordmodels/common/src/main/yang/org-openroadm-common-node-types@2019-11-29.yang
deleted file mode 100644 (file)
index d8a914b..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-module org-openroadm-common-node-types {
-  namespace "http://org/openroadm/common-node-types";
-  prefix org-openroadm-common-node-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common node types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-
-  typedef node-id-type {
-    type string {
-      length "7..63";
-      pattern '([a-zA-Z][a-zA-Z0-9-]{5,61}[a-zA-Z0-9])' {
-        error-message
-          "A node-id must be 7 to 63 characters in length.
-           A node-id can contain letters, numbers, and hyphens.
-           The first character must be a letter.
-           The last character must be a letter or number.";
-      }
-    }
-    description
-      "Globally unique identifier for a device.";
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-node-types@2021-05-28.yang b/ordmodels/common/src/main/yang/org-openroadm-common-node-types@2021-05-28.yang
deleted file mode 100644 (file)
index 9812e68..0000000
+++ /dev/null
@@ -1,162 +0,0 @@
-module org-openroadm-common-node-types {
-  namespace "http://org/openroadm/common-node-types";
-  prefix org-openroadm-common-node-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common node types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2021-05-28 {
-    description
-      "Version 9.1";
-  }
-  revision 2020-12-11 {
-    description
-      "Version 8.1";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-
-  typedef node-types {
-    type enumeration {
-      enum rdm {
-        value 1;
-      }
-      enum xpdr {
-        value 2;
-      }
-      enum ila {
-        value 3;
-      }
-      enum extplug {
-        value 4;
-      }
-    }
-    description
-      "Identifier for node type
-       1. rdm for ROADM
-       2. xpdr for Transponder, Regen
-       3. ila for in-line amplifier
-       4. extplug for external pluggable";
-  }
-
-  typedef node-subtypes {
-    type enumeration {
-      enum none {
-        value 1;
-        description
-          "The none-enum indicates there is no node-subtype refinement. 
-           Standard OpenROADM node properties apply in this case. If an 
-           optional-leaf of node-subtypes is not present, the behaviour is the 
-           same as the none-enum.";
-      }
-      enum edge-optical-spec {
-        value 2;
-        description
-          "This enum refines a ROADM node-type. It indicates that node conforms 
-           to edge optical specifications as defined in the OpenROADM MSA 
-           Specification: MW-MW(Edge), MW-Wr(Edge), and Local Control (Edge).";
-      }
-    }
-    description
-      "Identifier for node-subtype. Provides refinement of node-type.";
-  }
-
-  typedef xpdr-node-types {
-    type enumeration {
-      enum tpdr {
-        value 1;
-      }
-      enum mpdr {
-        value 2;
-      }
-      enum switch {
-        value 3;
-      }
-      enum regen {
-        value 4;
-      }
-      enum regen-uni {
-        value 5;
-      }
-    }
-    description
-      "Identifier for Xponder node type
-       1. Transponder
-       2. Muxponder
-       3. OTN switchponder
-       4. Regenerator
-       5. Regenerator based on unidirectional model
-
-       Xponder types are modeled in one of two ways:
-
-       Type 1: The xponder ports are configured with port-qual of xpdr-client or
-xpdr-network, the xponder connectivity is advertised using connection-map, and
-no explicit cross connects are provisioned.
-
-       Type 2: The xponder ports are configured with port-qual of switch-network
-or switch-client, the connectivity is advertised using switching-pool, and
-explicit cross connects are provisioned.
-
-       Type 1 applies to transponders, unidirectional regenerators, and bidirectional regenerators.
-       Type 2 applies to muxponders and switchponders.";
-  }
-
-  typedef node-id-type {
-    type string {
-      length "7..63";
-      pattern '([a-zA-Z][a-zA-Z0-9-]{5,61}[a-zA-Z0-9])' {
-        error-message
-          "A node-id must be 7 to 63 characters in length.
-           A node-id can contain letters, numbers, and hyphens.
-           The first character must be a letter.
-           The last character must be a letter or number.";
-      }
-    }
-    description
-      "Globally unique identifier for a device.";
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-optical-channel-types@2018-11-30.yang b/ordmodels/common/src/main/yang/org-openroadm-common-optical-channel-types@2018-11-30.yang
deleted file mode 100644 (file)
index 2a3d461..0000000
+++ /dev/null
@@ -1,286 +0,0 @@
-module org-openroadm-common-optical-channel-types {
-  namespace "http://org/openroadm/common-optical-channel-types";
-  prefix org-openroadm-common-optical-channel-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common optical channel types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-
-  identity och-rate-identity {
-    description
-      "A unique och rate identification";
-  }
-
-  identity otsi-rate-identity {
-    description
-      "A unique OTSi rate identification";
-  }
-
-  identity fec-identity {
-    description
-      "A unique FEC identification";
-  }
-
-  identity sc-fec {
-    base fec-identity;
-    description
-      "Staircase FEC identification";
-  }
-
-  identity rs-fec {
-    base fec-identity;
-    description
-      "Reed Solomon FEC identification";
-  }
-
-  identity o-fec {
-    base fec-identity;
-    description
-      "OpenROADM FEC identification";
-  }
-
-  identity foic-identity {
-    description
-      "A unique FOICx.k identification (G.709.3 FlexO-LR and
-       G.709.1 FlexO-SR)";
-  }
-
-  identity flexo-otsi-rate-identity {
-    description
-      "A unique rate identification. Applicable to specify OTSi rate. Also
-       applicable to FOIC rate when associated with FlexO processing
-       (G.709.3 FlexO-LR Table 11-2, G.709.1 FlexO-SR clause 9.2.2
-        Table 11-1, 12-1, 13-1) and G.Sup58.";
-  }
-
-  identity foic1.2 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.Sup58";
-  }
-
-  identity foic1.4 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.709.1 and G.709.3";
-  }
-
-  identity foic2.4 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.709.1";
-  }
-
-  identity foic2.8 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.Sup58";
-  }
-
-  identity foic3.6 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in future";
-  }
-
-  identity foic4.8 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.709.1";
-  }
-
-  identity foic4.16 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.Sup58";
-  }
-
-  identity R400G-flexo-otsi {
-    base flexo-otsi-rate-identity;
-    description
-      "Applicable instance for flexo/otsi rate identity";
-  }
-
-  identity R200G-flexo-otsi {
-    base flexo-otsi-rate-identity;
-    description
-      "Applicable instance for flexo/otsi rate identity";
-  }
-
-  identity R200G {
-    base och-rate-identity;
-    description
-      "Identity for 200G Rate";
-  }
-
-  identity R100G-flexo-otsi {
-    base flexo-otsi-rate-identity;
-    description
-      "Applicable instance for otsi/flexo rate identity";
-  }
-
-  identity R100G {
-    base och-rate-identity;
-    description
-      "Identity for 100G Rate";
-  }
-
-  identity R56G-foic-otsi {
-    base flexo-otsi-rate-identity;
-    description
-      "Applicable instance for otsi rate identity";
-  }
-
-  identity R28G-foic-otsi {
-    base flexo-otsi-rate-identity;
-    description
-      "Applicable instance for otsi rate identity";
-  }
-
-  identity R10.7G {
-    base och-rate-identity;
-    description
-      "Identity for 10.7G Rate";
-  }
-
-  identity R11.1G {
-    base och-rate-identity;
-    description
-      "Identity for 11.1G Rate";
-  }
-
-  typedef frequency-THz {
-    type decimal64 {
-      fraction-digits 8;
-    }
-    units "THz";
-    description
-      "Frequency value in THz.";
-  }
-
-  typedef frequency-GHz {
-    type decimal64 {
-      fraction-digits 5;
-    }
-    units "GHz";
-    description
-      "Frequency value in GHz.";
-  }
-
-  typedef wavelength-duplication-type {
-    type enumeration {
-      enum "one-per-srg" {
-        value 1;
-        description
-          "The SRG cannot handle wavelength duplication. Attempting to provision a connection on this SRG that uses the same wavelength as an existing service will result in failure.";
-      }
-      enum "one-per-degree" {
-        value 2;
-        description
-          "The SRG can handle wavelength duplication, but only one per degree. Attempting to provision a connection on this SRG that uses the same wavelength as an existing service will succeed, so long as the connections are not using the same degree.";
-      }
-    }
-    description
-      "One per srg is applied to C/D add/drop group
-       one per degree is applied to C/D/C add drop group";
-  }
-
-  typedef modulation-format {
-    type enumeration {
-      enum "bpsk" {
-        value 0;
-        description
-          "binary phase-shift keying";
-      }
-      enum "dc-dp-bpsk" {
-        value 1;
-        description
-          "DC dual-polarization binary phase-shift keying";
-      }
-      enum "qpsk" {
-        value 2;
-        description
-          "quadrature phase-shift keying";
-      }
-      enum "dp-qpsk" {
-        value 3;
-        description
-          "dual-polarization binary phase-shift keying";
-      }
-      enum "qam16" {
-        value 4;
-        description
-          "quadrature amplitude modulation 16";
-      }
-      enum "dp-qam16" {
-        value 5;
-        description
-          "dual-polarization quadrature amplitude modulation 16";
-      }
-      enum "dc-dp-qam16" {
-        value 6;
-        description
-          "DC dual-polarization quadrature amplitude modulation 16";
-      }
-      enum "qam8" {
-        value 7;
-        description
-          "quadrature amplitude modulation 8";
-      }
-      enum "dp-qam8" {
-        value 8;
-        description
-          "dual-polarization quadrature amplitude modulation 8";
-      }
-      enum "dc-dp-qam8" {
-        value 9;
-        description
-          "DC dual-polarization quadrature amplitude modulation 8";
-      }
-    }
-    description
-      "Modulation format";
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-optical-channel-types@2019-03-29.yang b/ordmodels/common/src/main/yang/org-openroadm-common-optical-channel-types@2019-03-29.yang
deleted file mode 100644 (file)
index 85698fe..0000000
+++ /dev/null
@@ -1,298 +0,0 @@
-module org-openroadm-common-optical-channel-types {
-  namespace "http://org/openroadm/common-optical-channel-types";
-  prefix org-openroadm-common-optical-channel-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common optical channel types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-
-  identity och-rate-identity {
-    description
-      "A unique och rate identification";
-  }
-
-  identity otsi-rate-identity {
-    description
-      "A unique OTSi rate identification";
-  }
-
-  identity fec-identity {
-    description
-      "A unique FEC identification";
-  }
-
-  identity sc-fec {
-    base fec-identity;
-    description
-      "Staircase FEC identification";
-  }
-
-  identity rs-fec {
-    base fec-identity;
-    description
-      "Reed Solomon FEC identification";
-  }
-
-  identity o-fec {
-    base fec-identity;
-    description
-      "OpenROADM FEC identification";
-  }
-
-  identity foic-identity {
-    description
-      "A unique FOICx.k identification (G.709.3 FlexO-LR and
-       G.709.1 FlexO-SR)";
-  }
-
-  identity flexo-otsi-rate-identity {
-    description
-      "A unique rate identification. Applicable to specify OTSi rate. Also
-       applicable to FOIC rate when associated with FlexO processing
-       (G.709.3 FlexO-LR Table 11-2, G.709.1 FlexO-SR clause 9.2.2
-        Table 11-1, 12-1, 13-1) and G.Sup58.";
-  }
-
-  identity foic1.2 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.Sup58";
-  }
-
-  identity foic1.4 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.709.1 and G.709.3";
-  }
-
-  identity foic2.4 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.709.1";
-  }
-
-  identity foic2.8 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.Sup58";
-  }
-
-  identity foic3.6 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in future";
-  }
-
-  identity foic4.8 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.709.1";
-  }
-
-  identity foic4.16 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.Sup58";
-  }
-
-  identity R400G-flexo-otsi {
-    base flexo-otsi-rate-identity;
-    description
-      "Applicable instance for flexo/otsi rate identity";
-  }
-
-  identity R200G-flexo-otsi {
-    base flexo-otsi-rate-identity;
-    description
-      "Applicable instance for flexo/otsi rate identity";
-  }
-
-  identity R200G {
-    base och-rate-identity;
-    description
-      "Identity for 200G Rate";
-  }
-
-  identity R100G-flexo-otsi {
-    base flexo-otsi-rate-identity;
-    description
-      "Applicable instance for otsi/flexo rate identity";
-  }
-
-  identity R100G {
-    base och-rate-identity;
-    description
-      "Identity for 100G Rate";
-  }
-
-  identity R56G-foic-otsi {
-    base flexo-otsi-rate-identity;
-    description
-      "Applicable instance for otsi rate identity";
-  }
-
-  identity R28G-foic-otsi {
-    base flexo-otsi-rate-identity;
-    description
-      "Applicable instance for otsi rate identity";
-  }
-
-  identity R10.7G {
-    base och-rate-identity;
-    description
-      "Identity for 10.7G Rate";
-  }
-
-  identity R11.1G {
-    base och-rate-identity;
-    description
-      "Identity for 11.1G Rate";
-  }
-
-  typedef frequency-THz {
-    type decimal64 {
-      fraction-digits 8;
-    }
-    units "THz";
-    description
-      "Frequency value in THz.";
-  }
-
-  typedef frequency-GHz {
-    type decimal64 {
-      fraction-digits 5;
-    }
-    units "GHz";
-    description
-      "Frequency value in GHz.";
-  }
-
-  typedef wavelength-duplication-type {
-    type enumeration {
-      enum "one-per-srg" {
-        value 1;
-        description
-          "The SRG cannot handle wavelength duplication. Attempting to provision a connection on this SRG that uses the same wavelength as an existing service will result in failure.";
-      }
-      enum "one-per-degree" {
-        value 2;
-        description
-          "The SRG can handle wavelength duplication, but only one per degree. Attempting to provision a connection on this SRG that uses the same wavelength as an existing service will succeed, so long as the connections are not using the same degree.";
-      }
-    }
-    description
-      "One per srg is applied to C/D add/drop group
-       one per degree is applied to C/D/C add drop group";
-  }
-
-  typedef modulation-format {
-    type enumeration {
-      enum "bpsk" {
-        value 0;
-        description
-          "binary phase-shift keying";
-      }
-      enum "dc-dp-bpsk" {
-        value 1;
-        description
-          "DC dual-polarization binary phase-shift keying";
-      }
-      enum "qpsk" {
-        value 2;
-        description
-          "quadrature phase-shift keying";
-      }
-      enum "dp-qpsk" {
-        value 3;
-        description
-          "dual-polarization binary phase-shift keying";
-      }
-      enum "qam16" {
-        value 4;
-        description
-          "quadrature amplitude modulation 16";
-      }
-      enum "dp-qam16" {
-        value 5;
-        description
-          "dual-polarization quadrature amplitude modulation 16";
-      }
-      enum "dc-dp-qam16" {
-        value 6;
-        description
-          "DC dual-polarization quadrature amplitude modulation 16";
-      }
-      enum "qam8" {
-        value 7;
-        description
-          "quadrature amplitude modulation 8";
-      }
-      enum "dp-qam8" {
-        value 8;
-        description
-          "dual-polarization quadrature amplitude modulation 8";
-      }
-      enum "dc-dp-qam8" {
-        value 9;
-        description
-          "DC dual-polarization quadrature amplitude modulation 8";
-      }
-    }
-    description
-      "Modulation format";
-  }
-  typedef provision-mode-type {
-    type enumeration {
-      enum "explicit";
-      enum "profile";
-    }
-    description
-      "Provision Mode Type On Optical Channel";
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-optical-channel-types@2020-05-29.yang b/ordmodels/common/src/main/yang/org-openroadm-common-optical-channel-types@2020-05-29.yang
deleted file mode 100644 (file)
index 3fc027b..0000000
+++ /dev/null
@@ -1,297 +0,0 @@
-module org-openroadm-common-optical-channel-types {
-  namespace "http://org/openroadm/common-optical-channel-types";
-  prefix org-openroadm-common-optical-channel-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common optical channel types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-
-  identity optical-rate-identity {
-    description
-      "base for otsi and och idenity";
-  }
-
-  identity och-rate-identity {
-    base optical-rate-identity;
-    description
-      "A unique och rate identification";
-  }
-
-  identity otsi-rate-identity {
-    base optical-rate-identity;
-    description
-      "A unique OTSi rate identification";
-  }
-
-  identity foic-identity {
-    description
-      "A unique FOICx.k identification (G.709.3 FlexO-LR and
-       G.709.1 FlexO-SR)";
-  }
-
-  identity foic1.2 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.Sup58";
-  }
-
-  identity foic1.4 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.709.1 and G.709.3";
-  }
-
-  identity foic2.4 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.709.1";
-  }
-
-  identity foic2.8 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.Sup58";
-  }
-
-  identity foic3.6 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in future";
-  }
-
-  identity foic4.8 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.709.1";
-  }
-
-  identity foic4.16 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.Sup58";
-  }
-
-  identity R400G-otsi {
-    base otsi-rate-identity;
-    description
-      "Applicable instance for otsi rate identity";
-  }
-
-  identity R300G-otsi {
-    base otsi-rate-identity;
-    description
-      "Applicable instance for otsi rate identity";
-  }
-
-  identity R200G-otsi {
-    base otsi-rate-identity;
-    description
-      "Applicable instance for otsi rate identity";
-  }
-
-  identity R200G {
-    base och-rate-identity;
-    description
-      "Identity for 200G Rate";
-  }
-
-  identity R100G-otsi {
-    base otsi-rate-identity;
-    description
-      "Applicable instance for otsi rate identity";
-  }
-
-  identity R100G {
-    base och-rate-identity;
-    description
-      "Identity for 100G Rate";
-  }
-
-  identity R56G-foic-otsi {
-    base otsi-rate-identity;
-    description
-      "Applicable instance for otsi rate identity";
-  }
-
-  identity R28G-foic-otsi {
-    base otsi-rate-identity;
-    description
-      "Applicable instance for otsi rate identity";
-  }
-
-  identity R10.7G {
-    base och-rate-identity;
-    description
-      "Identity for 10.7G Rate";
-  }
-
-  identity R11.1G {
-    base och-rate-identity;
-    description
-      "Identity for 11.1G Rate";
-  }
-
-  typedef frequency-THz {
-    type decimal64 {
-      fraction-digits 8;
-    }
-    units "THz";
-    description
-      "Frequency value in THz.";
-  }
-
-  typedef frequency-GHz {
-    type decimal64 {
-      fraction-digits 5;
-    }
-    units "GHz";
-    description
-      "Frequency value in GHz.";
-  }
-
-  typedef wavelength-duplication-type {
-    type enumeration {
-      enum one-per-srg {
-        value 1;
-        description
-          "The SRG cannot handle wavelength duplication. Attempting to provision a connection on this SRG that uses the same wavelength as an existing service will result in failure.";
-      }
-      enum one-per-degree {
-        value 2;
-        description
-          "The SRG can handle wavelength duplication, but only one per degree. Attempting to provision a connection on this SRG that uses the same wavelength as an existing service will succeed, so long as the connections are not using the same degree.";
-      }
-    }
-    description
-      "One per srg is applied to C/D add/drop group
-       one per degree is applied to C/D/C add drop group";
-  }
-
-  typedef modulation-format {
-    type enumeration {
-      enum bpsk {
-        value 0;
-        description
-          "binary phase-shift keying";
-      }
-      enum dc-dp-bpsk {
-        value 1;
-        description
-          "DC dual-polarization binary phase-shift keying";
-      }
-      enum qpsk {
-        value 2;
-        description
-          "quadrature phase-shift keying";
-      }
-      enum dp-qpsk {
-        value 3;
-        description
-          "dual-polarization binary phase-shift keying";
-      }
-      enum qam16 {
-        value 4;
-        description
-          "quadrature amplitude modulation 16";
-      }
-      enum dp-qam16 {
-        value 5;
-        description
-          "dual-polarization quadrature amplitude modulation 16";
-      }
-      enum dc-dp-qam16 {
-        value 6;
-        description
-          "DC dual-polarization quadrature amplitude modulation 16";
-      }
-      enum qam8 {
-        value 7;
-        description
-          "quadrature amplitude modulation 8";
-      }
-      enum dp-qam8 {
-        value 8;
-        description
-          "dual-polarization quadrature amplitude modulation 8";
-      }
-      enum dc-dp-qam8 {
-        value 9;
-        description
-          "DC dual-polarization quadrature amplitude modulation 8";
-      }
-    }
-    description
-      "Modulation format";
-  }
-
-  typedef provision-mode-type {
-    type enumeration {
-      enum explicit;
-      enum profile;
-    }
-    description
-      "Provision Mode Type On Optical Channel";
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-optical-channel-types@2021-12-10.yang b/ordmodels/common/src/main/yang/org-openroadm-common-optical-channel-types@2021-12-10.yang
deleted file mode 100644 (file)
index 39f3061..0000000
+++ /dev/null
@@ -1,331 +0,0 @@
-module org-openroadm-common-optical-channel-types {
-  namespace "http://org/openroadm/common-optical-channel-types";
-  prefix org-openroadm-common-optical-channel-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common optical channel types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2021-12-10 {
-    description
-      "Version 10.1";
-  }
-  revision 2021-09-24 {
-    description
-      "Version 10.0";
-  }
-  revision 2021-03-26 {
-    description
-      "Version 9.0";
-  }
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-
-  identity optical-rate-identity {
-    description
-      "base for otsi and och idenity";
-  }
-
-  identity och-rate-identity {
-    base optical-rate-identity;
-    description
-      "A unique och rate identification";
-  }
-
-  identity otsi-rate-identity {
-    base optical-rate-identity;
-    description
-      "A unique OTSi rate identification";
-  }
-
-  identity foic-identity {
-    description
-      "A unique FOICx.k identification (G.709.3 FlexO-LR and
-       G.709.1 FlexO-SR)";
-  }
-
-  identity foic1.1 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.Sup58 2020-09";
-  }
-
-  identity foic1.2 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.Sup58";
-  }
-
-  identity foic1.4 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.709.1 and G.709.3";
-  }
-
-  identity foic2.4 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.709.1";
-  }
-
-  identity foic2.8 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.Sup58";
-  }
-
-  identity foic3.6 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in future";
-  }
-
-  identity foic4.8 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.709.1";
-  }
-
-  identity foic4.16 {
-    base foic-identity;
-    description
-      "Applicable to the FlexO type defined in G.Sup58";
-  }
-
-  identity R400G-otsi {
-    base otsi-rate-identity;
-    description
-      "Applicable instance for otsi rate identity";
-  }
-
-  identity R300G-otsi {
-    base otsi-rate-identity;
-    description
-      "Applicable instance for otsi rate identity";
-  }
-
-  identity R200G-otsi {
-    base otsi-rate-identity;
-    description
-      "Applicable instance for otsi rate identity";
-  }
-
-  identity R200G {
-    base och-rate-identity;
-    description
-      "Identity for 200G Rate";
-  }
-
-  identity R100G-otsi {
-    base otsi-rate-identity;
-    description
-      "Applicable instance for otsi rate identity";
-  }
-
-  identity R100G {
-    base och-rate-identity;
-    description
-      "Identity for 100G Rate";
-  }
-
-  identity R56G-foic-otsi {
-    base otsi-rate-identity;
-    description
-      "Applicable instance for otsi rate identity";
-  }
-
-  identity R28G-foic-otsi {
-    base otsi-rate-identity;
-    description
-      "Applicable instance for otsi rate identity";
-  }
-
-  identity R10.7G {
-    base och-rate-identity;
-    description
-      "Identity for 10.7G Rate";
-  }
-
-  identity R11.1G {
-    base och-rate-identity;
-    description
-      "Identity for 11.1G Rate";
-  }
-
-  typedef frequency-THz {
-    type decimal64 {
-      fraction-digits 8;
-    }
-    units "THz";
-    description
-      "Frequency value in THz.";
-  }
-
-  typedef frequency-GHz {
-    type decimal64 {
-      fraction-digits 5;
-    }
-    units "GHz";
-    description
-      "Frequency value in GHz.";
-  }
-
-  typedef wavelength-duplication-type {
-    type enumeration {
-      enum one-per-srg {
-        value 1;
-        description
-          "The SRG cannot handle wavelength duplication. Attempting to provision a connection on this SRG that uses the same wavelength as an existing service will result in failure.";
-      }
-      enum one-per-degree {
-        value 2;
-        description
-          "The SRG can handle wavelength duplication, but only one per degree. Attempting to provision a connection on this SRG that uses the same wavelength as an existing service will succeed, so long as the connections are not using the same degree.";
-      }
-    }
-    description
-      "One per srg is applied to C/D add/drop group
-       one per degree is applied to C/D/C add drop group";
-  }
-
-  typedef modulation-format {
-    type enumeration {
-      enum bpsk {
-        value 0;
-        description
-          "binary phase-shift keying";
-      }
-      enum dc-dp-bpsk {
-        value 1;
-        description
-          "DC dual-polarization binary phase-shift keying";
-      }
-      enum qpsk {
-        value 2;
-        description
-          "quadrature phase-shift keying";
-      }
-      enum dp-qpsk {
-        value 3;
-        description
-          "dual-polarization quadrature phase-shift keying";
-      }
-      enum qam16 {
-        value 4;
-        description
-          "quadrature amplitude modulation 16";
-      }
-      enum dp-qam16 {
-        value 5;
-        description
-          "dual-polarization quadrature amplitude modulation 16";
-      }
-      enum dc-dp-qam16 {
-        value 6;
-        description
-          "DC dual-polarization quadrature amplitude modulation 16";
-      }
-      enum qam8 {
-        value 7;
-        description
-          "quadrature amplitude modulation 8";
-      }
-      enum dp-qam8 {
-        value 8;
-        description
-          "dual-polarization quadrature amplitude modulation 8";
-      }
-      enum dc-dp-qam8 {
-        value 9;
-        description
-          "DC dual-polarization quadrature amplitude modulation 8";
-      }
-    }
-    description
-      "Modulation format";
-  }
-
-  typedef provision-mode-type {
-    type enumeration {
-      enum explicit;
-      enum profile;
-    }
-    description
-      "Provision Mode Type On Optical Channel";
-  }
-  
-  grouping full-bandwidth-grouping {
-    leaf full-bandwidth-at-3dB {
-      type org-openroadm-common-optical-channel-types:frequency-GHz;
-      description
-        "Signal full bandwidth at 3dB below the peak. Information used to model signal’s spectral shape.";
-      config false;
-    }
-    leaf full-bandwidth-at-10dB {
-      type org-openroadm-common-optical-channel-types:frequency-GHz;
-      description
-        "Signal full bandwidth at 10dB below the peak. Information used to model signal’s spectral shape.";
-      config false;
-    }
-  }
-
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-phy-codes@2021-05-28.yang b/ordmodels/common/src/main/yang/org-openroadm-common-phy-codes@2021-05-28.yang
deleted file mode 100644 (file)
index b3b7ff2..0000000
+++ /dev/null
@@ -1,327 +0,0 @@
-module org-openroadm-common-phy-codes {
-  namespace "http://org/openroadm/common-phy-codes";
-  prefix org-openroadm-common-phy-codes;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2021-05-28 {
-    description
-        "Version 9.1";
-    }
-
-  identity compliance-code-identity {
-    description
-      "Base identity for reporting pluggable compliance codes per port.";
-  }
-
-  identity phy-code-none {
-    base compliance-code-identity;
-    description
-      "Used to report that no OpenROADM codes are supported.";
-  }
-
-  // BEGIN section for client phy code entities
-  
-  // Parent identity
-  identity client-phy-code-identity {
-    description
-      "base identity for client phy code.";
-  }
-
-  // IEEE 802.3 - 2018 PHY/PMD Names (subset)
-  identity ethernet-1000BASE-SX {
-    base client-phy-code-identity;
-  }
-  identity ethernet-1000BASE-LX {
-    base client-phy-code-identity;
-  }
-  identity ethernet-10GBASE-SR {
-    base client-phy-code-identity;
-  }
-  identity ethernet-10GBASE-LR {
-    base client-phy-code-identity;
-  }
-  identity ethernet-10GBASE-ER {
-    base client-phy-code-identity;
-  }
-  identity ethernet-10GBASE-SW {
-    base client-phy-code-identity;
-  }
-  identity ethernet-10GBASE-LW {
-    base client-phy-code-identity;
-  }
-  identity ethernet-10GBASE-EW {
-    base client-phy-code-identity;
-  }
-  identity ethernet-25GBASE-SR {
-    base client-phy-code-identity;
-  }
-  identity ethernet-25GBASE-LR {
-    base client-phy-code-identity;
-  }
-  identity ethernet-25GBASE-ER {
-    base client-phy-code-identity;
-  }
-  identity ethernet-25GBASE-CR {
-    base client-phy-code-identity;
-  }
-  identity ethernet-25GBASE-CR-S {
-    base client-phy-code-identity;
-  }
-  identity ethernet-25GBASE-KR {
-    base client-phy-code-identity;
-  }
-  identity ethernet-25GBASE-KR-S {
-    base client-phy-code-identity;
-  }
-  identity ethernet-40GBASE-SR4 {
-    base client-phy-code-identity;
-  }
-  identity ethernet-40GBASE-LR4 {
-    base client-phy-code-identity;
-  }
-  identity ethernet-40GBASE-ER4 {
-    base client-phy-code-identity;
-  }
-  identity ethernet-40GBASE-FR {
-    base client-phy-code-identity;
-  }
-  identity ethernet-40GBASE-T {
-    base client-phy-code-identity;
-  }  
-  identity ethernet-40GBASE-KR4 {
-    base client-phy-code-identity;
-  }
-  identity ethernet-50GBASE-SR {
-    base client-phy-code-identity;
-  }
-  identity ethernet-50GBASE-FR {
-    base client-phy-code-identity;
-  }
-  identity ethernet-50GBASE-LR {
-    base client-phy-code-identity;
-  }
-  identity ethernet-50GBASE-KR {
-    base client-phy-code-identity;
-  }
-  identity ethernet-50GBASE-CR {
-    base client-phy-code-identity;
-  }
-  identity ethernet-100GBASE-CR2 {
-    base client-phy-code-identity;
-  }
-  identity ethernet-100GBASE-KR2 {
-    base client-phy-code-identity;
-  }
-  identity ethernet-100GBASE-SR10 {
-    base client-phy-code-identity;
-  }
-  identity ethernet-100GBASE-SR4 {
-    base client-phy-code-identity;
-  }
-  identity ethernet-100GBASE-LR4 {
-    base client-phy-code-identity;
-  }
-  identity ethernet-100GBASE-ER4 {
-    base client-phy-code-identity;
-  }
-  identity ethernet-100GBASE-SR2 {
-    base client-phy-code-identity;
-  }
-  identity ethernet-100GBASE-DR {
-    base client-phy-code-identity;
-  }  
-  identity ethernet-100GBASE-CR4 {
-    base client-phy-code-identity;
-  }
-  identity ethernet-100GBASE-KP4 {
-    base client-phy-code-identity;
-  }
-  identity ethernet-100GBASE-KR4 {
-    base client-phy-code-identity;
-  }
-  identity ethernet-200GBASE-SR4 {
-    base client-phy-code-identity;
-  }
-  identity ethernet-200GBASE-DR4 {
-    base client-phy-code-identity;
-  }
-  identity ethernet-200GBASE-FR4 {
-    base client-phy-code-identity;
-  }
-  identity ethernet-200GBASE-LR4 {
-    base client-phy-code-identity;
-  }
-  identity ethernet-400GBASE-SR16 {
-    base client-phy-code-identity;
-  }
-  identity ethernet-400GBASE-DR4 {
-    base client-phy-code-identity;
-  }
-  identity ethernet-400GBASE-FR8 {
-    base client-phy-code-identity;
-  }
-  identity ethernet-400GBASE-LR8 {
-    base client-phy-code-identity;
-  }
-
-
-  // Common names not defined in IEEE 802.3
-  identity ethernet-1000BASE-EX {
-    base client-phy-code-identity;
-  }
-  identity ethernet-1000BASE-ZX {
-    base client-phy-code-identity;
-  }
-  identity ethernet-10GBASE-ZR {
-    base client-phy-code-identity;
-  }
-  identity ethernet-10GBASE-ZW {
-    base client-phy-code-identity;
-  }
-  identity ethernet-40GQSFP-PSM4 {
-    base client-phy-code-identity;
-  }
-
-
-  // http://psm4.org 
-  identity ethernet-100G-PSM4 {
-    base client-phy-code-identity;
-  }
-
-
-  // http://www.cwdm4-msa.org/
-  identity ethernet-100GE-CWDM4 {
-    base client-phy-code-identity;
-  }
-  identity ethernet-100GE-4WDM-10 {
-    base client-phy-code-identity;
-  }
-
-
-
-  // http://100glambda.com/
-  identity ethernet-100G-FR {
-    base client-phy-code-identity;
-  }
-  identity ethernet-100G-LR {
-    base client-phy-code-identity;
-  }
-  identity ethernet-400G-FR4 {
-    base client-phy-code-identity;
-  }
-
-
-  // ITU-T G.959.1 - 2018 */
-  identity otn-P1I1-1D1 {
-    base client-phy-code-identity;
-  }
-  identity otn-P1S1-1D1 {
-    base client-phy-code-identity;
-  }
-  identity otn-P1L1-1D1 {
-    base client-phy-code-identity;
-  }
-  identity otn-P1L1-1D2 {
-    base client-phy-code-identity;
-  }
-  identity otn-P1I1-2D1 {
-    base client-phy-code-identity;
-  }
-  identity otn-P1I1-2D2 {
-    base client-phy-code-identity;
-  }
-  identity otn-P1S1-2D1 {
-    base client-phy-code-identity;
-  }
-  identity otn-P1S1-2D2a {
-    base client-phy-code-identity;
-  }
-  identity otn-P1S1-2D2b {
-    base client-phy-code-identity;
-  }
-  identity otn-1S1-2D2bF {
-    base client-phy-code-identity;
-  }
-  identity otn-P1L1-2D1 {
-    base client-phy-code-identity;
-  }
-  identity otn-P1L1-2D2 {
-    base client-phy-code-identity;
-  }
-  identity otn-1L1-2D2F {
-    base client-phy-code-identity;
-  }
-  identity otn-P1L1-2D2E {
-    base client-phy-code-identity;
-  }
-  identity otn-1L1-2D2FE {
-    base client-phy-code-identity;
-  }
-  identity otn-C4S1-2D1 {
-    base client-phy-code-identity;
-  }
-  identity otn-1I1-3D1F {
-    base client-phy-code-identity;
-  }
-  identity otn-8R1-4D1F {
-    base client-phy-code-identity;
-  }
-  identity otn-4I1-9D1F {
-    base client-phy-code-identity;
-  }
-  identity otn-4L1-9C1F {
-    base client-phy-code-identity;
-  }
-  identity otn-4L1-9D1F {
-    base client-phy-code-identity;
-  }
-  identity otn-4I1-4D1F {
-    base client-phy-code-identity;
-  }
-  identity otn-8I1-4D1F {
-    base client-phy-code-identity;
-  }
-
-  typedef compliance-codes-union {
-    type union {
-      type identityref { base client-phy-code-identity; }
-      type identityref { base compliance-code-identity; }
-    }
-    default "org-openroadm-common-phy-codes:phy-code-none";
-    description
-      "Compliance codes supported in OpenROADM.";
-  }
-  // END section for client phy code entities
-}
\ No newline at end of file
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-state-types@2018-11-30.yang b/ordmodels/common/src/main/yang/org-openroadm-common-state-types@2018-11-30.yang
deleted file mode 100644 (file)
index 03d352e..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-module org-openroadm-common-state-types {
-  namespace "http://org/openroadm/common-state-types";
-  prefix org-openroadm-common-state-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-
-  typedef lifecycle-state {
-    type enumeration {
-      enum "deployed" {
-        value 1;
-      }
-      enum "planned" {
-        value 2;
-      }
-      enum "maintenance" {
-        value 3;
-      }
-      enum "deploying" {
-        value 4;
-      }
-      enum "undeploying" {
-        value 5;
-      }
-      enum "undeployed" {
-        value 6;
-      }
-      enum "proposed" {
-        value 7;
-      }
-      enum "draft" {
-        value 8;
-      }
-      enum "deploy-failed" {
-        value 9;
-      }
-      enum "undeploy-failed" {
-        value 10;
-      }
-      enum "deployed-augmented" {
-        value 11;
-      }
-      enum "deployed-updating" {
-        value 12;
-      }
-    }
-    description
-      "Lifecycle state.";
-  }
-
-  typedef state {
-    type enumeration {
-      enum "inService" {
-        value 1;
-      }
-      enum "outOfService" {
-        value 2;
-      }
-      enum "degraded" {
-        value 3;
-      }
-    }
-    description
-      "State that indicates whether the resource is able to provide fulfill its role - carry traffic, etc.";
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-state-types@2019-11-29.yang b/ordmodels/common/src/main/yang/org-openroadm-common-state-types@2019-11-29.yang
deleted file mode 100644 (file)
index 901a013..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-module org-openroadm-common-state-types {
-  namespace "http://org/openroadm/common-state-types";
-  prefix org-openroadm-common-state-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-
-  typedef lifecycle-state {
-    type enumeration {
-      enum deployed {
-        value 1;
-      }
-      enum planned {
-        value 2;
-      }
-      enum maintenance {
-        value 3;
-      }
-      enum deploying {
-        value 4;
-      }
-      enum undeploying {
-        value 5;
-      }
-      enum undeployed {
-        value 6;
-      }
-      enum proposed {
-        value 7;
-      }
-      enum draft {
-        value 8;
-      }
-      enum deploy-failed {
-        value 9;
-      }
-      enum undeploy-failed {
-        value 10;
-      }
-      enum deployed-augmented {
-        value 11;
-      }
-      enum deployed-updating {
-        value 12;
-      }
-    }
-    description
-      "Lifecycle state.";
-  }
-
-  typedef state {
-    type enumeration {
-      enum inService {
-        value 1;
-      }
-      enum outOfService {
-        value 2;
-      }
-      enum degraded {
-        value 3;
-      }
-    }
-    description
-      "State that indicates whether the resource is able to provide fulfill its role - carry traffic, etc.";
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-types@2016-10-14.yang b/ordmodels/common/src/main/yang/org-openroadm-common-types@2016-10-14.yang
deleted file mode 100644 (file)
index e52b12b..0000000
+++ /dev/null
@@ -1,282 +0,0 @@
-module org-openroadm-common-types {
-  namespace "http://org/openroadm/common-types";
-  prefix org-openroadm-common-types;
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      AT&T Intellectual Property.  All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping physical-location {
-    leaf rack {
-      type string;
-      mandatory false;
-    }
-    leaf shelf {
-      type string;
-      mandatory false;
-    }
-    leaf slot {
-      type string;
-      mandatory false;
-    }
-    leaf subSlot {
-      type string;
-      mandatory false;
-    }
-  }
-
-  typedef node-types {
-    type enumeration {
-      enum "rdm" {
-        value 1;
-      }
-      enum "xpdr" {
-        value 2;
-      }
-    }
-    description
-      "3 digit identifier for node type
-       1. rdm for ROADM
-       2. xpdr for Transponder, Regen";
-  }
-
-  typedef power-dBm {
-    description
-      "Power value in dBm.";
-    type decimal64 {
-      fraction-digits 2;
-    }
-    units "dBm";
-  }
-
-  typedef ratio-dB {
-    description
-      "Power ratio in dB.";
-    type decimal64 {
-      fraction-digits 3;
-    }
-    units "dB";
-  }
-
-  typedef severity {
-    description
-      "Severity, based on X.733 perceived severity";
-    type enumeration {
-      enum "critical" {
-        value 1;
-      }
-      enum "major" {
-        value 2;
-      }
-      enum "minor" {
-        value 3;
-      }
-      enum "warning" {
-        value 4;
-      }
-      enum "clear" {
-        value 5;
-      }
-      enum "indeterminate" {
-        value 6;
-      }
-    }
-  }
-
-  typedef rpc-status {
-    description
-      "status of RPC ";
-    type enumeration {
-      enum "Successful" {
-        value 1;
-      }
-      enum "Failed" {
-        value 2;
-      }
-    }
-  }
-
-  grouping rpc-response-status {
-    leaf status {
-      type rpc-status;
-      mandatory true;
-      description
-        "Successful or Failed";
-    }
-    leaf status-message {
-      type string;
-      description
-        "Gives a more detailed reason for failure";
-    }
-  }
-
-  typedef lifecycle-state {
-    description
-      "Lifecycle state.";
-    type enumeration {
-      enum "deployed" {
-        value 1;
-      }
-      enum "planned" {
-        value 2;
-      }
-      enum "maintenance" {
-        value 3;
-      }
-      enum "deploying" {
-        value 4;
-      }
-      enum "undeploying" {
-        value 5;
-      }
-    }
-  }
-
-  typedef state {
-    description
-      "State that indicates whether the resource is able to provide fullfill its role - carry traffic, etc.";
-    type enumeration {
-      enum "inService" {
-        value 1;
-      }
-      enum "outOfService" {
-        value 2;
-      }
-      enum "degraded" {
-        value 3;
-      }
-    }
-  }
-
-  typedef optic-types {
-    type enumeration {
-      enum "gray" {
-        value 1;
-      }
-      enum "dwdm" {
-        value 2;
-      }
-    }
-  }
-  grouping equipment-type {
-    leaf type {
-      type equipment-type-enum;
-      mandatory true;
-      config false;
-    }
-    leaf extension {
-      description
-        "Populated with equipment type when enum value is set to vendorExtension";
-      type string;
-      mandatory false;
-      config false;
-    }
-  }
-
-  typedef equipment-type-enum {
-    type enumeration {
-      enum "other" {
-        value 1;
-      }
-      enum "powerSupply" {
-        value 2;
-      }
-      enum "shelfProcessor" {
-        value 3;
-      }
-      enum "crossConnect" {
-        value 4;
-      }
-      enum "fan" {
-        value 5;
-      }
-      enum "accessPanel" {
-        value 6;
-      }
-      enum "circuitPack" {
-        value 7;
-      }
-    }
-  }
-
-  typedef optical-control-mode {
-    description
-      "Optical Control Mode: identifies specific algorithm related to power management and general optical control.";
-    type enumeration {
-      enum "power" {
-        value 1;
-      }
-      enum "gainLoss" {
-        value 2;
-      }
-      enum "off" {
-        value 3;
-      }
-    }
-    reference "openroadm.org: Open ROADM MSA Specification.";
-  }
-
-  typedef direction {
-    type enumeration {
-      enum "tx" {
-        value 1;
-      }
-      enum "rx" {
-        value 2;
-      }
-      enum "bidirectional" {
-        value 3;
-      }
-    }
-  }
-
-  typedef pm-direction {
-    type enumeration {
-      enum "tx" {
-        value 1;
-      }
-      enum "rx" {
-        value 2;
-      }
-      enum "bidirectional" {
-        value 3;
-      }
-      enum "notApplicable" {
-        value 4;
-      }
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-types@2017-09-29.yang b/ordmodels/common/src/main/yang/org-openroadm-common-types@2017-09-29.yang
deleted file mode 100644 (file)
index 5957348..0000000
+++ /dev/null
@@ -1,629 +0,0 @@
-module org-openroadm-common-types {
-  namespace "http://org/openroadm/common-types";
-  prefix org-openroadm-common-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      AT&T Intellectual Property.  All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping physical-location {
-    leaf rack {
-      type string;
-      mandatory false;
-    }
-    leaf shelf {
-      type string;
-      mandatory false;
-    }
-    leaf slot {
-      type string;
-      mandatory false;
-    }
-    leaf subSlot {
-      type string;
-      mandatory false;
-    }
-  }
-
-  typedef node-types {
-    type enumeration {
-      enum "rdm" {
-        value 1;
-      }
-      enum "xpdr" {
-        value 2;
-      }
-      enum "ila" {
-        value 3;
-      }
-      enum "extplug" {
-        value 4;
-      }
-    }
-    description
-      "Identifier for node type
-       1. rdm for ROADM
-       2. xpdr for Transponder, Regen
-       3. ila for in-line amplifier
-       4. extplug for external plugable";
-  }
-
-  typedef node-id-type {
-    type string {
-      length "7..63";
-      pattern "([a-zA-Z][a-zA-Z0-9-]{5,18}[a-zA-Z0-9])" {
-        error-message
-          "A node-id must be 7 to 63 characters in length.
-           A node-id can contain letters, numbers, and hyphens.
-           The first character must be a letter.
-           The last character must be a letter or number.";
-       }
-    }
-    description
-      "Globally unique identifer for a device.";
-  }
-
-  typedef xpdr-node-types {
-    type enumeration {
-      enum "tpdr" {
-        value 1;
-      }
-      enum "mpdr" {
-        value 2;
-      }
-      enum "switch" {
-        value 3;
-      }
-      enum "regen" {
-        value 4;
-      }
-      enum "regen-uni" {
-        value 5;
-      }
-    }
-    description
-      "Identifier for Xponder node type
-       1. Transponder
-       2. Muxponder
-       3. OTN switchponder
-       4. Regenerator
-       5. Regenerator based on unidirectional model";
-  }
-
-  typedef frequency-THz {
-    description
-      "Frequency value in THz.";
-    type decimal64 {
-      fraction-digits 8;
-    }
-    units "THz";
-  }
-
-  typedef frequency-GHz {
-    description
-      "Frequency value in GHz.";
-    type decimal64 {
-      fraction-digits 5;
-    }
-    units "GHz";
-  }
-
-  typedef power-dBm {
-    description
-      "Power value in dBm.";
-    type decimal64 {
-      fraction-digits 2;
-    }
-    units "dBm";
-  }
-
-  typedef ratio-dB {
-    description
-      "Power ratio in dB.";
-    type decimal64 {
-      fraction-digits 3;
-    }
-    units "dB";
-  }
-
-  typedef fiber-pmd {
-    description
-      "Polarization Mode Dispersion expressed in ps/km(1/2).";
-    type decimal64 {
-      fraction-digits 2;
-    }
-    units "ps/(km[1/2])";
-  }
-
-  typedef amplifier-types {
-    type enumeration {
-      enum "standard" {
-        value 1;
-      }
-    }
-    description
-      "identifier for amplifier type
-       1. standard for amplifier as defined initially in the ROADM MSA specifications
-       To be completed if/when additional amplifier types are required ";
-  }
-
-  typedef line-amplifier-control-mode {
-    description
-      "Identifies the line amplifier control mode, either off or gain.";
-    type enumeration {
-      enum "gainLoss" {
-        value 2;
-      }
-      enum "off" {
-        value 3;
-      }
-    }
-  }
-
-  typedef amplifier-gain-range {
-    description
-      "Operational mode for the amplifier:
-       this parameter allows modeling different operational modes (gain ranges) ,notably for switched-gain amplifiers.
-       It indicates which performance model shall be used by the path feasibility engine.
-       For standard amplifier, or when performance evaluation is based on incremental noise, use gain-range-1.
-       When performance evaluation is based on advanced parameters, specify used gain-range (1 to 4).
-       Up to release 2.1, only gain-range-1 is to be used (default value) ";
-    type enumeration {
-      enum "gain-range-1" {
-        value 1;
-      }
-      enum "gain-range-2" {
-        value 2;
-      }
-      enum "gain-range-3" {
-        value 3;
-      }
-      enum "gain-range-4" {
-        value 4;
-      }
-    }
-  }
-
-  typedef severity {
-    description
-      "Severity, based on X.733 perceived severity";
-    type enumeration {
-      enum "critical" {
-        value 1;
-      }
-      enum "major" {
-        value 2;
-      }
-      enum "minor" {
-        value 3;
-      }
-      enum "warning" {
-        value 4;
-      }
-      enum "clear" {
-        value 5;
-      }
-      enum "indeterminate" {
-        value 6;
-      }
-    }
-  }
-
-  typedef activate-notification-type {
-    description
-      "Type of notification on software or database activation events";
-    type enumeration {
-      enum "activate" {
-        value 1;
-        description
-          "software or database activation";
-      }
-      enum "commit" {
-        value 2;
-        description
-          "commit the software or database.
-           For software activate, this event can happen in the following scenarios:
-             1) immediately when user issue db-activate command without rollBackTimer
-                or if the rollBackTimer is specified as 00-00-00;
-             2) when user issue cancel-rollback-timer before it expires and with accept=true.
-           For database activate, this event can occur in the following scenarios:
-             1) immediately when user issue db-activate command without rollBackTimer
-                or if the rollBackTimer is specified as 00-00-00;
-             2) when user issue cancel-rollback-timer before it expires and with accept=true.";
-      }
-      enum "cancel" {
-        value 3;
-        description
-          "cancel the database or software activation operation.
-           For software activate, this event can happen in the following cases:
-             1) when the rollBackTimer expires;
-             2) when the user issues cancel-rollback-timer with accept=false.
-           For database activate, this event can happen in the following cases:
-             1) when the rollBackTimer expires;
-             2) when the user issues cancel-rollback-timer with accept=false.";
-      }
-    }
-  }
-
-  typedef rpc-status {
-    description
-      "status of RPC ";
-    type enumeration {
-      enum "Successful" {
-        value 1;
-      }
-      enum "Failed" {
-        value 2;
-      }
-    }
-  }
-
-  grouping rpc-response-status {
-    leaf status {
-      type rpc-status;
-      mandatory true;
-      description
-        "Successful or Failed";
-    }
-    leaf status-message {
-      type string;
-      description
-        "Gives a more detailed status";
-    }
-  }
-
-  typedef extended-rpc-status {
-    description
-      "status of RPC ";
-    type enumeration {
-      enum "Successful" {
-        value 1;
-      }
-      enum "Failed" {
-        value 2;
-      }
-      enum "In-progress" {
-        value 3;
-      }
-    }
-  }
-
-  grouping extended-rpc-response-status {
-    leaf status {
-      type extended-rpc-status;
-      mandatory true;
-      description
-        "Successful, Failed or In-progress";
-    }
-    leaf status-message {
-      type string;
-      description
-        "Gives a more detailed status.";
-    }
-  }
-
-  typedef lifecycle-state {
-    description
-      "Lifecycle state.";
-    type enumeration {
-      enum "deployed" {
-        value 1;
-      }
-      enum "planned" {
-        value 2;
-      }
-      enum "maintenance" {
-        value 3;
-      }
-      enum "deploying" {
-        value 4;
-      }
-      enum "undeploying" {
-        value 5;
-      }
-      enum "undeployed" {
-        value 6;
-      }
-      enum "proposed" {
-        value 7;
-      }
-      enum "draft" {
-        value 8;
-      }
-    }
-  }
-
-  typedef state {
-    description
-      "State that indicates whether the resource is able to provide fullfill its role - carry traffic, etc.";
-    type enumeration {
-      enum "inService" {
-        value 1;
-      }
-      enum "outOfService" {
-        value 2;
-      }
-      enum "degraded" {
-        value 3;
-      }
-    }
-  }
-
-  typedef optic-types {
-    type enumeration {
-      enum "gray" {
-        value 1;
-      }
-      enum "dwdm" {
-        value 2;
-      }
-    }
-  }
-
-  grouping equipment-type {
-    leaf type {
-      type equipment-type-enum;
-      mandatory true;
-      config false;
-    }
-    leaf extension {
-      description
-        "Populated with equipment type when enum value is set to vendorExtension";
-      type string;
-      mandatory false;
-      config false;
-    }
-  }
-
-  typedef equipment-type-enum {
-    type enumeration {
-      enum "other" {
-        value 1;
-      }
-      enum "powerSupply" {
-        value 2;
-      }
-      enum "shelfProcessor" {
-        value 3;
-      }
-      enum "crossConnect" {
-        value 4;
-      }
-      enum "fan" {
-        value 5;
-      }
-      enum "accessPanel" {
-        value 6;
-      }
-      enum "circuitPack" {
-        value 7;
-      }
-    }
-  }
-
-  typedef optical-control-mode {
-    description
-      "Optical Control Mode: identifies specific algorithm related to power management and general optical control.";
-    type enumeration {
-      enum "power" {
-        value 1;
-      }
-      enum "gainLoss" {
-        value 2;
-      }
-      enum "off" {
-        value 3;
-      }
-    }
-    reference "openroadm.org: Open ROADM MSA Specification.";
-  }
-
-  typedef direction {
-    type enumeration {
-      enum "tx" {
-        value 1;
-      }
-      enum "rx" {
-        value 2;
-      }
-      enum "bidirectional" {
-        value 3;
-      }
-      enum "notApplicable" {
-        value 4;
-      }
-    }
-  }
-
-  typedef location {
-    type enumeration {
-      enum "notApplicable" {
-        value 1;
-      }
-      enum "nearEnd" {
-        value 2;
-      }
-      enum "farEnd" {
-        value 3;
-      }
-    }
-  }
-
-  typedef wavelength-duplication-type {
-    description
-      "One per srg is applied to C/D add/drop group
-       one per degree is applied to C/D/C add drop group";
-    type enumeration {
-      enum "one-per-srg" {
-        description
-          "The SRG cannot handle wavelength duplication. Attempting to provision a connection on this SRG that uses the same wavelength as an existing service will result in failure.";
-        value 1;
-      }
-      enum "one-per-degree" {
-        description
-          "The SRG can handle wavelength duplication, but only one per degree. Attempting to provision a connection on this SRG that uses the same wavelength as an existing service will succeed, so long as the connections are not using the same degree.";
-        value 2;
-      }
-    }
-  }
-
-  typedef port-qual {
-    type enumeration {
-      enum "roadm-internal" {
-        value 1;
-      }
-      enum "roadm-external" {
-        value 2;
-      }
-      enum "xpdr-network" {
-        value 3;
-      }
-      enum "xpdr-client" {
-        value 4;
-      }
-      enum "otdr" {
-        value 5;
-      }
-      enum "switch-network" {
-        value 6;
-      }
-      enum "switch-client" {
-        value 7;
-      }
-      enum "ila-external" {
-        value 8;
-      }
-      enum "ila-internal" {
-        value 9;
-      }
-    }
-  }
-
-  identity och-rate-identity {
-    description
-      "A unique och rate identification";
-  }
-
-  identity R200G {
-    base och-rate-identity;
-    description
-      "Identity for 200G Rate";
-  }
-
-  identity R100G {
-    base och-rate-identity;
-    description
-      "Identity for 100G Rate";
-  }
-
-  identity R10.7G {
-    base och-rate-identity;
-    description
-      "Identity for 10.7G Rate";
-  }
-
-  identity R11.1G {
-    base och-rate-identity;
-    description
-      "Identity for 11.1G Rate";
-  }
-
-  typedef modulation-format {
-    type enumeration {
-      enum "bpsk" {
-        value 0;
-        description
-          "binary phase-shift keying";
-      }
-      enum "dc-dp-bpsk" {
-        value 1;
-        description
-          "DC dual-polarization binary phase-shift keying";
-      }
-      enum "qpsk" {
-        value 2;
-        description
-          "quadrature phase-shift keying";
-      }
-      enum "dp-qpsk" {
-        value 3;
-        description
-          "dual-polarization binary phase-shift keying";
-      }
-      enum "qam16" {
-        value 4;
-        description
-          "quadrature amplitude modulation 16";
-      }
-      enum "dp-qam16" {
-        value 5;
-        description
-          "dual-polarization quadrature amplitude modulation 16";
-      }
-      enum "dc-dp-qam16" {
-        value 6;
-        description
-          "DC dual-polarization quadrature amplitude modulation 16";
-      }
-      enum "qam8" {
-        value 7;
-        description
-          "quadrature amplitude modulation 8";
-      }
-      enum "dp-qam8" {
-        value 8;
-        description
-          "dual-polarization quadrature amplitude modulation 8";
-      }
-      enum "dc-dp-qam8" {
-        value 9;
-        description
-          "DC dual-polarization quadrature amplitude modulation 8";
-      }
-    }
-    description
-      "Modulation format";
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-types@2018-10-19.yang b/ordmodels/common/src/main/yang/org-openroadm-common-types@2018-10-19.yang
deleted file mode 100644 (file)
index 6f2d9fe..0000000
+++ /dev/null
@@ -1,675 +0,0 @@
-module org-openroadm-common-types {
-  namespace "http://org/openroadm/common-types";
-  prefix org-openroadm-common-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      AT&T Intellectual Property.  All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  identity och-rate-identity {
-    description
-      "A unique och rate identification";
-  }
-
-  identity R200G {
-    base och-rate-identity;
-    description
-      "Identity for 200G Rate";
-  }
-
-  identity R100G {
-    base och-rate-identity;
-    description
-      "Identity for 100G Rate";
-  }
-
-  identity R10.7G {
-    base och-rate-identity;
-    description
-      "Identity for 10.7G Rate";
-  }
-
-  identity R11.1G {
-    base och-rate-identity;
-    description
-      "Identity for 11.1G Rate";
-  }
-
-  typedef node-types {
-    type enumeration {
-      enum "rdm" {
-        value 1;
-      }
-      enum "xpdr" {
-        value 2;
-      }
-      enum "ila" {
-        value 3;
-      }
-      enum "extplug" {
-        value 4;
-      }
-    }
-    description
-      "Identifier for node type
-       1. rdm for ROADM
-       2. xpdr for Transponder, Regen
-       3. ila for in-line amplifier
-       4. extplug for external plugable";
-  }
-
-  typedef node-id-type {
-    type string {
-      length "7..63";
-      pattern "([a-zA-Z][a-zA-Z0-9-]{5,18}[a-zA-Z0-9])" {
-        error-message
-          "A node-id must be 7 to 63 characters in length.
-           A node-id can contain letters, numbers, and hyphens.
-           The first character must be a letter.
-           The last character must be a letter or number.";
-      }
-    }
-    description
-      "Globally unique identifer for a device.";
-  }
-
-  typedef xpdr-node-types {
-    type enumeration {
-      enum "tpdr" {
-        value 1;
-      }
-      enum "mpdr" {
-        value 2;
-      }
-      enum "switch" {
-        value 3;
-      }
-      enum "regen" {
-        value 4;
-      }
-      enum "regen-uni" {
-        value 5;
-      }
-    }
-    description
-      "Identifier for Xponder node type
-       1. Transponder
-       2. Muxponder
-       3. OTN switchponder
-       4. Regenerator
-       5. Regenerator based on unidirectional model";
-  }
-
-  typedef frequency-THz {
-    type decimal64 {
-      fraction-digits 8;
-    }
-    units "THz";
-    description
-      "Frequency value in THz.";
-  }
-
-  typedef frequency-GHz {
-    type decimal64 {
-      fraction-digits 5;
-    }
-    units "GHz";
-    description
-      "Frequency value in GHz.";
-  }
-
-  typedef power-dBm {
-    type decimal64 {
-      fraction-digits 2;
-    }
-    units "dBm";
-    description
-      "Power value in dBm.";
-  }
-
-  typedef ratio-dB {
-    type decimal64 {
-      fraction-digits 3;
-    }
-    units "dB";
-    description
-      "Power ratio in dB.";
-  }
-
-  typedef fiber-pmd {
-    type decimal64 {
-      fraction-digits 2;
-    }
-    units "ps/(km[1/2])";
-    description
-      "Polarization Mode Dispersion expressed in ps/km(1/2).";
-  }
-
-  typedef amplifier-types {
-    type enumeration {
-      enum "standard" {
-        value 1;
-      }
-    }
-    description
-      "identifier for amplifier type
-       1. standard for amplifier as defined initially in the ROADM MSA specifications
-       To be completed if/when additional amplifier types are required ";
-  }
-
-  typedef line-amplifier-control-mode {
-    type enumeration {
-      enum "gainLoss" {
-        value 2;
-      }
-      enum "off" {
-        value 3;
-      }
-    }
-    description
-      "Identifies the line amplifier control mode, either off or gain.";
-  }
-
-  typedef amplifier-gain-range {
-    type enumeration {
-      enum "gain-range-1" {
-        value 1;
-      }
-      enum "gain-range-2" {
-        value 2;
-      }
-      enum "gain-range-3" {
-        value 3;
-      }
-      enum "gain-range-4" {
-        value 4;
-      }
-    }
-    description
-      "Operational mode for the amplifier:
-       this parameter allows modeling different operational modes (gain ranges) ,notably for switched-gain amplifiers.
-       It indicates which performance model shall be used by the path feasibility engine.
-       For standard amplifier, or when performance evaluation is based on incremental noise, use gain-range-1.
-       When performance evaluation is based on advanced parameters, specify used gain-range (1 to 4).
-       Up to release 2.1, only gain-range-1 is to be used (default value) ";
-  }
-
-  typedef severity {
-    type enumeration {
-      enum "critical" {
-        value 1;
-      }
-      enum "major" {
-        value 2;
-      }
-      enum "minor" {
-        value 3;
-      }
-      enum "warning" {
-        value 4;
-      }
-      enum "clear" {
-        value 5;
-      }
-      enum "indeterminate" {
-        value 6;
-      }
-    }
-    description
-      "Severity, based on X.733 perceived severity";
-  }
-
-  typedef activate-notification-type {
-    type enumeration {
-      enum "activate" {
-        value 1;
-        description
-          "software or database activation";
-      }
-      enum "commit" {
-        value 2;
-        description
-          "commit the software or database.
-           For software activate, this event can happen in the following scenarios:
-             1) immediately when user issue db-activate command without rollBackTimer
-                or if the rollBackTimer is specified as 00-00-00;
-             2) when user issue cancel-rollback-timer before it expires and with accept=true.
-           For database activate, this event can occur in the following scenarios:
-             1) immediately when user issue db-activate command without rollBackTimer
-                or if the rollBackTimer is specified as 00-00-00;
-             2) when user issue cancel-rollback-timer before it expires and with accept=true.";
-      }
-      enum "cancel" {
-        value 3;
-        description
-          "cancel the database or software activation operation.
-           For software activate, this event can happen in the following cases:
-             1) when the rollBackTimer expires;
-             2) when the user issues cancel-rollback-timer with accept=false.
-           For database activate, this event can happen in the following cases:
-             1) when the rollBackTimer expires;
-             2) when the user issues cancel-rollback-timer with accept=false.";
-      }
-    }
-    description
-      "Type of notification on software or database activation events";
-  }
-
-  typedef rpc-status {
-    type enumeration {
-      enum "Successful" {
-        value 1;
-      }
-      enum "Failed" {
-        value 2;
-      }
-    }
-    description
-      "status of RPC ";
-  }
-
-  typedef extended-rpc-status {
-    type enumeration {
-      enum "Successful" {
-        value 1;
-      }
-      enum "Failed" {
-        value 2;
-      }
-      enum "In-progress" {
-        value 3;
-      }
-    }
-    description
-      "status of RPC ";
-  }
-
-  typedef openroadm-version-type {
-    type enumeration {
-      enum "1.0" {
-        value 1;
-        description
-          "value for 1.0";
-      }
-      enum "2.0" {
-        value 2;
-        description
-          "value for 2.0";
-      }
-      enum "2.1" {
-        value 3;
-        description
-          "value for 2.1";
-      }
-      enum "2.2" {
-        value 4;
-        description
-          "value for 2.2";
-      }
-      enum "2.2.1" {
-        value 8;
-        description
-          "value for 2.2";
-      }
-    }
-    description
-      "OpenROADM version enum type";
-  }
-
-  typedef lifecycle-state {
-    type enumeration {
-      enum "deployed" {
-        value 1;
-      }
-      enum "planned" {
-        value 2;
-      }
-      enum "maintenance" {
-        value 3;
-      }
-      enum "deploying" {
-        value 4;
-      }
-      enum "undeploying" {
-        value 5;
-      }
-      enum "undeployed" {
-        value 6;
-      }
-      enum "proposed" {
-        value 7;
-      }
-      enum "draft" {
-        value 8;
-      }
-      enum "deploy-failed" {
-        value 9;
-      }
-      enum "undeploy-failed" {
-        value 10;
-      }
-    }
-    description
-      "Lifecycle state.";
-  }
-
-  typedef state {
-    type enumeration {
-      enum "inService" {
-        value 1;
-      }
-      enum "outOfService" {
-        value 2;
-      }
-      enum "degraded" {
-        value 3;
-      }
-    }
-    description
-      "State that indicates whether the resource is able to provide fullfill its role - carry traffic, etc.";
-  }
-
-  typedef optic-types {
-    type enumeration {
-      enum "gray" {
-        value 1;
-      }
-      enum "dwdm" {
-        value 2;
-      }
-    }
-  }
-
-  typedef equipment-type-enum {
-    type enumeration {
-      enum "other" {
-        value 1;
-      }
-      enum "powerSupply" {
-        value 2;
-      }
-      enum "shelfProcessor" {
-        value 3;
-      }
-      enum "crossConnect" {
-        value 4;
-      }
-      enum "fan" {
-        value 5;
-      }
-      enum "accessPanel" {
-        value 6;
-      }
-      enum "circuitPack" {
-        value 7;
-      }
-    }
-  }
-
-  typedef optical-control-mode {
-    type enumeration {
-      enum "power" {
-        value 1;
-      }
-      enum "gainLoss" {
-        value 2;
-      }
-      enum "off" {
-        value 3;
-      }
-    }
-    description
-      "Optical Control Mode: identifies specific algorithm related to power management and general optical control.";
-    reference "openroadm.org: Open ROADM MSA Specification.";
-  }
-
-  typedef direction {
-    type enumeration {
-      enum "tx" {
-        value 1;
-      }
-      enum "rx" {
-        value 2;
-      }
-      enum "bidirectional" {
-        value 3;
-      }
-      enum "notApplicable" {
-        value 4;
-      }
-    }
-  }
-
-  typedef location {
-    type enumeration {
-      enum "notApplicable" {
-        value 1;
-      }
-      enum "nearEnd" {
-        value 2;
-      }
-      enum "farEnd" {
-        value 3;
-      }
-    }
-  }
-
-  typedef wavelength-duplication-type {
-    type enumeration {
-      enum "one-per-srg" {
-        value 1;
-        description
-          "The SRG cannot handle wavelength duplication. Attempting to provision a connection on this SRG that uses the same wavelength as an existing service will result in failure.";
-      }
-      enum "one-per-degree" {
-        value 2;
-        description
-          "The SRG can handle wavelength duplication, but only one per degree. Attempting to provision a connection on this SRG that uses the same wavelength as an existing service will succeed, so long as the connections are not using the same degree.";
-      }
-    }
-    description
-      "One per srg is applied to C/D add/drop group
-       one per degree is applied to C/D/C add drop group";
-  }
-
-  typedef port-qual {
-    type enumeration {
-      enum "roadm-internal" {
-        value 1;
-      }
-      enum "roadm-external" {
-        value 2;
-      }
-      enum "xpdr-network" {
-        value 3;
-      }
-      enum "xpdr-client" {
-        value 4;
-      }
-      enum "otdr" {
-        value 5;
-      }
-      enum "switch-network" {
-        value 6;
-      }
-      enum "switch-client" {
-        value 7;
-      }
-      enum "ila-external" {
-        value 8;
-      }
-      enum "ila-internal" {
-        value 9;
-      }
-    }
-  }
-
-  typedef modulation-format {
-    type enumeration {
-      enum "bpsk" {
-        value 0;
-        description
-          "binary phase-shift keying";
-      }
-      enum "dc-dp-bpsk" {
-        value 1;
-        description
-          "DC dual-polarization binary phase-shift keying";
-      }
-      enum "qpsk" {
-        value 2;
-        description
-          "quadrature phase-shift keying";
-      }
-      enum "dp-qpsk" {
-        value 3;
-        description
-          "dual-polarization binary phase-shift keying";
-      }
-      enum "qam16" {
-        value 4;
-        description
-          "quadrature amplitude modulation 16";
-      }
-      enum "dp-qam16" {
-        value 5;
-        description
-          "dual-polarization quadrature amplitude modulation 16";
-      }
-      enum "dc-dp-qam16" {
-        value 6;
-        description
-          "DC dual-polarization quadrature amplitude modulation 16";
-      }
-      enum "qam8" {
-        value 7;
-        description
-          "quadrature amplitude modulation 8";
-      }
-      enum "dp-qam8" {
-        value 8;
-        description
-          "dual-polarization quadrature amplitude modulation 8";
-      }
-      enum "dc-dp-qam8" {
-        value 9;
-        description
-          "DC dual-polarization quadrature amplitude modulation 8";
-      }
-    }
-    description
-      "Modulation format";
-  }
-
-  grouping physical-location {
-    leaf rack {
-      type string;
-      mandatory false;
-    }
-    leaf shelf {
-      type string;
-      mandatory false;
-    }
-    leaf slot {
-      type string;
-      mandatory false;
-    }
-    leaf subSlot {
-      type string;
-      mandatory false;
-    }
-  }
-
-  grouping rpc-response-status {
-    leaf status {
-      type rpc-status;
-      mandatory true;
-      description
-        "Successful or Failed";
-    }
-    leaf status-message {
-      type string;
-      description
-        "Gives a more detailed status";
-    }
-  }
-
-  grouping extended-rpc-response-status {
-    leaf status {
-      type extended-rpc-status;
-      mandatory true;
-      description
-        "Successful, Failed or In-progress";
-    }
-    leaf status-message {
-      type string;
-      description
-        "Gives a more detailed status.";
-    }
-  }
-
-  grouping equipment-type {
-    leaf type {
-      type equipment-type-enum;
-      config false;
-      mandatory true;
-    }
-    leaf extension {
-      type string;
-      config false;
-      mandatory false;
-      description
-        "Populated with equipment type when enum value is set to vendorExtension";
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-types@2018-11-30.yang b/ordmodels/common/src/main/yang/org-openroadm-common-types@2018-11-30.yang
deleted file mode 100644 (file)
index 2458192..0000000
+++ /dev/null
@@ -1,238 +0,0 @@
-module org-openroadm-common-types {
-  namespace "http://org/openroadm/common-types";
-  prefix org-openroadm-common-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef activate-notification-type {
-    type enumeration {
-      enum "activate" {
-        value 1;
-        description
-          "software or database activation";
-      }
-      enum "commit" {
-        value 2;
-        description
-          "commit the software or database.
-           For software activate, this event can happen in the following scenarios:
-             1) immediately when user issue sw-activate command without validationTimer
-                or if the validationTimer is specified as 00-00-00;
-             2) when user issue cancel-validation-timer before it expires and with accept=true.
-           For database activate, this event can occur in the following scenarios:
-             1) immediately when user issue db-activate command without rollBackTimer
-                or if the rollBackTimer is specified as 00-00-00;
-             2) when user issue cancel-rollback-timer before it expires and with accept=true.";
-      }
-      enum "cancel" {
-        value 3;
-        description
-          "cancel the database or software activation operation.
-           For software activate, this event can happen in the following cases:
-             1) when the validationTimer expires;
-             2) when the user issues cancel-validation-timer with accept=false.
-           For database activate, this event can happen in the following cases:
-             1) when the rollBackTimer expires;
-             2) when the user issues cancel-rollback-timer with accept=false.";
-      }
-    }
-    description
-      "Type of notification on software or database activation events";
-  }
-
-  typedef rpc-status {
-    type enumeration {
-      enum "Successful" {
-        value 1;
-      }
-      enum "Failed" {
-        value 2;
-      }
-    }
-    description
-      "status of RPC ";
-  }
-
-  typedef extended-rpc-status {
-    type enumeration {
-      enum "Successful" {
-        value 1;
-      }
-      enum "Failed" {
-        value 2;
-      }
-      enum "In-progress" {
-        value 3;
-      }
-    }
-    description
-      "status of RPC ";
-  }
-
-  typedef openroadm-version-type {
-    type enumeration {
-      enum "1.0" {
-        value 1;
-        description
-          "value for 1.0";
-      }
-      enum "2.0" {
-        value 2;
-        description
-          "value for 2.0";
-      }
-      enum "2.1" {
-        value 3;
-        description
-          "value for 2.1";
-      }
-      enum "2.2" {
-        value 4;
-        description
-          "value for 2.2";
-      }
-      enum "3.0" {
-        value 5;
-        description
-          "value for 3.0";
-      }
-      enum "3.1" {
-        value 6;
-        description
-          "value for 3.1";
-      }
-      enum "4.0" {
-        value 7;
-        description
-          "value for 4.0";
-      }
-      enum "2.2.1" {
-        value 8;
-        description
-          "value for 2.2.1";
-      }
-      enum "4.1" {
-        value 9;
-        description
-          "value for 4.1";
-      }
-      enum "3.1.1" {
-        value 10;
-        description
-          "value for 3.1.1";
-      }
-    }
-    description
-      "OpenROADM version enum type";
-  }
-
-  grouping rpc-response-status {
-    leaf status {
-      type rpc-status;
-      mandatory true;
-      description
-        "Successful or Failed";
-    }
-    leaf status-message {
-      type string;
-      description
-        "Gives a more detailed status";
-    }
-  }
-
-  grouping extended-rpc-response-status {
-    leaf status {
-      type extended-rpc-status;
-      mandatory true;
-      description
-        "Successful, Failed or In-progress";
-    }
-    leaf status-message {
-      type string;
-      description
-        "Gives a more detailed status.";
-    }
-  }
-
-  grouping eth-rate-and-burst-size {
-    description
-      "Grouping of ethernet committed rate and burst size.";
-    leaf committed-info-rate {
-      type uint32;
-      mandatory true;
-      description
-        "Committed Information Rate (CIR), unit in Mbps. For example, 1250 Mbps";
-    }
-    leaf committed-burst-size {
-      type uint16;
-      mandatory true;
-      description
-        "Committed Burst Size, unit in 1KB (K Byte).
-                Range 16 | 32 | 64 | 128 | 512 | 1024. Default: 16";
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-types@2019-05-31.yang b/ordmodels/common/src/main/yang/org-openroadm-common-types@2019-05-31.yang
deleted file mode 100644 (file)
index 9d5728c..0000000
+++ /dev/null
@@ -1,252 +0,0 @@
-module org-openroadm-common-types {
-  namespace "http://org/openroadm/common-types";
-  prefix org-openroadm-common-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef activate-notification-type {
-    type enumeration {
-      enum "activate" {
-        value 1;
-        description
-          "software or database activation";
-      }
-      enum "commit" {
-        value 2;
-        description
-          "commit the software or database.
-           For software activate, this event can happen in the following scenarios:
-             1) immediately when user issue sw-activate command without validationTimer
-                or if the validationTimer is specified as 00-00-00;
-             2) when user issue cancel-validation-timer before it expires and with accept=true.
-           For database activate, this event can occur in the following scenarios:
-             1) immediately when user issue db-activate command without rollBackTimer
-                or if the rollBackTimer is specified as 00-00-00;
-             2) when user issue cancel-rollback-timer before it expires and with accept=true.";
-      }
-      enum "cancel" {
-        value 3;
-        description
-          "cancel the database or software activation operation.
-           For software activate, this event can happen in the following cases:
-             1) when the validationTimer expires;
-             2) when the user issues cancel-validation-timer with accept=false.
-           For database activate, this event can happen in the following cases:
-             1) when the rollBackTimer expires;
-             2) when the user issues cancel-rollback-timer with accept=false.";
-      }
-    }
-    description
-      "Type of notification on software or database activation events";
-  }
-
-  typedef rpc-status {
-    type enumeration {
-      enum "Successful" {
-        value 1;
-      }
-      enum "Failed" {
-        value 2;
-      }
-    }
-    description
-      "status of RPC ";
-  }
-
-  typedef extended-rpc-status {
-    type enumeration {
-      enum "Successful" {
-        value 1;
-      }
-      enum "Failed" {
-        value 2;
-      }
-      enum "In-progress" {
-        value 3;
-      }
-    }
-    description
-      "status of RPC ";
-  }
-
-  typedef openroadm-version-type {
-    type enumeration {
-      enum "1.0" {
-        value 1;
-        description
-          "value for 1.0";
-      }
-      enum "2.0" {
-        value 2;
-        description
-          "value for 2.0";
-      }
-      enum "2.1" {
-        value 3;
-        description
-          "value for 2.1";
-      }
-      enum "2.2" {
-        value 4;
-        description
-          "value for 2.2";
-      }
-      enum "3.0" {
-        value 5;
-        description
-          "value for 3.0";
-      }
-      enum "3.1" {
-        value 6;
-        description
-          "value for 3.1";
-      }
-      enum "4.0" {
-        value 7;
-        description
-          "value for 4.0";
-      }
-      enum "2.2.1" {
-        value 8;
-        description
-          "value for 2.2.1";
-      }
-      enum "4.1" {
-        value 9;
-        description
-          "value for 4.1";
-      }
-      enum "3.1.1" {
-        value 10;
-        description
-          "value for 3.1.1";
-      }
-      enum "5.0" {
-        value 11;
-        description
-          "value for 5.0";
-      }
-      enum "5.1" {
-        value 12;
-        description
-          "value for 5.1";
-      }
-    }
-    description
-      "OpenROADM version enum type";
-  }
-
-  grouping rpc-response-status {
-    leaf status {
-      type rpc-status;
-      mandatory true;
-      description
-        "Successful or Failed";
-    }
-    leaf status-message {
-      type string;
-      description
-        "Gives a more detailed status";
-    }
-  }
-
-  grouping extended-rpc-response-status {
-    leaf status {
-      type extended-rpc-status;
-      mandatory true;
-      description
-        "Successful, Failed or In-progress";
-    }
-    leaf status-message {
-      type string;
-      description
-        "Gives a more detailed status.";
-    }
-  }
-
-  grouping eth-rate-and-burst-size {
-    description
-      "Grouping of ethernet committed rate and burst size.";
-    leaf committed-info-rate {
-      type uint32;
-      mandatory true;
-      description
-        "Committed Information Rate (CIR), unit in Mbps. For example, 1250 Mbps";
-    }
-    leaf committed-burst-size {
-      type uint16;
-      mandatory true;
-      description
-        "Committed Burst Size, unit in 1KB (K Byte).
-                Range 16 | 32 | 64 | 128 | 512 | 1024. Default: 16";
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-types@2020-05-29.yang b/ordmodels/common/src/main/yang/org-openroadm-common-types@2020-05-29.yang
deleted file mode 100644 (file)
index ac8565c..0000000
+++ /dev/null
@@ -1,427 +0,0 @@
-module org-openroadm-common-types {
-  namespace "http://org/openroadm/common-types";
-  prefix org-openroadm-common-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef activate-notification-type {
-    type enumeration {
-      enum activate {
-        value 1;
-        description
-          "software or database activation";
-      }
-      enum commit {
-        value 2;
-        description
-          "commit the software or database.
-           For software activate, this event can happen in the following scenarios:
-             1) immediately when user issue sw-activate command without validationTimer
-                or if the validationTimer is specified as 00-00-00;
-             2) when user issue cancel-validation-timer before it expires and with accept=true.
-           For database activate, this event can occur in the following scenarios:
-             1) immediately when user issue db-activate command without rollBackTimer
-                or if the rollBackTimer is specified as 00-00-00;
-             2) when user issue cancel-rollback-timer before it expires and with accept=true.";
-      }
-      enum cancel {
-        value 3;
-        description
-          "cancel the database or software activation operation.
-           For software activate, this event can happen in the following cases:
-             1) when the validationTimer expires;
-             2) when the user issues cancel-validation-timer with accept=false.
-           For database activate, this event can happen in the following cases:
-             1) when the rollBackTimer expires;
-             2) when the user issues cancel-rollback-timer with accept=false.";
-      }
-    }
-    description
-      "Type of notification on software or database activation events";
-  }
-
-  typedef rpc-status {
-    type enumeration {
-      enum Successful {
-        value 1;
-      }
-      enum Failed {
-        value 2;
-      }
-    }
-    description
-      "status of RPC ";
-  }
-
-  typedef extended-rpc-status {
-    type enumeration {
-      enum Successful {
-        value 1;
-      }
-      enum Failed {
-        value 2;
-      }
-      enum In-progress {
-        value 3;
-      }
-    }
-    description
-      "status of RPC ";
-  }
-
-  typedef openroadm-version-type {
-    type enumeration {
-      enum 1.0 {
-        value 1;
-        description
-          "value for 1.0";
-      }
-      enum 2.0 {
-        value 2;
-        description
-          "value for 2.0";
-      }
-      enum 2.1 {
-        value 3;
-        description
-          "value for 2.1";
-      }
-      enum 2.2 {
-        value 4;
-        description
-          "value for 2.2";
-      }
-      enum 3.0 {
-        value 5;
-        description
-          "value for 3.0";
-      }
-      enum 3.1 {
-        value 6;
-        description
-          "value for 3.1";
-      }
-      enum 4.0 {
-        value 7;
-        description
-          "value for 4.0";
-      }
-      enum 2.2.1 {
-        value 8;
-        description
-          "value for 2.2.1";
-      }
-      enum 4.1 {
-        value 9;
-        description
-          "value for 4.1";
-      }
-      enum 3.1.1 {
-        value 10;
-        description
-          "value for 3.1.1";
-      }
-      enum 5.0 {
-        value 11;
-        description
-          "value for 5.0";
-      }
-      enum 5.1 {
-        value 12;
-        description
-          "value for 5.1";
-      }
-      enum 6.0 {
-        value 13;
-        description
-          "value for 6.0";
-      }
-      enum 6.1 {
-        value 14;
-        description
-          "value for 6.1";
-      }
-      enum 7.0 {
-        value 15;
-        description
-          "value for 7.0";
-      }
-      enum 7.1 {
-        value 16;
-        description
-          "value for 7.1";
-      }
-    }
-    description
-      "OpenROADM version enum type";
-  }
-
-  grouping rpc-response-status {
-    leaf status {
-      type rpc-status;
-      mandatory true;
-      description
-        "Successful or Failed";
-    }
-    leaf status-message {
-      type string;
-      description
-        "Gives a more detailed status";
-    }
-  }
-
-  grouping extended-rpc-response-status {
-    leaf status {
-      type extended-rpc-status;
-      mandatory true;
-      description
-        "Successful, Failed or In-progress";
-    }
-    leaf status-message {
-      type string;
-      description
-        "Gives a more detailed status.";
-    }
-  }
-
-  grouping eth-rate-and-burst-size {
-    description
-      "Grouping of ethernet committed rate and burst size.";
-    leaf committed-info-rate {
-      type uint32;
-      mandatory true;
-      description
-        "Committed Information Rate (CIR), unit in Mbps. For example, 1250 Mbps";
-    }
-    leaf committed-burst-size {
-      type uint16;
-      mandatory true;
-      description
-        "Committed Burst Size, unit in 1KB (K Byte).
-                Range 16 | 32 | 64 | 128 | 512 | 1024. Default: 16";
-    }
-  }
-
-  identity otn-protection-type {
-    description
-      "OTN base protection identity from which
-         specific protection types are derived.";
-  }
-
-  typedef tcm-direction-capability-type {
-    type enumeration {
-      enum up-tcm {
-        description
-          "Port supports up TCM termination, e.g., direction facing the switch fabric";
-      }
-      enum down-tcm {
-        description
-          "Port supports down TCM termination, e.g., direction facing out of the equipment ";
-      }
-      enum up-down-tcm {
-        description
-          "Port supports both up and down TCM terminations";
-      }
-    }
-    description
-      "TCM direction capability for the port";
-  }
-
-
-
-
-
-
-  //
-  // Identities for FEC -- used for Device and Service models
-  //
-
-  // Base Identity
-  identity fec-identity {
-    description
-      "A unique FEC identification";
-  }
-
-  // FEC Off (duplications for backwards compatibility)
-  identity off-fec {
-    status deprecated;
-    base fec-identity;
-    description
-      "FEC Off";
-  }
-  identity off {
-    base fec-identity;
-    description
-      "FEC Off";
-  }
-
-  // Staircase FEC (duplications for backwards compatibility)
-  identity sc-fec {
-    status deprecated;
-    base fec-identity;
-    description
-      "Staircase FEC identification";
-  }
-  identity scfec {
-    base fec-identity;
-    description
-      "Staircase FEC identification";
-  }
-
-  // Reed Solomon FEC (duplication for backwards compatibility)
-  identity rs-fec {
-    status deprecated;
-    base fec-identity;
-    description
-      "Reed Solomon FEC identification";
-  }
-  identity rsfec {
-    base fec-identity;
-    description
-      "Reed Solomon FEC identification";
-  }
-
-  // OpenROADM FEC (duplication for backwards compatibility)
-  identity o-fec {
-    status deprecated;
-    base fec-identity;
-    description
-      "OpenROADM FEC identification";
-  }
-  identity ofec {
-    base fec-identity;
-    description
-      "OpenROADM FEC identification";
-  }
-
-  // G.975.1 I.4
-  identity efec {
-    base fec-identity;
-    description
-      "G.975.1 I.4";
-  }
-
-  // G.975.1 I.7
-  identity ufec {
-    base fec-identity;
-    description
-      "G.975.1 I.7";
-  }
-
-  // Soft Decision FEC
-  identity sdfec {
-    base fec-identity;
-    description
-      "Soft Decision FEC";
-  }
-
-  // Clariphy SDFEC
-  identity sdfeca1 {
-    base fec-identity;
-    description
-      "Clariphy SDFEC";
-  }
-
-  // SDFEC with SCFED
-  identity sdfecb1 {
-    base fec-identity;
-    description
-      "SDFEC with SCFEC";
-  }
-
-
-  grouping fec-grouping {
-    leaf fec {
-      type identityref {
-        base org-openroadm-common-types:fec-identity;
-      }
-      description
-        "FEC / Forward Error Correction";
-    }
-  }
-
-}
\ No newline at end of file
diff --git a/ordmodels/common/src/main/yang/org-openroadm-common-types@2021-12-10.yang b/ordmodels/common/src/main/yang/org-openroadm-common-types@2021-12-10.yang
deleted file mode 100644 (file)
index ca3d2b8..0000000
+++ /dev/null
@@ -1,487 +0,0 @@
-module org-openroadm-common-types {
-  namespace "http://org/openroadm/common-types";
-  prefix org-openroadm-common-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2021-12-10 {
-    description
-      "Version 10.1";
-  }
-  revision 2021-09-24 {
-    description
-      "Version 10.0";
-  }
-  revision 2021-05-28 {
-    description
-      "Version 9.1";
-  }
-  revision 2021-03-26 {
-    description
-      "Version 9.0";
-  }
-  revision 2020-12-11 {
-    description
-      "Version 8.1";
-  }
-  revision 2020-09-25 {
-    description
-      "Version 8.0";
-  }
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef activate-notification-type {
-    type enumeration {
-      enum activate {
-        value 1;
-        description
-          "software or database activation";
-      }
-      enum commit {
-        value 2;
-        description
-          "commit the software or database.
-           For software activate, this event can happen in the following scenarios:
-             1) immediately when user issue sw-activate command without validationTimer
-                or if the validationTimer is specified as 00-00-00;
-             2) when user issue cancel-validation-timer before it expires and with accept=true.
-           For database activate, this event can occur in the following scenarios:
-             1) immediately when user issue db-activate command without rollBackTimer
-                or if the rollBackTimer is specified as 00-00-00;
-             2) when user issue cancel-rollback-timer before it expires and with accept=true.";
-      }
-      enum cancel {
-        value 3;
-        description
-          "cancel the database or software activation operation.
-           For software activate, this event can happen in the following cases:
-             1) when the validationTimer expires;
-             2) when the user issues cancel-validation-timer with accept=false.
-           For database activate, this event can happen in the following cases:
-             1) when the rollBackTimer expires;
-             2) when the user issues cancel-rollback-timer with accept=false.";
-      }
-    }
-    description
-      "Type of notification on software or database activation events";
-  }
-
-  typedef rpc-status {
-    type enumeration {
-      enum Successful {
-        value 1;
-      }
-      enum Failed {
-        value 2;
-      }
-    }
-    description
-      "status of RPC ";
-  }
-
-  typedef extended-rpc-status {
-    type enumeration {
-      enum Successful {
-        value 1;
-      }
-      enum Failed {
-        value 2;
-      }
-      enum In-progress {
-        value 3;
-      }
-    }
-    description
-      "status of RPC ";
-  }
-
-  typedef openroadm-version-type {
-    type enumeration {
-      enum 1.0 {
-        value 1;
-        description
-          "value for 1.0";
-      }
-      enum 2.0 {
-        value 2;
-        description
-          "value for 2.0";
-      }
-      enum 2.1 {
-        value 3;
-        description
-          "value for 2.1";
-      }
-      enum 2.2 {
-        value 4;
-        description
-          "value for 2.2";
-      }
-      enum 3.0 {
-        value 5;
-        description
-          "value for 3.0";
-      }
-      enum 3.1 {
-        value 6;
-        description
-          "value for 3.1";
-      }
-      enum 4.0 {
-        value 7;
-        description
-          "value for 4.0";
-      }
-      enum 2.2.1 {
-        value 8;
-        description
-          "value for 2.2.1";
-      }
-      enum 4.1 {
-        value 9;
-        description
-          "value for 4.1";
-      }
-      enum 3.1.1 {
-        value 10;
-        description
-          "value for 3.1.1";
-      }
-      enum 5.0 {
-        value 11;
-        description
-          "value for 5.0";
-      }
-      enum 5.1 {
-        value 12;
-        description
-          "value for 5.1";
-      }
-      enum 6.0 {
-        value 13;
-        description
-          "value for 6.0";
-      }
-      enum 6.1 {
-        value 14;
-        description
-          "value for 6.1";
-      }
-      enum 7.0 {
-        value 15;
-        description
-          "value for 7.0";
-      }
-      enum 7.1 {
-        value 16;
-        description
-          "value for 7.1";
-      }
-      enum 8.0 {
-        value 17;
-        description
-          "value for 8.0";
-      }
-      enum 8.1 {
-        value 18;
-        description
-          "value for 8.1";
-      }
-      enum 9.0 {
-        value 19;
-        description
-          "value for 9.0";
-      }
-      enum 9.1 {
-        value 20;
-        description
-          "value for 9.1";
-      }
-      enum 10.0 {
-        value 21;
-        description
-          "value for 10.0";
-      }
-      enum 10.1 {
-        value 22;
-        description
-          "value for 10.1";
-      }
-    }
-    description
-      "OpenROADM version enum type";
-  }
-
-  grouping rpc-response-status {
-    leaf status {
-      type rpc-status;
-      mandatory true;
-      description
-        "Successful or Failed";
-    }
-    leaf status-message {
-      type string;
-      description
-        "Gives a more detailed status";
-    }
-  }
-
-  grouping extended-rpc-response-status {
-    leaf status {
-      type extended-rpc-status;
-      mandatory true;
-      description
-        "Successful, Failed or In-progress";
-    }
-    leaf status-message {
-      type string;
-      description
-        "Gives a more detailed status.";
-    }
-  }
-
-  grouping eth-rate-and-burst-size {
-    description
-      "Grouping of ethernet committed rate and burst size.";
-    leaf committed-info-rate {
-      type uint32;
-      mandatory true;
-      description
-        "Committed Information Rate (CIR), unit in Mbps. For example, 1250 Mbps";
-    }
-    leaf committed-burst-size {
-      type uint16;
-      mandatory true;
-      description
-        "Committed Burst Size, unit in 1KB (K Byte).
-                Range 16 | 32 | 64 | 128 | 512 | 1024. Default: 16";
-    }
-  }
-
-  identity otn-protection-type {
-    description
-      "OTN base protection identity from which
-         specific protection types are derived.";
-  }
-
-  typedef tcm-direction-capability-type {
-    type enumeration {
-      enum up-tcm {
-        description
-          "Port supports up TCM termination, e.g., direction facing the switch fabric";
-      }
-      enum down-tcm {
-        description
-          "Port supports down TCM termination, e.g., direction facing out of the equipment ";
-      }
-      enum up-down-tcm {
-        description
-          "Port supports both up and down TCM terminations";
-      }
-    }
-    description
-      "TCM direction capability for the port";
-  }
-
-
-
-
-
-
-  //
-  // Identities for FEC -- used for Device and Service models
-  //
-
-  // Base Identity
-  identity fec-identity {
-    description
-      "A unique FEC identification";
-  }
-
-  // FEC Off (duplications for backwards compatibility)
-  identity off-fec {
-    status deprecated;
-    base fec-identity;
-    description
-      "FEC Off";
-  }
-  identity off {
-    base fec-identity;
-    description
-      "FEC Off";
-  }
-  identity scfec {
-    base fec-identity;
-    description
-      "Staircase FEC identification";
-  }
-  identity rsfec {
-    base fec-identity;
-    description
-      "Reed Solomon FEC identification";
-  }
-  identity ofec {
-    base fec-identity;
-    description
-      "OpenROADM FEC identification";
-  }
-
-  // G.975.1 I.4
-  identity efec {
-    base fec-identity;
-    description
-      "G.975.1 I.4";
-  }
-
-  // G.975.1 I.7
-  identity ufec {
-    base fec-identity;
-    description
-      "G.975.1 I.7";
-  }
-
-  // Soft Decision FEC
-  identity sdfec {
-    base fec-identity;
-    description
-      "Soft Decision FEC";
-  }
-
-  // Clariphy SDFEC
-  identity sdfeca1 {
-    base fec-identity;
-    description
-      "Clariphy SDFEC";
-  }
-
-  // SDFEC with SCFED
-  identity sdfecb1 {
-    base fec-identity;
-    description
-      "SDFEC with SCFEC";
-  }
-
-  // Base-R
-  identity baser {
-    base fec-identity;
-    description
-      "Base-R (IEEE 802.3)";
-  }
-
-  grouping fec-grouping {
-    leaf fec {
-      type identityref {
-        base org-openroadm-common-types:fec-identity;
-      }
-      description
-        "FEC / Forward Error Correction";
-    }
-  }
-
-  typedef SRLG-type {
-    type enumeration {
-      enum site {
-        value 0;
-        description
-          "Site SRLG";
-      }
-      enum node {
-        value 1;
-        description
-          "Node SRLG";
-      }
-      enum srlg {
-        value 2;
-        description
-          "SRLG here is also referred as fiber SRLG";
-      }
-      enum link {
-        value 3;
-        description
-          "Link SRLG";
-      }    
-    }
-  }  
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-equipment-states-types@2016-10-14.yang b/ordmodels/common/src/main/yang/org-openroadm-equipment-states-types@2016-10-14.yang
deleted file mode 100644 (file)
index 11ce8f5..0000000
+++ /dev/null
@@ -1,130 +0,0 @@
-module org-openroadm-equipment-states-types {
-  namespace "http://org/openroadm/equipment/states/types";
-  prefix org-openroadm-equipment-states-types;
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for types of states of equipment (slot/subslot).
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef admin-states {
-    type enumeration {
-      enum "inService" {
-        value 1;
-      }
-      enum "outOfService" {
-        value 2;
-      }
-      enum "maintenance" {
-        value 3;
-      }
-    }
-  }
-
-  typedef states {
-    type enumeration {
-      enum "reserved-for-facility-planned" {
-        value 1;
-        description
-          "equipment is planned for use by a service";
-      }
-      enum "not-reserved-planned" {
-        value 2;
-        description
-          "equipment is planned by not reserved for any purpose";
-      }
-      enum "reserved-for-maintenance-planned" {
-        value 3;
-        description
-          "equipment is planned for use as a maintenance spare";
-      }
-      enum "reserved-for-facility-unvalidated" {
-        value 4;
-        description
-          "equipment is reserved for use by a service but not
-           validated against planned equipment";
-      }
-      enum "not-reserved-unvalidated" {
-        value 5;
-        description
-          "equipment is not reserved for any purpose and
-           not validated against planned equipment";
-      }
-      enum "unknown-unvalidated" {
-        value 6;
-        description
-          "unknown equipment not validated against planned equipment";
-      }
-      enum "reserved-for-maintenance-unvalidated" {
-        value 7;
-        description
-          "equipment is to be used for use as a maintenance spare
-           but not validated against planned equipment";
-      }
-      enum "reserved-for-facility-available" {
-        value 8;
-        description
-          "reserved for use by a service and available";
-      }
-      enum "not-reserved-available" {
-        value 9;
-        description
-          "not reserved for use by a service and available";
-      }
-      enum "reserved-for-maintenance-available" {
-        value 10;
-        description
-          "reserved as a maintenance spare and available";
-      }
-      enum "reserved-for-reversion-inuse" {
-        value 11;
-        description
-          "equipiment that is reserved as part of a home path
-           for a service that has been temporarily re-routed";
-      }
-      enum "not-reserved-inuse" {
-        value 12;
-        description
-          "equipment in use for a service";
-      }
-      enum "reserved-for-maintenance-inuse" {
-        value 13;
-        description
-          "maintenance spare equipment that is in use as a
-           maintenance spare";
-      }
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-equipment-states-types@2017-12-15.yang b/ordmodels/common/src/main/yang/org-openroadm-equipment-states-types@2017-12-15.yang
deleted file mode 100644 (file)
index 0c951ae..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-module org-openroadm-equipment-states-types {
-  namespace "http://org/openroadm/equipment/states/types";
-  prefix org-openroadm-equipment-states-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for types of states of equipment (slot/subslot).
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef admin-states {
-    type enumeration {
-      enum "inService" {
-        value 1;
-      }
-      enum "outOfService" {
-        value 2;
-      }
-      enum "maintenance" {
-        value 3;
-      }
-    }
-  }
-
-  typedef states {
-    type enumeration {
-      enum "reserved-for-facility-planned" {
-        value 1;
-        description
-          "equipment is planned for use by a service";
-      }
-      enum "not-reserved-planned" {
-        value 2;
-        description
-          "equipment is planned by not reserved for any purpose";
-      }
-      enum "reserved-for-maintenance-planned" {
-        value 3;
-        description
-          "equipment is planned for use as a maintenance spare";
-      }
-      enum "reserved-for-facility-unvalidated" {
-        value 4;
-        description
-          "equipment is reserved for use by a service but not
-           validated against planned equipment";
-      }
-      enum "not-reserved-unvalidated" {
-        value 5;
-        description
-          "equipment is not reserved for any purpose and
-           not validated against planned equipment";
-      }
-      enum "unknown-unvalidated" {
-        value 6;
-        description
-          "unknown equipment not validated against planned equipment";
-      }
-      enum "reserved-for-maintenance-unvalidated" {
-        value 7;
-        description
-          "equipment is to be used for use as a maintenance spare
-           but not validated against planned equipment";
-      }
-      enum "reserved-for-facility-available" {
-        value 8;
-        description
-          "reserved for use by a service and available";
-      }
-      enum "not-reserved-available" {
-        value 9;
-        description
-          "not reserved for use by a service and available";
-      }
-      enum "reserved-for-maintenance-available" {
-        value 10;
-        description
-          "reserved as a maintenance spare and available";
-      }
-      enum "reserved-for-reversion-inuse" {
-        value 11;
-        description
-          "equipment that is reserved as part of a home path
-           for a service that has been temporarily re-routed";
-      }
-      enum "not-reserved-inuse" {
-        value 12;
-        description
-          "equipment in use for a service";
-      }
-      enum "reserved-for-maintenance-inuse" {
-        value 13;
-        description
-          "maintenance spare equipment that is in use as a
-           maintenance spare";
-      }
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-equipment-states-types@2018-11-30.yang b/ordmodels/common/src/main/yang/org-openroadm-equipment-states-types@2018-11-30.yang
deleted file mode 100644 (file)
index 20aa29c..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-module org-openroadm-equipment-states-types {
-  namespace "http://org/openroadm/equipment/states/types";
-  prefix org-openroadm-equipment-states-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for types of states of equipment (slot/subslot).
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef admin-states {
-    type enumeration {
-      enum "inService" {
-        value 1;
-      }
-      enum "outOfService" {
-        value 2;
-      }
-      enum "maintenance" {
-        value 3;
-      }
-    }
-  }
-
-  typedef states {
-    type enumeration {
-      enum "reserved-for-facility-planned" {
-        value 1;
-        description
-          "equipment is planned for use by a service";
-      }
-      enum "not-reserved-planned" {
-        value 2;
-        description
-          "equipment is planned by not reserved for any purpose";
-      }
-      enum "reserved-for-maintenance-planned" {
-        value 3;
-        description
-          "equipment is planned for use as a maintenance spare";
-      }
-      enum "reserved-for-facility-unvalidated" {
-        value 4;
-        description
-          "equipment is reserved for use by a service but not
-           validated against planned equipment";
-      }
-      enum "not-reserved-unvalidated" {
-        value 5;
-        description
-          "equipment is not reserved for any purpose and
-           not validated against planned equipment";
-      }
-      enum "unknown-unvalidated" {
-        value 6;
-        description
-          "unknown equipment not validated against planned equipment";
-      }
-      enum "reserved-for-maintenance-unvalidated" {
-        value 7;
-        description
-          "equipment is to be used for use as a maintenance spare
-           but not validated against planned equipment";
-      }
-      enum "reserved-for-facility-available" {
-        value 8;
-        description
-          "reserved for use by a service and available";
-      }
-      enum "not-reserved-available" {
-        value 9;
-        description
-          "not reserved for use by a service and available";
-      }
-      enum "reserved-for-maintenance-available" {
-        value 10;
-        description
-          "reserved as a maintenance spare and available";
-      }
-      enum "reserved-for-reversion-inuse" {
-        value 11;
-        description
-          "equipment that is reserved as part of a home path
-           for a service that has been temporarily re-routed";
-      }
-      enum "not-reserved-inuse" {
-        value 12;
-        description
-          "equipment in use for a service";
-      }
-      enum "reserved-for-maintenance-inuse" {
-        value 13;
-        description
-          "maintenance spare equipment that is in use as a
-           maintenance spare";
-      }
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-equipment-states-types@2019-11-29.yang b/ordmodels/common/src/main/yang/org-openroadm-equipment-states-types@2019-11-29.yang
deleted file mode 100644 (file)
index ccfca19..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-module org-openroadm-equipment-states-types {
-  namespace "http://org/openroadm/equipment/states/types";
-  prefix org-openroadm-equipment-states-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for types of states of equipment (slot/subslot).
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef admin-states {
-    type enumeration {
-      enum inService {
-        value 1;
-      }
-      enum outOfService {
-        value 2;
-      }
-      enum maintenance {
-        value 3;
-      }
-    }
-  }
-
-  typedef states {
-    type enumeration {
-      enum reserved-for-facility-planned {
-        value 1;
-        description
-          "equipment is planned for use by a service";
-      }
-      enum not-reserved-planned {
-        value 2;
-        description
-          "equipment is planned by not reserved for any purpose";
-      }
-      enum reserved-for-maintenance-planned {
-        value 3;
-        description
-          "equipment is planned for use as a maintenance spare";
-      }
-      enum reserved-for-facility-unvalidated {
-        value 4;
-        description
-          "equipment is reserved for use by a service but not
-           validated against planned equipment";
-      }
-      enum not-reserved-unvalidated {
-        value 5;
-        description
-          "equipment is not reserved for any purpose and
-           not validated against planned equipment";
-      }
-      enum unknown-unvalidated {
-        value 6;
-        description
-          "unknown equipment not validated against planned equipment";
-      }
-      enum reserved-for-maintenance-unvalidated {
-        value 7;
-        description
-          "equipment is to be used for use as a maintenance spare
-           but not validated against planned equipment";
-      }
-      enum reserved-for-facility-available {
-        value 8;
-        description
-          "reserved for use by a service and available";
-      }
-      enum not-reserved-available {
-        value 9;
-        description
-          "not reserved for use by a service and available";
-      }
-      enum reserved-for-maintenance-available {
-        value 10;
-        description
-          "reserved as a maintenance spare and available";
-      }
-      enum reserved-for-reversion-inuse {
-        value 11;
-        description
-          "equipment that is reserved as part of a home path
-           for a service that has been temporarily re-routed";
-      }
-      enum not-reserved-inuse {
-        value 12;
-        description
-          "equipment in use for a service";
-      }
-      enum reserved-for-maintenance-inuse {
-        value 13;
-        description
-          "maintenance spare equipment that is in use as a
-           maintenance spare";
-      }
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-interfaces@2019-05-31.yang b/ordmodels/common/src/main/yang/org-openroadm-interfaces@2019-05-31.yang
deleted file mode 100644 (file)
index ef4a3ea..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-module org-openroadm-interfaces {
-  namespace "http://org/openroadm/interfaces";
-  prefix openROADM-if;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility interfaces.
-     Reused ietf-interfaces and some interface-type defined in iana-if-type.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  identity interface-type {
-    description
-      "Base identity from which specific interface types are
-       derived.";
-  }
-
-  identity ethernetCsmacd {
-    base interface-type;
-    description
-      "For all Ethernet-like interfaces, regardless of speed,
-       as per RFC 3635.";
-    reference
-      "RFC 3635 - Definitions of Managed Objects for the
-                  Ethernet-like Interface Types";
-  }
-
-  identity ip {
-    base interface-type;
-    description
-      "IP (for APPN HPR in IP networks).";
-  }
-
-  identity mediaChannelTrailTerminationPoint {
-    base interface-type;
-    description
-      "Media Channel Trail Termination Point";
-  }
-
-  identity networkMediaChannelConnectionTerminationPoint {
-    base interface-type;
-    description
-      "Network Media Channel Connection Termination Point";
-  }
-
-  identity opticalChannel {
-    base interface-type;
-    description
-      "Optical Channel.";
-  }
-
-  identity opticalTransport {
-    base interface-type;
-    description
-      "Optical Transport.";
-  }
-
-  identity otnOdu {
-    base interface-type;
-    description
-      "OTN Optical Data Unit.";
-  }
-
-  identity otnOtu {
-    base interface-type;
-    description
-      "OTN Optical channel Transport Unit.";
-  }
-
-  identity otsi {
-    base interface-type;
-    description
-      "OTSI interface.";
-  }
-
-  identity otsi-group {
-    base interface-type;
-    description
-      "OTSI Group interface.";
-  }
-
-  identity flexo {
-    base interface-type;
-    description
-      "Flexo interface.";
-  }
-
-  identity flexo-group {
-    base interface-type;
-    description
-      "Flexo Group interface.";
-  }
-
-  identity openROADMOpticalMultiplex {
-    base interface-type;
-    description
-      "Optical Transport Multiplex type for openROADM";
-  }
-
-  identity ppp {
-    base interface-type;
-    description
-      "PPP for IP GNE.";
-  }
-
-  identity gcc {
-    base interface-type;
-    description
-      "ITU-T G.709 GCC.";
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-interfaces@2019-11-29.yang b/ordmodels/common/src/main/yang/org-openroadm-interfaces@2019-11-29.yang
deleted file mode 100644 (file)
index 618c1e5..0000000
+++ /dev/null
@@ -1,181 +0,0 @@
-module org-openroadm-interfaces {
-  namespace "http://org/openroadm/interfaces";
-  prefix openROADM-if;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility interfaces.
-     Reused ietf-interfaces and some interface-type defined in iana-if-type.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  identity interface-type {
-    description
-      "Base identity from which specific interface types are
-       derived.";
-  }
-
-  identity ethernetCsmacd {
-    base interface-type;
-    description
-      "For all Ethernet-like interfaces, regardless of speed,
-       as per RFC 3635.";
-    reference
-      "RFC 3635 - Definitions of Managed Objects for the
-                  Ethernet-like Interface Types";
-  }
-
-  identity ip {
-    base interface-type;
-    description
-      "IP (for APPN HPR in IP networks).";
-  }
-
-  identity mediaChannelTrailTerminationPoint {
-    base interface-type;
-    description
-      "Media Channel Trail Termination Point";
-  }
-
-  identity networkMediaChannelConnectionTerminationPoint {
-    base interface-type;
-    description
-      "Network Media Channel Connection Termination Point";
-  }
-
-  identity opticalChannel {
-    base interface-type;
-    description
-      "Optical Channel.";
-  }
-
-  identity opticalTransport {
-    base interface-type;
-    description
-      "Optical Transport.";
-  }
-
-  identity otnOdu {
-    base interface-type;
-    description
-      "OTN Optical Data Unit.";
-  }
-
-  identity otnOtu {
-    base interface-type;
-    description
-      "OTN Optical channel Transport Unit.";
-  }
-
-  identity otsi {
-    base interface-type;
-    description
-      "OTSI interface.";
-  }
-
-  identity otsi-group {
-    base interface-type;
-    description
-      "OTSI Group interface.";
-  }
-
-  identity flexo {
-    base interface-type;
-    description
-      "Flexo interface.";
-  }
-
-  identity flexo-group {
-    base interface-type;
-    description
-      "Flexo Group interface.";
-  }
-
-  identity openROADMOpticalMultiplex {
-    base interface-type;
-    description
-      "Optical Transport Multiplex type for openROADM";
-  }
-
-  identity ppp {
-    base interface-type;
-    description
-      "PPP for IP GNE.";
-  }
-
-  identity gcc {
-    base interface-type;
-    description
-      "ITU-T G.709 GCC.";
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-layerRate@2016-10-14.yang b/ordmodels/common/src/main/yang/org-openroadm-layerRate@2016-10-14.yang
deleted file mode 100644 (file)
index e9c7eb0..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-module org-openroadm-layerRate {
-  namespace "http://org/openroadm/layerRate";
-  prefix org-openroadm-layerRate;
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of layer rates.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      AT&T Intellectual Property.  All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping layer-rate {
-    description
-      "Set list of layer rates, plus the ability to report layer rates not yet in set list.";
-    leaf type {
-      type layer-rate-enum;
-      mandatory true;
-    }
-    leaf extension {
-      type string;
-      mandatory false;
-    }
-  }
-
-  typedef layer-rate-enum {
-    type enumeration {
-      enum "vendorExtension" {
-        value 1;
-        description
-          "vendor extension";
-      }
-      enum "layer2" {
-        value 2;
-        description
-          "2";
-      }
-      enum "layer3" {
-        value 3;
-        description
-          "3";
-      }
-      enum "layer4" {
-        value 4;
-        description
-          "4";
-      }
-      enum "layer5" {
-        value 5;
-        description
-          "5";
-      }
-      enum "layer6" {
-        value 6;
-        description
-          "6";
-      }
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-layerRate@2019-11-29.yang b/ordmodels/common/src/main/yang/org-openroadm-layerRate@2019-11-29.yang
deleted file mode 100644 (file)
index ef23863..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-module org-openroadm-layerRate {
-  namespace "http://org/openroadm/layerRate";
-  prefix org-openroadm-layerRate;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of layer rates.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef layer-rate-enum {
-    type enumeration {
-      enum vendorExtension {
-        value 1;
-        description
-          "vendor extension";
-      }
-      enum layer2 {
-        value 2;
-        description
-          "2";
-      }
-      enum layer3 {
-        value 3;
-        description
-          "3";
-      }
-      enum layer4 {
-        value 4;
-        description
-          "4";
-      }
-      enum layer5 {
-        value 5;
-        description
-          "5";
-      }
-      enum layer6 {
-        value 6;
-        description
-          "6";
-      }
-    }
-  }
-
-  grouping layer-rate {
-    description
-      "Set list of layer rates, plus the ability to report layer rates not yet in set list.";
-    leaf type {
-      type layer-rate-enum;
-      mandatory true;
-    }
-    leaf extension {
-      type string;
-      mandatory false;
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-maintenance@2016-10-14.yang b/ordmodels/common/src/main/yang/org-openroadm-maintenance@2016-10-14.yang
deleted file mode 100644 (file)
index 5c6e1ff..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-module org-openroadm-maintenance {
-  namespace "http://org/openroadm/maintenance";
-  prefix org-openroadm-mainteance;
-
-  import org-openroadm-resource {
-    prefix org-openroadm-resource;
-  }
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of maintenace operations.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      AT&T Intellectual Property.  All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping maintenance {
-    leaf id {
-      description
-        "Uniquely identify maintenance activity";
-      type string;
-      mandatory true;
-    }
-    container resource {
-      description
-        "Resource under maintenance";
-      uses org-openroadm-resource:resource;
-    }
-    leaf operation {
-      type maintenance-operation;
-    }
-  }
-
-  container maintenance-list {
-    description
-      "A list of active maintenance operations. Adding an entry to this list creates an active maintenance operation.  Removing an entry from this terminates a maintenance activity";
-    list maintenance {
-      key "id";
-      uses maintenance;
-    }
-  }
-
-  typedef maintenance-operation {
-    description
-      "Maintenance Operation.";
-    type enumeration {
-      enum "terminalLoopback" {
-        value 1;
-      }
-      enum "facilityLoopback" {
-        value 2;
-      }
-      enum "testSignal" {
-        value 3;
-      }
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-maintenance@2018-10-19.yang b/ordmodels/common/src/main/yang/org-openroadm-maintenance@2018-10-19.yang
deleted file mode 100644 (file)
index 748055f..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-module org-openroadm-maintenance {
-  namespace "http://org/openroadm/maintenance";
-  prefix org-openroadm-mainteance;
-
-  import org-openroadm-resource {
-    prefix org-openroadm-resource;
-    revision-date 2018-10-19;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of maintenace operations.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      AT&T Intellectual Property.  All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef maintenance-operation {
-    type enumeration {
-      enum "terminalLoopback" {
-        value 1;
-      }
-      enum "facilityLoopback" {
-        value 2;
-      }
-      enum "testSignal" {
-        value 3;
-      }
-    }
-    description
-      "Maintenance Operation.";
-  }
-
-  grouping maintenance {
-    leaf id {
-      type string;
-      mandatory true;
-      description
-        "Uniquely identify maintenance activity";
-    }
-    container resource {
-      description
-        "Resource under maintenance";
-      uses org-openroadm-resource:resource;
-    }
-    leaf operation {
-      type maintenance-operation;
-    }
-  }
-
-  container maintenance-list {
-    description
-      "A list of active maintenance operations. Adding an entry to this list creates an active maintenance operation.  Removing an entry from this terminates a maintenance activity";
-    list maintenance {
-      key "id";
-      uses maintenance;
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-manifest-file@2020-03-27.yang b/ordmodels/common/src/main/yang/org-openroadm-manifest-file@2020-03-27.yang
deleted file mode 100644 (file)
index 27012bd..0000000
+++ /dev/null
@@ -1,1026 +0,0 @@
-module org-openroadm-manifest-file {
-  namespace "http://org/openroadm/manifest-file";
-  prefix org-openroadm-manifest-file;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of sw-manifest-file
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2017,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF netconf.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-    reference
-      "This module serves as the manifest file reference.";
-  }
-
-  identity manifest-commands {
-    description
-      "base identity for defining manifest-commands.";
-  }
-
-  identity download-file {
-    base manifest-commands;
-    description
-      "download-file (transfer from OWB-C to Device)";
-  }
-
-  identity upload-file {
-    base manifest-commands;
-    description
-      "upload-file (transfer from Device to OWB-C)";
-  }
-
-  identity delete-file {
-    base manifest-commands;
-    description
-      "delete-file from device";
-  }
-
-  identity sw-manifest-commands {
-    base manifest-commands;
-    description
-      "base identity for defining manifest-commands specific to sw-manifest.";
-  }
-
-  identity sw-stage {
-    base sw-manifest-commands;
-    description
-      "sw-stage sw-manifest-command";
-  }
-
-  identity sw-activate {
-    base sw-manifest-commands;
-    description
-      "sw-activate sw-manifest-command";
-  }
-
-  identity cancel-validation-timer {
-    base sw-manifest-commands;
-    description
-      "cancel-validation-timer sw-manifest-command";
-  }
-
-  identity db-backup-manifest-commands {
-    base manifest-commands;
-    description
-      "base identity for defining manifest-commands specific to db-backup-manifest.";
-  }
-
-  identity db-backup {
-    base db-backup-manifest-commands;
-    description
-      "db-backup db-backup-manifest-command";
-  }
-
-  identity db-restore-manifest-commands {
-    base manifest-commands;
-    description
-      "base identity for defining manifest-commands specific to db-restore-manifest.";
-  }
-
-  identity db-restore {
-    base db-restore-manifest-commands;
-    description
-      "db-restore db-restore-manifest-command";
-  }
-
-  identity db-activate {
-    base db-restore-manifest-commands;
-    description
-      "db-activate db-restore-manifest-command";
-  }
-
-  identity cancel-rollback-timer {
-    base db-restore-manifest-commands;
-    description
-      "cancel-rollback-timer db-restore-manifest-command";
-  }
-
-  grouping base-manifest {
-    description
-      "base set of variables in all manifest files";
-    leaf vendor {
-      type string;
-      mandatory true;
-      description
-        "This field should match the /org-openroadm-device/info/vendor.
-         It is assumed that the vendor value does not change during the
-         processing of the manifest file.
-
-         The controller agent would use the vendor and model to find the
-         manifest for an Open ROADM NE. The controller agent would also
-         use the vendor and model to validate that this is a valid manifest
-         for the Open ROADM NE.
-        ";
-    }
-    leaf model {
-      type string;
-      mandatory true;
-      description
-        "This field should match the /org-openroadm-device/info/model.
-         It is assumed that the model value does not change during the
-         processing of the manifest file.
-
-         The controller agent would use the vendor and model to find the
-         manifest for an Open ROADM NE. The controller agent would also
-         use the vendor and model to validate that this is a valid manifest
-         for the Open ROADM NE.
-        ";
-    }
-    leaf sw-version {
-      type string;
-      description
-        "This field should match the
-             /org-openroadm-device/info/softwareVersion.
-         This is the value in the info tree AFTER an upgrade.
-        ";
-    }
-    leaf global-async-timeout {
-      type uint16;
-      default "900";
-      description
-        "global-async-timeout - time in seconds to wait for command processing to
-         complete.
-
-         Upon timeout, the controller may either:
-           - assume success;
-           - assume failure;
-           - poll the device to determine success/failure of the operation
-
-         This global-async-timeout applies to any asynchronous command.
-        ";
-    }
-    leaf global-sync-timeout {
-      type uint16;
-      description
-        "global-sync-timeout - time in seconds to wait for the rpc response for
-         synchronous commands.
-
-         This global-sync-timeout applies to any synchronous command.
-
-         Upon timeout, the controller may either:
-           - assume success;
-           - assume failure;
-           - poll the device to determine success/failure of the operation
-
-         No default is modeled; if not provided, defaults to the global
-         timeout supported by the controller for rpc responses.
-        ";
-    }
-  }
-
-  grouping timeout-command {
-    description
-      "timeout-command is to be used by any manifest command supporting a timeout";
-    leaf timeout {
-      type uint16;
-      description
-        "See command for additional details.
-         if command is async,
-           - overrides the global-async-timeout;
-           - defaults to the global-async-timeout if not provided.
-         if command is sync,
-           - overrides the global-sync-timeout;
-           - defaults to the global-sync-timeout if not provided.
-        ";
-    }
-  }
-
-  grouping is-async-command {
-    description
-      "is-async-command is to be supported by all manifest commands even if only
-       supported as sync or async. In such cases, a must statement should be
-       included to limit support to either sync or async.";
-    leaf is-async {
-      type boolean;
-      default "true";
-      description
-        "command can be supported as either an async or sync command by a vendor.
-         When supported as a sync command, the OWB-C will determine the success/failure
-         of the command based on the RPC response instead of waiting for transient
-         notifications from the device.";
-    }
-  }
-
-  grouping transfer-command {
-    description
-      "transfer-command defines the common set of variables used by download-file
-       and upload-file";
-    leaf remote-filename {
-      type string;
-      mandatory true;
-      description
-        "See command for detailed description.";
-    }
-    leaf local-file-path {
-      type string;
-      mandatory true;
-      description
-        "See command for detailed description.";
-    }
-    uses timeout-command;
-    uses is-async-command;
-  }
-
-  grouping file-command {
-    description
-      "file-command is used by all manifest files needing a filename";
-    leaf filename {
-      type string;
-      description
-        "filename is mandatory for delete-file; optional otherwise.
-         See command for detailed description.";
-    }
-  }
-
-  grouping command-reboot {
-    description
-      "command-reboot is used by manifest commands which result in a
-       device restart.";
-    leaf auto-reboot {
-      type uint16;
-      mandatory true;
-      description
-        "See command for detailed description.";
-    }
-  }
-
-  grouping download-file-command {
-    description
-      "down-file-command";
-    container download-file {
-      when "../command = 'download-file'";
-      description
-        "Transfer a file from the SFTP server to the device.
-         format: download-file remote-filename local-file-path [timeout]
-         where
-           remote-filename is the filename of the file to transfer on the SFTP
-           server. The filename can include a relative path that represents the
-           subdirectory structure of the vendor's software directory. This file
-           (and optional path) must exist in the software release directory on
-           the SFTP server.
-
-           local-file-path is the local path and filename to transfer the file on
-           the device.
-
-           timeout - see timeout-command grouping for basic details;
-                     if command is async,
-                       - Receipt of an in-progress (version 2)
-                         transfer-notification resets the timeout.
-
-         Maps to the transfer rpc with
-            action = download
-            local-file-path = local-file-path
-            remote-file-path =
-               sftp://user:password@host[:port]/path/remote-filename
-
-            The remote-file-path attribute on the transfer command would be
-            constructed by the software download agent by appending the sftp URL
-            (which includes username, password, host, port, and path to the
-            software release directory) with the remote_filename.
-
-         In the context of the transfer, remote is the SFTP server (e.g., located
-         on the software download agent) and local is on the Open ROADM device.
-
-         Expected notifications: transfer-notification
-        ";
-      uses transfer-command;
-    }
-  }
-
-  grouping upload-file-command {
-    description
-      "upload-file-command";
-    container upload-file {
-      when "../command = 'upload-file'";
-      description
-        "Transfer a file from the device to the SFTP server.
-         format: upload-file remote-filename local-file-path [timeout]
-         where
-           remote-filename is the filename of the file to receive the upload
-           on the SFTP server. The filename can include a relative path that
-           represents the subdirectory structure of the vendor's software
-           directory.
-
-           local-file-path is the local path and filename of the file on
-           the device to be uploaded to the SFTP server. This file must exist on
-           the device.
-
-           timeout - see timeout-command grouping for basic details;
-                     if command is async,
-                       - Receipt of an in-progress (version 2)
-                         transfer-notification resets the timeout.
-
-         Maps to the transfer rpc with
-            action = upload
-            local-file-path = local-file-path
-            remote-file-path =
-               sftp://user:password@host[:port]/path/remote-filename
-
-            The remote-file-path attribute on the transfer command would be
-            constructed by the software download agent by appending the sftp URL
-            (which includes username, password, host, port, and path to the
-            software release directory) with the remote_filename.
-
-         In the context of the transfer, remote is the SFTP server (e.g., located
-         on the software download agent) and local is on the Open ROADM device.
-
-         Expected notifications: transfer-notification
-        ";
-      uses transfer-command;
-    }
-  }
-
-  grouping delete-file-command {
-    description
-      "delete-file-command";
-    container delete-file {
-      when "../command = 'delete-file'";
-      must "is-async != 'false'" {
-        error-message "delete-file is only supported as sync command";
-      }
-      description
-        "Delete a file from the device's file system.
-         format: delete-file filename [timeout]
-         where
-           filename is the filename to be deleted from the device. The filename
-           may include path information.
-
-           timeout - overrides the global-sync-timeout; defaults to the
-                     global-sync-timeout if not provided.
-
-         Maps to the delete-file rpc:
-            delete-file filename
-        ";
-      uses file-command {
-        refine "filename" {
-          mandatory true;
-        }
-      }
-      uses timeout-command;
-      uses is-async-command;
-    }
-  }
-
-  grouping sw-stage-command {
-    description
-      "sw-stage-command";
-    container sw-stage {
-      when "../command = 'sw-stage'";
-      description
-        "Stage a file in the device.  The details of what a device does during
-         the staging operation is vendor specific.  However, the vendor may
-         initiate additional file transfers from the SFTP server during the
-         staging operation.  It is expected that the files will only be
-         transferred from the software release directory.
-
-         format: sw-stage [filename] [timeout]
-         where
-           filename is the filename of the file to stage. If filename is not
-           provided, the software download application will send the sw-stage
-           command without a filename.
-
-           timeout - overrides the global-async-timeout; defaults to the
-                     global-async-timeout if not provided.
-
-
-         Maps to the sw-stage rpc:
-            sw-stage [filename]
-
-         Expected notifications: sw-stage-notification
-        ";
-      uses file-command;
-      uses timeout-command;
-      uses is-async-command;
-    }
-  }
-
-  grouping wait-time-command {
-    description
-      "Wait timer starting from the completion of sw-activate or db-activate before canceling the validation timer or rollback timer";
-    leaf wait-time {
-      type uint16;
-      mandatory true;
-      description
-        "See command for detailed description.";
-    }
-  }
-
-  grouping sw-activate-command {
-    description
-      "sw-activate-command";
-    container sw-activate {
-      when "../command = 'sw-activate'";
-      must "is-async != 'true'" {
-        error-message "sw-activate is only supported as async command";
-      }
-      description
-        "Activate a software load in a device.  The details of what a device does
-         during the activation phase is vendor specific.  The device initiates
-         an automatic reboot as part of the activation.
-
-         format:  sw-activate version [validation-timer] [timeout] auto-reboot
-         where:
-           version: The version of software that is being activated. (The current
-           YANG model indicates that version is optional; however, version should
-           be a mandatory attribute of the sw-activate command in the manifest
-           file).
-
-           validation-timer: Validation timer setting for the software activation.
-           Format is expected to be in the form HH-MM-SS per the YANG model. The
-           software download application expects this format in order to treat
-           00-00-00 and no validation timer as the same use case.
-
-           timeout - overrides the global-async-timeout; defaults to the
-           global-async-timeout if not provided. This timer begins as soon as the
-           sw-activate processing begins. timeout must be greater than the
-           auto-reboot time.
-
-           auto-reboot: time (in seconds) to wait to for the device to reboot.
-           This is the device restart time (e.g. the length of time from device
-           comm loss until the device is ready for login). This timer begins when
-           the controller detects the comm-loss from the device. If login is not
-           successful when this timer expires, the sw-activate is failed.
-
-           NOTE: if controller swdl application is not doing the login directly,
-           the controller may need to augment the auto-reboot timer to account for
-           the login time.
-
-         Maps to the sw-activate rpc:
-           sw-activate version [validationTimer]
-
-         Expected notifications: sw-activate-notification
-           When no validation timer (or validation-timer = 00-00-00), two
-           notifications will be expected: one for activate, the other for
-           commit. Otherwise, only the activate notification is expected.
-
-           NOTE: the sw-activate-notifications (for activate) may be received
-           before or after the reboot; it is assumed the sw-activate-notification
-           (for commit) always occurs after the reboot. Any polling due to missed
-           sw-activate-notifications (activate and/or commit) should not be done
-           until after the reboot login; processing of sw-activate does not
-           complete until after receipt of the notifications and the reboot login.
-        ";
-      leaf version {
-        type string;
-        mandatory true;
-        description
-          "Although version is optional in the sw-activate rpc, it is
-           mandatory in the manifest file command.";
-      }
-      leaf validation-timer {
-        type string;
-        description
-          "hh-mm-ss";
-      }
-      uses timeout-command;
-      uses command-reboot;
-      uses is-async-command;
-    }
-  }
-
-  grouping cancel-validation-timer-command {
-    description
-      "cancel-validation-timer-command";
-    container cancel-validation-timer {
-      when "../command = 'cancel-validation-timer'";
-      description
-        "Command to automatically cancel the validation timer after wait-time.
-         Accept will be set to True if this command is used.
-
-         format:  cancel-validation-timer wait-time [time-out]
-         where:
-
-           wait-time - wait timer starting from the completion of
-           sw-activate before canceling the validation timer.
-
-           timeout - see timeout-command grouping for basic details.
-
-         Expected notifications: sw-activate-notification
-           commit notification is expected.
-        ";
-      uses wait-time-command;
-      uses timeout-command;
-      uses is-async-command;
-    }
-  }
-
-  grouping db-backup-command {
-    description
-      "db-backup-command";
-    container db-backup {
-      when "../command = 'db-backup'";
-      description
-        "Perform a database backup on the device.
-
-         format: db-backup [filename] [timeout]
-         where
-           filename is the filename of the backup file to be generated on the
-           device. If filename is not provided, the database backup application
-           will send the db-backup command without a filename. It's possible the
-           filename will not be statically provided in the manifest file, but
-           provided by the database backup application.
-
-           timeout - see timeout-command grouping for basic details;
-
-         Maps to the db-backup rpc:
-           db-backup [filename]
-
-         Expected notifications: db-backup-notification
-        ";
-      uses file-command;
-      uses timeout-command;
-      uses is-async-command;
-    }
-  }
-
-  grouping db-restore-command {
-    description
-      "db-restore-command";
-    container db-restore {
-      when "../command = 'db-restore'";
-      description
-        "Perform a database restore on the device.
-
-         format: db-restore [filename] [node-id-check] [timeout]
-         where
-           filename is the filename of the file to be restored on the
-           device. If filename is not provided, the database restore application
-           will send the db-restore command without a filename. It's possible the
-           filename will not be statically provided in the manifest file, but
-           provided by the database restore application.
-
-           node-id-check is a boolean indicating whether sysNameCheck is required.
-
-           timeout - see timeout-command grouping for basic details;
-
-         Maps to the db-restore rpc:
-           db-restore [filename] [nodeIDCheck]
-
-         Expected notifications: db-restore-notification
-        ";
-      uses file-command;
-      leaf node-id-check {
-        type string;
-        default "true";
-        description
-          "Defined as an string here so that manifest file can parameterize
-           the value for user input. __NODE-ID-CHECK is used for that purpose. Other valid
-           values are true or false. Maps to a boolean value in the rpc invocation.";
-      }
-      uses timeout-command;
-      uses is-async-command;
-    }
-  }
-
-  grouping cancel-rollback-timer-command {
-    description
-      "cancel-rollback-timer-command";
-    container cancel-rollback-timer {
-      when "../command = 'cancel-rollback-timer'";
-      description
-        "Command to automatically cancel the rollback timer after wait-time.
-         Accept will be set to True if this command is used.
-
-         format: cancel-rollback-timer wait-time [timeout]
-
-           wait-time - Wait timer starting from the completion of
-           db-activate before canceling the rollback timer.
-
-           timeout - see timeout-command grouping for basic details.
-
-         Expected notifications: db-activate-notification
-           commit notification is expected.
-        ";
-      uses wait-time-command;
-      uses timeout-command;
-      uses is-async-command;
-    }
-  }
-
-  grouping db-activate-command {
-    description
-      "db-activate-command";
-    container db-activate {
-      when "../command = 'db-activate'";
-      must "is-async != 'true'" {
-        error-message "db-activate is only supported as async command";
-      }
-      description
-        "Activate a database on a device.  The details of what a device does
-         during the activation phase is vendor specific.  The device initiates
-         an automatic reboot as part of the activation.
-
-         format:  db-activate [rollback-timer] [timeout] auto-reboot
-         where:
-           rollback-timer: Rollback timer setting for the database activation.
-           Format is expected to be in the form HH-MM-SS per the YANG model. The
-           database activation application expects this format in order to treat
-           00-00-00 and no validation timer as the same use case.
-
-           timeout - overrides the global-async-timeout; defaults to the
-           global-async-timeout if not provided. This timer begins as soon as the
-           db-activate processing begins. timeout must be greater than the
-           auto-reboot time.
-
-           auto-reboot: time (in seconds) to wait to for the device to reboot.
-           This is the device restart time (e.g. the length of time from device
-           comm loss until the device is ready for login). This timer begins when
-           the controller detects the comm-loss from the device. If login is not
-           successful when this timer expires, the db-activate is failed.
-
-           NOTE: if controller database application is not doing the login
-           directly, the controller may need to augment the auto-reboot timer to
-           account for the login time.
-
-         Maps to the db-activate rpc:
-           db-activate [rollBackTimer]
-
-         Expected notifications: db-activate-notification
-           When no rollback timer (or rollback-timer = 00-00-00), two
-           notifications will be expected: one for activate, the other for
-           commit. Otherwise, only the activate notification is expected.
-
-           NOTE: the db-activate-notifications (for activate) may be received
-           before or after the reboot; it is assumed the db-activate-notification
-           (for commit) always occurs after the reboot. Any polling due to missed
-           db-activate-notifications (activate and/or commit) should not be done
-           until after the reboot login; processing of db-activate does not
-           complete until after receipt of the notifications and the reboot login.
-        ";
-      leaf rollback-timer {
-        type string;
-        description
-          "hh-mm-ss";
-      }
-      uses timeout-command;
-      uses command-reboot;
-      uses is-async-command;
-    }
-  }
-
-  container sw-manifest {
-    presence "The sw-manifest instructions for swdl operations have been defined.";
-    description
-      "The manifest file provides instructions to a software download
-       application to download and install a new software load into a vendor's
-       equipment.
-
-       Software download files
-           All vendor files for a software release should be stored in a
-       separate directory. A unique directory would be used for each vendor,
-       model and software release combination. This directory and all files in
-       that directory will be accessible by the SFTP server.
-           The software directory can be flat or hierarchical with
-       subdirectories. The manifest file should be in the root directory of the
-       software directory.
-           A software directory must contain files for one and only one
-       software release.
-
-       Manifest file name
-           Each software release directory shall contain a manifest file for
-       that release. The filename for the manifest file shall be sw-manifest.json.
-      ";
-    uses base-manifest {
-      refine "sw-version" {
-        mandatory true;
-      }
-    }
-    list instruction-set {
-      key "index";
-      description
-        "The instruction set for a list of sw-versions that can be upgraded to
-         the sw-version specified at the top of the manifest file.";
-      leaf index {
-        type uint8;
-        description
-          "The index for this instruction set.";
-      }
-      leaf-list from-sw-version {
-        type string;
-        description
-          "The optional list of sw-versions that can be upgraded to the
-           sw-version specified at the top of the sw-manifest file.
-
-           If not specified, this instruction set is used to upgrade from
-           any sw-version to the sw-version specified at the top of the
-           sw-manifest file.
-
-           If multiple instruction sets are provided, from-sw-version
-           should always be defined.";
-      }
-      leaf is-commit-sw-activate-async {
-        type boolean;
-        default "true";
-        description
-          "Is cancel-validation-timer (accept = true) supported as an
-           async or sync command on the device? If supported as sync, the rpc response
-           is used to determine success/failure instead of waiting for transient notifications
-           of the result.
-           NOTE: cancel-validation-timer (accept = false) requires a reboot so is
-           always considered async";
-      }
-      leaf cancel-validation-timer-async-timeout {
-        type uint16;
-        description
-          "timeout value to use for cancel-validation-timer when supported as
-           an async command. If not specified, the global-async-timeout is used.";
-      }
-      leaf cancel-validation-timer-sync-timeout {
-        type uint16;
-        description
-          "timeout value to use for cancel-validation-timer (accept = true) when
-           supported as a sync command. If not specified, the global-sync-timeout
-           is used.";
-      }
-      container sw-manifest-commands {
-        description
-          "The ordered list of commands to be processed. Since some yang
-           implementations do not support ordered-by user, the list is also
-           indexed by command-order. The commands should be processed
-           in the order of command-order.
-
-           Processing moves to the next command when:
-           1. command is synchronous and rpc returns a successful result.
-           2. command is asynchronous, the rpc returns a successful result,
-           and
-           2.1 expected successful notification(s) have been received; or
-           2.2 timeout occurs.
-           \t\t
-           Processing of the manifest file is aborted when:
-           1. command is synchronous and rpc returns a failed result.
-           2. command is asynchronous, and:
-           2.1 the rpc returns a failed result; or
-           2.2 a failed notification is received; or
-           2.3 timeout occurs.
-           \t\t
-           NOTE: behavior for timeouts (synchronous or asynchronous) may depend upon
-           controller implementation per command. It may be considered either:
-           - as a successful result
-           - as a failed result
-           - as a success or failure based on polling the device
-          ";
-        list sw-manifest-command {
-          key "command-order";
-          ordered-by user;
-          description
-            "The list of commands to be processed.";
-          leaf command-order {
-            type uint8;
-            description
-              "The order in which commands should be processed.";
-          }
-          leaf command {
-            type identityref {
-              base sw-manifest-commands;
-            }
-            mandatory true;
-            description
-              "The command to be processed.";
-          }
-          uses download-file-command;
-          uses delete-file-command;
-          uses sw-stage-command;
-          uses sw-activate-command;
-          uses cancel-validation-timer-command;
-        }
-      }
-    }
-  }
-  container db-backup-manifest {
-    presence "The db-backup-manifest template for db-backup operations has been defined.";
-    description
-      "The manifest file provides instructions to a database operations
-       application to backup the database on a device.
-
-       Since the files used for these operations are likely user selected,
-       these manifest files are more likely used by the controller as a
-       template to control the overall flow of a backup operation and provide
-       a means of providing customized timeout values.
-
-       The following strings will be recognized as parameters to be replaced
-       by the user selected values: __LOCAL-FILE-PATH, __REMOTE-FILENAME.
-
-       Manifest file name
-           Each vendor/model combination can have a separate manifest file
-       defined for backup. These shall be named db-backup-manifest.json.
-      ";
-    uses base-manifest;
-    container db-backup-manifest-commands {
-      description
-        "The ordered list of commands to be processed. Since some yang
-         implementations do not support ordered-by user, the list is also
-         indexed by command-order. The commands should be processed
-         in the order of command-order.
-
-         Processing moves to the next command when:
-            1. command is synchronous and rpc returns a successful result.
-            2. command is asynchronous, the rpc returns a successful result,
-               and
-               2.1 expected successful notification(s) have been received; or
-               2.2 timeout occurs.
-
-         Processing of the manifest file is aborted when:
-            1. command is synchronous and rpc returns a failed result.
-            2. command is asynchronous, and:
-               2.1 the rpc returns a failed result; or
-               2.2 a failed notification is received; or
-               2.3 timeout occurs.
-
-         NOTE: behavior for timeouts (synchronous or asynchronous) may depend upon
-         controller implementation per command. It may be considered either:
-             - as a successful result
-             - as a failed result
-             - as a success or failure based on polling the device
-        ";
-      list db-backup-manifest-command {
-        key "command-order";
-        ordered-by user;
-        description
-          "The list of commands to be processed.";
-        leaf command-order {
-          type uint8;
-          description
-            "The order in which commands should be processed.";
-        }
-        leaf command {
-          type identityref {
-            base db-backup-manifest-commands;
-          }
-          mandatory true;
-          description
-            "The command to be processed.";
-        }
-        uses upload-file-command;
-        uses delete-file-command;
-        uses db-backup-command;
-      }
-    }
-  }
-  container db-restore-manifest {
-    presence "The db-restore-manifest template for db-restore operations has been defined.";
-    description
-      "The manifest file provides instructions to a database operations
-       application to restore the database on a device.
-
-       Since the files used for these operations are likely user selected,
-       these manifest files are more likely used by the controller as a
-       template to control the overall flow of a restore operation and provide
-       a means of providing customized timeout and auto-reboot values.
-
-       The following strings will be recognized as parameters to be replaced
-       by the user selected values: __LOCAL-FILE-PATH, __REMOTE-FILENAME,
-       __NODE-ID-CHECK.
-
-       Manifest file name
-           Each vendor/model combination can have a separate manifest file
-       defined for restore. These shall be named db-restore-manifest.json.
-      ";
-    uses base-manifest;
-    leaf is-commit-db-activate-async {
-      type boolean;
-      default "true";
-      description
-        "Is cancel-rollback-timer (accept = true) supported as an
-         async or sync command on the device? If supported as sync, the rpc response
-         is used to determine success/failure instead of waiting for transient notifications
-         of the result.
-         NOTE: cancel-rollback-timer (accept = false) requires a reboot so is
-         always considered async";
-    }
-    leaf cancel-rollback-timer-async-timeout {
-      type uint16;
-      description
-        "timeout value to use for cancel-rollback-timer when supported as
-         an async command. If not specified, the global-async-timeout is used.";
-    }
-    leaf cancel-rollback-timer-sync-timeout {
-      type uint16;
-      description
-        "timeout value to use for cancel-rollback-timer (accept = true) when
-         supported as a sync command. If not specified, the global-sync-timeout
-         is used.";
-    }
-    leaf database-init-sync-timeout {
-      type uint16;
-      description
-        "timeout value to use for database-init command. If not specified,
-         the global-sync-timeout is used.";
-    }
-    container db-restore-manifest-commands {
-      description
-        "The ordered list of commands to be processed. Since some yang
-         implementations do not support ordered-by user, the list is also
-         indexed by command-order. The commands should be processed
-         in the order of command-order.
-
-         Processing moves to the next command when:
-            1. command is synchronous and rpc returns a successful result.
-            2. command is asynchronous, the rpc returns a successful result,
-               and
-               2.1 expected successful notification(s) have been received; or
-               2.2 timeout occurs.
-
-         Processing of the manifest file is aborted when:
-            1. command is synchronous and rpc returns a failed result.
-            2. command is asynchronous, and:
-               2.1 the rpc returns a failed result; or
-               2.2 a failed notification is received; or
-               2.3 timeout occurs.
-
-         NOTE: behavior for timeouts (synchronous or asynchronous) may depend upon
-         controller implementation per command. It may be considered either:
-             - as a successful result
-             - as a failed result
-             - as a success or failure based on polling the device
-        ";
-      list db-restore-manifest-command {
-        key "command-order";
-        ordered-by user;
-        description
-          "The list of commands to be processed.";
-        leaf command-order {
-          type uint8;
-          description
-            "The order in which commands should be processed.";
-        }
-        leaf command {
-          type identityref {
-            base db-restore-manifest-commands;
-          }
-          mandatory true;
-          description
-            "The command to be processed.";
-        }
-        uses download-file-command;
-        uses delete-file-command;
-        uses db-restore-command;
-        uses db-activate-command;
-        uses cancel-rollback-timer-command;
-      }
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-network-resource@2018-11-30.yang b/ordmodels/common/src/main/yang/org-openroadm-network-resource@2018-11-30.yang
deleted file mode 100644 (file)
index 3145572..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-module org-openroadm-network-resource {
-  namespace "http://org/openroadm/network-resource";
-  prefix org-openroadm-network-resource;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of resources.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-
-  identity network-resource-types {
-    description
-      "base type for network resources";
-  }
-
-  identity network-resource-tp {
-    base network-resource-types;
-    description
-      "tp-id network resource";
-  }
-
-  identity network-resource-link {
-    base network-resource-types;
-    description
-      "link-id network resource";
-  }
-
-  grouping network-resource {
-    description
-      "This resource identifier is intended to provide a generic identifer
-       for any network resource that can be used without specific knowledge of
-       the resource.";
-    container network-resource {
-      choice network-resource {
-        case network-resource-tp {
-          uses network-tp-name;
-        }
-        case network-resource-link {
-          uses network-link-name;
-        }
-      }
-    }
-    leaf network-resource-type {
-      type identityref {
-        base network-resource-types;
-      }
-      mandatory true;
-    }
-  }
-
-  grouping network-tp-name {
-    leaf tp-network-id {
-      type string;
-      mandatory true;
-      description
-        "network-id from the network model.";
-    }
-    leaf tp-node-id {
-      type string;
-      mandatory true;
-      description
-        "node-id from the network model.";
-    }
-    leaf tp-id {
-      type string;
-      mandatory true;
-      description
-        "tp-id from the network model.";
-    }
-  }
-
-  grouping network-link-name {
-    leaf link-network-id {
-      type string;
-      mandatory true;
-      description
-        "network-id from the network model.";
-    }
-    leaf link-id {
-      type string;
-      mandatory true;
-      description
-        "link-id from the network model.";
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-network-resource@2019-11-29.yang b/ordmodels/common/src/main/yang/org-openroadm-network-resource@2019-11-29.yang
deleted file mode 100644 (file)
index 3da7ee2..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-module org-openroadm-network-resource {
-  namespace "http://org/openroadm/network-resource";
-  prefix org-openroadm-network-resource;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of resources.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-
-  identity network-resource-types {
-    description
-      "base type for network resources";
-  }
-
-  identity network-resource-tp {
-    base network-resource-types;
-    description
-      "tp-id network resource";
-  }
-
-  identity network-resource-link {
-    base network-resource-types;
-    description
-      "link-id network resource";
-  }
-
-  grouping network-resource {
-    description
-      "This resource identifier is intended to provide a generic identifer
-       for any network resource that can be used without specific knowledge of
-       the resource.";
-    container network-resource {
-      choice network-resource {
-        case network-resource-tp {
-          uses network-tp-name;
-        }
-        case network-resource-link {
-          uses network-link-name;
-        }
-      }
-    }
-    leaf network-resource-type {
-      type identityref {
-        base network-resource-types;
-      }
-      mandatory true;
-    }
-  }
-
-  grouping network-tp-name {
-    leaf tp-network-id {
-      type string;
-      mandatory true;
-      description
-        "network-id from the network model.";
-    }
-    leaf tp-node-id {
-      type string;
-      mandatory true;
-      description
-        "node-id from the network model.";
-    }
-    leaf tp-id {
-      type string;
-      mandatory true;
-      description
-        "tp-id from the network model.";
-    }
-  }
-
-  grouping network-link-name {
-    leaf link-network-id {
-      type string;
-      mandatory true;
-      description
-        "network-id from the network model.";
-    }
-    leaf link-id {
-      type string;
-      mandatory true;
-      description
-        "link-id from the network model.";
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-otn-common-types@2016-10-14.yang b/ordmodels/common/src/main/yang/org-openroadm-otn-common-types@2016-10-14.yang
deleted file mode 100644 (file)
index 26a6879..0000000
+++ /dev/null
@@ -1,257 +0,0 @@
-module org-openroadm-otn-common-types {
-  namespace "http://org/openroadm/otn-common-types";
-  prefix org-openroadm-otn-common-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for common otn related type definitions.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-
-  identity otu-rate-identity {
-    description
-      "A unique rate identification of the OTU.";
-  }
-
-  identity OTU4 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU4";
-  }
-
-  identity OTU3 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU3";
-  }
-
-  identity OTU2 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU2";
-  }
-
-  identity OTU2e {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU2e";
-  }
-
-  identity OTU1 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU1";
-  }
-
-  identity OTU0 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU0";
-  }
-
-  identity OTUflex {
-    base otu-rate-identity;
-    description
-      "Identity for an OTUflex";
-  }
-
-  identity odu-payload-type-identity {
-    description
-      "A unique payload type identification of the ODU.";
-  }
-
-  identity PT20 {
-    base odu-payload-type-identity;
-    description
-      "Identity for an ODU Payload 20";
-  }
-
-  identity PT21 {
-    base odu-payload-type-identity;
-    description
-      "Identity for an ODU Payload 21";
-  }
-
-  identity PT22 {
-    base odu-payload-type-identity;
-    description
-      "Identity for an ODU Payload 22";
-  }
-
-  identity odu-rate-identity {
-    description
-      "A unique rate identification of the ODU.";
-  }
-
-  identity ODU4 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU4";
-  }
-
-  identity ODU3 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU3";
-  }
-
-  identity ODU2 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU2";
-  }
-
-  identity ODU2e {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU2e";
-  }
-
-  identity ODU1 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU1";
-  }
-
-  identity ODU0 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU0";
-  }
-
-  identity ODUflex-cbr {
-    base odu-rate-identity;
-    description
-      "Identity for an ODUflex-cbr";
-  }
-
-  identity ODUflex-gfp {
-    base odu-rate-identity;
-    description
-      "Identity for an ODUflex-gfp";
-  }
-
-  identity odtu-type-identity {
-    description
-      "A unique identification for the MSI odtu type.";
-  }
-
-  identity ODTU4.ts-Allocated {
-    base odtu-type-identity;
-    description
-      "OPU4 MSI - ODTU4.ts, OPU4 MSI TS is occupied/allocated.
-       Applies to all ODTU4.x mappings";
-  }
-
-  identity ODTU01 {
-    base odtu-type-identity;
-    description
-      "ODTU01 MSI type";
-  }
-
-  identity ODTU12 {
-    base odtu-type-identity;
-    description
-      "ODTU12 MSI type";
-  }
-
-  identity ODTU13 {
-    base odtu-type-identity;
-    description
-      "ODTU13 MSI type";
-  }
-
-  identity ODTU23 {
-    base odtu-type-identity;
-    description
-      "ODTU23 MSI type";
-  }
-
-  identity ODTU2.ts {
-    base odtu-type-identity;
-    description
-      "ODTU2.ts MSI type";
-  }
-
-  identity ODTU3.ts {
-    base odtu-type-identity;
-    description
-      "ODTU3.ts MSI type";
-  }
-
-  identity unallocated {
-    base odtu-type-identity;
-    description
-      "Unallocated MSI type";
-  }
-
-  identity odu-function-identity {
-    description
-      "A unique identification of the ODUk interface function.";
-  }
-
-  identity ODU-TTP {
-    base odu-function-identity;
-    description
-      "ODU TTP facility facing trail termination";
-  }
-
-  identity ODU-CTP {
-    base odu-function-identity;
-    description
-      "ODU CTP connection termination";
-  }
-
-  identity ODU-TTP-CTP {
-    base odu-function-identity;
-    description
-      "ODU CTP mapper level connection termination with trail termination and client adaptation";
-  }
-
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-otn-common-types@2017-12-15.yang b/ordmodels/common/src/main/yang/org-openroadm-otn-common-types@2017-12-15.yang
deleted file mode 100644 (file)
index 41f4cdf..0000000
+++ /dev/null
@@ -1,246 +0,0 @@
-module org-openroadm-otn-common-types {
-  namespace "http://org/openroadm/otn-common-types";
-  prefix org-openroadm-otn-common-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for common otn related type definitions.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-
-  identity otu-rate-identity {
-    description
-      "A unique rate identification of the OTU.";
-  }
-
-  identity OTU4 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU4";
-  }
-
-  identity OTU3 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU3";
-  }
-
-  identity OTU2 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU2";
-  }
-
-  identity OTU2e {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU2e";
-  }
-
-  identity OTU1 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU1";
-  }
-
-  identity OTU0 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU0";
-  }
-
-  identity OTUflex {
-    base otu-rate-identity;
-    description
-      "Identity for an OTUflex";
-  }
-
-  identity odu-rate-identity {
-    description
-      "A unique rate identification of the ODU.";
-  }
-
-  identity ODU4 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU4";
-  }
-
-  identity ODU3 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU3";
-  }
-
-  identity ODU2 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU2";
-  }
-
-  identity ODU2e {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU2e";
-  }
-
-  identity ODU1 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU1";
-  }
-
-  identity ODU0 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU0";
-  }
-
-  identity ODUflex-cbr {
-    base odu-rate-identity;
-    description
-      "Identity for an ODUflex-cbr";
-  }
-
-  identity ODUflex-gfp {
-    base odu-rate-identity;
-    description
-      "Identity for an ODUflex-gfp";
-  }
-
-  identity odtu-type-identity {
-    description
-      "A unique identification for the MSI odtu type.";
-  }
-
-  identity ODTU4.ts-Allocated {
-    base odtu-type-identity;
-    description
-      "OPU4 MSI - ODTU4.ts, OPU4 MSI TS is occupied/allocated.
-       Applies to all ODTU4.x mappings";
-  }
-
-  identity ODTU01 {
-    base odtu-type-identity;
-    description
-      "ODTU01 MSI type";
-  }
-
-  identity ODTU12 {
-    base odtu-type-identity;
-    description
-      "ODTU12 MSI type";
-  }
-
-  identity ODTU13 {
-    base odtu-type-identity;
-    description
-      "ODTU13 MSI type";
-  }
-
-  identity ODTU23 {
-    base odtu-type-identity;
-    description
-      "ODTU23 MSI type";
-  }
-
-  identity ODTU2.ts {
-    base odtu-type-identity;
-    description
-      "ODTU2.ts MSI type";
-  }
-
-  identity ODTU3.ts {
-    base odtu-type-identity;
-    description
-      "ODTU3.ts MSI type";
-  }
-
-  identity unallocated {
-    base odtu-type-identity;
-    description
-      "Unallocated MSI type";
-  }
-
-  identity odu-function-identity {
-    description
-      "A unique identification of the ODUk interface function.";
-  }
-
-  identity ODU-TTP {
-    base odu-function-identity;
-    description
-      "ODU TTP facility facing trail termination";
-  }
-
-  identity ODU-CTP {
-    base odu-function-identity;
-    description
-      "ODU CTP connection termination";
-  }
-
-  identity ODU-TTP-CTP {
-    base odu-function-identity;
-    description
-      "ODU CTP mapper level connection termination with trail termination and client adaptation";
-  }
-
-  typedef payload-type-def {
-    type string {
-      length "2";
-      pattern "[0-9a-fA-F]*";
-    }
-    description
-      "Common type definition for odu payload-type";
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-otn-common-types@2018-11-30.yang b/ordmodels/common/src/main/yang/org-openroadm-otn-common-types@2018-11-30.yang
deleted file mode 100644 (file)
index f6f11c8..0000000
+++ /dev/null
@@ -1,311 +0,0 @@
-module org-openroadm-otn-common-types {
-  namespace "http://org/openroadm/otn-common-types";
-  prefix org-openroadm-otn-common-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for common otn related type definitions.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-
-  identity otu-rate-identity {
-    description
-      "A unique rate identification of the OTU.";
-  }
-
-  identity OTU4 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU4";
-  }
-
-  identity OTU3 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU3";
-  }
-
-  identity OTU2 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU2";
-  }
-
-  identity OTU2e {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU2e";
-  }
-
-  identity OTU1 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU1";
-  }
-
-  identity OTU0 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU0";
-  }
-
-  identity OTUflex {
-    base otu-rate-identity;
-    description
-      "Identity for an OTUflex";
-  }
-
-  identity odu-rate-identity {
-    description
-      "A unique rate identification of the ODU.";
-  }
-
-  identity ODU4 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU4";
-  }
-
-  identity ODU3 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU3";
-  }
-
-  identity ODU2 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU2";
-  }
-
-  identity ODU2e {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU2e";
-  }
-
-  identity ODU1 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU1";
-  }
-
-  identity ODU0 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU0";
-  }
-
-  identity ODUflex-cbr {
-    base odu-rate-identity;
-    description
-      "ODUFlex for CBR client signals (G.709)";
-  }
-
-  identity ODUflex-cbr-25G {
-    base odu-rate-identity;
-    description
-      "ODUFlex for CBR client signals 25G (G.709 17.13.1)";
-  }
-
-  identity ODUflex-cbr-200G {
-    base odu-rate-identity;
-    description
-      "ODUFlex for CBR client signals 200G (G.709 17.13.2)";
-  }
-
-  identity ODUflex-cbr-400G {
-    base odu-rate-identity;
-    description
-      "ODUFlex for CBR client signals 400G (G.709 17.13.2)";
-  }
-
-  identity ODUflex-imp {
-    base odu-rate-identity;
-    description
-      "ODUFlex for IMP (Idle insertion Mapping Procedure) mapped client signals (G.709)";
-  }
-
-  identity ODUflex-flexe {
-    base odu-rate-identity;
-    description
-      "ODUflex for FlexE-aware client signals (G.709)";
-  }
-
-  identity ODUflex-gfp {
-    base odu-rate-identity;
-    description
-      "ODUflex for GFP-F mapped client signals (G.709)";
-  }
-
-  identity odtu-type-identity {
-    description
-      "A unique identification for the MSI odtu type.";
-  }
-
-  identity ODTU4.ts-Allocated {
-    base odtu-type-identity;
-    description
-      "OPU4 MSI - ODTU4.ts, OPU4 MSI TS is occupied/allocated.
-       Applies to all ODTU4.x mappings";
-  }
-
-  identity ODTU01 {
-    base odtu-type-identity;
-    description
-      "ODTU01 MSI type";
-  }
-
-  identity ODTU12 {
-    base odtu-type-identity;
-    description
-      "ODTU12 MSI type";
-  }
-
-  identity ODTU13 {
-    base odtu-type-identity;
-    description
-      "ODTU13 MSI type";
-  }
-
-  identity ODTU23 {
-    base odtu-type-identity;
-    description
-      "ODTU23 MSI type";
-  }
-
-  identity ODTU2.ts {
-    base odtu-type-identity;
-    description
-      "ODTU2.ts MSI type";
-  }
-
-  identity ODTU3.ts {
-    base odtu-type-identity;
-    description
-      "ODTU3.ts MSI type";
-  }
-
-  identity unallocated {
-    base odtu-type-identity;
-    description
-      "Unallocated MSI type";
-  }
-
-  identity odu-function-identity {
-    description
-      "A unique identification of the ODUk interface function.";
-  }
-
-  identity ODU-TTP {
-    base odu-function-identity;
-    description
-      "ODU TTP facility facing trail termination";
-  }
-
-  identity ODU-CTP {
-    base odu-function-identity;
-    description
-      "ODU CTP connection termination";
-  }
-
-  identity ODU-TTP-CTP {
-    base odu-function-identity;
-    description
-      "ODU CTP mapper level connection termination with trail termination and client adaptation";
-  }
-
-  typedef payload-type-def {
-    type string {
-      length "2";
-      pattern "[0-9a-fA-F]*";
-    }
-    description
-      "Common type definition for odu payload-type";
-  }
-
-  typedef opucn-trib-slot-def {
-    type string;
-    description
-      "OPUCn trib slot in the form of 'A.B' with
-       A = 1..n
-       B = 1..20";
-  }
-
-  typedef tcm-direction-enum {
-    type enumeration {
-      enum "up-tcm" {
-        description
-          "TCM termination direction faces the switch fabric.";
-      }
-      enum "down-tcm" {
-        description
-          "TCM termination direction faces the facility";
-      }
-    }
-    description
-      "Enumeration type for TCM direction";
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-otn-common-types@2020-03-27.yang b/ordmodels/common/src/main/yang/org-openroadm-otn-common-types@2020-03-27.yang
deleted file mode 100644 (file)
index 0eb123b..0000000
+++ /dev/null
@@ -1,352 +0,0 @@
-module org-openroadm-otn-common-types {
-  namespace "http://org/openroadm/otn-common-types";
-  prefix org-openroadm-otn-common-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for common otn related type definitions.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-
-  identity otu-rate-identity {
-    description
-      "A unique rate identification of the OTU.";
-  }
-
-  identity OTUCn {
-    base otu-rate-identity;
-    description
-      "Identity for an OTUCn";
-  }
-
-  identity OTU4 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU4";
-  }
-
-  identity OTU3 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU3";
-  }
-
-  identity OTU2 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU2";
-  }
-
-  identity OTU2e {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU2e";
-  }
-
-  identity OTU1 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU1";
-  }
-
-  identity OTU0 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU0";
-  }
-
-  identity OTUflex {
-    base otu-rate-identity;
-    description
-      "Identity for an OTUflex";
-  }
-
-  identity odu-rate-identity {
-    description
-      "A unique rate identification of the ODU.";
-  }
-
-  identity ODUCn {
-    base odu-rate-identity;
-    description
-      "Identity for an ODUCn";
-  }
-
-  identity ODU4 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU4";
-  }
-
-  identity ODU3 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU3";
-  }
-
-  identity ODU2 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU2";
-  }
-
-  identity ODU2e {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU2e";
-  }
-
-  identity ODU1 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU1";
-  }
-
-  identity ODU0 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU0";
-  }
-
-  identity ODUflex-cbr {
-    base odu-rate-identity;
-    description
-      "ODUFlex for CBR client signals (G.709)";
-  }
-
-  identity ODUflex-cbr-identity {
-    description
-      "Service type for ODUflex (CBR)";
-  }
-
-  identity ODUflex-cbr-25G {
-    base ODUflex-cbr-identity;
-    description
-      "ODUFlex for CBR client signals 25G (G.709 17.13.1)";
-  }
-
-  identity ODUflex-cbr-200G {
-    base ODUflex-cbr-identity;
-    description
-      "ODUFlex for CBR client signals 200G (G.709 17.13.2)";
-  }
-
-  identity ODUflex-cbr-400G {
-    base ODUflex-cbr-identity;
-    description
-      "ODUFlex for CBR client signals 400G (G.709 17.13.2)";
-  }
-
-  identity ODUflex-imp {
-    base odu-rate-identity;
-    description
-      "ODUFlex for IMP (Idle insertion Mapping Procedure) mapped client signals (G.709)";
-  }
-
-  identity ODUflex-flexe {
-    base odu-rate-identity;
-    description
-      "ODUflex for FlexE-aware client signals (G.709)";
-  }
-
-  identity ODUflex-gfp {
-    base odu-rate-identity;
-    description
-      "ODUflex for GFP-F mapped client signals (G.709)";
-  }
-
-  identity odtu-type-identity {
-    description
-      "A unique identification for the MSI odtu type.";
-  }
-
-  identity ODTUCn.ts {
-    base odtu-type-identity;
-    description
-      "ODTUCn.ts - OPUCn MSI type (G.709 clause 20.2)";
-  }
-
-  identity ODTU4.ts-Allocated {
-    base odtu-type-identity;
-    description
-      "OPU4 MSI - ODTU4.ts, OPU4 MSI TS is occupied/allocated.
-       Applies to all ODTU4.x mappings";
-  }
-
-  identity ODTU01 {
-    base odtu-type-identity;
-    description
-      "ODTU01 MSI type";
-  }
-
-  identity ODTU12 {
-    base odtu-type-identity;
-    description
-      "ODTU12 MSI type";
-  }
-
-  identity ODTU13 {
-    base odtu-type-identity;
-    description
-      "ODTU13 MSI type";
-  }
-
-  identity ODTU23 {
-    base odtu-type-identity;
-    description
-      "ODTU23 MSI type";
-  }
-
-  identity ODTU2.ts {
-    base odtu-type-identity;
-    description
-      "ODTU2.ts MSI type";
-  }
-
-  identity ODTU3.ts {
-    base odtu-type-identity;
-    description
-      "ODTU3.ts MSI type";
-  }
-
-  identity ODTU4.ts {
-    base odtu-type-identity;
-    description
-      "ODTU4.ts MSI type";
-  }
-
-  identity unallocated {
-    base odtu-type-identity;
-    description
-      "Unallocated MSI type";
-  }
-
-  identity odu-function-identity {
-    description
-      "A unique identification of the ODUk interface function.";
-  }
-
-  identity ODU-TTP {
-    base odu-function-identity;
-    description
-      "ODU TTP facility facing trail termination";
-  }
-
-  identity ODU-CTP {
-    base odu-function-identity;
-    description
-      "ODU CTP connection termination";
-  }
-
-  identity ODU-TTP-CTP {
-    base odu-function-identity;
-    description
-      "ODU CTP mapper level connection termination with trail termination and client adaptation";
-  }
-
-  typedef payload-type-def {
-    type string {
-      length "2";
-      pattern '[0-9a-fA-F]*';
-    }
-    description
-      "Common type definition for odu payload-type";
-  }
-
-  typedef opucn-trib-slot-def {
-    type string;
-    description
-      "OPUCn trib slot in the form of 'A.B' with
-       A = 1..n
-       B = 1..20";
-  }
-
-  typedef tcm-direction-enum {
-    type enumeration {
-      enum up-tcm {
-        description
-          "TCM termination direction faces the switch fabric.";
-      }
-      enum down-tcm {
-        description
-          "TCM termination direction faces the facility";
-      }
-    }
-    description
-      "Enumeration type for TCM direction";
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-otn-common-types@2021-09-24.yang b/ordmodels/common/src/main/yang/org-openroadm-otn-common-types@2021-09-24.yang
deleted file mode 100644 (file)
index 6cba5a0..0000000
+++ /dev/null
@@ -1,366 +0,0 @@
-module org-openroadm-otn-common-types {
-  namespace "http://org/openroadm/otn-common-types";
-  prefix org-openroadm-otn-common-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for common otn related type definitions.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2021-09-24 {
-    description
-      "Version 10.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-
-  identity otu-rate-identity {
-    description
-      "A unique rate identification of the OTU.";
-  }
-
-  identity OTUCn {
-    base otu-rate-identity;
-    description
-      "Identity for an OTUCn";
-  }
-
-  identity OTU4 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU4";
-  }
-
-  identity OTU3 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU3";
-  }
-
-  identity OTU2 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU2";
-  }
-
-  identity OTU2e {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU2e";
-  }
-
-  identity OTU1 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU1";
-  }
-
-  identity OTU0 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU0";
-  }
-
-  identity OTUflex {
-    base otu-rate-identity;
-    description
-      "Identity for an OTUflex";
-  }
-
-  identity odu-rate-identity {
-    description
-      "A unique rate identification of the ODU.";
-  }
-
-  identity ODUCn {
-    base odu-rate-identity;
-    description
-      "Identity for an ODUCn";
-  }
-
-  identity ODU4 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU4";
-  }
-
-  identity ODU3 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU3";
-  }
-
-  identity ODU2 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU2";
-  }
-
-  identity ODU2e {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU2e";
-  }
-
-  identity ODU1 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU1";
-  }
-
-  identity ODU0 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU0";
-  }
-
-  identity ODUflex-cbr {
-    base odu-rate-identity;
-    description
-      "ODUFlex for CBR client signals (G.709)";
-  }
-
-  identity ODUflex-cbr-identity {
-    description
-      "Service type for ODUflex (CBR)";
-  }
-
-  identity ODUflex-cbr-25G {
-    base ODUflex-cbr-identity;
-    description
-      "ODUFlex for CBR client signals 25G (G.709 17.13.1)";
-  }
-
-  identity ODUflex-cbr-200G {
-    base ODUflex-cbr-identity;
-    description
-      "ODUFlex for CBR client signals 200G (G.709 17.13.2)";
-  }
-
-  identity ODUflex-cbr-400G {
-    base ODUflex-cbr-identity;
-    description
-      "ODUFlex for CBR client signals 400G (G.709 17.13.2)";
-  }
-
-  identity ODUflex-imp {
-    base odu-rate-identity;
-    description
-      "ODUFlex for IMP (Idle insertion Mapping Procedure) mapped client signals (G.709)";
-  }
-
-  identity ODUflex-flexe {
-    base odu-rate-identity;
-    description
-      "ODUflex for FlexE-aware client signals (G.709)";
-  }
-
-  identity ODUflex-gfp {
-    base odu-rate-identity;
-    description
-      "ODUflex for GFP-F mapped client signals (G.709)";
-  }
-
-  identity odtu-type-identity {
-    description
-      "A unique identification for the MSI odtu type.";
-  }
-
-  identity ODTUCn.ts {
-    base odtu-type-identity;
-    description
-      "ODTUCn.ts - OPUCn MSI type (G.709 clause 20.2)";
-  }
-
-  identity ODTU4.ts-Allocated {
-    base odtu-type-identity;
-    description
-      "OPU4 MSI - ODTU4.ts, OPU4 MSI TS is occupied/allocated.
-       Applies to all ODTU4.x mappings";
-  }
-
-  identity ODTU01 {
-    base odtu-type-identity;
-    description
-      "ODTU01 MSI type";
-  }
-
-  identity ODTU12 {
-    base odtu-type-identity;
-    description
-      "ODTU12 MSI type";
-  }
-
-  identity ODTU13 {
-    base odtu-type-identity;
-    description
-      "ODTU13 MSI type";
-  }
-
-  identity ODTU23 {
-    base odtu-type-identity;
-    description
-      "ODTU23 MSI type";
-  }
-
-  identity ODTU2.ts {
-    base odtu-type-identity;
-    description
-      "ODTU2.ts MSI type";
-  }
-
-  identity ODTU3.ts {
-    base odtu-type-identity;
-    description
-      "ODTU3.ts MSI type";
-  }
-
-  identity ODTU4.ts {
-    base odtu-type-identity;
-    description
-      "ODTU4.ts MSI type";
-  }
-
-  identity unallocated {
-    base odtu-type-identity;
-    description
-      "Unallocated MSI type";
-  }
-
-  identity odu-function-identity {
-    description
-      "A unique identification of the ODUk interface function.";
-  }
-
-  identity ODU-TTP {
-    base odu-function-identity;
-    description
-      "ODU TTP facility facing trail termination";
-  }
-
-  identity ODU-CTP {
-    base odu-function-identity;
-    description
-      "ODU CTP connection termination";
-  }
-
-  identity ODU-TTP-CTP {
-    base odu-function-identity;
-    description
-      "ODU CTP mapper level connection termination with trail termination and client adaptation";
-  }
-
-  typedef payload-type-def {
-    type string {
-      length "2";
-      pattern '[0-9a-fA-F]*';
-    }
-    description
-      "Common type definition for odu payload-type";
-  }
-
-  typedef flexo-payload-type-def {
-    type string {
-      length "2";
-      pattern '[0-9a-fA-F]*';
-    }
-    description
-      "Common type definition for flexo payload-type (Section 9.2.6.2,
-       G.709.1 2020-12)";
-  }
-
-  typedef opucn-trib-slot-def {
-    type string;
-    description
-      "OPUCn trib slot in the form of 'A.B' with
-       A = 1..n
-       B = 1..20";
-  }
-
-  typedef tcm-direction-enum {
-    type enumeration {
-      enum up-tcm {
-        description
-          "TCM termination direction faces the switch fabric.";
-      }
-      enum down-tcm {
-        description
-          "TCM termination direction faces the facility";
-      }
-    }
-    description
-      "Enumeration type for TCM direction";
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-pm-types@2016-10-14.yang b/ordmodels/common/src/main/yang/org-openroadm-pm-types@2016-10-14.yang
deleted file mode 100644 (file)
index 98fb914..0000000
+++ /dev/null
@@ -1,279 +0,0 @@
-module org-openroadm-pm-types {
-  namespace "http://org/openroadm/pm-types";
-  prefix org-openroadm-pm-types;
-
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2016-10-14;
-  }
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of performance management types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      AT&T Intellectual Property.  All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef pm-granularity {
-    description
-      "Granularity of PM bin";
-    type enumeration {
-      enum "notApplicable" {
-        description
-          "This is for total statistic counters on devices that support
-              them.";
-        value 1;
-      }
-      enum "15min" {
-        value 2;
-      }
-      enum "24Hour" {
-        value 3;
-      }
-    }
-  }
-
-  typedef pm-data-type {
-    type union {
-      type uint64;
-      type decimal64 {
-        fraction-digits 2;
-      }
-      type decimal64 {
-        fraction-digits 17;
-      }
-    }
-  }
-
-  grouping pm-measurement {
-    description
-      "Set of parameters related to a PM Measurement";
-    container pmParameterName {
-      uses pm-names;
-    }
-    leaf pmParameterValue {
-      type pm-data-type;
-      mandatory true;
-      config false;
-    }
-    leaf pmParameterUnit {
-      description
-        "Unit PM parameter has been measured - frames, packets, u, etc";
-      type string;
-      mandatory false;
-    }
-    leaf location {
-      description
-        "Location PM parameter measurement";
-      type enumeration {
-        enum "notApplicable" {
-          value 1;
-        }
-        enum "nearEnd" {
-          value 2;
-        }
-        enum "farEnd" {
-          value 3;
-        }
-      }
-      mandatory false;
-    }
-    leaf direction {
-      description
-        "Direction PM parameter measurement";
-      type org-openroadm-common-types:pm-direction;
-      mandatory false;
-    }
-    leaf validity {
-      description
-        "Validity of data";
-      type enumeration {
-        enum "complete" {
-          value 1;
-        }
-        enum "partial" {
-          value 2;
-        }
-        enum "suspect" {
-          value 3;
-        }
-      }
-      mandatory false;
-      config false;
-    }
-  }
-
-  grouping pm-names {
-    description
-      "Name of PM parameter. Consisists of a set list of parameters,
-       plus an extension field to support addition parameters.";
-    leaf type {
-      type pm-names-enum;
-      mandatory true;
-    }
-    leaf extension {
-      description
-        "name of parameter, when enum value set to vendorExtension because
-         name not found in pm-names-enum";
-      type string;
-      mandatory false;
-    }
-  }
-
-  typedef pm-names-enum {
-    type enumeration {
-      enum "vendorExtension" {
-        value 1;
-        description
-          "vendor extension";
-      }
-      enum "bitErrorRate" {
-        value 2;
-        description
-          "Bit error rate (BER)";
-      }
-      enum "opticalPowerOutput" {
-        value 3;
-        description
-          "Optical Power Output (OPOUT-OTS). Total optical power includes Variable Optical Attenuator (VOA) attenuation";
-      }
-      enum "opticalReturnLoss" {
-        value 4;
-        description
-          "Optical Return Loss (ORL-OTS) - at MW port(s) B";
-      }
-      enum "opticalPowerInput" {
-        value 5;
-        description
-          "Optical Power Input (OPIN-OTS). Total optical power";
-      }
-      enum "opticalPower" {
-        value 6;
-        description
-          "Optical Power Receive (OPR-OTS); Optical Power Transmit (OPT-OSC)";
-      }
-      enum "opticalChannelPowerTransmit" {
-        value 7;
-        description
-          "Optical Channel Power Transmit (OPT-OCH). Individual channel power includes Variable Optical Attenuator (VOA) attenuation";
-      }
-      enum "codeViolations" {
-        value 8;
-        description
-          "Code Violations (CV-PCS). 8B/10B errors";
-        reference "IEEE 802.3ah, Section 45.2.1.44";
-      }
-      enum "erroredSecondsSection" {
-        value 9;
-        description
-          "Errored Seconds Section (ES-PCS)";
-        reference "IEEE 802.3ah, Section 45.2.1.46";
-      }
-      enum "severlyErrorSeconds" {
-        value 10;
-        description
-          "Severely Errored Seconds (SES-PCS)";
-        reference "IEEE 802.3ah, Section 45.2.1.48";
-      }
-      enum "unavailableSecondsPCS" {
-        value 11;
-        description
-          "Unavailable Seconds PCS (UAS-PCS)";
-        reference "IEEE 802.3ah, Section 45.2.1.52";
-      }
-      enum "inFrames" {
-        value 12;
-        description
-          "In frames (INFRAMES-E)";
-      }
-      enum "inFramesErrored" {
-        value 13;
-        description
-          "In frames errored (INFRAMESERR-E)";
-      }
-      enum "outFrames" {
-        value 14;
-        description
-          "Out frames (OUTFRAMES-E)";
-      }
-      enum "erroredSecondsEthernet" {
-        value 15;
-        description
-          "Errored Seconds Ethernet (ES-E)";
-        reference "IEEE 802.3ah, Section 45.2.1.46";
-      }
-      enum "severelyErroredSecondsEthernet" {
-        value 16;
-        description
-          "Severly Errored Seconds, Ethernet (SES-E)";
-        reference "IEEE 802.3ah, Section 45.2.1.48";
-      }
-      enum "unavailableSecondsEthernet" {
-        value 17;
-        description
-          "Unavailable Seconds, Ethernet (UAS-E)";
-        reference "IEEE 802.3ah, Section 45.2.1.52";
-      }
-      enum "erroredBlockCount" {
-        value 18;
-        description
-          "Errored block count";
-        reference "G.798 : 6.5.1.1";
-      }
-      enum "delay" {
-        value 19;
-        description
-          "Number of frames between a DMValue toggle event and the received DMp signal value toggle event";
-        reference "G.798";
-      }
-      enum "defectSeconds" {
-        value 20;
-        description
-          "Defect Seconds (DS)";
-        reference "";
-      }
-      enum "backwardIncomingAlignmentError" {
-        value 21;
-        description
-          "Backward Incoming Alignment Error (BIAE)";
-        reference "Ref: G.798: 14.5.1.1.2";
-      }
-      enum "incomingAlignmentError" {
-        value 22;
-        description
-          "Incoming Alignment Error (IAE)";
-        reference "Ref: G.798: 14.5.1.1.2";
-      }
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-pm-types@2017-12-15.yang b/ordmodels/common/src/main/yang/org-openroadm-pm-types@2017-12-15.yang
deleted file mode 100644 (file)
index 2501ee3..0000000
+++ /dev/null
@@ -1,483 +0,0 @@
-module org-openroadm-pm-types {
-  namespace "http://org/openroadm/pm-types";
-  prefix org-openroadm-pm-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of performance management types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      AT&T Intellectual Property.  All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef pm-granularity {
-    type enumeration {
-      enum "notApplicable" {
-        value 1;
-        description
-          "This is for total statistic counters on devices that support
-              them.";
-      }
-      enum "15min" {
-        value 2;
-      }
-      enum "24Hour" {
-        value 3;
-      }
-    }
-    description
-      "Granularity of PM bin";
-  }
-
-  typedef pm-data-type {
-    type union {
-      type uint64;
-      type int64;
-      type decimal64 {
-        fraction-digits 2;
-      }
-      type decimal64 {
-        fraction-digits 17;
-      }
-    }
-  }
-
-  typedef validity {
-    type enumeration {
-      enum "complete" {
-        value 1;
-      }
-      enum "partial" {
-        value 2;
-      }
-      enum "suspect" {
-        value 3;
-      }
-    }
-    description
-      "Validity of data";
-  }
-
-  typedef pm-names-enum {
-    type enumeration {
-      enum "vendorExtension" {
-        value 1;
-        description
-          "vendor extension";
-      }
-      enum "bitErrorRate" {
-        value 2;
-        description
-          "Bit error rate (BER)";
-      }
-      enum "opticalPowerOutput" {
-        value 3;
-        description
-          "Optical Power Output (OPOUT-OTS, OPOUT-OMS, OPT-OCH). Total optical power includes Variable Optical Attenuator (VOA) attenuation";
-      }
-      enum "opticalReturnLoss" {
-        value 4;
-        description
-          "Optical Return Loss (ORL-OTS) - at MW port(s) B";
-      }
-      enum "opticalPowerInput" {
-        value 5;
-        description
-          "Optical Power Input (OPIN-OTS, OPIN-OMS, OPR-OCH). Total optical power";
-      }
-      enum "codeViolations" {
-        value 8;
-        description
-          "Code Violations (CV)";
-      }
-      enum "erroredSeconds" {
-        value 9;
-        description
-          "Errored Seconds (ES)";
-      }
-      enum "severelyErroredSeconds" {
-        value 10;
-        description
-          "Severely Errored Seconds (SES)";
-      }
-      enum "unavailableSeconds" {
-        value 11;
-        description
-          "Unavailable Seconds (UAS)";
-      }
-      enum "inFrames" {
-        value 12;
-        description
-          "In frames (INFRAMES-E)";
-      }
-      enum "inFramesErrored" {
-        value 13;
-        description
-          "In frames errored (INFRAMESERR-E)";
-      }
-      enum "outFrames" {
-        value 14;
-        description
-          "Out frames (OUTFRAMES-E)";
-      }
-      enum "erroredSecondsEthernet" {
-        value 15;
-        description
-          "Errored Seconds Ethernet (ES-E)";
-      }
-      enum "severelyErroredSecondsEthernet" {
-        value 16;
-        description
-          "Severly Errored Seconds, Ethernet (SES-E)";
-      }
-      enum "unavailableSecondsEthernet" {
-        value 17;
-        description
-          "Unavailable Seconds, Ethernet (UAS-E)";
-      }
-      enum "erroredBlockCount" {
-        value 18;
-        description
-          "Errored block count";
-      }
-      enum "delay" {
-        value 19;
-        description
-          "Number of frames between a DMValue toggle event and the received DMp signal value toggle event";
-      }
-      enum "defectSeconds" {
-        value 20;
-        description
-          "Defect Seconds (DS)";
-      }
-      enum "backwardIncomingAlignmentError" {
-        value 21;
-        description
-          "Backward Incoming Alignment Error (BIAE)";
-      }
-      enum "incomingAlignmentError" {
-        value 22;
-        description
-          "Incoming Alignment Error (IAE)";
-      }
-      enum "opticalPowerOutputMin" {
-        value 23;
-        description
-          "Minimum Optical Power Output (OPOUT-OTS). Total optical power includes Variable Optical Attenuator (VOA) attenuation";
-      }
-      enum "opticalPowerOutputMax" {
-        value 24;
-        description
-          "Maximum Optical Power Output (OPOUT-OTS). Total optical power includes Variable Optical Attenuator (VOA) attenuation";
-      }
-      enum "opticalPowerOutputAvg" {
-        value 25;
-        description
-          "Average Optical Power Output (OPOUT-OTS). Total optical power includes Variable Optical Attenuator (VOA) attenuation";
-      }
-      enum "opticalPowerInputMin" {
-        value 26;
-        description
-          "Minimum Optical Power Input (OPIN-OTS). Total optical power";
-      }
-      enum "opticalPowerInputMax" {
-        value 27;
-        description
-          "Maximum Optical Power Input (OPIN-OTS). Total optical power";
-      }
-      enum "opticalPowerInputAvg" {
-        value 28;
-        description
-          "Average Optical Power Input (OPIN-OTS). Total optical power";
-      }
-      enum "opticalPowerOutputOSC" {
-        value 29;
-        description
-          "OSC Optical Power Output (OPT-OSC). OSC Transmit power on MW port";
-      }
-      enum "opticalPowerOutputOSCMin" {
-        value 30;
-        description
-          "Minimum OSC Optical Power Output (OPT-OSC). OSC Transmit power on MW port";
-      }
-      enum "opticalPowerOutputOSCMax" {
-        value 31;
-        description
-          "Maximum OSC Optical Power Output (OPT-OSC). OSC Transmit power on MW port";
-      }
-      enum "opticalPowerOutputOSCAvg" {
-        value 32;
-        description
-          "Average OSC Optical Power Output (OPT-OSC). OSC Transmit power on MW port";
-      }
-      enum "opticalPowerInputOSC" {
-        value 33;
-        description
-          "OSC Optical Power Input (OPR-OSC). OSC Receive power on MW port";
-      }
-      enum "opticalPowerInputOSCMin" {
-        value 34;
-        description
-          "Minimum OSC Optical Power Input (OPR-OSC). OSC Receive power on MW port";
-      }
-      enum "opticalPowerInputOSCMax" {
-        value 35;
-        description
-          "Maximum OSC Optical Power Input (OPR-OSC). OSC Receive power on MW port";
-      }
-      enum "opticalPowerInputOSCAvg" {
-        value 36;
-        description
-          "Average OSC Optical Power Input (OPR-OSC). OSC Receive power on MW port";
-      }
-      enum "preFECCorrectedErrors" {
-        value 37;
-        description
-          "pFEC corrected Errors";
-      }
-      enum "totalOpticalPowerInput" {
-        value 38;
-        description
-          "Total Optical Power Input.";
-      }
-      enum "totalOpticalPowerInputMin" {
-        value 39;
-        description
-          "Minumun Total Optical Power Input.";
-      }
-      enum "totalOpticalPowerInputMax" {
-        value 40;
-        description
-          "Maximum Total Optical Power Input.";
-      }
-      enum "totalOpticalPowerInputAvg" {
-        value 41;
-        description
-          "Average Total Optical Power Input.";
-      }
-      enum "FECCorrectableBlocks" {
-        value 42;
-        description
-          "FEC Correctable Blocks.";
-      }
-      enum "FECUncorrectableBlocks" {
-        value 43;
-        description
-          "FEC Uncorrectable Blocks.";
-      }
-      enum "BIPErrorCounter" {
-        value 56;
-        description
-          "BIP Error Counter";
-      }
-      enum "protectionSwitchingCount" {
-        value 57;
-        description
-          "Protection Switching Count (PSC)";
-      }
-      enum "protectionSwitchingDuration" {
-        value 58;
-        description
-          "Protection Switching Duration in seconds (PSD)";
-      }
-      enum "erroredBlockCountTCM1-up" {
-        value 59;
-        description
-          "errored Blocks Count on TCM1 up direction.";
-      }
-      enum "erroredBlockCountTCM2-up" {
-        value 60;
-        description
-          "errored Blocks Count on TCM2 up direction.";
-      }
-      enum "erroredBlockCountTCM3-up" {
-        value 61;
-        description
-          "errored Blocks Count on TCM3 up direction.";
-      }
-      enum "erroredBlockCountTCM4-up" {
-        value 62;
-        description
-          "errored Blocks Count on TCM4 up direction.";
-      }
-      enum "erroredBlockCountTCM5-up" {
-        value 63;
-        description
-          "errored Blocks Count on TCM5 up direction.";
-      }
-      enum "erroredBlockCountTCM6-up" {
-        value 64;
-        description
-          "errored Blocks Count on TCM6 up direction.";
-      }
-      enum "delayTCM1-up" {
-        value 65;
-        description
-          "Delay on TCM1 up direction.";
-      }
-      enum "delayTCM2-up" {
-        value 66;
-        description
-          "Delay on TCM2 up direction.";
-      }
-      enum "delayTCM3-up" {
-        value 67;
-        description
-          "Delay on TCM3 up direction.";
-      }
-      enum "delayTCM4-up" {
-        value 68;
-        description
-          "Delay on TCM4 up direction.";
-      }
-      enum "delayTCM5-up" {
-        value 69;
-        description
-          "Delay on TCM5 up direction.";
-      }
-      enum "delayTCM6-up" {
-        value 70;
-        description
-          "Delay on TCM6 up direction.";
-      }
-      enum "erroredBlockCountTCM1-down" {
-        value 71;
-        description
-          "errored Blocks Count on TCM1 down direction.";
-      }
-      enum "erroredBlockCountTCM2-down" {
-        value 72;
-        description
-          "errored Blocks Count on TCM2 down direction.";
-      }
-      enum "erroredBlockCountTCM3-down" {
-        value 73;
-        description
-          "errored Blocks Count on TCM3 down direction.";
-      }
-      enum "erroredBlockCountTCM4-down" {
-        value 74;
-        description
-          "errored Blocks Count on TCM4 down direction.";
-      }
-      enum "erroredBlockCountTCM5-down" {
-        value 75;
-        description
-          "errored Blocks Count on TCM5 down direction.";
-      }
-      enum "erroredBlockCountTCM6-down" {
-        value 76;
-        description
-          "errored Blocks Count on TCM6 down direction.";
-      }
-      enum "delayTCM1-down" {
-        value 77;
-        description
-          "Delay on TCM1 down direction.";
-      }
-      enum "delayTCM2-down" {
-        value 78;
-        description
-          "Delay on TCM2 down direction.";
-      }
-      enum "delayTCM3-down" {
-        value 79;
-        description
-          "Delay on TCM3 down direction.";
-      }
-      enum "delayTCM4-down" {
-        value 80;
-        description
-          "Delay on TCM4 down direction.";
-      }
-      enum "delayTCM5-down" {
-        value 81;
-        description
-          "Delay on TCM5 down direction.";
-      }
-      enum "delayTCM6-down" {
-        value 82;
-        description
-          "Delay on TCM6 down direction.";
-      }
-    }
-  }
-
-  grouping pm-measurement {
-    description
-      "Set of parameters related to a PM Measurement";
-    leaf pmParameterValue {
-      type pm-data-type;
-      config false;
-      mandatory true;
-    }
-    leaf pmParameterUnit {
-      type string;
-      mandatory false;
-      description
-        "Unit PM parameter has been measured - frames, packets, u, etc";
-    }
-    leaf validity {
-      type validity;
-      mandatory false;
-    }
-  }
-
-  grouping pm-names {
-    description
-      "Name of PM parameter. Consisists of a set list of parameters,
-       plus an extension field to support addition parameters.";
-    leaf type {
-      type pm-names-enum;
-      mandatory true;
-    }
-    leaf extension {
-      type string;
-      description
-        "name of parameter, when enum value set to vendorExtension because
-         name not found in pm-names-enum";
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-pm-types@2020-03-27.yang b/ordmodels/common/src/main/yang/org-openroadm-pm-types@2020-03-27.yang
deleted file mode 100644 (file)
index 287cd45..0000000
+++ /dev/null
@@ -1,709 +0,0 @@
-module org-openroadm-pm-types {
-  namespace "http://org/openroadm/pm-types";
-  prefix org-openroadm-pm-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of performance management types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef pm-granularity {
-    type enumeration {
-      enum notApplicable {
-        value 1;
-        description
-          "This is for total statistic counters on devices that support
-              them.";
-      }
-      enum 15min {
-        value 2;
-      }
-      enum 24Hour {
-        value 3;
-      }
-    }
-    description
-      "Granularity of PM bin";
-  }
-
-  typedef pm-data-type {
-    type union {
-      type uint64;
-      type int64;
-      type decimal64 {
-        fraction-digits 2;
-      }
-      type decimal64 {
-        fraction-digits 17;
-      }
-    }
-  }
-
-  typedef validity {
-    type enumeration {
-      enum complete {
-        value 1;
-      }
-      enum partial {
-        value 2;
-      }
-      enum suspect {
-        value 3;
-      }
-    }
-    description
-      "Validity of data";
-  }
-
-  typedef pm-names-enum {
-    type enumeration {
-      enum vendorExtension {
-        value 1;
-        description
-          "vendor extension";
-      }
-      enum bitErrorRate {
-        value 2;
-        description
-          "Bit error rate (BER)";
-      }
-      enum opticalPowerOutput {
-        value 3;
-        description
-          "Optical Power Output (OPOUT-OTS, OPOUT-OMS, OPT-OCH). Total optical power includes Variable Optical Attenuator (VOA) attenuation";
-      }
-      enum opticalReturnLoss {
-        value 4;
-        description
-          "Optical Return Loss (ORL-OTS) - at MW port(s) B";
-      }
-      enum opticalPowerInput {
-        value 5;
-        description
-          "Optical Power Input (OPIN-OTS, OPIN-OMS, OPR-OCH). Total optical power";
-      }
-      enum codeViolations {
-        value 8;
-        description
-          "Code Violations (CV)";
-      }
-      enum erroredSeconds {
-        value 9;
-        description
-          "Errored Seconds (ES)";
-      }
-      enum severelyErroredSeconds {
-        value 10;
-        description
-          "Severely Errored Seconds (SES)";
-      }
-      enum unavailableSeconds {
-        value 11;
-        description
-          "Unavailable Seconds (UAS)";
-      }
-      enum inFrames {
-        value 12;
-        description
-          "In frames (INFRAMES-E)";
-      }
-      enum inFramesErrored {
-        value 13;
-        description
-          "In frames errored (INFRAMESERR-E)";
-      }
-      enum outFrames {
-        value 14;
-        description
-          "Out frames (OUTFRAMES-E)";
-      }
-      enum erroredSecondsEthernet {
-        value 15;
-        description
-          "Errored Seconds Ethernet (ES-E)";
-      }
-      enum severelyErroredSecondsEthernet {
-        value 16;
-        description
-          "Severely Errored Seconds, Ethernet (SES-E)";
-      }
-      enum unavailableSecondsEthernet {
-        value 17;
-        description
-          "Unavailable Seconds, Ethernet (UAS-E)";
-      }
-      enum erroredBlockCount {
-        value 18;
-        description
-          "Errored block count";
-      }
-      enum delay {
-        value 19;
-        description
-          "Number of frames between a DMValue toggle event and the received DMp signal value toggle event";
-      }
-      enum defectSeconds {
-        value 20;
-        description
-          "Defect Seconds (DS)";
-      }
-      enum backwardIncomingAlignmentError {
-        value 21;
-        description
-          "Backward Incoming Alignment Error (BIAE)";
-      }
-      enum incomingAlignmentError {
-        value 22;
-        description
-          "Incoming Alignment Error (IAE)";
-      }
-      enum opticalPowerOutputMin {
-        value 23;
-        description
-          "Minimum Optical Power Output (OPOUT-OTS). Total optical power includes Variable Optical Attenuator (VOA) attenuation";
-      }
-      enum opticalPowerOutputMax {
-        value 24;
-        description
-          "Maximum Optical Power Output (OPOUT-OTS). Total optical power includes Variable Optical Attenuator (VOA) attenuation";
-      }
-      enum opticalPowerOutputAvg {
-        value 25;
-        description
-          "Average Optical Power Output (OPOUT-OTS). Total optical power includes Variable Optical Attenuator (VOA) attenuation";
-      }
-      enum opticalPowerInputMin {
-        value 26;
-        description
-          "Minimum Optical Power Input (OPIN-OTS). Total optical power";
-      }
-      enum opticalPowerInputMax {
-        value 27;
-        description
-          "Maximum Optical Power Input (OPIN-OTS). Total optical power";
-      }
-      enum opticalPowerInputAvg {
-        value 28;
-        description
-          "Average Optical Power Input (OPIN-OTS). Total optical power";
-      }
-      enum opticalPowerOutputOSC {
-        value 29;
-        description
-          "OSC Optical Power Output (OPT-OSC). OSC Transmit power on MW port";
-      }
-      enum opticalPowerOutputOSCMin {
-        value 30;
-        description
-          "Minimum OSC Optical Power Output (OPT-OSC). OSC Transmit power on MW port";
-      }
-      enum opticalPowerOutputOSCMax {
-        value 31;
-        description
-          "Maximum OSC Optical Power Output (OPT-OSC). OSC Transmit power on MW port";
-      }
-      enum opticalPowerOutputOSCAvg {
-        value 32;
-        description
-          "Average OSC Optical Power Output (OPT-OSC). OSC Transmit power on MW port";
-      }
-      enum opticalPowerInputOSC {
-        value 33;
-        description
-          "OSC Optical Power Input (OPR-OSC). OSC Receive power on MW port";
-      }
-      enum opticalPowerInputOSCMin {
-        value 34;
-        description
-          "Minimum OSC Optical Power Input (OPR-OSC). OSC Receive power on MW port";
-      }
-      enum opticalPowerInputOSCMax {
-        value 35;
-        description
-          "Maximum OSC Optical Power Input (OPR-OSC). OSC Receive power on MW port";
-      }
-      enum opticalPowerInputOSCAvg {
-        value 36;
-        description
-          "Average OSC Optical Power Input (OPR-OSC). OSC Receive power on MW port";
-      }
-      enum preFECCorrectedErrors {
-        value 37;
-        description
-          "pFEC corrected Errors";
-      }
-      enum totalOpticalPowerInput {
-        value 38;
-        description
-          "Total Optical Power Input.";
-      }
-      enum totalOpticalPowerInputMin {
-        value 39;
-        description
-          "Minimum Total Optical Power Input.";
-      }
-      enum totalOpticalPowerInputMax {
-        value 40;
-        description
-          "Maximum Total Optical Power Input.";
-      }
-      enum totalOpticalPowerInputAvg {
-        value 41;
-        description
-          "Average Total Optical Power Input.";
-      }
-      enum FECCorrectableBlocks {
-        value 42;
-        description
-          "FEC Correctable Blocks.";
-      }
-      enum FECUncorrectableBlocks {
-        value 43;
-        description
-          "FEC Uncorrectable Blocks.";
-      }
-      enum BIPErrorCounter {
-        value 56;
-        description
-          "BIP Error Counter";
-      }
-      enum protectionSwitchingCount {
-        value 57;
-        description
-          "Protection Switching Count (PSC)";
-      }
-      enum protectionSwitchingDuration {
-        value 58;
-        description
-          "Protection Switching Duration in seconds (PSD)";
-      }
-      enum erroredBlockCountTCM1-up {
-        value 59;
-        description
-          "errored Blocks Count on TCM1 up direction.";
-      }
-      enum erroredBlockCountTCM2-up {
-        value 60;
-        description
-          "errored Blocks Count on TCM2 up direction.";
-      }
-      enum erroredBlockCountTCM3-up {
-        value 61;
-        description
-          "errored Blocks Count on TCM3 up direction.";
-      }
-      enum erroredBlockCountTCM4-up {
-        value 62;
-        description
-          "errored Blocks Count on TCM4 up direction.";
-      }
-      enum erroredBlockCountTCM5-up {
-        value 63;
-        description
-          "errored Blocks Count on TCM5 up direction.";
-      }
-      enum erroredBlockCountTCM6-up {
-        value 64;
-        description
-          "errored Blocks Count on TCM6 up direction.";
-      }
-      enum delayTCM1-up {
-        value 65;
-        description
-          "Delay on TCM1 up direction.";
-      }
-      enum delayTCM2-up {
-        value 66;
-        description
-          "Delay on TCM2 up direction.";
-      }
-      enum delayTCM3-up {
-        value 67;
-        description
-          "Delay on TCM3 up direction.";
-      }
-      enum delayTCM4-up {
-        value 68;
-        description
-          "Delay on TCM4 up direction.";
-      }
-      enum delayTCM5-up {
-        value 69;
-        description
-          "Delay on TCM5 up direction.";
-      }
-      enum delayTCM6-up {
-        value 70;
-        description
-          "Delay on TCM6 up direction.";
-      }
-      enum erroredBlockCountTCM1-down {
-        value 71;
-        description
-          "errored Blocks Count on TCM1 down direction.";
-      }
-      enum erroredBlockCountTCM2-down {
-        value 72;
-        description
-          "errored Blocks Count on TCM2 down direction.";
-      }
-      enum erroredBlockCountTCM3-down {
-        value 73;
-        description
-          "errored Blocks Count on TCM3 down direction.";
-      }
-      enum erroredBlockCountTCM4-down {
-        value 74;
-        description
-          "errored Blocks Count on TCM4 down direction.";
-      }
-      enum erroredBlockCountTCM5-down {
-        value 75;
-        description
-          "errored Blocks Count on TCM5 down direction.";
-      }
-      enum erroredBlockCountTCM6-down {
-        value 76;
-        description
-          "errored Blocks Count on TCM6 down direction.";
-      }
-      enum delayTCM1-down {
-        value 77;
-        description
-          "Delay on TCM1 down direction.";
-      }
-      enum delayTCM2-down {
-        value 78;
-        description
-          "Delay on TCM2 down direction.";
-      }
-      enum delayTCM3-down {
-        value 79;
-        description
-          "Delay on TCM3 down direction.";
-      }
-      enum delayTCM4-down {
-        value 80;
-        description
-          "Delay on TCM4 down direction.";
-      }
-      enum delayTCM5-down {
-        value 81;
-        description
-          "Delay on TCM5 down direction.";
-      }
-      enum delayTCM6-down {
-        value 82;
-        description
-          "Delay on TCM6 down direction.";
-      }
-      enum partialRateDiscard {
-        value 83;
-        description
-          "Discarded packet as a result of policing or rate limiting for subrate ethernet.";
-      }
-      enum erroredSecondsTCM1-up {
-        value 84;
-        description
-          "errored Seconds Count on TCM1 up direction.";
-      }
-      enum erroredSecondsTCM2-up {
-        value 85;
-        description
-          "errored Seconds Count on TCM2 up direction.";
-      }
-      enum erroredSecondsTCM3-up {
-        value 86;
-        description
-          "errored Seconds Count on TCM3 up direction.";
-      }
-      enum erroredSecondsTCM4-up {
-        value 87;
-        description
-          "errored Seconds Count on TCM4 up direction.";
-      }
-      enum erroredSecondsTCM5-up {
-        value 88;
-        description
-          "errored Seconds Count on TCM5 up direction.";
-      }
-      enum erroredSecondsTCM6-up {
-        value 89;
-        description
-          "errored Seconds Count on TCM6 up direction.";
-      }
-      enum severelyErroredSecondsTCM1-up {
-        value 90;
-        description
-          "severely Errored Seconds Count on TCM1 up direction.";
-      }
-      enum severelyErroredSecondsTCM2-up {
-        value 91;
-        description
-          "severely Errored Seconds Count on TCM2 up direction.";
-      }
-      enum severelyErroredSecondsTCM3-up {
-        value 92;
-        description
-          "severely Errored Seconds Count on TCM3 up direction.";
-      }
-      enum severelyErroredSecondsTCM4-up {
-        value 93;
-        description
-          "severely Errored Seconds Count on TCM4 up direction.";
-      }
-      enum severelyErroredSecondsTCM5-up {
-        value 94;
-        description
-          "severely Errored Seconds Count on TCM5 up direction.";
-      }
-      enum severelyErroredSecondsTCM6-up {
-        value 95;
-        description
-          "severely Errored Seconds Count on TCM6 up direction.";
-      }
-      enum unavailableSecondsTCM1-up {
-        value 96;
-        description
-          "unavailable Seconds Count on TCM1 up direction.";
-      }
-      enum unavailableSecondsTCM2-up {
-        value 97;
-        description
-          "unavailable Seconds Count on TCM2 up direction.";
-      }
-      enum unavailableSecondsTCM3-up {
-        value 98;
-        description
-          "unavailable Seconds Count on TCM3 up direction.";
-      }
-      enum unavailableSecondsTCM4-up {
-        value 99;
-        description
-          "unavailable Seconds Count on TCM4 up direction.";
-      }
-      enum unavailableSecondsTCM5-up {
-        value 100;
-        description
-          "unavailable Seconds Count on TCM5 up direction.";
-      }
-      enum unavailableSecondsTCM6-up {
-        value 101;
-        description
-          "unavailable Seconds Count on TCM6 up direction.";
-      }
-      enum erroredSecondsTCM1-down {
-        value 102;
-        description
-          "errored Seconds Count on TCM1 down direction.";
-      }
-      enum erroredSecondsTCM2-down {
-        value 103;
-        description
-          "errored Seconds Count on TCM2 down direction.";
-      }
-      enum erroredSecondsTCM3-down {
-        value 104;
-        description
-          "errored Seconds Count on TCM3 down direction.";
-      }
-      enum erroredSecondsTCM4-down {
-        value 105;
-        description
-          "errored Seconds Count on TCM4 down direction.";
-      }
-      enum erroredSecondsTCM5-down {
-        value 106;
-        description
-          "errored Seconds Count on TCM5 down direction.";
-      }
-      enum erroredSecondsTCM6-down {
-        value 107;
-        description
-          "errored Seconds Count on TCM6 down direction.";
-      }
-      enum severelyErroredSecondsTCM1-down {
-        value 108;
-        description
-          "severely Errored Seconds Count on TCM1 down direction.";
-      }
-      enum severelyErroredSecondsTCM2-down {
-        value 109;
-        description
-          "severely Errored Seconds Count on TCM2 down direction.";
-      }
-      enum severelyErroredSecondsTCM3-down {
-        value 110;
-        description
-          "severely Errored Seconds Count on TCM3 down direction.";
-      }
-      enum severelyErroredSecondsTCM4-down {
-        value 111;
-        description
-          "severely Errored Seconds Count on TCM4 down direction.";
-      }
-      enum severelyErroredSecondsTCM5-down {
-        value 112;
-        description
-          "severely Errored Seconds Count on TCM5 down direction.";
-      }
-      enum severelyErroredSecondsTCM6-down {
-        value 113;
-        description
-          "severely Errored Seconds Count on TCM6 down direction.";
-      }
-      enum unavailableSecondsTCM1-down {
-        value 114;
-        description
-          "unavailable Seconds Count on TCM1 down direction.";
-      }
-      enum unavailableSecondsTCM2-down {
-        value 115;
-        description
-          "unavailable Seconds Count on TCM2 down direction.";
-      }
-      enum unavailableSecondsTCM3-down {
-        value 116;
-        description
-          "unavailable Seconds Count on TCM3 down direction.";
-      }
-      enum unavailableSecondsTCM4-down {
-        value 117;
-        description
-          "unavailable Seconds Count on TCM4 down direction.";
-      }
-      enum unavailableSecondsTCM5-down {
-        value 118;
-        description
-          "unavailable Seconds Count on TCM5 down direction.";
-      }
-      enum unavailableSecondsTCM6-down {
-        value 119;
-        description
-          "unavailable Seconds Count on TCM6 down direction.";
-      }
-      enum fecCorrectedCodewords {
-        value 120;
-        description
-          "FEC Corrected Codewords Counter";
-      }
-      enum fecUncorrectedCodewords {
-        value 121;
-        description
-          "FEC Uncorrected Codewords Counter";
-      }
-      enum fecSymbolErrors {
-        value 122;
-        description
-          "FEC Symbol Error Counter";
-      }
-      enum localFaultSeconds {
-        value 123;
-        description
-          "Local Fault Seconds";
-      }
-      enum remoteFaultSeconds {
-        value 124;
-        description
-          "Remote Fault Seconds";
-      }
-    }
-  }
-
-  grouping pm-measurement {
-    description
-      "Set of parameters related to a PM Measurement";
-    leaf pmParameterValue {
-      type pm-data-type;
-      config false;
-      mandatory true;
-    }
-    leaf pmParameterUnit {
-      type string;
-      mandatory false;
-      description
-        "Unit PM parameter has been measured - frames, packets, u, etc";
-    }
-    leaf validity {
-      type validity;
-      mandatory false;
-    }
-  }
-
-  grouping pm-names {
-    description
-      "Name of PM parameter. Consists of a set list of parameters,
-       plus an extension field to support addition parameters.";
-    leaf type {
-      type pm-names-enum;
-      mandatory true;
-    }
-    leaf extension {
-      type string;
-      description
-        "name of parameter, when enum value set to vendorExtension because
-         name not found in pm-names-enum";
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-pm@2016-10-14.yang b/ordmodels/common/src/main/yang/org-openroadm-pm@2016-10-14.yang
deleted file mode 100644 (file)
index 05cc35e..0000000
+++ /dev/null
@@ -1,192 +0,0 @@
-module org-openroadm-pm {
-  namespace "http://org/openroadm/pm";
-  prefix org-openroadm-pm;
-
-  import ietf-yang-types {
-    prefix yang;
-  }
-  import org-openroadm-resource {
-    prefix org-openroadm-resource;
-    revision-date 2016-10-14;
-  }
-  import org-openroadm-layerRate {
-    prefix org-openroadm-layerRate;
-    revision-date 2016-10-14;
-  }
-  import org-openroadm-pm-types {
-    prefix org-openroadm-pm-types;
-    revision-date 2016-10-14;
-  }
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of performance management.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      AT&T Intellectual Property.  All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping current-pm {
-    description
-      "PM Data with current values - both realtime (granularity=notApplicable) and binned (granularity=15 minute, 24h))";
-    leaf id {
-      type string;
-      mandatory true;
-      config false;
-    }
-    container resource {
-      uses org-openroadm-resource:resource;
-    }
-    container layerRate {
-      uses org-openroadm-layerRate:layer-rate;
-    }
-    list measurements {
-      container measurement {
-        uses org-openroadm-pm-types:pm-measurement;
-      }
-    }
-    leaf retrievalTime {
-      type yang:date-and-time;
-      mandatory true;
-      config false;
-    }
-    leaf granularity {
-      type org-openroadm-pm-types:pm-granularity;
-    }
-  }
-
-  container currentPmlist {
-    description
-      "List of current PMs.";
-    list currentPm {
-      key "id";
-      uses current-pm;
-    }
-    config false;
-  }
-
-  grouping historical-pm {
-    description
-      "PM Data with historical values - binned (granularity=15 minute, 24h))";
-    leaf id {
-      type string;
-      mandatory true;
-      config false;
-    }
-    container resource {
-      uses org-openroadm-resource:resource;
-    }
-    container layerRate {
-      uses org-openroadm-layerRate:layer-rate;
-    }
-    list binned-pm {
-      key "bin-number";
-      uses bin-pm;
-    }
-    leaf granularity {
-      type org-openroadm-pm-types:pm-granularity;
-    }
-  }
-
-  grouping bin-pm {
-    description
-      "PM Data with historical values";
-    leaf bin-number {
-      type uint16 {
-        range "1..max";
-      }
-      mandatory true;
-      config false;
-    }
-    list measurements {
-      container measurement {
-        uses org-openroadm-pm-types:pm-measurement;
-      }
-    }
-    leaf completionTime {
-      type yang:date-and-time;
-      mandatory true;
-      config false;
-    }
-  }
-
-  container historicalPmlist {
-    description
-      "List of historical PM";
-    list historicalPm {
-      key "id";
-      uses historical-pm;
-    }
-    config false;
-  }
-  rpc clear-pm {
-    description "Command to initialize PM data";
-    input {
-      uses org-openroadm-resource:resource;
-      leaf pm-type {
-        default "current";
-        type enumeration {
-          enum "current" {
-            value 1;
-          }
-          enum "all" {
-            value 2;
-          }
-        }
-      }
-      leaf granularity {
-        default "15min";
-        type org-openroadm-pm-types:pm-granularity;
-      }
-    }
-    output {
-      leaf status {
-        type enumeration {
-          enum "Successful" {
-            value 1;
-          }
-          enum "Failed" {
-            value 2;
-          }
-        }
-        mandatory true;
-        description
-          "Successful or Failed";
-      }
-      leaf status-message {
-        type string;
-        description
-          "Gives a more detailed reason for success / failure";
-      }
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-pm@2018-10-19.yang b/ordmodels/common/src/main/yang/org-openroadm-pm@2018-10-19.yang
deleted file mode 100644 (file)
index 6254d9a..0000000
+++ /dev/null
@@ -1,299 +0,0 @@
-module org-openroadm-pm {
-  namespace "http://org/openroadm/pm";
-  prefix org-openroadm-pm;
-
-  import ietf-yang-types {
-    prefix yang;
-    revision-date 2013-07-15;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-resource {
-    prefix org-openroadm-resource;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-resource-types {
-    prefix org-openroadm-resource-types;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-pm-types {
-    prefix org-openroadm-pm-types;
-    revision-date 2017-12-15;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of performance management.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      AT&T Intellectual Property.  All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping current-pm-group {
-    description
-      "PM Data with current values - both realtime (granularity=notApplicable)
-       and binned (granularity=15 minute, 24h))";
-    leaf pm-resource-instance {
-      type instance-identifier;
-      config false;
-      mandatory true;
-      description
-        "Retrieves all PM associate with the resource instance";
-    }
-    leaf pm-resource-type {
-      type org-openroadm-resource-types:resource-type-enum;
-      config false;
-      mandatory true;
-      description
-        "The supported pm-resource-type associated with the given resource instance.";
-    }
-    leaf pm-resource-type-extension {
-      type string;
-      config false;
-      description
-        "The resource type extension when the type is not defined in the resource-type-enum.";
-    }
-    leaf retrieval-time {
-      type yang:date-and-time;
-      config false;
-      mandatory true;
-      description
-        "Represents the time when the data is being read, not the bin start or end time.";
-    }
-    list current-pm {
-      key "type extension location direction";
-      config false;
-      uses current-pm-val-group;
-    }
-  }
-
-  grouping current-pm-val-group {
-    uses org-openroadm-pm-types:pm-names;
-    leaf location {
-      type org-openroadm-common-types:location;
-    }
-    leaf direction {
-      type org-openroadm-common-types:direction;
-    }
-    list measurement {
-      key "granularity";
-      leaf granularity {
-        type org-openroadm-pm-types:pm-granularity;
-      }
-      uses org-openroadm-pm-types:pm-measurement;
-    }
-  }
-
-  grouping historical-pm-group {
-    description
-      "PM Data with historical values - binned (granularity=15 minute, 24h))";
-    leaf pm-resource-instance {
-      type instance-identifier;
-      config false;
-      mandatory true;
-      description
-        "Retrieves all PM associate with the resource instance";
-    }
-    leaf pm-resource-type {
-      type org-openroadm-resource-types:resource-type-enum;
-      config false;
-      mandatory true;
-    }
-    leaf pm-resource-type-extension {
-      type string;
-      config false;
-      description
-        "The resource type extension when the type is not defined in the resource-type-enum.";
-    }
-    list historical-pm {
-      key "type extension location direction";
-      uses historical-pm-val-group;
-    }
-  }
-
-  grouping historical-pm-val-group {
-    description
-      "PM Data with historical values";
-    uses org-openroadm-pm-types:pm-names;
-    leaf location {
-      type org-openroadm-common-types:location;
-    }
-    leaf direction {
-      type org-openroadm-common-types:direction;
-    }
-    list measurement {
-      key "granularity bin-number";
-      leaf granularity {
-        type org-openroadm-pm-types:pm-granularity;
-        mandatory true;
-      }
-      leaf bin-number {
-        type uint16 {
-          range "1..max";
-        }
-        config false;
-        mandatory true;
-      }
-      uses org-openroadm-pm-types:pm-measurement;
-      leaf completion-time {
-        type yang:date-and-time;
-        config false;
-        mandatory true;
-        description
-          "The time at the end of the period; For example if bin starts at
-           01:15:00 and ends at 01:29:59, the completion-time is 01:29:59";
-      }
-    }
-  }
-
-  grouping collect-history-pm-group {
-    leaf pm-filename {
-      type string {
-        length "10..255";
-      }
-      description
-        "The file name to write the historical PM data.
-         The controller should be able to use this name to retrieve the file via ftp/sftp.
-         The file name should be unique for each RPC request since a new RPC request
-         could be initiated while the file transfer of the previous file is still in progress.
-
-         The file content should be written in xml format based on the historical-pm-list
-         yang definition and the file should be gzip compressed.";
-    }
-    uses org-openroadm-common-types:rpc-response-status;
-  }
-
-  rpc clear-pm {
-    description
-      "Command to initialize PM data";
-    input {
-      uses org-openroadm-resource:resource;
-      leaf pm-type {
-        type enumeration {
-          enum "current" {
-            value 1;
-          }
-          enum "all" {
-            value 2;
-          }
-        }
-        default "current";
-      }
-      leaf granularity {
-        type org-openroadm-pm-types:pm-granularity;
-        default "15min";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  rpc collect-historical-pm-file {
-    description
-      "Command to query historical PM data.
-       The device should be able to process an rpc request for 15min data
-       and a separate request for 24hour data in parallel.";
-    input {
-      leaf from-bin-number {
-        type uint16 {
-          range "1..max";
-        }
-        default "1";
-        description
-          "The start bin-number of the range";
-      }
-      leaf to-bin-number {
-        type uint16 {
-          range "1..max";
-        }
-        default "1";
-        description
-          "The end bin-number of the range";
-      }
-      leaf granularity {
-        type org-openroadm-pm-types:pm-granularity;
-        default "15min";
-        description
-          "The granularity of the retrieve, default to 15 minitues PM";
-      }
-    }
-    output {
-      uses collect-history-pm-group;
-    }
-  }
-  notification historical-pm-collect-result {
-    description
-      "This Notification is sent when the pm collection is succesful or failed.";
-    uses collect-history-pm-group;
-  }
-  container current-pm-list {
-    config false;
-    description
-      "List of current PMs.";
-    list current-pm-entry {
-      key "pm-resource-type pm-resource-type-extension pm-resource-instance";
-      uses current-pm-group;
-    }
-  }
-  container historical-pm-list {
-    config false;
-    description
-      "List of historical PM";
-    list historical-pm-entry {
-      key "pm-resource-type pm-resource-type-extension pm-resource-instance";
-      uses historical-pm-group;
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-pm@2020-05-29.yang b/ordmodels/common/src/main/yang/org-openroadm-pm@2020-05-29.yang
deleted file mode 100644 (file)
index 44b9328..0000000
+++ /dev/null
@@ -1,361 +0,0 @@
-module org-openroadm-pm {
-  namespace "http://org/openroadm/pm";
-  prefix org-openroadm-pm;
-
-  import ietf-yang-types {
-    prefix yang;
-    revision-date 2013-07-15;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-common-alarm-pm-types {
-    prefix org-openroadm-common-alarm-pm-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-resource {
-    prefix org-openroadm-resource;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-resource-types {
-    prefix org-openroadm-resource-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-pm-types {
-    prefix org-openroadm-pm-types;
-    revision-date 2020-03-27;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of performance management.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  feature historical-pm-retrieval {
-    description
-      "The device supports the ability to directly retrieve the historical
-       PM data from the YANG model.";
-  }
-
-  grouping current-pm-group {
-    description
-      "PM Data with current values - both realtime (granularity=notApplicable)
-       and binned (granularity=15 minute, 24h))";
-    leaf pm-resource-instance {
-      type instance-identifier;
-      config false;
-      mandatory true;
-      description
-        "Retrieves all PM associate with the resource instance";
-    }
-    leaf pm-resource-type {
-      type org-openroadm-resource-types:resource-type-enum;
-      config false;
-      mandatory true;
-      description
-        "The supported pm-resource-type associated with the given resource instance.";
-    }
-    leaf pm-resource-type-extension {
-      type string;
-      config false;
-      description
-        "The resource type extension when the type is not defined in the resource-type-enum.";
-    }
-    leaf start-time {
-      type yang:date-and-time;
-      config false;
-      mandatory true;
-      description
-        "Represents the start time of the bin (15m, 24h granularity) or the start of data collection (notApplicable/untimed granularity).";
-    }
-    leaf retrieval-time {
-      type yang:date-and-time;
-      config false;
-      mandatory true;
-      description
-        "Represents the time when the data is being read, not the bin start or end time.";
-    }
-    list current-pm {
-      key "type extension location direction";
-      config false;
-      uses current-pm-val-group;
-    }
-  }
-
-  grouping current-pm-val-group {
-    uses org-openroadm-pm-types:pm-names;
-    leaf location {
-      type org-openroadm-common-alarm-pm-types:location;
-    }
-    leaf direction {
-      type org-openroadm-common-alarm-pm-types:direction;
-    }
-    list measurement {
-      key "granularity";
-      leaf granularity {
-        type org-openroadm-pm-types:pm-granularity;
-      }
-      uses org-openroadm-pm-types:pm-measurement;
-    }
-  }
-
-  grouping historical-pm-group {
-    description
-      "PM Data with historical values - binned (granularity=15 minute, 24h))";
-    leaf pm-resource-instance {
-      type instance-identifier;
-      config false;
-      mandatory true;
-      description
-        "Retrieves all PM associate with the resource instance";
-    }
-    leaf pm-resource-type {
-      type org-openroadm-resource-types:resource-type-enum;
-      config false;
-      mandatory true;
-    }
-    leaf pm-resource-type-extension {
-      type string;
-      config false;
-      description
-        "The resource type extension when the type is not defined in the resource-type-enum.";
-    }
-    list historical-pm {
-      key "type extension location direction";
-      uses historical-pm-val-group;
-    }
-  }
-
-  grouping historical-pm-val-group {
-    description
-      "PM Data with historical values";
-    uses org-openroadm-pm-types:pm-names;
-    leaf location {
-      type org-openroadm-common-alarm-pm-types:location;
-    }
-    leaf direction {
-      type org-openroadm-common-alarm-pm-types:direction;
-    }
-    list measurement {
-      key "granularity bin-number";
-      leaf granularity {
-        type org-openroadm-pm-types:pm-granularity;
-        mandatory true;
-      }
-      leaf bin-number {
-        type uint16 {
-          range "1..max";
-        }
-        config false;
-        mandatory true;
-      }
-      uses org-openroadm-pm-types:pm-measurement;
-      leaf completion-time {
-        type yang:date-and-time;
-        config false;
-        mandatory true;
-        description
-          "The time at the end of the period; For example if bin starts at
-           01:15:00 and ends at 01:29:59, the completion-time is 01:29:59";
-      }
-    }
-  }
-
-  grouping collect-history-pm-group {
-    leaf pm-filename {
-      type string {
-        length "10..255";
-      }
-      mandatory true;
-      description
-        "The file name to write the historical PM data.
-         The controller should be able to use this name to retrieve the file via ftp/sftp.
-         The file name should be unique for each RPC request since a new RPC request
-         could be initiated while the file transfer of the previous file is still in progress.
-
-         The file content should be written in xml format based on the historical-pm-list
-         yang definition and the file should be gzip compressed.";
-    }
-    uses org-openroadm-common-types:rpc-response-status;
-  }
-
-  rpc clear-pm {
-    description
-      "Command to initialize PM data";
-    input {
-      uses org-openroadm-resource:resource;
-      leaf pm-type {
-        type enumeration {
-          enum current {
-            value 1;
-          }
-          enum all {
-            value 2;
-          }
-        }
-        default "current";
-      }
-      leaf granularity {
-        type org-openroadm-pm-types:pm-granularity;
-        default "15min";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-
-  rpc collect-historical-pm-file {
-    description
-      "Command to query historical PM data.
-       The device should be able to process an rpc request for 15min data
-       and a separate request for 24hour data in parallel.";
-    input {
-      leaf from-bin-number {
-        type uint16 {
-          range "1..max";
-        }
-        default "1";
-        description
-          "The start bin-number of the range";
-      }
-      leaf to-bin-number {
-        type uint16 {
-          range "1..max";
-        }
-        default "1";
-        description
-          "The end bin-number of the range";
-      }
-      leaf granularity {
-        type org-openroadm-pm-types:pm-granularity;
-        default "15min";
-        description
-          "The granularity of the retrieve, default to 15 minutes PM";
-      }
-    }
-    output {
-      uses collect-history-pm-group;
-    }
-  }
-
-  notification historical-pm-collect-result {
-    description
-      "This Notification is sent when the pm collection is successful or failed.";
-    uses collect-history-pm-group;
-  }
-
-  container current-pm-list {
-    config false;
-    description
-      "List of current PMs.";
-    list current-pm-entry {
-      key "pm-resource-type pm-resource-type-extension pm-resource-instance";
-      description
-        "List of current PM entries";
-      uses current-pm-group;
-    }
-  }
-  container historical-pm-list {
-    if-feature "historical-pm-retrieval";
-    config false;
-    description
-      "List of historical PM";
-    list historical-pm-entry {
-      key "pm-resource-type pm-resource-type-extension pm-resource-instance";
-      description
-        "List of historical PM entries";
-      uses historical-pm-group;
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-port-types@2017-09-29.yang b/ordmodels/common/src/main/yang/org-openroadm-port-types@2017-09-29.yang
deleted file mode 100644 (file)
index 9154f4d..0000000
+++ /dev/null
@@ -1,181 +0,0 @@
-module org-openroadm-port-types {
-  namespace "http://org/openroadm/port/types";
-  prefix org-openroadm-port-types;
-
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2016-10-14;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for port types.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  identity supported-if-capability {
-    description
-      "Base identity from which specific supported interfaces are derived";
-  }
-
-  identity if-100GE {
-    base supported-if-capability;
-  }
-
-  identity if-OMS {
-    base supported-if-capability;
-  }
-
-  identity if-OTS {
-    base supported-if-capability;
-  }
-
-  identity if-OCH {
-    base supported-if-capability;
-  }
-
-  identity if-1GE {
-    base supported-if-capability;
-  }
-
-  identity if-10GE {
-    base supported-if-capability;
-  }
-
-  identity if-40GE {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU1-ODU1 {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU2-ODU2 {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU2E-ODU2E {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU3-ODU3 {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU4-ODU4 {
-    base supported-if-capability;
-  }
-
-  identity if-OTU4-ODU4 {
-    base supported-if-capability;
-  }
-
-  identity supported-xpdr-capability {
-    description
-      "Base identity from which specific supported xponder are derived";
-  }
-
-  identity Transponder {
-    base supported-xpdr-capability;
-  }
-
-  identity Regen {
-    base supported-xpdr-capability;
-  }
-
-  typedef port-wavelength-types {
-    type enumeration {
-      enum "wavelength" {
-        value 1;
-        description
-          "Port on a transponder or ROADM SRG add drop";
-      }
-      enum "multi-wavelength" {
-        value 2;
-        description
-          "External port connecting to other roadm.";
-      }
-    }
-    description
-      "Port types.";
-  }
-
-  grouping common-port {
-    leaf port-power-capability-min-rx {
-      type org-openroadm-common-types:power-dBm;
-      config false;
-      description
-        "Based on port capabilities, the minimum power in the system spec for this port to
-         provide optimum function in rx direction";
-    }
-    leaf port-power-capability-min-tx {
-      type org-openroadm-common-types:power-dBm;
-      config false;
-      description
-        "Based on port capabilities, the minimum power in the system spec for this port to
-         provide optimum function in tx direction.";
-    }
-    leaf port-power-capability-max-rx {
-      type org-openroadm-common-types:power-dBm;
-      config false;
-      description
-        "Based on port capabilities, the maximum power in the system spec for this port to
-         provide optimum function in rx direction.";
-    }
-    leaf port-power-capability-max-tx {
-      type org-openroadm-common-types:power-dBm;
-      config false;
-      description
-        "Based on port capabilities, the maximum power in the system spec for this port to
-         provide optimum function in tx direction.";
-    }
-  }
-
-  grouping roadm-port {
-    uses common-port;
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-port-types@2018-10-19.yang b/ordmodels/common/src/main/yang/org-openroadm-port-types@2018-10-19.yang
deleted file mode 100644 (file)
index 2319877..0000000
+++ /dev/null
@@ -1,225 +0,0 @@
-module org-openroadm-port-types {
-  namespace "http://org/openroadm/port/types";
-  prefix org-openroadm-port-types;
-
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2018-10-19;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for port types.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  identity supported-if-capability {
-    description
-      "Base identity from which specific supported interfaces are derived";
-  }
-
-  identity if-100GE {
-    base supported-if-capability;
-  }
-
-  identity if-OMS {
-    base supported-if-capability;
-  }
-
-  identity if-OTS {
-    base supported-if-capability;
-  }
-
-  identity if-OCH {
-    base supported-if-capability;
-  }
-
-  identity if-1GE {
-    base supported-if-capability;
-  }
-
-  identity if-10GE {
-    base supported-if-capability;
-  }
-
-  identity if-40GE {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU1-ODU1 {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU2-ODU2 {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU2E-ODU2E {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU3-ODU3 {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU4-ODU4 {
-    base supported-if-capability;
-  }
-
-  identity if-OTU4-ODU4 {
-    base supported-if-capability;
-  }
-
-  identity if-OTU1-ODU1 {
-    base supported-if-capability;
-  }
-
-  identity if-OTU2-ODU2 {
-    base supported-if-capability;
-  }
-
-  identity if-OTU2e-ODU2e {
-    base supported-if-capability;
-  }
-
-  identity if-OTU3-ODU3 {
-    base supported-if-capability;
-  }
-
-  identity if-1GE-ODU0 {
-    base supported-if-capability;
-  }
-
-  identity if-10GE-ODU2 {
-    base supported-if-capability;
-  }
-
-  identity if-10GE-ODU2e {
-    base supported-if-capability;
-  }
-
-  identity if-40GE-ODU3 {
-    base supported-if-capability;
-  }
-
-  identity if-100GE-ODU4 {
-    base supported-if-capability;
-  }
-
-  identity supported-xpdr-capability {
-    description
-      "Base identity from which specific supported xponder are derived";
-  }
-
-  identity Transponder {
-    base supported-xpdr-capability;
-  }
-
-  identity Regen {
-    base supported-xpdr-capability;
-  }
-
-  typedef port-wavelength-types {
-    type enumeration {
-      enum "wavelength" {
-        value 1;
-        description
-          "Port on a transponder or ROADM SRG add drop";
-      }
-      enum "multi-wavelength" {
-        value 2;
-        description
-          "External port connecting to other roadm.";
-      }
-    }
-    description
-      "Port types.";
-  }
-
-  grouping common-port {
-    leaf port-power-capability-min-rx {
-      type org-openroadm-common-types:power-dBm;
-      config false;
-      description
-        "Based on port capabilities, the minimum power in the system spec for this port to
-         provide optimum function in rx direction";
-    }
-    leaf port-power-capability-min-tx {
-      type org-openroadm-common-types:power-dBm;
-      config false;
-      description
-        "Based on port capabilities, the minimum power in the system spec for this port to
-         provide optimum function in tx direction.";
-    }
-    leaf port-power-capability-max-rx {
-      type org-openroadm-common-types:power-dBm;
-      config false;
-      description
-        "Based on port capabilities, the maximum power in the system spec for this port to
-         provide optimum function in rx direction.";
-    }
-    leaf port-power-capability-max-tx {
-      type org-openroadm-common-types:power-dBm;
-      config false;
-      description
-        "Based on port capabilities, the maximum power in the system spec for this port to
-         provide optimum function in tx direction.";
-    }
-  }
-
-  grouping roadm-port {
-    uses common-port;
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-port-types@2018-11-30.yang b/ordmodels/common/src/main/yang/org-openroadm-port-types@2018-11-30.yang
deleted file mode 100644 (file)
index 3f7ce71..0000000
+++ /dev/null
@@ -1,294 +0,0 @@
-module org-openroadm-port-types {
-  namespace "http://org/openroadm/port/types";
-  prefix org-openroadm-port-types;
-
-  import org-openroadm-common-link-types {
-    prefix org-openroadm-common-link-types;
-    revision-date 2018-11-30;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for port types.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  identity supported-if-capability {
-    description
-      "Base identity from which specific supported interfaces are derived";
-  }
-
-  identity if-100GE {
-    base supported-if-capability;
-  }
-
-  identity if-OMS {
-    base supported-if-capability;
-  }
-
-  identity if-OTS {
-    base supported-if-capability;
-  }
-
-  identity if-OTS-OMS-MC-NMC {
-    base supported-if-capability;
-  }
-
-  identity if-NMC {
-    base supported-if-capability;
-  }
-
-  identity if-OCH {
-    base supported-if-capability;
-  }
-
-  identity if-1GE {
-    base supported-if-capability;
-  }
-
-  identity if-10GE {
-    base supported-if-capability;
-  }
-
-  identity if-40GE {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU1-ODU1 {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU2-ODU2 {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU2E-ODU2E {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU3-ODU3 {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU4-ODU4 {
-    base supported-if-capability;
-  }
-
-  identity if-OTUCn-ODUCn {
-    base supported-if-capability;
-  }
-
-  identity if-otsi-flexo-flexogroup {
-    base supported-if-capability;
-  }
-
-  identity if-otsi-otucn-oducn {
-    base supported-if-capability;
-  }
-
-  identity if-OTU4-ODU4 {
-    base supported-if-capability;
-  }
-
-  identity if-OTU1-ODU1 {
-    base supported-if-capability;
-  }
-
-  identity if-OTU2-ODU2 {
-    base supported-if-capability;
-  }
-
-  identity if-OTU2e-ODU2e {
-    base supported-if-capability;
-  }
-
-  identity if-OTU3-ODU3 {
-    base supported-if-capability;
-  }
-
-  identity if-1GE-ODU0 {
-    base supported-if-capability;
-  }
-
-  identity if-10GE-ODU2 {
-    base supported-if-capability;
-  }
-
-  identity if-10GE-ODU2e {
-    base supported-if-capability;
-  }
-
-  identity if-10GE-oduflexgfp {
-    base supported-if-capability;
-  }
-
-  identity if-25GE-oduflexcbr {
-    base supported-if-capability;
-  }
-
-  identity if-40GE-ODU3 {
-    base supported-if-capability;
-  }
-
-  identity if-40GE-oduflexgfp {
-    base supported-if-capability;
-  }
-
-  identity if-100GE-ODU4 {
-    base supported-if-capability;
-  }
-
-  identity if-100GE-oduflexgfp {
-    base supported-if-capability;
-  }
-
-  identity if-200GE-oduflexcbr {
-    base supported-if-capability;
-  }
-
-  identity if-400GE-odufleximp {
-    base supported-if-capability;
-  }
-
-  identity if-400GE-oduflexcbr {
-    base supported-if-capability;
-  }
-
-  identity supported-xpdr-capability {
-    description
-      "Base identity from which specific supported xponder are derived";
-  }
-
-  identity Transponder {
-    base supported-xpdr-capability;
-  }
-
-  identity Regen {
-    base supported-xpdr-capability;
-  }
-
-  typedef port-wavelength-types {
-    type enumeration {
-      enum "wavelength" {
-        value 1;
-        description
-          "Port on a transponder or ROADM SRG add drop";
-      }
-      enum "multi-wavelength" {
-        value 2;
-        description
-          "External port connecting to other roadm.";
-      }
-    }
-    description
-      "Port types.";
-  }
-
-  typedef port-module-types {
-    type enumeration {
-      enum "100GBASE-LR4" {
-        value 1;
-      }
-      enum "CWDM-4" {
-        value 2;
-      }
-    }
-    description
-      "Pluggable modue types.";
-  }
-
-  grouping common-port {
-    leaf port-power-capability-min-rx {
-      type org-openroadm-common-link-types:power-dBm;
-      config false;
-      description
-        "Based on port capabilities, the minimum power in the system spec for this port to
-         provide optimum function in rx direction";
-    }
-    leaf port-power-capability-min-tx {
-      type org-openroadm-common-link-types:power-dBm;
-      config false;
-      description
-        "Based on port capabilities, the minimum power in the system spec for this port to
-         provide optimum function in tx direction.";
-    }
-    leaf port-power-capability-max-rx {
-      type org-openroadm-common-link-types:power-dBm;
-      config false;
-      description
-        "Based on port capabilities, the maximum power in the system spec for this port to
-         provide optimum function in rx direction.";
-    }
-    leaf port-power-capability-max-tx {
-      type org-openroadm-common-link-types:power-dBm;
-      config false;
-      description
-        "Based on port capabilities, the maximum power in the system spec for this port to
-         provide optimum function in tx direction.";
-    }
-  }
-
-  grouping roadm-port {
-    uses common-port;
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-port-types@2020-03-27.yang b/ordmodels/common/src/main/yang/org-openroadm-port-types@2020-03-27.yang
deleted file mode 100644 (file)
index 357d2dd..0000000
+++ /dev/null
@@ -1,454 +0,0 @@
-module org-openroadm-port-types {
-  namespace "http://org/openroadm/port/types";
-  prefix org-openroadm-port-types;
-
-  import org-openroadm-common-link-types {
-    prefix org-openroadm-common-link-types;
-    revision-date 2019-11-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "This is a modified version of an Open ROADM MSA official YANG model.
-     It contains an unofficial and additional regen identity 'if-OTUCn-ODUCn-regen'
-     found in some non-compliant devices.
-     Though this identity should have been advertised through a YANG deviation,
-     this does not raise any compatibility problem with compliant devices.
-     This file is an ideally temporary work-around until a compliant solution is found.
-     cf https://jira.opendaylight.org/browse/TRNSPRTPCE-532
-
-     Original YANG model description below:
-     YANG definitions for port types.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  identity supported-if-capability {
-    description
-      "Base identity from which specific supported interfaces are derived";
-  }
-
-  identity if-100GE {
-    base supported-if-capability;
-  }
-
-  identity if-200GE {
-    base supported-if-capability;
-  }
-
-  identity if-400GE {
-    base supported-if-capability;
-  }
-
-  identity if-OMS {
-    base supported-if-capability;
-  }
-
-  identity if-OTS {
-    base supported-if-capability;
-  }
-
-  identity if-OTS-OMS-MC-NMC {
-    base supported-if-capability;
-  }
-
-  identity if-NMC {
-    base supported-if-capability;
-  }
-
-  identity if-OCH {
-    base supported-if-capability;
-  }
-
-  identity if-1GE {
-    base supported-if-capability;
-  }
-
-  identity if-10GE {
-    base supported-if-capability;
-  }
-
-  identity if-40GE {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU1-ODU1 {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU2-ODU2 {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU2E-ODU2E {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU3-ODU3 {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU4-ODU4 {
-    base supported-if-capability;
-  }
-
-  identity if-OTUCn-ODUCn {
-    base supported-if-capability;
-  }
-
-  identity if-otsi-flexo-flexogroup {
-    base supported-if-capability;
-  }
-
-  identity if-otsi-otsigroup {
-    base supported-if-capability;
-  }
-
-  identity if-n-OTU4-ODU4 {
-    base supported-if-capability;
-  }
-
-  identity if-otsi-otucn-oducn {
-    base supported-if-capability;
-    status obsolete;
-  }
-
-  identity if-OTU4-ODU4 {
-    base supported-if-capability;
-  }
-
-  identity if-OTU1-ODU1 {
-    base supported-if-capability;
-  }
-
-  identity if-OTU2-ODU2 {
-    base supported-if-capability;
-  }
-
-  identity if-OTU2e-ODU2e {
-    base supported-if-capability;
-  }
-
-  identity if-OTU3-ODU3 {
-    base supported-if-capability;
-  }
-
-  identity if-1GE-ODU0 {
-    base supported-if-capability;
-  }
-
-  identity if-10GE-ODU2 {
-    base supported-if-capability;
-  }
-
-  identity if-10GE-ODU2e {
-    base supported-if-capability;
-  }
-
-  identity if-10GE-oduflexgfp {
-    base supported-if-capability;
-  }
-
-  identity if-25GE-oduflexcbr {
-    base supported-if-capability;
-  }
-
-  identity if-40GE-ODU3 {
-    base supported-if-capability;
-  }
-
-  identity if-40GE-oduflexgfp {
-    base supported-if-capability;
-  }
-
-  identity if-100GE-ODU4 {
-    base supported-if-capability;
-  }
-
-  identity if-100GE-oduflexgfp {
-    base supported-if-capability;
-  }
-
-  identity if-200GE-oduflexcbr {
-    base supported-if-capability;
-  }
-
-  identity if-400GE-odufleximp {
-    base supported-if-capability;
-  }
-
-  identity if-400GE-oduflexcbr {
-    base supported-if-capability;
-  }
-
-  identity supported-xpdr-capability {
-    description
-      "Base identity from which specific supported xponder are derived";
-  }
-
-  identity Transponder {
-    base supported-xpdr-capability;
-  }
-
-  identity Regen {
-    base supported-xpdr-capability;
-  }
-
-  identity pluggable-identifiers-identity {
-    description
-      "Pluggable identifiers type";
-  }
-
-  identity SFP {
-    base pluggable-identifiers-identity;
-  }
-
-  identity SFP-plus {
-    base pluggable-identifiers-identity;
-  }
-
-  identity SFP28 {
-    base pluggable-identifiers-identity;
-  }
-
-  identity SFP-DD {
-    base pluggable-identifiers-identity;
-  }
-
-  identity DWDM-SFP {
-    base pluggable-identifiers-identity;
-  }
-
-  identity DWDM-SFP-plus {
-    base pluggable-identifiers-identity;
-  }
-
-  identity QSFP {
-    base pluggable-identifiers-identity;
-  }
-
-  identity QSFP-plus {
-    base pluggable-identifiers-identity;
-  }
-
-  identity QSFP28 {
-    base pluggable-identifiers-identity;
-  }
-
-  identity QSFP28-DD {
-    base pluggable-identifiers-identity;
-  }
-
-  identity QSFP-DD {
-    base pluggable-identifiers-identity;
-  }
-
-  identity micro-QSFP {
-    base pluggable-identifiers-identity;
-  }
-
-  identity OSFP {
-    base pluggable-identifiers-identity;
-  }
-
-  identity CFP {
-    base pluggable-identifiers-identity;
-  }
-
-  identity CFP2 {
-    base pluggable-identifiers-identity;
-  }
-
-  identity CFP4 {
-    base pluggable-identifiers-identity;
-  }
-
-  identity CFP8 {
-    base pluggable-identifiers-identity;
-  }
-
-  identity CFP2-ACO {
-    base pluggable-identifiers-identity;
-  }
-
-  identity CFP2-DCO {
-    base pluggable-identifiers-identity;
-  }
-
-  identity XFP {
-    base pluggable-identifiers-identity;
-  }
-
-  identity SFP56 {
-    base pluggable-identifiers-identity;
-  }
-
-  identity QSFP56 {
-    base pluggable-identifiers-identity;
-  }
-
-  identity QSFP56-DD {
-    base pluggable-identifiers-identity;
-  }
-
-  identity SFP-other {
-    base pluggable-identifiers-identity;
-  }
-
-  identity SFP-unspecified {
-    base pluggable-identifiers-identity;
-  }
-
-  identity pluggable-type-other {
-    base pluggable-identifiers-identity;
-  }
-
-  identity pluggable-type-unspecified {
-    base pluggable-identifiers-identity;
-  }
-  // The following identity is not present in the original Open ROADM MSA YANG model.
-  identity if-OTUCn-ODUCn-regen {
-    base supported-if-capability;
-  }
-
-
-  typedef port-wavelength-types {
-    type enumeration {
-      enum wavelength {
-        value 1;
-        description
-          "Port on a transponder or ROADM SRG add drop";
-      }
-      enum multi-wavelength {
-        value 2;
-        description
-          "External port connecting to other roadm.";
-      }
-    }
-    description
-      "Port types.";
-  }
-
-  typedef port-module-types {
-    type enumeration {
-      enum 100GBASE-LR4 {
-        value 1;
-      }
-      enum CWDM-4 {
-        value 2;
-      }
-    }
-    description
-      "Pluggable modue types.";
-  }
-
-  grouping common-port {
-    leaf port-power-capability-min-rx {
-      type org-openroadm-common-link-types:power-dBm;
-      config false;
-      description
-        "Based on port capabilities, the minimum power in the system spec for this port to
-         provide optimum function in rx direction";
-    }
-    leaf port-power-capability-min-tx {
-      type org-openroadm-common-link-types:power-dBm;
-      config false;
-      description
-        "Based on port capabilities, the minimum power in the system spec for this port to
-         provide optimum function in tx direction.";
-    }
-    leaf port-power-capability-max-rx {
-      type org-openroadm-common-link-types:power-dBm;
-      config false;
-      description
-        "Based on port capabilities, the maximum power in the system spec for this port to
-         provide optimum function in rx direction.";
-    }
-    leaf port-power-capability-max-tx {
-      type org-openroadm-common-link-types:power-dBm;
-      config false;
-      description
-        "Based on port capabilities, the maximum power in the system spec for this port to
-         provide optimum function in tx direction.";
-    }
-  }
-
-  grouping roadm-port {
-    uses common-port;
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-port-types@2020-12-11.yang b/ordmodels/common/src/main/yang/org-openroadm-port-types@2020-12-11.yang
deleted file mode 100644 (file)
index 2d862f0..0000000
+++ /dev/null
@@ -1,461 +0,0 @@
-module org-openroadm-port-types {
-  namespace "http://org/openroadm/port/types";
-  prefix org-openroadm-port-types;
-
-  import org-openroadm-common-link-types {
-    prefix org-openroadm-common-link-types;
-    revision-date 2019-11-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for port types.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2020-12-11 {
-    description
-      "Version 8.1";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  identity supported-if-capability {
-    description
-      "Base identity from which specific supported interfaces are derived";
-  }
-
-  identity if-100GE {
-    base supported-if-capability;
-  }
-
-  identity if-200GE {
-    base supported-if-capability;
-  }
-
-  identity if-400GE {
-    base supported-if-capability;
-  }
-
-  identity if-OMS {
-    base supported-if-capability;
-  }
-
-  identity if-OTS {
-    base supported-if-capability;
-  }
-
-  identity if-OTS-OMS-MC-NMC {
-    base supported-if-capability;
-  }
-
-  identity if-NMC {
-    base supported-if-capability;
-  }
-
-  identity if-OCH {
-    base supported-if-capability;
-  }
-
-  identity if-1GE {
-    base supported-if-capability;
-  }
-
-  identity if-10GE {
-    base supported-if-capability;
-  }
-
-  identity if-40GE {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU1-ODU1 {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU2-ODU2 {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU2E-ODU2E {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU3-ODU3 {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU4-ODU4 {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU4-ODU4-regen {
-    base supported-if-capability;
-  }
-
-  identity if-OCH-OTU4-ODU4-uniregen {
-    base supported-if-capability;
-  }
-
-  identity if-OTUCn-ODUCn {
-    base supported-if-capability;
-  }
-
-  identity if-OTUCn-ODUCn-regen {
-    base supported-if-capability;
-  }
-
-  identity if-OTUCn-ODUCn-uniregen {
-    base supported-if-capability;
-  }
-
-  identity if-otsi-flexo-flexogroup {
-    base supported-if-capability;
-  }
-
-  identity if-otsi-otsigroup {
-    base supported-if-capability;
-  }
-
-  identity if-n-OTU4-ODU4 {
-    base supported-if-capability;
-  }
-
-  identity if-otsi-otucn-oducn {
-    base supported-if-capability;
-    status obsolete;
-  }
-
-  identity if-OTU4-ODU4 {
-    base supported-if-capability;
-  }
-
-  identity if-OTU1-ODU1 {
-    base supported-if-capability;
-  }
-
-  identity if-OTU2-ODU2 {
-    base supported-if-capability;
-  }
-
-  identity if-OTU2e-ODU2e {
-    base supported-if-capability;
-  }
-
-  identity if-OTU3-ODU3 {
-    base supported-if-capability;
-  }
-
-  identity if-1GE-ODU0 {
-    base supported-if-capability;
-  }
-
-  identity if-10GE-ODU2 {
-    base supported-if-capability;
-  }
-
-  identity if-10GE-ODU2e {
-    base supported-if-capability;
-  }
-
-  identity if-10GE-oduflexgfp {
-    base supported-if-capability;
-  }
-
-  identity if-25GE-oduflexcbr {
-    base supported-if-capability;
-  }
-
-  identity if-40GE-ODU3 {
-    base supported-if-capability;
-  }
-
-  identity if-40GE-oduflexgfp {
-    base supported-if-capability;
-  }
-
-  identity if-100GE-ODU4 {
-    base supported-if-capability;
-  }
-
-  identity if-100GE-oduflexgfp {
-    base supported-if-capability;
-  }
-
-  identity if-200GE-oduflexcbr {
-    base supported-if-capability;
-  }
-
-  identity if-400GE-odufleximp {
-    base supported-if-capability;
-  }
-
-  identity if-400GE-oduflexcbr {
-    base supported-if-capability;
-  }
-
-  identity supported-xpdr-capability {
-    description
-      "Base identity from which specific supported xponder are derived";
-  }
-
-  identity Transponder {
-    base supported-xpdr-capability;
-  }
-
-  identity Regen {
-    base supported-xpdr-capability;
-  }
-
-  identity pluggable-identifiers-identity {
-    description
-      "Pluggable identifiers type";
-  }
-
-  identity SFP {
-    base pluggable-identifiers-identity;
-  }
-
-  identity SFP-plus {
-    base pluggable-identifiers-identity;
-  }
-
-  identity SFP28 {
-    base pluggable-identifiers-identity;
-  }
-
-  identity SFP-DD {
-    base pluggable-identifiers-identity;
-  }
-
-  identity DWDM-SFP {
-    base pluggable-identifiers-identity;
-  }
-
-  identity DWDM-SFP-plus {
-    base pluggable-identifiers-identity;
-  }
-
-  identity QSFP {
-    base pluggable-identifiers-identity;
-  }
-
-  identity QSFP-plus {
-    base pluggable-identifiers-identity;
-  }
-
-  identity QSFP28 {
-    base pluggable-identifiers-identity;
-  }
-
-  identity QSFP28-DD {
-    base pluggable-identifiers-identity;
-  }
-
-  identity QSFP-DD {
-    base pluggable-identifiers-identity;
-  }
-
-  identity micro-QSFP {
-    base pluggable-identifiers-identity;
-  }
-
-  identity OSFP {
-    base pluggable-identifiers-identity;
-  }
-
-  identity CFP {
-    base pluggable-identifiers-identity;
-  }
-
-  identity CFP2 {
-    base pluggable-identifiers-identity;
-  }
-
-  identity CFP4 {
-    base pluggable-identifiers-identity;
-  }
-
-  identity CFP8 {
-    base pluggable-identifiers-identity;
-  }
-
-  identity CFP2-ACO {
-    base pluggable-identifiers-identity;
-  }
-
-  identity CFP2-DCO {
-    base pluggable-identifiers-identity;
-  }
-
-  identity XFP {
-    base pluggable-identifiers-identity;
-  }
-
-  identity SFP56 {
-    base pluggable-identifiers-identity;
-  }
-
-  identity QSFP56 {
-    base pluggable-identifiers-identity;
-  }
-
-  identity QSFP56-DD {
-    base pluggable-identifiers-identity;
-  }
-
-  identity SFP-other {
-    base pluggable-identifiers-identity;
-  }
-
-  identity SFP-unspecified {
-    base pluggable-identifiers-identity;
-  }
-
-  identity pluggable-type-other {
-    base pluggable-identifiers-identity;
-  }
-
-  identity pluggable-type-unspecified {
-    base pluggable-identifiers-identity;
-  }
-
-  typedef port-wavelength-types {
-    type enumeration {
-      enum wavelength {
-        value 1;
-        description
-          "Port on a transponder or ROADM SRG add drop";
-      }
-      enum multi-wavelength {
-        value 2;
-        description
-          "External port connecting to other roadm.";
-      }
-    }
-    description
-      "Port types.";
-  }
-
-  typedef port-module-types {
-    type enumeration {
-      enum 100GBASE-LR4 {
-        value 1;
-      }
-      enum CWDM-4 {
-        value 2;
-      }
-    }
-    description
-      "Pluggable modue types.";
-  }
-
-  grouping common-port {
-    leaf port-power-capability-min-rx {
-      type org-openroadm-common-link-types:power-dBm;
-      config false;
-      description
-        "Based on port capabilities, the minimum power in the system spec for this port to
-         provide optimum function in rx direction";
-    }
-    leaf port-power-capability-min-tx {
-      type org-openroadm-common-link-types:power-dBm;
-      config false;
-      description
-        "Based on port capabilities, the minimum power in the system spec for this port to
-         provide optimum function in tx direction.";
-    }
-    leaf port-power-capability-max-rx {
-      type org-openroadm-common-link-types:power-dBm;
-      config false;
-      description
-        "Based on port capabilities, the maximum power in the system spec for this port to
-         provide optimum function in rx direction.";
-    }
-    leaf port-power-capability-max-tx {
-      type org-openroadm-common-link-types:power-dBm;
-      config false;
-      description
-        "Based on port capabilities, the maximum power in the system spec for this port to
-         provide optimum function in tx direction.";
-    }
-  }
-
-  grouping roadm-port {
-    uses common-port;
-  }
-
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-probable-cause@2016-10-14.yang b/ordmodels/common/src/main/yang/org-openroadm-probable-cause@2016-10-14.yang
deleted file mode 100644 (file)
index 642c256..0000000
+++ /dev/null
@@ -1,523 +0,0 @@
-module org-openroadm-probable-cause {
-  namespace "http://org/openroadm/probableCause";
-  prefix org-openroadm-probable-cause;
-
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2016-10-14;
-  }
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of Probable Causes.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      AT&T Intellectual Property.  All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping probable-cause {
-    leaf cause {
-      type probable-cause-enum;
-      mandatory true;
-    }
-    leaf extension {
-      type string;
-      mandatory false;
-    }
-    leaf direction {
-      description
-        "Direction indication of the alarm.";
-      type org-openroadm-common-types:direction;
-    }
-    leaf location {
-      description
-        "location indication of the alarm.";
-      type enumeration {
-        enum "NEND" {
-          value 1;
-          description
-            "Near End location";
-        }
-        enum "FEND" {
-          value 2;
-          description
-            "Far End location";
-        }
-      }
-    }
-  }
-
-  typedef probable-cause-enum {
-    type enumeration {
-      enum "vendorExtension" {
-        value 1;
-        description
-          "vendorExtension";
-      }
-      enum "openConnectionIndication" {
-        value 2;
-        description
-          "Open connection indication (OCI)";
-        reference "G.798";
-      }
-      enum "alarmIndicationSignal" {
-        value 3;
-        description
-          "Alarm indication signal";
-        reference "G.798";
-      }
-      enum "lossOfSignal" {
-        value 4;
-        description
-          "Loss of Signal";
-      }
-      enum "opticalLineFail" {
-        value 5;
-        description
-          "Optical Line Fail";
-      }
-      enum "opticalPowerDegraded" {
-        value 6;
-        description
-          "Optical Line Fail";
-      }
-      enum "automaticLaserShutdown" {
-        value 7;
-        description
-          "Optical Line Fail";
-      }
-      enum "serverSignalFail" {
-        value 8;
-        description
-          "Server Signal Fail (SSF)";
-        reference "G.798";
-      }
-      enum "lossofTandemConnection" {
-        value 9;
-        description
-          "Loss of Tandem Connection (LTC)";
-        reference "G.798";
-      }
-      enum "lockedDefect" {
-        value 10;
-        description
-          "Locked defect (LCK)";
-        reference "G.798";
-      }
-      enum "trailTraceIdentifierMismatch" {
-        value 11;
-        description
-          "Trail trace Identifier Mismatch (TIM)";
-        reference "G.798";
-      }
-      enum "degradedEffect" {
-        value 12;
-        description
-          "Degraded defect (DEG)";
-        reference "G.798";
-      }
-      enum "backwardsDefectIndication" {
-        value 13;
-        description
-          "Backward Defect Indication (BDI)";
-        reference "G.798";
-      }
-      enum "otsSpanlossPowerOutOfSpecificationHigh" {
-        value 14;
-      }
-      enum "automaticShutoffDisabled" {
-        value 15;
-      }
-      enum "postBlockManualLaserShutdown" {
-        value 16;
-      }
-      enum "portLossOfLight" {
-        value 17;
-      }
-      enum "reflectionTooHigh" {
-        value 18;
-      }
-      enum "shutoffThresholdCrossed" {
-        value 19;
-      }
-      enum "preBlockSpanAdjustmentInProgress" {
-        value 20;
-      }
-      enum "postBlockSpanAdjustmentInProgress" {
-        value 21;
-      }
-      enum "payloadMissingIndication" {
-        value 22;
-        description
-          "Will be applicable to ROADM when OSC signaling supported in future (G.709 2016-06 Figure 15-1A, 1B)";
-      }
-      enum "forwardDefectIndication" {
-        value 23;
-        description
-          "Will be applicable to ROADM when OSC signaling supported in future (G.709 2016-06 Figure 15-1A, 1B)";
-      }
-      enum "oscPowerOutOfSpecificationHigh" {
-        value 24;
-      }
-      enum "oscPowerOutOfSpecificationLow" {
-        value 25;
-      }
-      enum "powerOutOfSpecificationHigh" {
-        value 26;
-      }
-      enum "lossOfSynchronization" {
-        value 27;
-      }
-      enum "linkDown" {
-        value 28;
-      }
-      enum "equipmentFault" {
-        value 29;
-      }
-      enum "equipmentRemoved" {
-        value 30;
-      }
-      enum "equipmentMismatch" {
-        value 31;
-      }
-      enum "equipmentWarmup" {
-        value 32;
-      }
-      enum "equipmentLedOn" {
-        value 33;
-      }
-      enum "equipmentInterConnectFailure" {
-        value 34;
-      }
-      enum "equipmentMiscabledConnection" {
-        value 35;
-      }
-      enum "softwareVersionMismatch" {
-        value 36;
-      }
-      enum "softwareStageInProgress" {
-        value 37;
-      }
-      enum "databaseCorruption" {
-        value 38;
-      }
-      enum "databaseLockedSoftwareUpgradeInProgress" {
-        value 39;
-      }
-      enum "databaseLockedDbRestoreInProgress" {
-        value 40;
-      }
-      enum "databaseLockedSysInitInProgress" {
-        value 41;
-      }
-      enum "databaseLockedDbAlarmPresent" {
-        value 42;
-      }
-      enum "databaseLockedIlfViolation" {
-        value 43;
-      }
-      enum "databaseVersionMismatch" {
-        value 44;
-      }
-      enum "databaseLockedShelfProvModePresent" {
-        value 45;
-      }
-      enum "firmwareVersionMismatch" {
-        value 46;
-      }
-      enum "firmwareBackwardCompatibleLimited" {
-        value 47;
-      }
-      enum "firmwareBackwardCompatibleAll" {
-        value 48;
-      }
-      enum "incompatibleFirmware" {
-        value 49;
-      }
-      enum "firmwareDownloadOrActivationFailure" {
-        value 50;
-      }
-      enum "firmwareInitInProgress" {
-        value 51;
-      }
-      enum "softwareReset" {
-        value 52;
-      }
-      enum "fanCoolingFail" {
-        value 53;
-      }
-      enum "administrativeDown" {
-        value 54;
-      }
-      enum "lampTest" {
-        value 55;
-      }
-      enum "powerProblemA" {
-        value 56;
-      }
-      enum "powerProblemB" {
-        value 57;
-      }
-      enum "shelfProvisioningMode" {
-        value 58;
-      }
-      enum "sysNameChanged" {
-        value 59;
-      }
-      enum "sysNtpNotSynchronized" {
-        value 60;
-      }
-      enum "ilfViolationMajor" {
-        value 61;
-      }
-      enum "ilfViolationCritical" {
-        value 62;
-      }
-      enum "lossOfFrame" {
-        value 63;
-      }
-      enum "lossOfMultiframe" {
-        value 64;
-      }
-      enum "backwardIncomingAlignmentError" {
-        value 65;
-      }
-      enum "incomingAlignmentError" {
-        value 66;
-      }
-      enum "payloadMismatch" {
-        value 67;
-      }
-      enum "clientSignalFailDefect" {
-        value 68;
-      }
-      enum "backwardIncomingAlignmentErrorTCM1" {
-        value 69;
-      }
-      enum "backwardIncomingAlignmentErrorTCM2" {
-        value 70;
-      }
-      enum "backwardIncomingAlignmentErrorTCM3" {
-        value 71;
-      }
-      enum "backwardIncomingAlignmentErrorTCM4" {
-        value 72;
-      }
-      enum "backwardIncomingAlignmentErrorTCM5" {
-        value 73;
-      }
-      enum "backwardIncomingAlignmentErrorTCM6" {
-        value 74;
-      }
-      enum "incomingAlignmentErrorTCM1" {
-        value 75;
-      }
-      enum "incomingAlignmentErrorTCM2" {
-        value 76;
-      }
-      enum "incomingAlignmentErrorTCM3" {
-        value 77;
-      }
-      enum "incomingAlignmentErrorTCM4" {
-        value 78;
-      }
-      enum "incomingAlignmentErrorTCM5" {
-        value 79;
-      }
-      enum "incomingAlignmentErrorTCM6" {
-        value 80;
-      }
-      enum "backwardsDefectIndicationTCM1" {
-        value 81;
-      }
-      enum "backwardsDefectIndicationTCM2" {
-        value 82;
-      }
-      enum "backwardsDefectIndicationTCM3" {
-        value 83;
-      }
-      enum "backwardsDefectIndicationTCM4" {
-        value 84;
-      }
-      enum "backwardsDefectIndicationTCM5" {
-        value 85;
-      }
-      enum "backwardsDefectIndicationTCM6" {
-        value 86;
-      }
-      enum "degradedDefectTCM1" {
-        value 87;
-      }
-      enum "degradedDefectTCM2" {
-        value 88;
-      }
-      enum "degradedDefectTCM3" {
-        value 89;
-      }
-      enum "degradedDefectTCM4" {
-        value 90;
-      }
-      enum "degradedDefectTCM5" {
-        value 91;
-      }
-      enum "degradedDefectTCM6" {
-        value 92;
-      }
-      enum "trailTraceIdentifierMisMatchTCM1" {
-        value 93;
-      }
-      enum "trailTraceIdentifierMisMatchTCM2" {
-        value 94;
-      }
-      enum "trailTraceIdentifierMisMatchTCM3" {
-        value 95;
-      }
-      enum "trailTraceIdentifierMisMatchTCM4" {
-        value 96;
-      }
-      enum "trailTraceIdentifierMisMatchTCM5" {
-        value 97;
-      }
-      enum "trailTraceIdentifierMisMatchTCM6" {
-        value 98;
-      }
-      enum "alarmIndicationSignalTCM1" {
-        value 99;
-      }
-      enum "alarmIndicationSignalTCM2" {
-        value 100;
-      }
-      enum "alarmIndicationSignalTCM3" {
-        value 101;
-      }
-      enum "alarmIndicationSignalTCM4" {
-        value 102;
-      }
-      enum "alarmIndicationSignalTCM5" {
-        value 103;
-      }
-      enum "alarmIndicationSignalTCM6" {
-        value 104;
-      }
-      enum "openConnectionIndicationTCM1" {
-        value 105;
-      }
-      enum "openConnectionIndicationTCM2" {
-        value 106;
-      }
-      enum "openConnectionIndicationTCM3" {
-        value 107;
-      }
-      enum "openConnectionIndicationTCM4" {
-        value 108;
-      }
-      enum "openConnectionIndicationTCM5" {
-        value 109;
-      }
-      enum "openConnectionIndicationTCM6" {
-        value 110;
-      }
-      enum "lockedDefectTCM1" {
-        value 111;
-      }
-      enum "lockedDefectTCM2" {
-        value 112;
-      }
-      enum "lockedDefectTCM3" {
-        value 113;
-      }
-      enum "lockedDefectTCM4" {
-        value 114;
-      }
-      enum "lockedDefectTCM5" {
-        value 115;
-      }
-      enum "lockedDefectTCM6" {
-        value 116;
-      }
-      enum "lossofTandemConnectionTCM1" {
-        value 117;
-      }
-      enum "lossofTandemConnectionTCM2" {
-        value 118;
-      }
-      enum "lossofTandemConnectionTCM3" {
-        value 119;
-      }
-      enum "lossofTandemConnectionTCM4" {
-        value 120;
-      }
-      enum "lossofTandemConnectionTCM5" {
-        value 121;
-      }
-      enum "lossofTandemConnectionTCM6" {
-        value 122;
-      }
-      enum "highBER" {
-        value 123;
-      }
-      enum "localFault" {
-        value 124;
-      }
-      enum "remoteFault" {
-        value 125;
-      }
-      enum "lossOfAlignment" {
-        value 126;
-      }
-      enum "lossOfFECAlignment" {
-        value 127;
-      }
-      enum "facilityLoopbackActive" {
-        value 128;
-      }
-      enum "facilityLoopback2Active" {
-        value 129;
-      }
-      enum "terminalLoopbackActive" {
-        value 130;
-      }
-      enum "facilityTestsignalActive" {
-        value 131;
-      }
-      enum "terminalTestsignalActive" {
-        value 132;
-      }
-      enum "automaticLaserShutdownDisabled" {
-        value 133;
-      }
-      enum "certificateNotInstalled" {
-        value 134;
-      }
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-probable-cause@2018-10-19.yang b/ordmodels/common/src/main/yang/org-openroadm-probable-cause@2018-10-19.yang
deleted file mode 100644 (file)
index 030c93c..0000000
+++ /dev/null
@@ -1,767 +0,0 @@
-module org-openroadm-probable-cause {
-  namespace "http://org/openroadm/probableCause";
-  prefix org-openroadm-probable-cause;
-
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2018-10-19;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of Probable Causes.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      AT&T Intellectual Property.  All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef probable-cause-enum {
-    type enumeration {
-      enum "vendorExtension" {
-        value 1;
-        description
-          "vendorExtension";
-      }
-      enum "openConnectionIndication" {
-        value 2;
-        description
-          "Open connection indication (OCI)";
-        reference "G.798";
-      }
-      enum "alarmIndicationSignal" {
-        value 3;
-        description
-          "Alarm indication signal";
-        reference "G.798";
-      }
-      enum "lossOfSignal" {
-        value 4;
-        description
-          "Loss of Signal";
-      }
-      enum "opticalLineFail" {
-        value 5;
-        description
-          "Optical Line Fail";
-      }
-      enum "opticalPowerDegraded" {
-        value 6;
-        description
-          "Optical Line Fail";
-      }
-      enum "automaticLaserShutdown" {
-        value 7;
-        description
-          "Optical Line Fail";
-      }
-      enum "serverSignalFail" {
-        value 8;
-        description
-          "Server Signal Fail (SSF)";
-        reference "G.798";
-      }
-      enum "lockedDefect" {
-        value 10;
-        description
-          "Locked defect (LCK)";
-        reference "G.798";
-      }
-      enum "trailTraceIdentifierMismatch" {
-        value 11;
-        description
-          "Trail trace Identifier Mismatch (TIM)";
-        reference "G.798";
-      }
-      enum "degradedDefect" {
-        value 12;
-        description
-          "Degraded defect (DEG)";
-        reference "G.798";
-      }
-      enum "backwardsDefectIndication" {
-        value 13;
-        description
-          "Backward Defect Indication (BDI)";
-        reference "G.798";
-      }
-      enum "otsSpanlossPowerOutOfSpecificationHigh" {
-        value 14;
-      }
-      enum "automaticShutoffDisabled" {
-        value 15;
-      }
-      enum "portLossOfLight" {
-        value 17;
-      }
-      enum "reflectionTooHigh" {
-        value 18;
-      }
-      enum "payloadMissingIndication" {
-        value 22;
-        description
-          "Will be applicable to ROADM when OSC signaling supported in future (G.709 2016-06 Figure 15-1A, 1B)";
-      }
-      enum "forwardDefectIndication" {
-        value 23;
-        description
-          "Will be applicable to ROADM when OSC signaling supported in future (G.709 2016-06 Figure 15-1A, 1B)";
-      }
-      enum "oscPowerOutOfSpecificationHigh" {
-        value 24;
-      }
-      enum "oscPowerOutOfSpecificationLow" {
-        value 25;
-      }
-      enum "powerOutOfSpecificationHigh" {
-        value 26;
-      }
-      enum "lossOfSynchronization" {
-        value 27;
-      }
-      enum "linkDown" {
-        value 28;
-      }
-      enum "equipmentFault" {
-        value 29;
-      }
-      enum "equipmentRemoved" {
-        value 30;
-      }
-      enum "equipmentMismatch" {
-        value 31;
-      }
-      enum "equipmentWarmup" {
-        value 32;
-      }
-      enum "equipmentLedOn" {
-        value 33;
-      }
-      enum "equipmentInterConnectFailure" {
-        value 34;
-      }
-      enum "equipmentMiscabledConnection" {
-        value 35;
-      }
-      enum "softwareVersionMismatch" {
-        value 36;
-      }
-      enum "softwareStageInProgress" {
-        value 37;
-      }
-      enum "databaseCorruption" {
-        value 38;
-      }
-      enum "databaseVersionMismatch" {
-        value 44;
-      }
-      enum "firmwareVersionMismatch" {
-        value 46;
-      }
-      enum "incompatibleFirmware" {
-        value 49;
-      }
-      enum "firmwareDownloadOrActivationFailure" {
-        value 50;
-      }
-      enum "firmwareInitInProgress" {
-        value 51;
-      }
-      enum "softwareReset" {
-        value 52;
-      }
-      enum "fanCoolingFail" {
-        value 53;
-      }
-      enum "administrativeDown" {
-        value 54;
-      }
-      enum "lampTest" {
-        value 55;
-      }
-      enum "powerProblemA" {
-        value 56;
-      }
-      enum "powerProblemB" {
-        value 57;
-      }
-      enum "shelfProvisioningMode" {
-        value 58;
-      }
-      enum "sysNameChanged" {
-        value 59;
-      }
-      enum "sysNtpNotSynchronized" {
-        value 60;
-      }
-      enum "lossOfFrame" {
-        value 63;
-      }
-      enum "lossOfMultiframe" {
-        value 64;
-      }
-      enum "backwardIncomingAlignmentError" {
-        value 65;
-      }
-      enum "incomingAlignmentError" {
-        value 66;
-      }
-      enum "payloadMismatch" {
-        value 67;
-      }
-      enum "clientSignalFailDefect" {
-        value 68;
-      }
-      enum "highBER" {
-        value 123;
-      }
-      enum "localFault" {
-        value 124;
-      }
-      enum "remoteFault" {
-        value 125;
-      }
-      enum "lossOfAlignment" {
-        value 126;
-      }
-      enum "lossOfFECAlignment" {
-        value 127;
-      }
-      enum "facilityLoopbackActive" {
-        value 128;
-      }
-      enum "facilityLoopback2Active" {
-        value 129;
-      }
-      enum "terminalLoopbackActive" {
-        value 130;
-      }
-      enum "facilityTestsignalActive" {
-        value 131;
-      }
-      enum "terminalTestsignalActive" {
-        value 132;
-      }
-      enum "certificateNotInstalled" {
-        value 134;
-      }
-      enum "lockoutOfProtection" {
-        value 135;
-      }
-      enum "forcedSwitchAwayFromWorking" {
-        value 136;
-      }
-      enum "forcedSwitchAwayFromProtect" {
-        value 137;
-      }
-      enum "automaticSwitchAwayFromWorkingDueToSF" {
-        value 138;
-      }
-      enum "automaticSwitchAwayFromProtectDueToSF" {
-        value 139;
-      }
-      enum "automaticSwitchDueToWTR" {
-        value 140;
-      }
-      enum "manualSwitchAwayFromWork" {
-        value 141;
-      }
-      enum "manualSwitchAwayFromProtect" {
-        value 142;
-      }
-      enum "automaticPowerReduction" {
-        value 143;
-      }
-      enum "lossOfSignalOSC" {
-        value 144;
-      }
-      enum "softwareValidateInProgress" {
-        value 145;
-      }
-      enum "databaseRollbackTimerInProgress" {
-        value 146;
-      }
-      enum "otdrScanInProgress" {
-        value 147;
-      }
-      enum "lldpFail" {
-        value 148;
-      }
-      enum "omsPowerOutOfSpecificationHigh" {
-        value 149;
-      }
-      enum "omsPowerOutOfSpecificationLow" {
-        value 150;
-      }
-      enum "automaticSwitchAwayFromWorkingDueToSD" {
-        value 151;
-      }
-      enum "automaticSwitchAwayFromProtectDueToSD" {
-        value 152;
-      }
-      enum "backwardIncomingAlignmentErrorTCM1-up" {
-        value 153;
-      }
-      enum "backwardIncomingAlignmentErrorTCM2-up" {
-        value 154;
-      }
-      enum "backwardIncomingAlignmentErrorTCM3-up" {
-        value 155;
-      }
-      enum "backwardIncomingAlignmentErrorTCM4-up" {
-        value 156;
-      }
-      enum "backwardIncomingAlignmentErrorTCM5-up" {
-        value 157;
-      }
-      enum "backwardIncomingAlignmentErrorTCM6-up" {
-        value 158;
-      }
-      enum "incomingAlignmentErrorTCM1-up" {
-        value 159;
-      }
-      enum "incomingAlignmentErrorTCM2-up" {
-        value 160;
-      }
-      enum "incomingAlignmentErrorTCM3-up" {
-        value 161;
-      }
-      enum "incomingAlignmentErrorTCM4-up" {
-        value 162;
-      }
-      enum "incomingAlignmentErrorTCM5-up" {
-        value 163;
-      }
-      enum "incomingAlignmentErrorTCM6-up" {
-        value 164;
-      }
-      enum "backwardsDefectIndicationTCM1-up" {
-        value 165;
-      }
-      enum "backwardsDefectIndicationTCM2-up" {
-        value 166;
-      }
-      enum "backwardsDefectIndicationTCM3-up" {
-        value 167;
-      }
-      enum "backwardsDefectIndicationTCM4-up" {
-        value 168;
-      }
-      enum "backwardsDefectIndicationTCM5-up" {
-        value 169;
-      }
-      enum "backwardsDefectIndicationTCM6-up" {
-        value 170;
-      }
-      enum "degradedDefectTCM1-up" {
-        value 171;
-      }
-      enum "degradedDefectTCM2-up" {
-        value 172;
-      }
-      enum "degradedDefectTCM3-up" {
-        value 173;
-      }
-      enum "degradedDefectTCM4-up" {
-        value 174;
-      }
-      enum "degradedDefectTCM5-up" {
-        value 175;
-      }
-      enum "degradedDefectTCM6-up" {
-        value 176;
-      }
-      enum "trailTraceIdentifierMisMatchTCM1-up" {
-        value 177;
-      }
-      enum "trailTraceIdentifierMisMatchTCM2-up" {
-        value 178;
-      }
-      enum "trailTraceIdentifierMisMatchTCM3-up" {
-        value 179;
-      }
-      enum "trailTraceIdentifierMisMatchTCM4-up" {
-        value 180;
-      }
-      enum "trailTraceIdentifierMisMatchTCM5-up" {
-        value 181;
-      }
-      enum "trailTraceIdentifierMisMatchTCM6-up" {
-        value 182;
-      }
-      enum "alarmIndicationSignalTCM1-up" {
-        value 183;
-      }
-      enum "alarmIndicationSignalTCM2-up" {
-        value 184;
-      }
-      enum "alarmIndicationSignalTCM3-up" {
-        value 185;
-      }
-      enum "alarmIndicationSignalTCM4-up" {
-        value 186;
-      }
-      enum "alarmIndicationSignalTCM5-up" {
-        value 187;
-      }
-      enum "alarmIndicationSignalTCM6-up" {
-        value 188;
-      }
-      enum "openConnectionIndicationTCM1-up" {
-        value 189;
-      }
-      enum "openConnectionIndicationTCM2-up" {
-        value 190;
-      }
-      enum "openConnectionIndicationTCM3-up" {
-        value 191;
-      }
-      enum "openConnectionIndicationTCM4-up" {
-        value 192;
-      }
-      enum "openConnectionIndicationTCM5-up" {
-        value 193;
-      }
-      enum "openConnectionIndicationTCM6-up" {
-        value 194;
-      }
-      enum "lockedDefectTCM1-up" {
-        value 195;
-      }
-      enum "lockedDefectTCM2-up" {
-        value 196;
-      }
-      enum "lockedDefectTCM3-up" {
-        value 197;
-      }
-      enum "lockedDefectTCM4-up" {
-        value 198;
-      }
-      enum "lockedDefectTCM5-up" {
-        value 199;
-      }
-      enum "lockedDefectTCM6-up" {
-        value 200;
-      }
-      enum "lossofTandemConnectionTCM1-up" {
-        value 201;
-      }
-      enum "lossofTandemConnectionTCM2-up" {
-        value 202;
-      }
-      enum "lossofTandemConnectionTCM3-up" {
-        value 203;
-      }
-      enum "lossofTandemConnectionTCM4-up" {
-        value 204;
-      }
-      enum "lossofTandemConnectionTCM5-up" {
-        value 205;
-      }
-      enum "lossofTandemConnectionTCM6-up" {
-        value 206;
-      }
-      enum "backwardIncomingAlignmentErrorTCM1-down" {
-        value 207;
-      }
-      enum "backwardIncomingAlignmentErrorTCM2-down" {
-        value 208;
-      }
-      enum "backwardIncomingAlignmentErrorTCM3-down" {
-        value 209;
-      }
-      enum "backwardIncomingAlignmentErrorTCM4-down" {
-        value 210;
-      }
-      enum "backwardIncomingAlignmentErrorTCM5-down" {
-        value 211;
-      }
-      enum "backwardIncomingAlignmentErrorTCM6-down" {
-        value 212;
-      }
-      enum "incomingAlignmentErrorTCM1-down" {
-        value 213;
-      }
-      enum "incomingAlignmentErrorTCM2-down" {
-        value 214;
-      }
-      enum "incomingAlignmentErrorTCM3-down" {
-        value 215;
-      }
-      enum "incomingAlignmentErrorTCM4-down" {
-        value 216;
-      }
-      enum "incomingAlignmentErrorTCM5-down" {
-        value 217;
-      }
-      enum "incomingAlignmentErrorTCM6-down" {
-        value 218;
-      }
-      enum "backwardsDefectIndicationTCM1-down" {
-        value 219;
-      }
-      enum "backwardsDefectIndicationTCM2-down" {
-        value 220;
-      }
-      enum "backwardsDefectIndicationTCM3-down" {
-        value 221;
-      }
-      enum "backwardsDefectIndicationTCM4-down" {
-        value 222;
-      }
-      enum "backwardsDefectIndicationTCM5-down" {
-        value 223;
-      }
-      enum "backwardsDefectIndicationTCM6-down" {
-        value 224;
-      }
-      enum "degradedDefectTCM1-down" {
-        value 225;
-      }
-      enum "degradedDefectTCM2-down" {
-        value 226;
-      }
-      enum "degradedDefectTCM3-down" {
-        value 227;
-      }
-      enum "degradedDefectTCM4-down" {
-        value 228;
-      }
-      enum "degradedDefectTCM5-down" {
-        value 229;
-      }
-      enum "degradedDefectTCM6-down" {
-        value 230;
-      }
-      enum "trailTraceIdentifierMisMatchTCM1-down" {
-        value 231;
-      }
-      enum "trailTraceIdentifierMisMatchTCM2-down" {
-        value 232;
-      }
-      enum "trailTraceIdentifierMisMatchTCM3-down" {
-        value 233;
-      }
-      enum "trailTraceIdentifierMisMatchTCM4-down" {
-        value 234;
-      }
-      enum "trailTraceIdentifierMisMatchTCM5-down" {
-        value 235;
-      }
-      enum "trailTraceIdentifierMisMatchTCM6-down" {
-        value 236;
-      }
-      enum "alarmIndicationSignalTCM1-down" {
-        value 237;
-      }
-      enum "alarmIndicationSignalTCM2-down" {
-        value 238;
-      }
-      enum "alarmIndicationSignalTCM3-down" {
-        value 239;
-      }
-      enum "alarmIndicationSignalTCM4-down" {
-        value 240;
-      }
-      enum "alarmIndicationSignalTCM5-down" {
-        value 241;
-      }
-      enum "alarmIndicationSignalTCM6-down" {
-        value 242;
-      }
-      enum "openConnectionIndicationTCM1-down" {
-        value 243;
-      }
-      enum "openConnectionIndicationTCM2-down" {
-        value 244;
-      }
-      enum "openConnectionIndicationTCM3-down" {
-        value 245;
-      }
-      enum "openConnectionIndicationTCM4-down" {
-        value 246;
-      }
-      enum "openConnectionIndicationTCM5-down" {
-        value 247;
-      }
-      enum "openConnectionIndicationTCM6-down" {
-        value 248;
-      }
-      enum "lockedDefectTCM1-down" {
-        value 249;
-      }
-      enum "lockedDefectTCM2-down" {
-        value 250;
-      }
-      enum "lockedDefectTCM3-down" {
-        value 251;
-      }
-      enum "lockedDefectTCM4-down" {
-        value 252;
-      }
-      enum "lockedDefectTCM5-down" {
-        value 253;
-      }
-      enum "lockedDefectTCM6-down" {
-        value 254;
-      }
-      enum "lossofTandemConnectionTCM1-down" {
-        value 255;
-      }
-      enum "lossofTandemConnectionTCM2-down" {
-        value 256;
-      }
-      enum "lossofTandemConnectionTCM3-down" {
-        value 257;
-      }
-      enum "lossofTandemConnectionTCM4-down" {
-        value 258;
-      }
-      enum "lossofTandemConnectionTCM5-down" {
-        value 259;
-      }
-      enum "lossofTandemConnectionTCM6-down" {
-        value 260;
-      }
-      enum "multiplexStructureIdentifierMismatch" {
-        value 261;
-        description
-          "G798 : 6.2.9 (dMSIM)";
-      }
-      enum "lossOfOmfIndication" {
-        value 262;
-        description
-          "G798 : 14.3.10.2 Figure 14-73 (dLOOMFI)";
-      }
-      enum "lossOfFrameAndLossOfMultiframe" {
-        value 263;
-        description
-          "G798 : 6.2.5.3 (dLOFLOM)";
-      }
-      enum "lossOfDatabaseRedundancy" {
-        value 264;
-        description
-          "loss of database redundancy";
-      }
-      enum "databaseLocked" {
-        value 265;
-        description
-          "Database locked";
-      }
-      enum "createTechInfoInProgress" {
-        value 266;
-        description
-          "create-tech-info in progress";
-      }
-      enum "circuitPackActivateFailed" {
-        value 267;
-        description
-          "circuit-pack activation failed";
-      }
-      enum "softwareSubsystemFailed" {
-        value 268;
-        description
-          "Software subsystem failed";
-      }
-      enum "diskFull" {
-        value 269;
-        description
-          "Disk full";
-      }
-    }
-  }
-
-  grouping probable-cause {
-    leaf cause {
-      type probable-cause-enum;
-      mandatory true;
-    }
-    leaf extension {
-      type string;
-      mandatory false;
-    }
-    leaf direction {
-      type org-openroadm-common-types:direction;
-      mandatory true;
-      description
-        "Direction indication of the alarm.";
-    }
-    leaf location {
-      type org-openroadm-common-types:location;
-      mandatory true;
-      description
-        "location indication of the alarm.";
-    }
-    leaf type {
-      type enumeration {
-        enum "communication" {
-          value 1;
-        }
-        enum "qualityOfService" {
-          value 2;
-        }
-        enum "processingError" {
-          value 3;
-        }
-        enum "equipment" {
-          value 4;
-        }
-        enum "environmental" {
-          value 5;
-        }
-      }
-      mandatory false;
-      description
-        "Type of alarm. Based on X.733 event Type.";
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-probable-cause@2020-05-29.yang b/ordmodels/common/src/main/yang/org-openroadm-probable-cause@2020-05-29.yang
deleted file mode 100644 (file)
index b327742..0000000
+++ /dev/null
@@ -1,890 +0,0 @@
-module org-openroadm-probable-cause {
-  namespace "http://org/openroadm/probableCause";
-  prefix org-openroadm-probable-cause;
-
-  import org-openroadm-common-alarm-pm-types {
-    prefix org-openroadm-common-alarm-pm-types;
-    revision-date 2019-11-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of Probable Causes.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef probable-cause-enum {
-    type enumeration {
-      enum vendorExtension {
-        value 1;
-        description
-          "vendorExtension";
-      }
-      enum openConnectionIndication {
-        value 2;
-        description
-          "Open connection indication (OCI)";
-        reference
-          "G.798";
-      }
-      enum alarmIndicationSignal {
-        value 3;
-        description
-          "Alarm indication signal";
-        reference
-          "G.798";
-      }
-      enum lossOfSignal {
-        value 4;
-        description
-          "Loss of Signal";
-      }
-      enum opticalLineFail {
-        value 5;
-        description
-          "Optical Line Fail";
-      }
-      enum opticalPowerDegraded {
-        value 6;
-        description
-          "Optical Power Degraded";
-      }
-      enum automaticLaserShutdown {
-        value 7;
-        description
-          "Automatic Laser Shutdown";
-      }
-      enum serverSignalFail {
-        value 8;
-        description
-          "Server Signal Fail (SSF)";
-        reference
-          "G.798";
-      }
-      enum lockedDefect {
-        value 10;
-        description
-          "Locked defect (LCK)";
-        reference
-          "G.798";
-      }
-      enum trailTraceIdentifierMismatch {
-        value 11;
-        description
-          "Trail trace Identifier Mismatch (TIM)";
-        reference
-          "G.798";
-      }
-      enum degradedDefect {
-        value 12;
-        description
-          "Degraded defect (DEG)";
-        reference
-          "G.798";
-      }
-      enum backwardsDefectIndication {
-        value 13;
-        description
-          "Backward Defect Indication (BDI)";
-        reference
-          "G.798";
-      }
-      enum otsSpanlossPowerOutOfSpecificationHigh {
-        value 14;
-      }
-      enum automaticShutoffDisabled {
-        value 15;
-      }
-      enum portLossOfLight {
-        value 17;
-      }
-      enum reflectionTooHigh {
-        value 18;
-      }
-      enum payloadMissingIndication {
-        value 22;
-        description
-          "Will be applicable to ROADM when OSC signaling supported in future (G.709 2016-06 Figure 15-1A, 1B)";
-      }
-      enum forwardDefectIndication {
-        value 23;
-        description
-          "Will be applicable to ROADM when OSC signaling supported in future (G.709 2016-06 Figure 15-1A, 1B)";
-      }
-      enum oscPowerOutOfSpecificationHigh {
-        value 24;
-      }
-      enum oscPowerOutOfSpecificationLow {
-        value 25;
-      }
-      enum powerOutOfSpecificationHigh {
-        value 26;
-      }
-      enum lossOfSynchronization {
-        value 27;
-      }
-      enum linkDown {
-        value 28;
-      }
-      enum equipmentFault {
-        value 29;
-      }
-      enum equipmentRemoved {
-        value 30;
-      }
-      enum equipmentMismatch {
-        value 31;
-      }
-      enum equipmentWarmup {
-        value 32;
-      }
-      enum equipmentLedOn {
-        value 33;
-      }
-      enum equipmentInterConnectFailure {
-        value 34;
-      }
-      enum equipmentMiscabledConnection {
-        value 35;
-      }
-      enum softwareVersionMismatch {
-        value 36;
-      }
-      enum softwareStageInProgress {
-        value 37;
-      }
-      enum databaseCorruption {
-        value 38;
-      }
-      enum databaseVersionMismatch {
-        value 44;
-      }
-      enum firmwareVersionMismatch {
-        value 46;
-      }
-      enum incompatibleFirmware {
-        value 49;
-      }
-      enum firmwareDownloadOrActivationFailure {
-        value 50;
-      }
-      enum firmwareInitInProgress {
-        value 51;
-      }
-      enum softwareReset {
-        value 52;
-      }
-      enum fanCoolingFail {
-        value 53;
-      }
-      enum administrativeDown {
-        value 54;
-      }
-      enum lampTest {
-        value 55;
-      }
-      enum powerProblemA {
-        value 56;
-      }
-      enum powerProblemB {
-        value 57;
-      }
-      enum shelfProvisioningMode {
-        value 58;
-      }
-      enum sysNameChanged {
-        value 59;
-      }
-      enum sysNtpNotSynchronized {
-        value 60;
-      }
-      enum lossOfFrame {
-        value 63;
-      }
-      enum lossOfMultiframe {
-        value 64;
-      }
-      enum backwardIncomingAlignmentError {
-        value 65;
-      }
-      enum incomingAlignmentError {
-        value 66;
-      }
-      enum payloadMismatch {
-        value 67;
-      }
-      enum clientSignalFailDefect {
-        value 68;
-      }
-      enum highBER {
-        value 123;
-      }
-      enum localFault {
-        value 124;
-      }
-      enum remoteFault {
-        value 125;
-      }
-      enum lossOfAlignment {
-        value 126;
-      }
-      enum lossOfFECAlignment {
-        value 127;
-      }
-      enum facilityLoopbackActive {
-        value 128;
-      }
-      enum facilityLoopback2Active {
-        value 129;
-      }
-      enum terminalLoopbackActive {
-        value 130;
-      }
-      enum facilityTestsignalActive {
-        value 131;
-      }
-      enum terminalTestsignalActive {
-        value 132;
-      }
-      enum certificateNotInstalled {
-        value 134;
-      }
-      enum lockoutOfProtection {
-        value 135;
-      }
-      enum forcedSwitchAwayFromWorking {
-        value 136;
-      }
-      enum forcedSwitchAwayFromProtect {
-        value 137;
-      }
-      enum automaticSwitchAwayFromWorkingDueToSF {
-        value 138;
-      }
-      enum automaticSwitchAwayFromProtectDueToSF {
-        value 139;
-      }
-      enum automaticSwitchDueToWTR {
-        value 140;
-      }
-      enum manualSwitchAwayFromWork {
-        value 141;
-      }
-      enum manualSwitchAwayFromProtect {
-        value 142;
-      }
-      enum automaticPowerReduction {
-        value 143;
-      }
-      enum lossOfSignalOSC {
-        value 144;
-      }
-      enum softwareValidateInProgress {
-        value 145;
-      }
-      enum databaseRollbackTimerInProgress {
-        value 146;
-      }
-      enum otdrScanInProgress {
-        value 147;
-      }
-      enum lldpFail {
-        value 148;
-      }
-      enum omsPowerOutOfSpecificationHigh {
-        value 149;
-      }
-      enum omsPowerOutOfSpecificationLow {
-        value 150;
-      }
-      enum automaticSwitchAwayFromWorkingDueToSD {
-        value 151;
-      }
-      enum automaticSwitchAwayFromProtectDueToSD {
-        value 152;
-      }
-      enum backwardIncomingAlignmentErrorTCM1-up {
-        value 153;
-      }
-      enum backwardIncomingAlignmentErrorTCM2-up {
-        value 154;
-      }
-      enum backwardIncomingAlignmentErrorTCM3-up {
-        value 155;
-      }
-      enum backwardIncomingAlignmentErrorTCM4-up {
-        value 156;
-      }
-      enum backwardIncomingAlignmentErrorTCM5-up {
-        value 157;
-      }
-      enum backwardIncomingAlignmentErrorTCM6-up {
-        value 158;
-      }
-      enum incomingAlignmentErrorTCM1-up {
-        value 159;
-      }
-      enum incomingAlignmentErrorTCM2-up {
-        value 160;
-      }
-      enum incomingAlignmentErrorTCM3-up {
-        value 161;
-      }
-      enum incomingAlignmentErrorTCM4-up {
-        value 162;
-      }
-      enum incomingAlignmentErrorTCM5-up {
-        value 163;
-      }
-      enum incomingAlignmentErrorTCM6-up {
-        value 164;
-      }
-      enum backwardsDefectIndicationTCM1-up {
-        value 165;
-      }
-      enum backwardsDefectIndicationTCM2-up {
-        value 166;
-      }
-      enum backwardsDefectIndicationTCM3-up {
-        value 167;
-      }
-      enum backwardsDefectIndicationTCM4-up {
-        value 168;
-      }
-      enum backwardsDefectIndicationTCM5-up {
-        value 169;
-      }
-      enum backwardsDefectIndicationTCM6-up {
-        value 170;
-      }
-      enum degradedDefectTCM1-up {
-        value 171;
-      }
-      enum degradedDefectTCM2-up {
-        value 172;
-      }
-      enum degradedDefectTCM3-up {
-        value 173;
-      }
-      enum degradedDefectTCM4-up {
-        value 174;
-      }
-      enum degradedDefectTCM5-up {
-        value 175;
-      }
-      enum degradedDefectTCM6-up {
-        value 176;
-      }
-      enum trailTraceIdentifierMisMatchTCM1-up {
-        value 177;
-      }
-      enum trailTraceIdentifierMisMatchTCM2-up {
-        value 178;
-      }
-      enum trailTraceIdentifierMisMatchTCM3-up {
-        value 179;
-      }
-      enum trailTraceIdentifierMisMatchTCM4-up {
-        value 180;
-      }
-      enum trailTraceIdentifierMisMatchTCM5-up {
-        value 181;
-      }
-      enum trailTraceIdentifierMisMatchTCM6-up {
-        value 182;
-      }
-      enum alarmIndicationSignalTCM1-up {
-        value 183;
-      }
-      enum alarmIndicationSignalTCM2-up {
-        value 184;
-      }
-      enum alarmIndicationSignalTCM3-up {
-        value 185;
-      }
-      enum alarmIndicationSignalTCM4-up {
-        value 186;
-      }
-      enum alarmIndicationSignalTCM5-up {
-        value 187;
-      }
-      enum alarmIndicationSignalTCM6-up {
-        value 188;
-      }
-      enum openConnectionIndicationTCM1-up {
-        value 189;
-      }
-      enum openConnectionIndicationTCM2-up {
-        value 190;
-      }
-      enum openConnectionIndicationTCM3-up {
-        value 191;
-      }
-      enum openConnectionIndicationTCM4-up {
-        value 192;
-      }
-      enum openConnectionIndicationTCM5-up {
-        value 193;
-      }
-      enum openConnectionIndicationTCM6-up {
-        value 194;
-      }
-      enum lockedDefectTCM1-up {
-        value 195;
-      }
-      enum lockedDefectTCM2-up {
-        value 196;
-      }
-      enum lockedDefectTCM3-up {
-        value 197;
-      }
-      enum lockedDefectTCM4-up {
-        value 198;
-      }
-      enum lockedDefectTCM5-up {
-        value 199;
-      }
-      enum lockedDefectTCM6-up {
-        value 200;
-      }
-      enum lossofTandemConnectionTCM1-up {
-        value 201;
-      }
-      enum lossofTandemConnectionTCM2-up {
-        value 202;
-      }
-      enum lossofTandemConnectionTCM3-up {
-        value 203;
-      }
-      enum lossofTandemConnectionTCM4-up {
-        value 204;
-      }
-      enum lossofTandemConnectionTCM5-up {
-        value 205;
-      }
-      enum lossofTandemConnectionTCM6-up {
-        value 206;
-      }
-      enum backwardIncomingAlignmentErrorTCM1-down {
-        value 207;
-      }
-      enum backwardIncomingAlignmentErrorTCM2-down {
-        value 208;
-      }
-      enum backwardIncomingAlignmentErrorTCM3-down {
-        value 209;
-      }
-      enum backwardIncomingAlignmentErrorTCM4-down {
-        value 210;
-      }
-      enum backwardIncomingAlignmentErrorTCM5-down {
-        value 211;
-      }
-      enum backwardIncomingAlignmentErrorTCM6-down {
-        value 212;
-      }
-      enum incomingAlignmentErrorTCM1-down {
-        value 213;
-      }
-      enum incomingAlignmentErrorTCM2-down {
-        value 214;
-      }
-      enum incomingAlignmentErrorTCM3-down {
-        value 215;
-      }
-      enum incomingAlignmentErrorTCM4-down {
-        value 216;
-      }
-      enum incomingAlignmentErrorTCM5-down {
-        value 217;
-      }
-      enum incomingAlignmentErrorTCM6-down {
-        value 218;
-      }
-      enum backwardsDefectIndicationTCM1-down {
-        value 219;
-      }
-      enum backwardsDefectIndicationTCM2-down {
-        value 220;
-      }
-      enum backwardsDefectIndicationTCM3-down {
-        value 221;
-      }
-      enum backwardsDefectIndicationTCM4-down {
-        value 222;
-      }
-      enum backwardsDefectIndicationTCM5-down {
-        value 223;
-      }
-      enum backwardsDefectIndicationTCM6-down {
-        value 224;
-      }
-      enum degradedDefectTCM1-down {
-        value 225;
-      }
-      enum degradedDefectTCM2-down {
-        value 226;
-      }
-      enum degradedDefectTCM3-down {
-        value 227;
-      }
-      enum degradedDefectTCM4-down {
-        value 228;
-      }
-      enum degradedDefectTCM5-down {
-        value 229;
-      }
-      enum degradedDefectTCM6-down {
-        value 230;
-      }
-      enum trailTraceIdentifierMisMatchTCM1-down {
-        value 231;
-      }
-      enum trailTraceIdentifierMisMatchTCM2-down {
-        value 232;
-      }
-      enum trailTraceIdentifierMisMatchTCM3-down {
-        value 233;
-      }
-      enum trailTraceIdentifierMisMatchTCM4-down {
-        value 234;
-      }
-      enum trailTraceIdentifierMisMatchTCM5-down {
-        value 235;
-      }
-      enum trailTraceIdentifierMisMatchTCM6-down {
-        value 236;
-      }
-      enum alarmIndicationSignalTCM1-down {
-        value 237;
-      }
-      enum alarmIndicationSignalTCM2-down {
-        value 238;
-      }
-      enum alarmIndicationSignalTCM3-down {
-        value 239;
-      }
-      enum alarmIndicationSignalTCM4-down {
-        value 240;
-      }
-      enum alarmIndicationSignalTCM5-down {
-        value 241;
-      }
-      enum alarmIndicationSignalTCM6-down {
-        value 242;
-      }
-      enum openConnectionIndicationTCM1-down {
-        value 243;
-      }
-      enum openConnectionIndicationTCM2-down {
-        value 244;
-      }
-      enum openConnectionIndicationTCM3-down {
-        value 245;
-      }
-      enum openConnectionIndicationTCM4-down {
-        value 246;
-      }
-      enum openConnectionIndicationTCM5-down {
-        value 247;
-      }
-      enum openConnectionIndicationTCM6-down {
-        value 248;
-      }
-      enum lockedDefectTCM1-down {
-        value 249;
-      }
-      enum lockedDefectTCM2-down {
-        value 250;
-      }
-      enum lockedDefectTCM3-down {
-        value 251;
-      }
-      enum lockedDefectTCM4-down {
-        value 252;
-      }
-      enum lockedDefectTCM5-down {
-        value 253;
-      }
-      enum lockedDefectTCM6-down {
-        value 254;
-      }
-      enum lossofTandemConnectionTCM1-down {
-        value 255;
-      }
-      enum lossofTandemConnectionTCM2-down {
-        value 256;
-      }
-      enum lossofTandemConnectionTCM3-down {
-        value 257;
-      }
-      enum lossofTandemConnectionTCM4-down {
-        value 258;
-      }
-      enum lossofTandemConnectionTCM5-down {
-        value 259;
-      }
-      enum lossofTandemConnectionTCM6-down {
-        value 260;
-      }
-      enum multiplexStructureIdentifierMismatch {
-        value 261;
-        description
-          "G798 : 6.2.9 (dMSIM)";
-      }
-      enum lossOfOmfIndication {
-        value 262;
-        description
-          "G798 : 14.3.10.2 Figure 14-73 (dLOOMFI)";
-      }
-      enum lossOfFrameAndLossOfMultiframe {
-        value 263;
-        description
-          "G798 : 6.2.5.3 (dLOFLOM)";
-      }
-      enum lossOfDatabaseRedundancy {
-        value 264;
-        description
-          "loss of database redundancy";
-      }
-      enum databaseLocked {
-        value 265;
-        description
-          "Database locked";
-      }
-      enum createTechInfoInProgress {
-        value 266;
-        description
-          "create-tech-info in progress";
-      }
-      enum circuitPackActivateFailed {
-        value 267;
-        description
-          "circuit-pack activation failed";
-      }
-      enum softwareSubsystemFailed {
-        value 268;
-        description
-          "Software subsystem failed";
-      }
-      enum diskFull {
-        value 269;
-        description
-          "Disk full";
-      }
-      enum lossOfSignalPayload {
-        value 270;
-        description
-          "Loss Of Signal Payload";
-        reference
-          "G.798 6.2.1.2 dLOS-P, 16.8.2 OTSi/FlexO_A_Sk";
-      }
-      enum lossOfLaneAlignment {
-        value 271;
-        description
-          "Loss Of Lane Alignment";
-        reference
-          "G.798 15.3.1.2 FlexO-n/OTUCn_A_Sk that dLOL if the alignment process is in OLA state;
-           16.7.2 (OTSi/FlexO-1-SC_A_Sk) (G.709.3) & 16.8.2 (OTSiG/FlexO_A_Sk) (G.709.1)
-           that dLOL based on the FEC alignment state diagram";
-      }
-      enum groupIdMismatch {
-        value 272;
-        description
-          "Group Id Mismatch";
-        reference
-          "G.798 dGIDM in Annex B.1.1.2.1; G.798 15.3.1.2 FlexO-n/OTUCn_A_Sk";
-      }
-      enum flexoMapMismatch {
-        value 273;
-        description
-          "FlexO Map Mismatch";
-        reference
-          "G.798 dFMM in Annex B.1.1.2.2; G.798 15.3.1.2 FlexO-n/OTUCn_A_Sk";
-      }
-      enum powerOutOfSpecificationLow {
-        value 274;
-      }
-      enum gfpLossOfFrameDelineation {
-        value 275;
-        description
-          "GFP loss of frame delineation (dLFD G.806:6.2.5.2) is raised when the frame delineation process (clause 6.3.1 of [ITU-T G.7041]) is not in the 'SYNC' state";
-      }
-      enum cmfLossOfSignal {
-        value 276;
-        description
-          "GFP client signal fail (dCSF G.806:6.2.6.4.1) is raised when a GFP frame with correct tHEC, with aPTI = '100' and a valid UPI code 0x01(G.7041: Table 6-4) is received";
-      }
-      enum cmfLossOfSync {
-        value 277;
-        description
-          "GFP client signal fail (dCSF G.806:6.2.6.4.1) is raised when a GFP frame with correct tHEC, with aPTI = '100' and a valid UPI code 0x02(G.7041: Table 6-4) is received";
-      }
-      enum cmfForwardDefectIndication {
-        value 278;
-        description
-          "GFP client signal fail (dCSF G.806:6.2.6.4.1) is raised when a GFP frame with correct tHEC, with aPTI = '100' and a valid UPI code 0x04(G.7041: Table 6-4) is received";
-      }
-      enum cmfReverseDefectIndication {
-        value 279;
-        description
-          "GFP client signal fail (dCSF G.806:6.2.6.4.1) is raised when a GFP frame with correct tHEC, with aPTI = '100' and a valid UPI code 0x05(G.7041: Table 6-4) is received";
-      }
-      enum localDegradedSER {
-        value 280;
-        description
-          "Local Degraded SER";
-        reference
-          "IEEE 802.3-2018  Section 45.2.3.60.1,  IEEE 802.3-2018  Section 119";
-      }
-      enum remoteDegradedSER {
-        value 281;
-        description
-          "Remote Degraded SER";
-        reference
-          "IEEE 802.3-2018  Section 45.2.3.60.2,  IEEE 802.3-2018  Section 119";
-      }
-      enum fecDegradedSER {
-        value 282;
-        description
-          "PCS FEC Degrade SER";
-        reference
-          "IEEE 802.3-2018  Section 119";
-      }
-      enum farEndFaultIndication {
-        value 283;
-        description
-          "Far End Fault Indication";
-        reference
-          "IEEE 802.3-2018 Section 24.3.2.1";
-      }
-    }
-    description
-      "probable cause group";
-  }
-
-  grouping probable-cause {
-    leaf cause {
-      type probable-cause-enum;
-      mandatory true;
-    }
-    leaf extension {
-      type string;
-      mandatory false;
-    }
-    leaf direction {
-      type org-openroadm-common-alarm-pm-types:direction;
-      mandatory true;
-      description
-        "Direction indication of the alarm.";
-    }
-    leaf location {
-      type org-openroadm-common-alarm-pm-types:location;
-      mandatory true;
-      description
-        "location indication of the alarm.";
-    }
-    leaf type {
-      type enumeration {
-        enum communication {
-          value 1;
-        }
-        enum qualityOfService {
-          value 2;
-        }
-        enum processingError {
-          value 3;
-        }
-        enum equipment {
-          value 4;
-        }
-        enum environmental {
-          value 5;
-        }
-      }
-      mandatory false;
-      description
-        "Type of alarm. Based on X.733 event Type.";
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-resource-types@2016-10-14.yang b/ordmodels/common/src/main/yang/org-openroadm-resource-types@2016-10-14.yang
deleted file mode 100644 (file)
index bb6a80a..0000000
+++ /dev/null
@@ -1,252 +0,0 @@
-module org-openroadm-resource-types {
-  namespace "http://org/openroadm/resource/types";
-  prefix org-openroadm-resource-types;
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common resource types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      AT&T Intellectual Property.  All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping resource-type {
-    leaf type {
-      type resource-type-enum;
-      mandatory true;
-    }
-    leaf extension {
-      type string;
-      mandatory false;
-    }
-  }
-
-  typedef resource-type-enum {
-    type enumeration {
-      enum "other" {
-        value 1;
-        description
-          "Resource of type not found in list.";
-      }
-      enum "device" {
-        value 2;
-        description
-          "device - ROAMD, Xponder, etc";
-      }
-      enum "degree" {
-        value 3;
-        description
-          "degree";
-      }
-      enum "shared-risk-group" {
-        value 4;
-        description
-          "shared-risk-group";
-      }
-      enum "connection" {
-        value 5;
-        description
-          "connection";
-      }
-      enum "connection-map" {
-        value 6;
-        description
-          "connection-map";
-      }
-      enum "port" {
-        value 7;
-        description
-          "port";
-      }
-      enum "circuit-pack" {
-        value 8;
-        description
-          "circuit pack";
-      }
-      enum "internal-link" {
-        value 9;
-        description
-          "internal-link";
-      }
-      enum "physical-link" {
-        value 10;
-        description
-          "physical-link";
-      }
-      enum "interface" {
-        value 11;
-        description
-          "interface";
-      }
-      enum "shelf" {
-        value 12;
-        description
-          "shelf";
-      }
-      enum "service" {
-        value 13;
-        description
-          "service";
-      }
-    }
-  }
-
-  grouping device-id {
-    description
-      "Device identifier. Unique within the Controller.";
-    leaf node-id {
-      description
-        "Node Id is a globally unique identifier for a device.
-         Same as leafref value in model, if applicable.";
-      type string;
-    }
-  }
-
-  grouping circuit-pack-name {
-    leaf circuit-pack-name {
-      description
-        "Circuit-Pack identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-      type string;
-      mandatory true;
-    }
-  }
-
-  grouping port-name {
-    uses circuit-pack-name;
-    leaf port-name {
-      description
-        "Port identifier. Unique within the context of a circuit-pack.
-         Same as leafref value in model, if applicable.";
-      type string;
-    }
-  }
-
-  grouping physical-link-name {
-    leaf physical-link-name {
-      description
-        "Physical Link identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-      type string;
-      mandatory true;
-    }
-  }
-
-  grouping internal-link-name {
-    leaf internal-link-name {
-      description
-        "Internal Link identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-      type string;
-      mandatory true;
-    }
-  }
-
-  grouping connection-number {
-    leaf connection-number {
-      description
-        "Connection identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-      type string;
-    }
-  }
-
-  grouping degree-number {
-    leaf degree-number {
-      description
-        "Degree identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-      type uint16;
-    }
-  }
-
-  grouping srg-number {
-    leaf srg-number {
-      description
-        "Shared Risk Group identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-      type uint16;
-    }
-  }
-
-  grouping shelf-name {
-    leaf shelf-name {
-      description
-        "Shelf-id identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-      type string;
-      mandatory true;
-    }
-  }
-
-  grouping service-name {
-    leaf service-name {
-      description
-        "Service identifier. Unique within the context of a network.
-         Same as leafref value in model, if applicable.";
-      type string;
-      mandatory true;
-    }
-  }
-
-  grouping interface-name {
-    leaf interface-name {
-      description
-        "Interface identifier.";
-      type string;
-      mandatory true;
-    }
-  }
-
-  typedef resource-notification-type {
-    description
-      "Type of notification about a resource";
-    type enumeration {
-      enum "resourceCreation" {
-        value 1;
-        description
-          "A new instance of a resource has been created.";
-      }
-      enum "resourceModification" {
-        value 2;
-        description
-          "An exhisting instance of a resource has been modified. This shall be triggered by changes in configuration, state, status etc.
-           It shall not be triggered by changes in performance measurements, power and temperature readings or any other data that is highlyvolatile. ";
-      }
-      enum "resourceDeletion" {
-        value 3;
-        description
-          "An exhisting instance of a resource has been removed.";
-      }
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-resource-types@2018-10-19.yang b/ordmodels/common/src/main/yang/org-openroadm-resource-types@2018-10-19.yang
deleted file mode 100644 (file)
index 765c380..0000000
+++ /dev/null
@@ -1,362 +0,0 @@
-module org-openroadm-resource-types {
-  namespace "http://org/openroadm/resource/types";
-  prefix org-openroadm-resource-types;
-
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2018-10-19;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common resource types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      AT&T Intellectual Property.  All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef resource-type-enum {
-    type enumeration {
-      enum "other" {
-        value 1;
-        description
-          "Resource of type not found in list.";
-      }
-      enum "device" {
-        value 2;
-        description
-          "device - ROAMD, Xponder, etc";
-      }
-      enum "degree" {
-        value 3;
-        description
-          "degree";
-      }
-      enum "shared-risk-group" {
-        value 4;
-        description
-          "shared-risk-group";
-      }
-      enum "connection" {
-        value 5;
-        description
-          "connection - this is used by roadm-connection and odu-connection
-           since they are mutually exclusive in the model";
-      }
-      enum "connection-map" {
-        value 6;
-        description
-          "connection-map";
-      }
-      enum "port" {
-        value 7;
-        description
-          "port";
-      }
-      enum "circuit-pack" {
-        value 8;
-        description
-          "circuit pack";
-      }
-      enum "internal-link" {
-        value 9;
-        description
-          "internal-link";
-      }
-      enum "physical-link" {
-        value 10;
-        description
-          "physical-link";
-      }
-      enum "interface" {
-        value 11;
-        description
-          "interface";
-      }
-      enum "shelf" {
-        value 12;
-        description
-          "shelf";
-      }
-      enum "service" {
-        value 13;
-        description
-          "service";
-      }
-      enum "odu-sncp-pg" {
-        value 14;
-        description
-          "odu-sncp-pg";
-      }
-      enum "line-amplifier" {
-        value 15;
-        description
-          "line-amplifier";
-      }
-      enum "xponder" {
-        value 16;
-        description
-          "xponder";
-      }
-      enum "versioned-service" {
-        value 17;
-        description
-          "versioned-service";
-      }
-      enum "temp-service" {
-        value 18;
-        description
-          "temp-service";
-      }
-    }
-  }
-
-  typedef resource-notification-type {
-    type enumeration {
-      enum "resourceCreation" {
-        value 1;
-        description
-          "A new instance of a resource has been created.";
-      }
-      enum "resourceModification" {
-        value 2;
-        description
-          "An exhisting instance of a resource has been modified. This shall be triggered by changes in configuration, state, status etc.
-           It shall not be triggered by changes in performance measurements, power and temperature readings or any other data that is highlyvolatile. ";
-      }
-      enum "resourceDeletion" {
-        value 3;
-        description
-          "An exhisting instance of a resource has been removed.";
-      }
-    }
-    description
-      "Type of notification about a resource";
-  }
-
-  grouping resource-type {
-    leaf type {
-      type resource-type-enum;
-      mandatory true;
-    }
-    leaf extension {
-      type string;
-      mandatory false;
-    }
-  }
-
-  grouping device-id {
-    description
-      "Device identifier. Unique within the Controller.";
-    leaf node-id {
-      type org-openroadm-common-types:node-id-type;
-      description
-        "Node Id is a globally unique identifier for a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping circuit-pack-name {
-    leaf circuit-pack-name {
-      type string;
-      mandatory true;
-      description
-        "Circuit-Pack identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping port-name {
-    uses circuit-pack-name;
-    leaf port-name {
-      type string;
-      description
-        "Port identifier. Unique within the context of a circuit-pack.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping physical-link-name {
-    leaf physical-link-name {
-      type string;
-      mandatory true;
-      description
-        "Physical Link identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping internal-link-name {
-    leaf internal-link-name {
-      type string;
-      mandatory true;
-      description
-        "Internal Link identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping connection-name {
-    leaf connection-name {
-      type string;
-      description
-        "Connection name. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping degree-number {
-    leaf degree-number {
-      type uint16;
-      description
-        "Degree identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping srg-number {
-    leaf srg-number {
-      type uint16;
-      description
-        "Shared Risk Group identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping shelf-name {
-    leaf shelf-name {
-      type string;
-      mandatory true;
-      description
-        "Shelf-id identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping service-name {
-    leaf service-name {
-      type string;
-      mandatory true;
-      description
-        "Service identifier. Unique within the context of a network.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping versioned-service-name {
-    leaf versioned-service-name {
-      type string;
-      mandatory true;
-      description
-        "Service identifier. Unique within the context of a network.
-         Same as leafref value in model, if applicable.";
-    }
-    leaf version-number {
-      type uint64;
-      mandatory true;
-      description
-        "version-number of the service";
-    }
-  }
-
-  grouping temp-service-name {
-    leaf common-id {
-      type string;
-      mandatory true;
-      description
-        "Service identifier. Unique within the context of a network.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping interface-name {
-    leaf interface-name {
-      type string;
-      mandatory true;
-      description
-        "Interface identifier.";
-    }
-  }
-
-  grouping other-resource-id {
-    leaf other-resource-id {
-      type string;
-      mandatory true;
-      description
-        "resource-id for other.";
-    }
-  }
-
-  grouping odu-sncp-pg-name {
-    leaf odu-sncp-pg-name {
-      type string;
-      mandatory true;
-      description
-        "name of the odu-snc-pg";
-    }
-  }
-
-  grouping amp-number {
-    leaf amp-number {
-      type uint8;
-      mandatory true;
-      description
-        "number of the line-amplifier";
-    }
-  }
-
-  grouping xpdr-number {
-    leaf xpdr-number {
-      type uint16;
-      mandatory true;
-      description
-        "number of the xponder";
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-resource-types@2018-11-30.yang b/ordmodels/common/src/main/yang/org-openroadm-resource-types@2018-11-30.yang
deleted file mode 100644 (file)
index 1dd89df..0000000
+++ /dev/null
@@ -1,370 +0,0 @@
-module org-openroadm-resource-types {
-  namespace "http://org/openroadm/resource/types";
-  prefix org-openroadm-resource-types;
-
-  import org-openroadm-common-node-types {
-    prefix org-openroadm-common-node-types;
-    revision-date 2018-11-30;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common resource types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef resource-type-enum {
-    type enumeration {
-      enum "other" {
-        value 1;
-        description
-          "Resource of type not found in list.";
-      }
-      enum "device" {
-        value 2;
-        description
-          "device - ROAMD, Xponder, etc";
-      }
-      enum "degree" {
-        value 3;
-        description
-          "degree";
-      }
-      enum "shared-risk-group" {
-        value 4;
-        description
-          "shared-risk-group";
-      }
-      enum "connection" {
-        value 5;
-        description
-          "connection - this is used by roadm-connection and odu-connection
-           since they are mutually exclusive in the model";
-      }
-      enum "connection-map" {
-        value 6;
-        description
-          "connection-map";
-      }
-      enum "port" {
-        value 7;
-        description
-          "port";
-      }
-      enum "circuit-pack" {
-        value 8;
-        description
-          "circuit pack";
-      }
-      enum "internal-link" {
-        value 9;
-        description
-          "internal-link";
-      }
-      enum "physical-link" {
-        value 10;
-        description
-          "physical-link";
-      }
-      enum "interface" {
-        value 11;
-        description
-          "interface";
-      }
-      enum "shelf" {
-        value 12;
-        description
-          "shelf";
-      }
-      enum "service" {
-        value 13;
-        description
-          "service";
-      }
-      enum "odu-sncp-pg" {
-        value 14;
-        description
-          "odu-sncp-pg";
-      }
-      enum "line-amplifier" {
-        value 15;
-        description
-          "line-amplifier";
-      }
-      enum "xponder" {
-        value 16;
-        description
-          "xponder";
-      }
-      enum "versioned-service" {
-        value 17;
-        description
-          "versioned-service";
-      }
-      enum "temp-service" {
-        value 18;
-        description
-          "temp-service";
-      }
-    }
-  }
-
-  typedef resource-notification-type {
-    type enumeration {
-      enum "resourceCreation" {
-        value 1;
-        description
-          "A new instance of a resource has been created.";
-      }
-      enum "resourceModification" {
-        value 2;
-        description
-          "An existing instance of a resource has been modified. This shall be triggered by changes in configuration, state, status etc.
-           It shall not be triggered by changes in performance measurements, power and temperature readings or any other data that is highly volatile. ";
-      }
-      enum "resourceDeletion" {
-        value 3;
-        description
-          "An existing instance of a resource has been removed.";
-      }
-    }
-    description
-      "Type of notification about a resource";
-  }
-
-  grouping resource-type {
-    leaf type {
-      type resource-type-enum;
-      mandatory true;
-    }
-    leaf extension {
-      type string;
-      mandatory false;
-    }
-  }
-
-  grouping device-id {
-    description
-      "Device identifier. Unique within the Controller.";
-    leaf node-id {
-      type org-openroadm-common-node-types:node-id-type;
-      description
-        "Node Id is a globally unique identifier for a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping circuit-pack-name {
-    leaf circuit-pack-name {
-      type string;
-      mandatory true;
-      description
-        "Circuit-Pack identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping port-name {
-    uses circuit-pack-name;
-    leaf port-name {
-      type string;
-      description
-        "Port identifier. Unique within the context of a circuit-pack.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping physical-link-name {
-    leaf physical-link-name {
-      type string;
-      mandatory true;
-      description
-        "Physical Link identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping internal-link-name {
-    leaf internal-link-name {
-      type string;
-      mandatory true;
-      description
-        "Internal Link identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping connection-name {
-    leaf connection-name {
-      type string;
-      description
-        "Connection name. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping degree-number {
-    leaf degree-number {
-      type uint16;
-      description
-        "Degree identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping srg-number {
-    leaf srg-number {
-      type uint16;
-      description
-        "Shared Risk Group identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping shelf-name {
-    leaf shelf-name {
-      type string;
-      mandatory true;
-      description
-        "Shelf-id identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping service-name {
-    leaf service-name {
-      type string;
-      mandatory true;
-      description
-        "Service identifier. Unique within the context of a network.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping versioned-service-name {
-    leaf versioned-service-name {
-      type string;
-      mandatory true;
-      description
-        "Service identifier. Unique within the context of a network.
-         Same as leafref value in model, if applicable.";
-    }
-    leaf version-number {
-      type uint64;
-      mandatory true;
-      description
-        "version-number of the service";
-    }
-  }
-
-  grouping temp-service-name {
-    leaf common-id {
-      type string;
-      mandatory true;
-      description
-        "Service identifier. Unique within the context of a network.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping interface-name {
-    leaf interface-name {
-      type string;
-      mandatory true;
-      description
-        "Interface identifier.";
-    }
-  }
-
-  grouping other-resource-id {
-    leaf other-resource-id {
-      type string;
-      mandatory true;
-      description
-        "resource-id for other.";
-    }
-  }
-
-  grouping odu-sncp-pg-name {
-    leaf odu-sncp-pg-name {
-      type string;
-      mandatory true;
-      description
-        "name of the odu-snc-pg";
-    }
-  }
-
-  grouping amp-number {
-    leaf amp-number {
-      type uint8;
-      mandatory true;
-      description
-        "number of the line-amplifier";
-    }
-  }
-
-  grouping xpdr-number {
-    leaf xpdr-number {
-      type uint16;
-      mandatory true;
-      description
-        "number of the xponder";
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-resource-types@2019-11-29.yang b/ordmodels/common/src/main/yang/org-openroadm-resource-types@2019-11-29.yang
deleted file mode 100644 (file)
index 1a5bd66..0000000
+++ /dev/null
@@ -1,374 +0,0 @@
-module org-openroadm-resource-types {
-  namespace "http://org/openroadm/resource/types";
-  prefix org-openroadm-resource-types;
-
-  import org-openroadm-common-node-types {
-    prefix org-openroadm-common-node-types;
-    revision-date 2019-11-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common resource types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef resource-type-enum {
-    type enumeration {
-      enum other {
-        value 1;
-        description
-          "Resource of type not found in list.";
-      }
-      enum device {
-        value 2;
-        description
-          "device - ROAMD, Xponder, etc";
-      }
-      enum degree {
-        value 3;
-        description
-          "degree";
-      }
-      enum shared-risk-group {
-        value 4;
-        description
-          "shared-risk-group";
-      }
-      enum connection {
-        value 5;
-        description
-          "connection - this is used by roadm-connection and odu-connection
-           since they are mutually exclusive in the model";
-      }
-      enum connection-map {
-        value 6;
-        description
-          "connection-map";
-      }
-      enum port {
-        value 7;
-        description
-          "port";
-      }
-      enum circuit-pack {
-        value 8;
-        description
-          "circuit pack";
-      }
-      enum internal-link {
-        value 9;
-        description
-          "internal-link";
-      }
-      enum physical-link {
-        value 10;
-        description
-          "physical-link";
-      }
-      enum interface {
-        value 11;
-        description
-          "interface";
-      }
-      enum shelf {
-        value 12;
-        description
-          "shelf";
-      }
-      enum service {
-        value 13;
-        description
-          "service";
-      }
-      enum odu-sncp-pg {
-        value 14;
-        description
-          "odu-sncp-pg";
-      }
-      enum line-amplifier {
-        value 15;
-        description
-          "line-amplifier";
-      }
-      enum xponder {
-        value 16;
-        description
-          "xponder";
-      }
-      enum versioned-service {
-        value 17;
-        description
-          "versioned-service";
-      }
-      enum temp-service {
-        value 18;
-        description
-          "temp-service";
-      }
-    }
-  }
-
-  typedef resource-notification-type {
-    type enumeration {
-      enum resourceCreation {
-        value 1;
-        description
-          "A new instance of a resource has been created.";
-      }
-      enum resourceModification {
-        value 2;
-        description
-          "An existing instance of a resource has been modified. This shall be triggered by changes in configuration, state, status etc.
-           It shall not be triggered by changes in performance measurements, power and temperature readings or any other data that is highly volatile. ";
-      }
-      enum resourceDeletion {
-        value 3;
-        description
-          "An existing instance of a resource has been removed.";
-      }
-    }
-    description
-      "Type of notification about a resource";
-  }
-
-  grouping resource-type {
-    leaf type {
-      type resource-type-enum;
-      mandatory true;
-    }
-    leaf extension {
-      type string;
-      mandatory false;
-    }
-  }
-
-  grouping device-id {
-    description
-      "Device identifier. Unique within the Controller.";
-    leaf node-id {
-      type org-openroadm-common-node-types:node-id-type;
-      description
-        "Node Id is a globally unique identifier for a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping circuit-pack-name {
-    leaf circuit-pack-name {
-      type string;
-      mandatory true;
-      description
-        "Circuit-Pack identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping port-name {
-    uses circuit-pack-name;
-    leaf port-name {
-      type string;
-      description
-        "Port identifier. Unique within the context of a circuit-pack.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping physical-link-name {
-    leaf physical-link-name {
-      type string;
-      mandatory true;
-      description
-        "Physical Link identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping internal-link-name {
-    leaf internal-link-name {
-      type string;
-      mandatory true;
-      description
-        "Internal Link identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping connection-name {
-    leaf connection-name {
-      type string;
-      description
-        "Connection name. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping degree-number {
-    leaf degree-number {
-      type uint16;
-      description
-        "Degree identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping srg-number {
-    leaf srg-number {
-      type uint16;
-      description
-        "Shared Risk Group identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping shelf-name {
-    leaf shelf-name {
-      type string;
-      mandatory true;
-      description
-        "Shelf-id identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping service-name {
-    leaf service-name {
-      type string;
-      mandatory true;
-      description
-        "Service identifier. Unique within the context of a network.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping versioned-service-name {
-    leaf versioned-service-name {
-      type string;
-      mandatory true;
-      description
-        "Service identifier. Unique within the context of a network.
-         Same as leafref value in model, if applicable.";
-    }
-    leaf version-number {
-      type uint64;
-      mandatory true;
-      description
-        "version-number of the service";
-    }
-  }
-
-  grouping temp-service-name {
-    leaf common-id {
-      type string;
-      mandatory true;
-      description
-        "Service identifier. Unique within the context of a network.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping interface-name {
-    leaf interface-name {
-      type string;
-      mandatory true;
-      description
-        "Interface identifier.";
-    }
-  }
-
-  grouping other-resource-id {
-    leaf other-resource-id {
-      type string;
-      mandatory true;
-      description
-        "resource-id for other.";
-    }
-  }
-
-  grouping odu-sncp-pg-name {
-    leaf odu-sncp-pg-name {
-      type string;
-      mandatory true;
-      description
-        "name of the odu-snc-pg";
-    }
-  }
-
-  grouping amp-number {
-    leaf amp-number {
-      type uint8;
-      mandatory true;
-      description
-        "number of the line-amplifier";
-    }
-  }
-
-  grouping xpdr-number {
-    leaf xpdr-number {
-      type uint16;
-      mandatory true;
-      description
-        "number of the xponder";
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-resource-types@2021-09-24.yang b/ordmodels/common/src/main/yang/org-openroadm-resource-types@2021-09-24.yang
deleted file mode 100644 (file)
index 6af5d37..0000000
+++ /dev/null
@@ -1,396 +0,0 @@
-module org-openroadm-resource-types {
-  namespace "http://org/openroadm/resource/types";
-  prefix org-openroadm-resource-types;
-
-  import org-openroadm-common-node-types {
-    prefix org-openroadm-common-node-types;
-    revision-date 2021-05-28;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common resource types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2021-09-24 {
-    description
-      "Version 10.0";
-  }
-  revision 2021-05-28 {
-    description
-      "Version 9.1";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef resource-type-enum {
-    type enumeration {
-      enum other {
-        value 1;
-        description
-          "Resource of type not found in list.";
-      }
-      enum device {
-        value 2;
-        description
-          "device - ROAMD, Xponder, etc";
-      }
-      enum degree {
-        value 3;
-        description
-          "degree";
-      }
-      enum shared-risk-group {
-        value 4;
-        description
-          "shared-risk-group";
-      }
-      enum connection {
-        value 5;
-        description
-          "connection - this is used by roadm-connection and odu-connection
-           since they are mutually exclusive in the model";
-      }
-      enum connection-map {
-        value 6;
-        description
-          "connection-map";
-      }
-      enum port {
-        value 7;
-        description
-          "port";
-      }
-      enum circuit-pack {
-        value 8;
-        description
-          "circuit pack";
-      }
-      enum internal-link {
-        value 9;
-        description
-          "internal-link";
-      }
-      enum physical-link {
-        value 10;
-        description
-          "physical-link";
-      }
-      enum interface {
-        value 11;
-        description
-          "interface";
-      }
-      enum shelf {
-        value 12;
-        description
-          "shelf";
-      }
-      enum service {
-        value 13;
-        description
-          "service";
-      }
-      enum odu-sncp-pg {
-        value 14;
-        description
-          "odu-sncp-pg";
-      }
-      enum line-amplifier {
-        value 15;
-        description
-          "line-amplifier";
-      }
-      enum xponder {
-        value 16;
-        description
-          "xponder";
-      }
-      enum versioned-service {
-        value 17;
-        description
-          "versioned-service";
-      }
-      enum temp-service {
-        value 18;
-        description
-          "temp-service";
-      }
-      enum client-sncp-pg {
-        value 19;
-        description
-          "client-sncp-pg";
-      }
-    }
-  }
-
-  typedef resource-notification-type {
-    type enumeration {
-      enum resourceCreation {
-        value 1;
-        description
-          "A new instance of a resource has been created.";
-      }
-      enum resourceModification {
-        value 2;
-        description
-          "An existing instance of a resource has been modified. This shall be triggered by changes in configuration, state, status etc.
-           It shall not be triggered by changes in performance measurements, power and temperature readings or any other data that is highly volatile. ";
-      }
-      enum resourceDeletion {
-        value 3;
-        description
-          "An existing instance of a resource has been removed.";
-      }
-    }
-    description
-      "Type of notification about a resource";
-  }
-
-  grouping resource-type {
-    leaf type {
-      type resource-type-enum;
-      mandatory true;
-    }
-    leaf extension {
-      type string;
-      mandatory false;
-    }
-  }
-
-  grouping device-id {
-    description
-      "Device identifier. Unique within the Controller.";
-    leaf node-id {
-      type org-openroadm-common-node-types:node-id-type;
-      description
-        "Node Id is a globally unique identifier for a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping circuit-pack-name {
-    leaf circuit-pack-name {
-      type string;
-      mandatory true;
-      description
-        "Circuit-Pack identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping port-name {
-    uses circuit-pack-name;
-    leaf port-name {
-      type string;
-      description
-        "Port identifier. Unique within the context of a circuit-pack.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping physical-link-name {
-    leaf physical-link-name {
-      type string;
-      mandatory true;
-      description
-        "Physical Link identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping internal-link-name {
-    leaf internal-link-name {
-      type string;
-      mandatory true;
-      description
-        "Internal Link identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping connection-name {
-    leaf connection-name {
-      type string;
-      description
-        "Connection name. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping degree-number {
-    leaf degree-number {
-      type uint16;
-      description
-        "Degree identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping srg-number {
-    leaf srg-number {
-      type uint16;
-      description
-        "Shared Risk Group identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping shelf-name {
-    leaf shelf-name {
-      type string;
-      mandatory true;
-      description
-        "Shelf-id identifier. Unique within the context of a device.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping service-name {
-    leaf service-name {
-      type string;
-      mandatory true;
-      description
-        "Service identifier. Unique within the context of a network.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping versioned-service-name {
-    leaf versioned-service-name {
-      type string;
-      mandatory true;
-      description
-        "Service identifier. Unique within the context of a network.
-         Same as leafref value in model, if applicable.";
-    }
-    leaf version-number {
-      type uint64;
-      mandatory true;
-      description
-        "version-number of the service";
-    }
-  }
-
-  grouping temp-service-name {
-    leaf common-id {
-      type string;
-      mandatory true;
-      description
-        "Service identifier. Unique within the context of a network.
-         Same as leafref value in model, if applicable.";
-    }
-  }
-
-  grouping interface-name {
-    leaf interface-name {
-      type string;
-      mandatory true;
-      description
-        "Interface identifier.";
-    }
-  }
-
-  grouping other-resource-id {
-    leaf other-resource-id {
-      type string;
-      mandatory true;
-      description
-        "resource-id for other.";
-    }
-  }
-
-  grouping odu-sncp-pg-name {
-    leaf odu-sncp-pg-name {
-      type string;
-      mandatory true;
-      description
-        "name of the odu-snc-pg";
-    }
-  }
-
-  grouping client-sncp-pg-name {
-    leaf client-sncp-pg-name {
-      type string;
-      mandatory true;
-      description
-        "name of the client-snc-pg";
-    }
-  }
-
-  grouping amp-number {
-    leaf amp-number {
-      type uint8;
-      mandatory true;
-      description
-        "number of the line-amplifier";
-    }
-  }
-
-  grouping xpdr-number {
-    leaf xpdr-number {
-      type uint16;
-      mandatory true;
-      description
-        "number of the xponder";
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-resource@2016-10-14.yang b/ordmodels/common/src/main/yang/org-openroadm-resource@2016-10-14.yang
deleted file mode 100644 (file)
index 6e409e8..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-module org-openroadm-resource {
-  namespace "http://org/openroadm/resource";
-  prefix org-openroadm-resource;
-
-  import org-openroadm-resource-types {
-    prefix org-openroadm-resource-types;
-    revision-date 2016-10-14;
-  }
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of resources.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      AT&T Intellectual Property.  All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping resource {
-    description
-      "This resource identifier is intended to provide a generic identifer
-       for any resource that can be used without specific knowledge of
-       the resource.";
-    container device {
-      description
-        "Device of the resource, used only when the system using this
-         model report on more than one device. ";
-      uses org-openroadm-resource-types:device-id;
-    }
-    container resource {
-      choice resource {
-        case circuit-pack {
-          uses org-openroadm-resource-types:circuit-pack-name;
-        }
-        case port {
-          container port {
-            uses org-openroadm-resource-types:port-name;
-          }
-        }
-        case connection {
-          uses org-openroadm-resource-types:connection-number {
-            refine connection-number {
-              mandatory true;
-            }
-          }
-        }
-        case physical-link {
-          uses org-openroadm-resource-types:physical-link-name;
-        }
-        case internal-link {
-          uses org-openroadm-resource-types:internal-link-name;
-        }
-        case shelf {
-          uses org-openroadm-resource-types:shelf-name;
-        }
-        case srg {
-          uses org-openroadm-resource-types:srg-number {
-            refine srg-number {
-              mandatory true;
-            }
-          }
-        }
-        case degree {
-          uses org-openroadm-resource-types:degree-number {
-            refine degree-number {
-              mandatory true;
-            }
-          }
-        }
-        case service {
-          uses org-openroadm-resource-types:service-name;
-        }
-        case interface {
-          uses org-openroadm-resource-types:interface-name;
-        }
-      }
-    }
-    container resourceType {
-      uses org-openroadm-resource-types:resource-type;
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-resource@2018-10-19.yang b/ordmodels/common/src/main/yang/org-openroadm-resource@2018-10-19.yang
deleted file mode 100644 (file)
index 7baff87..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-module org-openroadm-resource {
-  namespace "http://org/openroadm/resource";
-  prefix org-openroadm-resource;
-
-  import org-openroadm-resource-types {
-    prefix org-openroadm-resource-types;
-    revision-date 2018-10-19;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of resources.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      AT&T Intellectual Property.  All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping resource {
-    description
-      "This resource identifier is intended to provide a generic identifer
-       for any resource that can be used without specific knowledge of
-       the resource.";
-    container device {
-      description
-        "Device of the resource, used only when the system using this
-         model report on more than one device. ";
-      uses org-openroadm-resource-types:device-id;
-    }
-    container resource {
-      choice resource {
-        case circuit-pack {
-          uses org-openroadm-resource-types:circuit-pack-name;
-        }
-        case port {
-          container port {
-            uses org-openroadm-resource-types:port-name;
-          }
-        }
-        case connection {
-          uses org-openroadm-resource-types:connection-name {
-            refine "connection-name" {
-              mandatory true;
-            }
-          }
-        }
-        case physical-link {
-          uses org-openroadm-resource-types:physical-link-name;
-        }
-        case internal-link {
-          uses org-openroadm-resource-types:internal-link-name;
-        }
-        case shelf {
-          uses org-openroadm-resource-types:shelf-name;
-        }
-        case srg {
-          uses org-openroadm-resource-types:srg-number {
-            refine "srg-number" {
-              mandatory true;
-            }
-          }
-        }
-        case degree {
-          uses org-openroadm-resource-types:degree-number {
-            refine "degree-number" {
-              mandatory true;
-            }
-          }
-        }
-        case service {
-          uses org-openroadm-resource-types:service-name;
-        }
-        case interface {
-          uses org-openroadm-resource-types:interface-name;
-        }
-        case odu-sncp-pg {
-          uses org-openroadm-resource-types:odu-sncp-pg-name;
-        }
-        case other {
-          uses org-openroadm-resource-types:other-resource-id;
-        }
-        case device {
-          uses org-openroadm-resource-types:device-id {
-            refine "node-id" {
-              mandatory true;
-            }
-          }
-        }
-        case line-amplifier {
-          uses org-openroadm-resource-types:amp-number;
-        }
-        case xponder {
-          uses org-openroadm-resource-types:xpdr-number;
-        }
-        case versioned-service {
-          uses org-openroadm-resource-types:versioned-service-name;
-        }
-        case temp-service {
-          uses org-openroadm-resource-types:temp-service-name;
-        }
-      }
-    }
-    container resourceType {
-      uses org-openroadm-resource-types:resource-type;
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-resource@2019-05-31.yang b/ordmodels/common/src/main/yang/org-openroadm-resource@2019-05-31.yang
deleted file mode 100644 (file)
index 9bbac77..0000000
+++ /dev/null
@@ -1,350 +0,0 @@
-module org-openroadm-resource {
-  namespace "http://org/openroadm/resource";
-  prefix org-openroadm-resource;
-
-  import org-openroadm-interfaces {
-    prefix org-openroadm-interfaces;
-    revision-date 2019-05-31;
-  }
-  import org-openroadm-otn-common-types {
-    prefix org-openroadm-otn-common-types;
-    revision-date 2018-11-30;
-  }
-  import org-openroadm-common-optical-channel-types {
-    prefix org-openroadm-common-optical-channel-types;
-    revision-date 2019-03-29;
-  }
-  import org-openroadm-resource-types {
-    prefix org-openroadm-resource-types;
-    revision-date 2018-11-30;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of resources.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping eth-attributes {
-    leaf speed {
-      type uint32;
-      description
-        "Set speed of the interface, unit mbps.
-         This is for ETH facility. ";
-    }
-  }
-
-  grouping mc-ttp-attributes {
-    description
-      "Media channel termination point. Models bandwidth allocation in physical media. Network media channels may be provisioned in the spectrum characterized by the frequency limits.";
-    leaf min-freq {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      config true;
-      description
-        "Minimum Frequency in THz. Granularity is hardware dependent, based on pixel resolution. eg. ITU 12.5GHz frequency slots. Range covers C+L";
-    }
-    leaf max-freq {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      config true;
-      description
-        "Maximum Frequency in THz. Granularity is hardware dependent, based on pixel resolution. eg. ITU 12.5GHz frequency slots. Range covers C+L";
-    }
-  }
-
-  grouping nmc-ctp-attributes {
-    description
-      "Network Media Channel attributes";
-    leaf frequency {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      config true;
-      description
-        "Center Frequency in THz.  This is not constrained by mc-capabilities.  It must fit (when combined with width) inside any containing media channel.";
-    }
-    leaf width {
-      type org-openroadm-common-optical-channel-types:frequency-GHz;
-      config true;
-      description
-        "Frequency width in GHz.  This is not constrained by mc-capabilities.  It must fit (when combined with frequency) inside any containing media channel.";
-    }
-  }
-
-  grouping och-attributes {
-    description
-      "Optical Channel attributes";
-    leaf rate {
-      type identityref {
-        base org-openroadm-common-optical-channel-types:och-rate-identity;
-      }
-      description
-        "rate";
-    }
-    leaf frequency {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      description
-        "Center Frequency in THz.";
-    }
-    leaf width {
-      type org-openroadm-common-optical-channel-types:frequency-GHz;
-      config false;
-      description
-        "Frequency width in GHz.";
-    }
-    leaf modulation-format {
-      type org-openroadm-common-optical-channel-types:modulation-format;
-      description
-        "Modulation format";
-    }
-  }
-
-  grouping odu-attributes {
-    description
-      "ODU attributes";
-    leaf rate {
-      type identityref {
-        base org-openroadm-otn-common-types:odu-rate-identity;
-      }
-      description
-        "rate identity of the ODU. 'identityref' is used
-         to allow to extend for future higher rates";
-    }
-    container parent-odu-allocation {
-      description
-        "parent odu allocation";
-      leaf trib-port-number {
-        type uint16 {
-          range "1 .. 80";
-        }
-        description
-          "Assigned tributary port number in parent OPU";
-      }
-      leaf-list trib-slots {
-        type uint16 {
-          range "1 .. 80";
-        }
-        min-elements 1;
-        max-elements "80";
-        description
-          "Assigned trib slots occupied in parent OPU MSI";
-      }
-    }
-  }
-
-  grouping otu-attributes {
-    description
-      "OTU attributes";
-    leaf rate {
-      type identityref {
-        base org-openroadm-otn-common-types:otu-rate-identity;
-      }
-      description
-        "rate identity of the OTU. 'identityref' is used
-         to allow to extend for future higher rates";
-    }
-  }
-
-  grouping resource-reporting {
-    leaf type {
-      type identityref {
-        base org-openroadm-interfaces:interface-type;
-      }
-      mandatory true;
-      description
-        "The type of the interface.";
-    }
-    container ethernet {
-      when "../type = 'ethernetCsmacd'";
-      description
-        "Ethernet Interfaces";
-      uses eth-attributes;
-    }
-    container mc-ttp {
-      when "../type = 'mediaChannelTrailTerminationPoint'";
-      description
-        "Media Channel Trail Termination Point (MC-TTP)";
-      uses mc-ttp-attributes;
-    }
-    container nmc-ctp {
-      when "../type = 'networkMediaChannelConnectionTerminationPoint'";
-      description
-        "Network Media Channel Connection Termination Point (NMC-CTP)";
-      uses nmc-ctp-attributes;
-    }
-    container och {
-      when "../type = 'opticalChannel'";
-      description
-        "Optical Channel (OCh):
-         Models the optical channel interfaces for an Optical White Box.";
-      uses och-attributes;
-    }
-    container odu {
-      when "../type = 'otnOdu'";
-      presence "Attribute Nodes for Optical Data Unit (ODU)";
-      description
-        "Optical Channel Data Unit (ODU)";
-      uses odu-attributes;
-    }
-    container otu {
-      when "../type = 'otnOtu'";
-      description
-        "Optical Channel Transport Unit (OTU)";
-      uses otu-attributes;
-    }
-  }
-
-  grouping resource {
-    description
-      "This resource identifier is intended to provide a generic identifier
-       for any resource that can be used without specific knowledge of
-       the resource.";
-    container device {
-      description
-        "Device of the resource, used only when the system using this
-         model report on more than one device. ";
-      uses org-openroadm-resource-types:device-id;
-    }
-    container resource {
-      choice resource {
-        case circuit-pack {
-          uses org-openroadm-resource-types:circuit-pack-name;
-        }
-        case port {
-          container port {
-            uses org-openroadm-resource-types:port-name;
-          }
-        }
-        case connection {
-          uses org-openroadm-resource-types:connection-name {
-            refine "connection-name" {
-              mandatory true;
-            }
-          }
-        }
-        case physical-link {
-          uses org-openroadm-resource-types:physical-link-name;
-        }
-        case internal-link {
-          uses org-openroadm-resource-types:internal-link-name;
-        }
-        case shelf {
-          uses org-openroadm-resource-types:shelf-name;
-        }
-        case srg {
-          uses org-openroadm-resource-types:srg-number {
-            refine "srg-number" {
-              mandatory true;
-            }
-          }
-        }
-        case degree {
-          uses org-openroadm-resource-types:degree-number {
-            refine "degree-number" {
-              mandatory true;
-            }
-          }
-        }
-        case service {
-          uses org-openroadm-resource-types:service-name;
-        }
-        case interface {
-          uses org-openroadm-resource-types:interface-name;
-        }
-        case odu-sncp-pg {
-          uses org-openroadm-resource-types:odu-sncp-pg-name;
-        }
-        case other {
-          uses org-openroadm-resource-types:other-resource-id;
-        }
-        case device {
-          uses org-openroadm-resource-types:device-id {
-            refine "node-id" {
-              mandatory true;
-            }
-          }
-        }
-        case line-amplifier {
-          uses org-openroadm-resource-types:amp-number;
-        }
-        case xponder {
-          uses org-openroadm-resource-types:xpdr-number;
-        }
-        case versioned-service {
-          uses org-openroadm-resource-types:versioned-service-name;
-        }
-        case temp-service {
-          uses org-openroadm-resource-types:temp-service-name;
-        }
-      }
-    }
-    container resourceType {
-      uses org-openroadm-resource-types:resource-type;
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-resource@2020-05-29.yang b/ordmodels/common/src/main/yang/org-openroadm-resource@2020-05-29.yang
deleted file mode 100644 (file)
index d8c2b42..0000000
+++ /dev/null
@@ -1,366 +0,0 @@
-module org-openroadm-resource {
-  namespace "http://org/openroadm/resource";
-  prefix org-openroadm-resource;
-
-  import org-openroadm-interfaces {
-    prefix org-openroadm-interfaces;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-otn-common-types {
-    prefix org-openroadm-otn-common-types;
-    revision-date 2020-03-27;
-  }
-  import org-openroadm-common-optical-channel-types {
-    prefix org-openroadm-common-optical-channel-types;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-resource-types {
-    prefix org-openroadm-resource-types;
-    revision-date 2019-11-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of resources.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping eth-attributes {
-    leaf speed {
-      type uint32;
-      description
-        "Set speed of the interface, unit mbps.
-         This is for ETH facility. ";
-    }
-  }
-
-  grouping mc-ttp-attributes {
-    description
-      "Media channel termination point. Models bandwidth allocation in physical media. Network media channels may be provisioned in the spectrum characterized by the frequency limits.";
-    leaf min-freq {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      config true;
-      description
-        "Minimum Frequency in THz. Granularity is hardware dependent, based on pixel resolution. eg. ITU 12.5GHz frequency slots. Range covers C+L";
-    }
-    leaf max-freq {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      config true;
-      description
-        "Maximum Frequency in THz. Granularity is hardware dependent, based on pixel resolution. eg. ITU 12.5GHz frequency slots. Range covers C+L";
-    }
-  }
-
-  grouping nmc-ctp-attributes {
-    description
-      "Network Media Channel attributes";
-    leaf frequency {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      config true;
-      description
-        "Center Frequency in THz.  This is not constrained by mc-capabilities.  It must fit (when combined with width) inside any containing media channel.";
-    }
-    leaf width {
-      type org-openroadm-common-optical-channel-types:frequency-GHz;
-      config true;
-      description
-        "Frequency width in GHz.  This is not constrained by mc-capabilities.  It must fit (when combined with frequency) inside any containing media channel.";
-    }
-  }
-
-  grouping och-attributes {
-    description
-      "Optical Channel attributes";
-    leaf rate {
-      type identityref {
-        base org-openroadm-common-optical-channel-types:och-rate-identity;
-      }
-      description
-        "rate";
-    }
-    leaf frequency {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      description
-        "Center Frequency in THz.";
-    }
-    leaf width {
-      type org-openroadm-common-optical-channel-types:frequency-GHz;
-      config false;
-      description
-        "Frequency width in GHz.";
-    }
-    leaf modulation-format {
-      type org-openroadm-common-optical-channel-types:modulation-format;
-      description
-        "Modulation format";
-    }
-  }
-
-  grouping odu-attributes {
-    description
-      "ODU attributes";
-    leaf rate {
-      type identityref {
-        base org-openroadm-otn-common-types:odu-rate-identity;
-      }
-      description
-        "rate identity of the ODU. 'identityref' is used
-         to allow to extend for future higher rates";
-    }
-    container parent-odu-allocation {
-      description
-        "parent odu allocation";
-      leaf trib-port-number {
-        type uint16 {
-          range "1 .. 80";
-        }
-        description
-          "Assigned tributary port number in parent OPU";
-      }
-      leaf-list trib-slots {
-        type uint16 {
-          range "1 .. 80";
-        }
-        min-elements 1;
-        max-elements 80;
-        description
-          "Assigned trib slots occupied in parent OPU MSI";
-      }
-    }
-  }
-
-  grouping otu-attributes {
-    description
-      "OTU attributes";
-    leaf rate {
-      type identityref {
-        base org-openroadm-otn-common-types:otu-rate-identity;
-      }
-      description
-        "rate identity of the OTU. 'identityref' is used
-         to allow to extend for future higher rates";
-    }
-  }
-
-  grouping resource-reporting {
-    leaf type {
-      type identityref {
-        base org-openroadm-interfaces:interface-type;
-      }
-      mandatory true;
-      description
-        "The type of the interface.";
-    }
-    container ethernet {
-      when "../type = 'ethernetCsmacd'";
-      description
-        "Ethernet Interfaces";
-      uses eth-attributes;
-    }
-    container mc-ttp {
-      when "../type = 'mediaChannelTrailTerminationPoint'";
-      description
-        "Media Channel Trail Termination Point (MC-TTP)";
-      uses mc-ttp-attributes;
-    }
-    container nmc-ctp {
-      when "../type = 'networkMediaChannelConnectionTerminationPoint'";
-      description
-        "Network Media Channel Connection Termination Point (NMC-CTP)";
-      uses nmc-ctp-attributes;
-    }
-    container och {
-      when "../type = 'opticalChannel'";
-      description
-        "Optical Channel (OCh):
-         Models the optical channel interfaces for an Optical White Box.";
-      uses och-attributes;
-    }
-    container odu {
-      when "../type = 'otnOdu'";
-      presence "Attribute Nodes for Optical Data Unit (ODU)";
-      description
-        "Optical Channel Data Unit (ODU)";
-      uses odu-attributes;
-    }
-    container otu {
-      when "../type = 'otnOtu'";
-      description
-        "Optical Channel Transport Unit (OTU)";
-      uses otu-attributes;
-    }
-  }
-
-  grouping resource {
-    description
-      "This resource identifier is intended to provide a generic identifier
-       for any resource that can be used without specific knowledge of
-       the resource.";
-    container device {
-      description
-        "Device of the resource, used only when the system using this
-         model report on more than one device. ";
-      uses org-openroadm-resource-types:device-id;
-    }
-    container resource {
-      choice resource {
-        case circuit-pack {
-          uses org-openroadm-resource-types:circuit-pack-name;
-        }
-        case port {
-          container port {
-            uses org-openroadm-resource-types:port-name;
-          }
-        }
-        case connection {
-          uses org-openroadm-resource-types:connection-name {
-            refine "connection-name" {
-              mandatory true;
-            }
-          }
-        }
-        case physical-link {
-          uses org-openroadm-resource-types:physical-link-name;
-        }
-        case internal-link {
-          uses org-openroadm-resource-types:internal-link-name;
-        }
-        case shelf {
-          uses org-openroadm-resource-types:shelf-name;
-        }
-        case srg {
-          uses org-openroadm-resource-types:srg-number {
-            refine "srg-number" {
-              mandatory true;
-            }
-          }
-        }
-        case degree {
-          uses org-openroadm-resource-types:degree-number {
-            refine "degree-number" {
-              mandatory true;
-            }
-          }
-        }
-        case service {
-          uses org-openroadm-resource-types:service-name;
-        }
-        case interface {
-          uses org-openroadm-resource-types:interface-name;
-        }
-        case odu-sncp-pg {
-          uses org-openroadm-resource-types:odu-sncp-pg-name;
-        }
-        case other {
-          uses org-openroadm-resource-types:other-resource-id;
-        }
-        case device {
-          uses org-openroadm-resource-types:device-id {
-            refine "node-id" {
-              mandatory true;
-            }
-          }
-        }
-        case line-amplifier {
-          uses org-openroadm-resource-types:amp-number;
-        }
-        case xponder {
-          uses org-openroadm-resource-types:xpdr-number;
-        }
-        case versioned-service {
-          uses org-openroadm-resource-types:versioned-service-name;
-        }
-        case temp-service {
-          uses org-openroadm-resource-types:temp-service-name;
-        }
-      }
-    }
-    container resourceType {
-      uses org-openroadm-resource-types:resource-type;
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-resource@2021-12-10.yang b/ordmodels/common/src/main/yang/org-openroadm-resource@2021-12-10.yang
deleted file mode 100644 (file)
index 173f4b4..0000000
+++ /dev/null
@@ -1,551 +0,0 @@
-module org-openroadm-resource {
-  namespace "http://org/openroadm/resource";
-  prefix org-openroadm-resource;
-
-  import org-openroadm-interfaces {
-    prefix org-openroadm-interfaces;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-otn-common-types {
-    prefix org-openroadm-otn-common-types;
-    revision-date 2021-09-24;
-  }
-  import org-openroadm-common-optical-channel-types {
-    prefix org-openroadm-common-optical-channel-types;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-resource-types {
-    prefix org-openroadm-resource-types;
-    revision-date 2021-09-24;
-  }
-  import org-openroadm-common-link-types {
-    prefix org-openroadm-common-link-types;
-    revision-date 2019-11-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of resources.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2021-12-10 {
-    description
-      "Version 10.1";
-  }
-  revision 2021-09-24 {
-    description
-      "Version 10.0";
-  }
-  revision 2021-05-28 {
-    description
-      "Version 9.1";
-  }
-  revision 2021-03-26 {
-    description
-      "Version 9.0";
-  }
-  revision 2020-09-25 {
-    description
-      "Version 8.0";
-  }
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping eth-attributes {
-    leaf speed {
-      type uint32;
-      description
-        "Set speed of the interface, unit mbps.
-         This is for ETH facility. ";
-    }
-  }
-
-  grouping mc-ttp-attributes {
-    description
-      "Media channel termination point. Models bandwidth allocation in physical media. Network media channels may be provisioned in the spectrum characterized by the frequency limits.";
-    leaf min-freq {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      config true;
-      description
-        "Minimum Frequency in THz. Granularity is hardware dependent, based on pixel resolution. eg. ITU 12.5GHz frequency slots. Range covers C+L";
-    }
-    leaf max-freq {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      config true;
-      description
-        "Maximum Frequency in THz. Granularity is hardware dependent, based on pixel resolution. eg. ITU 12.5GHz frequency slots. Range covers C+L";
-    }
-  }
-
-  grouping nmc-ctp-attributes {
-    description
-      "Network Media Channel attributes";
-    leaf frequency {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      config true;
-      description
-        "Center Frequency in THz.  This is not constrained by mc-capabilities.  It must fit (when combined with width) inside any containing media channel.";
-    }
-    leaf width {
-      type org-openroadm-common-optical-channel-types:frequency-GHz;
-      config true;
-      description
-        "Frequency width in GHz.  This is not constrained by mc-capabilities.  It must fit (when combined with frequency) inside any containing media channel.";
-    }
-  }
-
-  grouping common-och-otsi-attributes {
-    description
-      "Optical Channel and otsi common attributes";
-    leaf frequency {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      description
-        "Center Frequency in THz.";
-    }
-    leaf width {
-      type org-openroadm-common-optical-channel-types:frequency-GHz;
-      description
-        "Frequency width in GHz.";
-    }
-    leaf optical-operational-mode {
-      type string;
-      description
-        "The path was calculated according to the supported operational modes.
-         Selected mode can be either a specific or an openROADM operational-mode";
-    }
-  }
-  
-  grouping path-computation-outputs {
-       description
-         "Parameters resulting of path computation";
-    leaf rx-estimated-osnr {
-      type org-openroadm-common-link-types:ratio-dB;
-      description
-        "estimated OSNR for the path";
-    }
-    leaf rx-estimated-gsnr {
-      type org-openroadm-common-link-types:ratio-dB;
-      description
-        "estimated Generalized SNR (including non linear impairments) for the path";
-    }
-    leaf max-output-power {
-      type org-openroadm-common-link-types:ratio-dB;
-      description
-        "maximum output-power";
-    }
-    leaf min-output-power {
-      type org-openroadm-common-link-types:ratio-dB;
-      description
-        "minimum output-power";
-    }
-  }
-
-  grouping och-attributes {
-    description
-      "Optical Channel attributes";
-    leaf rate {
-      type identityref {
-        base org-openroadm-common-optical-channel-types:och-rate-identity;
-      }
-      description
-        "rate";
-    }
-    leaf modulation-format {
-      type org-openroadm-common-optical-channel-types:modulation-format;
-      description
-        "Modulation format";
-    }
-    uses common-och-otsi-attributes;
-  }
-
-  grouping odu-attributes {
-    description
-      "ODU attributes";
-    leaf rate {
-      type identityref {
-        base org-openroadm-otn-common-types:odu-rate-identity;
-      }
-      description
-        "rate identity of the ODU. 'identityref' is used
-         to allow to extend for future higher rates";
-    }
-    leaf oducn-n-rate {
-      when "../rate = 'org-openroadm-otn-common-types:ODUCn'";
-      type uint16;
-      description
-        "ODUCn rate";
-    }
-    leaf oduflex-cbr-service {
-      type identityref {
-        base org-openroadm-otn-common-types:ODUflex-cbr-identity;
-      }
-      description
-        "ODUflex for CBR client signals (G.709)";
-    }
-    leaf oduflex-gfp-num-ts {
-      type uint16;
-      description
-        "For ODUflex GFP-F mapped client signals (G.709), the number of
-         tributary slot as per G.709 Table 7-8";
-    }
-    leaf oduflex-gfp-ts-bandwidth {
-      type uint16;
-      description
-        "The tributary slot minimum bit rates in the approximated value [Mbps]
-         given ODUflex (GFP) 100 ppm (G.709 Table 7-8) :
-           1249 Mbps [1 249 052.312 277 kbps] (n = 1 to 8) (ODU2.ts)
-           1254 Mbps [1 254 344.906 9646 kbps] (n = 9 to 32) ODU3.ts)
-           1301 Mbps [1 301 336.986 2867 kbps] (n = 33 to 80) (ODU4.ts)";
-    }
-    leaf oduflex-imp-s {
-      type uint16;
-      description
-        "For ODUflex IMP (Idle insertion Mapping Procedure) mapped client signals,
-         s = 2, 8, n x 5 with N >= 1 (G.709 12.2.6 & Table 7-3)";
-    }
-    leaf oduflex-flexe-n {
-      type uint16;
-      description
-        "For ODUflex for FlexE-aware client signals, n in the range of 1 to 20*254
-         (G.709 17.12)";
-    }
-    container parent-odu-allocation {
-      description
-        "parent odu allocation";
-      leaf trib-port-number {
-        type uint16 {
-          range "1 .. 80";
-        }
-        description
-          "Assigned tributary port number in parent OPU";
-      }
-      choice trib-slots-choice {
-        description
-          "trib slot selection";
-        case opu {
-          leaf-list trib-slots {
-            type uint16 {
-              range "1 .. 80";
-            }
-            min-elements 1;
-            max-elements 80;
-            description
-              "Assigned trib slots occupied in parent OPU MSI";
-          }
-        }
-        case opucn {
-          leaf-list opucn-trib-slots {
-            type org-openroadm-otn-common-types:opucn-trib-slot-def;
-            description
-              "Specify the list of OPUCn 5G tributary slots in the form of
-               TS #A.B (G.709 Figure 20-9) in the case of provisioning the low
-                order ODUk to the parent server ODUCn";
-          }
-        }
-      }
-    }
-  }
-
-  grouping otu-attributes {
-    description
-      "OTU attributes";
-    leaf rate {
-      type identityref {
-        base org-openroadm-otn-common-types:otu-rate-identity;
-      }
-      description
-        "rate identity of the OTU. 'identityref' is used
-         to allow to extend for future higher rates";
-    }
-    leaf otu4-member-id {
-      when "../rate = 'org-openroadm-otn-common-types:OTU4'";
-      type uint16;
-      description
-        "To uniquely identify each member of an OTSi group and the order of each member in the group.
-         Similar to FlexO PHY-ID in the FlexO Group (PID in G.709.1/3)";
-    }
-    leaf otucn-n-rate {
-      when "../rate = 'org-openroadm-otn-common-types:OTUCn'";
-      type uint16;
-      description
-        "Specify the N associated with OTUCn, e.g. N = 2,3,4 for 200G/300G/400G respectively";
-    }
-    leaf otucn-M-subrate {
-      when "../rate = 'org-openroadm-otn-common-types:OTUCn'";
-      type uint16;
-      description
-        "OTUCn subrate (OTUCn-M), value of M specifies the number of active
-         5 Gbit/s OPUCn tributary slots (G.709 Annex H)";
-    }
-  }
-
-  grouping otsi-attributes {
-    description
-      "Optical Channel attributes";
-    leaf otsi-rate {
-      type identityref {
-        base org-openroadm-common-optical-channel-types:otsi-rate-identity;
-      }
-      description
-        "OTSi rate";
-    }
-    leaf modulation-format {
-      type org-openroadm-common-optical-channel-types:modulation-format;
-      description
-        "Modulation format";
-    }
-    uses common-och-otsi-attributes;
-  }
-
-  grouping otsi-group-attributes {
-    description
-      "Optical Channel attributes";
-    leaf group-rate {
-      type identityref {
-        base org-openroadm-common-optical-channel-types:otsi-rate-identity;
-      }
-      description
-        "Supported group rate";
-    }
-    leaf group-id {
-      type uint32;
-      description
-        "Mandatory for FlexO B100G.  Not required for Non-FlexO B100G.";
-    }
-  }
-
-  grouping resource-reporting {
-    leaf type {
-      type identityref {
-        base org-openroadm-interfaces:interface-type;
-      }
-      mandatory true;
-      description
-        "The type of the interface.";
-    }
-    container ethernet {
-      when "../type = 'ethernetCsmacd'";
-      description
-        "Ethernet Interfaces";
-      uses eth-attributes;
-    }
-    container mc-ttp {
-      when "../type = 'mediaChannelTrailTerminationPoint'";
-      description
-        "Media Channel Trail Termination Point (MC-TTP)";
-      uses mc-ttp-attributes;
-    }
-    container nmc-ctp {
-      when "../type = 'networkMediaChannelConnectionTerminationPoint'";
-      description
-        "Network Media Channel Connection Termination Point (NMC-CTP)";
-      uses nmc-ctp-attributes;
-    }
-    container och {
-      when "../type = 'opticalChannel'";
-      description
-        "Optical Channel (OCh):
-         Models the optical channel interfaces for an Optical White Box.";
-      uses och-attributes;
-    }
-    container odu {
-      when "../type = 'otnOdu'";
-      presence "Attribute Nodes for Optical Data Unit (ODU)";
-      description
-        "Optical Channel Data Unit (ODU)";
-      uses odu-attributes;
-    }
-    container otu {
-      when "../type = 'otnOtu'";
-      description
-        "Optical Channel Transport Unit (OTU)";
-      uses otu-attributes;
-    }
-    container otsi {
-      when "../type = 'otsi'";
-      description
-        "OTSI";
-      uses otsi-attributes;
-    }
-    container otsi-group {
-      when "../type = 'otsi-group'";
-      description
-        "OTSI-Group";
-      uses otsi-group-attributes;
-    }
-  }
-
-  grouping resource {
-    description
-      "This resource identifier is intended to provide a generic identifier
-       for any resource that can be used without specific knowledge of
-       the resource.";
-    container device {
-      description
-        "Device of the resource, used only when the system using this
-         model report on more than one device. ";
-      uses org-openroadm-resource-types:device-id;
-    }
-    container resource {
-      choice resource {
-        case circuit-pack {
-          uses org-openroadm-resource-types:circuit-pack-name;
-        }
-        case port {
-          container port {
-            uses org-openroadm-resource-types:port-name;
-          }
-        }
-        case connection {
-          uses org-openroadm-resource-types:connection-name {
-            refine "connection-name" {
-              mandatory true;
-            }
-          }
-        }
-        case physical-link {
-          uses org-openroadm-resource-types:physical-link-name;
-        }
-        case internal-link {
-          uses org-openroadm-resource-types:internal-link-name;
-        }
-        case shelf {
-          uses org-openroadm-resource-types:shelf-name;
-        }
-        case srg {
-          uses org-openroadm-resource-types:srg-number {
-            refine "srg-number" {
-              mandatory true;
-            }
-          }
-        }
-        case degree {
-          uses org-openroadm-resource-types:degree-number {
-            refine "degree-number" {
-              mandatory true;
-            }
-          }
-        }
-        case service {
-          uses org-openroadm-resource-types:service-name;
-        }
-        case interface {
-          uses org-openroadm-resource-types:interface-name;
-        }
-        case odu-sncp-pg {
-          uses org-openroadm-resource-types:odu-sncp-pg-name;
-        }
-        case client-sncp-pg {
-          uses org-openroadm-resource-types:client-sncp-pg-name;
-        }
-        case other {
-          uses org-openroadm-resource-types:other-resource-id;
-        }
-        case device {
-          uses org-openroadm-resource-types:device-id {
-            refine "node-id" {
-              mandatory true;
-            }
-          }
-        }
-        case line-amplifier {
-          uses org-openroadm-resource-types:amp-number;
-        }
-        case xponder {
-          uses org-openroadm-resource-types:xpdr-number;
-        }
-        case versioned-service {
-          uses org-openroadm-resource-types:versioned-service-name;
-        }
-        case temp-service {
-          uses org-openroadm-resource-types:temp-service-name;
-        }
-      }
-    }
-    container resourceType {
-      uses org-openroadm-resource-types:resource-type;
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-service-format@2019-05-31.yang b/ordmodels/common/src/main/yang/org-openroadm-service-format@2019-05-31.yang
deleted file mode 100644 (file)
index 32bff7d..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-module org-openroadm-service-format {
-  namespace "http://org/openroadm/service-format";
-  prefix org-openroadm-service-format;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of service format.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-
-  typedef service-format {
-    type enumeration {
-      enum "Ethernet" {
-        value 1;
-      }
-      enum "OTU" {
-        value 2;
-      }
-      enum "OC" {
-        value 3;
-      }
-      enum "STM" {
-        value 4;
-      }
-      enum "OMS" {
-        value 5;
-      }
-      enum "ODU" {
-        value 6;
-      }
-      enum "OTM" {
-        value 7;
-      }
-      enum "other" {
-        value 8;
-        description
-          "Used in bookending use case when service-format is not standardized by the Open ROADM MSA.
-           When set to other, the specific service format/rate is specified by other-service-format-and-rate";
-      }
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-service-format@2019-11-29.yang b/ordmodels/common/src/main/yang/org-openroadm-service-format@2019-11-29.yang
deleted file mode 100644 (file)
index a2dedcb..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-module org-openroadm-service-format {
-  namespace "http://org/openroadm/service-format";
-  prefix org-openroadm-service-format;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of service format.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-
-  typedef service-format {
-    type enumeration {
-      enum Ethernet {
-        value 1;
-      }
-      enum OTU {
-        value 2;
-      }
-      enum OC {
-        value 3;
-      }
-      enum STM {
-        value 4;
-      }
-      enum OMS {
-        value 5;
-      }
-      enum ODU {
-        value 6;
-      }
-      enum OTM {
-        value 7;
-      }
-      enum other {
-        value 8;
-        description
-          "Used in bookending use case when service-format is not standardized by the Open ROADM MSA.
-           When set to other, the specific service format/rate is specified by other-service-format-and-rate";
-      }
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-switching-pool-types@2017-12-15.yang b/ordmodels/common/src/main/yang/org-openroadm-switching-pool-types@2017-12-15.yang
deleted file mode 100644 (file)
index 10cff01..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-module org-openroadm-switching-pool-types {
-  namespace "http://org/openroadm/switching-pool-types";
-  prefix org-openroadm-switching-pool-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      AT&T Intellectual Property.  All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-
-  typedef switching-pool-types {
-    type enumeration {
-      enum "non-blocking" {
-        value 1;
-        description
-          "Single non-blocking element";
-      }
-      enum "blocking" {
-        value 2;
-        description
-          "Multiple connected non-blocking lists";
-      }
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-switching-pool-types@2018-11-30.yang b/ordmodels/common/src/main/yang/org-openroadm-switching-pool-types@2018-11-30.yang
deleted file mode 100644 (file)
index 0817cee..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-module org-openroadm-switching-pool-types {
-  namespace "http://org/openroadm/switching-pool-types";
-  prefix org-openroadm-switching-pool-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-
-  typedef switching-pool-types {
-    type enumeration {
-      enum "non-blocking" {
-        value 1;
-        description
-          "Single non-blocking element";
-      }
-      enum "blocking" {
-        value 2;
-        description
-          "Multiple connected non-blocking lists";
-      }
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-switching-pool-types@2019-11-29.yang b/ordmodels/common/src/main/yang/org-openroadm-switching-pool-types@2019-11-29.yang
deleted file mode 100644 (file)
index a698a3f..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-module org-openroadm-switching-pool-types {
-  namespace "http://org/openroadm/switching-pool-types";
-  prefix org-openroadm-switching-pool-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-
-  typedef switching-pool-types {
-    type enumeration {
-      enum non-blocking {
-        value 1;
-        description
-          "Single non-blocking element";
-      }
-      enum blocking {
-        value 2;
-        description
-          "Multiple connected non-blocking lists";
-      }
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-tca@2016-10-14.yang b/ordmodels/common/src/main/yang/org-openroadm-tca@2016-10-14.yang
deleted file mode 100644 (file)
index 791c349..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-module org-openroadm-tca {
-  namespace "http://org/openroadm/tca";
-  prefix org-openroadm-tca;
-
-  import ietf-yang-types {
-    prefix yang;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2016-10-14;
-  }
-  import org-openroadm-pm-types {
-    prefix org-openroadm-pm-types;
-  }
-  import org-openroadm-resource {
-    prefix org-openroadm-resource;
-  }
-  import org-openroadm-layerRate {
-    prefix org-openroadm-layerRate;
-  }
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of Threshold Crossing Alert types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      AT&T Intellectual Property.  All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping tca {
-    leaf id {
-      type string;
-      mandatory true;
-    }
-    container resource {
-      uses org-openroadm-resource:resource;
-    }
-    leaf granularity {
-      type org-openroadm-pm-types:pm-granularity;
-    }
-    leaf raiseTime {
-      type yang:date-and-time;
-      mandatory true;
-      config false;
-    }
-    container layerRate {
-      uses org-openroadm-layerRate:layer-rate;
-    }
-    leaf severity {
-      mandatory true;
-      type org-openroadm-common-types:severity;
-      description
-        "Severity of alarm. Based on X.733 perceived severity.";
-    }
-    leaf thresholdType {
-      mandatory false;
-      type enumeration {
-        enum "high" {
-          value 1;
-        }
-        enum "low" {
-          value 2;
-        }
-      }
-      description
-        "Threshold Crossed";
-    }
-    container thresholdMeasurement {
-      uses org-openroadm-pm-types:pm-measurement;
-    }
-  }
-
-  grouping potential-tca {
-    leaf lowThresholdValue {
-      mandatory false;
-      type uint64;
-    }
-    leaf highThresholdValue {
-      mandatory false;
-      type uint64;
-    }
-    uses tca;
-  }
-
-  container potential-tca-list {
-    list tca {
-      key "id";
-      uses potential-tca;
-    }
-  }
-  notification tca-notification {
-    uses tca;
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-tca@2018-10-19.yang b/ordmodels/common/src/main/yang/org-openroadm-tca@2018-10-19.yang
deleted file mode 100644 (file)
index 969a666..0000000
+++ /dev/null
@@ -1,156 +0,0 @@
-module org-openroadm-tca {
-  namespace "http://org/openroadm/tca";
-  prefix org-openroadm-tca;
-
-  import ietf-yang-types {
-    prefix yang;
-    revision-date 2013-07-15;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-pm-types {
-    prefix org-openroadm-pm-types;
-    revision-date 2017-12-15;
-  }
-  import org-openroadm-resource {
-    prefix org-openroadm-resource;
-    revision-date 2018-10-19;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of Threshold Crossing Alert types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      AT&T Intellectual Property.  All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-08-28 {
-    description
-      "Version 2.0.2 - added back the missing pmParameterName container";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping tca {
-    leaf id {
-      type string;
-      mandatory true;
-    }
-    container resource {
-      uses org-openroadm-resource:resource;
-    }
-    container pmParameterName {
-      uses org-openroadm-pm-types:pm-names;
-    }
-    leaf granularity {
-      type org-openroadm-pm-types:pm-granularity;
-      mandatory true;
-    }
-    leaf location {
-      type org-openroadm-common-types:location;
-      mandatory true;
-    }
-    leaf direction {
-      type org-openroadm-common-types:direction;
-      mandatory true;
-    }
-  }
-
-  grouping potential-tca {
-    uses tca;
-    leaf lowThresholdValue {
-      type org-openroadm-pm-types:pm-data-type;
-    }
-    leaf highThresholdValue {
-      type org-openroadm-pm-types:pm-data-type;
-    }
-  }
-
-  notification tca-notification {
-    uses tca;
-    leaf thresholdValue {
-      type org-openroadm-pm-types:pm-data-type;
-      mandatory true;
-    }
-    leaf thresholdType {
-      type enumeration {
-        enum "high" {
-          value 1;
-        }
-        enum "low" {
-          value 2;
-        }
-      }
-      mandatory true;
-      description
-        "Threshold Crossed";
-    }
-    leaf pmParameterValue {
-      type org-openroadm-pm-types:pm-data-type;
-      mandatory true;
-    }
-    leaf raiseTime {
-      type yang:date-and-time;
-      mandatory true;
-    }
-  }
-  container potential-tca-list {
-    description
-      "This is the set of threshold crossing alerts monitored on the device. Alerts are
-       enabled/disabled by adding/deleting the high/low threshold values from the list.";
-    list tca {
-      key "id";
-      uses potential-tca;
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-tca@2020-03-27.yang b/ordmodels/common/src/main/yang/org-openroadm-tca@2020-03-27.yang
deleted file mode 100644 (file)
index 9e6c853..0000000
+++ /dev/null
@@ -1,284 +0,0 @@
-module org-openroadm-tca {
-  namespace "http://org/openroadm/tca";
-  prefix org-openroadm-tca;
-
-  import ietf-yang-types {
-    prefix yang;
-    revision-date 2013-07-15;
-  }
-  import org-openroadm-common-alarm-pm-types {
-    prefix org-openroadm-common-alarm-pm-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-pm-types {
-    prefix org-openroadm-pm-types;
-    revision-date 2020-03-27;
-  }
-  import org-openroadm-resource-types {
-    prefix org-openroadm-resource-types;
-    revision-date 2019-11-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of Threshold Crossing Alert types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-08-28 {
-    description
-      "Version 2.0.2 - added back the missing pmParameterName container";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef threshold-enum {
-    type enumeration {
-      enum high {
-        value 1;
-        description
-          "enum value for high";
-      }
-      enum low {
-        value 2;
-        description
-          "enum value for low";
-      }
-    }
-    description
-      "typedef for threshold enum";
-  }
-
-  grouping tca-resource-grp {
-    description
-      "group for TCA resources";
-    leaf tca-resource-instance {
-      type instance-identifier;
-      mandatory true;
-      description
-        "Retrieves all TCA assciated with the resource instance";
-    }
-    leaf tca-resource-type {
-      type org-openroadm-resource-types:resource-type-enum;
-      mandatory true;
-      description
-        "The supported tca-resource type associated with the given resource instance.";
-    }
-    leaf tca-resource-type-extension {
-      type string;
-      mandatory true;
-      description
-        "The resource type extension when the type is not defined in the resource-type-enum.";
-    }
-  }
-
-  grouping current-tca-group {
-    description
-      "TCA Data with current values";
-    uses tca-resource-grp;
-    leaf enabled {
-      type boolean;
-      mandatory true;
-      description
-        "Enable for the TCA entry";
-    }
-    list pm-entry {
-      key "type extension location direction";
-      description
-        "List of PM entries";
-      uses current-tca-pm-val-group;
-    }
-  }
-
-  grouping current-tca-pm-val-group {
-    description
-      "Grouping for the TCA PM";
-    uses org-openroadm-pm-types:pm-names;
-    leaf location {
-      type org-openroadm-common-alarm-pm-types:location;
-      description
-        "Location PM type";
-    }
-    leaf direction {
-      type org-openroadm-common-alarm-pm-types:direction;
-      description
-        "Direction PM type";
-    }
-    list measurement {
-      key "granularity threshold-type";
-      description
-        "List for PM measurement";
-      leaf granularity {
-        type org-openroadm-pm-types:pm-granularity;
-        description
-          "Granularity for the PM entry";
-      }
-      leaf threshold-type {
-        type threshold-enum;
-        description
-          "Threshold enum type";
-      }
-      leaf enabled {
-        type boolean;
-        description
-          "Measurement enabled";
-      }
-      leaf threshold-value {
-        type org-openroadm-pm-types:pm-data-type;
-        mandatory true;
-        description
-          "Threshold value";
-      }
-      leaf threshold-default {
-        type org-openroadm-pm-types:pm-data-type;
-        config false;
-        description
-          "Threshold default value";
-      }
-    }
-  }
-
-  notification tca-notification {
-    description
-      "TCA notification";
-    uses tca-resource-grp;
-    leaf pm-type {
-      type org-openroadm-pm-types:pm-names-enum;
-      mandatory true;
-      description
-        "PM type";
-    }
-    leaf pm-extension {
-      type string;
-      mandatory true;
-      description
-        "PM extension";
-    }
-    leaf pm-location {
-      type org-openroadm-common-alarm-pm-types:location;
-      mandatory true;
-      description
-        "PM location";
-    }
-    leaf pm-direction {
-      type org-openroadm-common-alarm-pm-types:direction;
-      mandatory true;
-      description
-        "PM direction";
-    }
-    leaf pm-granularity {
-      type org-openroadm-pm-types:pm-granularity;
-      mandatory true;
-      description
-        "PM granularity";
-    }
-    leaf threshold-value {
-      type org-openroadm-pm-types:pm-data-type;
-      mandatory true;
-      description
-        "threshold value";
-    }
-    leaf threshold-type {
-      type threshold-enum;
-      mandatory true;
-      description
-        "Threshold Crossed";
-    }
-    leaf pm-value {
-      type org-openroadm-pm-types:pm-data-type;
-      mandatory true;
-      description
-        "PM Value";
-    }
-    leaf raise-time {
-      type yang:date-and-time;
-      mandatory true;
-      description
-        "PM raise time";
-    }
-  }
-
-  container potential-tca-list {
-    description
-      "List of current TCAs.";
-    list tca-entry {
-      key "tca-resource-type tca-resource-type-extension tca-resource-instance";
-      description
-        "List of current TCA entries";
-      uses current-tca-group;
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-user-mgmt@2016-10-14.yang b/ordmodels/common/src/main/yang/org-openroadm-user-mgmt@2016-10-14.yang
deleted file mode 100644 (file)
index fb5fa6d..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-module org-openroadm-user-mgmt {
-  namespace "http://org/openroadm/user-mgmt";
-  prefix org-openroadm-user-mgmt;
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of user managements.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      AT&T Intellectual Property.  All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping user-profile {
-    list user {
-      key "name";
-      description
-        "The list of local users configured on this device.";
-      leaf name {
-        type string;
-        description
-          "The user name string identifying this entry.";
-      }
-      leaf password {
-        type string;
-        description
-          "The password for this entry. This shouldn't be in clear text";
-      }
-      leaf group {
-        type enumeration {
-          enum "sudo";
-        }
-        description
-          "The group to which the user is associated to.";
-      }
-    }
-  }
-
-  rpc chg-password {
-    input {
-      leaf currentPassword {
-        type string;
-        description
-          "provide the current password";
-        mandatory true;
-      }
-      leaf newPassword {
-        type string;
-        description
-          "provide a new password";
-        mandatory true;
-      }
-      leaf newPasswordConfirm {
-        type string;
-        description
-          "re-enter the new password ";
-        mandatory true;
-      }
-    }
-    output {
-      leaf status {
-        type enumeration {
-          enum "Successful" {
-            value 1;
-          }
-          enum "Failed" {
-            value 2;
-          }
-        }
-        mandatory true;
-        description
-          "Successful or Failed";
-      }
-      leaf status-message {
-        type string;
-        description
-          "Gives a more detailed reason for success / failure";
-      }
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-user-mgmt@2017-12-15.yang b/ordmodels/common/src/main/yang/org-openroadm-user-mgmt@2017-12-15.yang
deleted file mode 100644 (file)
index cf55c1b..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-module org-openroadm-user-mgmt {
-  namespace "http://org/openroadm/user-mgmt";
-  prefix org-openroadm-user-mgmt;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of user managements.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      AT&T Intellectual Property.  All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef username-type {
-    type string {
-      length "3..32";
-      pattern "[a-z][a-z0-9]{2,31}" {
-        error-message
-          "A username must begin with a lowercase letter, The remainder
-           of the string may contain lowercase letters, or numbers 0 through 9.";
-      }
-    }
-    description
-      "The user name string identifying this entry.";
-  }
-
-  typedef password-type {
-    type string {
-      length "8..128";
-      pattern "[a-zA-Z0-9!$%\\^()\\[\\]_\\-~{}.+]*" {
-        error-message "Password content does not meet the requirements";
-      }
-    }
-    description
-      "The password for this entry. This shouldn't be in clear text
-       The Password must contain at least 2 characters from
-       each of the following groups:
-       a) Lower case alphabetic (a-z)
-       b) Upper case alphabetic (A-Z)
-       c) Numeric 0-9
-       d) Special characters Allowed !$%^()[]_-~{}.+
-       Password must not contain Username.";
-  }
-
-  grouping user-profile {
-    list user {
-      key "name";
-      description
-        "The list of local users configured on this device.";
-      leaf name {
-        type username-type;
-        description
-          "The user name string identifying this entry.";
-      }
-      leaf password {
-        type password-type;
-        description
-          "The password for this entry.";
-      }
-      leaf group {
-        type enumeration {
-          enum "sudo";
-        }
-        description
-          "The group to which the user is associated to.";
-      }
-    }
-  }
-
-  rpc chg-password {
-    input {
-      leaf currentPassword {
-        type password-type;
-        mandatory true;
-        description
-          "provide the current password";
-      }
-      leaf newPassword {
-        type password-type;
-        mandatory true;
-        description
-          "provide a new password";
-      }
-      leaf newPasswordConfirm {
-        type password-type;
-        mandatory true;
-        description
-          "re-enter the new password ";
-      }
-    }
-    output {
-      leaf status {
-        type enumeration {
-          enum "Successful" {
-            value 1;
-          }
-          enum "Failed" {
-            value 2;
-          }
-        }
-        mandatory true;
-        description
-          "Successful or Failed";
-      }
-      leaf status-message {
-        type string;
-        description
-          "Gives a more detailed reason for success / failure";
-      }
-    }
-  }
-}
diff --git a/ordmodels/common/src/main/yang/org-openroadm-user-mgmt@2019-11-29.yang b/ordmodels/common/src/main/yang/org-openroadm-user-mgmt@2019-11-29.yang
deleted file mode 100644 (file)
index 846250f..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-module org-openroadm-user-mgmt {
-  namespace "http://org/openroadm/user-mgmt";
-  prefix org-openroadm-user-mgmt;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of user managements.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef username-type {
-    type string {
-      length "3..32";
-      pattern '[a-z][a-z0-9]{2,31}' {
-        error-message
-          "A username must begin with a lowercase letter, The remainder
-           of the string may contain lowercase letters, or numbers 0 through 9.";
-      }
-    }
-    description
-      "The user name string identifying this entry.";
-  }
-
-  typedef password-type {
-    type string {
-      length "8..128";
-      pattern '[a-zA-Z0-9!$%\^()\[\]_\-~{}.+]*' {
-        error-message "Password content does not meet the requirements";
-      }
-    }
-    description
-      "The password for this entry. This shouldn't be in clear text
-       The Password must contain at least 2 characters from
-       each of the following groups:
-       a) Lower case alphabetic (a-z)
-       b) Upper case alphabetic (A-Z)
-       c) Numeric 0-9
-       d) Special characters Allowed !$%^()[]_-~{}.+
-       Password must not contain Username.";
-  }
-
-  grouping user-profile {
-    list user {
-      key "name";
-      description
-        "The list of local users configured on this device.";
-      leaf name {
-        type username-type;
-        description
-          "The user name string identifying this entry.";
-      }
-      leaf password {
-        type password-type;
-        description
-          "The password for this entry.";
-      }
-      leaf group {
-        type enumeration {
-          enum sudo;
-        }
-        description
-          "The group to which the user is associated to.";
-      }
-    }
-  }
-
-  rpc chg-password {
-    input {
-      leaf currentPassword {
-        type password-type;
-        mandatory true;
-        description
-          "provide the current password";
-      }
-      leaf newPassword {
-        type password-type;
-        mandatory true;
-        description
-          "provide a new password";
-      }
-      leaf newPasswordConfirm {
-        type password-type;
-        mandatory true;
-        description
-          "re-enter the new password ";
-      }
-    }
-    output {
-      leaf status {
-        type enumeration {
-          enum Successful {
-            value 1;
-          }
-          enum Failed {
-            value 2;
-          }
-        }
-        mandatory true;
-        description
-          "Successful or Failed";
-      }
-      leaf status-message {
-        type string;
-        description
-          "Gives a more detailed reason for success / failure";
-      }
-    }
-  }
-}
diff --git a/ordmodels/device/pom.xml b/ordmodels/device/pom.xml
deleted file mode 100644 (file)
index f18a969..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Copyright © 2016 Orange and others. All rights reserved.
-
-This program and the accompanying materials are made available under the
-terms of the Eclipse Public License v1.0 which accompanies this distribution,
-and is available at http://www.eclipse.org/legal/epl-v10.html
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.opendaylight.mdsal</groupId>
-    <artifactId>binding-parent</artifactId>
-    <version>8.0.11</version>
-    <relativePath/>
-  </parent>
-
-  <groupId>org.opendaylight.transportpce.ordmodels</groupId>
-  <artifactId>transportpce-ordmodels-device</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
-  <packaging>bundle</packaging>
-
-  <dependencyManagement>
-    <dependencies>
-      <dependency>
-        <groupId>org.opendaylight.netconf</groupId>
-        <artifactId>netconf-artifacts</artifactId>
-        <version>2.0.14</version>
-        <scope>import</scope>
-        <type>pom</type>
-      </dependency>
-    </dependencies>
-  </dependencyManagement>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.opendaylight.transportpce.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>concepts</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>yang-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
-      <artifactId>rfc6991-ietf-inet-types</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
-      <artifactId>rfc6991-ietf-yang-types</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.netconf</groupId>
-      <artifactId>ietf-netconf</artifactId>
-    </dependency>
-  </dependencies>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.felix</groupId>
-        <artifactId>maven-bundle-plugin</artifactId>
-        <extensions>true</extensions>
-        <configuration>
-          <instructions>
-            <Include-Resource>{maven-resources},target/classes/LICENSE,META-INF/git.properties=-target/classes/META-INF/git.properties</Include-Resource>
-            <_exportcontents>
-              org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.internal.link,
-              org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.internal.links,*
-            </_exportcontents>
-          </instructions>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-javadoc-plugin</artifactId>
-        <configuration>
-          <sourcepath>*/target/generated-sources/mdsal-binding/*</sourcepath>
-          <excludePackageNames>*</excludePackageNames>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-</project>
diff --git a/ordmodels/device/src/main/resources/NOTICE b/ordmodels/device/src/main/resources/NOTICE
deleted file mode 100644 (file)
index 4c95811..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-This work includes YANG models developed by the OpenConfig working group
-and originally published under the Apache License Version 2.
-A copy of the original license can be found in the file openconfig.LICENSE
-
-More details at the http://www.openconfig.net/ web site.
-
-OpenConfig models license is usually not mentioned in their YANG description
-field. Exceptions include models derived from the IETF works and originally
-published under the IETF license.
diff --git a/ordmodels/device/src/main/resources/openconfig.LICENSE b/ordmodels/device/src/main/resources/openconfig.LICENSE
deleted file mode 100644 (file)
index 8f71f43..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "{}"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright {yyyy} {name of copyright owner}
-
-   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.
-
diff --git a/ordmodels/device/src/main/yang/iana-afn-safi@2013-07-04.yang b/ordmodels/device/src/main/yang/iana-afn-safi@2013-07-04.yang
deleted file mode 100644 (file)
index c076260..0000000
+++ /dev/null
@@ -1,526 +0,0 @@
-module iana-afn-safi {
-  namespace "urn:ietf:params:xml:ns:yang:iana-afn-safi";
-  prefix "ianaaf";
-
-  organization
-    "IANA";
-  contact
-    "        Internet Assigned Numbers Authority
-
-     Postal: ICANN
-             4676 Admiralty Way, Suite 330
-             Marina del Rey, CA 90292
-
-     Tel:    +1 310 823 9358
-     E-Mail: iana&iana.org";
-  description
-    "This YANG module provides two typedefs containing YANG
-     definitions for the following IANA-registered enumerations:
-
-     - Address Family Numbers (AFN)
-
-     - Subsequent Address Family Identifiers (SAFI)
-
-     The latest revision of this YANG module can be obtained from the
-     IANA web site.
-
-     Copyright (c) 2012 IETF Trust and the persons identified as
-     authors of the code. All rights reserved.
-
-     Redistribution and use in source and binary forms, with or
-     without modification, is permitted pursuant to, and subject to
-     the license terms contained in, the Simplified BSD License set
-     forth in Section 4.c of the IETF Trust's Legal Provisions
-     Relating to IETF Documents
-     (http://trustee.ietf.org/license-info).
-
-     This version of this YANG module is part of RFC XXXX; see the
-     RFC itself for full legal notices.";
-  // RFC Ed.: replace XXXX with actual RFC number and remove this
-  // note.
-
-  // RFC Ed.: update the date below with the date of RFC publication
-  // and remove this note.
-  revision 2013-07-04 {
-    description
-      "Initial revision.";
-    reference
-      "RFC XXXX: IANA Address Family Numbers and
-                 Subsequent Address Family Identifiers YANG Module";
-  }
-
-  typedef address-family {
-    type enumeration {
-      // value 0 is reserved by IANA
-      enum ipV4 {
-        value "1";
-        description
-          "IP version 4";
-      }
-      enum ipV6 {
-        value "2";
-        description
-          "IP version 6";
-      }
-      enum nsap {
-        value "3";
-        description
-          "NSAP";
-      }
-      enum hdlc {
-        value "4";
-        description
-          "HDLC (8-bit multidrop)";
-      }
-      enum bbn1822 {
-        value "5";
-        description
-          "BBN 1822";
-      }
-      enum all802 {
-        value "6";
-        description
-          "802 (includes all 802 media plus Ethernet 'canonical
-           format')";
-      }
-      enum e163 {
-        value "7";
-        description
-          "E.163";
-      }
-      enum e164 {
-        value "8";
-        description
-          "E.164 (SMDS, FrameRelay, ATM)";
-      }
-      enum f69 {
-        value "9";
-        description
-          "F.69 (Telex)";
-      }
-      enum x121 {
-        value "10";
-        description
-          "X.121 (X.25, Frame Relay)";
-      }
-      enum ipx {
-        value "11";
-        description
-          "IPX (Internetwork Packet Exchange)";
-      }
-      enum appletalk {
-        value "12";
-        description
-          "Appletalk";
-      }
-      enum decnetIV {
-        value "13";
-        description
-          "DECnet IV";
-      }
-      enum banyanVines {
-        value "14";
-        description
-          "Banyan Vines";
-      }
-      enum e164withNsap {
-        value "15";
-        description
-          "E.164 with NSAP format subaddress";
-        reference
-          "ATM Forum UNI 3.1";
-      }
-      enum dns {
-        value "16";
-        description
-          "DNS (Domain Name System)";
-      }
-      enum distinguishedName {
-        value "17";
-        description
-          "Distinguished Name (per X.500)";
-      }
-      enum asNumber {
-        value "18";
-        description
-          "Autonomous System Number";
-      }
-      enum xtpOverIpv4 {
-        value "19";
-        description
-          "XTP over IP version 4";
-      }
-      enum xtpOverIpv6 {
-        value "20";
-        description
-          "XTP over IP version 6";
-      }
-      enum xtpNativeModeXTP {
-        value "21";
-        description
-          "XTP native mode XTP";
-      }
-      enum fibreChannelWWPN {
-        value "22";
-        description
-          "Fibre Channel World-Wide Port Name";
-      }
-      enum fibreChannelWWNN {
-        value "23";
-        description
-          "Fibre Channel World-Wide Node Name";
-      }
-      enum gwid {
-        value "24";
-        description
-          "Gateway Identifier";
-      }
-      // FIXME: This one is actually called "afi" in the MIB, but
-      // that must be a mistake.
-      enum l2vpn {
-        value "25";
-        description
-          "AFI for L2VPN information";
-        reference
-          "RFC 4761: Virtual Private LAN Service (VPLS): Using BGP
-           for Auto-Discovery and Signaling
-
-           RFC 6074: Provisioning, Auto-Discovery, and Signaling in
-           Layer 2 Virtual Private Networks (L2VPNs)";
-      }
-      enum mplsTpSectionEndpointIdentifier {
-        value "26";
-        description
-          "MPLS-TP Section Endpoint Identifier";
-        reference
-          "draft-ietf-mpls-gach-adv";
-      }
-      enum mplsTpLspEndpointIdentifier {
-        value "27";
-        description
-          "MPLS-TP LSP Endpoint Identifier";
-        reference
-          "draft-ietf-mpls-gach-adv";
-      }
-      enum mplsTpPseudowireEndpointIdentifier {
-        value "28";
-        description
-          "MPLS-TP Pseudowire Endpoint Identifier";
-        reference
-          "draft-ietf-mpls-gach-adv";
-      }
-      enum eigrpCommonServiceFamily {
-        value "16384";
-        description
-          "EIGRP Common Service Family";
-      }
-      enum eigrpIpv4ServiceFamily {
-        value "16385";
-        description
-          "EIGRP IPv4 Service Family";
-      }
-      enum eigrpIpv6ServiceFamily {
-        value "16386";
-        description
-          "EIGRP IPv6 Service Family";
-      }
-      enum lispCanonicalAddressFormat {
-        value "16387";
-        description
-          "LISP Canonical Address Format (LCAF)";
-      }
-      enum bgpLs {
-        value "16388";
-        description
-          "BGP-LS";
-        reference
-          "draft-ietf-idr-ls-distribution";
-      }
-      enum 48BitMac {
-        value "16389";
-        description
-          "48-bit MAC";
-        reference
-          "draft-eastlake-rfc5342bis";
-      }
-      enum 64BitMac {
-        value "16390";
-        description
-          "64-bit MAC";
-        reference
-          "draft-eastlake-rfc5342bis";
-      }
-      // value 65535 is reserved by IANA
-    }
-    description
-      "This typedef is a YANG enumeration of IANA-registered address
-       family numbers (AFN).";
-    reference
-      "IANA Address Family Numbers registry.
-       <http://www.iana.org/assignments/address-family-numbers>";
-  }
-
-  typedef subsequent-address-family {
-    type enumeration {
-      // value 0 is reserved by IANA
-      enum nlriUnicast {
-        value "1";
-        description
-          "Network Layer Reachability Information used for unicast
-           forwarding";
-        reference
-          "RFC 4760: Multiprotocol Extensions for BGP-4";
-      }
-      enum nlriMulticast {
-        value "2";
-        description
-          "Network Layer Reachability Information used for multicast
-           forwarding";
-        reference
-          "RFC 4760: Multiprotocol Extensions for BGP-4";
-      }
-      // value 3 is reserved by IANA
-      enum nlriMpls {
-        value "4";
-        description
-          "Network Layer Reachability Information (NLRI) with MPLS
-           Labels";
-        reference
-          "RFC 3107: Carrying Label Information in BGP-4";
-      }
-      enum mcastVpn {
-        value "5";
-        description
-          "MCAST-VPN";
-        reference
-          "RFC 6514: BGP Encodings and Procedures for Multicast in
-           MPLS/BGP IP VPNs";
-      }
-      enum nlriDynamicMsPw {
-        value "6";
-        status "obsolete";
-        description
-          "Network Layer Reachability Information used for Dynamic
-           Placement of Multi-Segment Pseudowires (TEMPORARY -
-           Expires 2008-08-23)";
-        reference
-          "draft-ietf-pwe3-dynamic-ms-pw: Dynamic Placement of Multi
-           Segment Pseudowires";
-      }
-      enum encapsulation {
-        value "7";
-        description
-          "Encapsulation SAFI";
-        reference
-          "RFC 5512: The BGP Encapsulation Subsequent Address Family
-           Identifier (SAFI) and the BGP Tunnel Encapsulation
-           Attribute";
-      }
-      enum tunnel {
-        value "64";
-        status "obsolete";
-        description
-          "Tunnel SAFI";
-        reference
-          "draft-nalawade-kapoor-tunnel-safi: BGP Tunnel SAFI";
-      }
-      enum vpls {
-        value "65";
-        description
-          "Virtual Private LAN Service (VPLS)";
-        reference
-          "RFC 4761: Virtual Private LAN Service (VPLS): Using BGP
-           for Auto-Discovery and Signaling
-
-           RFC 6074: Provisioning, Auto-Discovery, and Signaling in
-           Layer 2 Virtual Private Networks (L2VPNs)";
-      }
-      enum bgpMdt {
-        value "66";
-        description
-          "BGP MDT SAFI";
-        reference
-          "RFC 6037: Cisco Systems' Solution for Multicast in
-           BGP/MPLS IP VPNs";
-      }
-      enum bgp4over6 {
-        value "67";
-        description
-          "BGP 4over6 SAFI";
-        reference
-          "RFC 5747: 4over6 Transit Solution Using IP Encapsulation
-           and MP-BGP Extensions";
-      }
-      enum bgp6over4 {
-        value "68";
-        description
-          "BGP 6over4 SAFI";
-      }
-      enum l1VpnAutoDiscovery {
-        value "69";
-        description
-          "Layer-1 VPN auto-discovery information";
-        reference
-          "RFC 5195: BGP-Based Auto-Discovery for Layer-1 VPNs";
-      }
-      enum mplsVpn {
-        value "128";
-        description
-          "MPLS-labeled VPN address";
-        reference
-          "RFC 4364: BGP/MPLS IP Virtual Private Networks (VPNs)";
-      }
-      enum multicastBgpMplsVpn {
-        value "129";
-        description
-          "Multicast for BGP/MPLS IP Virtual Private Networks
-           (VPNs)";
-        reference
-          "RFC 6513: Multicast in MPLS/BGP IP VPNs
-
-           RFC 6514: BGP Encodings and Procedures for Multicast in
-           MPLS/BGP IP VPNs";
-      }
-      // values 130-131 are reserved by IANA
-      enum routeTargetConstraints {
-        value "132";
-        description
-          "Route Target constraints";
-        reference
-          "RFC 4684: Constrained Route Distribution for Border
-           Gateway Protocol/MultiProtocol Label Switching (BGP/MPLS)
-           Internet Protocol (IP) Virtual Private Networks (VPNs)";
-      }
-      enum ipv4DissFlow {
-        value "133";
-        description
-          "IPv4 dissemination of flow specification rules";
-        reference
-          "RFC 5575: Dissemination of Flow Specification Rules";
-      }
-      enum vpnv4DissFlow {
-        value "134";
-        description
-          "VPNv4 dissemination of flow specification rules";
-        reference
-          "RFC 5575: Dissemination of Flow Specification Rules";
-      }
-      // values 135-139 are reserved by IANA
-      enum vpnAutoDiscovery {
-        value "140";
-        status "obsolete";
-        description
-          "VPN auto-discovery";
-        reference
-          "draft-ietf-l3vpn-bgpvpn-auto: Using BGP as an
-           Auto-Discovery Mechanism for VR-based Layer-3 VPNs";
-      }
-      // values 141-240 are reserved by IANA
-      enum private241 {
-        value "241";
-        description
-          "Reserved for Private Use";
-        reference
-          "RFC 4760: Multiprotocol Extensions for BGP-4";
-      }
-      enum private242 {
-        value "242";
-        description
-          "Reserved for Private Use";
-        reference
-          "RFC 4760: Multiprotocol Extensions for BGP-4";
-      }
-      enum private243 {
-        value "243";
-        description
-          "Reserved for Private Use";
-        reference
-          "RFC 4760: Multiprotocol Extensions for BGP-4";
-      }
-      enum private244 {
-        value "244";
-        description
-          "Reserved for Private Use";
-        reference
-          "RFC 4760: Multiprotocol Extensions for BGP-4";
-      }
-      enum private245 {
-        value "245";
-        description
-          "Reserved for Private Use";
-        reference
-          "RFC 4760: Multiprotocol Extensions for BGP-4";
-      }
-      enum private246 {
-        value "246";
-        description
-          "Reserved for Private Use";
-        reference
-          "RFC 4760: Multiprotocol Extensions for BGP-4";
-      }
-      enum private247 {
-        value "247";
-        description
-          "Reserved for Private Use";
-        reference
-          "RFC 4760: Multiprotocol Extensions for BGP-4";
-      }
-      enum private248 {
-        value "248";
-        description
-          "Reserved for Private Use";
-        reference
-          "RFC 4760: Multiprotocol Extensions for BGP-4";
-      }
-      enum private249 {
-        value "249";
-        description
-          "Reserved for Private Use";
-        reference
-          "RFC 4760: Multiprotocol Extensions for BGP-4";
-      }
-      enum private250 {
-        value "250";
-        description
-          "Reserved for Private Use";
-        reference
-          "RFC 4760: Multiprotocol Extensions for BGP-4";
-      }
-      enum private251 {
-        value "251";
-        description
-          "Reserved for Private Use";
-        reference
-          "RFC 4760: Multiprotocol Extensions for BGP-4";
-      }
-      enum private252 {
-        value "252";
-        description
-          "Reserved for Private Use";
-        reference
-          "RFC 4760: Multiprotocol Extensions for BGP-4";
-      }
-      enum private253 {
-        value "253";
-        description
-          "Reserved for Private Use";
-        reference
-          "RFC 4760: Multiprotocol Extensions for BGP-4";
-      }
-      enum private254 {
-        value "254";
-        description
-          "Reserved for Private Use";
-        reference
-          "RFC 4760: Multiprotocol Extensions for BGP-4";
-      }
-      // value 255 is reserved by IANA
-    }
-    description
-      "This typedef is a YANG enumeration of IANA-registered
-       subsequent address family identifiers (SAFI).";
-    reference
-      "IANA SAFI Values registry.
-       <http://www.iana.org/assignments/safi-namespace>";
-  }
-}
diff --git a/ordmodels/device/src/main/yang/openconfig-extensions@2017-04-11.yang b/ordmodels/device/src/main/yang/openconfig-extensions@2017-04-11.yang
deleted file mode 100644 (file)
index fb1b11f..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-module openconfig-extensions {
-  yang-version 1;
-  namespace "http://openconfig.net/yang/openconfig-ext";
-  prefix oc-ext;
-
-  organization
-    "OpenConfig working group";
-  contact
-    "OpenConfig working group
-     www.openconfig.net";
-  description
-    "This module provides extensions to the YANG language to allow
-     OpenConfig specific functionality and meta-data to be defined.";
-
-  revision 2017-04-11 {
-    description
-      "rename password type to 'hashed' and clarify description";
-    reference
-      "0.3.0";
-  }
-  revision 2017-01-29 {
-    description
-      "Added extension for annotating encrypted values.";
-    reference
-      "0.2.0";
-  }
-  revision 2015-10-09 {
-    description
-      "Initial OpenConfig public release";
-    reference
-      "0.1.0";
-  }
-
-  extension openconfig-version {
-    argument semver {
-      yin-element false;
-    }
-    description
-      "The OpenConfig version number for the module. This is
-       expressed as a semantic version number of the form:
-        x.y.z
-       where:
-        * x corresponds to the major version,
-        * y corresponds to a minor version,
-        * z corresponds to a patch version.
-       This version corresponds to the model file within which it is
-       defined, and does not cover the whole set of OpenConfig models.
-       Where several modules are used to build up a single block of
-       functionality, the same module version is specified across each
-       file that makes up the module.
-
-       A major version number of 0 indicates that this model is still
-       in development (whether within OpenConfig or with industry
-       partners), and is potentially subject to change.
-
-       Following a release of major version 1, all modules will
-       increment major revision number where backwards incompatible
-       changes to the model are made.
-
-       The minor version is changed when features are added to the
-       model that do not impact current clients use of the model.
-
-       The patch-level version is incremented when non-feature changes
-       (such as bugfixes or clarifications to human-readable
-       descriptions that do not impact model functionality) are made
-       that maintain backwards compatibility.
-
-       The version number is stored in the module meta-data.";
-  }
-
-  extension openconfig-hashed-value {
-    description
-      "This extension provides an annotation on schema nodes to
-       indicate that the corresponding value should be stored and
-       reported in hashed form.
-
-       Hash algorithms are by definition not reversible. Clients
-       reading the configuration or applied configuration for the node
-       should expect to receive only the hashed value. Values written
-       in cleartext will be hashed. This annotation may be used on
-       nodes such as secure passwords in which the device never reports
-       a cleartext value, even if the input is provided as cleartext.";
-  }
-}
diff --git a/ordmodels/device/src/main/yang/openconfig-telemetry-types@2017-08-24.yang b/ordmodels/device/src/main/yang/openconfig-telemetry-types@2017-08-24.yang
deleted file mode 100644 (file)
index 989f383..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-module openconfig-telemetry-types {
-  yang-version 1;
-  namespace "http://openconfig.net/yang/telemetry-types";
-  prefix oc-telemetry-types;
-
-  import openconfig-extensions {
-    prefix oc-ext;
-  }
-
-  organization
-    "OpenConfig working group";
-  contact
-    "OpenConfig working group
-     www.openconfig.net";
-  description
-    "This module defines type and identities used by the OpenConfig
-     telemetry model.";
-
-  revision 2017-08-24 {
-    description
-      "Minor formatting fixes";
-    reference
-      "0.4.1";
-  }
-  revision 2017-02-20 {
-    description
-      "Fixes for YANG 1.0 compliance, add types module";
-    reference
-      "0.4.0";
-  }
-  revision 2016-04-05 {
-    description
-      "OpenConfig public release";
-    reference
-      "0.2.0";
-  }
-
-  identity DATA_ENCODING_METHOD {
-    description
-      "Base identity for supported encoding for configuration and
-       operational state data";
-  }
-
-  identity ENC_XML {
-    base DATA_ENCODING_METHOD;
-    description
-      "XML encoding";
-  }
-
-  identity ENC_JSON_IETF {
-    base DATA_ENCODING_METHOD;
-    description
-      "JSON encoded based on IETF draft standard";
-    reference
-      "draft-ietf-netmod-yang-json";
-  }
-
-  identity ENC_PROTO3 {
-    base DATA_ENCODING_METHOD;
-    description
-      "Protocol buffers v3";
-    reference
-      "https://developers.google.com/protocol-buffers/docs/overview";
-  }
-
-  identity STREAM_PROTOCOL {
-    description
-      "Base identity for a telemetry stream protocol";
-  }
-
-  identity STREAM_SSH {
-    base STREAM_PROTOCOL;
-    description
-      "Telemetry stream is carried over a SSH connection";
-  }
-
-  identity STREAM_GRPC {
-    base STREAM_PROTOCOL;
-    description
-      "Telemetry stream is carried over via the gRPC framework";
-  }
-
-  identity STREAM_JSON_RPC {
-    base STREAM_PROTOCOL;
-    description
-      "Telemetry stream is carried via the JSON-RPC framework";
-  }
-
-  identity STREAM_THRIFT_RPC {
-    base STREAM_PROTOCOL;
-    description
-      "Telemetry stream is carried via the Apache Thrift framework";
-  }
-
-  identity STREAM_WEBSOCKET_RPC {
-    base STREAM_PROTOCOL;
-    description
-      "Telemetry stream is carried by the WebSocket framework";
-  }
-
-  oc-ext:openconfig-version "0.4.1";
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-database@2016-10-14.yang b/ordmodels/device/src/main/yang/org-openroadm-database@2016-10-14.yang
deleted file mode 100644 (file)
index d87acee..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
-module org-openroadm-database {
-  namespace "http://org/openroadm/database";
-  prefix org-openroadm-database;
-
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2016-10-14;
-  }
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "This module contains definitions for System Management.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  rpc db-backup {
-    description
-      "copy  running DB to user provided file to a given path";
-    input {
-      leaf filename {
-        type string {
-          length "10..255";
-        }
-        description
-          "Path and file name is used with back-up.(xxx.DBS)";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  rpc db-restore {
-    description
-      "Restore database ";
-    input {
-      leaf filename {
-        type string {
-          length "10..255";
-        }
-        description
-          "PATH/file name use file name.(xxx.DBS)";
-      }
-      leaf nodeIDCheck {
-        type boolean;
-        default "true";
-        description
-          "Flag to indicate if sysNameCheck is required";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  rpc db-activate {
-    description
-      "activate the database";
-    input {
-      leaf rollBackTimer {
-        type string;
-        description
-          "rollbackTimer ";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  rpc cancel-rollback-timer {
-    description
-      "Cancel roll back timer which user provisioned as part of activate command";
-    input {
-      leaf accept {
-        type boolean;
-        description
-          " TRUE means rollback timer is cancelled and new load is accepted";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  rpc database-init {
-    description
-      "Initialize the database to default DB";
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    } //output
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-database@2018-10-19.yang b/ordmodels/device/src/main/yang/org-openroadm-database@2018-10-19.yang
deleted file mode 100755 (executable)
index 26ee766..0000000
+++ /dev/null
@@ -1,159 +0,0 @@
-module org-openroadm-database {
-  namespace "http://org/openroadm/database";
-  prefix org-openroadm-database;
-
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2018-10-19;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "This module contains definitions for System Management.
-     
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  rpc db-backup {
-    description
-      "copy  running DB to user provided file to a given path";
-    input {
-      leaf filename {
-        type string {
-          length "10..255";
-        }
-        description
-          "Path and file name is used with back-up.(xxx.DBS)";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  rpc db-restore {
-    description
-      "Restore database ";
-    input {
-      leaf filename {
-        type string {
-          length "10..255";
-        }
-        description
-          "PATH/file name use file name.(xxx.DBS)";
-      }
-      leaf nodeIDCheck {
-        type boolean;
-        default "true";
-        description
-          "Flag to indicate if sysNameCheck is required";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  rpc db-activate {
-    description
-      "activate the database";
-    input {
-      leaf rollBackTimer {
-        type string;
-        description
-          "rollbackTimer ";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  rpc cancel-rollback-timer {
-    description
-      "Cancel roll back timer which user provisioned as part of activate command";
-    input {
-      leaf accept {
-        type boolean;
-        description
-          " TRUE means rollback timer is cancelled and new load is accepted";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  rpc database-init {
-    description
-      "Initialize the database to default DB";
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  notification db-backup-notification {
-    description
-      "notification for db-backup operation events.";
-    uses org-openroadm-common-types:rpc-response-status;
-  }
-  notification db-restore-notification {
-    description
-      "notification for db-restore operation events.";
-    uses org-openroadm-common-types:rpc-response-status;
-  }
-  notification db-activate-notification {
-    description
-      "notification for database activation events.";
-    leaf db-active-notification-type {
-      type org-openroadm-common-types:activate-notification-type;
-    }
-    uses org-openroadm-common-types:rpc-response-status;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-database@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-database@2020-05-29.yang
deleted file mode 100644 (file)
index a58dbf0..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-module org-openroadm-database {
-  namespace "http://org/openroadm/database";
-  prefix org-openroadm-database;
-
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2020-05-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "This module contains definitions for System Management.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  rpc db-backup {
-    description
-      "copy  running DB to user provided file to a given path";
-    input {
-      leaf filename {
-        type string {
-          length "10..255";
-        }
-        description
-          "Path and file name is used with back-up.(xxx.DBS)";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-
-  rpc db-restore {
-    description
-      "Restore database ";
-    input {
-      leaf filename {
-        type string {
-          length "10..255";
-        }
-        description
-          "PATH/file name use file name.(xxx.DBS)";
-      }
-      leaf nodeIDCheck {
-        type boolean;
-        default "true";
-        description
-          "Flag to indicate if sysNameCheck is required";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-
-  rpc db-activate {
-    description
-      "activate the database";
-    input {
-      leaf rollBackTimer {
-        type string;
-        description
-          "rollbackTimer ";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-
-  rpc cancel-rollback-timer {
-    description
-      "Cancel roll back timer which user provisioned as part of activate command";
-    input {
-      leaf accept {
-        type boolean;
-        description
-          " TRUE means rollback timer is cancelled and new load is accepted";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-
-  rpc database-init {
-    description
-      "Initialize the database to default DB";
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-
-  notification db-backup-notification {
-    description
-      "notification for db-backup operation events.";
-    uses org-openroadm-common-types:rpc-response-status;
-  }
-
-  notification db-restore-notification {
-    description
-      "notification for db-restore operation events.";
-    uses org-openroadm-common-types:rpc-response-status;
-  }
-
-  notification db-activate-notification {
-    description
-      "notification for database activation events.";
-    leaf db-active-notification-type {
-      type org-openroadm-common-types:activate-notification-type;
-    }
-    uses org-openroadm-common-types:rpc-response-status;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-de-operations@2016-10-14.yang b/ordmodels/device/src/main/yang/org-openroadm-de-operations@2016-10-14.yang
deleted file mode 100644 (file)
index 0a4d118..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-module org-openroadm-de-operations {
-  namespace "http://org/openroadm/de/operations";
-  prefix org-openroadm-de-operations;
-
-  import org-openroadm-resource {
-    prefix org-openroadm-resource;
-    revision-date 2016-10-14;
-  }
-
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2016-10-14;
-  }
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of operations.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  rpc restart {
-    description
-      "Restart a resource with warm/cold option. If no resource is provided or only the device name is provded, then the device itself will be restarted.
-       Note that resources on the device will not be restartable";
-    input {
-      uses org-openroadm-resource:resource;
-      leaf option{
-        type enumeration{
-          enum "warm"{
-            value 1;
-          }
-          enum "cold"{
-            value 2;
-          }
-        }
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  notification restart-notification {
-    description
-      "This Notification is sent when a resource on a device has completed a restart. This is sent as a result of restarts triggered via the
-       restart RPC and other means.  The resource identified is the from the RPC request or the equivalment if the restart was triggered another way.";
-    uses org-openroadm-resource:resource;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-de-operations@2018-10-19.yang b/ordmodels/device/src/main/yang/org-openroadm-de-operations@2018-10-19.yang
deleted file mode 100755 (executable)
index aa3331c..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-module org-openroadm-de-operations {
-  namespace "http://org/openroadm/de/operations";
-  prefix org-openroadm-de-operations;
-
-  import org-openroadm-resource {
-    prefix org-openroadm-resource;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2018-10-19;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of operations.
-     
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  rpc restart {
-    description
-      "Restart a resource with warm/cold option. If no resource is provided or only the device name is provided, then the device itself will be restarted.
-       Note that resources on the device will not be restartable";
-    input {
-      uses org-openroadm-resource:resource;
-      leaf option {
-        type enumeration {
-          enum "warm" {
-            value 1;
-          }
-          enum "cold" {
-            value 2;
-          }
-        }
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  notification restart-notification {
-    description
-      "This Notification is sent when a resource on a device has completed a restart. This is sent as a result of restarts triggered via the
-       restart RPC and other means.  The resource identified is the from the RPC request or the equivalment if the restart was triggered another way.";
-    uses org-openroadm-resource:resource;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-de-operations@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-de-operations@2020-05-29.yang
deleted file mode 100644 (file)
index a295ab0..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-module org-openroadm-de-operations {
-  namespace "http://org/openroadm/de/operations";
-  prefix org-openroadm-de-operations;
-
-  import org-openroadm-resource {
-    prefix org-openroadm-resource;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2020-05-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of operations.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  rpc restart {
-    description
-      "Restart a resource with warm/cold option. If no resource is provided or only the device name is provided, then the device itself will be restarted.
-       Note that resources on the device will not be restartable";
-    input {
-      uses org-openroadm-resource:resource;
-      leaf option {
-        type enumeration {
-          enum warm {
-            value 1;
-          }
-          enum cold {
-            value 2;
-          }
-        }
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-
-  notification restart-notification {
-    description
-      "This Notification is sent when a resource on a device has completed a restart. This is sent as a result of restarts triggered via the
-       restart RPC and other means.  The resource identified is the from the RPC request or the equivalent if the restart was triggered another way.";
-    uses org-openroadm-resource:resource;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-device-resource-types@2016-10-14.yang b/ordmodels/device/src/main/yang/org-openroadm-device-resource-types@2016-10-14.yang
deleted file mode 100644 (file)
index eb2d9a2..0000000
+++ /dev/null
@@ -1,217 +0,0 @@
-module org-openroadm-device-resource-types {
-  namespace "http://org/openroadm/de/device-resource-types";
-  prefix org-openroadm-device-resource-types;
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of resource types.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-/* Currently not used; if used later, needs to move to org-openroadm-device.yang so leafref can be resolved.
-  grouping device-id {
-    description
-      "Device identifier. Unique within the Controller.";
-    leaf node-id {
-      description
-        "Node Id. Globally unique identifier for a device.";
-      type leafref {
-        path "/org-openroadm-device/info/node-id";
-      }
-      mandatory true;
-    }
-  }
-*/
-
-/* Currently not used; if used later, needs to move to org-openroadm-device.yang so leafref can be resolved.
-  grouping shelf-name {
-    leaf shelf-name {
-      description
-        "Shelf identifier. Unique within the context of a device.";
-      type leafref {
-        path "/org-openroadm-device/shelves/shelf-name";
-      }
-      mandatory true;
-      config false;
-    }
-  }
-*/
-
-/* Currently not used; if used later, needs to move to org-openroadm-device.yang so leafref can be resolved.
-  grouping physical-link-name {
-    leaf physical-link-name {
-      description
-        "Physical Link identifier. Unique within the context of a device.";
-      type leafref {
-        path "/org-openroadm-device/physical-link/physical-link-name";
-      }
-      mandatory true;
-      config false;
-    }
-  }
-*/
-
-/* Currently not used; if used later, needs to move to org-openroadm-device.yang so leafref can be resolved.
-  grouping internal-link-name {
-    uses org-openroadm-device:circuit-pack-name;
-    leaf internal-link-name {
-      description
-        "Internal Link identifier. Unique within the context of a circuit pack.";
-      type leafref {
-        path "/org-openroadm-device/internal-link/internal-link-name";
-      }
-      mandatory true;
-      config false;
-    }
-  }
-*/
-
-/* Currently not used; if used later, needs to move to org-openroadm-device.yang so leafref can be resolved.
-  grouping connection-number {
-    leaf connection-number {
-      description
-        "Connection identifier. Unique within the context of a device.";
-      type leafref {
-        path "/org-openroadm-device/connections/connection-number";
-      }
-    }
-  }
-*/
-
-/* Currently not used; if used later, needs to move to org-openroadm-device.yang so leafref can be resolved.
-  grouping this-will-test-ids {
-    uses device-id;
-    container shelf {
-      uses shelf-name;
-    }
-    container circuit-pack {
-      uses org-openroadm-device:circuit-pack-name;
-    }
-    container port {
-      uses org-openroadm-device:port-name;
-    }
-    uses internal-link-name;
-    uses physical-link-name;
-    uses connection-number;
-    uses org-openroadm-device:srg-number;
-    uses org-openroadm-device:degree-number;
-  }
-*/
-
-/* Currently not used; if used later, needs to move to org-openroadm-device.yang so leafref can be resolved.
-  grouping xponder-device-id {
-    description
-      "Xponder identifier. Unique within the Controller.";
-    leaf node-id {
-      description
-        "Xponder Id. Globally unique identifier for the device";
-      type leafref {
-        path "/org-openroadm-device/info/node-id";
-      }
-      mandatory true;
-    }
-  }
-*/
-
-/* Currently not used; if used later, needs to move to org-openroadm-device.yang so leafref can be resolved.
-  grouping xponder-number {
-    leaf xponder-number {
-      description
-        "Xponder identifier. Unique within the context of a device.";
-      type leafref {
-        path "/org-openroadm-device/xponders/xponder-number";
-      }
-      config false;
-    }
-  }
-*/
-
-/* Currently not used; if used later, needs to move to org-openroadm-device.yang so leafref can be resolved.
-  grouping xponder-shelf-name {
-    uses xponder-number;
-    leaf shelf-name {
-      description
-        "Shelf identifier. Unique within the context of a device.";
-      type leafref {
-        path "/org-openroadm-device/xponders[xponder-number=current()/../xponder-number]/shelves/shelf-name";
-      }
-      mandatory true;
-      config false;
-    }
-  }
-*/
-
-/* Currently not used; if used later, needs to move to org-openroadm-device.yang so leafref can be resolved.
-  grouping xponder-circuit-pack-name {
-    uses xponder-number;
-    leaf circuit-pack-name {
-      description
-        "Circuit Pack identifier. Unique within the context of a xponder.";
-      type leafref {
-        path "/org-openroadm-device/circuit-packs/circuit-pack-name";
-      }
-      config false;
-    }
-  }
-*/
-
-/* Currently not used; if used later, needs to move to org-openroadm-device.yang so leafref can be resolved.
-  grouping xponder-port-name {
-    uses xponder-circuit-pack-name;
-    leaf port-name {
-      description
-        "Port identifier. Unique within the context of a circuit-pack.";
-      type leafref {
-        path "/org-openroadm-device/circuit-packs[circuit-pack-name=current()/../circuit-pack-name]/ports/port-name";
-      }
-      config false;
-    }
-  }
-*/
-
-/* Currently not used; if used later, needs to move to org-openroadm-device.yang so leafref can be resolved.
-  grouping this-will-test-xponder-ids {
-    uses xponder-device-id;
-    container shelf {
-      uses xponder-shelf-name;
-    }
-    container circuit-pack {
-      uses xponder-circuit-pack-name;
-    }
-    container port {
-      uses xponder-port-name;
-    }
-  }
-*/
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-device-types@2019-11-29.yang b/ordmodels/device/src/main/yang/org-openroadm-device-types@2019-11-29.yang
deleted file mode 100644 (file)
index 89087d9..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-module org-openroadm-device-types {
-  namespace "http://org/openroadm/device-types";
-  prefix org-openroadm-device-types;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of device types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-
-  typedef node-types {
-    type enumeration {
-      enum rdm {
-        value 1;
-      }
-      enum xpdr {
-        value 2;
-      }
-      enum ila {
-        value 3;
-      }
-      enum extplug {
-        value 4;
-      }
-    }
-    description
-      "Identifier for node type
-       1. rdm for ROADM
-       2. xpdr for Transponder, Regen
-       3. ila for in-line amplifier
-       4. extplug for external pluggable";
-  }
-
-  typedef xpdr-node-types {
-    type enumeration {
-      enum tpdr {
-        value 1;
-      }
-      enum mpdr {
-        value 2;
-      }
-      enum switch {
-        value 3;
-      }
-      enum regen {
-        value 4;
-      }
-      enum regen-uni {
-        value 5;
-      }
-    }
-    description
-      "Identifier for Xponder node type
-       1. Transponder
-       2. Muxponder
-       3. OTN switchponder
-       4. Regenerator
-       5. Regenerator based on unidirectional model";
-  }
-
-  typedef port-qual {
-    type enumeration {
-      enum roadm-internal {
-        value 1;
-      }
-      enum roadm-external {
-        value 2;
-      }
-      enum xpdr-network {
-        value 3;
-      }
-      enum xpdr-client {
-        value 4;
-      }
-      enum otdr {
-        value 5;
-      }
-      enum switch-network {
-        value 6;
-      }
-      enum switch-client {
-        value 7;
-      }
-      enum ila-external {
-        value 8;
-      }
-      enum ila-internal {
-        value 9;
-      }
-    }
-  }
-
-  grouping physical-location {
-    leaf rack {
-      type string;
-      mandatory false;
-    }
-    leaf shelf {
-      type string;
-      mandatory false;
-    }
-    leaf slot {
-      type string;
-      mandatory false;
-    }
-    leaf subSlot {
-      type string;
-      mandatory false;
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-device@2017-02-06.yang b/ordmodels/device/src/main/yang/org-openroadm-device@2017-02-06.yang
deleted file mode 100644 (file)
index 800634a..0000000
+++ /dev/null
@@ -1,1230 +0,0 @@
-module org-openroadm-device {
-  namespace "http://org/openroadm/device";
-  prefix org-openroadm-device;
-
-  import ietf-yang-types {
-    prefix ietf-yang-types;
-  }
-  import ietf-inet-types {
-    prefix ietf-inet-types;
-  }
-  import ietf-netconf {
-    prefix ietf-nc;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2016-10-14;
-
-  }
-  import org-openroadm-resource-types {
-    prefix org-openroadm-resource-types;
-    revision-date 2016-10-14;
-
-  }
-  import org-openroadm-wavelength-map {
-    prefix org-openroadm-wavelength-map;
-    revision-date 2016-10-14;
-
-  }
-  import org-openroadm-physical-types {
-    prefix org-openroadm-physical-types;
-    revision-date 2016-10-14;
-
-  }
-  import org-openroadm-user-mgmt {
-    prefix org-openroadm-user-mgmt;
-    revision-date 2016-10-14;
-
-  }
-  import org-openroadm-port-types {
-    prefix org-openroadm-port-types;
-    revision-date 2017-09-29;
-
-  }
-  import org-openroadm-interfaces {
-    prefix org-openroadm-interfaces;
-    revision-date 2016-10-14;
-
-  }
-  import org-openroadm-swdl {
-    prefix org-openroadm-swdl;
-    revision-date 2016-10-14;
-
-  }
-  import org-openroadm-equipment-states-types {
-    prefix org-openroadm-equipment-states-types;
-    revision-date 2016-10-14;
-  }
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of ROADM device
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF netconf.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2017-02-06 {
-    description
-      "Version 1.2.1 - removed pattern for current-datetime in info tree and rpc";
-  }
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  rpc get-connection-port-trail {
-    input {
-      leaf connection-number {
-        type string;
-        mandatory true;
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-      list ports {
-        uses org-openroadm-common-types:physical-location;
-        uses port-name {
-          refine "circuit-pack-name" {
-            mandatory true;
-          }
-          refine "port-name" {
-            mandatory true;
-          }
-        }
-      }
-    }
-  }
-  rpc disable-automatic-shutoff {
-    input {
-      leaf amp {
-        type leafref {
-          path "/org-openroadm-device/shelves/shelf-name";
-        }
-        mandatory true;
-        description
-          "The shelf where amp is located";
-      }
-      leaf degree-number {
-        type uint16;
-        mandatory true;
-      }
-      leaf support-timer {
-        type uint16 {
-          range "1..600";
-        }
-        default "20";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  rpc start-scan {
-    input {
-      leaf degree-number {
-        type uint16;
-        mandatory true;
-      }
-      leaf port-direction {
-        type org-openroadm-common-types:direction;
-      }
-      leaf distance {
-        type uint32;
-      }
-      leaf resolution {
-        type uint32;
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-
-  notification otdr-scan-result {
-    leaf status {
-      type enumeration {
-        enum "Completed" {
-          value 1;
-        }
-        enum "Failed" {
-          value 2;
-        }
-      }
-      mandatory true;
-      description
-        "Completed or Failed for the scan's final status";
-    }
-    leaf result-file {
-      type string;
-    }
-  }
-
-  rpc set-current-datetime {
-    description
-      "Set the info/current-datetime leaf to the specified value.";
-    input {
-     leaf current-datetime {
-        type ietf-yang-types:date-and-time;
-        mandatory true;
-        description
-          "The current system date and time in UTC. Format: YYYY-MM-DDTHH:MM:SS";
-      }
-    }
-
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-
-  grouping device-common {
-    leaf node-id {
-      type string;
-      description
-        "Globally unique identifer for a device.";
-      default "openroadm";
-    }
-    leaf node-number {
-      type uint32;
-      description
-        "Number assigned to a ROADM node at a
-         given office";
-    }
-    leaf node-type {
-      type org-openroadm-common-types:node-types;
-      description
-        "Identifier for node-type e.g Roadm, xponder";
-      config false;
-      mandatory true;
-    }
-    leaf clli {
-      type string;
-      description
-        "Common Language Location Identifier.";
-    }
-    uses org-openroadm-physical-types:node-info;
-    leaf ipAddress {
-      type ietf-inet-types:ip-address;
-      description
-        "IP Address of device";
-    }
-    leaf prefix-length {
-      type uint8 {
-        range "0..128";
-      }
-      description
-        "The length of the subnet prefix";
-    }
-    leaf defaultGateway {
-      type ietf-inet-types:ip-address;
-      description
-        "Default Gateway";
-    }
-    leaf source {
-      type enumeration {
-        enum "static" {
-          value 1;
-        }
-        enum "dhcp" {
-          value 2;
-        }
-      }
-      config false;
-    }
-    leaf current-ipAddress {
-      type ietf-inet-types:ip-address;
-      config false;
-      description
-        "Current IP Address of device";
-    }
-    leaf current-prefix-length {
-      type uint8 {
-        range "0..128";
-      }
-      config false;
-      description
-        "The current length of the subnet prefix";
-    }
-    leaf current-defaultGateway {
-      type ietf-inet-types:ip-address;
-      config false;
-      description
-        "Current Default Gateway";
-    }
-    leaf macAddress {
-      type ietf-yang-types:mac-address;
-      description
-        "MAC Address of device";
-      config false;
-    }
-    leaf softwareVersion {
-      type string;
-      config false;
-      description
-        "Software version";
-    }
-    leaf template {
-      type string;
-      description
-        "Template information used in the deployment.";
-    }
-    leaf current-datetime {
-      type ietf-yang-types:date-and-time;
-      config false;
-      description
-        "The current system date and time in UTC. Format: YYYY-MM-DDTHH:MM:SS.mm+ ";
-    }
-    container geoLocation {
-      description
-        "GPS location";
-      leaf latitude {
-        type decimal64 {
-          fraction-digits 16;
-          range "-90 .. 90";
-        }
-        description
-          "[From wikipedia] Latitude is an angle (defined below)
-           which ranges from 0° at the Equator to 90° (North or
-           South) at the poles";
-      }
-      leaf longitude {
-        type decimal64 {
-          fraction-digits 16;
-          range "-180 .. 180";
-        }
-        description
-          "[From wikipedia] The longitude is measured as the
-           angle east or west from the Prime Meridian, ranging
-           from 0° at the Prime Meridian to +180° eastward and
-           −180° westward.";
-      }
-    }
-  }
-
-  grouping slot-info {
-    description
-      "slots information. To be populated by NE during retrieval.";
-    leaf slot-name {
-      type string;
-      description
-        "The name of this slot.";
-    }
-    leaf label {
-      type string;
-      description
-        "Faceplate label";
-    }
-    leaf provisioned-circuit-pack {
-      type leafref {
-        path "/org-openroadm-device/circuit-packs/circuit-pack-name";
-      }
-      description
-        "The supported circuit-pack. It will be empty if no provision on this slot.";
-    }
-  }
-  grouping shelves {
-    list shelves {
-      key "shelf-name";
-      uses shelf;
-    }
-  }
-  grouping shelf {
-    leaf shelf-name {
-      description
-        "Unique identifier for this shelf within a device";
-      type string;
-    }
-    leaf shelf-type {
-      description
-        "The shelf type: describe the shelf with a unique string.";
-      type string;
-      mandatory true;
-    }
-    leaf rack {
-      description
-        "Reflect the shelf physical location data including floor, aisle, bay values.";
-      type string;
-    }
-    leaf shelf-position {
-      description
-        "Reflect the shelf vertical position within an equipment bay.";
-      type string;
-    }
-    leaf administrative-state {
-      description
-        "Admin State of the shelf";
-      type org-openroadm-equipment-states-types:admin-states;
-    }
-    uses org-openroadm-physical-types:common-info;
-    leaf equipment-state {
-      type org-openroadm-equipment-states-types:states;
-      description
-        "equipment state for the shelf, used to track the lifecycle state.";
-    }
-    leaf due-date {
-      type ietf-yang-types:date-and-time;
-      description
-        "due date for the shelf.";
-    }
-    list slots {
-      description
-          "List of slots on this shelf. To be populated by NE during retrieval.";
-      key "slot-name";
-      config false;
-      uses slot-info;
-    }
-  }
-
-  grouping circuit-packs {
-    list circuit-packs {
-      description
-        "List of circuit packs. This includes common equipment, like fans, power supplies, etc.";
-      key "circuit-pack-name";
-      leaf circuit-pack-type {
-        description
-          "Type of circuit-pack";
-        type string;
-        mandatory true;
-      }
-      leaf circuit-pack-product-code {
-        description
-          "Product Code for the circuit-pack";
-        type string;
-      }
-      uses circuit-pack;
-    }
-  }
-
-  grouping circuit-pack {
-    leaf circuit-pack-name {
-      description
-        "Unique identifier for this circuit-pack within a device";
-      type string;
-    }
-    leaf administrative-state {
-      description
-        "Administrative state of circuit-pack";
-      type org-openroadm-equipment-states-types:admin-states;
-    }
-    uses org-openroadm-physical-types:common-info;
-    container circuit-pack-category {
-      description
-        "General type of circuit-pack";
-      uses org-openroadm-common-types:equipment-type;
-      config false;
-    }
-    leaf equipment-state {
-      description
-        "Equipment state, which complements operational state.";
-      type org-openroadm-equipment-states-types:states;
-    }
-    leaf circuit-pack-mode {
-      description
-        "Circuit-pack mode allowed. e.g. NORMAL or REGEN";
-      type string;
-      default "NORMAL";
-    }
-    leaf shelf {
-      type leafref {
-        path "/org-openroadm-device/shelves/shelf-name";
-      }
-      mandatory true;
-    }
-    leaf slot {
-      type string;
-      mandatory true;
-    }
-    leaf subSlot {
-      type string;
-      mandatory false;
-    }
-    leaf due-date {
-      type ietf-yang-types:date-and-time;
-      description
-        "due date for this circuit-pack.";
-    }
-    container parent-circuit-pack {
-      description
-        "In the case of circuit packs that contain other equipment (modules or pluggables), this captures the hierarchy of that equipment.  It is a vendor specific design decision if the ports for single-port pluggables are modeled as children of the parent circuit-pack, or as children of the pluggable circuit-pack contained in the parent circuit-pack.  For modules with multiple ports, it is recommended that ports be children of the module and not the carrier, to help in fault correlation and isolation in the case of a module failure.";
-      uses circuit-pack-name;
-      leaf cp-slot-name {
-        type string;
-        description
-          "Slot name on parent-circuit-pack.";
-      }
-    }
-    list cp-slots {
-      description
-          "List of circuit-pack slots on this circuit-pack. To be populated by NE during retrieval.";
-      key "slot-name";
-      config false;
-      uses slot-info;
-    }
-    list ports {
-      key "port-name";
-      description
-        "List of ports on this circuit-pack.  For single port pluggables, the port may be modeled against the pluggable itself, or against the parent-circuit-pack.  For mulit-port pluggables, it is recommended that ports be modeled against the module itself.  Modeling ports as close to the equipment hierarchy as possible will help in fault correlation and isolation since common failures associated with supporting equipment can be used to help identify symptomatic failures on the contained ports.";
-      uses port;
-      container roadm-port {
-        when "../port-qual='roadm-external'";
-        uses org-openroadm-port-types:roadm-port;
-      }
-      container transponder-port {
-        when "../port-qual='xpdr-network' or ../port-qual='xpdr-client'";
-        uses org-openroadm-port-types:common-port;
-      }
-      container otdr-port {
-        when "../port-qual='otdr'";
-        description
-          "Settings for otdr port.";
-        leaf launch-cable-length {
-          type uint32;
-          default "30";
-          units "m";
-        }
-        leaf port-direction {
-          type org-openroadm-common-types:direction;
-        }
-      }
-    }
-  }
-
-  grouping connection {
-    description
-      "Grouping used to define connections.";
-    leaf connection-number {
-      type string;
-    }
-    leaf wavelength-number {
-      type uint32;
-      mandatory true;
-      description
-        "wavelength-number, can be used to access wavelength-map
-         to get wavelength value in nm.";
-    }
-    leaf opticalControlMode {
-      description
-        "Whether connection is currently in power or gain/loss mode";
-      type org-openroadm-common-types:optical-control-mode;
-      reference "openroadm.org: Open ROADM MSA Specification.";
-      default "off";
-    }
-    leaf target-output-power {
-      type org-openroadm-common-types:power-dBm;
-      description
-        "The output target power for this connection. When set, the ROADM will work to ensure that current-output-power reaches this level.";
-    }
-    container source {
-      leaf src-if {
-        type leafref {
-          path "/org-openroadm-device/interface/name";
-        }
-        mandatory true;
-      }
-    }
-    container destination {
-      leaf dst-if {
-        type leafref {
-          path "/org-openroadm-device/interface/name";
-        }
-        mandatory true;
-      }
-    }
-  }
-
-  grouping degree {
-    leaf degree-number {
-      type uint16;
-      must "not( current() > /org-openroadm-device/info/max-degrees) and current() > 0" {
-        error-message "Degree not supported by device ";
-        description
-          "Validating if the degree is supported by device";
-      }
-    }
-    leaf max-wavelengths {
-      type uint16;
-      description
-        "maximum number of wavelengths";
-      config false;
-      mandatory true;
-    }
-    list circuit-packs {
-      key "index";
-      description
-        "list for Cards associated with a degree";
-      leaf index {
-        type uint32;
-      }
-      uses circuit-pack-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-      }
-    }
-    list connection-ports {
-      description
-        "Port associated with degree: One if bi-directional; two if uni-directional";
-      key "index";
-      leaf index {
-        type uint32;
-      }
-      uses port-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-        refine "port-name" {
-          mandatory true;
-        }
-      }
-    }
-    container otdr-port {
-      description
-        "otdr port associated with degree.";
-      uses port-name;
-    }
-  }
-
-  grouping external-links {
-    description
-      "YANG definitions for external links..
-       - physical links between ROADMs and between the ROADMs and XPonders, which can be added and removed maually.";
-    list external-link {
-      key "external-link-name";
-      uses external-link;
-    }
-  }
-
-  grouping external-link {
-    leaf external-link-name {
-      type string;
-    }
-    container source {
-      uses org-openroadm-resource-types:device-id {
-        refine "node-id" {
-          mandatory true;
-        }
-      }
-      uses org-openroadm-resource-types:port-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-        refine "port-name" {
-          mandatory true;
-        }
-      }
-    }
-    container destination {
-      uses org-openroadm-resource-types:device-id {
-        refine "node-id" {
-          mandatory true;
-        }
-      }
-      uses org-openroadm-resource-types:port-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-        refine "port-name" {
-          mandatory true;
-        }
-      }
-    }
-  }
-
-  grouping internal-links {
-    list internal-link {
-      key "internal-link-name";
-      config false;
-      uses internal-link;
-    }
-  }
-
-  grouping internal-link {
-    leaf internal-link-name {
-      type string;
-    }
-    container source {
-      uses port-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-        refine "port-name" {
-          mandatory true;
-        }
-      }
-    }
-    container destination {
-      uses port-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-        refine "port-name" {
-          mandatory true;
-        }
-      }
-    }
-  }
-
-  grouping physical-links {
-    description
-      "YANG definitions for physical links.
-       - phyical links between cards within a ROADM, which are populated by the ROADM and cannot be added or removed manually. ";
-    list physical-link {
-      key "physical-link-name";
-      uses physical-link;
-    }
-  }
-
-  grouping physical-link {
-    leaf physical-link-name {
-      type string;
-    }
-    container source {
-      uses port-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-        refine "port-name" {
-          mandatory true;
-        }
-      }
-    }
-    container destination {
-      uses port-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-        refine "port-name" {
-          mandatory true;
-        }
-      }
-    }
-  }
-
-  grouping srg {
-    leaf max-add-drop-ports {
-      type uint16;
-      config false;
-      mandatory true;
-    }
-    leaf srg-number {
-      type uint16;
-      must "not(current()>/org-openroadm-device/info/max-srgs) and current()>0" {
-        error-message "invalid SRG";
-        description
-          "Validating if the srg is supported by add/drop group";
-      }
-    }
-    leaf wavelengthDuplication {
-      description
-        "Whether the SRG can handle duplicate wavelengths and if so to what extent.";
-      config false;
-      mandatory true;
-      type enumeration {
-        enum "onePerSRG" {
-          description
-            "The SRG cannot handle wavelength duplication. Attempting to provision a connection on this SRG that uses the same wavelength as an existing service will result in failure.";
-          value 1;
-        }
-        enum "onePerDegree" {
-          description
-            "The SRG can handle wavelength duplication, but only one per degree. Attempting to provision a connection on this SRG that uses the same wavelength as an existing service will succeed, so long as the connections are not using the same degree.";
-          value 2;
-        }
-      }
-    }
-    list circuit-packs {
-      key "index";
-      description
-        "list for Cards associated with an add/drop group and srg";
-      leaf index {
-        type uint32;
-      }
-      uses circuit-pack-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-      }
-    }
-  }
-
-  grouping degree-number {
-    leaf degree-number {
-      description
-        "Degree identifier. Unique within the context of a device.";
-      type leafref {
-        path "/org-openroadm-device/degree/degree-number";
-      }
-    }
-  }
-
-  grouping circuit-pack-name {
-    leaf circuit-pack-name {
-      description
-        "Circuit-Pack identifier. Unique within the context of a device.";
-      type leafref {
-        path "/org-openroadm-device/circuit-packs/circuit-pack-name";
-      }
-    }
-  }
-
-  grouping port-name {
-    uses circuit-pack-name;
-    leaf port-name {
-      description
-        "Port identifier. Unique within the context of a circuit-pack.";
-      type leafref {
-        path "/org-openroadm-device/circuit-packs[circuit-pack-name=current()/../circuit-pack-name]/ports/port-name";
-      }
-    }
-  }
-
-  grouping srg-number {
-    leaf srg-number {
-      description
-        "Shared Risk Group identifier. Unique within the context of a device.";
-      type leafref {
-        path "/org-openroadm-device/shared-risk-group/srg-number";
-      }
-    }
-  }
-
-  grouping supporting-port-name {
-    leaf supporting-circuit-pack-name {
-      description
-        "Identifier of the supporting circuit-pack.";
-      type leafref {
-        path "/org-openroadm-device/circuit-packs/circuit-pack-name";
-      }
-      mandatory true;
-    }
-    leaf supporting-port {
-      description
-        "Identifier of the supporting port.";
-      mandatory true;
-      type leafref {
-        path "/org-openroadm-device/circuit-packs[circuit-pack-name=current()/../supporting-circuit-pack-name]/ports/port-name";
-      }
-    }
-  }
-
-  grouping interface-name {
-    leaf interface-name {
-      description
-        "Name of an interface. Unique within the context of a device.";
-      type leafref {
-        path "/org-openroadm-device/interface/name";
-      }
-      config false;
-    }
-  }
-
-  grouping interfaces-grp {
-    description
-      "OpenROADM Interface configuration parameters.";
-    list interface {
-      key "name";
-      description
-        "The list of configured interfaces on the device.";
-      leaf name {
-        type string;
-        description
-          "The name of the interface.";
-      }
-      leaf description {
-        type string;
-        description
-          "A textual description of the interface.";
-      }
-      leaf type {
-        type identityref {
-          base org-openroadm-interfaces:interface-type;
-        }
-        mandatory true;
-        description
-          "The type of the interface.";
-      }
-      leaf administrative-state {
-        type org-openroadm-equipment-states-types:admin-states;
-      }
-      leaf operational-state {
-        type org-openroadm-common-types:state;
-        config false;
-      }
-      leaf circuit-id {
-        type string {
-          length "0..45";
-        }
-        description
-          "circuit identifier/user label,
-           can be used in alarm correlation and/or connection management ";
-      }
-      leaf supporting-interface {
-        type leafref {
-          path "/org-openroadm-device/interface/name";
-        }
-      }
-      uses supporting-port-name;
-    }
-  }
-
-  grouping port {
-    description
-      "Grouping of attributes related to a port object.";
-    leaf port-name {
-      type string;
-      mandatory true;
-      description
-        "Identifier for a port, unique within a circuit pack";
-    }
-    leaf port-type {
-      type string;
-      description
-        "Type of the pluggable or fixed port.";
-    }
-    leaf port-qual {
-      type enumeration {
-        enum "roadm-internal" {
-          value 1;
-        }
-        enum "roadm-external" {
-          value 2;
-        }
-        enum "xpdr-network" {
-          value 3;
-        }
-        enum "xpdr-client" {
-          value 4;
-        }
-        enum "otdr" {
-          value 5;
-        }
-      }
-    }
-    leaf port-wavelength-type {
-      type org-openroadm-port-types:port-wavelength-types;
-      config false;
-      description
-        "Type of port - single, multiple-wavelength, etc.";
-    }
-    leaf port-direction {
-      type org-openroadm-common-types:direction;
-      config false;
-      mandatory true;
-      description
-        "Whether port is uni (tx/rx) or bi-directional and";
-    }
-    leaf label {
-      type string;
-      config false;
-      description
-        "Faceplate label";
-    }
-    leaf circuit-id{
-      type string{
-        length "0..45";
-      }
-      description
-          "circuit identifier/user label,
-           can be used in alarm correlation and/or connection management ";
-
-    }
-    leaf administrative-state {
-      type org-openroadm-equipment-states-types:admin-states;
-      description
-        "Administrative state of port. The value of this field independant of the state of its contained and containing resources.  Setting this a port to administratively down will impact both its operational state, as well the operational state of its contained resources.  If this port is an endpoint to a connection, internal-link, physical-link, etc, then administratevely disabling this port will impact the operational state of those items unless they are using some form of port-protection schema.";
-      default "outOfService";
-    }
-    leaf operational-state {
-      type org-openroadm-common-types:state;
-      config false;
-      mandatory true;
-      description
-        "Operational state of a port";
-    }
-    leaf-list supported-interface-capability {
-      description
-        "Interface types supported on this port";
-      config false;
-      type identityref {
-        base org-openroadm-port-types:supported-if-capability;
-      }
-    }
-    leaf logical-connection-point {
-      type string;
-      description
-        "delete or replace with list logical-ports or connections?";
-    }
-    container partner-port {
-      config false;
-      description
-        "For ports which are not identified as having a direction of bidirectional, this field is used to identify the port which corresponds to the reverse direction. A port pair should include a port for each direction (tx, rx) and report their mate as partner-port.";
-      uses port-name;
-    }
-    container parent-port {
-      config false;
-      description
-        "In the case of port hierarchy, this is the parent port, which is also modeled as port within this circuit-pack. This is used in the case of a port that supports a parallel connector that contains subports.  The parent-port of the subport will be the port that contains this subport.  This can be used to help isolate faults when a single fault on a parallel connector introduces symptomatic failures on the contained subports.";
-      uses port-name;
-    }
-    list interfaces {
-      config false;
-      description
-        "List of the interfaces this port supports.  This is a list of names of instances in the flat instance list";
-      uses interface-name;
-    }
-  }
-
-  uses org-openroadm-device-container;
-
-  grouping org-openroadm-device-container {
-    container org-openroadm-device {
-      container info {
-        uses device-common;
-        leaf max-degrees {
-          type uint16;
-          description
-            "Max. number of degrees supported by device";
-          config false;
-        }
-        leaf max-srgs {
-          type uint16;
-          description
-            "Max. number of SRGs in an add/drop group";
-          config false;
-        }
-      }
-      container users {
-        description
-          "Stores a list of users";
-        uses org-openroadm-user-mgmt:user-profile;
-      }
-      container pending-sw {
-        config false;
-        uses org-openroadm-swdl:sw-bank;
-      }
-      uses shelves;
-      uses circuit-packs;
-      uses interfaces-grp;
-      container protocols {
-        description
-          "Contains the supported protocols";
-      }
-      container wavelength-map {
-        description
-          "The wavelength-number and center frequency, wavelength mapping";
-        config false;
-        uses org-openroadm-wavelength-map:wavelength-map-g;
-      }
-      uses internal-links;
-      uses physical-links;
-      uses external-links;
-      list degree {
-        when "/org-openroadm-device/info/node-type='rdm'";
-        key "degree-number";
-        uses degree;
-      }
-      list shared-risk-group {
-        when "/org-openroadm-device/info/node-type='rdm'";
-        key "srg-number";
-        uses srg;
-      }
-      list roadm-connections {
-        when "/org-openroadm-device/info/node-type='rdm'";
-        key "connection-number";
-        uses connection;
-      }
-      list connection-map {
-        key "connection-map-number";
-        config false;
-        leaf connection-map-number {
-          description
-            "Unique identifier for this connection-map entry";
-          type uint32;
-        }
-        container source {
-          leaf circuit-pack-name {
-            type leafref {
-              path "/org-openroadm-device/circuit-packs/circuit-pack-name";
-            }
-            mandatory true;
-          }
-          leaf port-name {
-            description
-              "Port identifier. Unique within the context of a circuit-pack.";
-            type leafref {
-              path "/org-openroadm-device/circuit-packs[circuit-pack-name=current()/../circuit-pack-name]/ports/port-name";
-            }
-            mandatory true;
-          }
-        }
-        list destination {
-          key "circuit-pack-name port-name";
-          min-elements 1;
-          leaf circuit-pack-name {
-            type leafref {
-              path "/org-openroadm-device/circuit-packs/circuit-pack-name";
-            }
-            mandatory true;
-          }
-          leaf port-name {
-            description
-              "Port identifier. Unique within the context of a circuit-pack.";
-            type leafref {
-              path "/org-openroadm-device/circuit-packs[circuit-pack-name=current()/../circuit-pack-name]/ports/port-name";
-            }
-            mandatory true;
-          }
-        }
-      }
-    }
-  }
-
-  grouping common-session-parms {
-    description
-      "Common session parameters to identify a
-       management session.";
-
-    leaf username {
-      type string;
-      mandatory true;
-      description
-        "Name of the user for the session.";
-    }
-
-    leaf session-id {
-      type ietf-nc:session-id-or-zero-type;
-      mandatory true;
-      description
-        "Identifier of the session.
-         A NETCONF session MUST be identified by a non-zero value.
-         A non-NETCONF session MAY be identified by the value zero.";
-    }
-
-    leaf source-host {
-      type ietf-inet-types:ip-address;
-      description
-        "Address of the remote host for the session.";
-    }
-  }
-  grouping changed-by-parms {
-    description
-      "Common parameters to identify the source
-       of a change event, such as a configuration
-       or capability change.";
-
-     container changed-by {
-       description
-         "Indicates the source of the change.
-          If caused by internal action, then the
-          empty leaf 'server' will be present.
-          If caused by a management session, then
-          the name, remote host address, and session ID
-          of the session that made the change will be reported.";
-       choice server-or-user {
-         leaf server {
-           type empty;
-           description
-             "If present, the change was caused
-              by the server.";
-         }
-
-         case by-user {
-           uses common-session-parms;
-         }
-       } // choice server-or-user
-     } // container changed-by-parms
-  }
-  notification change-notification {
-    description
-      "The Notification that a resource has been added, modified or removed.
-       This notification can be triggered by changes in configuration and operational data.
-       It shall contain the changed field pointed by the xpath.
-       Typically it is not intended for frequently changing volatile data e.g. PM, power levels";
-
-    leaf change-time {
-      description "The time the change occurs.";
-      type ietf-yang-types:date-and-time;
-    }
-    uses changed-by-parms;
-
-    leaf datastore {
-      type enumeration {
-        enum running {
-          description "The <running> datastore has changed.";
-        }
-        enum startup {
-          description "The <startup> datastore has changed";
-        }
-      }
-      default "running";
-      description
-        "Indicates which configuration datastore has changed.";
-    }
-    list edit {
-      description
-        "An edit (change) record SHOULD be present for each distinct
-         edit operation that the server has detected on
-         the target datastore.  This list MAY be omitted
-         if the detailed edit operations are not known.
-         The server MAY report entries in this list for
-         changes not made by a NETCONF session.";
-
-      leaf target {
-        type instance-identifier;
-        description
-            "Topmost node associated with the configuration or operationa change.
-             A server SHOULD set this object to the node within
-             the datastore that is being altered.  A server MAY
-             set this object to one of the ancestors of the actual
-             node that was changed, or omit this object, if the
-             exact node is not known.";
-      }
-      leaf operation {
-        type ietf-nc:edit-operation-type;
-        description
-          "Type of edit operation performed.
-         A server MUST set this object to the NETCONF edit
-         operation performed on the target datastore.";
-      }
-    } // list edit
-  } // notification change-notification
-}
\ No newline at end of file
diff --git a/ordmodels/device/src/main/yang/org-openroadm-device@2018-10-19.yang b/ordmodels/device/src/main/yang/org-openroadm-device@2018-10-19.yang
deleted file mode 100755 (executable)
index 32700cc..0000000
+++ /dev/null
@@ -1,1848 +0,0 @@
-module org-openroadm-device {
-  namespace "http://org/openroadm/device";
-  prefix org-openroadm-device;
-
-  import ietf-yang-types {
-    prefix ietf-yang-types;
-    revision-date 2013-07-15;
-  }
-  import ietf-inet-types {
-    prefix ietf-inet-types;
-    revision-date 2013-07-15;
-  }
-  import ietf-netconf {
-    prefix ietf-nc;
-    revision-date 2011-06-01;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-resource-types {
-    prefix org-openroadm-resource-types;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-physical-types {
-    prefix org-openroadm-physical-types;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-user-mgmt {
-    prefix org-openroadm-user-mgmt;
-    revision-date 2017-12-15;
-  }
-  import org-openroadm-port-types {
-    prefix org-openroadm-port-types;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-interfaces {
-    prefix org-openroadm-interfaces;
-    revision-date 2017-06-26;
-  }
-  import org-openroadm-swdl {
-    prefix org-openroadm-swdl;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-equipment-states-types {
-    prefix org-openroadm-equipment-states-types;
-    revision-date 2017-12-15;
-  }
-  import org-openroadm-switching-pool-types {
-    prefix org-openroadm-switching-pool-types;
-    revision-date 2017-12-15;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of ROADM device
-     
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.
-     
-     Also contains code components extracted from IETF netconf.  These code components 
-     are copyrighted and licensed as follows:
-     
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors. 
-     All rights reserved. 
-     
-     This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating 
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of 
-     publication of this document. Please review these documents carefully, as they 
-     describe your rights and restrictions with respect to this document. Code Components 
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as 
-     described in the Simplified BSD License.";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2017-02-06 {
-    description
-      "Version 1.2.1 - removed pattern for current-datetime in info tree and rpc";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping create-tech-info-group {
-    leaf shelf-id {
-      type leafref {
-        path "/org-openroadm-device/shelves/shelf-name";
-      }
-      description
-        "shelf ID";
-    }
-    leaf log-file-name {
-      type string;
-      description
-        "The log file name a vendor can specify for a given log collection operation";
-    }
-  }
-
-  grouping device-common {
-    leaf node-id {
-      type org-openroadm-common-types:node-id-type;
-      default "openroadm";
-      description
-        "Globally unique identifier for a device.";
-    }
-    leaf node-number {
-      type uint32;
-      description
-        "Number assigned to a ROADM node at a 
-         given office";
-    }
-    leaf node-type {
-      type org-openroadm-common-types:node-types;
-      config true;
-      mandatory true;
-      description
-        "Identifier for node-type e.g Roadm, xponder.
-         Once the node-type is configured, it should not be modified.";
-    }
-    leaf clli {
-      type string;
-      description
-        "Common Language Location Identifier.";
-    }
-    uses org-openroadm-physical-types:node-info;
-    leaf ipAddress {
-      type ietf-inet-types:ip-address;
-      description
-        "IP Address of device";
-    }
-    leaf prefix-length {
-      type uint8 {
-        range "0..128";
-      }
-      description
-        "The length of the subnet prefix";
-    }
-    leaf defaultGateway {
-      type ietf-inet-types:ip-address;
-      description
-        "Default Gateway";
-    }
-    leaf source {
-      type enumeration {
-        enum "static" {
-          value 1;
-        }
-        enum "dhcp" {
-          value 2;
-        }
-      }
-      config false;
-    }
-    leaf current-ipAddress {
-      type ietf-inet-types:ip-address;
-      config false;
-      description
-        "Current IP Address of device";
-    }
-    leaf current-prefix-length {
-      type uint8 {
-        range "0..128";
-      }
-      config false;
-      description
-        "The current length of the subnet prefix";
-    }
-    leaf current-defaultGateway {
-      type ietf-inet-types:ip-address;
-      config false;
-      description
-        "Current Default Gateway";
-    }
-    leaf macAddress {
-      type ietf-yang-types:mac-address;
-      config false;
-      description
-        "MAC Address of device";
-    }
-    leaf softwareVersion {
-      type string;
-      config false;
-      description
-        "Software version";
-    }
-    leaf openroadm-version {
-      type org-openroadm-common-types:openroadm-version-type;
-      config false;
-      description
-        "openroadm version used on the device";
-    }
-    leaf template {
-      type string;
-      description
-        "Template information used in the deployment.";
-    }
-    leaf current-datetime {
-      type ietf-yang-types:date-and-time;
-      config false;
-      description
-        "The current system date and time in UTC. Format: YYYY-MM-DDTHH:MM:SS.mm+ ";
-    }
-    container geoLocation {
-      description
-        "GPS location";
-      leaf latitude {
-        type decimal64 {
-          fraction-digits 16;
-          range "-90 .. 90";
-        }
-        description
-          "[From wikipedia] Latitude is an angle (defined below)
-           which ranges from 0 at the Equator to 90 (North or
-           South) at the poles";
-      }
-      leaf longitude {
-        type decimal64 {
-          fraction-digits 16;
-          range "-180 .. 180";
-        }
-        description
-          "[From wikipedia] The longitude is measured as the
-           angle east or west from the Prime Meridian, ranging
-           from 0 at the Prime Meridian to +180 eastward and
-           -180 westward.";
-      }
-    }
-  }
-
-  grouping slot-info {
-    description
-      "slots information. To be populated by NE during retrieval.";
-    leaf slot-name {
-      type string;
-      description
-        "The name of this slot.";
-    }
-    leaf label {
-      type string;
-      description
-        "Faceplate label";
-    }
-    leaf provisioned-circuit-pack {
-      type leafref {
-        path "/org-openroadm-device/circuit-packs/circuit-pack-name";
-      }
-      description
-        "The supported circuit-pack. It will be empty if holder status is empty-not-prov, or installed-not-prov";
-    }
-    leaf slot-status {
-      type enumeration {
-        enum "empty-not-prov" {
-          value 1;
-          description
-            "Slot is empty and not provisioned";
-        }
-        enum "empty-prov-match" {
-          value 2;
-          description
-            "Slot is empty and expected type is provisioned";
-        }
-        enum "empty-prov-mismatch" {
-          value 3;
-          description
-            "Slot is empty and an unsupported type is provisioned";
-        }
-        enum "installed-not-prov" {
-          value 4;
-          description
-            "Slot is occupied but not provisioned";
-        }
-        enum "installed-prov-match" {
-          value 5;
-          description
-            "Slot is occupied with matching provisioned type";
-        }
-        enum "installed-prov-mismatch" {
-          value 6;
-          description
-            "Slot is occupied with mismatched provisioned type";
-        }
-      }
-    }
-  }
-
-  grouping shelves {
-    list shelves {
-      key "shelf-name";
-      uses shelf;
-    }
-  }
-
-  grouping shelf {
-    leaf shelf-name {
-      type string;
-      description
-        "Unique identifier for this shelf within a device";
-    }
-    leaf shelf-type {
-      type string;
-      mandatory true;
-      description
-        "The shelf type: describe the shelf with a unique string.";
-    }
-    leaf rack {
-      type string;
-      description
-        "Reflect the shelf physical location data including floor, aisle, bay values.";
-    }
-    leaf shelf-position {
-      type string;
-      description
-        "Reflect the shelf vertical position within an equipment bay.";
-    }
-    leaf administrative-state {
-      type org-openroadm-equipment-states-types:admin-states;
-      description
-        "Admin State of the shelf";
-    }
-    uses org-openroadm-physical-types:common-info;
-    leaf equipment-state {
-      type org-openroadm-equipment-states-types:states;
-      description
-        "equipment state for the shelf, used to track the lifecycle state.";
-    }
-    leaf due-date {
-      type ietf-yang-types:date-and-time;
-      description
-        "due date for the shelf.";
-    }
-    list slots {
-      key "slot-name";
-      config false;
-      description
-        "List of slots on this shelf. To be populated by NE during retrieval.";
-      uses slot-info;
-    }
-  }
-
-  grouping circuit-packs {
-    list circuit-packs {
-      key "circuit-pack-name";
-      description
-        "List of circuit packs. This includes common equipment, like fans, power supplies, etc.";
-      leaf circuit-pack-type {
-        type string;
-        mandatory true;
-        description
-          "Type of circuit-pack";
-      }
-      leaf circuit-pack-product-code {
-        type string;
-        description
-          "Product Code for the circuit-pack";
-      }
-      uses circuit-pack;
-    }
-  }
-
-  grouping circuit-pack-features {
-    leaf software-load-version {
-      type string;
-      config false;
-      description
-        "Software version running on the circuit pack.";
-    }
-    list circuit-pack-features {
-      config false;
-      container feature {
-        description
-          "List of features supported by the installed load and indications on whether the features have been applied or not.";
-        leaf description {
-          type string;
-          description
-            "Feature description.";
-        }
-        leaf activated {
-          type boolean;
-          description
-            "Indicator if the feature has been activated.";
-        }
-      }
-    }
-    list circuit-pack-components {
-      config false;
-      container component {
-        description
-          "Optional list of components on the circuit-pack and the load information applicable to those components.  If a load is not up to date and will upgrade when a cold restart occurs, the version that will be applied should also be listed.  If there is no misalignment, this does not need to be reported.";
-        leaf name {
-          type string;
-          description
-            "Name of a component on the circuit-pack that can have a load applied to it.";
-        }
-        leaf current-version {
-          type string;
-          description
-            "Name of the load version currently running on the component.";
-        }
-        leaf version-to-apply {
-          type string;
-          description
-            "Name of the load version for the component that will be applied when cold restart occurs on the circuit-pack.";
-        }
-      }
-    }
-  }
-
-  grouping circuit-pack {
-    leaf circuit-pack-name {
-      type string;
-      description
-        "Unique identifier for this circuit-pack within a device";
-    }
-    leaf administrative-state {
-      type org-openroadm-equipment-states-types:admin-states;
-      description
-        "Administrative state of circuit-pack";
-    }
-    uses org-openroadm-physical-types:common-info;
-    container circuit-pack-category {
-      config false;
-      description
-        "General type of circuit-pack";
-      uses org-openroadm-common-types:equipment-type;
-    }
-    leaf equipment-state {
-      type org-openroadm-equipment-states-types:states;
-      description
-        "Equipment state, which complements operational state.";
-    }
-    leaf circuit-pack-mode {
-      type string;
-      default "NORMAL";
-      description
-        "Circuit-pack mode allowed. e.g. NORMAL or REGEN";
-    }
-    leaf shelf {
-      type leafref {
-        path "/org-openroadm-device/shelves/shelf-name";
-      }
-      mandatory true;
-    }
-    leaf slot {
-      type string;
-      mandatory true;
-    }
-    leaf subSlot {
-      type string;
-      mandatory false;
-    }
-    leaf is-pluggable-optics {
-      type boolean;
-      config false;
-      mandatory true;
-      description
-        "True if circuitpack is pluggable optics";
-    }
-    leaf due-date {
-      type ietf-yang-types:date-and-time;
-      description
-        "due date for this circuit-pack.";
-    }
-    container parent-circuit-pack {
-      description
-        "In the case of circuit packs that contain other equipment (modules or pluggables), this captures the hierarchy of that equipment.  It is a vendor specific design decision if the ports for single-port pluggables are modeled as children of the parent circuit-pack, or as children of the pluggable circuit-pack contained in the parent circuit-pack.  For modules with multiple ports, it is recommended that ports be children of the module and not the carrier, to help in fault correlation and isolation in the case of a module failure.";
-      uses circuit-pack-name;
-      leaf cp-slot-name {
-        type string;
-        description
-          "Slot name on parent-circuit-pack.";
-      }
-    }
-    list cp-slots {
-      key "slot-name";
-      config false;
-      description
-        "List of circuit-pack slots on this circuit-pack. To be populated by NE during retrieval.";
-      uses slot-info;
-      leaf slot-type {
-        type enumeration {
-          enum "pluggable-optics-holder" {
-            value 1;
-            description
-              "slot accepts dedicated pluggable port circuit-pack";
-          }
-          enum "other" {
-            value 2;
-            description
-              "slot accepts parent circuit-pack";
-          }
-        }
-      }
-    }
-    uses circuit-pack-features;
-    list ports {
-      key "port-name";
-      description
-        "List of ports on this circuit-pack. Note that pluggables are considered independent circuit-packs.  All ports that are physically present on a pluggable, need to be modeled as a port against that pluggable circuit-pack, and not against the parent circuit-pack.";
-      uses port;
-      container roadm-port {
-        when "../port-qual='roadm-external'";
-        uses org-openroadm-port-types:roadm-port;
-      }
-      container transponder-port {
-        when "../port-qual='xpdr-network' or ../port-qual='xpdr-client' or ../port-qual='switch-network' or ../port-qual='switch-client'";
-        uses org-openroadm-port-types:common-port;
-      }
-      container otdr-port {
-        when "../port-qual='otdr'";
-        description
-          "Settings for otdr port.";
-        leaf launch-cable-length {
-          type uint32;
-          units "m";
-          default "30";
-        }
-        leaf port-direction {
-          type org-openroadm-common-types:direction;
-        }
-      }
-      container ila-port {
-        when "../port-qual='ila-external'";
-        uses org-openroadm-port-types:common-port;
-      }
-    }
-  }
-
-  grouping odu-connection {
-    description
-      "Grouping used to define odu-connections.";
-    leaf connection-name {
-      type string;
-      description
-        "roadm-connection and odu-connection share the same resource-type and resource definition (e.g. connection)";
-    }
-    leaf direction {
-      type enumeration {
-        enum "unidirectional" {
-          value 1;
-        }
-        enum "bidirectional" {
-          value 2;
-        }
-      }
-      default "bidirectional";
-      description
-        "Directionality of connection. If bidirectional, both directions are created.";
-    }
-    container source {
-      leaf src-if {
-        type leafref {
-          path "/org-openroadm-device/interface/name";
-        }
-        mandatory true;
-      }
-    }
-    container destination {
-      leaf dst-if {
-        type leafref {
-          path "/org-openroadm-device/interface/name";
-        }
-        mandatory true;
-      }
-    }
-  }
-
-  grouping connection {
-    description
-      "Grouping used to define connections.";
-    leaf connection-name {
-      type string;
-    }
-    leaf opticalControlMode {
-      type org-openroadm-common-types:optical-control-mode;
-      default "off";
-      description
-        "Whether connection is currently in power or gain/loss mode";
-      reference "openroadm.org: Open ROADM MSA Specification.";
-    }
-    leaf target-output-power {
-      type org-openroadm-common-types:power-dBm;
-      description
-        "The output target power for this connection. When set, the ROADM will work to ensure that current-output-power reaches this level.";
-    }
-    container source {
-      leaf src-if {
-        type leafref {
-          path "/org-openroadm-device/interface/name";
-        }
-        mandatory true;
-      }
-    }
-    container destination {
-      leaf dst-if {
-        type leafref {
-          path "/org-openroadm-device/interface/name";
-        }
-        mandatory true;
-      }
-    }
-  }
-
-  grouping degree {
-    leaf degree-number {
-      type uint16;
-      must "not( current() > /org-openroadm-device/info/max-degrees) and current() > 0" {
-        error-message "Degree not supported by device ";
-        description
-          "Validating if the degree is supported by device";
-      }
-    }
-    leaf max-wavelengths {
-      type uint16;
-      config false;
-      mandatory true;
-      description
-        "maximum number of wavelengths";
-    }
-    list circuit-packs {
-      key "index";
-      description
-        "list for Cards associated with a degree";
-      leaf index {
-        type uint32;
-      }
-      uses circuit-pack-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-      }
-    }
-    list connection-ports {
-      key "index";
-      description
-        "Port associated with degree: One if bi-directional; two if uni-directional";
-      leaf index {
-        type uint32;
-      }
-      uses port-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-        refine "port-name" {
-          mandatory true;
-        }
-      }
-    }
-    container otdr-port {
-      description
-        "otdr port associated with degree.";
-      uses port-name;
-    }
-    uses mc-capabilities-g;
-  }
-
-  grouping amplifier {
-    leaf amp-number {
-      type uint8 {
-        range "1..128";
-      }
-      description
-        "Unique identifier/number for the amplifier entry which corresponds to a logical amplifier";
-    }
-    leaf amp-type {
-      type org-openroadm-common-types:amplifier-types;
-      config false;
-      mandatory true;
-      description
-        "Amplifier type";
-    }
-    leaf control-mode {
-      type org-openroadm-common-types:line-amplifier-control-mode;
-      default "off";
-      description
-        "Whether the line amplifier is currently in off or gainLoss mode. control-mode can only be set to gainLoss when target-gain, target-tilt and egress-average-channel-power are set and the OMS interfaces are provisioned. The amplifier will be turned off when the control-mode is set to off";
-    }
-    leaf amp-gain-range {
-      type org-openroadm-common-types:amplifier-gain-range;
-      default "gain-range-1";
-      config false;
-      description
-        "Amplifier gain-range (gain-range 1 to 4 for switched gain amplifiers)
-         gain-range-1 (default value) for standard amplifiers";
-    }
-    leaf target-gain {
-      type org-openroadm-common-types:ratio-dB;
-      config true;
-      description
-        "Target overall Amplifier Signal gain, excluding ASE, including VOA attenuation.
-         Defined as optional for ODL support, but shall be considered as mandatory and provided
-         by the controller when the control-mode is set to gainLoss for amplifier setting";
-    }
-    leaf target-tilt {
-      type org-openroadm-common-types:ratio-dB;
-      config true;
-      description
-        "Target tilt configured in case of smart EDFA.
-         Tilt value provided as specified in Open-ROADM-MSA-specifications spreadsheet
-         Defined as optional for ODL support, but shall be considered as mandatory and provided
-         by the controller when the control-mode is set to gainLoss for amplifier setting";
-    }
-    leaf egress-average-channel-power {
-      type org-openroadm-common-types:power-dBm;
-      config true;
-      description
-        "Based upon the total max power across the 4.8 THz passband.
-         Defined as optional for ODL support, but shall be considered as mandatory and provided
-         by the controller when the control-mode is set to gainLoss for amplifier setting";
-    }
-    leaf out-voa-att {
-      type org-openroadm-common-types:ratio-dB;
-      config false;
-      description
-        "Used to provide the value output VOA attenuation, optional";
-    }
-    leaf partner-amp {
-      type leafref {
-        path "../amp-number";
-      }
-      config false;
-      description
-        "amp-number of amp module that is functionally associated to the amplifier  
-         in the opposite direction";
-    }
-    leaf ila-direction-label {
-      type string;
-      description
-        "Amplifier direction. Each operators may have its own naming convention.
-         Shall be consistent with tx-instance-port-direction-label and rx-instance-port-direction-label.";
-    }
-  }
-
-  grouping external-links {
-    description
-      "YANG definitions for external links.. 
-       - physical links between ROADMs and between the ROADMs and XPonders, which can be added and removed manually.";
-    list external-link {
-      key "external-link-name";
-      uses external-link;
-    }
-  }
-
-  grouping external-link {
-    leaf external-link-name {
-      type string;
-    }
-    container source {
-      uses org-openroadm-resource-types:device-id {
-        refine "node-id" {
-          mandatory true;
-        }
-      }
-      uses org-openroadm-resource-types:port-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-        refine "port-name" {
-          mandatory true;
-        }
-      }
-    }
-    container destination {
-      uses org-openroadm-resource-types:device-id {
-        refine "node-id" {
-          mandatory true;
-        }
-      }
-      uses org-openroadm-resource-types:port-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-        refine "port-name" {
-          mandatory true;
-        }
-      }
-    }
-  }
-
-  grouping internal-links {
-    list internal-link {
-      key "internal-link-name";
-      config false;
-      uses internal-link;
-    }
-  }
-
-  grouping internal-link {
-    leaf internal-link-name {
-      type string;
-    }
-    container source {
-      uses port-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-        refine "port-name" {
-          mandatory true;
-        }
-      }
-    }
-    container destination {
-      uses port-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-        refine "port-name" {
-          mandatory true;
-        }
-      }
-    }
-  }
-
-  grouping physical-links {
-    description
-      "YANG definitions for physical links.
-       - physical links (fiber, cables,etc.) between ports within a node. ";
-    list physical-link {
-      key "physical-link-name";
-      uses physical-link;
-    }
-  }
-
-  grouping physical-link {
-    leaf physical-link-name {
-      type string;
-    }
-    container source {
-      uses port-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-        refine "port-name" {
-          mandatory true;
-        }
-      }
-    }
-    container destination {
-      uses port-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-        refine "port-name" {
-          mandatory true;
-        }
-      }
-    }
-  }
-
-  grouping srg {
-    leaf max-add-drop-ports {
-      type uint16;
-      config false;
-      mandatory true;
-      description
-        "The max number of ports available for a given srg";
-    }
-    leaf current-provisioned-add-drop-ports {
-      type uint16;
-      config false;
-      mandatory true;
-      description
-        "The number of ports currently provisioned for a given srg.";
-    }
-    leaf srg-number {
-      type uint16;
-      must "not(current()>/org-openroadm-device/info/max-srgs) and current()>0" {
-        error-message "invalid SRG";
-        description
-          "Validating if the srg is supported by add/drop group";
-      }
-    }
-    leaf wavelength-duplication {
-      type org-openroadm-common-types:wavelength-duplication-type;
-      config false;
-      mandatory true;
-      description
-        "Whether the SRG can handle duplicate wavelengths and if so to what extent.";
-    }
-    list circuit-packs {
-      key "index";
-      description
-        "list for Cards associated with an add/drop group and srg";
-      leaf index {
-        type uint32;
-      }
-      uses circuit-pack-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-      }
-    }
-    uses mc-capabilities-g;
-  }
-
-  grouping xponder {
-    leaf xpdr-number {
-      type uint16;
-      must "current() > 0" {
-        error-message "Xponder not supported by device ";
-        description
-          "Validating if the Xponder is supported by device";
-      }
-    }
-    leaf xpdr-type {
-      type org-openroadm-common-types:xpdr-node-types;
-      mandatory true;
-      description
-        "Identifier for xponder-type e.g Transponder, Muxponder";
-    }
-    leaf recolor {
-      type boolean;
-      config false;
-      description
-        "Indication if recolor is supported";
-    }
-    list xpdr-port {
-      key "index";
-      description
-        "Network Ports with in a Xponder";
-      leaf index {
-        type uint32;
-      }
-      uses port-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-        refine "port-name" {
-          mandatory true;
-        }
-      }
-      leaf eqpt-srg-id {
-        type uint32;
-        description
-          "Shared Risk Group identifier. All ports in a circuit-pack will have same srg-id";
-      }
-    }
-  }
-
-  grouping degree-number {
-    leaf degree-number {
-      type leafref {
-        path "/org-openroadm-device/degree/degree-number";
-      }
-      description
-        "Degree identifier. Unique within the context of a device.";
-    }
-  }
-
-  grouping circuit-pack-name {
-    leaf circuit-pack-name {
-      type leafref {
-        path "/org-openroadm-device/circuit-packs/circuit-pack-name";
-      }
-      description
-        "Circuit-Pack identifier. Unique within the context of a device.";
-    }
-  }
-
-  grouping port-name {
-    uses circuit-pack-name;
-    leaf port-name {
-      type leafref {
-        path "/org-openroadm-device/circuit-packs[circuit-pack-name=current()/../circuit-pack-name]/ports/port-name";
-      }
-      description
-        "Port identifier. Unique within the context of a circuit-pack.";
-    }
-  }
-
-  grouping srg-number {
-    leaf srg-number {
-      type leafref {
-        path "/org-openroadm-device/shared-risk-group/srg-number";
-      }
-      description
-        "Shared Risk Group identifier. Unique within the context of a device.";
-    }
-  }
-
-  grouping supporting-port-name {
-    leaf supporting-circuit-pack-name {
-      type leafref {
-        path "/org-openroadm-device/circuit-packs/circuit-pack-name";
-      }
-      description
-        "Identifier of the supporting circuit-pack.";
-    }
-    leaf supporting-port {
-      type leafref {
-        path "/org-openroadm-device/circuit-packs[circuit-pack-name=current()/../supporting-circuit-pack-name]/ports/port-name";
-      }
-      description
-        "Identifier of the supporting port.";
-    }
-  }
-
-  grouping interface-name {
-    leaf interface-name {
-      type leafref {
-        path "/org-openroadm-device/interface/name";
-      }
-      config false;
-      description
-        "Name of an interface. Unique within the context of a device.";
-    }
-  }
-
-  grouping interfaces-grp {
-    description
-      "OpenROADM Interface configuration parameters.";
-    list interface {
-      key "name";
-      description
-        "The list of configured interfaces on the device.";
-      leaf name {
-        type string;
-        description
-          "The name of the interface.";
-      }
-      leaf description {
-        type string;
-        description
-          "A textual description of the interface.";
-      }
-      leaf type {
-        type identityref {
-          base org-openroadm-interfaces:interface-type;
-        }
-        mandatory true;
-        description
-          "The type of the interface.";
-      }
-      leaf administrative-state {
-        type org-openroadm-equipment-states-types:admin-states;
-      }
-      leaf operational-state {
-        type org-openroadm-common-types:state;
-        config false;
-      }
-      leaf circuit-id {
-        type string {
-          length "0..45";
-        }
-        description
-          "circuit identifier/user label,
-           can be used in alarm correlation and/or connection management ";
-      }
-      leaf supporting-interface {
-        type leafref {
-          path "/org-openroadm-device/interface/name";
-        }
-      }
-      uses supporting-port-name;
-    }
-  }
-
-  grouping protection-groups {
-    description
-      "OpenROADM facility protection configuration parameters.";
-    container protection-grps {
-      description
-        "The list of configured protection groups on the device.";
-    }
-  }
-
-  grouping port {
-    description
-      "Grouping of attributes related to a port object.";
-    leaf port-name {
-      type string;
-      mandatory true;
-      description
-        "Identifier for a port, unique within a circuit pack";
-    }
-    leaf port-type {
-      type string;
-      description
-        "Type of the pluggable or fixed port.";
-    }
-    leaf port-qual {
-      type org-openroadm-common-types:port-qual;
-    }
-    leaf port-wavelength-type {
-      type org-openroadm-port-types:port-wavelength-types;
-      config false;
-      description
-        "Type of port - single, multiple-wavelength, etc.";
-    }
-    leaf port-direction {
-      type org-openroadm-common-types:direction;
-      config false;
-      mandatory true;
-      description
-        "Whether port is uni (tx/rx) or bi-directional and";
-    }
-    leaf label {
-      type string;
-      config false;
-      description
-        "Faceplate label";
-    }
-    leaf circuit-id {
-      type string {
-        length "0..45";
-      }
-      description
-        "circuit identifier/user label,
-         can be used in alarm correlation and/or connection management ";
-    }
-    leaf administrative-state {
-      type org-openroadm-equipment-states-types:admin-states;
-      default "outOfService";
-      description
-        "Administrative state of port. The value of this field independent of the state of its contained and containing resources.  Setting this a port to administratively down will impact both its operational state, as well the operational state of its contained resources.  If this port is an endpoint to a connection, internal-link, physical-link, etc, then administratively disabling this port will impact the operational state of those items unless they are using some form of port-protection schema.";
-    }
-    leaf operational-state {
-      type org-openroadm-common-types:state;
-      config false;
-      mandatory true;
-      description
-        "Operational state of a port";
-    }
-    leaf-list supported-interface-capability {
-      type identityref {
-        base org-openroadm-port-types:supported-if-capability;
-      }
-      config false;
-      description
-        "Interface types supported on this port";
-    }
-    leaf logical-connection-point {
-      type string;
-      description
-        "delete or replace with list logical-ports or connections?";
-    }
-    container partner-port {
-      config false;
-      description
-        "For ports which are not identified as having a direction of bidirectional, this field is used to identify the port which corresponds to the reverse direction. A port pair should include a port for each direction (tx, rx) and report their mate as partner-port.";
-      uses port-name;
-    }
-    container parent-port {
-      config false;
-      description
-        "In the case of port hierarchy, this is the parent port, which is also modeled as port within this circuit-pack. This is used in the case of a port that supports a parallel connector that contains subports.  The parent-port of the subport will be the port that contains this subport.  This can be used to help isolate faults when a single fault on a parallel connector introduces symptomatic failures on the contained subports.";
-      uses port-name;
-    }
-    list interfaces {
-      config false;
-      description
-        "List of the interfaces this port supports.  This is a list of names of instances in the flat instance list";
-      uses interface-name;
-    }
-  }
-
-  grouping org-openroadm-device-container {
-    container org-openroadm-device {
-      container info {
-        uses device-common;
-        leaf max-degrees {
-          type uint16;
-          config false;
-          description
-            "Max. number of degrees supported by device";
-        }
-        leaf max-srgs {
-          type uint16;
-          config false;
-          description
-            "Max. number of SRGs in an add/drop group";
-        }
-        leaf max-num-bin-15min-historical-pm {
-          type uint16;
-          config false;
-          description
-            "Max. number of bin the NE support for 15min historical PM";
-        }
-        leaf max-num-bin-24hour-historical-pm {
-          type uint16;
-          config false;
-          description
-            "Max. number of bin the NE support for 24hour historical PM";
-        }
-      }
-      container users {
-        description
-          "Stores a list of users";
-        uses org-openroadm-user-mgmt:user-profile;
-      }
-      container pending-sw {
-        config false;
-        uses org-openroadm-swdl:sw-bank;
-      }
-      uses shelves;
-      uses circuit-packs;
-      uses interfaces-grp;
-      uses protection-groups;
-      container protocols {
-        description
-          "Contains the supported protocols";
-      }
-      uses internal-links;
-      uses physical-links;
-      uses external-links;
-      list degree {
-        when "/org-openroadm-device/info/node-type='rdm'";
-        key "degree-number";
-        uses degree;
-      }
-      list shared-risk-group {
-        when "/org-openroadm-device/info/node-type='rdm'";
-        key "srg-number";
-        uses srg;
-      }
-      list line-amplifier {
-        when "/org-openroadm-device/info/node-type='ila'";
-        key "amp-number";
-        description
-          "lists amplifiers in different directions";
-        uses amplifier;
-        list circuit-pack {
-          key "index";
-          description
-            "list for Cards associated with an amplifier";
-          leaf index {
-            type uint32;
-          }
-          uses circuit-pack-name {
-            refine "circuit-pack-name" {
-              mandatory true;
-            }
-          }
-        }
-        list line-port {
-          key "port-direction";
-          description
-            "Port associated with an amplifier which face the line (ila-external): traffic port.";
-          leaf port-direction {
-            type org-openroadm-common-types:direction;
-            config true;
-            mandatory true;
-            description
-              "partly allows identifying ports associated with logical amp :TX for egress, RX for ingress
-               TXRX in case of bidirectional port";
-          }
-          leaf tx-instance-port-direction-label {
-            type string;
-            config true;
-            description
-              "Complements ports identification. Used notably in case of bidirectional ports, 
-               and/or in multi-degree amplifier nodes. Allows associating one of the directions
-               specified in ila-direction-label. Shall be consistent with ila-direction-label";
-          }
-          leaf rx-instance-port-direction-label {
-            type string;
-            config true;
-            description
-              "Complements ports identification. Used notably in case of bidirectional ports, 
-               and/or in multi-degree amplifier nodes. Allows associating one of the directions
-               specified in ila-direction-label. Shall be consistent with ila-direction-label";
-          }
-          uses port-name {
-            refine "circuit-pack-name" {
-              mandatory true;
-            }
-            refine "port-name" {
-              mandatory true;
-            }
-          }
-        }
-        list osc-port {
-          key "port-direction";
-          description
-            "Ports associated with OSC";
-          leaf port-direction {
-            type org-openroadm-common-types:direction;
-            config true;
-            mandatory true;
-            description
-              "allows identifying ports associated with logical amp : 
-               TX for OSC circuit-pack IN RX for OSC circuit-pack OUT";
-          }
-          uses port-name {
-            refine "circuit-pack-name" {
-              mandatory true;
-            }
-            refine "port-name" {
-              mandatory true;
-            }
-          }
-        }
-        list otdr-port {
-          key "otdr-direction";
-          description
-            "otdr ports associated with an ILA";
-          leaf otdr-direction {
-            type string;
-            config true;
-            description
-              "allows identifying associated logical amp port in which OTDR is launched: 
-               corresponds to rx-instance-port-direction-label of corresponding amplifier line-port";
-          }
-          uses port-name {
-            refine "circuit-pack-name" {
-              mandatory true;
-            }
-            refine "port-name" {
-              mandatory true;
-            }
-          }
-        }
-      }
-      list xponder {
-        when "/org-openroadm-device/info/node-type='xpdr'";
-        key "xpdr-number";
-        uses xponder;
-      }
-      list roadm-connections {
-        when "/org-openroadm-device/info/node-type='rdm'";
-        key "connection-name";
-        uses connection;
-      }
-      list odu-connection {
-        when "/org-openroadm-device/info/node-type='xpdr'";
-        key "connection-name";
-        uses odu-connection;
-      }
-      list connection-map {
-        key "connection-map-number";
-        config false;
-        leaf connection-map-number {
-          type uint32;
-          description
-            "Unique identifier for this connection-map entry";
-        }
-        container source {
-          leaf circuit-pack-name {
-            type leafref {
-              path "/org-openroadm-device/circuit-packs/circuit-pack-name";
-            }
-            mandatory true;
-          }
-          leaf port-name {
-            type leafref {
-              path "/org-openroadm-device/circuit-packs[circuit-pack-name=current()/../circuit-pack-name]/ports/port-name";
-            }
-            mandatory true;
-            description
-              "Port identifier. Unique within the context of a circuit-pack.";
-          }
-        }
-        list destination {
-          key "circuit-pack-name port-name";
-          min-elements 1;
-          leaf circuit-pack-name {
-            type leafref {
-              path "/org-openroadm-device/circuit-packs/circuit-pack-name";
-            }
-            mandatory true;
-          }
-          leaf port-name {
-            type leafref {
-              path "/org-openroadm-device/circuit-packs[circuit-pack-name=current()/../circuit-pack-name]/ports/port-name";
-            }
-            mandatory true;
-            description
-              "Port identifier. Unique within the context of a circuit-pack.";
-          }
-        }
-      }
-      list odu-switching-pools {
-        when "/org-openroadm-device/info/node-type='xpdr'";
-        key "switching-pool-number";
-        config false;
-        leaf switching-pool-number {
-          type uint16;
-          description
-            "Unique identifier for this odu-switching-pool";
-        }
-        leaf switching-pool-type {
-          type org-openroadm-switching-pool-types:switching-pool-types;
-        }
-        list non-blocking-list {
-          key "nbl-number";
-          config false;
-          description
-            "List of ports in a non-blocking switch element";
-          leaf nbl-number {
-            type uint16;
-            description
-              "Identifier for this non-blocking-list. Unique within odu-switching-pool";
-          }
-          leaf interconnect-bandwidth-unit {
-            type uint32;
-            config false;
-            description
-              "Switch fabric interconnect bandwidth unit rate in bits per second. 
-               Represents granularity of switch fabric";
-          }
-          leaf interconnect-bandwidth {
-            type uint32;
-            config false;
-            description
-              "Total interconnect bandwidth for a non-blocking element expressed as 
-               number of inter-connect-bandwidth units";
-          }
-          list port-list {
-            key "circuit-pack-name port-name";
-            leaf circuit-pack-name {
-              type leafref {
-                path "/org-openroadm-device/circuit-packs/circuit-pack-name";
-              }
-              config false;
-            }
-            leaf port-name {
-              type leafref {
-                path "/org-openroadm-device/circuit-packs/ports/port-name";
-              }
-              config false;
-              description
-                "Port name. Unique within device";
-            }
-          }
-          list pluggable-optics-holder-list {
-            key "circuit-pack-name slot-name";
-            leaf circuit-pack-name {
-              type leafref {
-                path "/org-openroadm-device/circuit-packs/circuit-pack-name";
-              }
-              config false;
-              description
-                "Name of parent circuit-pack";
-            }
-            leaf slot-name {
-              type leafref {
-                path "/org-openroadm-device/circuit-packs/cp-slots/slot-name";
-              }
-              config false;
-              description
-                "Name of pluggable-optics-holder";
-            }
-          }
-        }
-      }
-    }
-  }
-
-  grouping mc-capabilities-g {
-    container mc-capabilities {
-      config false;
-      description
-        "Capabilities of the media channel on a degree or SRG.  This is used to validate mc-ttp provisioning on degrees and SRGs.";
-      leaf slot-width-granularity {
-        type org-openroadm-common-types:frequency-GHz;
-        default "50";
-        config false;
-        description
-          "Width of a slot measured in GHz.";
-      }
-      leaf center-freq-granularity {
-        type org-openroadm-common-types:frequency-GHz;
-        default "50";
-        config false;
-        description
-          "Granularity of allowed center frequencies.  The base frequency for this computation is 193.1 THz (G.694.1)";
-      }
-      leaf min-slots {
-        type uint32;
-        default "1";
-        config false;
-        description
-          "Minimum number of slots permitted to be joined together to form a media channel.  Must be less than or equal to the max-slots";
-      }
-      leaf max-slots {
-        type uint32;
-        default "1";
-        config false;
-        description
-          "Maximum number of slots permitted to be joined together to form a media channel.  Must be greater than or equal to the min-slots";
-      }
-    }
-  }
-
-  grouping common-session-parms {
-    description
-      "Common session parameters to identify a
-       management session.";
-    leaf username {
-      type org-openroadm-user-mgmt:username-type;
-      mandatory true;
-      description
-        "Name of the user for the session.";
-    }
-    leaf session-id {
-      type ietf-nc:session-id-or-zero-type;
-      mandatory true;
-      description
-        "Identifier of the session.
-         A NETCONF session MUST be identified by a non-zero value.
-         A non-NETCONF session MAY be identified by the value zero.";
-    }
-    leaf source-host {
-      type ietf-inet-types:ip-address;
-      description
-        "Address of the remote host for the session.";
-    }
-  }
-
-  grouping changed-by-parms {
-    description
-      "Common parameters to identify the source
-       of a change event, such as a configuration
-       or capability change.";
-    container changed-by {
-      description
-        "Indicates the source of the change.
-         If caused by internal action, then the
-         empty leaf 'server' will be present.
-         If caused by a management session, then
-         the name, remote host address, and session ID
-         of the session that made the change will be reported.";
-      choice server-or-user {
-        leaf server {
-          type empty;
-          description
-            "If present, the change was caused
-             by the server.";
-        }
-        case by-user {
-          uses common-session-parms;
-        }
-      }
-    }
-  }
-
-  rpc led-control {
-    description
-      "This command is used to allow user to find an entity on the NE,
-       The specified entity will have LED blinking.
-       The equipmentLedOn alarm will be raised and cleared for the indication";
-    input {
-      choice equipment-entity {
-        mandatory true;
-        case shelf {
-          leaf shelf-name {
-            type leafref {
-              path "/org-openroadm-device/shelves/shelf-name";
-            }
-            mandatory true;
-            description
-              "shelf-name for the operation";
-          }
-        }
-        case circuit-pack {
-          leaf circuit-pack-name {
-            type leafref {
-              path "/org-openroadm-device/circuit-packs/circuit-pack-name";
-            }
-            mandatory true;
-            description
-              "circuit-pack-name for the operation";
-          }
-        }
-      }
-      leaf enabled {
-        type boolean;
-        mandatory true;
-        description
-          "led-control enabled flag.
-           when enabled=true,  equipmentLedOn alarm will be raised
-           when enabled=false, equipmentLedOn alarm will be cleared";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  rpc create-tech-info {
-    description
-      "Collects all log data for debugging and place it in a location accessible via ftp/sftp.
-       This model assumes ASYNC operation, i.e. the command will return after the device accepts the command,
-       A create-tech-info-notification will be send out later for the result of the operation.
-       The log-file is cleared at the start of every create-tech-info operation in order to ensure 
-       the up-to-date logs are collected. If a vendor does not support concurrent log collection, the second 
-       create-tech-info command will be rejected.";
-    input {
-      leaf shelf-id {
-        type leafref {
-          path "/org-openroadm-device/shelves/shelf-name";
-        }
-        description
-          "This optional field is used to specify the shelf for log collection. 
-           When this filed is not provided, it is expected to collect logs for the whole node.
-           Vendor should reject the command if the whole node log collection is not supported.";
-      }
-      leaf log-option {
-        type string;
-        description
-          "The log type a vendor can specify. Maybe used in future";
-      }
-    }
-    output {
-      uses create-tech-info-group;
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  rpc get-connection-port-trail {
-    input {
-      leaf connection-name {
-        type string;
-        mandatory true;
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-      list ports {
-        uses org-openroadm-common-types:physical-location;
-        uses port-name {
-          refine "circuit-pack-name" {
-            mandatory true;
-          }
-          refine "port-name" {
-            mandatory true;
-          }
-        }
-      }
-    }
-  }
-  rpc disable-automatic-shutoff {
-    input {
-      choice degree-or-amp {
-        mandatory true;
-        description
-          "The choice describes the option to specify the entity for the disable-automatic-shutoff RPC. It can be degree-number for rdm and amp-number for ila";
-        case degree {
-          leaf degree-number {
-            type leafref {
-              path "/org-openroadm-device/degree/degree-number";
-            }
-            mandatory true;
-            description
-              "The degree-number defined in degree";
-          }
-        }
-        case amp {
-          leaf amp-number {
-            type leafref {
-              path "/org-openroadm-device/line-amplifier/amp-number";
-            }
-            mandatory true;
-            description
-              "The amp-number defined in line-amplifier";
-          }
-        }
-      }
-      leaf support-timer {
-        type uint16 {
-          range "1..600";
-        }
-        default "20";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  rpc start-scan {
-    input {
-      choice degree-or-amp {
-        mandatory true;
-        description
-          "The choice describes the option to specify the entity for the start-scan RPC. It can be degree-number for rdm and amp-number for ila";
-        case degree {
-          leaf degree-number {
-            type leafref {
-              path "/org-openroadm-device/degree/degree-number";
-            }
-            mandatory true;
-            description
-              "The degree-number defined in degree";
-          }
-        }
-        case amp {
-          leaf amp-number {
-            type leafref {
-              path "/org-openroadm-device/line-amplifier/amp-number";
-            }
-            mandatory true;
-            description
-              "The amp-number defined in line-amplifier";
-          }
-        }
-      }
-      leaf port-direction {
-        type org-openroadm-common-types:direction;
-      }
-      leaf distance {
-        type uint32;
-      }
-      leaf resolution {
-        type uint32;
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  rpc set-current-datetime {
-    description
-      "Set the info/current-datetime leaf to the specified value.";
-    input {
-      leaf current-datetime {
-        type ietf-yang-types:date-and-time;
-        mandatory true;
-        description
-          "The current system date and time in UTC. Format: YYYY-MM-DDTHH:MM:SS";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  notification create-tech-info-notification {
-    description
-      "This Notification is sent when the create-tech-info is complete or failed.";
-    uses create-tech-info-group;
-    uses org-openroadm-common-types:rpc-response-status;
-  }
-  notification otdr-scan-result {
-    leaf status {
-      type enumeration {
-        enum "Completed" {
-          value 1;
-        }
-        enum "Failed" {
-          value 2;
-        }
-      }
-      mandatory true;
-      description
-        "Completed or Failed for the scan's final status";
-    }
-    leaf result-file {
-      type string;
-    }
-  }
-  notification change-notification {
-    description
-      "The Notification that a resource has been added, modified or removed.
-       This notification can be triggered by changes in configuration and operational data.
-       It shall contain the changed field pointed by the xpath. 
-       Typically it is not intended for frequently changing volatile data e.g. PM, power levels";
-    leaf change-time {
-      type ietf-yang-types:date-and-time;
-      description
-        "The time the change occurs.";
-    }
-    uses changed-by-parms;
-    leaf datastore {
-      type enumeration {
-        enum "running" {
-          description
-            "The <running> datastore has changed.";
-        }
-        enum "startup" {
-          description
-            "The <startup> datastore has changed";
-        }
-      }
-      default "running";
-      description
-        "Indicates which configuration datastore has changed.";
-    }
-    list edit {
-      description
-        "An edit (change) record SHOULD be present for each distinct
-         edit operation that the server has detected on
-         the target datastore.  This list MAY be omitted
-         if the detailed edit operations are not known.
-         The server MAY report entries in this list for
-         changes not made by a NETCONF session.";
-      leaf target {
-        type instance-identifier;
-        description
-          "Top most node associated with the configuration or operational change.
-           A server SHOULD set this object to the node within
-           the datastore that is being altered.  A server MAY
-           set this object to one of the ancestors of the actual
-           node that was changed, or omit this object, if the
-           exact node is not known.";
-      }
-      leaf operation {
-        type ietf-nc:edit-operation-type;
-        description
-          "Type of edit operation performed.
-           A server MUST set this object to the NETCONF edit
-           operation performed on the target datastore.";
-      }
-    }
-  }
-  uses org-openroadm-device-container;
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-device@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-device@2020-05-29.yang
deleted file mode 100644 (file)
index 5e690f5..0000000
+++ /dev/null
@@ -1,2608 +0,0 @@
-module org-openroadm-device {
-  namespace "http://org/openroadm/device";
-  prefix org-openroadm-device;
-
-  import ietf-yang-types {
-    prefix ietf-yang-types;
-    revision-date 2013-07-15;
-  }
-  import ietf-inet-types {
-    prefix ietf-inet-types;
-    revision-date 2013-07-15;
-  }
-  import ietf-netconf {
-    prefix ietf-nc;
-    revision-date 2011-06-01;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-common-alarm-pm-types {
-    prefix org-openroadm-common-alarm-pm-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-equipment-types {
-    prefix org-openroadm-common-equipment-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-state-types {
-    prefix org-openroadm-common-state-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-amplifier-types {
-    prefix org-openroadm-common-amplifier-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-link-types {
-    prefix org-openroadm-common-link-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-node-types {
-    prefix org-openroadm-common-node-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-optical-channel-types {
-    prefix org-openroadm-common-optical-channel-types;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-device-types {
-    prefix org-openroadm-device-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-resource-types {
-    prefix org-openroadm-resource-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-physical-types {
-    prefix org-openroadm-physical-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-user-mgmt {
-    prefix org-openroadm-user-mgmt;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-port-types {
-    prefix org-openroadm-port-types;
-    revision-date 2020-03-27;
-  }
-  import org-openroadm-interfaces {
-    prefix org-openroadm-interfaces;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-swdl {
-    prefix org-openroadm-swdl;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-equipment-states-types {
-    prefix org-openroadm-equipment-states-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-switching-pool-types {
-    prefix org-openroadm-switching-pool-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-optical-operational-interfaces {
-    prefix org-openroadm-optical-operational-interfaces;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-otn-common-types {
-    prefix org-openroadm-otn-common-types;
-    revision-date 2020-03-27;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of ROADM device
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF netconf.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2017-02-06 {
-    description
-      "Version 1.2.1 - removed pattern for current-datetime in info tree and rpc";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  identity connection-direction-identity {
-    description
-      "Bidrectional capable, or Bi and Unidirectional capable";
-  }
-
-  identity connection-direction_bi {
-    base connection-direction-identity;
-    description
-      "Bidrectional capable";
-  }
-
-  identity connection-direction_bi_and_uni {
-    base connection-direction-identity;
-    description
-      "Bi and Unidirectional capable";
-  }
-
-  typedef interface-ref {
-    type leafref {
-      path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface/org-openroadm-device:name";
-    }
-    description
-      "This type is used by data models that need to reference
-       configured interfaces.";
-  }
-
-  grouping create-tech-info-group {
-    leaf shelf-id {
-      type leafref {
-        path "/org-openroadm-device/shelves/shelf-name";
-      }
-      description
-        "shelf ID";
-    }
-    leaf log-file-name {
-      type string;
-      description
-        "The log file name a vendor can specify for a given log collection operation";
-    }
-  }
-
-  grouping device-common {
-    leaf node-id {
-      type org-openroadm-common-node-types:node-id-type;
-      default "openroadm";
-      description
-        "Globally unique identifier for a device.";
-    }
-    leaf node-number {
-      type uint32;
-      description
-        "Number assigned to a ROADM node at a
-         given office";
-    }
-    leaf node-type {
-      type org-openroadm-device-types:node-types;
-      config true;
-      mandatory true;
-      description
-        "Identifier for node-type e.g Roadm, xponder.
-         Once the node-type is configured, it should not be modified.";
-    }
-    leaf clli {
-      type string;
-      description
-        "Common Language Location Identifier.";
-    }
-    uses org-openroadm-physical-types:node-info;
-    leaf ipAddress {
-      type ietf-inet-types:ip-address;
-      description
-        "IP Address of device";
-    }
-    leaf prefix-length {
-      type uint8 {
-        range "0..128";
-      }
-      description
-        "The length of the subnet prefix";
-    }
-    leaf defaultGateway {
-      type ietf-inet-types:ip-address;
-      description
-        "Default Gateway";
-    }
-    leaf source {
-      type enumeration {
-        enum static {
-          value 1;
-        }
-        enum dhcp {
-          value 2;
-        }
-      }
-      config false;
-    }
-    leaf current-ipAddress {
-      type ietf-inet-types:ip-address;
-      config false;
-      description
-        "Current IP Address of device";
-    }
-    leaf current-prefix-length {
-      type uint8 {
-        range "0..128";
-      }
-      config false;
-      description
-        "The current length of the subnet prefix";
-    }
-    leaf current-defaultGateway {
-      type ietf-inet-types:ip-address;
-      config false;
-      description
-        "Current Default Gateway";
-    }
-    leaf macAddress {
-      type ietf-yang-types:mac-address;
-      config false;
-      description
-        "MAC Address of device";
-    }
-    leaf softwareVersion {
-      type string;
-      config false;
-      description
-        "Software version";
-    }
-    leaf software-build {
-      type string;
-      config false;
-      description
-        "Software build version";
-    }
-    leaf openroadm-version {
-      type org-openroadm-common-types:openroadm-version-type;
-      config false;
-      description
-        "openroadm version used on the device";
-    }
-    leaf template {
-      type string;
-      description
-        "Template information used in the deployment.";
-    }
-    leaf current-datetime {
-      type ietf-yang-types:date-and-time;
-      config false;
-      description
-        "The current system date and time in UTC. Format: YYYY-MM-DDTHH:MM:SS.mm+ ";
-    }
-    leaf lifecycle-state {
-      type org-openroadm-common-state-types:lifecycle-state;
-      description
-        "Lifecycle State of the device node. Whether it is planned, deployed, in maintenance, etc.";
-    }
-    container geoLocation {
-      description
-        "GPS location";
-      leaf latitude {
-        type decimal64 {
-          fraction-digits 16;
-          range "-90 .. 90";
-        }
-        description
-          "[From wikipedia] Latitude is an angle (defined below)
-           which ranges from 0 at the Equator to 90 (North or
-           South) at the poles";
-      }
-      leaf longitude {
-        type decimal64 {
-          fraction-digits 16;
-          range "-180 .. 180";
-        }
-        description
-          "[From wikipedia] The longitude is measured as the
-           angle east or west from the Prime Meridian, ranging
-           from 0 at the Prime Meridian to +180 eastward and
-           -180 westward.";
-      }
-    }
-  }
-
-  grouping slot-info {
-    description
-      "slots information. To be populated by NE during retrieval.";
-    leaf slot-name {
-      type string;
-      description
-        "The name of this slot.";
-    }
-    leaf label {
-      type string;
-      description
-        "Faceplate label";
-    }
-    leaf provisioned-circuit-pack {
-      type leafref {
-        path "/org-openroadm-device/circuit-packs/circuit-pack-name";
-      }
-      description
-        "The supported circuit-pack. It will be empty if holder status is empty-not-prov, or installed-not-prov";
-    }
-    leaf slot-status {
-      type enumeration {
-        enum empty-not-prov {
-          value 1;
-          description
-            "Slot is empty and not provisioned";
-        }
-        enum empty-prov-match {
-          value 2;
-          status obsolete;
-          description
-            "(Deprecated) Slot is empty and expected type is provisioned";
-        }
-        enum empty-prov-mismatch {
-          value 3;
-          status obsolete;
-          description
-            "(Deprecated) Slot is empty and an unsupported type is provisioned";
-        }
-        enum installed-not-prov {
-          value 4;
-          description
-            "Slot is occupied but not provisioned";
-        }
-        enum installed-prov-match {
-          value 5;
-          description
-            "Slot is occupied with matching provisioned type";
-        }
-        enum installed-prov-mismatch {
-          value 6;
-          description
-            "Slot is occupied with mismatched provisioned type";
-        }
-        enum empty-prov {
-          value 7;
-          description
-            "Slot is empty and provisioned";
-        }
-      }
-    }
-  }
-
-  grouping shelves {
-    list shelves {
-      key "shelf-name";
-      uses shelf;
-    }
-  }
-
-  grouping user-description-grp {
-    description
-      "user description group";
-    leaf user-description {
-      type string;
-      description
-        "user provided description";
-    }
-  }
-
-  grouping shelf {
-    leaf shelf-name {
-      type string;
-      description
-        "Unique identifier for this shelf within a device";
-    }
-    leaf shelf-type {
-      type string;
-      mandatory true;
-      description
-        "The shelf type: describe the shelf with a unique string.";
-    }
-    leaf rack {
-      type string;
-      description
-        "Reflect the shelf physical location data including floor, aisle, bay values.";
-    }
-    leaf shelf-position {
-      type string;
-      description
-        "Reflect the shelf vertical position within an equipment bay.";
-    }
-    leaf lifecycle-state {
-      type org-openroadm-common-state-types:lifecycle-state;
-      description
-        "Lifecycle State of shelf. Whether it is planned, deployed, in maintenance, etc.";
-    }
-    leaf administrative-state {
-      type org-openroadm-equipment-states-types:admin-states;
-      mandatory true;
-      description
-        "Admin State of the shelf";
-    }
-    uses org-openroadm-physical-types:common-info;
-    leaf equipment-state {
-      type org-openroadm-equipment-states-types:states;
-      description
-        "equipment state for the shelf, used to track the lifecycle state.";
-    }
-    leaf is-physical {
-      type boolean;
-      config false;
-      mandatory true;
-      description
-        "is the entity physical or logical";
-    }
-    leaf is-passive {
-      type boolean;
-      config false;
-      mandatory true;
-      description
-        "is the entity passive and not actively managed by the device;
-         e.g., no physical inventory or plug-in notification supported";
-    }
-    leaf faceplate-label {
-      type string;
-      config false;
-      mandatory true;
-      description
-        "label on the faceplace silk screening";
-    }
-    uses user-description-grp;
-    leaf due-date {
-      type ietf-yang-types:date-and-time;
-      description
-        "due date for the shelf.";
-    }
-    list slots {
-      key "slot-name";
-      config false;
-      description
-        "List of slots on this shelf. To be populated by NE during retrieval.";
-      uses slot-info;
-    }
-  }
-
-  grouping circuit-packs {
-    list circuit-packs {
-      key "circuit-pack-name";
-      description
-        "List of circuit packs. This includes common equipment, like fans, power supplies, etc.";
-      leaf circuit-pack-type {
-        type string;
-        mandatory true;
-        description
-          "Type of circuit-pack";
-      }
-      leaf circuit-pack-product-code {
-        type string;
-        description
-          "Product Code for the circuit-pack";
-      }
-      uses circuit-pack;
-    }
-  }
-
-  grouping circuit-pack-features {
-    leaf software-load-version {
-      type string;
-      config false;
-      description
-        "Software version running on the circuit pack.";
-    }
-    list circuit-pack-features {
-      config false;
-      container feature {
-        description
-          "List of features supported by the installed load and indications on whether the features have been applied or not.";
-        leaf description {
-          type string;
-          description
-            "Feature description.";
-        }
-        leaf boot {
-          type boolean;
-          description
-            "Flag to indicate boot loader or unprotected firmware update required";
-        }
-        leaf activated {
-          type boolean;
-          description
-            "Indicator if the feature has been activated.";
-        }
-      }
-    }
-    list circuit-pack-components {
-      config false;
-      container component {
-        description
-          "Optional list of components on the circuit-pack and the load information applicable to those components.  If a load is not up to date and will upgrade when a cold restart occurs, the version that will be applied should also be listed.  If there is no misalignment, this does not need to be reported.";
-        leaf name {
-          type string;
-          description
-            "Name of a component on the circuit-pack that can have a load applied to it.";
-        }
-        leaf boot {
-          type boolean;
-          description
-            "Flag to indicate boot loader or unprotected firmware update required";
-        }
-        leaf current-version {
-          type string;
-          description
-            "Name of the load version currently running on the component.";
-        }
-        leaf version-to-apply {
-          type string;
-          description
-            "Name of the load version for the component that will be applied when cold restart occurs on the circuit-pack.";
-        }
-      }
-    }
-  }
-
-  grouping circuit-pack {
-    leaf circuit-pack-name {
-      type string;
-      description
-        "Unique identifier for this circuit-pack within a device";
-    }
-    leaf lifecycle-state {
-      type org-openroadm-common-state-types:lifecycle-state;
-      description
-        "Lifecycle State of circuit-pack. Whether it is planned, deployed, in maintenance, etc.";
-    }
-    leaf administrative-state {
-      type org-openroadm-equipment-states-types:admin-states;
-      mandatory true;
-      description
-        "Administrative state of circuit-pack";
-    }
-    uses org-openroadm-physical-types:common-info;
-    container circuit-pack-category {
-      config false;
-      description
-        "General type of circuit-pack";
-      uses org-openroadm-common-equipment-types:equipment-type;
-    }
-    leaf equipment-state {
-      type org-openroadm-equipment-states-types:states;
-      description
-        "Equipment state, which complements operational state.";
-    }
-    leaf circuit-pack-mode {
-      type string;
-      default "NORMAL";
-      description
-        "Circuit-pack mode allowed. e.g. NORMAL or REGEN";
-    }
-    leaf shelf {
-      type leafref {
-        path "/org-openroadm-device/shelves/shelf-name";
-      }
-      mandatory true;
-    }
-    leaf slot {
-      type string;
-      mandatory true;
-    }
-    leaf subSlot {
-      type string;
-      mandatory false;
-    }
-    leaf is-pluggable-optics {
-      type boolean;
-      config false;
-      mandatory true;
-      description
-        "True if circuitpack is pluggable optics";
-    }
-    leaf is-physical {
-      type boolean;
-      config false;
-      mandatory true;
-      description
-        "is the entity physical or logical";
-    }
-    leaf is-passive {
-      type boolean;
-      config false;
-      mandatory true;
-      description
-        "is the entity passive and not actively managed by the device;
-         e.g., no physical inventory or plug-in notification supported";
-    }
-    leaf faceplate-label {
-      type string;
-      config false;
-      mandatory true;
-      description
-        "label on the faceplace silk screening";
-    }
-    uses user-description-grp;
-    leaf due-date {
-      type ietf-yang-types:date-and-time;
-      description
-        "due date for this circuit-pack.";
-    }
-    container parent-circuit-pack {
-      description
-        "In the case of circuit packs that contain other equipment (modules or pluggables), this captures the hierarchy of that equipment.  It is a vendor specific design decision if the ports for single-port pluggables are modeled as children of the parent circuit-pack, or as children of the pluggable circuit-pack contained in the parent circuit-pack.  For modules with multiple ports, it is recommended that ports be children of the module and not the carrier, to help in fault correlation and isolation in the case of a module failure.";
-      uses circuit-pack-name;
-      leaf cp-slot-name {
-        type string;
-        description
-          "Slot name on parent-circuit-pack.";
-      }
-    }
-    list cp-slots {
-      key "slot-name";
-      config false;
-      description
-        "List of circuit-pack slots on this circuit-pack. To be populated by NE during retrieval.";
-      uses slot-info;
-      leaf slot-type {
-        type enumeration {
-          enum pluggable-optics-holder {
-            value 1;
-            description
-              "slot accepts dedicated pluggable port circuit-pack";
-          }
-          enum other {
-            value 2;
-            description
-              "slot accepts parent circuit-pack";
-          }
-        }
-      }
-    }
-    uses circuit-pack-features;
-    list ports {
-      key "port-name";
-      description
-        "List of ports on this circuit-pack. Note that pluggables are considered independent circuit-packs.  All ports that are physically present on a pluggable, need to be modeled as a port against that pluggable circuit-pack, and not against the parent circuit-pack.";
-      uses port;
-      container roadm-port {
-        when "../port-qual='roadm-external'";
-        uses org-openroadm-port-types:roadm-port;
-      }
-      container transponder-port {
-        when "../port-qual='xpdr-network' or ../port-qual='xpdr-client' or ../port-qual='switch-network' or ../port-qual='switch-client'";
-        uses org-openroadm-port-types:common-port;
-      }
-      container otdr-port {
-        when "../port-qual='otdr'";
-        description
-          "Settings for otdr port.";
-        leaf launch-cable-length {
-          type uint32;
-          units "m";
-          default "30";
-        }
-        leaf port-direction {
-          type org-openroadm-common-alarm-pm-types:direction;
-        }
-      }
-      container ila-port {
-        when "../port-qual='ila-external'";
-        uses org-openroadm-port-types:common-port;
-      }
-    }
-  }
-
-  grouping odu-connection {
-    description
-      "Grouping used to define odu-connections.";
-    leaf connection-name {
-      type string;
-      description
-        "roadm-connection and odu-connection share the same resource-type and resource definition (e.g. connection)";
-    }
-    leaf direction {
-      type enumeration {
-        enum unidirectional {
-          value 1;
-        }
-        enum bidirectional {
-          value 2;
-        }
-      }
-      default "bidirectional";
-      description
-        "Directionality of connection. If bidirectional, both directions are created.";
-    }
-    container source {
-      leaf src-if {
-        type leafref {
-          path "/org-openroadm-device/interface/name";
-        }
-        mandatory true;
-      }
-    }
-    container destination {
-      leaf dst-if {
-        type leafref {
-          path "/org-openroadm-device/interface/name";
-        }
-        mandatory true;
-      }
-    }
-  }
-
-  grouping connection {
-    description
-      "Grouping used to define connections.";
-    leaf connection-name {
-      type string;
-    }
-    leaf opticalControlMode {
-      type org-openroadm-common-link-types:optical-control-mode;
-      default "off";
-      description
-        "Whether connection is currently in power or gain/loss mode";
-      reference
-        "openroadm.org: Open ROADM MSA Specification.";
-    }
-    leaf target-output-power {
-      type org-openroadm-common-link-types:power-dBm;
-      description
-        "The output target power for this connection. When set, the ROADM will work to ensure that current-output-power reaches this level.";
-    }
-    container source {
-      leaf src-if {
-        type leafref {
-          path "/org-openroadm-device/interface/name";
-        }
-        mandatory true;
-      }
-    }
-    container destination {
-      leaf dst-if {
-        type leafref {
-          path "/org-openroadm-device/interface/name";
-        }
-        mandatory true;
-      }
-    }
-  }
-
-  grouping mc-capabilities-grp {
-    description
-      "Media channel capabilities grouping";
-    leaf-list mc-capability-profile-name {
-      type leafref {
-        path "/org-openroadm-device/mc-capability-profile/profile-name";
-      }
-      config false;
-      description
-        "Media channel capabilities";
-    }
-  }
-
-  grouping degree {
-    leaf degree-number {
-      type uint16;
-      description
-        "Degree number should be greater than zero and not greater than max-degrees";
-    }
-    leaf lifecycle-state {
-      type org-openroadm-common-state-types:lifecycle-state;
-      description
-        "Lifecycle State of degree. Whether it is planned, deployed, in maintenance, etc.";
-    }
-    leaf max-wavelengths {
-      type uint16;
-      config false;
-      mandatory true;
-      description
-        "maximum number of wavelengths";
-    }
-    list circuit-packs {
-      key "index";
-      description
-        "list for Cards associated with a degree";
-      leaf index {
-        type uint32;
-      }
-      uses circuit-pack-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-      }
-    }
-    list connection-ports {
-      key "index";
-      description
-        "Port associated with degree: One if bi-directional; two if uni-directional";
-      leaf index {
-        type uint32;
-      }
-      uses port-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-        refine "port-name" {
-          mandatory true;
-        }
-      }
-    }
-    container otdr-port {
-      description
-        "otdr port associated with degree.";
-      uses port-name;
-    }
-    uses mc-capabilities-grp;
-  }
-
-  grouping amplifier {
-    leaf amp-number {
-      type uint8 {
-        range "1..128";
-      }
-      description
-        "Unique identifier/number for the amplifier entry which corresponds to a logical amplifier";
-    }
-    leaf amp-type {
-      type org-openroadm-common-amplifier-types:amplifier-types;
-      config false;
-      mandatory true;
-      description
-        "Amplifier type";
-    }
-    leaf control-mode {
-      type org-openroadm-common-amplifier-types:line-amplifier-control-mode;
-      default "off";
-      description
-        "Whether the line amplifier is currently in off or gainLoss mode. control-mode can only be set to gainLoss when target-gain, target-tilt and egress-average-channel-power are set and the OMS interfaces are provisioned. The amplifier will be turned off when the control-mode is set to off";
-    }
-    leaf amp-gain-range {
-      type org-openroadm-common-amplifier-types:amplifier-gain-range;
-      default "gain-range-1";
-      config false;
-      description
-        "Amplifier gain-range (gain-range 1 to 4 for switched gain amplifiers)
-         gain-range-1 (default value) for standard amplifiers";
-    }
-    leaf target-gain {
-      type org-openroadm-common-link-types:ratio-dB;
-      config true;
-      description
-        "Target overall Amplifier Signal gain, excluding ASE, including VOA attenuation.
-         Defined as optional for ODL support, but shall be considered as mandatory and provided
-         by the controller when the control-mode is set to gainLoss for amplifier setting";
-    }
-    leaf target-tilt {
-      type org-openroadm-common-link-types:ratio-dB;
-      config true;
-      description
-        "Target tilt configured in case of smart EDFA.
-         Tilt value provided as specified in Open-ROADM-MSA-specifications spreadsheet
-         Defined as optional for ODL support, but shall be considered as mandatory and provided
-         by the controller when the control-mode is set to gainLoss for amplifier setting";
-    }
-    leaf egress-average-channel-power {
-      type org-openroadm-common-link-types:power-dBm;
-      config true;
-      description
-        "Based upon the total max power across the 4.8 THz passband.
-         Defined as optional for ODL support, but shall be considered as mandatory and provided
-         by the controller when the control-mode is set to gainLoss for amplifier setting";
-    }
-    leaf out-voa-att {
-      type org-openroadm-common-link-types:ratio-dB;
-      config false;
-      description
-        "Used to provide the value output VOA attenuation, optional";
-    }
-    leaf partner-amp {
-      type leafref {
-        path "/org-openroadm-device/line-amplifier/amp-number";
-      }
-      config false;
-      description
-        "amp-number of amp module that is functionally associated to the amplifier
-         in the opposite direction";
-    }
-    leaf ila-direction-label {
-      type string;
-      description
-        "Amplifier direction. Each operators may have its own naming convention.
-         Shall be consistent with tx-instance-port-direction-label and rx-instance-port-direction-label.";
-    }
-    leaf lifecycle-state {
-      type org-openroadm-common-state-types:lifecycle-state;
-      description
-        "Lifecycle State of the amplifier. Whether it is planned, deployed, in maintenance, etc.";
-    }
-  }
-
-  grouping external-links {
-    description
-      "YANG definitions for external links..
-       - physical links between ROADMs and between the ROADMs and XPonders, which can be added and removed manually.";
-    list external-link {
-      key "external-link-name";
-      uses external-link;
-    }
-  }
-
-  grouping external-link {
-    leaf external-link-name {
-      type string;
-    }
-    container source {
-      uses org-openroadm-resource-types:device-id {
-        refine "node-id" {
-          mandatory true;
-        }
-      }
-      uses org-openroadm-resource-types:port-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-        refine "port-name" {
-          mandatory true;
-        }
-      }
-    }
-    container destination {
-      uses org-openroadm-resource-types:device-id {
-        refine "node-id" {
-          mandatory true;
-        }
-      }
-      uses org-openroadm-resource-types:port-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-        refine "port-name" {
-          mandatory true;
-        }
-      }
-    }
-  }
-
-  grouping internal-links {
-    list internal-link {
-      key "internal-link-name";
-      config false;
-      uses internal-link;
-    }
-  }
-
-  grouping internal-link {
-    leaf internal-link-name {
-      type string;
-    }
-    container source {
-      uses port-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-        refine "port-name" {
-          mandatory true;
-        }
-      }
-    }
-    container destination {
-      uses port-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-        refine "port-name" {
-          mandatory true;
-        }
-      }
-    }
-  }
-
-  grouping physical-links {
-    description
-      "YANG definitions for physical links.
-       - physical links (fiber, cables,etc.) between ports within a node. ";
-    list physical-link {
-      key "physical-link-name";
-      uses physical-link;
-    }
-  }
-
-  grouping physical-link {
-    leaf physical-link-name {
-      type string;
-    }
-    leaf is-physical {
-      type boolean;
-      description
-        "is the entity physical or logical";
-    }
-    uses user-description-grp;
-    container source {
-      uses port-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-        refine "port-name" {
-          mandatory true;
-        }
-      }
-    }
-    container destination {
-      uses port-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-        refine "port-name" {
-          mandatory true;
-        }
-      }
-    }
-    leaf lifecycle-state {
-      type org-openroadm-common-state-types:lifecycle-state;
-      description
-        "Lifecycle State of the physical link. Whether it is planned, deployed, in maintenance, etc.";
-    }
-  }
-
-  grouping srg {
-    leaf max-add-drop-ports {
-      type uint16;
-      config false;
-      mandatory true;
-      description
-        "The max number of ports available for a given srg";
-    }
-    leaf current-provisioned-add-drop-ports {
-      type uint16;
-      config false;
-      mandatory true;
-      description
-        "The number of ports currently provisioned for a given srg.";
-    }
-    leaf srg-number {
-      type uint16;
-      description
-        "Srg number should be greater than zero and not greater than max-srgs";
-    }
-    leaf lifecycle-state {
-      type org-openroadm-common-state-types:lifecycle-state;
-      description
-        "Lifecycle State of shared-risk-group. Whether it is planned, deployed, in maintenance, etc.";
-    }
-    leaf wavelength-duplication {
-      type org-openroadm-common-optical-channel-types:wavelength-duplication-type;
-      config false;
-      mandatory true;
-      description
-        "Whether the SRG can handle duplicate wavelengths and if so to what extent.";
-    }
-    list circuit-packs {
-      key "index";
-      description
-        "list for Cards associated with an add/drop group and srg";
-      leaf index {
-        type uint32;
-      }
-      uses circuit-pack-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-      }
-    }
-    uses mc-capabilities-grp;
-  }
-
-  grouping xponder {
-    leaf xpdr-number {
-      type uint16;
-      must 'current() > 0' {
-        error-message "Xponder not supported by device ";
-        description
-          "Validating if the Xponder is supported by device";
-      }
-    }
-    leaf xpdr-type {
-      type org-openroadm-device-types:xpdr-node-types;
-      mandatory true;
-      description
-        "Identifier for xponder-type e.g Transponder, Muxponder";
-    }
-    leaf lifecycle-state {
-      type org-openroadm-common-state-types:lifecycle-state;
-      description
-        "Lifecycle State of xponder. Whether it is planned, deployed, in maintenance, etc.";
-    }
-    leaf recolor {
-      type boolean;
-      config false;
-      description
-        "Indication if recolor is supported";
-    }
-    list xpdr-port {
-      key "index";
-      description
-        "Network Ports with in a Xponder";
-      leaf index {
-        type uint32;
-      }
-      uses port-name {
-        refine "circuit-pack-name" {
-          mandatory true;
-        }
-        refine "port-name" {
-          mandatory true;
-        }
-      }
-      leaf eqpt-srg-id {
-        type uint32;
-        description
-          "Shared Risk Group identifier. All ports in a circuit-pack will have same srg-id";
-      }
-    }
-  }
-
-  grouping degree-number {
-    leaf degree-number {
-      type leafref {
-        path "/org-openroadm-device/degree/degree-number";
-      }
-      description
-        "Degree identifier. Unique within the context of a device.";
-    }
-  }
-
-  grouping circuit-pack-name {
-    leaf circuit-pack-name {
-      type leafref {
-        path "/org-openroadm-device/circuit-packs/circuit-pack-name";
-      }
-      description
-        "Circuit-Pack identifier. Unique within the context of a device.";
-    }
-  }
-
-  grouping port-name {
-    uses circuit-pack-name;
-    leaf port-name {
-      type leafref {
-        path "/org-openroadm-device/circuit-packs[circuit-pack-name=current()/../circuit-pack-name]/ports/port-name";
-      }
-      description
-        "Port identifier. Unique within the context of a circuit-pack.";
-    }
-  }
-
-  grouping srg-number {
-    leaf srg-number {
-      type leafref {
-        path "/org-openroadm-device/shared-risk-group/srg-number";
-      }
-      description
-        "Shared Risk Group identifier. Unique within the context of a device.";
-    }
-  }
-
-  grouping supporting-port-name {
-    leaf supporting-circuit-pack-name {
-      type leafref {
-        path "/org-openroadm-device/circuit-packs/circuit-pack-name";
-      }
-      description
-        "Identifier of the supporting circuit-pack.";
-    }
-    leaf supporting-port {
-      type leafref {
-        path "/org-openroadm-device/circuit-packs[circuit-pack-name=current()/../supporting-circuit-pack-name]/ports/port-name";
-      }
-      description
-        "Identifier of the supporting port.";
-    }
-  }
-
-  grouping supporting-circuit-pack-list-grp {
-    description
-      "supporting circuit pack list grouping";
-    list supporting-port-list {
-      key "index";
-      description
-        "supporting port list";
-      leaf index {
-        type uint8;
-        description
-          "supporting circuit pack index";
-      }
-      leaf circuit-pack-name {
-        type leafref {
-          path "/org-openroadm-device/circuit-packs/circuit-pack-name";
-        }
-        mandatory true;
-        description
-          "The supported circuit-pack.";
-      }
-      leaf-list port-list {
-        type leafref {
-          path "/org-openroadm-device/circuit-packs[circuit-pack-name=current()/../circuit-pack-name]/ports/port-name";
-        }
-        description
-          "port list";
-      }
-    }
-  }
-
-  grouping interface-name {
-    description
-      "interface name grouping";
-    leaf interface-name {
-      type leafref {
-        path "/org-openroadm-device/interface/name";
-      }
-      config false;
-      description
-        "Name of an interface. Unique within the context of a device.";
-    }
-  }
-
-  grouping interfaces-grp {
-    description
-      "OpenROADM Interface configuration parameters.";
-    list interface {
-      key "name";
-      description
-        "The list of configured interfaces on the device.";
-      leaf name {
-        type string;
-        description
-          "The name of the interface.";
-      }
-      leaf description {
-        type string;
-        description
-          "A textual description of the interface.";
-      }
-      leaf type {
-        type identityref {
-          base org-openroadm-interfaces:interface-type;
-        }
-        mandatory true;
-        description
-          "The type of the interface.";
-      }
-      leaf lifecycle-state {
-        type org-openroadm-common-state-types:lifecycle-state;
-        description
-          "Lifecycle State of interface. Whether it is planned, deployed, in maintenance, etc.";
-      }
-      leaf administrative-state {
-        type org-openroadm-equipment-states-types:admin-states;
-        mandatory true;
-      }
-      leaf operational-state {
-        type org-openroadm-common-state-types:state;
-        config false;
-        mandatory true;
-      }
-      leaf circuit-id {
-        type string {
-          length "0..45";
-        }
-        description
-          "circuit identifier/user label,
-           can be used in alarm correlation and/or connection management ";
-      }
-      uses supporting-port-name;
-      leaf-list supporting-interface-list {
-        type leafref {
-          path "/org-openroadm-device/interface/name";
-        }
-        description
-          "supporting interface list";
-      }
-    }
-  }
-
-  grouping protection-groups {
-    description
-      "OpenROADM facility protection configuration parameters.";
-    container protection-grps {
-      description
-        "The list of configured protection groups on the device.";
-    }
-  }
-
-  grouping port {
-    description
-      "Grouping of attributes related to a port object.";
-    leaf port-name {
-      type string;
-      mandatory true;
-      description
-        "Identifier for a port, unique within a circuit pack";
-    }
-    uses supporting-circuit-pack-list-grp;
-    leaf port-type {
-      type string;
-      description
-        "Type of the pluggable or fixed port.";
-    }
-    leaf port-qual {
-      type org-openroadm-device-types:port-qual;
-    }
-    leaf port-wavelength-type {
-      type org-openroadm-port-types:port-wavelength-types;
-      config false;
-      description
-        "Type of port - single, multiple-wavelength, etc.";
-    }
-    leaf port-direction {
-      type org-openroadm-common-alarm-pm-types:direction;
-      config false;
-      mandatory true;
-      description
-        "Whether port is uni (tx/rx) or bi-directional and";
-    }
-    leaf is-physical {
-      type boolean;
-      config false;
-      mandatory true;
-      description
-        "is the entity physical or logical";
-    }
-    leaf faceplate-label {
-      type string;
-      config false;
-      mandatory true;
-      description
-        "label on the faceplace silk screening";
-    }
-    uses user-description-grp;
-    leaf circuit-id {
-      type string {
-        length "0..45";
-      }
-      description
-        "circuit identifier/user label,
-         can be used in alarm correlation and/or connection management ";
-    }
-    leaf lifecycle-state {
-      type org-openroadm-common-state-types:lifecycle-state;
-      description
-        "Lifecycle State of port. Whether it is planned, deployed, in maintenance, etc.";
-    }
-    leaf administrative-state {
-      type org-openroadm-equipment-states-types:admin-states;
-      default "outOfService";
-      description
-        "Administrative state of port. The value of this field independent of the state of its contained and containing resources.  Setting this a port to administratively down will impact both its operational state, as well the operational state of its contained resources.  If this port is an endpoint to a connection, internal-link, physical-link, etc, then administratively disabling this port will impact the operational state of those items unless they are using some form of port-protection schema.";
-    }
-    leaf operational-state {
-      type org-openroadm-common-state-types:state;
-      config false;
-      mandatory true;
-      description
-        "Operational state of a port";
-    }
-    leaf logical-connection-point {
-      type string;
-      description
-        "delete or replace with list logical-ports or connections?";
-    }
-    container partner-port {
-      config false;
-      description
-        "For ports which are not identified as having a direction of bidirectional, this field is used to identify the port which corresponds to the reverse direction. A port pair should include a port for each direction (tx, rx) and report their mate as partner-port.";
-      uses port-name;
-    }
-    container parent-port {
-      config false;
-      description
-        "In the case of port hierarchy, this is the parent port, which is also modeled as port within this circuit-pack. This is used in the case of a port that supports a parallel connector that contains subports.  The parent-port of the subport will be the port that contains this subport.  This can be used to help isolate faults when a single fault on a parallel connector introduces symptomatic failures on the contained subports.";
-      uses port-name;
-    }
-    list interfaces {
-      config false;
-      description
-        "List of the interfaces this port supports.  This is a list of names of instances in the flat instance list.  Implementations must provide the list of interfaces for port that has interfaces provisioned on that port.";
-      uses interface-name;
-    }
-    uses mc-capabilities-grp;
-  }
-
-  grouping odu-mux-hierarchy-grp {
-    description
-      "ODU mux hierarchy group";
-    list mux-capability {
-      key "stage-number ho-odu-type ho-odu-payload-type";
-      description
-        "low order ODU TCM direction capability";
-      leaf stage-number {
-        type uint8 {
-          range "1 .. 2";
-        }
-        description
-          "stage number";
-      }
-      leaf ho-odu-type {
-        type identityref {
-          base org-openroadm-otn-common-types:odu-rate-identity;
-        }
-        description
-          "High order ODU type";
-      }
-      leaf ho-odu-payload-type {
-        type org-openroadm-otn-common-types:payload-type-def;
-        description
-          "High order ODU payload type";
-      }
-      leaf-list supported-lo-odu-type {
-        type identityref {
-          base org-openroadm-otn-common-types:odu-rate-identity;
-        }
-        description
-          "Supported low order ODU type";
-      }
-      leaf lo-odu-proactive-DMp {
-        type boolean;
-        description
-          "low order ODU PM delay measurement (DMp) (G.709 06-2016 15.8.2.1.6)";
-      }
-      leaf lo-odu-tcm-capable {
-        type boolean;
-        description
-          "only when lo-odu-tcm-capable=true, the following two are applicable (ie, lo-odu-proactive-DMt, lo-odu-tcm-direction";
-      }
-      leaf lo-odu-proactive-DMt {
-        when "../lo-odu-tcm-capable= 'true'";
-        type boolean;
-        description
-          "low order ODU TCM delay measurement (DMt) (G.709 06-2016 15.8.2.2.8)";
-      }
-      leaf lo-odu-tcm-direction-capability {
-        when "../lo-odu-tcm-capable= 'true'";
-        type org-openroadm-common-types:tcm-direction-capability-type;
-        description
-          "Supported tcm direction capability for low order ODU associated with the port.";
-      }
-    }
-  }
-
-  identity flexo-modulation-format-identity {
-    description
-      "Flexo modulation format identification";
-  }
-
-  grouping flexo-grp {
-    description
-      "Flexo group";
-    leaf circuit-pack-name {
-      type leafref {
-        path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:circuit-packs/org-openroadm-device:circuit-pack-name";
-      }
-      description
-        "Circuit-Pack identifier. Unique within the context of a device.";
-    }
-    leaf port-name {
-      type leafref {
-        path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:circuit-packs/org-openroadm-device:ports/org-openroadm-device:port-name";
-      }
-      description
-        "Port index identifier. Unique within the context of a circuit-pack.";
-    }
-
-    uses org-openroadm-common-types:fec-grouping {
-      status deprecated;
-      description
-        "Flexo FEC / Forward Error Correction";
-    }
-
-    leaf otsi-rate {
-      type identityref {
-        base org-openroadm-common-optical-channel-types:otsi-rate-identity;
-      }
-      mandatory true;
-      description
-        "Flexo rate";
-    }
-    leaf otsi-modulation-format {
-      type identityref {
-        base flexo-modulation-format-identity;
-      }
-      description
-        "Flexo modulation format";
-    }
-    leaf otsi-width {
-      type uint16;
-      description
-        "OTSI width";
-    }
-    leaf operational-mode-id {
-      type string;
-      mandatory true;
-      description
-        "Optical profile operational mode identifier";
-    }
-  }
-
-  grouping otsigroup-capability-grp {
-    description
-      "Otsigroup group capability";
-    leaf if-cap-type {
-      type identityref {
-        base org-openroadm-port-types:supported-if-capability;
-      }
-      description
-        "Interface type/hierarchy/rate supported on this Otsi port. For example, if-n-otu4-n-odu4 and if-otucn-oducn";
-    }
-    choice otu-rate {
-      description
-        "To specify the supported rate in the case of OTUCn or NxOTU4";
-      case otucn {
-        leaf otucn-n-rate {
-          type uint16;
-          description
-            "Specify the N associated with OTUCn, e.g. N = 2,3,4 for 200G/300G/400G respectively";
-        }
-      }
-      case nxotu4 {
-        leaf supported-n-otu4 {
-          type uint16;
-          description
-            "Specify the number of N in the case of N x OTU4";
-        }
-      }
-    }
-    leaf-list foic-type {
-      type identityref {
-        base org-openroadm-common-optical-channel-types:foic-identity;
-      }
-      description
-        "FlexO interface type ";
-    }
-    leaf otn-capability-profile-name {
-      type leafref {
-        path "/org-openroadm-device/otn-capability-profile/profile-name";
-      }
-      description
-        "OTN capabilities";
-    }
-    leaf otn-odu-mux-hierarchy-profile-name {
-      type leafref {
-        path "/org-openroadm-device/otn-odu-mux-hierarchy-profile/profile-name";
-      }
-      description
-        "OTN ODU Mux hierarchy capabilities";
-    }
-  }
-
-  grouping split-lambda-capability-grp {
-    description
-      "Split lambda capability group";
-    container logical-port {
-      leaf circuit-pack-name {
-        type string;
-        description
-          "The circuit pack supporting the logical port";
-      }
-      leaf port-name {
-        type string;
-        description
-          "Port name for logical-port";
-      }
-      description
-        "Logical port container";
-    }
-    list otsi {
-      key "circuit-pack-name port-name";
-      description
-        "OTSI list for split lambda";
-      leaf circuit-pack-name {
-        type string;
-        description
-          "OTSI circuit pack name";
-      }
-      leaf port-name {
-        type string;
-        description
-          "OTSI port name";
-      }
-      leaf otsi-rate {
-         type identityref {
-           base org-openroadm-common-optical-channel-types:otsi-rate-identity;
-         }
-         description
-           "OTSI rate";
-      }
-      leaf-list optical-operational-mode {
-        type leafref {
-          path "/org-openroadm-device/optical-operational-mode-profile/profile-name";
-        }
-        description
-          "Optical operational mode leaf list";
-      }
-    }
-    leaf-list otsigroup-capability-profile-name {
-      type leafref {
-        path "/org-openroadm-device/otsigroup-capability-profile/profile-name";
-      }
-      description
-        "OTSI group capability mode";
-    }
-  }
-
-  grouping otn-capability-grp {
-    description
-      "OTN capability group";
-    leaf-list if-protection-capability {
-      type identityref {
-        base org-openroadm-common-types:otn-protection-type;
-      }
-      description
-        "supported protection types if protection is supported on this port";
-    }
-    leaf proactive-DMp {
-      type boolean;
-      description
-        "ODU PM delay measurement (DMp) (G.709 06-2016 15.8.2.1.6)";
-    }
-    leaf tcm-capable {
-      type boolean;
-      description
-        "only when tcm-capable=true, the following two are applicable (ie, proactive-DMt, tcm-direction";
-    }
-    leaf proactive-DMt {
-      when "../tcm-capable= 'true'";
-      type boolean;
-      description
-        "ODU TCM delay measurement (DMt) (G.709 06-2016 15.8.2.2.8)";
-    }
-    leaf tcm-direction-capability {
-      when "../tcm-capable= 'true'";
-      type org-openroadm-common-types:tcm-direction-capability-type;
-      description
-        "Supported tcm direction capability on the ODUk associated with the port.";
-    }
-    leaf-list opu-payload-type-mapping {
-      type org-openroadm-otn-common-types:payload-type-def;
-      description
-        "OPU payload-type mapping OPU.";
-    }
-  }
-
-  grouping otn-odu-mux-hierarchy-grp {
-    description
-      "ODU mux hierarchy base group";
-     list mux-capability {
-       key "stage-number ho-odu-type ho-odu-payload-type";
-       description
-         "low order ODU TCM direction capability";
-       leaf stage-number {
-         type uint8 {
-           range "1 .. 2";
-         }
-         description
-           "stage number";
-       }
-       leaf ho-odu-type {
-         type identityref {
-           base org-openroadm-otn-common-types:odu-rate-identity;
-         }
-         description
-           "High order ODU type";
-       }
-       leaf ho-odu-payload-type {
-         type org-openroadm-otn-common-types:payload-type-def;
-         description
-           "High order ODU payload type";
-       }
-       leaf-list supported-lo-odu-type {
-         type identityref {
-           base org-openroadm-otn-common-types:odu-rate-identity;
-         }
-         description
-           "Supported low order ODU type";
-       }
-       leaf lo-odu-proactive-DMp {
-         type boolean;
-         description
-           "low order ODU PM delay measurement (DMp) (G.709 06-2016 15.8.2.1.6)";
-       }
-       leaf lo-odu-tcm-capable {
-         type boolean;
-         description
-           "only when lo-odu-tcm-capable=true, the following two are applicable (ie, lo-odu-proactive-DMt, lo-odu-tcm-direction";
-       }
-       leaf lo-odu-proactive-DMt {
-         when "../lo-odu-tcm-capable= 'true'";
-         type boolean;
-         description
-           "low order ODU TCM delay measurement (DMt) (G.709 06-2016 15.8.2.2.8)";
-       }
-       leaf lo-odu-tcm-direction-capability {
-         when "../lo-odu-tcm-capable= 'true'";
-         type org-openroadm-common-types:tcm-direction-capability-type;
-         description
-           "Supported tcm direction capability for low order ODU associated with the port.";
-       }
-    }
-  }
-
-  grouping mux-grp {
-    leaf odtu-type {
-      type identityref {
-        base org-openroadm-otn-common-types:odtu-type-identity;
-      }
-      mandatory true;
-      description
-        "ODTU type, part of the MSI (Multiplex Structure Identifier)";
-    }
-    leaf network-odu-rate {
-       type identityref {
-       base org-openroadm-otn-common-types:odu-rate-identity;
-      }
-      mandatory true;
-      description
-        "Network ODU rate";
-    }
-    leaf network-oducn-n-rate {
-      type uint16;
-      description
-        "Network ODUCn rate, eg, network-oducn-n-rate=4 for ODUC4";
-    }
-    leaf network-ho-odu-trib-port-number {
-      type uint16 {
-        range "1 .. 80";
-      }
-      mandatory true;
-      description
-        "Tributary port number";
-    }
-    leaf-list network-ho-odu-trib-slots {
-      type uint16 {
-        range "1 .. 80";
-      }
-      min-elements 1;
-      max-elements 80;
-      description
-        "Network high order ODU trib slots";
-    }
-    leaf-list network-ho-odu-opucn-trib-slots {
-      type org-openroadm-otn-common-types:opucn-trib-slot-def;
-      description
-        "Network high order ODU OPU tributary slots";
-    }
-    description
-      "Mux group grouping";
-  }
-
-  grouping org-openroadm-device-container {
-    container org-openroadm-device {
-      container info {
-        uses device-common;
-        leaf max-degrees {
-          type uint16;
-          config false;
-          description
-            "Max. number of degrees supported by device";
-        }
-        leaf max-srgs {
-          type uint16;
-          config false;
-          description
-            "Max. number of SRGs in an add/drop group";
-        }
-        leaf max-num-bin-15min-historical-pm {
-          type uint16;
-          config false;
-          description
-            "Max. number of bin the NE support for 15min historical PM";
-        }
-        leaf max-num-bin-24hour-historical-pm {
-          type uint16;
-          config false;
-          description
-            "Max. number of bin the NE support for 24hour historical PM";
-        }
-      }
-      container users {
-        description
-          "Stores a list of users";
-        uses org-openroadm-user-mgmt:user-profile;
-      }
-      container pending-sw {
-        config false;
-        description
-          "pending software information";
-        uses org-openroadm-swdl:sw-bank;
-      }
-      container database-info {
-        config false;
-        description
-          "database restore information";
-        uses org-openroadm-swdl:database-info-group;
-      }
-      uses shelves;
-      uses circuit-packs;
-      uses interfaces-grp;
-      uses protection-groups;
-      container protocols {
-        description
-          "Contains the supported protocols";
-        leaf lifecycle-state {
-          type org-openroadm-common-state-types:lifecycle-state;
-          description
-            "Lifecycle State of the protocols. Whether it is planned or deployed, etc.";
-        }
-      }
-      uses internal-links;
-      uses physical-links;
-      uses external-links;
-      list degree {
-        when "/org-openroadm-device/info/node-type='rdm'";
-        key "degree-number";
-        uses degree;
-      }
-      list shared-risk-group {
-        when "/org-openroadm-device/info/node-type='rdm'";
-        key "srg-number";
-        uses srg;
-      }
-      list line-amplifier {
-        when "/org-openroadm-device/info/node-type='ila'";
-        key "amp-number";
-        description
-          "lists amplifiers in different directions";
-        uses amplifier;
-        list circuit-pack {
-          key "index";
-          description
-            "list for Cards associated with an amplifier";
-          leaf index {
-            type uint32;
-          }
-          uses circuit-pack-name {
-            refine "circuit-pack-name" {
-              mandatory true;
-            }
-          }
-        }
-        list line-port {
-          key "port-direction";
-          description
-            "Port associated with an amplifier which face the line (ila-external): traffic port.";
-          leaf port-direction {
-            type org-openroadm-common-alarm-pm-types:direction;
-            config true;
-            mandatory true;
-            description
-              "partly allows identifying ports associated with logical amp :TX for egress, RX for ingress
-               TXRX in case of bidirectional port";
-          }
-          leaf tx-instance-port-direction-label {
-            type string;
-            config true;
-            description
-              "Complements ports identification. Used notably in case of bidirectional ports,
-               and/or in multi-degree amplifier nodes. Allows associating one of the directions
-               specified in ila-direction-label. Shall be consistent with ila-direction-label";
-          }
-          leaf rx-instance-port-direction-label {
-            type string;
-            config true;
-            description
-              "Complements ports identification. Used notably in case of bidirectional ports,
-               and/or in multi-degree amplifier nodes. Allows associating one of the directions
-               specified in ila-direction-label. Shall be consistent with ila-direction-label";
-          }
-          uses port-name {
-            refine "circuit-pack-name" {
-              mandatory true;
-            }
-            refine "port-name" {
-              mandatory true;
-            }
-          }
-        }
-        list osc-port {
-          key "port-direction";
-          description
-            "Ports associated with OSC";
-          leaf port-direction {
-            type org-openroadm-common-alarm-pm-types:direction;
-            config true;
-            mandatory true;
-            description
-              "allows identifying ports associated with logical amp :
-               TX for OSC circuit-pack IN RX for OSC circuit-pack OUT";
-          }
-          uses port-name {
-            refine "circuit-pack-name" {
-              mandatory true;
-            }
-            refine "port-name" {
-              mandatory true;
-            }
-          }
-        }
-        list otdr-port {
-          key "otdr-direction";
-          description
-            "otdr ports associated with an ILA";
-          leaf otdr-direction {
-            type string;
-            config true;
-            description
-              "allows identifying associated logical amp port in which OTDR is launched:
-               corresponds to rx-instance-port-direction-label of corresponding amplifier line-port";
-          }
-          uses port-name {
-            refine "circuit-pack-name" {
-              mandatory true;
-            }
-            refine "port-name" {
-              mandatory true;
-            }
-          }
-        }
-      }
-      list xponder {
-        when "/org-openroadm-device/info/node-type='xpdr'";
-        key "xpdr-number";
-        uses xponder;
-      }
-      list roadm-connections {
-        when "/org-openroadm-device/info/node-type='rdm'";
-        key "connection-name";
-        uses connection;
-      }
-      list odu-connection {
-        when "/org-openroadm-device/info/node-type='xpdr'";
-        key "connection-name";
-        uses odu-connection;
-      }
-      list connection-map {
-        key "connection-map-number";
-        config false;
-        leaf connection-map-number {
-          type uint32;
-          description
-            "Unique identifier for this connection-map entry";
-        }
-        container source {
-          leaf circuit-pack-name {
-            type leafref {
-              path "/org-openroadm-device/circuit-packs/circuit-pack-name";
-            }
-            mandatory true;
-          }
-          leaf port-name {
-            type leafref {
-              path "/org-openroadm-device/circuit-packs[circuit-pack-name=current()/../circuit-pack-name]/ports/port-name";
-            }
-            mandatory true;
-            description
-              "Port identifier. Unique within the context of a circuit-pack.";
-          }
-        }
-        list destination {
-          key "circuit-pack-name port-name";
-          min-elements 1;
-          leaf circuit-pack-name {
-            type leafref {
-              path "/org-openroadm-device/circuit-packs/circuit-pack-name";
-            }
-            mandatory true;
-          }
-          leaf port-name {
-            type leafref {
-              path "/org-openroadm-device/circuit-packs[circuit-pack-name=current()/../circuit-pack-name]/ports/port-name";
-            }
-            mandatory true;
-            description
-              "Port identifier. Unique within the context of a circuit-pack.";
-          }
-        }
-      }
-      list odu-switching-pools {
-        when "/org-openroadm-device/info/node-type='xpdr'";
-        key "switching-pool-number";
-        config false;
-        leaf switching-pool-number {
-          type uint16;
-          description
-            "Unique identifier for this odu-switching-pool";
-        }
-        leaf switching-pool-type {
-          type org-openroadm-switching-pool-types:switching-pool-types;
-          description
-            "Blocking/Non-Blocking";
-        }
-        leaf odu-connection-direction-capabilities {
-          type identityref {
-            base connection-direction-identity;
-          }
-          description
-            "Bidrectional capable, or Bi and Unidirectional capable";
-        }
-        list non-blocking-list {
-          key "nbl-number";
-          config false;
-          description
-            "List of ports in a non-blocking switch element";
-          leaf nbl-number {
-            type uint16;
-            description
-              "Identifier for this non-blocking-list. Unique within odu-switching-pool";
-          }
-          leaf interconnect-bandwidth-unit {
-            type uint32;
-            config false;
-            description
-              "Switch fabric interconnect bandwidth unit rate in bits per second.
-               Represents granularity of switch fabric";
-          }
-          leaf interconnect-bandwidth {
-            type uint32;
-            config false;
-            description
-              "Total interconnect bandwidth for a non-blocking element expressed as
-               number of inter-connect-bandwidth units";
-          }
-          list port-list {
-            key "circuit-pack-name port-name";
-            leaf circuit-pack-name {
-              type leafref {
-                path "/org-openroadm-device/circuit-packs/circuit-pack-name";
-              }
-              config false;
-            }
-            leaf port-name {
-              type leafref {
-                path "/org-openroadm-device/circuit-packs/ports/port-name";
-              }
-              config false;
-              description
-                "Port name. Unique within device";
-            }
-          }
-          list pluggable-optics-holder-list {
-            key "circuit-pack-name slot-name";
-            leaf circuit-pack-name {
-              type leafref {
-                path "/org-openroadm-device/circuit-packs/circuit-pack-name";
-              }
-              config false;
-              description
-                "Name of parent circuit-pack";
-            }
-            leaf slot-name {
-              type leafref {
-                path "/org-openroadm-device/circuit-packs/cp-slots/slot-name";
-              }
-              config false;
-              description
-                "Name of pluggable-optics-holder";
-            }
-          }
-        }
-      }
-      list otsigroup-capability-profile {
-        key "profile-name";
-        config false;
-        description
-          "OTSI group operational profile";
-        leaf profile-name {
-          type string;
-          description
-            "OTSI group profile name";
-        }
-        uses otsigroup-capability-grp;
-      }
-      list mc-capability-profile {
-        key "profile-name";
-        config false;
-        description
-          "Media channel capability profile list";
-        leaf profile-name {
-          type string;
-          description
-            "Media channel profile name";
-        }
-        leaf center-freq-granularity {
-          type org-openroadm-common-optical-channel-types:frequency-GHz;
-          default "50";
-          config false;
-          description
-            "Granularity of allowed center frequencies.  The base frequency for this computation is 193.1 THz (G.694.1)";
-        }
-        leaf min-edge-freq {
-          type org-openroadm-common-optical-channel-types:frequency-THz;
-          config false;
-          description
-            "Minimum edge frequency";
-        }
-        leaf max-edge-freq {
-          type org-openroadm-common-optical-channel-types:frequency-THz;
-          config false;
-          description
-            "Maximum edge frequency";
-        }
-        leaf slot-width-granularity {
-          type org-openroadm-common-optical-channel-types:frequency-GHz;
-          default "50";
-          config false;
-          description
-            "Width of a slot measured in GHz.";
-        }
-        leaf min-slots {
-          type uint32;
-          default "1";
-          config false;
-          description
-            "Minimum number of slots permitted to be joined together to form a media channel.  Must be less than or equal to the max-slots";
-        }
-        leaf max-slots {
-          type uint32;
-          default "1";
-          config false;
-          description
-            "Maximum number of slots permitted to be joined together to form a media channel.  Must be greater than or equal to the min-slots";
-        }
-      }
-      list split-lambda-profile {
-        key "profile-name";
-        config false;
-        description
-          "OTN capability profile";
-        leaf profile-name {
-          type string;
-          description
-            "Split lambda profile name";
-        }
-        uses split-lambda-capability-grp;
-      }
-      list otn-odu-mux-hierarchy-profile {
-        key "profile-name";
-        config false;
-        description
-          "OTN ODU mux hierarchy profile list";
-        leaf profile-name {
-          type string;
-          description
-            "OTN ODU mux hierarchy profile name";
-        }
-        uses otn-odu-mux-hierarchy-grp;
-      }
-      list optical-operational-mode-profile {
-        key "profile-name";
-        config false;
-        description
-          "Optical operational profile";
-        leaf profile-name {
-          type string;
-          description
-            "Optical operational profile name";
-        }
-        uses org-openroadm-optical-operational-interfaces:optical-operational-modes-grp-attr;
-      }
-      list otn-capability-profile {
-        key "profile-name";
-        config false;
-        description
-          "OTN capability profile";
-        leaf profile-name {
-          type string;
-          description
-            "OTN capability profile name";
-        }
-        uses otn-capability-grp;
-      }
-      list muxp-profile {
-        key "profile-name";
-        config false;
-        description
-          "Muxp profile list";
-        leaf profile-name {
-          type string;
-          description
-            "Mux profile name";
-        }
-        uses mux-grp;
-      }
-    }
-  }
-
-  grouping common-session-parms {
-    description
-      "Common session parameters to identify a
-       management session.";
-    leaf username {
-      type org-openroadm-user-mgmt:username-type;
-      mandatory true;
-      description
-        "Name of the user for the session.";
-    }
-    leaf session-id {
-      type ietf-nc:session-id-or-zero-type;
-      mandatory true;
-      description
-        "Identifier of the session.
-         A NETCONF session MUST be identified by a non-zero value.
-         A non-NETCONF session MAY be identified by the value zero.";
-    }
-    leaf source-host {
-      type ietf-inet-types:ip-address;
-      description
-        "Address of the remote host for the session.";
-    }
-  }
-
-  grouping changed-by-parms {
-    description
-      "Common parameters to identify the source
-       of a change event, such as a configuration
-       or capability change.";
-    container changed-by {
-      description
-        "Indicates the source of the change.
-         If caused by internal action, then the
-         empty leaf 'server' will be present.
-         If caused by a management session, then
-         the name, remote host address, and session ID
-         of the session that made the change will be reported.";
-      choice server-or-user {
-        leaf server {
-          type empty;
-          description
-            "If present, the change was caused
-             by the server.";
-        }
-        case by-user {
-          uses common-session-parms;
-        }
-      }
-    }
-  }
-
-  rpc led-control {
-    description
-      "This command is used to allow user to find an entity on the NE,
-       The specified entity will have LED blinking.
-       The equipmentLedOn alarm will be raised and cleared for the indication";
-    input {
-      choice equipment-entity {
-        mandatory true;
-        case shelf {
-          leaf shelf-name {
-            type leafref {
-              path "/org-openroadm-device/shelves/shelf-name";
-            }
-            mandatory true;
-            description
-              "shelf-name for the operation";
-          }
-        }
-        case circuit-pack {
-          leaf circuit-pack-name {
-            type leafref {
-              path "/org-openroadm-device/circuit-packs/circuit-pack-name";
-            }
-            mandatory true;
-            description
-              "circuit-pack-name for the operation";
-          }
-        }
-      }
-      leaf enabled {
-        type boolean;
-        mandatory true;
-        description
-          "led-control enabled flag.
-           when enabled=true,  equipmentLedOn alarm will be raised
-           when enabled=false, equipmentLedOn alarm will be cleared";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-
-  rpc create-tech-info {
-    description
-      "Collects all log data for debugging and place it in a location accessible via ftp/sftp.
-       This model assumes ASYNC operation, i.e. the command will return after the device accepts the command,
-       A create-tech-info-notification will be send out later for the result of the operation.
-       The log-file is cleared at the start of every create-tech-info operation in order to ensure
-       the up-to-date logs are collected. If a vendor does not support concurrent log collection, the second
-       create-tech-info command will be rejected.";
-    input {
-      leaf shelf-id {
-        type leafref {
-          path "/org-openroadm-device/shelves/shelf-name";
-        }
-        description
-          "This optional field is used to specify the shelf for log collection.
-           When this filed is not provided, it is expected to collect logs for the whole node.
-           Vendor should reject the command if the whole node log collection is not supported.";
-      }
-      leaf log-option {
-        type string;
-        description
-          "The log type a vendor can specify. Maybe used in future";
-      }
-    }
-    output {
-      uses create-tech-info-group;
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-
-  rpc get-connection-port-trail {
-    input {
-      leaf connection-name {
-        type string;
-        mandatory true;
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-      list ports {
-        uses org-openroadm-device-types:physical-location;
-        uses port-name {
-          refine "circuit-pack-name" {
-            mandatory true;
-          }
-          refine "port-name" {
-            mandatory true;
-          }
-        }
-      }
-    }
-  }
-
-  rpc disable-automatic-shutoff {
-    input {
-      choice degree-or-amp {
-        mandatory true;
-        description
-          "The choice describes the option to specify the entity for the disable-automatic-shutoff RPC. It can be degree-number for rdm and amp-number for ila";
-        case degree {
-          leaf degree-number {
-            type leafref {
-              path "/org-openroadm-device/degree/degree-number";
-            }
-            mandatory true;
-            description
-              "The degree-number defined in degree";
-          }
-        }
-        case amp {
-          leaf amp-number {
-            type leafref {
-              path "/org-openroadm-device/line-amplifier/amp-number";
-            }
-            mandatory true;
-            description
-              "The amp-number defined in line-amplifier";
-          }
-        }
-      }
-      leaf support-timer {
-        type uint16 {
-          range "1..600";
-        }
-        default "20";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-
-  rpc start-scan {
-    input {
-      choice degree-or-amp {
-        mandatory true;
-        description
-          "The choice describes the option to specify the entity for the start-scan RPC. It can be degree-number for rdm and amp-number for ila";
-        case degree {
-          leaf degree-number {
-            type leafref {
-              path "/org-openroadm-device/degree/degree-number";
-            }
-            mandatory true;
-            description
-              "The degree-number defined in degree";
-          }
-        }
-        case amp {
-          leaf amp-number {
-            type leafref {
-              path "/org-openroadm-device/line-amplifier/amp-number";
-            }
-            mandatory true;
-            description
-              "The amp-number defined in line-amplifier";
-          }
-        }
-      }
-      leaf port-direction {
-        type org-openroadm-common-alarm-pm-types:direction;
-      }
-      leaf distance {
-        type uint32;
-      }
-      leaf resolution {
-        type uint32;
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-
-  rpc set-current-datetime {
-    description
-      "Set the info/current-datetime leaf to the specified value.";
-    input {
-      leaf current-datetime {
-        type ietf-yang-types:date-and-time;
-        mandatory true;
-        description
-          "The current system date and time in UTC. Format: YYYY-MM-DDTHH:MM:SS";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-
-  notification create-tech-info-notification {
-    description
-      "This Notification is sent when the create-tech-info is complete or failed.";
-    uses create-tech-info-group;
-    uses org-openroadm-common-types:rpc-response-status;
-  }
-
-  notification otdr-scan-result {
-    description
-      "This Notification is sent when the otdr-scan-result is complete or failed.";
-    uses org-openroadm-common-types:rpc-response-status;
-    leaf result-file {
-      type string;
-    }
-  }
-
-  notification change-notification {
-    description
-      "The Notification that a resource has been added, modified or removed.
-       This notification can be triggered by changes in configuration and operational data.
-       It shall contain the changed field pointed by the xpath.
-       Typically it is not intended for frequently changing volatile data e.g. PM, power levels";
-    leaf change-time {
-      type ietf-yang-types:date-and-time;
-      description
-        "The time the change occurs.";
-    }
-    uses changed-by-parms;
-    leaf datastore {
-      type enumeration {
-        enum running {
-          description
-            "The <running> datastore has changed.";
-        }
-        enum startup {
-          description
-            "The <startup> datastore has changed";
-        }
-      }
-      default "running";
-      description
-        "Indicates which configuration datastore has changed.";
-    }
-    list edit {
-      description
-        "An edit (change) record SHOULD be present for each distinct
-         edit operation that the server has detected on
-         the target datastore.  This list MAY be omitted
-         if the detailed edit operations are not known.
-         The server MAY report entries in this list for
-         changes not made by a NETCONF session.";
-      leaf target {
-        type instance-identifier;
-        description
-          "Top most node associated with the configuration or operational change.
-           A server SHOULD set this object to the node within
-           the datastore that is being altered.  A server MAY
-           set this object to one of the ancestors of the actual
-           node that was changed, or omit this object, if the
-           exact node is not known.";
-      }
-      leaf operation {
-        type ietf-nc:edit-operation-type;
-        description
-          "Type of edit operation performed.
-           A server MUST set this object to the NETCONF edit
-           operation performed on the target datastore.";
-      }
-    }
-  }
-
-  uses org-openroadm-device-container;
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-dhcp@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-dhcp@2020-05-29.yang
deleted file mode 100644 (file)
index 9562d12..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-module org-openroadm-dhcp {
-  namespace "http://org/openroadm/dhcp";
-  prefix org-openroadm-dhcp;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2020-05-29;
-  }
-  import ietf-inet-types {
-    prefix ietf-inet-types;
-    revision-date 2013-07-15;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for dhcp protocol.
-
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2017-03-16 {
-    description
-      "Version 3.0";
-  }
-
-  grouping dhcp-relay {
-    container ipv4-dhcp-relay {
-      list ipv4-server-group {
-        key "server-group-name";
-        description
-          "DHCP server group configuration that DHCP relays to";
-        leaf server-group-name {
-          type string;
-          description
-            "Name of the server-group";
-        }
-        leaf-list interface-name {
-          type leafref {
-            path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface/org-openroadm-device:name";
-          }
-          description
-            "Name of the interface";
-        }
-        leaf-list server-address {
-          type ietf-inet-types:ipv4-address;
-          description
-            "List of IPv4 server addresses";
-        }
-      }
-    }
-    container ipv6-dhcp-relay {
-      list ipv6-server-group {
-        key "server-group-name";
-        description
-          "DHCP server group configuration that DHCP relays to";
-        leaf server-group-name {
-          type string;
-          description
-            "Name of the server-group";
-        }
-        leaf-list interface-name {
-          type leafref {
-            path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface/org-openroadm-device:name";
-          }
-          description
-            "Name of the interface";
-        }
-        leaf-list server-address {
-          type ietf-inet-types:ipv6-address;
-          description
-            "List of IPv6 server addresses";
-        }
-      }
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:protocols" {
-    when "/org-openroadm-device:org-openroadm-device/org-openroadm-device:info/org-openroadm-device:node-type='xpdr'";
-    uses dhcp-relay;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-ethernet-interfaces@2016-10-14.yang b/ordmodels/device/src/main/yang/org-openroadm-ethernet-interfaces@2016-10-14.yang
deleted file mode 100644 (file)
index d9c19d4..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-module org-openroadm-ethernet-interfaces {
-  namespace "http://org/openroadm/ethernet-interfaces";
-  prefix org-openroadm-eth-interfaces;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2017-02-06;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2016-10-14;
-  }
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility ethernet interfaces.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping eth-attributes {
-    leaf speed {
-      type uint32;
-      description
-        "Set speed of the interface, unit mbps.
-         This is for ETH facility. ";
-    }
-    leaf fec {
-      type enumeration {
-        enum off;
-        enum rsfec;
-      }
-      description "Forward Error Correction Choices. ";
-    }
-    leaf duplex {
-      type enumeration {
-        enum "half" {
-          value 0;
-          description
-            "half duplex";
-        }
-        enum "full" {
-          value 1;
-          description
-            "full duplex";
-        }
-      }
-      default "full";
-      description
-        "Set duplex selections.";
-    }
-    leaf mtu {
-      type uint32 {
-        range "1518..9000";
-      }
-      default "1522";
-      description
-        "Set Maximum Frame Size.";
-    }
-    leaf auto-negotiation {
-      type enumeration {
-        enum "enabled" {
-          value 1;
-          description
-            "Auto Negotiation enabled";
-        }
-        enum "disabled" {
-          value 0;
-          description
-            "Auto Negotiation disabled";
-        }
-      }
-      default "enabled";
-      description
-        "Set Auto Negotiation: Enabled/Disabled.";
-    }
-    leaf curr-speed {
-      config false;
-      type string;
-      description
-        "speed (UNKNOWN/AUTO/10/100/1000/10000) corresponding to the interface";
-    }
-    leaf curr-duplex {
-      config false;
-      type string;
-      description
-        "duplex (HALF/FULL) corresponding to the interface";
-    }
-  }
-
-  grouping ethernet-container {
-    container ethernet {
-      description
-        "Ethernet Interfaces";
-      uses eth-attributes;
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:ethernetCsmacd'";
-    uses ethernet-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-ethernet-interfaces@2018-10-19.yang b/ordmodels/device/src/main/yang/org-openroadm-ethernet-interfaces@2018-10-19.yang
deleted file mode 100755 (executable)
index 494f4ce..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-module org-openroadm-ethernet-interfaces {
-  namespace "http://org/openroadm/ethernet-interfaces";
-  prefix org-openroadm-eth-interfaces;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2017-06-26;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility ethernet interfaces.
-     
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.
-     
-     Also contains code components extracted from IETF Interfaces.  These code components 
-     are copyrighted and licensed as follows:
-     
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors. 
-     All rights reserved. 
-     
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating 
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of 
-     publication of this document. Please review these documents carefully, as they 
-     describe your rights and restrictions with respect to this document. Code Components 
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as 
-     described in the Simplified BSD License.";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping eth-attributes {
-    leaf speed {
-      type uint32;
-      description
-        "Set speed of the interface, unit mbps. 
-         This is for ETH facility. ";
-    }
-    leaf fec {
-      type enumeration {
-        enum "off";
-        enum "rsfec";
-      }
-      description
-        "Forward Error Correction Choices. ";
-    }
-    leaf duplex {
-      type enumeration {
-        enum "half" {
-          value 0;
-          description
-            "half duplex";
-        }
-        enum "full" {
-          value 1;
-          description
-            "full duplex";
-        }
-      }
-      default "full";
-      description
-        "Set duplex selections.";
-    }
-    leaf mtu {
-      type uint32 {
-        range "1518..9000";
-      }
-      default "1522";
-      description
-        "Set Maximum Frame Size.";
-    }
-    leaf auto-negotiation {
-      type enumeration {
-        enum "enabled" {
-          value 1;
-          description
-            "Auto Negotiation enabled";
-        }
-        enum "disabled" {
-          value 0;
-          description
-            "Auto Negotiation disabled";
-        }
-      }
-      default "enabled";
-      description
-        "Set Auto Negotiation: Enabled/Disabled.";
-    }
-    leaf curr-speed {
-      type string;
-      config false;
-      description
-        "speed (UNKNOWN/AUTO/10/100/1000/10000) corresponding to the interface";
-    }
-    leaf curr-duplex {
-      type string;
-      config false;
-      description
-        "duplex (HALF/FULL) corresponding to the interface";
-    }
-  }
-
-  grouping ethernet-container {
-    container ethernet {
-      description
-        "Ethernet Interfaces";
-      uses eth-attributes;
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:ethernetCsmacd'";
-    uses ethernet-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-ethernet-interfaces@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-ethernet-interfaces@2020-05-29.yang
deleted file mode 100644 (file)
index 6b56b92..0000000
+++ /dev/null
@@ -1,235 +0,0 @@
-module org-openroadm-ethernet-interfaces {
-  yang-version 1.1;
-  namespace "http://org/openroadm/ethernet-interfaces";
-  prefix org-openroadm-eth-interfaces;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-maintenance-testsignal {
-    prefix org-openroadm-maint-testsignal;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-maintenance-loopback {
-    prefix org-openroadm-maint-loopback;
-    revision-date 2019-11-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility ethernet interfaces.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping eth-attributes {
-    leaf speed {
-      type uint32;
-      description
-        "Set speed of the interface, unit mbps.
-         This is for ETH facility.
-         Applies to both management and transport Ethernet.
-         Optional, must be specified for transport Ethernet or when auto-negotiation is disabled.";
-    }
-
-    uses org-openroadm-common-types:fec-grouping {
-      description
-        "Forward Error Correction Choices.
-         Applies to transport Ethernet. Mandatory for transport Ethernet.";
-    }
-
-    leaf duplex {
-      type enumeration {
-        enum half {
-          value 0;
-          description
-            "half duplex";
-        }
-        enum full {
-          value 1;
-          description
-            "full duplex";
-        }
-      }
-      default "full";
-      description
-        "Set duplex selections.
-         Applies to both management and transport Ethernet.
-         Optional, default “full”. Transport Ethernet only supports full.";
-    }
-    leaf auto-negotiation {
-      type enumeration {
-        enum enabled {
-          value 1;
-          description
-            "Auto Negotiation enabled";
-        }
-        enum disabled {
-          value 0;
-          description
-            "Auto Negotiation disabled";
-        }
-      }
-      default "enabled";
-      description
-        "Set Auto Negotiation: Enabled/Disabled.
-         Applies to both management and transport Ethernet.
-         Optional, default “enabled”. Transport Ethernet only supports enabled.";
-    }
-    leaf curr-speed {
-      type string;
-      config false;
-      description
-        "Speed (UNKNOWN/AUTO/10/100/1000/10000) corresponding to the interface.
-         Applies to both management and transport Ethernet.";
-    }
-    leaf curr-duplex {
-      type string;
-      config false;
-      description
-        "Duplex (HALF/FULL) corresponding to the interface.
-         Applies to both management and transport Ethernet.";
-    }
-    leaf max-frame-size {
-      type uint32;
-      config false;
-      description
-        "Maximum Frame Size.  Applies to management Ethernet.";
-    }
-    container subrate-eth-sla {
-      presence "Explicit assignment of subrate ethernet allocation";
-      description
-        "SLA (Service Level Agreement) for subrate Ethernet.
-         Applies to transport Ethernet.";
-      uses org-openroadm-common-types:eth-rate-and-burst-size;
-    }
-    description
-      "Ethernet attributes grouping";
-  }
-
-  grouping ethernet-container {
-    container ethernet {
-      description
-        "Ethernet Interfaces.
-         Maintenance test signal and loopback provisioning is supported for transport Ethernet.";
-      uses eth-attributes;
-      uses org-openroadm-maint-testsignal:maint-testsignal;
-      uses org-openroadm-maint-loopback:maint-loopback;
-    }
-    description
-      "Ethernet container grouping";
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:ethernetCsmacd'";
-    uses ethernet-container;
-    description
-      "Augment for interface";
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-file-transfer@2016-10-14.yang b/ordmodels/device/src/main/yang/org-openroadm-file-transfer@2016-10-14.yang
deleted file mode 100644 (file)
index 243fb81..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-module org-openroadm-file-transfer {
-  namespace "http://org/openroadm/file-transfer";
-  prefix org-openroadm-file-txr;
-
-  import ietf-inet-types {
-    prefix inet;
-  }
-
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2016-10-14;
-  }
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for file management related rpcs.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  rpc transfer {
-    description
-      "File transfer using FTP/SFTP";
-    input {
-      leaf action {
-        mandatory true;
-        description
-          "Type of action - download/upload.";
-        type enumeration {
-          enum "upload" {
-            description
-              "Specify the upload action. The server sends
-               the file identified by the local-file-path
-               to the remote-file-path.";
-          }
-          enum "download" {
-            description
-              "Specify the download action. The server retrieves
-               the file identified by the remote-file-path
-               to the local-file-path.";
-          }
-        }
-      }
-      leaf local-file-path {
-        type string;
-        mandatory true;
-        description
-          "Local file path.
-           Ex: /var/shared/example.txt";
-      }
-      leaf remote-file-path {
-        type inet:uri;
-        mandatory true;
-        description
-          "Remote file path.
-           A URI for the remote file path.
-
-           Format:sftp://user[:password]@host[:port]/path.
-           Ex: sftp://test:verify@[2001:db8:0:1::10]:22/home/user/sample";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  rpc show-file {
-    description
-      "Show one or more files in the specified directory.";
-    input {
-      leaf filename {
-        type string {
-          length "1..255";
-        }
-        description
-          "Specify file(s) to be listed (* is allowed as wild-card). ";
-      }
-    }
-    output {
-      leaf status {
-        type enumeration {
-          enum "Successful" {
-            value 1;
-          }
-          enum "Failed" {
-            value 2;
-          }
-        }
-        mandatory true;
-        description
-          "Successful or Failed";
-      }
-      leaf-list status-message {
-        type string;
-        description
-          "Gives a more detailed reason for success / failure";
-      }
-    }
-  }
-  rpc delete-file {
-    description
-      "Delete one or more files in the specified directory.";
-    input {
-      leaf filename {
-        type string {
-          length "1..255";
-        }
-        mandatory true;
-        description
-          "Specify file(s) to be deleted (* is allowed as wild-card).";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-file-transfer@2018-10-19.yang b/ordmodels/device/src/main/yang/org-openroadm-file-transfer@2018-10-19.yang
deleted file mode 100755 (executable)
index 7f622d0..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-module org-openroadm-file-transfer {
-  namespace "http://org/openroadm/file-transfer";
-  prefix org-openroadm-file-txr;
-
-  import ietf-inet-types {
-    prefix inet;
-    revision-date 2013-07-15;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2018-10-19;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for file management related rpcs.
-     
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  rpc transfer {
-    description
-      "File transfer using FTP/SFTP";
-    input {
-      leaf action {
-        type enumeration {
-          enum "upload" {
-            description
-              "Specify the upload action. The NE (SFTP/FTP client) sends
-               the file identified by the local-file-path
-               to the remote-file-path.";
-          }
-          enum "download" {
-            description
-              "Specify the download action. The NE (SFTP/FTP client) retrieves
-               the file identified by the remote-file-path
-               to the local-file-path.";
-          }
-        }
-        mandatory true;
-        description
-          "Type of action - download/upload.";
-      }
-      leaf local-file-path {
-        type string;
-        mandatory true;
-        description
-          "Local file path.
-           Ex: /var/shared/example.txt";
-      }
-      leaf remote-file-path {
-        type inet:uri;
-        mandatory true;
-        description
-          "Remote file path. 
-           A URI for the remote file path.
-           
-           Format:sftp://user[:password]@host[:port]/path. 
-           Ex: sftp://test:verify@[2001:db8:0:1::10]:22/home/user/sample";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  rpc show-file {
-    description
-      "Show one or more files in the specified directory.";
-    input {
-      leaf filename {
-        type string {
-          length "1..255";
-        }
-        default "*";
-        description
-          "Specify file(s) to be listed (* is allowed as wild-card). ";
-      }
-    }
-    output {
-      leaf status {
-        type enumeration {
-          enum "Successful" {
-            value 1;
-          }
-          enum "Failed" {
-            value 2;
-          }
-        }
-        mandatory true;
-        description
-          "Successful or Failed";
-      }
-      leaf-list status-message {
-        type string;
-        description
-          "Gives a more detailed reason for success / failure";
-      }
-    }
-  }
-  rpc delete-file {
-    description
-      "Delete one or more files in the specified directory.";
-    input {
-      leaf filename {
-        type string {
-          length "1..255";
-        }
-        mandatory true;
-        description
-          "Specify file(s) to be deleted (* is allowed as wild-card).";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  notification transfer-notification {
-    description
-      "notification for transfer operation events.";
-    leaf local-file-path {
-      type string;
-      description
-        "Local file path used in transfer RPC.";
-    }
-    uses org-openroadm-common-types:extended-rpc-response-status;
-    container progress {
-      when "current()/../status = 'In-progress'";
-      description
-        "progress status when response is in-progress";
-      leaf bytes-transferred {
-        type uint64;
-        description
-          "bytes transferred.";
-      }
-      leaf percentage-complete {
-        type uint8;
-        description
-          "percentage completed.";
-      }
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-file-transfer@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-file-transfer@2020-05-29.yang
deleted file mode 100644 (file)
index acb8a99..0000000
+++ /dev/null
@@ -1,247 +0,0 @@
-module org-openroadm-file-transfer {
-  namespace "http://org/openroadm/file-transfer";
-  prefix org-openroadm-file-txr;
-
-  import ietf-inet-types {
-    prefix inet;
-    revision-date 2013-07-15;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2020-05-29;
-  }
-  import ietf-yang-types {
-    prefix ietf-yang-types;
-    revision-date 2013-07-15;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for file management related rpcs.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  rpc transfer {
-    description
-      "File transfer using FTP/SFTP";
-    input {
-      leaf action {
-        type enumeration {
-          enum upload {
-            description
-              "Specify the upload action. The NE (SFTP/FTP client) sends
-               the file identified by the local-file-path
-               to the remote-file-path.";
-          }
-          enum download {
-            description
-              "Specify the download action. The NE (SFTP/FTP client) retrieves
-               the file identified by the remote-file-path
-               to the local-file-path.";
-          }
-        }
-        mandatory true;
-        description
-          "Type of action - download/upload.";
-      }
-      leaf local-file-path {
-        type string;
-        mandatory true;
-        description
-          "Local file path.
-           Ex: /var/shared/example.txt";
-      }
-      leaf remote-file-path {
-        type inet:uri;
-        mandatory true;
-        description
-          "Remote file path.
-           A URI for the remote file path.
-
-           Format:sftp://user[:password]@host[:port]/path.
-           Ex: sftp://test:verify@[2001:db8:0:1::10]:22/home/user/sample";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-
-  rpc show-file {
-    description
-      "Show one or more files in the specified directory.";
-    input {
-      leaf filename {
-        type string {
-          length "1..255";
-        }
-        default "*";
-        description
-          "Specify file(s) to be listed (* is allowed as wild-card). ";
-      }
-    }
-    output {
-      leaf status {
-        type org-openroadm-common-types:rpc-status;
-        mandatory true;
-        description
-          "RPC status";
-      }
-      leaf status-message {
-        type string;
-        description
-          "status message";
-      }
-      list file {
-        key "filename";
-        description
-          "output file list";
-        leaf filename {
-          type string;
-          description
-            "output filename";
-        }
-        leaf file-size {
-          type uint64;
-          mandatory true;
-          description
-            "output file size";
-        }
-        leaf modified-date {
-          type ietf-yang-types:date-and-time;
-          mandatory true;
-          description
-            "output modified date";
-        }
-      }
-    }
-  }
-
-  rpc delete-file {
-    description
-      "Delete one or more files in the specified directory.";
-    input {
-      leaf filename {
-        type string {
-          length "1..255";
-        }
-        mandatory true;
-        description
-          "Specify file(s) to be deleted (* is allowed as wild-card).";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-
-  notification transfer-notification {
-    description
-      "notification for transfer operation events.";
-    leaf local-file-path {
-      type string;
-      description
-        "Local file path used in transfer RPC.";
-    }
-    uses org-openroadm-common-types:extended-rpc-response-status;
-    container progress {
-      when "current()/../status = 'In-progress'";
-      description
-        "progress status when response is in-progress";
-      leaf bytes-transferred {
-        type uint64;
-        description
-          "bytes transferred.";
-      }
-      leaf percentage-complete {
-        type uint8;
-        description
-          "percentage completed.";
-      }
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-fwdl@2016-10-14.yang b/ordmodels/device/src/main/yang/org-openroadm-fwdl@2016-10-14.yang
deleted file mode 100644 (file)
index 86b7926..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-module org-openroadm-fwdl {
-  namespace "http://org/openroadm/fwdl";
-  prefix org-openroadm-fwdl;
-
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2016-10-14;
-  }
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "This module contains definitions for System Management.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  rpc fw-update {
-    description
-      "Fpga data update";
-    input {
-      leaf circuit-pack-name {
-        type string;
-        description
-          "Name of the circuit pack";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-fwdl@2018-10-19.yang b/ordmodels/device/src/main/yang/org-openroadm-fwdl@2018-10-19.yang
deleted file mode 100755 (executable)
index 0e2a964..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-module org-openroadm-fwdl {
-  namespace "http://org/openroadm/fwdl";
-  prefix org-openroadm-fwdl;
-
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2018-10-19;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "This module contains definitions for System Management.
-     
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  rpc fw-update {
-    description
-      "Fpga data update";
-    input {
-      leaf circuit-pack-name {
-        type string;
-        description
-          "Name of the circuit pack";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-fwdl@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-fwdl@2020-05-29.yang
deleted file mode 100644 (file)
index b9b300f..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-module org-openroadm-fwdl {
-  namespace "http://org/openroadm/fwdl";
-  prefix org-openroadm-fwdl;
-
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2020-05-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "This module contains definitions for System Management.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  rpc fw-update {
-    description
-      "Fpga data update";
-    input {
-      leaf circuit-pack-name {
-        type string;
-        description
-          "Name of the circuit pack";
-      }
-      leaf boot {
-        type boolean;
-        default "false";
-        description
-          "Flag to update boot loader or unprotected firmware";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-gcc-interfaces@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-gcc-interfaces@2020-05-29.yang
deleted file mode 100644 (file)
index 99a7420..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-module org-openroadm-gcc-interfaces {
-  namespace "http://org/openroadm/gcc-interfaces";
-  prefix org-openroadm-gcc-interfaces;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2019-11-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility gcc interfaces.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reprgccce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote prgcccts derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0";
-  }
-
-  grouping gcc-interfaces {
-    container gcc {
-      description
-        "GCC Channel on OTN interface.";
-      leaf gcc-channel-type {
-        type enumeration {
-          enum gcc0 {
-            value 1;
-            description
-              "OTU GCC0 channel";
-          }
-          enum gcc1 {
-            value 2;
-            description
-              "ODU GCC1 channel";
-          }
-          enum gcc2 {
-            value 3;
-            description
-              "ODU GCC2 channel";
-          }
-          enum gcc1-gcc2 {
-            value 4;
-            description
-              "Combined ODU GCC channel";
-          }
-        }
-      }
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:gcc'";
-    uses gcc-interfaces;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-gnmi@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-gnmi@2020-05-29.yang
deleted file mode 100644 (file)
index 874cfab..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-module org-openroadm-gnmi {
-  yang-version 1.1;
-  namespace "http://org/openroadm/gnmi";
-  prefix org-openroadm-gnmi;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-security {
-    prefix org-openroadm-security;
-    revision-date 2020-05-29;
-  }
-  import ietf-inet-types {
-    prefix inet;
-    revision-date 2013-07-15;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for gnmi protocol.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Initial revision.";
-  }
-
-  grouping gnmi_container {
-    description
-      "Grouping for setting of GNMI attributes ";
-    container gnmi {
-      description
-        "gRPC Network Management Interface related configurations";
-      leaf enabled {
-        type boolean;
-        must "(current()='true' and ../certificate-id) or current()='false'" {
-          error-message "certificate-id should be configured to enable gNMI.";
-        }
-        default "false";
-        description
-          "Enable/Disable gNMI.";
-      }
-      leaf certificate-id {
-        type leafref {
-          path "/org-openroadm-device:org-openroadm-device/org-openroadm-security:security/org-openroadm-security:certificate/org-openroadm-security:certificate-id";
-        }
-        description
-          "ID of the certificate from security table";
-      }
-      leaf port {
-        type inet:port-number;
-        default "6030";
-        description
-          "gNMI port to listen on";
-      }
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:protocols" {
-    description
-      "Creation of GNMI container under device protols ";
-    uses gnmi_container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-interfaces@2016-10-14.yang b/ordmodels/device/src/main/yang/org-openroadm-interfaces@2016-10-14.yang
deleted file mode 100644 (file)
index acd74fe..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-module org-openroadm-interfaces {
-  namespace "http://org/openroadm/interfaces";
-  prefix openROADM-if;
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility interfaces.
-     Reused ietf-interfaces and some interface-type defined in iana-if-type.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  identity interface-type {
-    description
-      "Base identity from which specific interface types are
-       derived.";
-  }
-
-  identity ethernetCsmacd {
-    base interface-type;
-    description
-      "For all Ethernet-like interfaces, regardless of speed,
-       as per RFC 3635.";
-    reference
-      "RFC 3635 - Definitions of Managed Objects for the
-                  Ethernet-like Interface Types";
-  }
-
-  identity ip {
-    base interface-type;
-    description
-      "IP (for APPN HPR in IP networks).";
-  }
-
-  identity opticalChannel {
-    base interface-type;
-    description
-      "Optical Channel.";
-  }
-
-  identity opticalTransport {
-    base interface-type;
-    description
-      "Optical Transport.";
-  }
-
-  identity otnOdu {
-    base interface-type;
-    description
-      "OTN Optical Data Unit.";
-  }
-
-  identity otnOtu {
-    base interface-type;
-    description
-      "OTN Optical channel Transport Unit.";
-  }
-
-  identity openROADMOpticalMultiplex {
-    base interface-type;
-    description
-      "Optical Transport Multiplex type for openROADM";
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-interfaces@2017-06-26.yang b/ordmodels/device/src/main/yang/org-openroadm-interfaces@2017-06-26.yang
deleted file mode 100644 (file)
index 03f1da1..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-module org-openroadm-interfaces {
-  namespace "http://org/openroadm/interfaces";
-  prefix openROADM-if;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility interfaces.
-     Reused ietf-interfaces and some interface-type defined in iana-if-type.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  identity interface-type {
-    description
-      "Base identity from which specific interface types are
-       derived.";
-  }
-
-  identity ethernetCsmacd {
-    base interface-type;
-    description
-      "For all Ethernet-like interfaces, regardless of speed,
-       as per RFC 3635.";
-    reference
-      "RFC 3635 - Definitions of Managed Objects for the
-                  Ethernet-like Interface Types";
-  }
-
-  identity ip {
-    base interface-type;
-    description
-      "IP (for APPN HPR in IP networks).";
-  }
-
-  identity mediaChannelTrailTerminationPoint {
-    base interface-type;
-    description
-      "Media Channel Trail Termination Point";
-  }
-
-  identity networkMediaChannelConnectionTerminationPoint {
-    base interface-type;
-    description
-      "Network Media Channel Connection Termination Point";
-  }
-
-  identity opticalChannel {
-    base interface-type;
-    description
-      "Optical Channel.";
-  }
-
-  identity opticalTransport {
-    base interface-type;
-    description
-      "Optical Transport.";
-  }
-
-  identity otnOdu {
-    base interface-type;
-    description
-      "OTN Optical Data Unit.";
-  }
-
-  identity otnOtu {
-    base interface-type;
-    description
-      "OTN Optical channel Transport Unit.";
-  }
-
-  identity openROADMOpticalMultiplex {
-    base interface-type;
-    description
-      "Optical Transport Multiplex type for openROADM";
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-ip@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-ip@2020-05-29.yang
deleted file mode 100644 (file)
index 96ee2e7..0000000
+++ /dev/null
@@ -1,347 +0,0 @@
-module org-openroadm-ip {
-  namespace "http://org/openroadm/ip";
-  prefix org-openroadm-ip;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2019-11-29;
-  }
-  import ietf-inet-types {
-    prefix inet;
-    revision-date 2013-07-15;
-  }
-  import ietf-yang-types {
-    prefix yang;
-    revision-date 2013-07-15;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "This model defines Yang model for IP (IPv4 and IPv6) interfaces.
-
-     This model reuses data items defined in the IETF YANG model for
-     interfaces described by RFC 7277.
-
-     Some attributes which are not required in Open ROADM MSA are removed.
-     Yang file included are changed to fit into Open ROADM MSA yang structure.
-
-     IETF code is subject to the following copyright and license:
-     Copyright (c) IETF Trust and the persons identified as authors of
-     the code.
-     All rights reserved.
-
-     Redistribution and use in source and binary forms, with or without
-     modification, is permitted pursuant to, and subject to the license
-     terms contained in, the Simplified BSD License set forth in
-     Section 4.c of the IETF Trust's Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info).";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2014-06-16 {
-    description
-      "Initial revision.";
-    reference
-      "RFC 7277: A YANG Data Model for IP Management";
-  }
-
-  feature ipv4-non-contiguous-netmasks {
-    description
-      "Indicates support for configuring non-contiguous
-       subnet masks.";
-  }
-
-  feature ipv6-privacy-autoconf {
-    description
-      "Indicates support for Privacy Extensions for Stateless Address
-       Autoconfiguration in IPv6.";
-    reference
-      "RFC 4941: Privacy Extensions for Stateless Address
-                 Autoconfiguration in IPv6";
-  }
-
-  typedef ip-address-origin {
-    type enumeration {
-      enum other {
-        description
-          "None of the following.";
-      }
-      enum static {
-        description
-          "Indicates that the address has been statically
-           configured - for example, using NETCONF or a Command Line
-           Interface.";
-      }
-      enum dhcp {
-        description
-          "Indicates an address that has been assigned to this
-           system by a DHCP server.";
-      }
-      enum link-layer {
-        description
-          "Indicates an address created by IPv6 stateless
-           autoconfiguration that embeds a link-layer address in its
-           interface identifier.";
-      }
-      enum random {
-        description
-          "Indicates an address chosen by the system at
-
-           random, e.g., an IPv4 address within 169.254/16, an
-           RFC 4941 temporary address, or an RFC 7217 semantically
-           opaque address.";
-        reference
-          "RFC 4941: Privacy Extensions for Stateless Address
-                     Autoconfiguration in IPv6
-           RFC 7217: A Method for Generating Semantically Opaque
-                     Interface Identifiers with IPv6 Stateless
-                     Address Autoconfiguration (SLAAC)";
-      }
-    }
-    description
-      "The origin of an address.";
-  }
-
-  typedef neighbor-origin {
-    type enumeration {
-      enum other {
-        description
-          "None of the following.";
-      }
-      enum static {
-        description
-          "Indicates that the mapping has been statically
-           configured - for example, using NETCONF or a Command Line
-           Interface.";
-      }
-      enum dynamic {
-        description
-          "Indicates that the mapping has been dynamically resolved
-           using, e.g., IPv4 ARP or the IPv6 Neighbor Discovery
-           protocol.";
-      }
-    }
-    description
-      "The origin of a neighbor entry.";
-  }
-
-  grouping ip-grp {
-    container ipv4 {
-      presence "Enables IPv4 unless the 'enabled' leaf
-                (which defaults to 'true') is set to 'false'";
-      description
-        "Parameters for the IPv4 address family.";
-      leaf enabled {
-        type boolean;
-        default "false";
-        description
-          "Controls whether IPv4 is enabled or disabled on this
-           interface.  When IPv4 is enabled, this interface is
-           connected to an IPv4 stack, and the interface can send
-           and receive IPv4 packets.";
-      }
-      leaf forwarding {
-        type boolean;
-        default "false";
-        description
-          "Controls IPv4 packet forwarding of datagrams received by,
-           but not addressed to, this interface.  IPv4 routers
-           forward datagrams.  IPv4 hosts do not (except those
-           source-routed via the host).";
-      }
-      leaf mtu {
-        type uint16 {
-          range "68..max";
-        }
-        units "octets";
-        default "1500";
-        description
-          "The size, in octets, of the largest IPv4 packet that the
-           interface will send and receive.
-
-           The server may restrict the allowed values for this leaf,
-           depending on the interface's type.
-
-           If this leaf is not configured, the operationally used MTU
-           depends on the interface's type.
-
-           The max value supported must be at least 9000.";
-        reference
-          "RFC 791: Internet Protocol";
-      }
-      leaf address-src {
-        when "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface[org-openroadm-device:name='UNNUMBERED']";
-        type enumeration {
-          enum NEM {
-            value 1;
-          }
-        }
-        description
-          "The source of the shared IP address for unnumbered IP interface.";
-      }
-      leaf address-force {
-        when "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface[org-openroadm-device:name='UNNUMBERED']";
-        type leafref {
-          path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface/org-openroadm-ip:ipv4/org-openroadm-ip:address/org-openroadm-ip:ip";
-        }
-        must "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface[org-openroadm-device:name='NEM']/org-openroadm-ip:ipv4/org-openroadm-ip:address[org-openroadm-ip:ip=current()]/org-openroadm-ip:ip = current()" {
-          error-message "IP address shall be sourced from the NEM interface only";
-        }
-        must 'not (../address-src)' {
-          error-message "Both address-src & address-force cannot be configured at the same time";
-        }
-        description
-          "The IP address to use for the unnumbered interface";
-      }
-      list address {
-        key "ip";
-        description
-          "The list of configured IPv4 addresses on the interface.";
-        leaf ip {
-          type inet:ipv4-address-no-zone;
-          description
-            "The IPv4 address on the interface.";
-        }
-        leaf preferred {
-          when "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface[org-openroadm-device:name='NEM']";
-          type enumeration {
-            enum true {
-              value 1;
-            }
-            enum false {
-              value 0;
-            }
-          }
-          default "false";
-          description
-            "Mark address availability for unnumbered interface use.";
-        }
-        choice subnet {
-          mandatory true;
-          description
-            "The subnet can be specified as a prefix-length, or,
-             if the server supports non-contiguous netmasks, as
-             a netmask.";
-          leaf prefix-length {
-            type uint8 {
-              range "0..32";
-            }
-            description
-              "The length of the subnet prefix.";
-          }
-          leaf netmask {
-            if-feature "ipv4-non-contiguous-netmasks";
-            type yang:dotted-quad;
-            description
-              "The subnet specified as a netmask.";
-          }
-        }
-      }
-    }
-    container ipv6 {
-      presence "Enables IPv6 unless the 'enabled' leaf
-                (which defaults to 'true') is set to 'false'";
-      description
-        "Parameters for the IPv6 address family.";
-      leaf enabled {
-        type boolean;
-        default "false";
-        description
-          "Controls whether IPv6 is enabled or disabled on this
-           interface.  When IPv6 is enabled, this interface is
-           connected to an IPv6 stack, and the interface can send
-           and receive IPv6 packets.";
-      }
-      leaf forwarding {
-        type boolean;
-        default "false";
-        description
-          "Controls IPv6 packet forwarding of datagrams received by,
-           but not addressed to, this interface.  IPv6 routers
-           forward datagrams.  IPv6 hosts do not (except those
-           source-routed via the host).";
-        reference
-          "RFC 4861: Neighbor Discovery for IP version 6 (IPv6)
-                     Section 6.2.1, IsRouter";
-      }
-      leaf mtu {
-        type uint32 {
-          range "1280..1500";
-        }
-        units "octets";
-        default "1500";
-        description
-          "The size, in octets, of the largest IPv6 packet that the
-           interface will send and receive.
-
-           The server may restrict the allowed values for this leaf,
-           depending on the interface's type.
-
-           If this leaf is not configured, the operationally used MTU
-           depends on the interface's type.";
-        reference
-          "RFC 2460: Internet Protocol, Version 6 (IPv6) Specification
-                     Section 5";
-      }
-      list address {
-        key "ip";
-        description
-          "The list of configured IPv6 addresses on the interface.";
-        leaf ip {
-          type inet:ipv6-address-no-zone;
-          description
-            "The IPv6 address on the interface.";
-        }
-        leaf prefix-length {
-          type uint8 {
-            range "0..128";
-          }
-          mandatory true;
-          description
-            "The length of the subnet prefix.";
-        }
-      }
-    }
-    description
-     "Grouping for ip";
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:ip'";
-    description
-      "Parameters for configuring IP on interfaces.
-
-       If an interface is not capable of running IP, the server
-       must not allow the client to configure these parameters.";
-    uses ip-grp;
-    }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-ipv4-unicast-routing@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-ipv4-unicast-routing@2020-05-29.yang
deleted file mode 100644 (file)
index 48e3064..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-module org-openroadm-ipv4-unicast-routing {
-  namespace "http://org/openroadm/ipv4-unicast-routing";
-  prefix org-openroadm-ipv4-unicast-routing;
-
-  import org-openroadm-routing {
-    prefix org-openroadm-routing;
-    revision-date 2020-05-29;
-  }
-  import ietf-inet-types {
-    prefix inet;
-    revision-date 2013-07-15;
-  }
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2020-05-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "This model defines Yang model for IPv4 unicast routing.
-
-     This model reuses data items defined in the IETF YANG model for
-     interfaces described by RFC 8022.
-
-     Some attributes which are not required in Open ROADM MSA are removed.
-     Yang file included are changed to fit into Open ROADM MSA yang structure.
-
-     IETF code is subject to the following copyright and license:
-     Copyright (c) IETF Trust and the persons identified as authors of
-     the code.
-     All rights reserved.
-
-     Redistribution and use in source and binary forms, with or without
-     modification, is permitted pursuant to, and subject to the license
-     terms contained in, the Simplified BSD License set forth in
-     Section 4.c of the IETF Trust's Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info).";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2015-05-25 {
-    description
-      "Initial revision.";
-    reference
-      "RFC XXXX: A YANG Data Model for Routing Management";
-  }
-
-  identity ipv4-unicast {
-    base org-openroadm-routing:ipv4;
-    description
-      "This identity represents the IPv4 unicast address family.";
-  }
-
-  grouping ipv4-uni-grp {
-    container ipv4 {
-      description
-        "Configuration of a 'static' pseudo-protocol instance
-         consists of a list of routes.";
-      list route {
-        key "destination-prefix";
-        max-elements 32;
-        ordered-by user;
-        description
-          "A user-ordered list of static routes.";
-        leaf destination-prefix {
-          type inet:ipv4-prefix;
-          mandatory true;
-          description
-            "IPv4 destination prefix.";
-        }
-        leaf description {
-          type string;
-          description
-            "Textual description of the route.";
-        }
-        container next-hop {
-          description
-            "Configuration of next-hop.";
-          uses org-openroadm-routing:next-hop-content {
-            augment "next-hop-options" {
-              description
-                "Add next-hop address case.";
-              leaf next-hop-address {
-                type inet:ipv4-address;
-                description
-                  "IPv4 address of the next-hop.";
-              }
-            }
-          }
-        }
-      }
-    }
-    description
-     "Grouping for IPv4";
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-routing:routing/org-openroadm-routing:routing-instance/org-openroadm-routing:routing-protocols/org-openroadm-routing:routing-protocol/org-openroadm-routing:static-routes" {
-    description
-      "This augment defines the configuration of the 'static'
-       pseudo-protocol with data specific to IPv4 unicast.";
-    uses ipv4-uni-grp;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-ipv6-unicast-routing@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-ipv6-unicast-routing@2020-05-29.yang
deleted file mode 100644 (file)
index 992f1cb..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-module org-openroadm-ipv6-unicast-routing {
-  namespace "http://org/openroadm/ipv6-unicast-routing";
-  prefix org-openroadm-ipv6-unicast-routing;
-
-  import org-openroadm-routing {
-    prefix org-openroadm-routing;
-    revision-date 2020-05-29;
-  }
-  import ietf-inet-types {
-    prefix inet;
-    revision-date 2013-07-15;
-  }
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2020-05-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "This model defines Yang model for IPv6 unicast routing.
-
-     This model reuses data items defined in the IETF YANG model for
-     interfaces described by RFC 8022.
-
-     Some attributes which are not required in Open ROADM MSA are removed.
-     Yang file included are changed to fit into Open ROADM MSA yang structure.
-
-     IETF code is subject to the following copyright and license:
-     Copyright (c) IETF Trust and the persons identified as authors of
-     the code.
-     All rights reserved.
-
-     Redistribution and use in source and binary forms, with or without
-     modification, is permitted pursuant to, and subject to the license
-     terms contained in, the Simplified BSD License set forth in
-     Section 4.c of the IETF Trust's Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info).";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2015-05-25 {
-    description
-      "Initial revision.";
-    reference
-      "RFC XXXX: A YANG Data Model for Routing Management";
-  }
-
-  identity ipv6-unicast {
-    base org-openroadm-routing:ipv6;
-    description
-      "This identity represents the IPv6 unicast address family.";
-  }
-
-  grouping ipv6-uni-grp {
-    container ipv6 {
-      description
-        "Configuration of a 'static' pseudo-protocol instance
-         consists of a list of routes.";
-      list route {
-        key "destination-prefix";
-        ordered-by user;
-        description
-          "A user-ordered list of static routes.";
-        leaf destination-prefix {
-          type inet:ipv6-prefix;
-          mandatory true;
-          description
-            "IPv6 destination prefix.";
-        }
-        leaf description {
-          type string;
-          description
-            "Textual description of the route.";
-        }
-        container next-hop {
-          description
-            "Configuration of next-hop.";
-          uses org-openroadm-routing:next-hop-content {
-            augment "next-hop-options" {
-              description
-                "Add next-hop address case.";
-              leaf next-hop-address {
-                type inet:ipv6-address;
-                description
-                  "IPv6 address of the next-hop.";
-              }
-            }
-          }
-        }
-      }
-    }
-    description
-      "Grouping for IPv6";
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-routing:routing/org-openroadm-routing:routing-instance/org-openroadm-routing:routing-protocols/org-openroadm-routing:routing-protocol/org-openroadm-routing:static-routes" {
-    description
-      "This augment defines the configuration of the 'static'
-       pseudo-protocol with data specific to IPv6 unicast.";
-    uses ipv6-uni-grp;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-key-chain@2019-11-29.yang b/ordmodels/device/src/main/yang/org-openroadm-key-chain@2019-11-29.yang
deleted file mode 100644 (file)
index 69d8d8c..0000000
+++ /dev/null
@@ -1,230 +0,0 @@
-module org-openroadm-key-chain {
-  namespace "http://org/openroadm/key-chain";
-  prefix org-openroadm-key-chain;
-
-  import ietf-yang-types {
-    prefix yang;
-    revision-date 2013-07-15;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "This model defines the Yang model for key chain.
-
-     This model reuses data items defined in the IETF YANG model for
-     key-chain as described by RFC 8177.
-
-     Some attributes which are not required in Open ROADM MSA are removed.
-     Yang file included are changed to fit into Open ROADM MSA yang structure.
-
-     IETF code is subject to the following copyright and license:
-     Copyright (c) IETF Trust and the persons identified as authors of
-     the code.
-     All rights reserved.
-
-     Redistribution and use in source and binary forms, with or without
-     modification, is permitted pursuant to, and subject to the license
-     terms contained in, the Simplified BSD License set forth in
-     Section 4.c of the IETF Trust's Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info).";
-
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Initial revision.";
-  }
-
-  feature hex-key-string {
-    description
-      "Support hexadecimal key string.";
-  }
-
-  feature independent-send-accept-lifetime {
-    description
-      "Support for independent send and accept key lifetimes.";
-  }
-
-  feature crypto-hmac-sha-1-12 {
-    description
-      "Support for TCP HMAC-SHA-1 12 byte digest hack.";
-  }
-
-  typedef key-chain-ref {
-    type leafref {
-      path "/org-openroadm-key-chain:key-chains/key-chain-list/org-openroadm-key-chain:name";
-    }
-    description
-      "This type is used by data models that need to reference
-       configured key-chains.";
-  }
-
-  grouping lifetime {
-    description
-      "Key lifetime specification.";
-    choice lifetime {
-      default "always";
-      description
-        "Options for specifying key accept or send lifetimes";
-      case always {
-        leaf always {
-          type empty;
-          description
-            "Indicates key lifetime is always valid.";
-        }
-      }
-      case start-end-time {
-        leaf start-date-time {
-          type yang:date-and-time;
-          description
-            "Start time.";
-        }
-        choice end-time {
-          default "infinite";
-          description
-            "End-time setting.";
-          case infinite {
-            leaf no-end-time {
-              type empty;
-              description
-                "Indicates key lifetime end-time in infinite.";
-            }
-          }
-          case duration {
-            leaf duration {
-              type uint32 {
-                range "1..2147483646";
-              }
-              units "seconds";
-              description
-                "Key lifetime duration, in seconds";
-            }
-          }
-          case end-date-time {
-            leaf end-date-time {
-              type yang:date-and-time;
-              description
-                "End time.";
-            }
-          }
-        }
-      }
-    }
-  }
-
-  grouping crypto-algorithm-types {
-    description
-      "Cryptographic algorithm types.";
-    choice algorithm {
-      description
-        "Options for crytographic algorithm specification.";
-      case md5 {
-        leaf md5 {
-          type empty;
-          description
-            "The MD5 algorithm.";
-        }
-      }
-    }
-  }
-
-  grouping key-chain {
-    description
-      "key-chain specification grouping.";
-    leaf name {
-      type string;
-      description
-        "Name of the key-chain.";
-    }
-    list key-chain-entry {
-      key "key-id";
-      description
-        "One key.";
-      leaf key-id {
-        type uint64 {
-          range "1..255" {
-            error-message "Configured value is out of range";
-          }
-        }
-        description
-          "Key id.";
-      }
-      container key-string {
-        description
-          "The key string.";
-        choice key-string-style {
-          description
-            "Key string styles";
-          case keystring {
-            leaf keystring {
-              type string {
-                length "1..16" {
-                  error-message "Configured string exceeds the maximum length";
-                }
-              }
-              description
-                "Key string in ASCII format.";
-            }
-          }
-          case hexadecimal {
-            if-feature "hex-key-string";
-          }
-        }
-      }
-      container crypto-algorithm {
-        description
-          "Cryptographic algorithm associated with key.";
-        uses crypto-algorithm-types;
-      }
-    }
-  }
-
-  container key-chains {
-    description
-      "All configured key-chains for the device.";
-    list key-chain-list {
-      key "name";
-      description
-        "List of key-chains.";
-      uses key-chain;
-    }
-  }
-  container key-chains-state {
-    config false;
-    description
-      "All configured key-chains state.";
-    list key-chain-list-state {
-      description
-        "One key-chain state.";
-      leaf name-state {
-        type string;
-        description
-          "Configured name of the key-chain.";
-      }
-      list key-chain-entry {
-        key "key-id";
-        description
-          "One key.";
-        leaf key-id {
-          type uint64;
-          description
-            "Configurd key id.";
-        }
-        container crypto-algorithm-state {
-          description
-            "Configured cryptographic algorithm.";
-          uses crypto-algorithm-types;
-        }
-      }
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-lldp@2016-10-14.yang b/ordmodels/device/src/main/yang/org-openroadm-lldp@2016-10-14.yang
deleted file mode 100644 (file)
index 08b2a16..0000000
+++ /dev/null
@@ -1,304 +0,0 @@
-module org-openroadm-lldp {
-  namespace "http://org/openroadm/lldp";
-  prefix org-openroadm-lldp;
-
-  import ietf-inet-types {
-    prefix inet;
-  }
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2017-02-06;
-  }
-  import iana-afn-safi {
-    prefix ianaaf;
-  }
-  import org-openroadm-resource-types {
-    prefix org-openroadm-resource-types;
-    revision-date 2016-10-14;
-  }
-  import ietf-yang-types {
-    prefix yang;
-  }
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for lldp protocol.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-  grouping nbr-info-grp {
-    description
-      "Display LLDP Neighbour ";
-
-    leaf remoteSysName {
-      type string;
-      description
-        "remote neighbour system name";
-    }
-    leaf remoteMgmtAddressSubType {
-      type ianaaf:address-family;
-      description
-        "remote neighbour Management Address Subtype Enumeration";
-    }
-    leaf remoteMgmtAddress {
-      type inet:ip-address;
-      description
-        "remote neighbour management address";
-    }
-    leaf remotePortIdSubType {
-      type enumeration {
-        enum "other" {
-          value 0;
-          description
-            "reserved";
-        }
-        enum "ifalias" {
-          value 1;
-          description
-            "Interface Alias (IfAlias - IETF RFC 2863) ";
-        }
-        enum "portcomponent" {
-          value 2;
-          description
-            "Port component (EntPhysicalAlias IETF RFC 4133)";
-        }
-        enum "macaddress" {
-          value 3;
-          description
-            "MAC address (IEEE Std 802) ";
-        }
-        enum "networkaddress" {
-          value 4;
-          description
-            "Network Address";
-        }
-        enum "ifname" {
-          value 5;
-          description
-            "Interface Name (ifName - IETF RFC 2863)";
-        }
-        enum "agentcircuitid" {
-          value 6;
-          description
-            "Agent Circuit Id (IETF RFC 3046)";
-        }
-        enum "local" {
-          value 7;
-          description
-            "Locally assigned";
-        }
-      }
-      description
-        "remote neighbour Port ID Subtype Enumeration";
-    }
-    leaf remotePortId {
-      type string;
-      description
-        "remote neighbour port Id";
-    }
-    leaf remoteChassisIdSubType {
-      type enumeration {
-        enum "reserved" {
-          value 0;
-          description
-            "reserved";
-        }
-        enum "chassiscomponent" {
-          value 1;
-          description
-            "Chassis component (EntPhysicalAlias IETF RFC 4133)";
-        }
-        enum "ifalias" {
-          value 2;
-          description
-            "Interface Alias (IfAlias - IETF RFC 2863) ";
-        }
-        enum "portcomponent" {
-          value 3;
-          description
-            "Port component (EntPhysicalAlias IETF RFC 4133)";
-        }
-        enum "macaddress" {
-          value 4;
-          description
-            "MAC address (IEEE Std 802) ";
-        }
-        enum "networkaddress" {
-          value 5;
-          description
-            "Network Address";
-        }
-        enum "ifname" {
-          value 6;
-          description
-            "Interface Name (ifName - IETF RFC 2863)";
-        }
-        enum "local" {
-          value 7;
-          description
-            "Locally assigned";
-        }
-      }
-      description
-        "Chassis ID Subtype Enumeration";
-    }
-    leaf remoteChassisId {
-      type string;
-      description
-        "remote neighbour Chassis Id";
-    }
-  }
-
-  grouping lldp-container {
-    container lldp {
-      description
-        "LLDP configurable and retrievable";
-      container global-config {
-        description
-          "LLDP global configurations";
-        leaf adminStatus {
-          type enumeration {
-            enum "disable" {
-              value 0;
-              description
-                "Disable the LLDP feature per NE";
-            }
-            enum "enable" {
-              value 1;
-              description
-                "Enable the LLDP feature per NE";
-            }
-          }
-          description
-            "LLDP feature Enable/Disable per NE";
-          default "enable";
-        }
-        leaf msgTxInterval {
-          type uint16 {
-            range "5..32768";
-          }
-          description
-            "LLDP frame Retransmit Interval in seconds";
-          default "30";
-        }
-        leaf msgTxHoldMultiplier {
-          type uint8 {
-            range "2..10";
-          }
-          description
-            "TTL value for the TLVs transmitter over wire in seconds";
-          default "4";
-        }
-      }
-      list port-config {
-        description
-          "LLDP port configurations";
-        key "ifName";
-        leaf ifName {
-          type leafref {
-            path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface/org-openroadm-device:name";
-          }
-          description
-            "Ethernet interface name where LLDP runs";
-        }
-        leaf adminStatus {
-          type enumeration {
-            enum "disable" {
-              value 0;
-              description
-                "Disables the LLDP frames transmit and receive on specific interface";
-            }
-            enum "txandrx" {
-              value 1;
-              description
-                "Enable Transmit and Receive LLDP frames on specific interface";
-            }
-          }
-          description
-            "LLDP enable per port basis";
-          default "txandrx";
-        }
-      }
-      container nbr-list {
-        description
-          "LLDP Oper data - Neighbour List information";
-        config false;
-        list if-name {
-          key "ifName";
-          leaf ifName {
-            type string;
-            description
-              "Ethernet interface name where LLDP runs";
-          }
-          uses nbr-info-grp;
-        }
-      }
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:protocols" {
-    when "/org-openroadm-device:org-openroadm-device/org-openroadm-device:info/org-openroadm-device:node-type='rdm'";
-    uses lldp-container;
-  }
-
-  notification lldp-nbr-info-change {
-    description "LLDP: Neighbor Information Changed
-            remoteSysName
-            remoteSysMgmtAddressSubType
-            remoteSysMgmtAddress
-            remotePortIdSubType
-            remotePortId
-            remoteChassisIdSubType
-            remoteChassisId
-            All of the above attributes are sent in event";
-    leaf notification-type {
-      type org-openroadm-resource-types:resource-notification-type;
-    }
-    leaf resource-type {
-      type org-openroadm-resource-types:resource-type-enum;
-      description
-        "resource-type for this notification is interface";
-    }
-    leaf resource {
-      type string;
-      description
-        "resource interface-name";
-    }
-    container nbr-info {
-      uses nbr-info-grp;
-    }
-    leaf event-time {
-      type yang:date-and-time;
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-lldp@2018-10-19.yang b/ordmodels/device/src/main/yang/org-openroadm-lldp@2018-10-19.yang
deleted file mode 100755 (executable)
index 0b85ce1..0000000
+++ /dev/null
@@ -1,328 +0,0 @@
-module org-openroadm-lldp {
-  namespace "http://org/openroadm/lldp";
-  prefix org-openroadm-lldp;
-
-  import ietf-inet-types {
-    prefix inet;
-    revision-date 2013-07-15;
-  }
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2018-10-19;
-  }
-  import iana-afn-safi {
-    prefix ianaaf;
-    revision-date 2013-07-04;
-  }
-  import org-openroadm-resource-types {
-    prefix org-openroadm-resource-types;
-    revision-date 2018-10-19;
-  }
-  import ietf-yang-types {
-    prefix yang;
-    revision-date 2013-07-15;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for lldp protocol.
-     
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping nbr-info-grp {
-    description
-      "Display LLDP Neighbour ";
-    leaf remoteSysName {
-      type string;
-      description
-        "remote neighbour system name";
-    }
-    leaf remoteMgmtAddressSubType {
-      type ianaaf:address-family;
-      description
-        "remote neighbour Management Address Subtype Enumeration";
-    }
-    leaf remoteMgmtAddress {
-      type inet:ip-address;
-      description
-        "remote neighbour management address";
-    }
-    leaf remotePortIdSubType {
-      type enumeration {
-        enum "other" {
-          value 0;
-          description
-            "reserved";
-        }
-        enum "ifalias" {
-          value 1;
-          description
-            "Interface Alias (IfAlias - IETF RFC 2863) ";
-        }
-        enum "portcomponent" {
-          value 2;
-          description
-            "Port component (EntPhysicalAlias IETF RFC 4133)";
-        }
-        enum "macaddress" {
-          value 3;
-          description
-            "MAC address (IEEE Std 802) ";
-        }
-        enum "networkaddress" {
-          value 4;
-          description
-            "Network Address";
-        }
-        enum "ifname" {
-          value 5;
-          description
-            "Interface Name (ifName - IETF RFC 2863)";
-        }
-        enum "agentcircuitid" {
-          value 6;
-          description
-            "Agent Circuit Id (IETF RFC 3046)";
-        }
-        enum "local" {
-          value 7;
-          description
-            "Locally assigned";
-        }
-      }
-      description
-        "remote neighbour Port ID Subtype Enumeration";
-    }
-    leaf remotePortId {
-      type string;
-      description
-        "remote neighbour port Id";
-    }
-    leaf remoteChassisIdSubType {
-      type enumeration {
-        enum "reserved" {
-          value 0;
-          description
-            "reserved";
-        }
-        enum "chassiscomponent" {
-          value 1;
-          description
-            "Chassis component (EntPhysicalAlias IETF RFC 4133)";
-        }
-        enum "ifalias" {
-          value 2;
-          description
-            "Interface Alias (IfAlias - IETF RFC 2863) ";
-        }
-        enum "portcomponent" {
-          value 3;
-          description
-            "Port component (EntPhysicalAlias IETF RFC 4133)";
-        }
-        enum "macaddress" {
-          value 4;
-          description
-            "MAC address (IEEE Std 802) ";
-        }
-        enum "networkaddress" {
-          value 5;
-          description
-            "Network Address";
-        }
-        enum "ifname" {
-          value 6;
-          description
-            "Interface Name (ifName - IETF RFC 2863)";
-        }
-        enum "local" {
-          value 7;
-          description
-            "Locally assigned";
-        }
-      }
-      description
-        "Chassis ID Subtype Enumeration";
-    }
-    leaf remoteChassisId {
-      type string;
-      description
-        "remote neighbour Chassis Id";
-    }
-  }
-
-  grouping lldp-container {
-    container lldp {
-      description
-        "LLDP configurable and retrievable";
-      container global-config {
-        description
-          "LLDP global configurations";
-        leaf adminStatus {
-          type enumeration {
-            enum "disable" {
-              value 0;
-              description
-                "Disable the LLDP feature per NE";
-            }
-            enum "enable" {
-              value 1;
-              description
-                "Enable the LLDP feature per NE";
-            }
-          }
-          default "enable";
-          description
-            "LLDP feature Enable/Disable per NE";
-        }
-        leaf msgTxInterval {
-          type uint16 {
-            range "5..32768";
-          }
-          default "30";
-          description
-            "LLDP frame Retransmit Interval in seconds";
-        }
-        leaf msgTxHoldMultiplier {
-          type uint8 {
-            range "2..10";
-          }
-          default "4";
-          description
-            "TTL value for the TLVs transmitter over wire in seconds";
-        }
-      }
-      list port-config {
-        key "ifName";
-        description
-          "LLDP port configurations";
-        leaf ifName {
-          type leafref {
-            path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface/org-openroadm-device:name";
-          }
-          description
-            "Ethernet interface name where LLDP runs";
-        }
-        leaf adminStatus {
-          type enumeration {
-            enum "disable" {
-              value 0;
-              description
-                "Disables the LLDP frames transmit and receive on specific interface";
-            }
-            enum "txandrx" {
-              value 1;
-              description
-                "Enable Transmit and Receive LLDP frames on specific interface";
-            }
-          }
-          default "txandrx";
-          description
-            "LLDP enable per port basis";
-        }
-      }
-      container nbr-list {
-        config false;
-        description
-          "LLDP Oper data - Neighbour List information";
-        list if-name {
-          key "ifName";
-          leaf ifName {
-            type string;
-            description
-              "Ethernet interface name where LLDP runs";
-          }
-          uses nbr-info-grp;
-        }
-      }
-    }
-  }
-
-  notification lldp-nbr-info-change {
-    description
-      "LLDP: Neighbor Information Changed
-       remoteSysName
-       remoteSysMgmtAddressSubType
-       remoteSysMgmtAddress
-       remotePortIdSubType
-       remotePortId
-       remoteChassisIdSubType
-       remoteChassisId
-       All of the above attributes are sent in event";
-    leaf notification-type {
-      type org-openroadm-resource-types:resource-notification-type;
-    }
-    leaf resource-type {
-      type org-openroadm-resource-types:resource-type-enum;
-      description
-        "resource-type for this notification is interface";
-    }
-    leaf resource {
-      type string;
-      description
-        "resource interface-name";
-    }
-    container nbr-info {
-      uses nbr-info-grp;
-    }
-    leaf event-time {
-      type yang:date-and-time;
-    }
-  }
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:protocols" {
-    when "/org-openroadm-device:org-openroadm-device/org-openroadm-device:info/org-openroadm-device:node-type='rdm' or /org-openroadm-device:org-openroadm-device/org-openroadm-device:info/org-openroadm-device:node-type='ila'";
-    uses lldp-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-lldp@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-lldp@2020-05-29.yang
deleted file mode 100644 (file)
index a541eac..0000000
+++ /dev/null
@@ -1,365 +0,0 @@
-module org-openroadm-lldp {
-  namespace "http://org/openroadm/lldp";
-  prefix org-openroadm-lldp;
-
-  import ietf-inet-types {
-    prefix inet;
-    revision-date 2013-07-15;
-  }
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2020-05-29;
-  }
-  import iana-afn-safi {
-    prefix ianaaf;
-    revision-date 2013-07-04;
-  }
-  import org-openroadm-resource-types {
-    prefix org-openroadm-resource-types;
-    revision-date 2019-11-29;
-  }
-  import ietf-yang-types {
-    prefix yang;
-    revision-date 2013-07-15;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for lldp protocol.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping nbr-info-grp {
-    description
-      "Display LLDP Neighbour ";
-    leaf remoteSysName {
-      type string;
-      description
-        "remote neighbour system name";
-    }
-    leaf remoteMgmtAddressSubType {
-      type ianaaf:address-family;
-      description
-        "remote neighbour Management Address Subtype Enumeration";
-    }
-    leaf remoteMgmtAddress {
-      type inet:ip-address;
-      description
-        "remote neighbour management address";
-    }
-    leaf remotePortIdSubType {
-      type enumeration {
-        enum other {
-          value 0;
-          description
-            "reserved";
-        }
-        enum ifalias {
-          value 1;
-          description
-            "Interface Alias (IfAlias - IETF RFC 2863) ";
-        }
-        enum portcomponent {
-          value 2;
-          description
-            "Port component (EntPhysicalAlias IETF RFC 4133)";
-        }
-        enum macaddress {
-          value 3;
-          description
-            "MAC address (IEEE Std 802) ";
-        }
-        enum networkaddress {
-          value 4;
-          description
-            "Network Address";
-        }
-        enum ifname {
-          value 5;
-          description
-            "Interface Name (ifName - IETF RFC 2863)";
-        }
-        enum agentcircuitid {
-          value 6;
-          description
-            "Agent Circuit Id (IETF RFC 3046)";
-        }
-        enum local {
-          value 7;
-          description
-            "Locally assigned";
-        }
-      }
-      description
-        "remote neighbour Port ID Subtype Enumeration";
-    }
-    leaf remotePortId {
-      type string;
-      description
-        "remote neighbour port Id";
-    }
-    leaf remoteChassisIdSubType {
-      type enumeration {
-        enum reserved {
-          value 0;
-          description
-            "reserved";
-        }
-        enum chassiscomponent {
-          value 1;
-          description
-            "Chassis component (EntPhysicalAlias IETF RFC 4133)";
-        }
-        enum ifalias {
-          value 2;
-          description
-            "Interface Alias (IfAlias - IETF RFC 2863) ";
-        }
-        enum portcomponent {
-          value 3;
-          description
-            "Port component (EntPhysicalAlias IETF RFC 4133)";
-        }
-        enum macaddress {
-          value 4;
-          description
-            "MAC address (IEEE Std 802) ";
-        }
-        enum networkaddress {
-          value 5;
-          description
-            "Network Address";
-        }
-        enum ifname {
-          value 6;
-          description
-            "Interface Name (ifName - IETF RFC 2863)";
-        }
-        enum local {
-          value 7;
-          description
-            "Locally assigned";
-        }
-      }
-      description
-        "Chassis ID Subtype Enumeration";
-    }
-    leaf remoteChassisId {
-      type string;
-      description
-        "remote neighbour Chassis Id";
-    }
-  }
-
-  grouping lldp-container {
-    container lldp {
-      description
-        "LLDP configurable and retrievable";
-      container global-config {
-        description
-          "LLDP global configurations";
-        leaf adminStatus {
-          type enumeration {
-            enum disable {
-              value 0;
-              description
-                "Disable the LLDP feature per NE";
-            }
-            enum enable {
-              value 1;
-              description
-                "Enable the LLDP feature per NE";
-            }
-          }
-          default "enable";
-          description
-            "LLDP feature Enable/Disable per NE";
-        }
-        leaf msgTxInterval {
-          type uint16 {
-            range "5..32768";
-          }
-          default "30";
-          description
-            "LLDP frame Retransmit Interval in seconds";
-        }
-        leaf msgTxHoldMultiplier {
-          type uint8 {
-            range "2..10";
-          }
-          default "4";
-          description
-            "TTL value for the TLVs transmitter over wire in seconds";
-        }
-      }
-      list port-config {
-        key "ifName";
-        description
-          "LLDP port configurations";
-        leaf ifName {
-          type leafref {
-            path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface/org-openroadm-device:name";
-          }
-          description
-            "Ethernet interface name where LLDP runs";
-        }
-        leaf adminStatus {
-          type enumeration {
-            enum disable {
-              value 0;
-              description
-                "Disables the LLDP frames transmit and receive on specific interface";
-            }
-            enum txandrx {
-              value 1;
-              description
-                "Enable Transmit and Receive LLDP frames on specific interface";
-            }
-          }
-          default "txandrx";
-          description
-            "LLDP enable per port basis";
-        }
-      }
-      container nbr-list {
-        config false;
-        description
-          "LLDP Oper data - Neighbour List information";
-        list if-name {
-          key "ifName";
-          leaf ifName {
-            type string;
-            description
-              "Ethernet interface name where LLDP runs";
-          }
-          uses nbr-info-grp;
-        }
-      }
-    }
-  }
-
-  notification lldp-nbr-info-change {
-    description
-      "LLDP: Neighbor Information Changed
-       remoteSysName
-       remoteSysMgmtAddressSubType
-       remoteSysMgmtAddress
-       remotePortIdSubType
-       remotePortId
-       remoteChassisIdSubType
-       remoteChassisId
-       All of the above attributes are sent in event";
-    leaf notification-type {
-      type org-openroadm-resource-types:resource-notification-type;
-    }
-    leaf resource-type {
-      type org-openroadm-resource-types:resource-type-enum;
-      description
-        "resource-type for this notification is interface";
-    }
-    leaf resource {
-      type string;
-      description
-        "resource interface-name";
-    }
-    container nbr-info {
-      uses nbr-info-grp;
-    }
-    leaf event-time {
-      type yang:date-and-time;
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:protocols" {
-    when "/org-openroadm-device:org-openroadm-device/org-openroadm-device:info/org-openroadm-device:node-type='rdm' or /org-openroadm-device:org-openroadm-device/org-openroadm-device:info/org-openroadm-device:node-type='ila'";
-    uses lldp-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-maintenance-loopback@2016-10-14.yang b/ordmodels/device/src/main/yang/org-openroadm-maintenance-loopback@2016-10-14.yang
deleted file mode 100644 (file)
index 4f50786..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-module org-openroadm-maintenance-loopback {
-  namespace "http://org/openroadm/maintenance-loopback";
-  prefix org-openroadm-maint-loopback;
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for maintenance loopback.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping maint-loopback {
-    container maint-loopback {
-      leaf enabled {
-        type boolean;
-        default "false";
-        description
-          "loopback operation enable flag";
-      }
-      leaf type {
-        when "../enabled = 'true'";
-        type enumeration {
-          enum "fac" {
-            value 0;
-            description
-              "pre-FEC Loopback in the facility direction";
-          }
-          enum "term" {
-            value 1;
-            description
-              "Loopback in the terminal direction";
-          }
-          enum "fac2" {
-            value 2;
-            description
-              "post-FEC Loopback in the facility direction";
-          }
-        }
-        default "fac";
-        description
-          "Set Loopback type (or direction).";
-      }
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-maintenance-loopback@2017-12-15.yang b/ordmodels/device/src/main/yang/org-openroadm-maintenance-loopback@2017-12-15.yang
deleted file mode 100755 (executable)
index da8f5cd..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-module org-openroadm-maintenance-loopback {
-  namespace "http://org/openroadm/maintenance-loopback";
-  prefix org-openroadm-maint-loopback;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for maintenance loopback.
-     
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping maint-loopback {
-    container maint-loopback {
-      leaf enabled {
-        type boolean;
-        default "false";
-        description
-          "loopback operation enable flag";
-      }
-      leaf type {
-        when "../enabled = 'true'";
-        type enumeration {
-          enum "fac" {
-            value 0;
-            description
-              "pre-FEC Loopback in the facility direction";
-          }
-          enum "term" {
-            value 1;
-            description
-              "Loopback in the terminal direction";
-          }
-          enum "fac2" {
-            value 2;
-            description
-              "post-FEC Loopback in the facility direction";
-          }
-        }
-        default "fac";
-        description
-          "Set Loopback type (or direction).";
-      }
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-maintenance-loopback@2019-11-29.yang b/ordmodels/device/src/main/yang/org-openroadm-maintenance-loopback@2019-11-29.yang
deleted file mode 100644 (file)
index ed46bb9..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-module org-openroadm-maintenance-loopback {
-  namespace "http://org/openroadm/maintenance-loopback";
-  prefix org-openroadm-maint-loopback;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for maintenance loopback.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping maint-loopback {
-    container maint-loopback {
-      leaf enabled {
-        type boolean;
-        default "false";
-        description
-          "loopback operation enable flag";
-      }
-      leaf type {
-        when "../enabled = 'true'";
-        type enumeration {
-          enum fac {
-            value 0;
-            description
-              "pre-FEC Loopback in the facility direction";
-          }
-          enum term {
-            value 1;
-            description
-              "Loopback in the terminal direction";
-          }
-          enum fac2 {
-            value 2;
-            description
-              "post-FEC Loopback in the facility direction";
-          }
-        }
-        default "fac";
-        description
-          "Set Loopback type (or direction).";
-      }
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-maintenance-testsignal@2016-10-14.yang b/ordmodels/device/src/main/yang/org-openroadm-maintenance-testsignal@2016-10-14.yang
deleted file mode 100644 (file)
index 67d980b..0000000
+++ /dev/null
@@ -1,134 +0,0 @@
-module org-openroadm-maintenance-testsignal {
-  namespace "http://org/openroadm/maintenance-testsignal";
-  prefix org-openroadm-maint-testsignal;
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for maintenance testsignal.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping maint-testsignal {
-    container maint-testsignal {
-      leaf enabled {
-        type boolean;
-        default "false";
-        description
-          "testsignal enabled flag";
-      }
-      leaf testPattern {
-        when "../enabled = 'true'";
-        type enumeration {
-          enum "PRBS" {
-            value 0;
-            description
-              "Unframed, inverted PN-31 pattern or PRBS31 pattern per IEEE 802.3 clause 50.3.8.2 (inverted PN-31at line rate)";
-          }
-          enum "PRBS31" {
-            value 1;
-            description
-              "PRBS31 with standard mapping per G.709";
-          }
-          enum "PRBS23" {
-            value 2;
-            description
-              "SONET/SDH Framed,inverted PN-23 pattern.";
-          }
-          enum "PRZEROS" {
-            value 3;
-            description
-              "pseudo-random with zeros data pattern per IEEE 802.3 clause 49.2.8";
-          }
-          enum "IDLE" {
-            value 4;
-            description
-              "Scrambled IDLE test-pattern per IEEE 802.3ba";
-          }
-        }
-        description
-          "Set test signal pattern";
-      }
-      leaf type {
-        when "../enabled = 'true'";
-        type enumeration {
-          enum "fac" {
-            value 0;
-            description
-              "test signal in the facility direction";
-          }
-          enum "term" {
-            value 1;
-            description
-              "test signal in the terminal direction";
-          }
-        }
-        default "fac";
-        description
-          "Set test signal type (or direction).";
-      }
-      leaf bitErrors {
-        when "../enabled = 'true' and ../type = 'fac'";
-        type uint32 {
-          range "0..4294967295";
-        }
-        config false;
-        description
-          "bit errors for test signal in facility direction.";
-      }
-      leaf bitErrorsTerminal {
-        when "../enabled = 'true' and ../type = 'term'";
-        type uint32 {
-          range "0..4294967295";
-        }
-        config false;
-        description
-          "bit errors for test signal in terminal direction.";
-      }
-      leaf syncSeconds {
-        when "../enabled = 'true' and ../type = 'fac'";
-        type string;
-        config false;
-        description
-          "number of seconds the received facility test signal is in sync.";
-      }
-      leaf syncSecondsTerminal {
-        when "../enabled = 'true' and ../type = 'term'";
-        type string;
-        config false;
-        description
-          "number of seconds the received terminal test signal is in sync.";
-      }
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-maintenance-testsignal@2017-12-15.yang b/ordmodels/device/src/main/yang/org-openroadm-maintenance-testsignal@2017-12-15.yang
deleted file mode 100755 (executable)
index 9816505..0000000
+++ /dev/null
@@ -1,139 +0,0 @@
-module org-openroadm-maintenance-testsignal {
-  namespace "http://org/openroadm/maintenance-testsignal";
-  prefix org-openroadm-maint-testsignal;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for maintenance testsignal.
-     
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping maint-testsignal {
-    container maint-testsignal {
-      leaf enabled {
-        type boolean;
-        default "false";
-        description
-          "testsignal enabled flag";
-      }
-      leaf testPattern {
-        when "../enabled = 'true'";
-        type enumeration {
-          enum "PRBS" {
-            value 0;
-            description
-              "Unframed, inverted PN-31 pattern or PRBS31 pattern per IEEE 802.3 clause 50.3.8.2 (inverted PN-31at line rate)";
-          }
-          enum "PRBS31" {
-            value 1;
-            description
-              "PRBS31 with standard mapping per G.709";
-          }
-          enum "PRBS23" {
-            value 2;
-            description
-              "SONET/SDH Framed,inverted PN-23 pattern.";
-          }
-          enum "PRZEROS" {
-            value 3;
-            description
-              "pseudo-random with zeros data pattern per IEEE 802.3 clause 49.2.8";
-          }
-          enum "IDLE" {
-            value 4;
-            description
-              "Scrambled IDLE test-pattern per IEEE 802.3ba";
-          }
-        }
-        description
-          "Set test signal pattern";
-      }
-      leaf type {
-        when "../enabled = 'true'";
-        type enumeration {
-          enum "fac" {
-            value 0;
-            description
-              "test signal in the facility direction";
-          }
-          enum "term" {
-            value 1;
-            description
-              "test signal in the terminal direction";
-          }
-        }
-        default "fac";
-        description
-          "Set test signal type (or direction).";
-      }
-      leaf bitErrors {
-        when "../enabled = 'true' and ../type = 'fac'";
-        type uint32 {
-          range "0..4294967295";
-        }
-        config false;
-        description
-          "bit errors for test signal in facility direction.";
-      }
-      leaf bitErrorsTerminal {
-        when "../enabled = 'true' and ../type = 'term'";
-        type uint32 {
-          range "0..4294967295";
-        }
-        config false;
-        description
-          "bit errors for test signal in terminal direction.";
-      }
-      leaf syncSeconds {
-        when "../enabled = 'true' and ../type = 'fac'";
-        type string;
-        config false;
-        description
-          "number of seconds the received facility test signal is in sync.";
-      }
-      leaf syncSecondsTerminal {
-        when "../enabled = 'true' and ../type = 'term'";
-        type string;
-        config false;
-        description
-          "number of seconds the received terminal test signal is in sync.";
-      }
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-maintenance-testsignal@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-maintenance-testsignal@2020-05-29.yang
deleted file mode 100644 (file)
index ce1b486..0000000
+++ /dev/null
@@ -1,207 +0,0 @@
-module org-openroadm-maintenance-testsignal {
-  yang-version 1.1;
-  namespace "http://org/openroadm/maintenance-testsignal";
-  prefix org-openroadm-maint-testsignal;
-
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2020-05-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for maintenance testsignal.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping maint-testsignal {
-    description
-      "Maintenance testsignal grouping";
-    container maint-testsignal {
-      description
-        "Maintenance testsignal container";
-      typedef testsig-type {
-        type enumeration {
-          enum fac {
-            value 0;
-            description
-              "test signal in the facility direction";
-          }
-          enum term {
-            value 1;
-            description
-              "test signal in the terminal direction";
-          }
-        }
-        description
-          "Testsignal enum typedef";
-      }
-
-      action clear-diagnostics {
-        description
-          "Perform maintenance and diagnostic counter clear.";
-        input {
-          leaf type {
-            type testsig-type;
-            description
-              "Maintenance and Diagnostic counter to be cleared.  If the type is not specified then it will reset the counter for the enabled type(s)";
-          }
-        }
-        output {
-          leaf status {
-            type org-openroadm-common-types:rpc-status;
-            mandatory true;
-            description
-              "RPC status";
-          }
-          leaf status-message {
-            type string;
-            description
-              "status message";
-          }
-        }
-      }
-      leaf enabled {
-        type boolean;
-        default "false";
-        description
-          "testsignal enabled flag";
-      }
-      leaf testPattern {
-        when "../enabled = 'true'";
-        type enumeration {
-          enum PRBS {
-            value 0;
-            description
-              "Unframed, inverted PN-31 pattern or PRBS31 pattern per IEEE 802.3 clause 50.3.8.2 (inverted PN-31 at line rate)";
-          }
-          enum PRBS31 {
-            value 1;
-            description
-              "PRBS31 with standard mapping per G.709";
-          }
-          enum PRBS23 {
-            value 2;
-            description
-              "SONET/SDH Framed,inverted PN-23 pattern.";
-          }
-          enum PRZEROS {
-            value 3;
-            description
-              "pseudo-random with zeros data pattern per IEEE 802.3 clause 49.2.8";
-          }
-          enum IDLE {
-            value 4;
-            description
-              "Scrambled IDLE test-pattern per IEEE 802.3ba";
-          }
-        }
-        mandatory true;
-        description
-          "Set test signal pattern";
-      }
-      leaf type {
-        when "../enabled = 'true'";
-        type testsig-type;
-        default "fac";
-        description
-          "Set test signal type (or direction).";
-      }
-      leaf inSync {
-        type boolean;
-        config false;
-        description
-          "sync status of the received test signal";
-      }
-      leaf seconds {
-        when "../enabled = 'true' and ../inSync = 'true'";
-        type uint32;
-        config false;
-        mandatory true;
-        description
-          "number of seconds the received test signal is in sync.";
-      }
-      leaf bitErrors {
-        when "../enabled = 'true'";
-        type uint32 {
-          range "0..4294967295";
-        }
-        config false;
-        description
-          "bit errors for test signal.";
-      }
-      leaf bitErrorRate {
-        type decimal64 {
-          fraction-digits 17;
-        }
-        config false;
-        description
-          "bit error rate of the received test signal";
-      }
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-media-channel-interfaces@2018-10-19.yang b/ordmodels/device/src/main/yang/org-openroadm-media-channel-interfaces@2018-10-19.yang
deleted file mode 100755 (executable)
index 4693a21..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-module org-openroadm-media-channel-interfaces {
-  namespace "http://org/openroadm/media-channel-interfaces";
-  prefix org-openroadm-media-channel-interfaces;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2017-06-26;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2018-10-19;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility och interfaces.
-     
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.
-     
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-     
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-     
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-
-  grouping mc-ttp-attributes {
-    description
-      "Media channel termination point. Models bandwidth allocation in physical media. Network media channels may be provisioned in the spectrum characterized by the frequency limits.";
-    leaf min-freq {
-      type org-openroadm-common-types:frequency-THz;
-      config true;
-      description
-        "Minimum Frequency in THz. Granularity is hardware dependent, based on pixel resolution. eg. ITU 12.5GHz frequency slots. Range covers C+L";
-    }
-    leaf max-freq {
-      type org-openroadm-common-types:frequency-THz;
-      config true;
-      description
-        "Maximum Frequency in THz. Granularity is hardware dependent, based on pixel resolution. eg. ITU 12.5GHz frequency slots. Range covers C+L";
-    }
-    leaf center-freq {
-      type org-openroadm-common-types:frequency-THz;
-      config false;
-      description
-        "Center Frequency in THz. Granularity is hardware dependent, based on center-freq-granularity.";
-    }
-    leaf slot-width {
-      type org-openroadm-common-types:frequency-GHz;
-      config false;
-      description
-        "Width of the slot.  Granularity is hardware dependent, based on slot-width-granularity";
-    }
-  }
-
-  grouping mc-ttp-container {
-    container mc-ttp {
-      description
-        "Media Channel Trail Termination Point (MC-TTP)";
-      uses mc-ttp-attributes;
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:mediaChannelTrailTerminationPoint'";
-    uses mc-ttp-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-media-channel-interfaces@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-media-channel-interfaces@2020-05-29.yang
deleted file mode 100644 (file)
index 7b1e03a..0000000
+++ /dev/null
@@ -1,163 +0,0 @@
-module org-openroadm-media-channel-interfaces {
-  namespace "http://org/openroadm/media-channel-interfaces";
-  prefix org-openroadm-media-channel-interfaces;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-optical-channel-types {
-    prefix org-openroadm-common-optical-channel-types;
-    revision-date 2020-05-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility och interfaces.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-
-  grouping mc-ttp-attributes {
-    description
-      "Media channel termination point. Models bandwidth allocation in physical media. Network media channels may be provisioned in the spectrum characterized by the frequency limits.";
-    leaf min-freq {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      config true;
-      description
-        "Minimum Frequency in THz. Granularity is hardware dependent, based on pixel resolution. eg. ITU 12.5GHz frequency slots. Range covers C+L";
-    }
-    leaf max-freq {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      config true;
-      description
-        "Maximum Frequency in THz. Granularity is hardware dependent, based on pixel resolution. eg. ITU 12.5GHz frequency slots. Range covers C+L";
-    }
-    leaf center-freq {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      config false;
-      description
-        "Center Frequency in THz. Granularity is hardware dependent, based on center-freq-granularity.";
-    }
-    leaf slot-width {
-      type org-openroadm-common-optical-channel-types:frequency-GHz;
-      config false;
-      description
-        "Width of the slot.  Granularity is hardware dependent, based on slot-width-granularity";
-    }
-  }
-
-  grouping mc-ttp-container {
-    container mc-ttp {
-      description
-        "Media Channel Trail Termination Point (MC-TTP)";
-      uses mc-ttp-attributes;
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:mediaChannelTrailTerminationPoint'";
-    uses mc-ttp-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-network-media-channel-interfaces@2018-10-19.yang b/ordmodels/device/src/main/yang/org-openroadm-network-media-channel-interfaces@2018-10-19.yang
deleted file mode 100755 (executable)
index 3eded06..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-module org-openroadm-network-media-channel-interfaces {
-  namespace "http://org/openroadm/network-media-channel-interfaces";
-  prefix org-openroadm-network-media-channel-interfaces;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2017-06-26;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2018-10-19;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility och interfaces.
-     
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.
-     
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-     
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-     
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-
-  grouping nmc-ctp-attributes {
-    description
-      "Network Media Channel attributes";
-    leaf frequency {
-      type org-openroadm-common-types:frequency-THz;
-      config true;
-      description
-        "Center Frequency in THz.  This is not constrained by mc-capabilities.  It must fit (when combined with width) inside any containing media channel.";
-    }
-    leaf width {
-      type org-openroadm-common-types:frequency-GHz;
-      config true;
-      description
-        "Frequency width in GHz.  This is not constrained by mc-capabilities.  It must fit (when combined with frequency) inside any containing media channel.";
-    }
-  }
-
-  grouping nmc-ctp-container {
-    container nmc-ctp {
-      description
-        "Network Media Channel Connection Termination Point (NMC-CTP)";
-      uses nmc-ctp-attributes;
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:networkMediaChannelConnectionTerminationPoint'";
-    uses nmc-ctp-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-network-media-channel-interfaces@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-network-media-channel-interfaces@2020-05-29.yang
deleted file mode 100644 (file)
index 08d9f1b..0000000
+++ /dev/null
@@ -1,151 +0,0 @@
-module org-openroadm-network-media-channel-interfaces {
-  namespace "http://org/openroadm/network-media-channel-interfaces";
-  prefix org-openroadm-network-media-channel-interfaces;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-optical-channel-types {
-    prefix org-openroadm-common-optical-channel-types;
-    revision-date 2020-05-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility och interfaces.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-
-  grouping nmc-ctp-attributes {
-    description
-      "Network Media Channel attributes";
-    leaf frequency {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      config true;
-      description
-        "Center Frequency in THz.  This is not constrained by mc-capabilities.  It must fit (when combined with width) inside any containing media channel.";
-    }
-    leaf width {
-      type org-openroadm-common-optical-channel-types:frequency-GHz;
-      config true;
-      description
-        "Frequency width in GHz.  This is not constrained by mc-capabilities.  It must fit (when combined with frequency) inside any containing media channel.";
-    }
-  }
-
-  grouping nmc-ctp-container {
-    container nmc-ctp {
-      description
-        "Network Media Channel Connection Termination Point (NMC-CTP)";
-      uses nmc-ctp-attributes;
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:networkMediaChannelConnectionTerminationPoint'";
-    uses nmc-ctp-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-optical-channel-interfaces@2016-10-14.yang b/ordmodels/device/src/main/yang/org-openroadm-optical-channel-interfaces@2016-10-14.yang
deleted file mode 100644 (file)
index 67dcc0d..0000000
+++ /dev/null
@@ -1,187 +0,0 @@
-module org-openroadm-optical-channel-interfaces {
-  namespace "http://org/openroadm/optical-channel-interfaces";
-  prefix org-openroadm-optical-channel-interfaces;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2017-02-06;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2016-10-14;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2016-10-14;
-  }
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility och interfaces.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  identity rate-identity {
-    description
-      "A unique rate identification";
-  }
-
-  identity R200G {
-    base rate-identity;
-    description
-      "Identity for 200G Rate";
-  }
-
-  identity R100G {
-    base rate-identity;
-    description
-      "Identity for 100G Rate";
-  }
-
-  identity R10.7G {
-    base rate-identity;
-    description
-      "Identity for 10.7G Rate";
-  }
-
-  identity R11.1G {
-    base rate-identity;
-    description
-      "Identity for 11.1G Rate";
-  }
-
-  grouping och-attributes {
-    description
-      "Optical Channel attributes";
-    leaf rate {
-      type identityref {
-        base rate-identity;
-      }
-      description
-        "rate";
-    }
-    leaf wavelength-number {
-      type uint32;
-    }
-    leaf modulation-format {
-      type enumeration {
-        enum "bpsk" {
-          value 0;
-          description
-            "binary phase-shift keying";
-        }
-        enum "dc-dp-bpsk" {
-          value 1;
-          description
-            "DC dual-polarization binary phase-shift keying";
-        }
-        enum "qpsk" {
-          value 2;
-          description
-            "quadrature phase-shift keying";
-        }
-        enum "dp-qpsk" {
-          value 3;
-          description
-            "dual-polarization binary phase-shift keying";
-        }
-        enum "qam16" {
-          value 4;
-          description
-            "quadrature amplitude modulation 16";
-        }
-        enum "dp-qam16" {
-          value 5;
-          description
-            "dual-polarization quadrature amplitude modulation 16";
-        }
-        enum "dc-dp-qam16" {
-          value 6;
-          description
-            "DC dual-polarization quadrature amplitude modulation 16";
-        }
-        enum "qam8" {
-          value 7;
-          description
-            "quadrature amplitude modulation 8";
-        }
-        enum "dp-qam8" {
-          value 8;
-          description
-            "dual-polarization quadrature amplitude modulation 8";
-        }
-        enum "dc-dp-qam8" {
-          value 9;
-          description
-            "DC dual-polarization quadrature amplitude modulation 8";
-        }
-      }
-      description
-        "modulation format";
-    }
-    leaf transmit-power {
-      type org-openroadm-common-types:power-dBm;
-      description
-        "The target transmit power for this channel. When set, the xponder will work to ensure that port-current-power reaches this level. Applicable only to channel on top of xpdr-network port";
-    }
-  }
-
-  grouping och-container {
-    container och {
-      description
-        "Optical Channel (OCh):
-         Models the optical channel interfaces for an Optical White Box.";
-      uses och-attributes;
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:opticalChannel'";
-    uses och-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-optical-channel-interfaces@2018-10-19.yang b/ordmodels/device/src/main/yang/org-openroadm-optical-channel-interfaces@2018-10-19.yang
deleted file mode 100755 (executable)
index 6020d8e..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-module org-openroadm-optical-channel-interfaces {
-  namespace "http://org/openroadm/optical-channel-interfaces";
-  prefix org-openroadm-optical-channel-interfaces;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2017-06-26;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2018-10-19;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility och interfaces.
-     
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.
-     
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-     
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-     
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping och-attributes {
-    description
-      "Optical Channel attributes";
-    leaf rate {
-      type identityref {
-        base org-openroadm-common-types:och-rate-identity;
-      }
-      description
-        "rate";
-    }
-    leaf frequency {
-      type org-openroadm-common-types:frequency-THz;
-      config true;
-      description
-        "Center Frequency in THz.";
-    }
-    leaf width {
-      type org-openroadm-common-types:frequency-GHz;
-      config false;
-      description
-        "Frequency width in GHz.";
-    }
-    leaf modulation-format {
-      type org-openroadm-common-types:modulation-format;
-    }
-    leaf transmit-power {
-      type org-openroadm-common-types:power-dBm;
-      description
-        "The target transmit power for this channel. When set, the xponder will work to ensure that port-current-power reaches this level. Applicable only to channel on top of xpdr-network port";
-    }
-  }
-
-  grouping och-container {
-    container och {
-      description
-        "Optical Channel (OCh):
-         Models the optical channel interfaces for an Optical White Box.";
-      uses och-attributes;
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:opticalChannel'";
-    uses och-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-optical-channel-interfaces@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-optical-channel-interfaces@2020-05-29.yang
deleted file mode 100644 (file)
index 357fcdd..0000000
+++ /dev/null
@@ -1,202 +0,0 @@
-module org-openroadm-optical-channel-interfaces {
-  namespace "http://org/openroadm/optical-channel-interfaces";
-  prefix org-openroadm-optical-channel-interfaces;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-link-types {
-    prefix org-openroadm-common-link-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-optical-channel-types {
-    prefix org-openroadm-common-optical-channel-types;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-optical-operational-interfaces {
-    prefix org-openroadm-optical-operational-interfaces;
-    revision-date 2020-05-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility och interfaces.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping och-attributes {
-    description
-      "Optical Channel attributes";
-    leaf provision-mode {
-      type org-openroadm-common-optical-channel-types:provision-mode-type;
-      default "explicit";
-      description
-        "The provision-mode specified by the controller. Default to 'explicit' (ie, the set of optical parameter specified in MSA Optical Spec).
-         The 'profile' provision-mode is introduced in MSA 5.0 to support the bookended xponder application";
-    }
-    leaf rate {
-      when "../provision-mode = 'explicit'";
-      type identityref {
-        base org-openroadm-common-optical-channel-types:och-rate-identity;
-      }
-      description
-        "rate";
-    }
-    leaf frequency {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      description
-        "Center Frequency in THz.";
-    }
-    leaf width {
-      when "../provision-mode = 'explicit'";
-      type org-openroadm-common-optical-channel-types:frequency-GHz;
-      config false;
-      description
-        "Frequency width in GHz.";
-    }
-    leaf modulation-format {
-      when "../provision-mode = 'explicit'";
-      type org-openroadm-common-optical-channel-types:modulation-format;
-      description
-        "Modulation format";
-    }
-    leaf transmit-power {
-      type org-openroadm-common-link-types:power-dBm;
-      description
-        "The target transmit power for this channel. When set, the xponder will work to ensure that port-current-power reaches this level. Applicable only to channel on top of xpdr-network port";
-    }
-    leaf optical-operational-mode {
-      type string;
-      description
-        "Optical-operational-mode sets the xponder settings based on one of the operational mode capabilities as published by the device.  This attribute is mandatory when the provision-mode is set to profile.";
-    }
-    container operational-mode-params {
-      when "../provision-mode = 'profile'";
-      config false;
-      description
-        "The container containing the optical parameters for the specified operational mode.";
-      uses org-openroadm-optical-operational-interfaces:optical-operational-modes-grp-attr;
-    }
-  }
-
-  grouping och-container {
-    description
-      "OCH container group";
-    container och {
-      description
-        "Optical Channel (OCh):
-         Models the optical channel interfaces for an Optical White Box.";
-      uses och-attributes;
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:opticalChannel'";
-    description
-      "augment for optical channel container";
-    uses och-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-optical-multiplex-interfaces@2016-10-14.yang b/ordmodels/device/src/main/yang/org-openroadm-optical-multiplex-interfaces@2016-10-14.yang
deleted file mode 100644 (file)
index 3fddeda..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-module org-openroadm-optical-multiplex-interfaces {
-  namespace "http://org/openroadm/optical-multiplex-interfaces";
-  prefix org-openroadm-optical-multiplex-interfaces;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2017-02-06;
-  }
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "This module contains YANG definitions
-     for the Optical multiplex Interfaces (OMS).
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    description
-      "Optical Multiplex Section (OMS)
-       allow setting of OMS in the openROADM interfaces tree.";
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-optical-operational-interfaces@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-optical-operational-interfaces@2020-05-29.yang
deleted file mode 100644 (file)
index bcaff15..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-module org-openroadm-optical-operational-interfaces {
-  namespace "http://org/openroadm/optical-operational-interfaces";
-  prefix org-openroadm-optical-operational-interfaces;
-
-  import org-openroadm-common-optical-channel-types {
-    prefix org-openroadm-common-optical-channel-types;
-    revision-date 2020-05-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device flexible optical transport network group interfaces.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2018,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-
-  grouping optical-operational-modes-grp-attr {
-    description
-      "optical operational modes attribute grouping";
-    leaf spectral-width {
-      type org-openroadm-common-optical-channel-types:frequency-GHz;
-      units "GHz";
-      description
-        "The required minimum signal spectral width of signal at -22 dbm.";
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-optical-transport-interfaces@2016-10-14.yang b/ordmodels/device/src/main/yang/org-openroadm-optical-transport-interfaces@2016-10-14.yang
deleted file mode 100644 (file)
index 16f1700..0000000
+++ /dev/null
@@ -1,147 +0,0 @@
-module org-openroadm-optical-transport-interfaces {
-  namespace "http://org/openroadm/optical-transport-interfaces";
-  prefix org-openroadm-optical-transport-interfaces;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2017-02-06;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2016-10-14;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2016-10-14;
-  }
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "This module contains YANG definitions
-     for the Optical Transport Interfaces.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping ots-attributes {
-    description
-      "Optical Transport Section (OTS) attributes";
-    leaf fiber-type {
-      type enumeration {
-        enum "smf" {
-          value 0;
-          description
-            "Single Mode Fiber";
-        }
-        enum "eleaf" {
-          value 1;
-          description
-            "ELEAF";
-        }
-        enum "oleaf" {
-          value 2;
-          description
-            "OLEAF";
-        }
-        enum "dsf" {
-          value 3;
-          description
-            "DSF";
-        }
-        enum "truewave" {
-          value 4;
-          description
-            "TRUEWAVE Reduced Slope";
-        }
-        enum "truewavec" {
-          value 5;
-          description
-            "TRUEWAVE Classic";
-        }
-        enum "nz-dsf" {
-          value 6;
-          description
-            "NZ-DSF";
-        }
-        enum "ull" {
-          value 7;
-          description
-            "Ultra Low Loss (ULL)";
-        }
-      }
-      default "smf";
-      description
-        "fiber type
-         Default    : SMF ";
-    }
-    leaf span-loss-receive {
-      description
-        "Span loss on the receiver side. Set by the controller and used by device to set AMP gain.";
-      type org-openroadm-common-types:ratio-dB;
-    }
-    leaf span-loss-transmit {
-      description
-        "Span loss on the transmitter side. Set by the controller and used by device to configure MSA compliant channel launch power";
-      type org-openroadm-common-types:ratio-dB;
-    }
-  }
-
-  grouping ots-container {
-    container ots {
-      description
-        "Optical Transport Section (OTS):
-          Models the optical interfaces for an Optical White Box.
-          The network side is represented by the OTS/OMS.";
-      uses ots-attributes;
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:opticalTransport'";
-    uses ots-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-optical-transport-interfaces@2018-10-19.yang b/ordmodels/device/src/main/yang/org-openroadm-optical-transport-interfaces@2018-10-19.yang
deleted file mode 100755 (executable)
index 1476de2..0000000
+++ /dev/null
@@ -1,187 +0,0 @@
-module org-openroadm-optical-transport-interfaces {
-  namespace "http://org/openroadm/optical-transport-interfaces";
-  prefix org-openroadm-optical-transport-interfaces;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2017-06-26;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2018-10-19;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "This module contains YANG definitions
-     for the Optical Transport Interfaces.
-     
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.
-     
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-     
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-     
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping ots-attributes {
-    description
-      "Optical Transport Section (OTS) attributes";
-    leaf fiber-type {
-      type enumeration {
-        enum "smf" {
-          value 0;
-          description
-            "Single Mode Fiber";
-        }
-        enum "eleaf" {
-          value 1;
-          description
-            "ELEAF";
-        }
-        enum "oleaf" {
-          value 2;
-          description
-            "OLEAF";
-        }
-        enum "dsf" {
-          value 3;
-          description
-            "DSF";
-        }
-        enum "truewave" {
-          value 4;
-          description
-            "TRUEWAVE Reduced Slope";
-        }
-        enum "truewavec" {
-          value 5;
-          description
-            "TRUEWAVE Classic";
-        }
-        enum "nz-dsf" {
-          value 6;
-          description
-            "NZ-DSF";
-        }
-        enum "ull" {
-          value 7;
-          description
-            "Ultra Low Loss (ULL)";
-        }
-      }
-      default "smf";
-      description
-        "fiber type
-         Default    : SMF ";
-    }
-    leaf span-loss-receive {
-      type org-openroadm-common-types:ratio-dB;
-      description
-        "Span loss on the receiver side. Set by the controller and used by device to set AMP gain.";
-    }
-    leaf span-loss-transmit {
-      type org-openroadm-common-types:ratio-dB;
-      description
-        "Span loss on the transmitter side. Set by the controller and used by device to configure MSA compliant channel launch power";
-    }
-    leaf ingress-span-loss-aging-margin {
-      type org-openroadm-common-types:ratio-dB;
-      default "0";
-      config true;
-      description
-        "Span-loss margin used to set optical amplifier gain and output-voa.
-         Day one attenuation of the link, at initial commissioning may increase across wdm link life.
-         span-loss-aging-margin defines the maximum additional loss the wdm link may experience in addition
-         to initial loss without requiring a new design (new amplifier settings). ";
-    }
-    leaf eol-max-load-pIn {
-      type org-openroadm-common-types:power-dBm;
-      config true;
-      description
-        "End Of Life Total input power at maximum load used for amplifier control.
-         Calculated during the design, this value shall be used by the amplifier device
-         for the setting so that the reasonable margin is kept to reach this value
-         at the end of life of the wdm link, considering span-loss aging margins are reached ";
-    }
-  }
-
-  grouping ots-container {
-    container ots {
-      description
-        "Optical Transport Section (OTS):
-          Models the optical interfaces for an Optical White Box.
-          The network side is represented by the OTS/OMS.";
-      uses ots-attributes;
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:opticalTransport'";
-    uses ots-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-optical-transport-interfaces@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-optical-transport-interfaces@2020-05-29.yang
deleted file mode 100644 (file)
index dd173a0..0000000
+++ /dev/null
@@ -1,219 +0,0 @@
-module org-openroadm-optical-transport-interfaces {
-  namespace "http://org/openroadm/optical-transport-interfaces";
-  prefix org-openroadm-optical-transport-interfaces;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-link-types {
-    prefix org-openroadm-common-link-types;
-    revision-date 2019-11-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "This module contains YANG definitions
-     for the Optical Transport Interfaces.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping ots-attributes {
-    description
-      "Optical Transport Section (OTS) attributes";
-    leaf fiber-type {
-      type enumeration {
-        enum smf {
-          value 0;
-          description
-            "Single Mode Fiber";
-        }
-        enum eleaf {
-          value 1;
-          description
-            "ELEAF";
-        }
-        enum oleaf {
-          value 2;
-          description
-            "OLEAF";
-        }
-        enum dsf {
-          value 3;
-          description
-            "DSF";
-        }
-        enum truewave {
-          value 4;
-          description
-            "TRUEWAVE Reduced Slope";
-        }
-        enum truewavec {
-          value 5;
-          description
-            "TRUEWAVE Classic";
-        }
-        enum nz-dsf {
-          value 6;
-          description
-            "NZ-DSF";
-        }
-        enum ull {
-          value 7;
-          description
-            "Ultra Low Loss (ULL)";
-        }
-      }
-      default "smf";
-      description
-        "fiber type
-         Default    : SMF ";
-    }
-    leaf span-loss-receive {
-      type org-openroadm-common-link-types:ratio-dB;
-      description
-        "Span loss on the receiver side. Set by the controller and used by device to set AMP gain.";
-    }
-    leaf span-loss-transmit {
-      type org-openroadm-common-link-types:ratio-dB;
-      description
-        "Span loss on the transmitter side. Set by the controller and used by device to configure MSA compliant channel launch power";
-    }
-    leaf ingress-span-loss-aging-margin {
-      type org-openroadm-common-link-types:ratio-dB;
-      default "0";
-      config true;
-      description
-        "Span-loss margin used to set optical amplifier gain and output-voa.
-         Day one attenuation of the link, at initial commissioning may increase across wdm link life.
-         span-loss-aging-margin defines the maximum additional loss the wdm link may experience in addition
-         to initial loss without requiring a new design (new amplifier settings). ";
-    }
-    leaf eol-max-load-pIn {
-      type org-openroadm-common-link-types:power-dBm;
-      config true;
-      description
-        "End Of Life Total input power at maximum load used for amplifier control.
-         Calculated during the design, this value shall be used by the amplifier device
-         for the setting so that the reasonable margin is kept to reach this value
-         at the end of life of the wdm link, considering span-loss aging margins are reached ";
-    }
-  }
-
-  grouping ots-container {
-    container ots {
-      description
-        "Optical Transport Section (OTS):
-          Models the optical interfaces for an Optical White Box.
-          The network side is represented by the OTS/OMS.";
-      uses ots-attributes;
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:opticalTransport'";
-    uses ots-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-optical-tributary-signal-interfaces@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-optical-tributary-signal-interfaces@2020-05-29.yang
deleted file mode 100644 (file)
index 514e7b7..0000000
+++ /dev/null
@@ -1,235 +0,0 @@
-module org-openroadm-optical-tributary-signal-interfaces {
-  namespace "http://org/openroadm/optical-channel-tributary-signal-interfaces";
-  prefix org-openroadm-optical-tributary-signal-interfaces;
-
-  import org-openroadm-common-link-types {
-    prefix org-openroadm-common-link-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-optical-channel-types {
-    prefix org-openroadm-common-optical-channel-types;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-optical-operational-interfaces {
-    prefix org-openroadm-optical-operational-interfaces;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2019-11-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device optical tributary signal interfaces.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2018,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-
-  grouping otsi-attributes {
-    description
-      "OTSi attributes group";
-    leaf provision-mode {
-      type org-openroadm-common-optical-channel-types:provision-mode-type;
-      default "explicit";
-      description
-        "The provision-mode specified by the controller. Default to 'explicit' (ie, the set of optical parameter specified in MSA Optical Spec).
-         The 'profile' provision-mode is introduced in MSA 5.0 to support the bookended xponder application";
-    }
-    leaf otsi-rate {
-      when "../provision-mode = 'explicit'";
-      type identityref {
-        base org-openroadm-common-optical-channel-types:otsi-rate-identity;
-      }
-      description
-        "OTSi rate";
-    }
-    leaf otsi-member-id {
-      type uint16;
-      description
-        "The member ID to uniquely identify each member in an OTSi group and the order of each member in the group.  For each group, system shall support non-consecutive member IDs.  User shall not set up two members with the same member ID.  Similar to FlexO PHY-ID in the FlexO Group (PID in G.709.1/3)";
-    }
-    leaf frequency {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      description
-        "Center Frequency in THz.";
-    }
-    leaf width {
-      when "../provision-mode = 'explicit'";
-      type org-openroadm-common-optical-channel-types:frequency-GHz;
-      config false;
-      description
-        "Frequency width in GHz.";
-    }
-    leaf modulation-format {
-      when "../provision-mode = 'explicit'";
-      type org-openroadm-common-optical-channel-types:modulation-format;
-      description
-        "Modulation format";
-    }
-    leaf transmit-power {
-      type org-openroadm-common-link-types:power-dBm;
-      description
-        "The target transmit power for this channel. When set, the xponder will work to ensure that port-current-power reaches this level. Applicable only to channel on top of xpdr-network port";
-    }
-
-    uses org-openroadm-common-types:fec-grouping {
-      when "provision-mode = 'explicit'";
-      description
-        "OTSi FEC / Forward Error Correction";
-    }
-    leaf optical-operational-mode {
-      when "../provision-mode = 'profile'";
-      type string;
-      description
-        "Optical-operational-mode sets the xponder settings based on one of the operational mode capabilities as published by the device.  This attribute is mandatory when the provision-mode is set to profile.";
-    }
-    container operational-mode-params {
-      when "../provision-mode = 'profile'";
-      config false;
-      description
-        "The container containing the optical parameters for the specified operational mode";
-      uses org-openroadm-optical-operational-interfaces:optical-operational-modes-grp-attr;
-    }
-    leaf supported-group-if {
-      type leafref {
-        path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface/org-openroadm-device:name";
-      }
-      config false;
-      description
-        "OTSiG or FlexO-group interface name.";
-    }
-    container flexo {
-      presence "Explicit assigment for flexo container";
-      description
-        "Flexo presence container";
-      leaf foic-type {
-        type identityref {
-          base org-openroadm-common-optical-channel-types:foic-identity;
-        }
-        mandatory true;
-        description
-          "Assigned flexo instance type";
-      }
-      leaf-list iid {
-        type uint8;
-        min-elements 1;
-        ordered-by user;
-        description
-          "A list of FlexO instance identification (G.709.1 clause 9.2.3)";
-      }
-      leaf-list accepted-group-id {
-        type uint32;
-        description
-          "AcGID[1]..AcGID[n] on a per FlexO instance basis (G.798 2019-12, Figure 15-10 FlexO-n/OTUCn_A_Sk processes)";
-      }
-      leaf-list accepted-iid {
-        type uint8;
-        description
-          "AcIID[1]..AcIID[n] on a per FlexO instance basis (G.798 2019-12, Figure 15-10 FlexO-n/OTUCn_A_Sk processes)";
-      }
-    }
-  }
-
-  grouping otsi-container {
-    description
-      "OTSI container group";
-    container otsi {
-      description
-        "OTSi container";
-      uses org-openroadm-optical-tributary-signal-interfaces:otsi-attributes;
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:otsi'";
-    description
-      "augment for otsi";
-    uses org-openroadm-optical-tributary-signal-interfaces:otsi-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-otn-common@2017-06-26.yang b/ordmodels/device/src/main/yang/org-openroadm-otn-common@2017-06-26.yang
deleted file mode 100644 (file)
index 3270a5e..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-module org-openroadm-otn-common {
-  namespace "http://org/openroadm/otn-common";
-  prefix org-openroadm-otn-common;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for common OTN interface atrtributes and types. 
-         
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.
-     
-     Also contains code components extracted from IETF Interfaces.  These code components 
-     are copyrighted and licensed as follows:
-     
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors. 
-     All rights reserved. 
-     
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating 
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of 
-     publication of this document. Please review these documents carefully, as they 
-     describe your rights and restrictions with respect to this document. Code Components 
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as 
-     described in the Simplified BSD License.";
-
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-
-  grouping trail-trace {
-    leaf tx-sapi {
-      type string {
-        length "0 .. 15";
-      }
-      description
-        "The provisioned 15 character transmit trace SAPI. Implementations shall add the [0] field automatically per ITU-T G.709";
-    }
-    leaf tx-dapi {
-      type string {
-        length "0 .. 15";
-      }
-      description
-        "The provisioned 15 character transmit trace DAPI. Implementations shall add the [0] field automatically per ITU-T G.709";
-    }
-    leaf tx-operator {
-      type string {
-        length "0 .. 32";
-      }
-      description
-        "The provisioned 32 character Operator Specific field";
-    }
-    leaf accepted-sapi {
-      type string;
-      config false;
-      description
-        "The accepted SAPI recovered from the recieved multi-frame TTI field.
-         Received SAPI contains the receive data, minus the sapi[0] and any 0x00 padding at the end";
-    }
-    leaf accepted-dapi {
-      type string;
-      config false;
-      description
-        "The accepted DAPI recovered from the recieved multi-frame TTI field
-         Received DAPI contains the receive data, minus the dapi[0] and any 0x00 padding at the end";
-    }
-    leaf accepted-operator {
-      type string;
-      config false;
-      description
-        "The accepted Operator Specific field recovered from the recieved multi-frame TTI field";
-    }
-    leaf expected-sapi {
-      type string {
-        length "0 .. 15";
-      }
-      description
-        "The provisioned expected SAPI, to be compared with accepted TTI";
-    }
-    leaf expected-dapi {
-      type string {
-        length "0 .. 15";
-      }
-      description
-        "The provisioned expected DAPI, to be compared with accepted TTI";
-    }
-    leaf tim-act-enabled {
-      type boolean;
-      default "false";
-      description
-        "Enables TTI Mismatch consequent actions.";
-    }
-    leaf tim-detect-mode {
-      type enumeration {
-        enum "Disabled" {
-          description
-            "TTI is ignored";
-        }
-        enum "SAPI" {
-          description
-            "Expected SAPI is compared to the Accpeted TTI. Other TTI fields are ignored";
-        }
-        enum "DAPI" {
-          description
-            "Expected DAPI is compared to the Accpeted TTI. Other TTI fields are ignored";
-        }
-        enum "SAPI-and-DAPI" {
-          description
-            "Expected SAPI and Expected DAPI are compared to the Accpeted TTI. Operator specific TTI field is ignored";
-        }
-      }
-      default "Disabled";
-    }
-  }
-
-  grouping deg-threshold {
-    leaf degm-intervals {
-      type uint8 {
-        range "2 .. 10";
-      }
-      default "2";
-      description
-        "G.806 - Consecutive bad intervals required for declare dDEG";
-    }
-    leaf degthr-percentage {
-      type uint16 {
-        range "1 .. 10000";
-      }
-      default "100";
-      description
-        "Percentage of errored blocks required to declare an interval bad, in units of 0.01%";
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-otn-common@2020-03-27.yang b/ordmodels/device/src/main/yang/org-openroadm-otn-common@2020-03-27.yang
deleted file mode 100644 (file)
index 21f1bb3..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-module org-openroadm-otn-common {
-  namespace "http://org/openroadm/otn-common";
-  prefix org-openroadm-otn-common;
-
-  import org-openroadm-resource-types {
-    prefix org-openroadm-resource-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-otn-common-types {
-    prefix org-openroadm-otn-common-types;
-    revision-date 2020-03-27;
-  }
-  import org-openroadm-common-attributes {
-    prefix org-openroadm-common-attributes;
-    revision-date 2020-03-27;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for common OTN interface attributes and types.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-
-  typedef otn-interface-enum {
-    type enumeration {
-      enum otu {
-        value 1;
-        description
-          "OTU enumeration";
-      }
-      enum odu-path {
-        value 2;
-        description
-          "ODU Path enumeration";
-      }
-      enum odu-tcm {
-        value 3;
-        description
-          "ODU TCM enumeration";
-      }
-    }
-    description
-      "Enumeration type for otn interface";
-  }
-
-  grouping trail-trace-state {
-    description
-      "Trail trace state grouping";
-    leaf accepted-sapi {
-      type string;
-      config false;
-      description
-        "The accepted SAPI recovered from the received multi-frame TTI field.
-         Received SAPI contains the receive data, minus the sapi[0] and any 0x00 padding at the end";
-    }
-    leaf accepted-dapi {
-      type string;
-      config false;
-      description
-        "The accepted DAPI recovered from the received multi-frame TTI field
-         Received DAPI contains the receive data, minus the dapi[0] and any 0x00 padding at the end";
-    }
-    leaf accepted-operator {
-      type string;
-      config false;
-      description
-        "The accepted Operator Specific field recovered from the received multi-frame TTI field";
-    }
-  }
-
-  grouping trail-trace {
-    description
-      "Trail trace grouping";
-    uses org-openroadm-common-attributes:trail-trace-tx;
-    uses trail-trace-state;
-    uses org-openroadm-common-attributes:trail-trace-other;
-  }
-
-  notification otn-tti-info-change {
-    description
-      "Notification for OTN TTI";
-    leaf resource-type {
-      type org-openroadm-resource-types:resource-type-enum;
-      mandatory true;
-      description
-        "Resource type for OTN TTI";
-    }
-    leaf resource {
-      type string;
-      mandatory true;
-      description
-        "Resource for OTN TTI";
-    }
-    leaf otn-interface-type {
-      type otn-interface-enum;
-      mandatory true;
-      description
-        "OTN interface type for TTI";
-    }
-    leaf otn-interface-tcm-layer {
-      when "../otn-interface-type='odu-tcm'";
-      type uint8;
-      description
-        "TCM layer for OTN TTI";
-    }
-    leaf otn-interface-tcm-direction {
-      when "../otn-interface-type='odu-tcm'";
-      type org-openroadm-otn-common-types:tcm-direction-enum;
-      description
-        "TCM direction for OTN TTI";
-    }
-    container tti-info {
-      description
-        "Container for TTI info";
-      leaf accepted-sapi {
-        type string;
-        description
-          "Accepted SAPI for TTI";
-      }
-      leaf accepted-dapi {
-        type string;
-        description
-          "Accepted DAPI for TTI";
-      }
-      leaf accepted-operator {
-        type string;
-        description
-          "Accepted operator for TTI";
-      }
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-otn-odu-interfaces@2016-10-14.yang b/ordmodels/device/src/main/yang/org-openroadm-otn-odu-interfaces@2016-10-14.yang
deleted file mode 100644 (file)
index f298104..0000000
+++ /dev/null
@@ -1,390 +0,0 @@
-module org-openroadm-otn-odu-interfaces {
-  namespace "http://org/openroadm/otn-odu-interfaces";
-  prefix org-openroadm-otn-odu-interfaces;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2017-02-06;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2016-10-14;
-  }
-  import org-openroadm-maintenance-testsignal {
-    prefix org-openroadm-maint-testsignal;
-    revision-date 2016-10-14;
-  }
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility otnodu interfaces.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  identity odu-rate-identity {
-    description
-      "A unique rate identification of the ODUk.";
-  }
-
-  identity ODU4 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU4";
-  }
-
-  identity ODU3 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU3";
-  }
-
-  identity ODU2 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU2";
-  }
-
-  identity ODU2e {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU2e";
-  }
-
-  identity ODU1 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU1";
-  }
-
-  identity ODU0 {
-    base odu-rate-identity;
-    description
-      "Identity for an ODU0";
-  }
-
-  identity ODUflex {
-    base odu-rate-identity;
-    description
-      "Identity for an ODUflex";
-  }
-
-  identity odtu-type-identity {
-    description
-      "A unique identification for the MSI odtu type.";
-  }
-
-  identity ODTU4.ts-Allocated {
-    base odtu-type-identity;
-    description
-      "OPU4 MSI - ODTU4.ts, TS is occupied/allocated";
-  }
-
-  identity ODTU4.1 {
-    base odtu-type-identity;
-    description
-      "ODTU4.1 MSI type";
-  }
-
-  identity ODTU4.2 {
-    base odtu-type-identity;
-    description
-      "ODTU4.2 MSI type";
-  }
-
-  identity ODTU4.8 {
-    base odtu-type-identity;
-    description
-      "ODTU4.8 MSI type";
-  }
-
-  identity ODTU4.31 {
-    base odtu-type-identity;
-    description
-      "ODTU4.31 MSI type";
-  }
-
-  identity ODTU01 {
-    base odtu-type-identity;
-    description
-      "ODTU01 MSI type";
-  }
-
-  identity ODTU12 {
-    base odtu-type-identity;
-    description
-      "ODTU12 MSI type";
-  }
-
-  identity ODTU13 {
-    base odtu-type-identity;
-    description
-      "ODTU13 MSI type";
-  }
-
-  identity ODTU23 {
-    base odtu-type-identity;
-    description
-      "ODTU23 MSI type";
-  }
-
-  identity ODTU2.ts {
-    base odtu-type-identity;
-    description
-      "ODTU2.ts MSI type";
-  }
-
-  identity ODTU3.ts {
-    base odtu-type-identity;
-    description
-      "ODTU3.ts MSI type";
-  }
-
-  identity unallocated {
-    base odtu-type-identity;
-    description
-      "Unallocated MSI type";
-  }
-
-  grouping msi-entry {
-    leaf trib-slot {
-      type uint16;
-      description
-        "tributary slot (TS)";
-    }
-    leaf odtu-type {
-      type identityref {
-        base odtu-type-identity;
-      }
-      description
-        "ODTU type, part of the MSI (Multiplex Structure Identifier)";
-    }
-    leaf trib-port {
-      type uint8;
-      description
-        "Tributray Port Number (0-based), part of the MSI";
-    }
-    leaf trib-port-payload {
-      type string;
-      description
-        "interface name being mapped to trib-port";
-    }
-  }
-
-  grouping odu-attributes {
-    description
-      "ODU attributes";
-    leaf rate {
-      type identityref {
-        base odu-rate-identity;
-      }
-      description
-        "rate identity of the ODU. 'identityref' is used
-         to allow to extend for future higher rates";
-    }
-    leaf monitoring-mode {
-      type enumeration {
-        enum "not-terminated" {
-          description
-            "Not Terminated: no detection or generation.
-             Overhead is passed through the interface transparently in receive direction";
-        }
-        enum "terminated" {
-          description
-            "Terminated: detection and generation enabled.
-             Overhead is erased (replaced with all zeros) in receive direction";
-        }
-        enum "monitored" {
-          description
-            "Monitored: detection enabled.
-             Overhead is passed through the interface transparently in receive direction";
-        }
-      }
-      description
-        "Monitoring mode of the ODU Overhead";
-    }
-    leaf proactive-delay-measurement-enabled {
-      type boolean;
-      description
-        "enable/disable proactive Delay Measurement";
-    }
-    list tcm {
-      key "layer";
-      uses tcm-attributes;
-      max-elements "6";
-      description
-        "Tandem Connection Management";
-    }
-    uses opu;
-  }
-
-  grouping opu {
-    container opu {
-      when "../monitoring-mode = 'terminated' or ../monitoring-mode = 'monitored'";
-      description
-        "Optical Channel Payload Unit (OPU)";
-      leaf payload-type {
-        type string {
-          length "2";
-          pattern "[0-9a-fA-F]*";
-        }
-        description
-          "Payload Type";
-      }
-      leaf rx-payload-type {
-        type string {
-          length "2";
-          pattern "[0-9a-fA-F]*";
-        }
-        description
-          "Received Payload Type";
-      }
-      leaf exp-payload-type {
-        type string {
-          length "2";
-          pattern "[0-9a-fA-F]*";
-        }
-        description
-          "Expected Payload Type";
-      }
-      leaf payload-interface {
-        type string;
-        description
-          "Expected Payload of OPU. It designates client interface name";
-      }
-      container msi {
-        when "../payload-type = '20' or ../payload-type = '21'";
-        list tx-msi {
-          key "trib-slot";
-          uses msi-entry;
-          description
-            "Transmit MSI";
-        }
-        list rx-msi {
-          key "trib-slot";
-          uses msi-entry;
-          description
-            "Receive MSI";
-        }
-        list exp-msi {
-          key "trib-slot";
-          uses msi-entry;
-          description
-            "Expected MSI";
-        }
-      }
-    }
-  }
-
-  grouping tcm-attributes {
-    description
-      "Tandem Connection Monitoring (TCM) attributes";
-    leaf layer {
-      type uint8 {
-        range "1..6";
-      }
-      description
-        "TCM layer";
-    }
-    leaf monitoring-mode {
-      type enumeration {
-        enum "not-terminated" {
-          description
-            "Not Terminated: no detection or generation.
-             Overhead is passed through the interface transparently in receive direction
-             unless extension is set for erase";
-        }
-        enum "terminated" {
-          description
-            "Terminated: detection and generation enabled.
-             Overhead is erased (replaced with all zeros) in receive direction, unless
-             extension is set to passthrough";
-        }
-        enum "monitored" {
-          description
-            "Monitored: detection enabled.
-             Overhead is passed through the interface transparently in receive direction
-             unless extension is set for erase";
-        }
-      }
-      description
-        "Monitoring mode of the TCM layer";
-    }
-    leaf ltc-act-enabled {
-      type boolean;
-      description
-        "enable/disable alarm transfer on detection of Loss of Tandem Connection (LTC)";
-    }
-    leaf proactive-delay-measurement-enabled {
-      type boolean;
-      description
-        "enable/disable proactive Delay Measurement";
-    }
-  }
-
-  grouping odu-container {
-    container odu {
-      presence "Attribute Nodes for Optical Data Unit (ODU)";
-      description
-        "Optical Channel Data Unit (ODU)";
-      uses odu-attributes {
-        refine "opu/rx-payload-type" {
-          config false;
-        }
-        refine "opu/msi" {
-          config false;
-        }
-      }
-      uses org-openroadm-maint-testsignal:maint-testsignal;
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:otnOdu'";
-    uses odu-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-otn-odu-interfaces@2018-10-19.yang b/ordmodels/device/src/main/yang/org-openroadm-otn-odu-interfaces@2018-10-19.yang
deleted file mode 100755 (executable)
index a57e34f..0000000
+++ /dev/null
@@ -1,344 +0,0 @@
-module org-openroadm-otn-odu-interfaces {
-  namespace "http://org/openroadm/otn-odu-interfaces";
-  prefix org-openroadm-otn-odu-interfaces;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2017-06-26;
-  }
-  import org-openroadm-maintenance-testsignal {
-    prefix org-openroadm-maint-testsignal;
-    revision-date 2017-12-15;
-  }
-  import org-openroadm-otn-common {
-    prefix org-openroadm-otn-common;
-    revision-date 2017-06-26;
-  }
-  import org-openroadm-otn-common-types {
-    prefix org-openroadm-otn-common-types;
-    revision-date 2017-12-15;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility otnodu interfaces.
-     
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.
-     
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-     
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-     
-     This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping msi-entry {
-    leaf trib-slot {
-      type uint16;
-      description
-        "tributary slot (TS)";
-    }
-    leaf odtu-type {
-      type identityref {
-        base org-openroadm-otn-common-types:odtu-type-identity;
-      }
-      description
-        "ODTU type, part of the MSI (Multiplex Structure Identifier)";
-    }
-    leaf trib-port {
-      type uint16;
-      description
-        "Tributary Port Number (0-based), part of the MSI";
-    }
-    leaf trib-port-payload {
-      type string;
-      description
-        "interface name being mapped to trib-port";
-    }
-  }
-
-  grouping odu-attributes {
-    description
-      "ODU attributes";
-    leaf rate {
-      type identityref {
-        base org-openroadm-otn-common-types:odu-rate-identity;
-      }
-      description
-        "rate identity of the ODU. 'identityref' is used
-         to allow to extend for future higher rates";
-    }
-    leaf odu-function {
-      type identityref {
-        base org-openroadm-otn-common-types:odu-function-identity;
-      }
-      description
-        "function of the ODU interface";
-    }
-    leaf monitoring-mode {
-      type enumeration {
-        enum "not-terminated" {
-          description
-            "Not Terminated: no detection or generation.
-             Overhead is passed through the interface transparently in receive direction";
-        }
-        enum "terminated" {
-          description
-            "Terminated: detection and generation enabled.
-             Overhead is erased (replaced with all zeros) in receive direction";
-        }
-        enum "monitored" {
-          description
-            "Monitored: detection enabled.
-             Overhead is passed through the interface transparently in receive direction";
-        }
-      }
-      description
-        "Monitoring mode of the ODU Overhead";
-    }
-    leaf no-oam-function {
-      type empty;
-      description
-        "No OAM functionality exists for this ODU interface, the entity exists in software only. This entity does not report alarms or PM and does not support TCM, TTI, delay measurement, loopbacks, test signal and other hardware-based functions. This is an optional parameter, only needs to be present when no-oam-function supported for this interface.";
-    }
-    leaf proactive-delay-measurement-enabled {
-      type boolean;
-      description
-        "enable/disable proactive Delay Measurement";
-    }
-    uses parent-odu-allocation;
-    uses org-openroadm-otn-common:trail-trace;
-    uses org-openroadm-otn-common:deg-threshold;
-    list tcm {
-      key "layer tcm-direction";
-      max-elements "6";
-      description
-        "Tandem Connection Management";
-      uses tcm-attributes;
-    }
-    uses opu;
-  }
-
-  grouping parent-odu-allocation {
-    container parent-odu-allocation {
-      when "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface[org-openroadm-device:name = current()/../../org-openroadm-device:supporting-interface]/org-openroadm-device:type = 'openROADM-if:otnOdu'";
-      presence "Explicit assignment of parent ODU trib-slot and trib-port allocation. ";
-      leaf trib-port-number {
-        type uint16 {
-          range "1 .. 80";
-        }
-        mandatory true;
-        description
-          "Assigned tributary port number in parent OPU";
-      }
-      leaf-list trib-slots {
-        type uint16 {
-          range "1 .. 80";
-        }
-        min-elements 1;
-        max-elements "80";
-        description
-          "Assigned trib slots occupied in parent OPU MSI";
-      }
-    }
-  }
-
-  grouping opu {
-    container opu {
-      when "../monitoring-mode = 'terminated' or ../monitoring-mode = 'monitored'";
-      description
-        "Optical Channel Payload Unit (OPU)";
-      leaf payload-type {
-        type org-openroadm-otn-common-types:payload-type-def;
-        description
-          "Payload Type";
-      }
-      leaf rx-payload-type {
-        type org-openroadm-otn-common-types:payload-type-def;
-        description
-          "Received Payload Type";
-      }
-      leaf exp-payload-type {
-        type org-openroadm-otn-common-types:payload-type-def;
-        description
-          "Expected Payload Type";
-      }
-      leaf payload-interface {
-        type string;
-        description
-          "Expected Payload of OPU. It designates client interface name";
-      }
-      container msi {
-        when "../payload-type = '20' or ../payload-type = '21'";
-        list tx-msi {
-          key "trib-slot";
-          description
-            "Transmit MSI";
-          uses msi-entry;
-        }
-        list rx-msi {
-          key "trib-slot";
-          description
-            "Receive MSI";
-          uses msi-entry;
-        }
-        list exp-msi {
-          key "trib-slot";
-          description
-            "Expected MSI";
-          uses msi-entry;
-        }
-      }
-    }
-  }
-
-  grouping tcm-attributes {
-    description
-      "Tandem Connection Monitoring (TCM) attributes";
-    leaf layer {
-      type uint8 {
-        range "1..6";
-      }
-      description
-        "TCM layer";
-    }
-    leaf monitoring-mode {
-      type enumeration {
-        enum "not-terminated" {
-          description
-            "Not Terminated: no detection or generation.
-             Overhead is passed through the interface transparently in receive direction 
-             unless extension is set for erase";
-        }
-        enum "terminated" {
-          description
-            "Terminated: detection and generation enabled.
-             Overhead is erased (replaced with all zeros) in receive direction, unless
-             extension is set to passthrough";
-        }
-        enum "monitored" {
-          description
-            "Monitored: detection enabled.
-             Overhead is passed through the interface transparently in receive direction 
-             unless extension is set for erase";
-        }
-      }
-      description
-        "Monitoring mode of the TCM layer";
-    }
-    leaf ltc-act-enabled {
-      type boolean;
-      description
-        "enable/disable alarm transfer on detection of Loss of Tandem Connection (LTC)";
-    }
-    leaf proactive-delay-measurement-enabled {
-      type boolean;
-      description
-        "enable/disable proactive Delay Measurement for TCM";
-    }
-    leaf tcm-direction {
-      type enumeration {
-        enum "up-tcm" {
-          description
-            "TCM termination direction faces the switch fabric.";
-        }
-        enum "down-tcm" {
-          description
-            "TCM termination direction faces the facility";
-        }
-      }
-      description
-        "Direction of TCM.";
-    }
-    uses org-openroadm-otn-common:trail-trace;
-    uses org-openroadm-otn-common:deg-threshold;
-  }
-
-  grouping odu-container {
-    container odu {
-      presence "Attribute Nodes for Optical Data Unit (ODU)";
-      description
-        "Optical Channel Data Unit (ODU)";
-      uses odu-attributes {
-        refine "opu/rx-payload-type" {
-          config false;
-        }
-        refine "opu/msi" {
-          config false;
-        }
-        refine "no-oam-function" {
-          config false;
-        }
-      }
-      uses org-openroadm-maint-testsignal:maint-testsignal;
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:otnOdu'";
-    uses odu-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-otn-odu-interfaces@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-otn-odu-interfaces@2020-05-29.yang
deleted file mode 100644 (file)
index 72ad065..0000000
+++ /dev/null
@@ -1,442 +0,0 @@
-module org-openroadm-otn-odu-interfaces {
-  yang-version 1.1;
-  namespace "http://org/openroadm/otn-odu-interfaces";
-  prefix org-openroadm-otn-odu-interfaces;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-maintenance-testsignal {
-    prefix org-openroadm-maint-testsignal;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-otn-common {
-    prefix org-openroadm-otn-common;
-    revision-date 2020-03-27;
-  }
-  import org-openroadm-otn-common-types {
-    prefix org-openroadm-otn-common-types;
-    revision-date 2020-03-27;
-  }
-  import org-openroadm-common-attributes {
-    prefix org-openroadm-common-attributes;
-    revision-date 2020-03-27;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility otnodu interfaces.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping msi-entry {
-    description
-      "OPU Multiplex Structure Identifier (G.709 clause 19.4.1)";
-    leaf trib-slot {
-      type uint16;
-      description
-        "tributary slot (TS)";
-    }
-    leaf odtu-type {
-      type identityref {
-        base org-openroadm-otn-common-types:odtu-type-identity;
-      }
-      description
-        "ODTU type, part of the MSI (Multiplex Structure Identifier)";
-    }
-    leaf trib-port {
-      type uint16;
-      description
-        "Tributary Port Number (0-based), part of the MSI";
-    }
-  }
-
-  grouping opucn-msi-entry {
-    description
-      "OPUCn Multiplex Structure Identifier (G.709 clause 20.4.1)";
-    leaf opucn-trib-slot {
-      type org-openroadm-otn-common-types:opucn-trib-slot-def;
-      description
-        "OPUCn tributary slot (TS)";
-    }
-    leaf availability {
-      type boolean;
-      description
-        "available";
-    }
-    leaf occupation {
-      type boolean;
-      description
-        "occupied";
-    }
-    leaf trib-port {
-      type uint16;
-      description
-        "OPUCn Tributary Port Number (0-based), part of the MSI";
-    }
-  }
-
-  grouping odu-attributes {
-    description
-      "ODU attributes";
-    leaf rate {
-      type identityref {
-        base org-openroadm-otn-common-types:odu-rate-identity;
-      }
-      description
-        "rate identity of the ODU. 'identityref' is used
-         to allow to extend for future higher rates";
-    }
-    leaf oducn-n-rate {
-      type uint16;
-      description
-        "ODUCn rate";
-    }
-    leaf oduflex-cbr-service {
-      type identityref {
-        base org-openroadm-otn-common-types:ODUflex-cbr-identity;
-      }
-      description
-        "ODUflex for CBR client signals (G.709)";
-    }
-    leaf oduflex-gfp-num-ts {
-      type uint16;
-      description
-        "For ODUflex GFP-F mapped client signals (G.709), the number of
-         tributary slot as per G.709 Table 7-8";
-    }
-    leaf oduflex-gfp-ts-bandwidth {
-      type uint16;
-      description
-        "The tributary slot minimum bit rates in the approximated value [Mbps]
-         given ODUflex (GFP) 100 ppm (G.709 Table 7-8) :
-           1249 Mbps [1 249 052.312 277 kbps] (n = 1 to 8) (ODU2.ts)
-           1254 Mbps [1 254 344.906 9646 kbps] (n = 9 to 32) ODU3.ts)
-           1301 Mbps [1 301 336.986 2867 kbps] (n = 33 to 80) (ODU4.ts)";
-    }
-    leaf oduflex-imp-s {
-      type uint16;
-      description
-        "For ODUflex IMP (Idle insertion Mapping Procedure) mapped client signals,
-         s = 2, 8, n x 5 with N >= 1 (G.709 12.2.6 & Table 7-3)";
-    }
-    leaf oduflex-flexe-n {
-      type uint16;
-      description
-        "For ODUflex for FlexE-aware client signals, n in the range of 1 to 20*254
-         (G.709 17.12)";
-    }
-    leaf odu-function {
-      type identityref {
-        base org-openroadm-otn-common-types:odu-function-identity;
-      }
-      description
-        "function of the ODU interface";
-    }
-    leaf monitoring-mode {
-      type enumeration {
-        enum not-terminated {
-          description
-            "Not Terminated: no detection or generation.
-             Overhead is passed through the interface transparently in receive direction";
-        }
-        enum terminated {
-          description
-            "Terminated: detection and generation enabled.
-             Overhead is erased (replaced with all zeros) in receive direction";
-        }
-        enum monitored {
-          description
-            "Monitored: detection enabled.
-             Overhead is passed through the interface transparently in receive direction";
-        }
-      }
-      description
-        "Monitoring mode of the ODU Overhead";
-    }
-    leaf no-oam-function {
-      type empty;
-      description
-        "No OAM functionality exists for this ODU interface, the entity exists in software only. This entity does not report alarms or PM and does not support TCM, TTI, delay measurement, loopbacks, test signal and other hardware-based functions. This is an optional parameter, only needs to be present when no-oam-function supported for this interface.";
-    }
-    leaf proactive-delay-measurement-enabled {
-      type boolean;
-      description
-        "enable/disable proactive Delay Measurement";
-    }
-    uses org-openroadm-common-attributes:parent-odu-allocation;
-    uses org-openroadm-otn-common:trail-trace;
-    uses org-openroadm-common-attributes:deg-threshold;
-    list tcm {
-      key "layer tcm-direction";
-      max-elements 12;
-      description
-        "Tandem Connection Management";
-      uses tcm-attributes;
-    }
-    uses opu;
-  }
-
-  grouping opu {
-    description
-      "OPU group";
-    container opu {
-      when "../monitoring-mode = 'terminated' or ../monitoring-mode = 'monitored'";
-      description
-        "Optical Channel Payload Unit (OPU)";
-      leaf payload-type {
-        type org-openroadm-otn-common-types:payload-type-def;
-        description
-          "Payload Type";
-      }
-      leaf rx-payload-type {
-        type org-openroadm-otn-common-types:payload-type-def;
-        description
-          "Received Payload Type";
-      }
-      leaf exp-payload-type {
-        type org-openroadm-otn-common-types:payload-type-def;
-        description
-          "Expected Payload Type";
-      }
-      container msi {
-        when "../payload-type = '20' or ../payload-type = '21'";
-        description
-          "Multiple Structure Identifier";
-        list tx-msi {
-          key "trib-slot";
-          description
-            "Transmit MSI";
-          uses msi-entry;
-        }
-        list rx-msi {
-          key "trib-slot";
-          description
-            "Received MSI";
-          uses msi-entry;
-        }
-        list exp-msi {
-          key "trib-slot";
-          description
-            "Expected MSI";
-          uses msi-entry;
-        }
-      }
-      container opucn-msi {
-        when "../payload-type = '22'";
-        description
-          "OPUCn Mutiplex Structure Identifier (G.709 clause 20.4.1)";
-        list tx-msi {
-          key "opucn-trib-slot";
-          description
-            "Transmit MSI";
-          uses opucn-msi-entry;
-        }
-        list rx-msi {
-          key "opucn-trib-slot";
-          description
-            "Received MSI";
-          uses opucn-msi-entry;
-        }
-        list exp-msi {
-          key "opucn-trib-slot";
-          description
-            "Expected MSI";
-          uses opucn-msi-entry;
-        }
-      }
-    }
-  }
-
-  grouping tcm-attributes {
-    description
-      "Tandem Connection Monitoring (TCM) attributes";
-    leaf layer {
-      type uint8 {
-        range "1..6";
-      }
-      description
-        "TCM layer";
-    }
-    leaf monitoring-mode {
-      type enumeration {
-        enum not-terminated {
-          description
-            "Not Terminated: no detection or generation.
-             Overhead is passed through the interface transparently in receive direction
-             unless extension is set for erase";
-        }
-        enum terminated {
-          description
-            "Terminated: detection and generation enabled.
-             Overhead is erased (replaced with all zeros) in receive direction, unless
-             extension is set to passthrough";
-        }
-        enum monitored {
-          description
-            "Monitored: detection enabled.
-             Overhead is passed through the interface transparently in receive direction
-             unless extension is set for erase";
-        }
-      }
-      description
-        "Monitoring mode of the TCM layer";
-    }
-    leaf ltc-act-enabled {
-      type boolean;
-      description
-        "enable/disable alarm transfer on detection of Loss of Tandem Connection (LTC)";
-    }
-    leaf proactive-delay-measurement-enabled {
-      type boolean;
-      description
-        "enable/disable proactive Delay Measurement for TCM";
-    }
-    leaf tcm-direction {
-      type org-openroadm-otn-common-types:tcm-direction-enum;
-      description
-        "Direction of TCM.";
-    }
-    uses org-openroadm-otn-common:trail-trace;
-    uses org-openroadm-common-attributes:deg-threshold;
-  }
-
-  grouping odu-container {
-    description
-      "ODU container group";
-    container odu {
-      presence "Attribute Nodes for Optical Data Unit (ODU)";
-      description
-        "Optical Channel Data Unit (ODU)";
-      uses odu-attributes {
-        refine "opu/rx-payload-type" {
-          config false;
-        }
-        refine "opu/msi" {
-          config false;
-        }
-        refine "opu/opucn-msi" {
-          config false;
-        }
-        refine "no-oam-function" {
-          config false;
-        }
-      }
-      uses org-openroadm-maint-testsignal:maint-testsignal;
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:otnOdu'";
-    description
-      "augment for ODU container";
-    uses odu-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-otn-otu-interfaces@2016-10-14.yang b/ordmodels/device/src/main/yang/org-openroadm-otn-otu-interfaces@2016-10-14.yang
deleted file mode 100644 (file)
index b16e07b..0000000
+++ /dev/null
@@ -1,188 +0,0 @@
-module org-openroadm-otn-otu-interfaces {
-  namespace "http://org/openroadm/otn-otu-interfaces";
-  prefix org-openroadm-otn-otu-interfaces;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2017-02-06;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2016-10-14;
-  }
-  import org-openroadm-maintenance-loopback {
-    prefix org-openroadm-maint-loopback;
-    revision-date 2016-10-14;
-  }
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility otnotu interfaces.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  identity otu-rate-identity {
-    description
-      "A unique rate identification of the OTU.";
-  }
-
-  identity OTU4 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU4";
-  }
-
-  identity OTU3 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU3";
-  }
-
-  identity OTU2 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU2";
-  }
-
-  identity OTU2e {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU2e";
-  }
-
-  identity OTU1 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU1";
-  }
-
-  identity OTU0 {
-    base otu-rate-identity;
-    description
-      "Identity for an OTU0";
-  }
-
-  identity OTUflex {
-    base otu-rate-identity;
-    description
-      "Identity for an OTUflex";
-  }
-
-  grouping otu-attributes {
-    description
-      "OTU attributes";
-    leaf rate {
-      type identityref {
-        base otu-rate-identity;
-      }
-      description
-        "rate identity of the OTU. 'identityref' is used
-         to allow to extend for future higher rates";
-    }
-    leaf fec {
-      type enumeration {
-        enum "off" {
-          value 0;
-          description
-            "fec off";
-        }
-        enum "rsfec" {
-          value 1;
-          description
-            "rsfec";
-        }
-        enum "sdfeca1" {
-          value 2;
-          description
-            "Clariphy SDFEC";
-        }
-        enum "efec" {
-          value 3;
-          description
-            "G.975.1 I.4";
-        }
-        enum "ufec" {
-          value 4;
-          description
-            "G.975.1 I.7";
-        }
-        enum "sdfec" {
-          value 5;
-          description
-            "Soft decision FEC";
-        }
-        enum "sdfecb1" {
-          value 6;
-          description
-            "SDFEC with SCFEC";
-        }
-        enum "scfec" {
-          value 7;
-          description
-            "Stair case FEC";
-        }
-      }
-      description
-        "Forward Error Correction";
-    }
-  }
-
-  grouping otu-container {
-    container otu {
-      description
-        "Optical Channel Transport Unit (OTU)";
-      uses otu-attributes;
-      uses org-openroadm-maint-loopback:maint-loopback;
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:otnOtu'";
-    uses otu-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-otn-otu-interfaces@2018-10-19.yang b/ordmodels/device/src/main/yang/org-openroadm-otn-otu-interfaces@2018-10-19.yang
deleted file mode 100755 (executable)
index 76f0833..0000000
+++ /dev/null
@@ -1,172 +0,0 @@
-module org-openroadm-otn-otu-interfaces {
-  namespace "http://org/openroadm/otn-otu-interfaces";
-  prefix org-openroadm-otn-otu-interfaces;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2017-06-26;
-  }
-  import org-openroadm-maintenance-loopback {
-    prefix org-openroadm-maint-loopback;
-    revision-date 2017-12-15;
-  }
-  import org-openroadm-otn-common {
-    prefix org-openroadm-otn-common;
-    revision-date 2017-06-26;
-  }
-  import org-openroadm-otn-common-types {
-    prefix org-openroadm-otn-common-types;
-    revision-date 2017-12-15;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility otnotu interfaces.
-     
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.
-     
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-     
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-     
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping otu-attributes {
-    description
-      "OTU attributes";
-    leaf rate {
-      type identityref {
-        base org-openroadm-otn-common-types:otu-rate-identity;
-      }
-      description
-        "rate identity of the OTU. 'identityref' is used
-         to allow to extend for future higher rates";
-    }
-    leaf fec {
-      type enumeration {
-        enum "off" {
-          value 0;
-          description
-            "fec off";
-        }
-        enum "rsfec" {
-          value 1;
-          description
-            "rsfec";
-        }
-        enum "sdfeca1" {
-          value 2;
-          description
-            "Clariphy SDFEC";
-        }
-        enum "efec" {
-          value 3;
-          description
-            "G.975.1 I.4";
-        }
-        enum "ufec" {
-          value 4;
-          description
-            "G.975.1 I.7";
-        }
-        enum "sdfec" {
-          value 5;
-          description
-            "Soft decision FEC";
-        }
-        enum "sdfecb1" {
-          value 6;
-          description
-            "SDFEC with SCFEC";
-        }
-        enum "scfec" {
-          value 7;
-          description
-            "Stair case FEC";
-        }
-      }
-      description
-        "Forward Error Correction";
-    }
-    uses org-openroadm-otn-common:trail-trace;
-    uses org-openroadm-otn-common:deg-threshold;
-  }
-
-  grouping otu-container {
-    container otu {
-      description
-        "Optical Channel Transport Unit (OTU)";
-      uses otu-attributes;
-      uses org-openroadm-maint-loopback:maint-loopback;
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:otnOtu'";
-    uses otu-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-otn-otu-interfaces@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-otn-otu-interfaces@2020-05-29.yang
deleted file mode 100644 (file)
index 590d97e..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-module org-openroadm-otn-otu-interfaces {
-  namespace "http://org/openroadm/otn-otu-interfaces";
-  prefix org-openroadm-otn-otu-interfaces;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-maintenance-loopback {
-    prefix org-openroadm-maint-loopback;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-otn-common {
-    prefix org-openroadm-otn-common;
-    revision-date 2020-03-27;
-  }
-  import org-openroadm-otn-common-types {
-    prefix org-openroadm-otn-common-types;
-    revision-date 2020-03-27;
-  }
-  import org-openroadm-common-attributes {
-    prefix org-openroadm-common-attributes;
-    revision-date 2020-03-27;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2020-05-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility otnotu interfaces.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping otu-attributes {
-    description
-      "OTU attributes";
-    leaf rate {
-      type identityref {
-        base org-openroadm-otn-common-types:otu-rate-identity;
-      }
-      description
-        "rate identity of the OTU. 'identityref' is used
-         to allow to extend for future higher rates";
-    }
-    leaf otu4-member-id {
-      when "../rate = 'org-openroadm-otn-common-types:OTU4'";
-      type uint16;
-      description
-        "To uniquely identify each member of an OTSi group and the order of each member in the group.
-         Similar to FlexO PHY-ID in the FlexO Group (PID in G.709.1/3)";
-    }
-    leaf otucn-n-rate {
-      type uint16;
-      description
-        "Specify the N associated with OTUCn, e.g. N = 2,3,4 for 200G/300G/400G respectively";
-    }
-    leaf otucn-M-subrate {
-      type uint16;
-      description
-        "OTUCn subrate (OTUCn-M), value of M specifies the number of active
-         5 Gbit/s OPUCn tributary slots (G.709 Annex H)";
-    }
-
-    uses org-openroadm-common-types:fec-grouping {
-      description
-        "OTU FEC / Forward Error Correction";
-    }
-    uses org-openroadm-otn-common:trail-trace;
-    uses org-openroadm-common-attributes:deg-threshold;
-  }
-
-  grouping otu-container {
-    container otu {
-      description
-        "Optical Channel Transport Unit (OTU)";
-      uses otu-attributes;
-      uses org-openroadm-maint-loopback:maint-loopback;
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:otnOtu'";
-    uses otu-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-otsi-group-interfaces@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-otsi-group-interfaces@2020-05-29.yang
deleted file mode 100644 (file)
index 56c558c..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-module org-openroadm-otsi-group-interfaces {
-  namespace "http://org/openroadm/otsi-group-interfaces";
-  prefix org-openroadm-otsi-group-interfaces;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-optical-channel-types {
-    prefix org-openroadm-common-optical-channel-types;
-    revision-date 2020-05-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device flexible optical transport network group interfaces.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2018,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-
-  grouping otsi-group-container {
-    description
-      "OTSI group container group";
-    container otsi-group {
-      description
-        "OTSI group container";
-      leaf group-rate {
-        type identityref {
-          base org-openroadm-common-optical-channel-types:otsi-rate-identity;
-        }
-        description
-          "Supported group rate";
-      }
-      leaf group-id {
-        type uint32;
-        description
-          "Mandatory for FlexO B100G.  Not required for Non-FlexO B100G.";
-      }
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:otsi-group'";
-    description
-      "augment for otsi group";
-    uses org-openroadm-otsi-group-interfaces:otsi-group-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-physical-types@2016-10-14.yang b/ordmodels/device/src/main/yang/org-openroadm-physical-types@2016-10-14.yang
deleted file mode 100644 (file)
index 2c314e1..0000000
+++ /dev/null
@@ -1,118 +0,0 @@
-module org-openroadm-physical-types {
-  namespace "http://org/openroadm/physical/types";
-  prefix org-openroadm-physical-types;
-
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2016-10-14;
-  }
-  import ietf-yang-types {
-    prefix yang;
-  }
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of physical types.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping node-info {
-    description
-      "Physical inventory data used by the node";
-    leaf vendor {
-      description
-        "Vendor of the equipment";
-      type string;
-      config false;
-      mandatory true;
-    }
-    leaf model {
-      type string;
-      description
-        "Physical resource model information.";
-      config false;
-      mandatory true;
-    }
-    leaf serial-id {
-      description
-        "Product Code for this physical resource";
-      type string;
-      config false;
-      mandatory true;
-    }
-  }
-
-  grouping common-info {
-    description
-      "Physical inventory data used by all other entities";
-    uses node-info;
-    leaf type {
-      description
-        "The specific type of this physical resource - ie the type of
-         shelf, type of circuit-pack, etc.";
-      type string;
-      config false;
-    }
-    leaf product-code {
-      description
-        "Product Code for this physical resource";
-      type string;
-      config false;
-    }
-    leaf manufacture-date {
-      description
-        "Manufactor date of physical resource";
-      type yang:date-and-time;
-      config false;
-    }
-    leaf clei {
-      description
-        "CLEI for this physical resource";
-      type string;
-      config false;
-    }
-    leaf hardware-version {
-      description
-        "The version of the hardware.";
-      type string;
-      config false;
-    }
-    leaf operational-state {
-      description
-        "Operational state of the physical resource";
-      type org-openroadm-common-types:state;
-      config false;
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-physical-types@2018-10-19.yang b/ordmodels/device/src/main/yang/org-openroadm-physical-types@2018-10-19.yang
deleted file mode 100755 (executable)
index 1bf1903..0000000
+++ /dev/null
@@ -1,140 +0,0 @@
-module org-openroadm-physical-types {
-  namespace "http://org/openroadm/physical/types";
-  prefix org-openroadm-physical-types;
-
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2018-10-19;
-  }
-  import ietf-yang-types {
-    prefix yang;
-    revision-date 2013-07-15;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of physical types.
-     
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping node-info {
-    description
-      "Physical inventory data used by the node";
-    leaf vendor {
-      type string;
-      config false;
-      mandatory true;
-      description
-        "Vendor of the equipment";
-    }
-    leaf model {
-      type string;
-      config false;
-      mandatory true;
-      description
-        "Physical resource model information.";
-    }
-    leaf serial-id {
-      type string;
-      config false;
-      mandatory true;
-      description
-        "Product Code for this physical resource";
-    }
-  }
-
-  grouping common-info {
-    description
-      "Physical inventory data used by all other entities";
-    uses node-info;
-    leaf type {
-      type string;
-      config false;
-      description
-        "The specific type of this physical resource - ie the type of
-         shelf, type of circuit-pack, etc.";
-    }
-    leaf product-code {
-      type string;
-      config false;
-      description
-        "Product Code for this physical resource";
-    }
-    leaf manufacture-date {
-      type yang:date-and-time;
-      config false;
-      description
-        "Manufacture date of physical resource";
-    }
-    leaf clei {
-      type string;
-      config false;
-      description
-        "CLEI for this physical resource";
-    }
-    leaf hardware-version {
-      type string;
-      config false;
-      description
-        "The version of the hardware.";
-    }
-    leaf operational-state {
-      type org-openroadm-common-types:state;
-      config false;
-      description
-        "Operational state of the physical resource";
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-physical-types@2019-11-29.yang b/ordmodels/device/src/main/yang/org-openroadm-physical-types@2019-11-29.yang
deleted file mode 100644 (file)
index 2360937..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-module org-openroadm-physical-types {
-  namespace "http://org/openroadm/physical/types";
-  prefix org-openroadm-physical-types;
-
-  import org-openroadm-common-state-types {
-    prefix org-openroadm-common-state-types;
-    revision-date 2019-11-29;
-  }
-  import ietf-yang-types {
-    prefix yang;
-    revision-date 2013-07-15;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of physical types.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping node-info {
-    description
-      "Physical inventory data used by the node";
-    leaf vendor {
-      type string;
-      config false;
-      mandatory true;
-      description
-        "Vendor of the equipment";
-    }
-    leaf model {
-      type string;
-      config false;
-      mandatory true;
-      description
-        "Physical resource model information.";
-    }
-    leaf serial-id {
-      type string;
-      config false;
-      mandatory true;
-      description
-        "Product Code for this physical resource";
-    }
-  }
-
-  grouping common-info {
-    description
-      "Physical inventory data used by all other entities";
-    uses node-info;
-    leaf type {
-      type string;
-      config false;
-      description
-        "The specific type of this physical resource - ie the type of
-         shelf, type of circuit-pack, etc.";
-    }
-    leaf product-code {
-      type string;
-      config false;
-      description
-        "Product Code for this physical resource";
-    }
-    leaf manufacture-date {
-      type yang:date-and-time;
-      config false;
-      description
-        "Manufacture date of physical resource";
-    }
-    leaf clei {
-      type string;
-      config false;
-      description
-        "CLEI for this physical resource";
-    }
-    leaf hardware-version {
-      type string;
-      config false;
-      description
-        "The version of the hardware.";
-    }
-    leaf operational-state {
-      type org-openroadm-common-state-types:state;
-      config false;
-      mandatory true;
-      description
-        "Operational state of the physical resource";
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-pluggable-optics-holder-capability@2018-10-19.yang b/ordmodels/device/src/main/yang/org-openroadm-pluggable-optics-holder-capability@2018-10-19.yang
deleted file mode 100755 (executable)
index 6a7203a..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-module org-openroadm-pluggable-optics-holder-capability {
-  namespace "http://org/openroadm/pluggable-optics-holder-capability";
-  prefix org-openroadm-pluggable-optics-holder-capability;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-port-capability {
-    prefix org-openroadm-port-capability;
-    revision-date 2018-10-19;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for pluggable optics holder capability.
-     
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.
-     
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-     
-     Copyright (c) 2017 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-     
-     This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-
-  grouping pluggable-optics-holder-capability {
-    description
-      "Pluggable optics holder capability parameters.";
-    container pluggable-optics-holder-capability {
-      config false;
-      list supported-circuit-pack-types {
-        key "supported-circuit-pack-type";
-        leaf supported-circuit-pack-type {
-          type string;
-          mandatory true;
-          description
-            "Type of pluggable circuit-pack supported";
-        }
-        list ports {
-          key "port-name";
-          description
-            "Port reference on supported pluggable circuit-pack";
-          leaf port-name {
-            type string;
-            description
-              "Port name";
-          }
-          uses org-openroadm-port-capability:port-capability-grp;
-        }
-      }
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:circuit-packs/org-openroadm-device:cp-slots" {
-    when "org-openroadm-device:slot-type='pluggable-optics-holder'";
-    uses pluggable-optics-holder-capability;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-pluggable-optics-holder-capability@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-pluggable-optics-holder-capability@2020-05-29.yang
deleted file mode 100644 (file)
index 2acb4aa..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-module org-openroadm-pluggable-optics-holder-capability {
-  namespace "http://org/openroadm/pluggable-optics-holder-capability";
-  prefix org-openroadm-pluggable-optics-holder-capability;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-port-capability {
-    prefix org-openroadm-port-capability;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-port-types {
-    prefix org-openroadm-port-types;
-    revision-date 2020-03-27;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for pluggable optics holder capability.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2017 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-
-  grouping pluggable-optics-holder-capability {
-    description
-      "Pluggable optics holder capability parameters.";
-    container pluggable-optics-holder-capability {
-      config false;
-      description
-        "Container for pluggable optics holder capability";
-      list supported-circuit-pack {
-        key "supported-circuit-pack-type supported-pluggable-id-type";
-        description
-          "List for supported circuit pack";
-        leaf supported-circuit-pack-type {
-          type string;
-          mandatory true;
-          description
-            "Type of pluggable circuit-pack supported";
-        }
-        leaf supported-pluggable-id-type {
-          type identityref {
-            base org-openroadm-port-types:pluggable-identifiers-identity;
-          }
-          description
-            "Supported pluggable id type";
-        }
-        list ports {
-          key "port-name";
-          description
-            "Port reference on supported pluggable circuit-pack";
-          leaf port-name {
-            type string;
-            description
-              "Port name";
-          }
-          uses org-openroadm-port-capability:port-capability-grp;
-        }
-      }
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:circuit-packs/org-openroadm-device:cp-slots" {
-    when "org-openroadm-device:slot-type='pluggable-optics-holder'";
-    uses pluggable-optics-holder-capability;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-port-capability@2018-10-19.yang b/ordmodels/device/src/main/yang/org-openroadm-port-capability@2018-10-19.yang
deleted file mode 100755 (executable)
index cd85c52..0000000
+++ /dev/null
@@ -1,336 +0,0 @@
-module org-openroadm-port-capability {
-  namespace "http://org/openroadm/port-capability";
-  prefix org-openroadm-port-capability;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-port-types {
-    prefix org-openroadm-port-types;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-prot-otn-linear-aps {
-    prefix org-openroadm-prot-otn-linear-aps;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-otn-common-types {
-    prefix org-openroadm-otn-common-types;
-    revision-date 2017-12-15;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility OTN linear APS protection groups.
-     
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.
-     
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-     
-     Copyright (c) 2017 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-     
-     This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-
-  typedef tcm-direction-capability-type {
-    type enumeration {
-      enum "up-tcm" {
-        description
-          "Port supports up TCM termination, e.g., direction facing the switch fabric";
-      }
-      enum "down-tcm" {
-        description
-          "Port supports down TCM termination, e.g., direction facing out of the equipment ";
-      }
-      enum "up-down-tcm" {
-        description
-          "Port supports both up and down TCM terminations";
-      }
-    }
-    description
-      "TCM direction capability for the port";
-  }
-
-  grouping port-id-grp {
-    leaf circuit-pack-name {
-      type leafref {
-        path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:circuit-packs/org-openroadm-device:circuit-pack-name";
-      }
-      description
-        "Circuit-Pack identifier. Unique within the context of a device.";
-    }
-    leaf port-name {
-      type leafref {
-        path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:circuit-packs/org-openroadm-device:ports/org-openroadm-device:port-name";
-      }
-      description
-        "Port index identifier. Unique within the context of a circuit-pack.";
-    }
-  }
-
-  grouping slot-id-grp {
-    leaf circuit-pack-name {
-      type leafref {
-        path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:circuit-packs/org-openroadm-device:circuit-pack-name";
-      }
-      description
-        "Circuit-Pack identifier. Unique within the context of a device.";
-    }
-    leaf slot-name {
-      type leafref {
-        path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:circuit-packs/org-openroadm-device:cp-slots/org-openroadm-device:slot-name";
-      }
-      description
-        "cp-slot name. Unique within the context of a circuit-pack.";
-    }
-  }
-
-  grouping port-capability-grp {
-    description
-      "OpenROADM port capability parameters.";
-    container port-capabilities {
-      config false;
-      list supported-interface-capability {
-        key "if-cap-type";
-        description
-          "Supported interface capability on the port.";
-        leaf if-cap-type {
-          type identityref {
-            base org-openroadm-port-types:supported-if-capability;
-          }
-          description
-            "Interface type/hierarchy/rate supported on this port";
-        }
-        container otn-capability {
-          leaf-list if-protection-capability {
-            type identityref {
-              base org-openroadm-prot-otn-linear-aps:otn-protection-type;
-            }
-            description
-              "supported protection types if protection is supported on this port";
-          }
-          leaf proactive-DMp {
-            type boolean;
-            description
-              "ODU PM delay measurement (DMp) (G.709 06-2016 15.8.2.1.6)";
-          }
-          leaf tcm-capable {
-            type boolean;
-            description
-              "only when tcm-capable=true, the following two are applicable (ie, proactive-DMt, tcm-direction";
-          }
-          leaf proactive-DMt {
-            when "../tcm-capable= 'true'";
-            type boolean;
-            description
-              "ODU TCM delay measurement (DMt) (G.709 06-2016 15.8.2.2.8)";
-          }
-          leaf tcm-direction-capability {
-            when "../tcm-capable= 'true'";
-            type tcm-direction-capability-type;
-            description
-              "Supported tcm direction capability on the ODUk associated with the port.";
-          }
-          leaf-list opu-payload-type-mapping {
-            type org-openroadm-otn-common-types:payload-type-def;
-            description
-              "OPU payload-type mapping OPU.";
-          }
-          container mpdr-client-restriction {
-            description
-              "Restriction rules for how LO ODUs are multiplexed into HO ODU
-               and the relation with mapped client ports.";
-            leaf network-ho-odu-circuit-pack-name {
-              type string;
-              mandatory true;
-              description
-                "Circuit-Pack identifier. Unique within the context of a device.";
-            }
-            leaf network-ho-odu-port-name {
-              type string;
-              mandatory true;
-              description
-                "port identifier.";
-            }
-            leaf odtu-type {
-              type identityref {
-                base org-openroadm-otn-common-types:odtu-type-identity;
-              }
-              mandatory true;
-              description
-                "ODTU type, part of the MSI (Multiplex Structure Identifier)";
-            }
-            leaf network-ho-odu-trib-port-number {
-              type uint16 {
-                range "1 .. 80";
-              }
-              mandatory true;
-              description
-                "Tributary port number";
-            }
-            leaf-list network-ho-odu-trib-slots {
-              type uint16 {
-                range "1 .. 80";
-              }
-              min-elements 1;
-              max-elements "80";
-            }
-          }
-          container odu-mux-hierarchy {
-            presence "HO ODU supported hierarchy.";
-            list mux-capability {
-              key "stage-number ho-odu-type ho-odu-payload-type";
-              leaf stage-number {
-                type uint8 {
-                  range "1 .. 2";
-                }
-              }
-              leaf ho-odu-type {
-                type identityref {
-                  base org-openroadm-otn-common-types:odu-rate-identity;
-                }
-              }
-              leaf ho-odu-payload-type {
-                type org-openroadm-otn-common-types:payload-type-def;
-                description
-                  "high order ODU payload type";
-              }
-              leaf-list supported-lo-odu-type {
-                type identityref {
-                  base org-openroadm-otn-common-types:odu-rate-identity;
-                }
-              }
-              leaf lo-odu-proactive-DMp {
-                type boolean;
-                description
-                  "lo order ODU PM delay measurement (DMp) (G.709 06-2016 15.8.2.1.6)";
-              }
-              leaf lo-odu-tcm-capable {
-                type boolean;
-                description
-                  "only when lo-odu-tcm-capable=true, the following two are applicable (ie, lo-odu-proactive-DMt, lo-odu-tcm-direction";
-              }
-              leaf lo-odu-proactive-DMt {
-                when "../lo-odu-tcm-capable= 'true'";
-                type boolean;
-                description
-                  "lo order ODU TCM delay measurement (DMt) (G.709 06-2016 15.8.2.2.8)";
-              }
-              leaf lo-odu-tcm-direction-capability {
-                when "../lo-odu-tcm-capable= 'true'";
-                type tcm-direction-capability-type;
-                description
-                  "Supported tcm direction capability for low order ODU associated with the port.";
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-
-  grouping port-group-restriction-grp {
-    container port-group-restriction {
-      config false;
-      list port-bandwidth-sharing {
-        key "port-sharing-id";
-        leaf port-sharing-id {
-          type uint16;
-        }
-        list port-list {
-          key "circuit-pack-name port-name";
-          uses port-id-grp;
-        }
-        list pluggable-optics-holder-list {
-          key "circuit-pack-name slot-name";
-          uses slot-id-grp;
-        }
-        leaf shared-bandwidth {
-          type uint16;
-          units "Gbps";
-        }
-        list possible-port-config {
-          key "config-id";
-          leaf config-id {
-            type uint16;
-          }
-          list port-if-type-config {
-            key "circuit-pack-name port-name";
-            uses port-id-grp;
-            leaf-list port-if-type {
-              type identityref {
-                base org-openroadm-port-types:supported-if-capability;
-              }
-            }
-          }
-          list slot-if-type-config {
-            key "circuit-pack-name slot-name port-name";
-            uses slot-id-grp;
-            leaf port-name {
-              type string;
-            }
-            leaf-list port-if-type {
-              type identityref {
-                base org-openroadm-port-types:supported-if-capability;
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:circuit-packs/org-openroadm-device:ports" {
-    uses port-capability-grp;
-  }
-  augment "/org-openroadm-device:org-openroadm-device" {
-    uses port-group-restriction-grp;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-port-capability@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-port-capability@2020-05-29.yang
deleted file mode 100644 (file)
index 684b2f8..0000000
+++ /dev/null
@@ -1,342 +0,0 @@
-module org-openroadm-port-capability {
-  namespace "http://org/openroadm/port-capability";
-  prefix org-openroadm-port-capability;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-port-types {
-    prefix org-openroadm-port-types;
-    revision-date 2020-03-27;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for port capabilities.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2017 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-
-  grouping port-id-grp {
-    leaf circuit-pack-name {
-      type leafref {
-        path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:circuit-packs/org-openroadm-device:circuit-pack-name";
-      }
-      description
-        "Circuit-Pack identifier. Unique within the context of a device.";
-    }
-    leaf port-name {
-      type leafref {
-        path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:circuit-packs/org-openroadm-device:ports/org-openroadm-device:port-name";
-      }
-      description
-        "Port index identifier. Unique within the context of a circuit-pack.";
-    }
-  }
-
-  grouping slot-id-grp {
-    leaf circuit-pack-name {
-      type leafref {
-        path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:circuit-packs/org-openroadm-device:circuit-pack-name";
-      }
-      description
-        "Circuit-Pack identifier. Unique within the context of a device.";
-    }
-    leaf slot-name {
-      type leafref {
-        path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:circuit-packs/org-openroadm-device:cp-slots/org-openroadm-device:slot-name";
-      }
-      description
-        "cp-slot name. Unique within the context of a circuit-pack.";
-    }
-  }
-
-  grouping optical-operational-modes-grp-for-capability {
-    leaf-list optical-operational-mode-profile-name {
-      type leafref {
-        path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:optical-operational-mode-profile/org-openroadm-device:profile-name";
-      }
-      config false;
-      description
-        "Optical operation capabilities leaf list";
-    }
-    description
-      "Optical operational modes grouping";
-  }
-
-  grouping port-capability-grp {
-    description
-      "OpenROADM port capability parameters.";
-    container port-capabilities {
-      config false;
-      list supported-interface-capability {
-        key "if-cap-type";
-        description
-          "Supported interface capability on the port.";
-        leaf if-cap-type {
-          type identityref {
-            base org-openroadm-port-types:supported-if-capability;
-          }
-          description
-            "Interface type/hierarchy/rate supported on this port";
-        }
-        leaf-list split-lambda-profile-name {
-          type leafref {
-            path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:split-lambda-profile/org-openroadm-device:profile-name";
-          }
-          description
-            "Split lambda mode capabilities";
-        }
-        leaf-list otsigroup-capability-profile-name {
-          type leafref {
-             path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:otsigroup-capability-profile/org-openroadm-device:profile-name";
-          }
-          description
-            "OTSI group capabilities";
-        }
-        uses optical-operational-modes-grp-for-capability;
-        container otn-capability {
-          description
-            "OTN capability";
-          leaf otn-capability-profile-name {
-            type leafref {
-              path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:otn-capability-profile/org-openroadm-device:profile-name";
-            }
-          }
-          list mpdr-client-restriction {
-            description
-              "Restriction rules for how LO ODUs are multiplexed into HO ODU
-               and the relation with mapped client ports.";
-            leaf network-ho-odu-circuit-pack-name {
-              type string;
-              mandatory true;
-              description
-                "Circuit-Pack identifier. Unique within the context of a device.";
-            }
-            leaf network-ho-odu-port-name {
-              type string;
-              mandatory true;
-              description
-                "port identifier.";
-            }
-            leaf-list muxp-profile-name {
-              type leafref {
-                path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:muxp-profile/org-openroadm-device:profile-name";
-              }
-            }
-          }
-          leaf otn-odu-mux-hierarchy-profile-name {
-            type leafref {
-              path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:otn-odu-mux-hierarchy-profile/org-openroadm-device:profile-name";
-            }
-            description
-              "OTN ODU Mux hierarchy capabilities";
-          }
-        }
-        container logical-port {
-          leaf circuit-pack-name {
-            type string;
-            description
-              "The circuit pack supporting the logical port";
-          }
-          leaf port-name {
-            type string;
-            description
-              "Port name for logical-port";
-          }
-          description
-            "Logical port container";
-        }
-      }
-    }
-  }
-
-  grouping port-group-restriction-grp {
-    container port-group-restriction {
-      config false;
-      list port-bandwidth-sharing {
-        key "port-sharing-id";
-        leaf port-sharing-id {
-          type uint16;
-        }
-        list port-list {
-          key "circuit-pack-name port-name";
-          uses port-id-grp;
-        }
-        list pluggable-optics-holder-list {
-          key "circuit-pack-name slot-name";
-          uses slot-id-grp;
-        }
-        leaf shared-bandwidth {
-          type uint16;
-          units "Gbps";
-        }
-        list possible-port-config {
-          key "config-id";
-          leaf config-id {
-            type uint16;
-          }
-          list port-if-type-config {
-            key "circuit-pack-name port-name";
-            uses port-id-grp;
-            leaf-list port-if-type {
-              type identityref {
-                base org-openroadm-port-types:supported-if-capability;
-              }
-            }
-            leaf otsi-rate {
-              type uint16;
-              units "Gbps";
-              description
-                "Optical Tributary Signal (OTSi) rate in Gbps";
-            }
-          }
-          list slot-if-type-config {
-            key "circuit-pack-name slot-name port-name";
-            uses slot-id-grp;
-            leaf port-name {
-              type string;
-            }
-            leaf-list port-if-type {
-              type identityref {
-                base org-openroadm-port-types:supported-if-capability;
-              }
-            }
-            leaf-list port-module-type {
-              type org-openroadm-port-types:port-module-types;
-            }
-            leaf otsi-rate {
-              type uint16;
-              units "Gbps";
-              description
-                "Optical Tributary Signal (OTSi) rate in Gbps";
-            }
-          }
-        }
-      }
-    }
-  }
-
-  grouping provisioned-port-grp {
-    container provisioned-port-grp {
-      list port-bandwidth-sharing {
-        key "port-sharing-id";
-        leaf port-sharing-id {
-          type uint16;
-        }
-        leaf provisioned-port-config {
-          type uint16;
-          default "1";
-        }
-      }
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:circuit-packs/org-openroadm-device:ports" {
-    description
-      "augment for port capability";
-    uses port-capability-grp;
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device" {
-    description
-      "augment for port group restriction";
-    uses port-group-restriction-grp;
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device" {
-    description
-      "augment for provisioned port group";
-    uses provisioned-port-grp;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-ppp-interfaces@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-ppp-interfaces@2020-05-29.yang
deleted file mode 100644 (file)
index b786cd0..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
-module org-openroadm-ppp-interfaces {
-  namespace "http://org/openroadm/ppp-interfaces";
-  prefix org-openroadm-ppp-interfaces;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-interfaces {
-    prefix openROADM-if;
-    revision-date 2019-11-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility ppp link interfaces.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reprpppce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote prpppcts derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0";
-  }
-
-  grouping ppp-interfaces {
-    container ppp {
-      description
-        "PPP attributes. LCP attributes and 16 bit FCS default as per RFC 1662 and RFC 1570";
-      leaf magicNumber {
-        type boolean;
-        default "false";
-        description
-          "Boolean to indicate if magicNumber negotiation to remote is supported or not";
-      }
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface" {
-    when "org-openroadm-device:type = 'openROADM-if:ppp'";
-    uses ppp-interfaces;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-prot-otn-linear-aps@2018-10-19.yang b/ordmodels/device/src/main/yang/org-openroadm-prot-otn-linear-aps@2018-10-19.yang
deleted file mode 100755 (executable)
index 33de13e..0000000
+++ /dev/null
@@ -1,345 +0,0 @@
-module org-openroadm-prot-otn-linear-aps {
-  namespace "http://org/openroadm/prot/otn-linear-aps";
-  prefix org-openroadm-prot-otn-linear-aps;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2018-10-19;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility OTN linear APS protection groups.
-     
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.
-     
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-     
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-     
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-
-  identity otn-protection-type {
-    description
-      "OTN base protection identity from which
-         specific protection types are derived.";
-  }
-
-  identity odu-one-plus-one {
-    base otn-protection-type;
-    description
-      "ODU Linear Protection 1+1 permanant bridge";
-  }
-
-  grouping odu-sncp-protection-grps {
-    list odu-sncp-pg {
-      key "name";
-      leaf name {
-        type string;
-        description
-          "The odu-sncp-protection-group name";
-      }
-      leaf level {
-        type enumeration {
-          enum "line" {
-            value 1;
-          }
-          enum "path" {
-            value 2;
-          }
-        }
-        mandatory true;
-        description
-          "Designates protection group as Line or Path";
-      }
-      leaf prot-type {
-        type identityref {
-          base otn-protection-type;
-        }
-        default "odu-one-plus-one";
-        description
-          "The type of the protection group.";
-      }
-      leaf switching-direction {
-        type enumeration {
-          enum "unidirectional-switching" {
-            value 1;
-          }
-          enum "bidirectional-switching" {
-            value 2;
-          }
-        }
-        default "unidirectional-switching";
-        description
-          "Bidirectional refers to APS signaling enabled (G.873.1 Table 7-1 Table 8-1).";
-      }
-      leaf revertive {
-        type boolean;
-        default "false";
-        description
-          "Sets reversion behavior.";
-      }
-      leaf mode {
-        type enumeration {
-          enum "SNC/Ne" {
-            value 1;
-            description
-              "applicable to line or path switching";
-          }
-          enum "SNC/Ns" {
-            value 2;
-            description
-              "applicable to line or path switching";
-          }
-          enum "SNC/S" {
-            value 3;
-            description
-              "applicable to line or path switching";
-          }
-          enum "SNC/I" {
-            value 4;
-            description
-              "applicable to line switching only";
-          }
-          enum "CL-SNCG/I" {
-            value 5;
-            description
-              "applicable to line switching only";
-          }
-        }
-        mandatory true;
-        description
-          "Sets the protection mode";
-      }
-      leaf protection-trigger-level {
-        type enumeration {
-          enum "OTUk/ODUkA-SSF-SSD" {
-            value 1;
-            description
-              "applicable to SNC/I";
-          }
-          enum "ODUkP/ODUjA-SSF-SSD" {
-            value 2;
-            description
-              "applicable to CL-SNCG/I";
-          }
-          enum "ODUP-SSF-SSD" {
-            value 3;
-            description
-              "applicable to SNC/Ne";
-          }
-          enum "ODUT1" {
-            value 4;
-            description
-              "applicable to SNC/Ns or SNC/S";
-          }
-          enum "ODUT2" {
-            value 5;
-            description
-              "applicable to SNC/Ns or SNC/S";
-          }
-          enum "ODUT3" {
-            value 6;
-            description
-              "applicable to SNC/Ns or SNC/S";
-          }
-          enum "ODUT4" {
-            value 7;
-            description
-              "applicable to SNC/Ns or SNC/S";
-          }
-          enum "ODUT5" {
-            value 8;
-            description
-              "applicable to SNC/Ns or SNC/S";
-          }
-          enum "ODUT6" {
-            value 9;
-            description
-              "applicable to SNC/Ns or SNC/S";
-          }
-        }
-        description
-          "Indicates switch trigger.";
-      }
-      leaf wait-to-restore {
-        when "../revertive = 'true'";
-        type uint8 {
-          range "1..12";
-        }
-        units "minutes";
-        default "5";
-        description
-          "Wait to restore time in minutes";
-      }
-      container holdoff-timer {
-        leaf holdoff {
-          type uint8 {
-            range "0 | 20 | 100";
-          }
-          units "milliseconds";
-          default "0";
-          description
-            "switch hold-off time in milliseconds";
-        }
-        leaf holdoff-multiplier {
-          when "../holdoff= 100";
-          type uint8 {
-            range "1 .. 100";
-          }
-          default "1";
-          description
-            "switch holdoff time multiplier x100 milliseconds";
-        }
-      }
-      leaf working-if {
-        type leafref {
-          path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface/org-openroadm-device:name";
-        }
-        mandatory true;
-        description
-          "Designated work interface";
-      }
-      leaf-list pg-interfaces {
-        type leafref {
-          path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface/org-openroadm-device:name";
-        }
-        min-elements 1;
-        description
-          "List of interfaces in the PG";
-      }
-      leaf active-if {
-        type leafref {
-          path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface/org-openroadm-device:name";
-        }
-        config false;
-        description
-          "Active interface in the PG";
-      }
-    }
-  }
-
-  rpc odu-sncp-protection-switch {
-    description
-      "ODU SNCP Protection Switch RPC with synchronous implementation";
-    input {
-      leaf protection-group {
-        type leafref {
-          path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:protection-grps/org-openroadm-prot-otn-linear-aps:odu-sncp-pg/org-openroadm-prot-otn-linear-aps:name";
-        }
-        mandatory true;
-        description
-          "Target protection group";
-      }
-      leaf pg-interface {
-        type leafref {
-          path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface/org-openroadm-device:name";
-        }
-        mandatory true;
-        description
-          "Target protection group interface";
-      }
-      leaf switch-command {
-        type enumeration {
-          enum "Lock-Out-Protect" {
-            value 1;
-          }
-          enum "Force-Switch" {
-            value 2;
-          }
-          enum "Manual-Switch" {
-            value 3;
-          }
-          enum "Release" {
-            value 4;
-          }
-        }
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  notification odu-sncp-pg-switch-event {
-    leaf switch-status {
-      type enumeration {
-        enum "switched-to-protect" {
-          value 1;
-        }
-        enum "switched-back-to-working" {
-          value 2;
-        }
-      }
-      description
-        "Completed protection switch";
-    }
-    leaf odu-sncp-pg-name {
-      type string;
-      description
-        "The odu-sncp-protection-group name";
-    }
-  }
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:protection-grps" {
-    uses odu-sncp-protection-grps;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-prot-otn-linear-aps@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-prot-otn-linear-aps@2020-05-29.yang
deleted file mode 100644 (file)
index e6dcd2d..0000000
+++ /dev/null
@@ -1,377 +0,0 @@
-module org-openroadm-prot-otn-linear-aps {
-  namespace "http://org/openroadm/prot/otn-linear-aps";
-  prefix org-openroadm-prot-otn-linear-aps;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2020-05-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for device facility OTN linear APS protection groups.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-
-  identity odu-one-plus-one {
-    base org-openroadm-common-types:otn-protection-type;
-    description
-      "ODU Linear Protection 1+1 permanent bridge";
-  }
-
-  grouping odu-sncp-protection-grps {
-    list odu-sncp-pg {
-      key "name";
-      leaf name {
-        type string;
-        description
-          "The odu-sncp-protection-group name";
-      }
-      leaf level {
-        type enumeration {
-          enum line {
-            value 1;
-          }
-          enum path {
-            value 2;
-          }
-        }
-        mandatory true;
-        description
-          "Designates protection group as Line or Path";
-      }
-      leaf prot-type {
-        type identityref {
-          base org-openroadm-common-types:otn-protection-type;
-        }
-        default "odu-one-plus-one";
-        description
-          "The type of the protection group.";
-      }
-      leaf switching-direction {
-        type enumeration {
-          enum unidirectional-switching {
-            value 1;
-          }
-          enum bidirectional-switching {
-            value 2;
-          }
-        }
-        default "unidirectional-switching";
-        description
-          "Bidirectional refers to APS signaling enabled (G.873.1 Table 7-1 Table 8-1).";
-      }
-      leaf revertive {
-        type boolean;
-        default "false";
-        description
-          "Sets reversion behavior.";
-      }
-      leaf mode {
-        type enumeration {
-          enum SNC/Ne {
-            value 1;
-            description
-              "applicable to line or path switching";
-          }
-          enum SNC/Ns {
-            value 2;
-            description
-              "applicable to line or path switching";
-          }
-          enum SNC/S {
-            value 3;
-            description
-              "applicable to line or path switching";
-          }
-          enum SNC/I {
-            value 4;
-            description
-              "applicable to line switching only";
-          }
-          enum CL-SNCG/I {
-            value 5;
-            description
-              "applicable to line switching only";
-          }
-        }
-        mandatory true;
-        description
-          "Sets the protection mode";
-      }
-      leaf protection-trigger-level {
-        type enumeration {
-          enum OTUk/ODUkA-SSF-SSD {
-            value 1;
-            description
-              "applicable to SNC/I";
-          }
-          enum ODUkP/ODUjA-SSF-SSD {
-            value 2;
-            description
-              "applicable to CL-SNCG/I";
-          }
-          enum ODUP-SSF-SSD {
-            value 3;
-            description
-              "applicable to SNC/Ne";
-          }
-          enum ODUT1 {
-            value 4;
-            description
-              "applicable to SNC/Ns or SNC/S";
-          }
-          enum ODUT2 {
-            value 5;
-            description
-              "applicable to SNC/Ns or SNC/S";
-          }
-          enum ODUT3 {
-            value 6;
-            description
-              "applicable to SNC/Ns or SNC/S";
-          }
-          enum ODUT4 {
-            value 7;
-            description
-              "applicable to SNC/Ns or SNC/S";
-          }
-          enum ODUT5 {
-            value 8;
-            description
-              "applicable to SNC/Ns or SNC/S";
-          }
-          enum ODUT6 {
-            value 9;
-            description
-              "applicable to SNC/Ns or SNC/S";
-          }
-        }
-        description
-          "Indicates switch trigger.";
-      }
-      leaf wait-to-restore {
-        when "../revertive = 'true'";
-        type uint8 {
-          range "1..12";
-        }
-        units "minutes";
-        default "5";
-        description
-          "Wait to restore time in minutes";
-      }
-      container holdoff-timer {
-        leaf holdoff {
-          type uint8 {
-            range "0 | 20 | 100";
-          }
-          units "milliseconds";
-          default "0";
-          description
-            "switch hold-off time in milliseconds";
-        }
-        leaf holdoff-multiplier {
-          when '../holdoff= 100';
-          type uint8 {
-            range "1 .. 100";
-          }
-          default "1";
-          description
-            "switch holdoff time multiplier x100 milliseconds";
-        }
-      }
-      leaf working-if {
-        type leafref {
-          path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface/org-openroadm-device:name";
-        }
-        mandatory true;
-        description
-          "Designated work interface";
-      }
-      leaf-list pg-interfaces {
-        type leafref {
-          path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface/org-openroadm-device:name";
-        }
-        min-elements 1;
-        description
-          "List of interfaces in the PG";
-      }
-      leaf active-if {
-        type leafref {
-          path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface/org-openroadm-device:name";
-        }
-        config false;
-        description
-          "Active interface in the PG";
-      }
-    }
-  }
-
-  rpc odu-sncp-protection-switch {
-    description
-      "ODU SNCP Protection Switch RPC with synchronous implementation";
-    input {
-      leaf protection-group {
-        type leafref {
-          path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:protection-grps/org-openroadm-prot-otn-linear-aps:odu-sncp-pg/org-openroadm-prot-otn-linear-aps:name";
-        }
-        mandatory true;
-        description
-          "Target protection group";
-      }
-      leaf pg-interface {
-        type leafref {
-          path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface/org-openroadm-device:name";
-        }
-        mandatory true;
-        description
-          "Target protection group interface";
-      }
-      leaf switch-command {
-        type enumeration {
-          enum Lock-Out-Protect {
-            value 1;
-          }
-          enum Force-Switch {
-            value 2;
-          }
-          enum Manual-Switch {
-            value 3;
-          }
-          enum Release {
-            value 4;
-          }
-        }
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-
-  notification odu-sncp-pg-switch-event {
-    leaf switch-status {
-      type enumeration {
-        enum switched-to-protect {
-          value 1;
-        }
-        enum switched-back-to-working {
-          value 2;
-        }
-      }
-      description
-        "Completed protection switch";
-    }
-    leaf odu-sncp-pg-name {
-      type string;
-      description
-        "The odu-sncp-protection-group name";
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:protection-grps" {
-    uses odu-sncp-protection-grps;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-routing@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-routing@2020-05-29.yang
deleted file mode 100644 (file)
index ab1d930..0000000
+++ /dev/null
@@ -1,563 +0,0 @@
-module org-openroadm-routing {
-  namespace "http://org/openroadm/routing";
-  prefix org-openroadm-routing;
-
-  import ietf-yang-types {
-    prefix yang;
-    revision-date 2013-07-15;
-  }
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2020-05-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "This model defines Yang model for routing.
-
-     This model reuses data items defined in the IETF YANG model for
-     interfaces described by RFC 8022.
-
-     Some attributes which are not required in Open ROADM MSA are removed.
-     Yang file included are changed to fit into Open ROADM MSA yang structure.
-
-     IETF code is subject to the following copyright and license:
-     Copyright (c) IETF Trust and the persons identified as authors of
-     the code.
-     All rights reserved.
-
-     Redistribution and use in source and binary forms, with or without
-     modification, is permitted pursuant to, and subject to the license
-     terms contained in, the Simplified BSD License set forth in
-     Section 4.c of the IETF Trust's Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info).";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2015-05-25 {
-    description
-      "Initial revision.";
-    reference
-      "RFC XXXX: A YANG Data Model for Routing Management";
-  }
-
-  feature multiple-ribs {
-    description
-      "This feature indicates that the server supports user-defined
-       RIBs.
-
-       Servers that do not advertise this feature SHOULD provide
-       exactly one system-controlled RIB per routing-instance and
-       supported address family and make them also the default RIBs.
-       These RIBs then appear as entries of the list
-       /routing-state/routing-instance/ribs/rib.";
-  }
-
-  feature router-id {
-    description
-      "This feature indicates that the server supports configuration
-       of an explicit 32-bit router ID that is used by some routing
-       protocols.
-
-       Servers that do not advertise this feature set a router ID
-       algorithmically, usually to one of configured IPv4 addresses.
-       However, this algorithm is implementation-specific.";
-  }
-
-  identity address-family {
-    description
-      "Base identity from which identities describing address
-       families are derived.";
-  }
-
-  identity ipv4 {
-    base address-family;
-    description
-      "This identity represents IPv4 address family.";
-  }
-
-  identity ipv6 {
-    base address-family;
-    description
-      "This identity represents IPv6 address family.";
-  }
-
-  identity routing-instance {
-    description
-      "Base identity from which identities describing routing
-       instance types are derived.";
-  }
-
-  identity default-routing-instance {
-    base routing-instance;
-    description
-      "This identity represents either a default routing instance, or
-       the only routing instance on systems that do not support
-       multiple instances.";
-  }
-
-  identity vrf-routing-instance {
-    base routing-instance;
-    description
-      "This identity represents a VRF routing instance. The type is
-       distinct from the default-routing-instance. There may be
-       multiple vrf-routing-interfaces.";
-  }
-
-  identity routing-protocol {
-    description
-      "Base identity from which routing protocol identities are
-       derived.";
-  }
-
-  identity direct {
-    base routing-protocol;
-    description
-      "Routing pseudo-protocol that provides routes to directly
-       connected networks.";
-  }
-
-  identity static {
-    base routing-protocol;
-    description
-      "Static routing pseudo-protocol.";
-  }
-
-  typedef routing-instance-ref {
-    type leafref {
-      path "/org-openroadm-device:org-openroadm-device/org-openroadm-routing:routing/org-openroadm-routing:routing-instance/org-openroadm-routing:name";
-    }
-    description
-      "This type is used for leafs that reference a routing instance
-       configuration.";
-  }
-
-  typedef routing-instance-state-ref {
-    type leafref {
-      path "/org-openroadm-device:org-openroadm-device/org-openroadm-routing:routing-state/org-openroadm-routing:routing-instance/org-openroadm-routing:name";
-    }
-    description
-      "This type is used for leafs that reference state data of a
-       routing instance.";
-  }
-
-  typedef route-preference {
-    type uint32;
-    description
-      "This type is used for route preferences.";
-  }
-
-  grouping address-family-group {
-    description
-      "This grouping provides a leaf identifying an address
-       family.";
-    leaf address-family {
-      type identityref {
-        base address-family;
-      }
-      mandatory true;
-      description
-        "Address family.";
-    }
-  }
-
-  grouping router-id {
-    description
-      "This grouping provides router ID.";
-    leaf router-id {
-      type yang:dotted-quad;
-      description
-        "A 32-bit number in the form of a dotted quad that is used by
-         some routing protocols identifying a router.";
-      reference
-        "RFC 2328: OSPF Version 2.";
-    }
-  }
-
-  grouping special-next-hop-group {
-    description
-      "This grouping provides a leaf with an enumeration of special
-       next-hops.";
-    leaf special-next-hop {
-      type enumeration {
-        enum blackhole {
-          description
-            "Silently discard the packet.";
-        }
-        enum unreachable {
-          description
-            "Discard the packet and notify the sender with an error
-             message indicating that the destination host is
-             unreachable.";
-        }
-        enum prohibit {
-          description
-            "Discard the packet and notify the sender with an error
-             message indicating that the communication is
-             administratively prohibited.";
-        }
-        enum receive {
-          description
-            "The packet will be received by the local system.";
-        }
-      }
-      description
-        "Special next-hop options.";
-    }
-  }
-
-  grouping next-hop-content {
-    description
-      "Generic parameters of next-hops in static routes.";
-    choice next-hop-options {
-      mandatory true;
-      description
-        "Options for next-hops in static routes.
-
-         It is expected that other cases will be added through
-         augments from other modules, e.g., for Equal-Cost Multipath
-         routing (ECMP).";
-      case simple-next-hop {
-        description
-          "Simple next-hop is specified as an outgoing interface,
-           next-hop address or both.
-
-           Address-family-specific modules are expected to provide
-           'next-hop-address' leaf via augmentation.";
-        leaf outgoing-interface {
-          type leafref {
-            path "/org-openroadm-device:org-openroadm-device/org-openroadm-routing:routing/org-openroadm-routing:routing-instance/org-openroadm-routing:interfaces/org-openroadm-routing:interface";
-          }
-          description
-            "Name of the outgoing interface.";
-        }
-      }
-      case special-next-hop {
-        uses special-next-hop-group;
-      }
-    }
-  }
-
-  grouping route-metadata {
-    description
-      "Common route metadata.";
-    leaf source-protocol {
-      type identityref {
-        base routing-protocol;
-      }
-      mandatory true;
-      description
-        "Type of the routing protocol from which the route
-         originated.";
-    }
-    leaf active {
-      type empty;
-      description
-        "Presence of this leaf indicates that the route is preferred
-         among all routes in the same RIB that have the same
-         destination prefix.";
-    }
-    leaf last-updated {
-      type yang:date-and-time;
-      description
-        "Time stamp of the last modification of the route. If the
-         route was never modified, it is the time when the route was
-         inserted into the RIB.";
-    }
-  }
-
-  grouping routing-grp {
-    container routing {
-      description
-        "Configuration parameters for the routing subsystem.";
-      list routing-instance {
-        key "name";
-        description
-          "Configuration of a routing instance.";
-        leaf name {
-          type string;
-          description
-            "The name of the routing instance.
-
-             For system-controlled entries, the value of this leaf must
-             be the same as the name of the corresponding entry in
-             state data.
-
-             For user-controlled entries, an arbitrary name can be
-             used.";
-        }
-        leaf type {
-          type identityref {
-            base routing-instance;
-          }
-          default "org-openroadm-routing:default-routing-instance";
-          description
-            "The type of the routing instance.";
-        }
-        leaf enabled {
-          type boolean;
-          default "true";
-          description
-            "Enable/disable the routing instance.
-
-             If this parameter is false, the parent routing instance is
-             disabled and does not appear in state data, despite any
-             other configuration that might be present.";
-        }
-        uses router-id {
-          if-feature "router-id";
-          description
-            "Configuration of the global router ID. Routing protocols
-             that use router ID can use this parameter or override it
-             with another value.";
-        }
-        leaf description {
-          type string;
-          description
-            "Textual description of the routing instance.";
-        }
-        container interfaces {
-          description
-            "Assignment of the routing instance's interfaces.";
-          leaf-list interface {
-            type org-openroadm-device:interface-ref;
-            description
-              "The name of a configured network layer interface to be
-               assigned to the routing-instance.";
-          }
-        }
-        container routing-protocols {
-          description
-            "Configuration of routing protocol instances.";
-          list routing-protocol {
-            key "type name";
-            description
-              "Each entry contains configuration of a routing protocol
-               instance.";
-            leaf type {
-              type identityref {
-                base routing-protocol;
-              }
-              description
-                "Type of the routing protocol - an identity derived
-                 from the 'routing-protocol' base identity.";
-            }
-            leaf name {
-              type string;
-              description
-                "An arbitrary name of the routing protocol instance.";
-            }
-            leaf description {
-              type string;
-              description
-                "Textual description of the routing protocol
-                 instance.";
-            }
-            container static-routes {
-              when "../type='org-openroadm-routing:static'" {
-                description
-                  "This container is only valid for the 'static'
-                   routing protocol.";
-              }
-              description
-                "Configuration of the 'static' pseudo-protocol.
-
-                 Address-family-specific modules augment this node with
-                 their lists of routes.";
-            }
-          }
-        }
-        container ribs {
-          description
-            "Configuration of RIBs.";
-          list rib {
-            key "name";
-            description
-              "Each entry contains configuration for a RIB identified
-               by the 'name' key.
-
-               Entries having the same key as a system-controlled entry
-               of the list /routing-state/routing-instance/ribs/rib are
-               used for configuring parameters of that entry. Other
-               entries define additional user-controlled RIBs.";
-            leaf name {
-              type string;
-              description
-                "The name of the RIB.
-
-                 For system-controlled entries, the value of this leaf
-                 must be the same as the name of the corresponding
-                 entry in state data.
-
-                 For user-controlled entries, an arbitrary name can be
-                 used.";
-            }
-            uses address-family-group {
-              description
-                "Address family of the RIB.
-
-                 It is mandatory for user-controlled RIBs. For
-                 system-controlled RIBs it can be omitted, otherwise it
-                 must match the address family of the corresponding
-                 state entry.";
-              refine "address-family" {
-                mandatory false;
-              }
-            }
-            leaf description {
-              type string;
-              description
-                "Textual description of the RIB.";
-            }
-          }
-        }
-      }
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device" {
-    uses routing-grp;
-  }
-
-  grouping routing-state-grp {
-    container routing-state {
-      config false;
-      description
-        "State data of the routing subsystem.";
-      list routing-instance {
-        key "name";
-        description
-          "Each list entry is a container for state data of a routing
-           instance.
-
-           An implementation MUST support routing instance(s) of the
-           type 'rt:default-routing-instance', and MAY support other
-           types. An implementation MAY restrict the number of routing
-           instances of each supported type.
-
-           An implementation SHOULD create at least one
-           system-controlled instance, and MAY allow the clients to
-           create user-controlled routing instances in
-           configuration.";
-        leaf name {
-          type string;
-          description
-            "The name of the routing instance.
-
-             For system-controlled instances the name is persistent,
-             i.e., it SHOULD NOT change across reboots.";
-        }
-        leaf type {
-          type identityref {
-            base routing-instance;
-          }
-          description
-            "The routing instance type.";
-        }
-        uses router-id {
-          description
-            "Global router ID.
-
-             It may be either configured or assigned algorithmically by
-             the implementation.";
-        }
-        container routing-protocols {
-          description
-            "Container for the list of routing protocol instances.";
-          list routing-protocol {
-            key "type name";
-            description
-              "State data of a routing protocol instance.
-
-               An implementation MUST provide exactly one
-               system-controlled instance of the type 'direct'. Other
-               instances MAY be created by configuration.";
-            leaf type {
-              type identityref {
-                base routing-protocol;
-              }
-              description
-                "Type of the routing protocol.";
-            }
-            leaf name {
-              type string;
-              description
-                "The name of the routing protocol instance.
-
-                 For system-controlled instances this name is
-                 persistent, i.e., it SHOULD NOT change across
-                 reboots.";
-            }
-          }
-        }
-        container ribs {
-          description
-            "Container for RIBs.";
-          list rib {
-            key "name";
-            min-elements 1;
-            description
-              "Each entry represents a RIB identified by the 'name'
-               key. All routes in a RIB MUST belong to the same address
-               family.
-
-               For each routing instance, an implementation SHOULD
-               provide one system-controlled default RIB for each
-               supported address family.";
-            leaf name {
-              type string;
-              description
-                "The name of the RIB.";
-            }
-            uses address-family-group;
-            leaf default-rib {
-              if-feature "multiple-ribs";
-              type boolean;
-              default "true";
-              description
-                "This flag has the value of 'true' if and only if the
-                 RIB is the default RIB for the given address family.
-
-                 A default RIB always receives direct routes. By
-                 default it also receives routes from all routing
-                 protocols.";
-            }
-            container routes {
-              description
-                "Current content of the RIB.";
-            }
-          }
-        }
-      }
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device" {
-    uses routing-state-grp;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-rstp@2016-10-14.yang b/ordmodels/device/src/main/yang/org-openroadm-rstp@2016-10-14.yang
deleted file mode 100644 (file)
index 626ff92..0000000
+++ /dev/null
@@ -1,311 +0,0 @@
-module org-openroadm-rstp {
-  namespace "http://org/openroadm/rstp";
-  prefix org-openroadm-rstp;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2017-02-06;
-  }
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for rstp protocol.
-
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef bridge-id-type {
-    type string;
-    description
-      "Unique Bridge Identifier";
-  }
-
-  grouping rstp-common-bridge-config {
-    leaf bridge-priority {
-      description
-        "Bridge Priority Value";
-      type uint32 {
-        range "0..61440";
-      }
-      default "32768";
-    }
-    leaf shutdown {
-      description
-        "Bridge admin state";
-      type empty;
-    }
-    leaf hold-time {
-      description
-        "The time interval during which no more than two
-            BPDUs transmitted by this node in seconds - not used in rstp mode (in seconds)";
-      type uint32 {
-        range "1..10";
-      }
-      default "2";
-    }
-    leaf hello-time {
-      description
-        "The time between the transmission of BPDU's by this node on any
-            port, when role is rooti (in seconds)";
-      type uint32 {
-        range "1..10";
-      }
-      default "2";
-    }
-    leaf max-age {
-      description
-        "The value that all bridges use for MaxAge when this bridge
-            is acting as the root";
-      type uint32 {
-        range "6..40";
-      }
-      default "20";
-    }
-    leaf forward-delay {
-      description
-        "The port on the Switch spends this time in the listening
-            state while moving from the blocking state to the forwarding state (in seconds)";
-      type uint32 {
-        range "4..30";
-      }
-      default "15";
-    }
-    leaf transmit-hold-count {
-      description
-        "Maximum BPDU transmission rate";
-      type uint32 {
-        range "1..10";
-      }
-      default "2";
-    }
-  }
-
-  grouping rstp-root-bridge-attr {
-    leaf root-bridge-port {
-      description
-        "Port id of the root port";
-      type uint32;
-    }
-    leaf root-path-cost {
-      description
-        "The cost of the path to the root as
-               seen from this bridge";
-      type uint32;
-    }
-    leaf root-bridge-priority {
-      description
-        "Root Bridge Priority Value";
-      type uint32;
-    }
-    leaf root-bridge-id {
-      description
-        "Root Bridge identifier";
-      type bridge-id-type;
-    }
-    leaf root-hold-time {
-      description
-        "The time interval during which no more than two
-               BPDUs transmitted by this node in seconds at root node (in seconds)";
-      type uint32;
-    }
-    leaf root-hello-time {
-      description
-        "The time between the transmission of BPDU's used at root node (in seconds)";
-      type uint32;
-    }
-    leaf root-max-age {
-      description
-        "The value that all bridges use for MaxAge used at root node";
-      type uint32;
-    }
-    leaf root-forward-delay {
-      description
-        "The time in seconds spent on the listening state used at root node (in seconds)";
-      type uint32;
-    }
-  }
-
-  grouping rstp-bridge-port-state-attr {
-    list rstp-bridge-port-table {
-      max-elements "15";
-      description
-        "This table contains port-specific information for rstp state attributes";
-      key "ifname";
-      leaf ifname {
-        description
-          "Interface name of the port";
-        type string {
-          length "1..255";
-        }
-      }
-      leaf bridge-port-state {
-        description
-          "The port's current state";
-        type enumeration {
-          enum "discarding";
-          enum "blocked";
-          enum "learning";
-          enum "forwarding";
-          enum "unknown";
-        }
-      }
-      leaf bridge-port-role {
-        description
-          "The role payed by this port in the bridge";
-        type enumeration {
-          enum "designated";
-          enum "root";
-          enum "alternate";
-          enum "disabled";
-          enum "backup";
-          enum "unknown";
-        }
-      }
-      leaf bridge-port-id {
-        description
-          "Unique port id of this port";
-        type uint32;
-      }
-      leaf oper-edge-bridge-port {
-        description
-          "The operational value of the Edge Port parameter";
-        type empty;
-      }
-      leaf designated-bridge-port {
-        description
-          "Port id of the designated port";
-        type uint32;
-      }
-      leaf designated-bridgeid {
-        description
-          "The Bridge Identifier of the bridge that this port considers
-           to be the Designated Bridge for this port's segment";
-        type bridge-id-type;
-      }
-    }
-  }
-
-  grouping rstp-bridge-port-attr {
-    list rstp-bridge-port-table {
-      max-elements "15";
-      description
-        "Table contains port-specific information for rstp config";
-      key "ifname";
-      leaf ifname {
-        description
-          "Interface name of the port";
-        type leafref {
-          path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface/org-openroadm-device:name";
-        }
-      }
-      leaf cost {
-        description
-          "The contribution of this port to the path cost of
-                 paths towards the spanning tree root which include this port also";
-        type uint32 {
-          range "2000..200000";
-        }
-        default "20000";
-      }
-      leaf priority {
-        description
-          "The value of the priority field";
-        type uint32 {
-          range "0..240";
-        }
-      }
-    }
-  }
-
-  grouping rstp-container {
-    container rstp {
-      description
-        "Open ROADM RSTP top level";
-      list rstp-bridge-instance {
-        max-elements "1";
-        description
-          "rstp bridge instance, max instance = 1";
-        key "bridge-name";
-        leaf bridge-name {
-          description
-            "unique name of the bridge";
-          type string {
-            length "1..255";
-          }
-        }
-        container rstp-config {
-          description
-            "Collection of rstp configuration attributes";
-          uses rstp-common-bridge-config;
-          uses rstp-bridge-port-attr;
-        }
-        container rstp-state {
-          description
-            "Collection of rstp operational attributes";
-          config false;
-          container rstp-bridge-attr {
-            description
-              "Collection of operational rstp bridge attributes";
-            uses rstp-root-bridge-attr;
-            leaf bridge-id {
-              description
-                "Bridge identifier of the bridge";
-              type bridge-id-type;
-            }
-            leaf topo-change-count {
-              description
-                "The total number of topology changes";
-              type uint32;
-            }
-            leaf time-since-topo-change {
-              description
-                "Time since last topology changes occured (in seconds)";
-              type uint32;
-            }
-          }
-          container rstp-bridge-port-attr {
-            description
-              "Collection of operational rstp port related attributes";
-            uses rstp-bridge-port-state-attr;
-          }
-        }
-      }
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:protocols" {
-    when "/org-openroadm-device:org-openroadm-device/org-openroadm-device:info/org-openroadm-device:node-type='rdm'";
-    uses rstp-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-rstp@2018-10-19.yang b/ordmodels/device/src/main/yang/org-openroadm-rstp@2018-10-19.yang
deleted file mode 100755 (executable)
index 04334fc..0000000
+++ /dev/null
@@ -1,351 +0,0 @@
-module org-openroadm-rstp {
-  namespace "http://org/openroadm/rstp";
-  prefix org-openroadm-rstp;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2018-10-19;
-  }
-  import org-openroadm-resource-types {
-    prefix org-openroadm-resource-types;
-    revision-date 2018-10-19;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for rstp protocol. 
-     
-     
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef bridge-id-type {
-    type string;
-    description
-      "Unique Bridge Identifier";
-  }
-
-  grouping rstp-common-bridge-config {
-    leaf bridge-priority {
-      type uint32 {
-        range "0..61440";
-      }
-      default "32768";
-      description
-        "Bridge Priority Value";
-    }
-    leaf shutdown {
-      type empty;
-      description
-        "Bridge admin state";
-    }
-    leaf hold-time {
-      type uint32 {
-        range "1..10";
-      }
-      default "2";
-      description
-        "The time interval during which no more than two
-            BPDUs transmitted by this node in seconds - not used in rstp mode (in seconds)";
-    }
-    leaf hello-time {
-      type uint32 {
-        range "1..2";
-      }
-      default "2";
-      description
-        "The time between the transmission of BPDU's by this node on any
-            port, when role is root (in seconds)";
-    }
-    leaf max-age {
-      type uint32 {
-        range "6..40";
-      }
-      default "20";
-      description
-        "The value that all bridges use for MaxAge when this bridge
-            is acting as the root";
-    }
-    leaf forward-delay {
-      type uint32 {
-        range "4..30";
-      }
-      default "15";
-      description
-        "The port on the Switch spends this time in the listening
-            state while moving from the blocking state to the forwarding state (in seconds)";
-    }
-    leaf transmit-hold-count {
-      type uint32 {
-        range "1..10";
-      }
-      default "2";
-      description
-        "Maximum BPDU transmission rate";
-    }
-  }
-
-  grouping rstp-root-bridge-attr {
-    leaf root-bridge-port {
-      type uint32;
-      description
-        "Port id of the root port";
-    }
-    leaf root-path-cost {
-      type uint32;
-      description
-        "The cost of the path to the root as
-               seen from this bridge";
-    }
-    leaf root-bridge-priority {
-      type uint32;
-      description
-        "Root Bridge Priority Value";
-    }
-    leaf root-bridge-id {
-      type bridge-id-type;
-      description
-        "Root Bridge identifier";
-    }
-    leaf root-hold-time {
-      type uint32;
-      description
-        "The time interval during which no more than two
-               BPDUs transmitted by this node in seconds at root node (in seconds)";
-    }
-    leaf root-hello-time {
-      type uint32;
-      description
-        "The time between the transmission of BPDU's used at root node (in seconds)";
-    }
-    leaf root-max-age {
-      type uint32;
-      description
-        "The value that all bridges use for MaxAge used at root node";
-    }
-    leaf root-forward-delay {
-      type uint32;
-      description
-        "The time in seconds spent on the listening state used at root node (in seconds)";
-    }
-  }
-
-  grouping rstp-bridge-port-state-attr {
-    list rstp-bridge-port-table {
-      key "ifname";
-      max-elements "15";
-      description
-        "This table contains port-specific information for rstp state attributes";
-      leaf ifname {
-        type string {
-          length "1..255";
-        }
-        description
-          "Interface name of the port";
-      }
-      leaf bridge-port-state {
-        type enumeration {
-          enum "discarding";
-          enum "blocked";
-          enum "learning";
-          enum "forwarding";
-          enum "unknown";
-        }
-        description
-          "The port's current state";
-      }
-      leaf bridge-port-role {
-        type enumeration {
-          enum "designated";
-          enum "root";
-          enum "alternate";
-          enum "disabled";
-          enum "backup";
-          enum "unknown";
-        }
-        description
-          "The role payed by this port in the bridge";
-      }
-      leaf bridge-port-id {
-        type uint32;
-        description
-          "Unique port id of this port";
-      }
-      leaf oper-edge-bridge-port {
-        type empty;
-        description
-          "The operational value of the Edge Port parameter";
-      }
-      leaf designated-bridge-port {
-        type uint32;
-        description
-          "Port id of the designated port";
-      }
-      leaf designated-bridgeid {
-        type bridge-id-type;
-        description
-          "The Bridge Identifier of the bridge that this port considers 
-           to be the Designated Bridge for this port's segment";
-      }
-    }
-  }
-
-  grouping rstp-bridge-port-attr {
-    list rstp-bridge-port-table {
-      key "ifname";
-      max-elements "15";
-      description
-        "Table contains port-specific information for rstp config";
-      leaf ifname {
-        type leafref {
-          path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface/org-openroadm-device:name";
-        }
-        description
-          "Interface name of the port";
-      }
-      leaf cost {
-        type uint32 {
-          range "2000..200000";
-        }
-        default "20000";
-        description
-          "The contribution of this port to the path cost of
-                 paths towards the spanning tree root which include this port also";
-      }
-      leaf priority {
-        type uint32 {
-          range "0..240";
-        }
-        description
-          "The value of the priority field";
-      }
-    }
-  }
-
-  grouping rstp-container {
-    container rstp {
-      description
-        "Open ROADM RSTP top level";
-      list rstp-bridge-instance {
-        key "bridge-name";
-        max-elements "1";
-        description
-          "rstp bridge instance, max instance = 1";
-        leaf bridge-name {
-          type string {
-            length "1..255";
-          }
-          description
-            "unique name of the bridge";
-        }
-        container rstp-config {
-          description
-            "Collection of rstp configuration attributes";
-          uses rstp-common-bridge-config;
-          uses rstp-bridge-port-attr;
-        }
-        container rstp-state {
-          config false;
-          description
-            "Collection of rstp operational attributes";
-          container rstp-bridge-attr {
-            description
-              "Collection of operational rstp bridge attributes";
-            uses rstp-root-bridge-attr;
-            leaf bridge-id {
-              type bridge-id-type;
-              description
-                "Bridge identifier of the bridge";
-            }
-            leaf topo-change-count {
-              type uint32;
-              description
-                "The total number of topology changes";
-            }
-            leaf time-since-topo-change {
-              type uint32;
-              description
-                "Time since last topology changes occurred (in seconds)";
-            }
-          }
-          container rstp-bridge-port-attr {
-            description
-              "Collection of operational rstp port related attributes";
-            uses rstp-bridge-port-state-attr;
-          }
-        }
-      }
-    }
-  }
-
-  notification rstp-topology-change {
-    description
-      "RSTP: A topologyChange event is sent by a bridge when any of
-       its configured ports transitions from the Learning state
-       to the Forwarding state, or from the Forwarding state to
-       the Blocking state. The event is not sent if a rstp-new-root
-       event is sent for the same transition";
-    uses org-openroadm-resource-types:device-id;
-  }
-  notification rstp-new-root {
-    description
-      "RSTP:The rstp-new-root event indicates that the sending agent has
-       become the new root of the Spanning Tree ";
-    uses org-openroadm-resource-types:device-id;
-  }
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:protocols" {
-    when "/org-openroadm-device:org-openroadm-device/org-openroadm-device:info/org-openroadm-device:node-type='rdm' or /org-openroadm-device:org-openroadm-device/org-openroadm-device:info/org-openroadm-device:node-type='ila'";
-    uses rstp-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-rstp@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-rstp@2020-05-29.yang
deleted file mode 100644 (file)
index aa7a2e6..0000000
+++ /dev/null
@@ -1,394 +0,0 @@
-module org-openroadm-rstp {
-  namespace "http://org/openroadm/rstp";
-  prefix org-openroadm-rstp;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-resource-types {
-    prefix org-openroadm-resource-types;
-    revision-date 2019-11-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for rstp protocol.
-
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  typedef bridge-id-type {
-    type string;
-    description
-      "Unique Bridge Identifier";
-  }
-
-  grouping rstp-common-bridge-config {
-    leaf bridge-priority {
-      type uint32 {
-        range "0..61440";
-      }
-      default "32768";
-      description
-        "Bridge Priority Value";
-    }
-    leaf shutdown {
-      type empty;
-      description
-        "Bridge admin state";
-    }
-    leaf hold-time {
-      type uint32 {
-        range "1..10";
-      }
-      default "2";
-      description
-        "The time interval during which no more than two
-            BPDUs transmitted by this node in seconds - not used in rstp mode (in seconds)";
-    }
-    leaf hello-time {
-      type uint32 {
-        range "1..2";
-      }
-      default "2";
-      description
-        "The time between the transmission of BPDU's by this node on any
-            port, when role is root (in seconds)";
-    }
-    leaf max-age {
-      type uint32 {
-        range "6..40";
-      }
-      default "20";
-      description
-        "The value that all bridges use for MaxAge when this bridge
-            is acting as the root";
-    }
-    leaf forward-delay {
-      type uint32 {
-        range "4..30";
-      }
-      default "15";
-      description
-        "The port on the Switch spends this time in the listening
-            state while moving from the blocking state to the forwarding state (in seconds)";
-    }
-    leaf transmit-hold-count {
-      type uint32 {
-        range "1..10";
-      }
-      default "2";
-      description
-        "Maximum BPDU transmission rate";
-    }
-  }
-
-  grouping rstp-root-bridge-attr {
-    leaf root-bridge-port {
-      type uint32;
-      description
-        "Port id of the root port";
-    }
-    leaf root-path-cost {
-      type uint32;
-      description
-        "The cost of the path to the root as
-               seen from this bridge";
-    }
-    leaf root-bridge-priority {
-      type uint32;
-      description
-        "Root Bridge Priority Value";
-    }
-    leaf root-bridge-id {
-      type bridge-id-type;
-      description
-        "Root Bridge identifier";
-    }
-    leaf root-hold-time {
-      type uint32;
-      description
-        "The time interval during which no more than two
-               BPDUs transmitted by this node in seconds at root node (in seconds)";
-    }
-    leaf root-hello-time {
-      type uint32;
-      description
-        "The time between the transmission of BPDU's used at root node (in seconds)";
-    }
-    leaf root-max-age {
-      type uint32;
-      description
-        "The value that all bridges use for MaxAge used at root node";
-    }
-    leaf root-forward-delay {
-      type uint32;
-      description
-        "The time in seconds spent on the listening state used at root node (in seconds)";
-    }
-  }
-
-  grouping rstp-bridge-port-state-attr {
-    list rstp-bridge-port-table {
-      key "ifname";
-      max-elements 15;
-      description
-        "This table contains port-specific information for rstp state attributes";
-      leaf ifname {
-        type string {
-          length "1..255";
-        }
-        description
-          "Interface name of the port";
-      }
-      leaf bridge-port-state {
-        type enumeration {
-          enum discarding;
-          enum blocked;
-          enum learning;
-          enum forwarding;
-          enum unknown;
-        }
-        description
-          "The port's current state";
-      }
-      leaf bridge-port-role {
-        type enumeration {
-          enum designated;
-          enum root;
-          enum alternate;
-          enum disabled;
-          enum backup;
-          enum unknown;
-        }
-        description
-          "The role payed by this port in the bridge";
-      }
-      leaf bridge-port-id {
-        type uint32;
-        description
-          "Unique port id of this port";
-      }
-      leaf oper-edge-bridge-port {
-        type empty;
-        description
-          "The operational value of the Edge Port parameter";
-      }
-      leaf designated-bridge-port {
-        type uint32;
-        description
-          "Port id of the designated port";
-      }
-      leaf designated-bridgeid {
-        type bridge-id-type;
-        description
-          "The Bridge Identifier of the bridge that this port considers
-           to be the Designated Bridge for this port's segment";
-      }
-    }
-  }
-
-  grouping rstp-bridge-port-attr {
-    list rstp-bridge-port-table {
-      key "ifname";
-      max-elements 15;
-      description
-        "Table contains port-specific information for rstp config";
-      leaf ifname {
-        type leafref {
-          path "/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface/org-openroadm-device:name";
-        }
-        description
-          "Interface name of the port";
-      }
-      leaf cost {
-        type uint32 {
-          range "2000..200000";
-        }
-        default "20000";
-        description
-          "The contribution of this port to the path cost of
-                 paths towards the spanning tree root which include this port also";
-      }
-      leaf priority {
-        type uint32 {
-          range "0..240";
-        }
-        description
-          "The value of the priority field";
-      }
-    }
-  }
-
-  grouping rstp-container {
-    container rstp {
-      description
-        "Open ROADM RSTP top level";
-      leaf max-bridge-instances {
-        type uint32;
-        config false;
-        description
-          "Number of bridge instances supported";
-      }
-      list rstp-bridge-instance {
-        key "bridge-name";
-        description
-          "rstp bridge instance";
-        leaf bridge-name {
-          type string {
-            length "1..255";
-          }
-          description
-            "unique name of the bridge";
-        }
-        container rstp-config {
-          description
-            "Collection of rstp configuration attributes";
-          uses rstp-common-bridge-config;
-          uses rstp-bridge-port-attr;
-        }
-        container rstp-state {
-          config false;
-          description
-            "Collection of rstp operational attributes";
-          container rstp-bridge-attr {
-            description
-              "Collection of operational rstp bridge attributes";
-            uses rstp-root-bridge-attr;
-            leaf bridge-id {
-              type bridge-id-type;
-              description
-                "Bridge identifier of the bridge";
-            }
-            leaf topo-change-count {
-              type uint32;
-              description
-                "The total number of topology changes";
-            }
-            leaf time-since-topo-change {
-              type uint32;
-              description
-                "Time since last topology changes occurred (in seconds)";
-            }
-          }
-          container rstp-bridge-port-attr {
-            description
-              "Collection of operational rstp port related attributes";
-            uses rstp-bridge-port-state-attr;
-          }
-        }
-      }
-    }
-  }
-
-  notification rstp-topology-change {
-    description
-      "RSTP: A topologyChange event is sent by a bridge when any of
-       its configured ports transitions from the Learning state
-       to the Forwarding state, or from the Forwarding state to
-       the Blocking state. The event is not sent if a rstp-new-root
-       event is sent for the same transition";
-    uses org-openroadm-resource-types:device-id;
-  }
-
-  notification rstp-new-root {
-    description
-      "RSTP:The rstp-new-root event indicates that the sending agent has
-       become the new root of the Spanning Tree ";
-    uses org-openroadm-resource-types:device-id;
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device/org-openroadm-device:protocols" {
-    when "/org-openroadm-device:org-openroadm-device/org-openroadm-device:info/org-openroadm-device:node-type='rdm' or /org-openroadm-device:org-openroadm-device/org-openroadm-device:info/org-openroadm-device:node-type='ila'";
-    uses rstp-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-security@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-security@2020-05-29.yang
deleted file mode 100644 (file)
index 53bfec1..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
-module org-openroadm-security {
-  yang-version 1.1;
-  namespace "http://org/openroadm/security";
-  prefix org-openroadm-security;
-
-  import org-openroadm-device {
-    prefix org-openroadm-device;
-    revision-date 2020-05-29;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2020-05-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "This model defines the Yang model for openroadm security.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Initial revision.";
-  }
-
-  typedef certificate-id-type {
-    type string {
-      length "3..250";
-      pattern '(([a-zA-Z]([a-zA-Z0-9_.-]*)([a-zA-Z0-9])))' {
-        error-message
-          "The certificate id must start with a letter and
-           end with a letter or digit. Interior characters are only
-           alphabets, digits, minus, underscore and dot.";
-      }
-    }
-    description
-      "The certificate id must starts with a letter and
-       end with a letter or digit. Interior characters are only
-       alphabets, digits, minus, underscore and dot.";
-  }
-
-  grouping security-container {
-    description
-      "Grouping for standalone security certificates";
-    container security {
-      description
-        "Security related Configurations";
-      list certificate {
-        key "certificate-id";
-        max-elements 10;
-        description
-          "A list of certificates for this system";
-        action install {
-          description
-            "Install certificate.";
-          input {
-            leaf filename {
-              type string;
-              description
-                "Name of the certificate file to be installed.";
-            }
-          }
-          output {
-            uses org-openroadm-common-types:rpc-response-status;
-          }
-        }
-        leaf certificate-id {
-          type certificate-id-type;
-          description
-            "Certificate identifier";
-        }
-        leaf information {
-          type string;
-          config false;
-          description
-            "Information about the certificate
-             (subject line in the certificate).";
-        }
-      }
-      list ca-certificate {
-        key "ca-certificate-id";
-        max-elements 10;
-        description
-          "A list of CA certificates for this system";
-        action install {
-          description
-            "Install certificate.";
-          input {
-            leaf filename {
-              type string;
-              description
-                "Name of the CA certificate file to be installed.";
-            }
-          }
-          output {
-            uses org-openroadm-common-types:rpc-response-status;
-          }
-        }
-        leaf ca-certificate-id {
-          type certificate-id-type;
-          description
-            "CA certificate identifier";
-        }
-        leaf information {
-          type string;
-          config false;
-          description
-            "Information about the CA certificate
-             (subject line in the certificate).";
-        }
-      }
-    }
-  }
-
-  augment "/org-openroadm-device:org-openroadm-device" {
-    description
-      "Augment for security container under device";
-    uses security-container;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-swdl@2016-10-14.yang b/ordmodels/device/src/main/yang/org-openroadm-swdl@2016-10-14.yang
deleted file mode 100644 (file)
index a1edf86..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-module org-openroadm-swdl {
-  namespace "http://org/openroadm/de/swdl";
-  prefix org-openroadm-swdl;
-
-  import ietf-yang-types {
-    prefix yang;
-  }
-
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2016-10-14;
-  }
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "Yang definitions for System Management.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping sw-bank {
-    leaf sw-version {
-      type string;
-      description
-        "Gissue of the SW in this bank";
-    }
-    leaf sw-validation-timer {
-      type string {
-        pattern "(([0-1][0-9]|2[0-3])-([0-5][0-9])-([0-5][0-9]))";
-      }
-      description
-        "value of validation timer in hh-mm-ss";
-    }
-    leaf activation-date-time {
-      type yang:date-and-time;
-      description
-        "activation date and time: The date load was activated";
-    }
-  }
-
-  rpc sw-stage {
-    description
-      "SW stage - copies the SW from repo to staging bank";
-    input {
-      leaf filename {
-        type string {
-          length "10..255";
-        }
-        description
-          "file name which has the load";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  rpc sw-activate {
-    description
-      "Activate new load";
-    input {
-      leaf version {
-        type string;
-        description
-          " software version of the new load which is being activated";
-      }
-      leaf validationTimer {
-        type string;
-        description
-          "validation timer hh-mm-ss";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  rpc cancel-validation-timer {
-    description
-      "Cancel validation timer which user provisioned as part of activate command";
-    input {
-      leaf accept {
-        type boolean;
-        default "true";
-        description
-          " TRUE means  validation timer is cancelled and new load is accepted";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-swdl@2018-10-19.yang b/ordmodels/device/src/main/yang/org-openroadm-swdl@2018-10-19.yang
deleted file mode 100755 (executable)
index 39a649a..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-module org-openroadm-swdl {
-  namespace "http://org/openroadm/de/swdl";
-  prefix org-openroadm-swdl;
-
-  import ietf-yang-types {
-    prefix yang;
-    revision-date 2013-07-15;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2018-10-19;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "Yang definitions for System Management.
-     
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2018-10-19 {
-    description
-      "Version 2.2.1";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping sw-bank {
-    leaf sw-version {
-      type string;
-      description
-        "Gissue of the SW in this bank";
-    }
-    leaf sw-validation-timer {
-      type string {
-        pattern "(([0-1][0-9]|2[0-3])-([0-5][0-9])-([0-5][0-9]))";
-      }
-      description
-        "value of validation timer in hh-mm-ss";
-    }
-    leaf activation-date-time {
-      type yang:date-and-time;
-      description
-        "activation date and time: The date load was activated";
-    }
-  }
-
-  rpc sw-stage {
-    description
-      "SW stage - copies the SW from repo to staging bank";
-    input {
-      leaf filename {
-        type string {
-          length "10..255";
-        }
-        description
-          "file name which has the load";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  rpc sw-activate {
-    description
-      "Activate new load";
-    input {
-      leaf version {
-        type string;
-        description
-          " software version of the new load which is being activated";
-      }
-      leaf validationTimer {
-        type string;
-        description
-          "validation timer hh-mm-ss";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  rpc cancel-validation-timer {
-    description
-      "Cancel validation timer which user provisioned as part of activate command";
-    input {
-      leaf accept {
-        type boolean;
-        default "true";
-        description
-          " TRUE means  validation timer is cancelled and new load is accepted";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-  notification sw-stage-notification {
-    description
-      "notification for sw-stage.";
-    uses org-openroadm-common-types:rpc-response-status;
-  }
-  notification sw-activate-notification {
-    description
-      "notification for sw-activate events.";
-    leaf sw-active-notification-type {
-      type org-openroadm-common-types:activate-notification-type;
-    }
-    uses org-openroadm-common-types:rpc-response-status;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-swdl@2020-05-29.yang b/ordmodels/device/src/main/yang/org-openroadm-swdl@2020-05-29.yang
deleted file mode 100644 (file)
index dfdc8b3..0000000
+++ /dev/null
@@ -1,215 +0,0 @@
-module org-openroadm-swdl {
-  namespace "http://org/openroadm/de/swdl";
-  prefix org-openroadm-swdl;
-
-  import ietf-yang-types {
-    prefix yang;
-    revision-date 2013-07-15;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2020-05-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "Yang definitions for System Management.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping sw-bank {
-    description
-      "software bank group";
-    leaf sw-version {
-      type string;
-      description
-        "Gissue of the SW in this bank";
-    }
-    leaf sw-validation-timer {
-      type string {
-        pattern '(([0-1][0-9]|2[0-3])-([0-5][0-9])-([0-5][0-9]))';
-      }
-      description
-        "value of validation timer in hh-mm-ss";
-    }
-    leaf activation-date-time {
-      type yang:date-and-time;
-      description
-        "activation date and time: The date load was activated";
-    }
-  }
-
-  grouping database-info-group {
-    description
-      "database info group";
-    leaf last-restored-time {
-      type yang:date-and-time;
-      description
-        "last restored time for the database, or the time that the database was created, whichever is later";
-    }
-    leaf rollback-timer {
-      type string {
-        pattern '(([0-1][0-9]|2[0-3])-([0-5][0-9])-([0-5][0-9]))';
-      }
-      description
-        "value of rollback timer in hh-mm-ss";
-    }
-    leaf activation-date-time {
-      type yang:date-and-time;
-      description
-        "activation date and time: The date load was activated";
-    }
-  }
-
-  rpc sw-stage {
-    description
-      "SW stage - copies the SW from repo to staging bank";
-    input {
-      leaf filename {
-        type string {
-          length "10..255";
-        }
-        description
-          "file name which has the load";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-
-  rpc sw-activate {
-    description
-      "Activate new load";
-    input {
-      leaf version {
-        type string;
-        description
-          " software version of the new load which is being activated";
-      }
-      leaf validationTimer {
-        type string;
-        description
-          "validation timer hh-mm-ss";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-
-  rpc cancel-validation-timer {
-    description
-      "Cancel validation timer which user provisioned as part of activate command";
-    input {
-      leaf accept {
-        type boolean;
-        default "true";
-        description
-          " TRUE means  validation timer is cancelled and new load is accepted";
-      }
-    }
-    output {
-      uses org-openroadm-common-types:rpc-response-status;
-    }
-  }
-
-  notification sw-stage-notification {
-    description
-      "notification for sw-stage.";
-    uses org-openroadm-common-types:rpc-response-status;
-  }
-
-  notification sw-activate-notification {
-    description
-      "notification for sw-activate events.";
-    leaf sw-active-notification-type {
-      type org-openroadm-common-types:activate-notification-type;
-    }
-    uses org-openroadm-common-types:rpc-response-status;
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-syslog@2016-10-14.yang b/ordmodels/device/src/main/yang/org-openroadm-syslog@2016-10-14.yang
deleted file mode 100644 (file)
index cdac3e8..0000000
+++ /dev/null
@@ -1,334 +0,0 @@
-module org-openroadm-syslog {
-  namespace "http://org/openroadm/syslog";
-  prefix org-openroadm-syslog;
-
-  import ietf-inet-types {
-    prefix inet;
-  }
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "This module contains a collection of YANG definitions
-     for Syslog configuration.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-  reference "RFC 5424: The Syslog Protocol";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  feature selector-sevop-config {
-    description
-      "This feature represents the ability to select messages
-       using the additional operators equal to, or not equal to
-       when comparing the Syslog message severity.";
-  }
-
-  feature selector-match-config {
-    description
-      "This feature represents the ability to select messages based
-       on a Posix 1003.2 regular expression pattern match.";
-  }
-
-  // copied from draft of ietf-ietf-syslog-types.yang
-  identity syslog-facility {
-    description
-      "The base identity to represent syslog facilities";
-  }
-
-  // copied from draft of ietf-ietf-syslog-types.yang;
-  // extended the enum set to include all and none
-  typedef severity {
-    type enumeration {
-      enum "emergency" {
-        value 0;
-        description
-          "Emergency Level Msg";
-      }
-      enum "alert" {
-        value 1;
-        description
-          "Alert Level Msg";
-      }
-      enum "critical" {
-        value 2;
-        description
-          "Critical Level Msg";
-      }
-      enum "error" {
-        value 3;
-        description
-          "Error Level Msg";
-      }
-      enum "warning" {
-        value 4;
-        description
-          "Warning Level Msg";
-      }
-      enum "notice" {
-        value 5;
-        description
-          "Notification Level Msg";
-      }
-      enum "info" {
-        value 6;
-        description
-          "Informational Level Msg";
-      }
-      enum "debug" {
-        value 7;
-        description
-          "Debugging Level Msg";
-      }
-      enum "all" {
-        value 8;
-        description
-          "This enum describes the case where all severities
-           are selected.";
-      }
-      enum "none" {
-        value 9;
-        description
-          "This enum describes the case where no severities
-           are selected.";
-      }
-    }
-    description
-      "The definitions for Syslog message severity as per RFC 5424.
-       Extended the RFC definition with enums for all and none";
-  }
-
-  grouping syslog-severity {
-    description
-      "This grouping defines the Syslog severity which is used to
-       select log messages.";
-    leaf severity {
-      type severity;
-      mandatory true;
-      description
-        "This leaf specifies the Syslog message severity. When
-         severity is specified, the default severity comparison
-         is all messages of the specified severity and greater are
-         selected. 'all' is a special case which means all severities
-         are selected. 'none' is a special case which means that
-         no selection should occur or disable this filter.";
-    }
-    leaf severity-operator {
-      when
-        "../severity != 'all' and
-                    ../severity != 'none'" {
-        description
-          "The severity-operator is not applicable for severity 'all' or
-           severity 'none'";
-      }
-      if-feature selector-sevop-config;
-      type enumeration {
-        enum "equals-or-higher" {
-          description
-            "This enum specifies all messages of the specified
-             severity and higher are logged according to the
-             given log-action";
-        }
-        enum "equals" {
-          description
-            "This enum specifies all messages that are for
-             the specified severity are logged according to the
-             given log-action";
-        }
-        enum "not-equals" {
-          description
-            "This enum specifies all messages that are not for
-             the specified severity are logged according to the
-             given log-action";
-        }
-      }
-      default "equals-or-higher";
-      description
-        "This leaf describes the option to specify how the
-         severity comparison is performed.";
-    }
-  }
-
-  grouping syslog-selector {
-    description
-      "This grouping defines a Syslog selector which is used to
-       select log messages for the log-action (buffer, file,
-       etc). Choose one of the following:
-         no-log-facility
-         log-facility [<facility> <severity>...]";
-    container log-selector {
-      description
-        "This container describes the log selector parameters
-         for Syslog.";
-      choice selector-facility {
-        mandatory true;
-        description
-          "This choice describes the option to specify no
-           facilities, or a specific facility which can be
-           all for all facilities.";
-        case no-log-facility {
-          description
-            "This case specifies no facilities will match when
-             comparing the Syslog message facility. This is a
-             method that can be used to effectively disable a
-             particular log-action (buffer, file, etc).";
-          leaf no-facilities {
-            type empty;
-            description
-              "This leaf specifies that no facilities are selected
-               for this log-action.";
-          }
-        }
-        case log-facility {
-          description
-            "This case specifies one or more specified facilities
-             will match when comparing the Syslog message facility.";
-          list log-facility {
-            key "facility";
-            description
-              "This list describes a collection of Syslog
-               facilities and severities.";
-            leaf facility {
-              type union {
-                type identityref {
-                  base syslog-facility;
-                }
-                type enumeration {
-                  enum "all" {
-                    description
-                      "This enum describes the case where all
-                       facilities are requested.";
-                  }
-                }
-              }
-              description
-                "The leaf uniquely identifies a Syslog facility.";
-            }
-            uses syslog-severity;
-          }
-        }
-      }
-    }
-  }
-
-  container syslog {
-    description
-      "This container describes the configuration parameters for
-       Syslog.";
-    container log-actions {
-      description
-        "This container describes the log-action parameters
-         for Syslog.";
-      container remote {
-        description
-          "This container describes the configuration parameters for
-           remote logging.";
-        list destination {
-          key "name";
-          description
-            "This list describes a collection of remote logging
-             destinations.";
-          leaf name {
-            type string;
-            description
-              "An arbitrary name for the endpoint to connect to.";
-          }
-          choice transport {
-            mandatory true;
-            description
-              "This choice describes the transport option.";
-            case tcp {
-              container tcp {
-                description
-                  "This container describes the TCP transport
-                   options.";
-                reference "RFC 6587: Transmission of Syslog Messages over TCP";
-                leaf address {
-                  type inet:host;
-                  description
-                    "The leaf uniquely specifies the address of
-                     the remote host. One of the following must
-                     be specified: an ipv4 address, an ipv6
-                     address, or a host name.";
-                }
-                leaf port {
-                  type inet:port-number;
-                  default "514";
-                  description
-                    "This leaf specifies the port number used to
-                     deliver messages to the remote server.";
-                }
-              }
-            }
-            case udp {
-              container udp {
-                description
-                  "This container describes the UDP transport
-                   options.";
-                reference "RFC 5426: Transmission of Syslog Messages over UDP";
-                leaf address {
-                  type inet:host;
-                  description
-                    "The leaf uniquely specifies the address of
-                     the remote host. One of the following must be
-                     specified: an ipv4 address, an ipv6 address,
-                     or a host name.";
-                }
-                leaf port {
-                  type inet:port-number;
-                  default "514";
-                  description
-                    "This leaf specifies the port number used to
-                     deliver messages to the remote server.";
-                }
-              }
-            }
-          }
-          uses syslog-selector;
-        }
-      }
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-syslog@2017-12-15.yang b/ordmodels/device/src/main/yang/org-openroadm-syslog@2017-12-15.yang
deleted file mode 100755 (executable)
index 54af614..0000000
+++ /dev/null
@@ -1,353 +0,0 @@
-module org-openroadm-syslog {
-  namespace "http://org/openroadm/syslog";
-  prefix org-openroadm-syslog;
-
-  import ietf-inet-types {
-    prefix inet;
-    revision-date 2013-07-15;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "This module contains a collection of YANG definitions 
-     for Syslog configuration.                                               
-     
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.
-     
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-     
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-     
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-  reference "RFC 5424: The Syslog Protocol";
-
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  feature selector-sevop-config {
-    description
-      "This feature represents the ability to select messages 
-       using the additional operators equal to, or not equal to 
-       when comparing the Syslog message severity.";
-  }
-
-  feature selector-match-config {
-    description
-      "This feature represents the ability to select messages based
-       on a Posix 1003.2 regular expression pattern match.";
-  }
-
-  identity syslog-facility {
-    description
-      "The base identity to represent syslog facilities";
-  }
-
-  typedef severity {
-    type enumeration {
-      enum "emergency" {
-        value 0;
-        description
-          "Emergency Level Msg";
-      }
-      enum "alert" {
-        value 1;
-        description
-          "Alert Level Msg";
-      }
-      enum "critical" {
-        value 2;
-        description
-          "Critical Level Msg";
-      }
-      enum "error" {
-        value 3;
-        description
-          "Error Level Msg";
-      }
-      enum "warning" {
-        value 4;
-        description
-          "Warning Level Msg";
-      }
-      enum "notice" {
-        value 5;
-        description
-          "Notification Level Msg";
-      }
-      enum "info" {
-        value 6;
-        description
-          "Informational Level Msg";
-      }
-      enum "debug" {
-        value 7;
-        description
-          "Debugging Level Msg";
-      }
-      enum "all" {
-        value 8;
-        description
-          "This enum describes the case where all severities 
-           are selected.";
-      }
-      enum "none" {
-        value 9;
-        description
-          "This enum describes the case where no severities 
-           are selected.";
-      }
-    }
-    description
-      "The definitions for Syslog message severity as per RFC 5424.
-       Extended the RFC definition with enums for all and none";
-  }
-
-  grouping syslog-severity {
-    description
-      "This grouping defines the Syslog severity which is used to 
-       select log messages.";
-    leaf severity {
-      type severity;
-      mandatory true;
-      description
-        "This leaf specifies the Syslog message severity. When 
-         severity is specified, the default severity comparison 
-         is all messages of the specified severity and greater are 
-         selected. 'all' is a special case which means all severities
-         are selected. 'none' is a special case which means that
-         no selection should occur or disable this filter.";
-    }
-    leaf severity-operator {
-      when
-        "../severity != 'all' and
-                    ../severity != 'none'" {
-        description
-          "The severity-operator is not applicable for severity 'all' or 
-           severity 'none'";
-      }
-      if-feature "selector-sevop-config";
-      type enumeration {
-        enum "equals-or-higher" {
-          description
-            "This enum specifies all messages of the specified 
-             severity and higher are logged according to the 
-             given log-action";
-        }
-        enum "equals" {
-          description
-            "This enum specifies all messages that are for 
-             the specified severity are logged according to the 
-             given log-action";
-        }
-        enum "not-equals" {
-          description
-            "This enum specifies all messages that are not for 
-             the specified severity are logged according to the 
-             given log-action";
-        }
-      }
-      default "equals-or-higher";
-      description
-        "This leaf describes the option to specify how the 
-         severity comparison is performed.";
-    }
-  }
-
-  grouping syslog-selector {
-    description
-      "This grouping defines a Syslog selector which is used to 
-       select log messages for the log-action (buffer, file, 
-       etc). Choose one of the following:
-         no-log-facility
-         log-facility [<facility> <severity>...]";
-    container log-selector {
-      description
-        "This container describes the log selector parameters 
-         for Syslog.";
-      choice selector-facility {
-        mandatory true;
-        description
-          "This choice describes the option to specify no 
-           facilities, or a specific facility which can be
-           all for all facilities.";
-        case no-log-facility {
-          description
-            "This case specifies no facilities will match when 
-             comparing the Syslog message facility. This is a 
-             method that can be used to effectively disable a 
-             particular log-action (buffer, file, etc).";
-          leaf no-facilities {
-            type empty;
-            description
-              "This leaf specifies that no facilities are selected 
-               for this log-action.";
-          }
-        }
-        case log-facility {
-          description
-            "This case specifies one or more specified facilities 
-             will match when comparing the Syslog message facility.";
-          list log-facility {
-            key "facility";
-            description
-              "This list describes a collection of Syslog 
-               facilities and severities.";
-            leaf facility {
-              type union {
-                type identityref {
-                  base syslog-facility;
-                }
-                type enumeration {
-                  enum "all" {
-                    description
-                      "This enum describes the case where all 
-                       facilities are requested.";
-                  }
-                }
-              }
-              description
-                "The leaf uniquely identifies a Syslog facility.";
-            }
-            uses syslog-severity;
-          }
-        }
-      }
-    }
-  }
-
-  container syslog {
-    description
-      "This container describes the configuration parameters for 
-       Syslog.";
-    leaf local-syslog-filename {
-      type string;
-      config false;
-      mandatory true;
-      description
-        "The syslog file name. It should be a fully qualified name 
-         so that the user can get the file using transfer RPC.";
-    }
-    container log-actions {
-      description
-        "This container describes the log-action parameters 
-         for Syslog.";
-      container remote {
-        description
-          "This container describes the configuration parameters for 
-           remote logging.";
-        list destination {
-          key "name";
-          description
-            "This list describes a collection of remote logging 
-             destinations.";
-          leaf name {
-            type string;
-            description
-              "An arbitrary name for the endpoint to connect to.";
-          }
-          choice transport {
-            mandatory true;
-            description
-              "This choice describes the transport option.";
-            case tcp {
-              container tcp {
-                description
-                  "This container describes the TCP transport
-                   options.";
-                reference "RFC 6587: Transmission of Syslog Messages over TCP";
-                leaf address {
-                  type inet:host;
-                  description
-                    "The leaf uniquely specifies the address of 
-                     the remote host. One of the following must 
-                     be specified: an ipv4 address, an ipv6 
-                     address, or a host name.";
-                }
-                leaf port {
-                  type inet:port-number;
-                  default "514";
-                  description
-                    "This leaf specifies the port number used to 
-                     deliver messages to the remote server.";
-                }
-              }
-            }
-            case udp {
-              container udp {
-                description
-                  "This container describes the UDP transport
-                   options.";
-                reference "RFC 5426: Transmission of Syslog Messages over UDP";
-                leaf address {
-                  type inet:host;
-                  description
-                    "The leaf uniquely specifies the address of 
-                     the remote host. One of the following must be 
-                     specified: an ipv4 address, an ipv6 address, 
-                     or a host name.";
-                }
-                leaf port {
-                  type inet:port-number;
-                  default "514";
-                  description
-                    "This leaf specifies the port number used to 
-                     deliver messages to the remote server.";
-                }
-              }
-            }
-          }
-          uses syslog-selector;
-        }
-      }
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-syslog@2019-11-29.yang b/ordmodels/device/src/main/yang/org-openroadm-syslog@2019-11-29.yang
deleted file mode 100644 (file)
index 10e4308..0000000
+++ /dev/null
@@ -1,363 +0,0 @@
-module org-openroadm-syslog {
-  namespace "http://org/openroadm/syslog";
-  prefix org-openroadm-syslog;
-
-  import ietf-inet-types {
-    prefix inet;
-    revision-date 2013-07-15;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "This module contains a collection of YANG definitions
-     for Syslog configuration.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.
-
-     Also contains code components extracted from IETF Interfaces.  These code components
-     are copyrighted and licensed as follows:
-
-     Copyright (c) 2016 IETF Trust and the persons identified as the document authors.
-     All rights reserved.
-
-     This document is subject to BCP 78 and the IETF Trust’s Legal Provisions Relating
-     to IETF Documents (http://trustee.ietf.org/license-info) in effect on the date of
-     publication of this document. Please review these documents carefully, as they
-     describe your rights and restrictions with respect to this document. Code Components
-     extracted from this document must include Simplified BSD License text as described in
-     Section 4.e of the Trust Legal Provisions and are provided without warranty as
-     described in the Simplified BSD License.";
-  reference
-    "RFC 5424: The Syslog Protocol";
-
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  feature selector-sevop-config {
-    description
-      "This feature represents the ability to select messages
-       using the additional operators equal to, or not equal to
-       when comparing the Syslog message severity.";
-  }
-
-  feature selector-match-config {
-    description
-      "This feature represents the ability to select messages based
-       on a Posix 1003.2 regular expression pattern match.";
-  }
-
-  identity syslog-facility {
-    description
-      "The base identity to represent syslog facilities";
-  }
-
-  typedef severity {
-    type enumeration {
-      enum emergency {
-        value 0;
-        description
-          "Emergency Level Msg";
-      }
-      enum alert {
-        value 1;
-        description
-          "Alert Level Msg";
-      }
-      enum critical {
-        value 2;
-        description
-          "Critical Level Msg";
-      }
-      enum error {
-        value 3;
-        description
-          "Error Level Msg";
-      }
-      enum warning {
-        value 4;
-        description
-          "Warning Level Msg";
-      }
-      enum notice {
-        value 5;
-        description
-          "Notification Level Msg";
-      }
-      enum info {
-        value 6;
-        description
-          "Informational Level Msg";
-      }
-      enum debug {
-        value 7;
-        description
-          "Debugging Level Msg";
-      }
-      enum all {
-        value 8;
-        description
-          "This enum describes the case where all severities
-           are selected.";
-      }
-      enum none {
-        value 9;
-        description
-          "This enum describes the case where no severities
-           are selected.";
-      }
-    }
-    description
-      "The definitions for Syslog message severity as per RFC 5424.
-       Extended the RFC definition with enums for all and none";
-  }
-
-  grouping syslog-severity {
-    description
-      "This grouping defines the Syslog severity which is used to
-       select log messages.";
-    leaf severity {
-      type severity;
-      mandatory true;
-      description
-        "This leaf specifies the Syslog message severity. When
-         severity is specified, the default severity comparison
-         is all messages of the specified severity and greater are
-         selected. 'all' is a special case which means all severities
-         are selected. 'none' is a special case which means that
-         no selection should occur or disable this filter.";
-    }
-    leaf severity-operator {
-      when "../severity != 'all' and
-                       ../severity != 'none'" {
-          description
-            "The severity-operator is not applicable for severity 'all' or
-             severity 'none'";
-      }
-      if-feature "selector-sevop-config";
-      type enumeration {
-        enum equals-or-higher {
-          description
-            "This enum specifies all messages of the specified
-             severity and higher are logged according to the
-             given log-action";
-        }
-        enum equals {
-          description
-            "This enum specifies all messages that are for
-             the specified severity are logged according to the
-             given log-action";
-        }
-        enum not-equals {
-          description
-            "This enum specifies all messages that are not for
-             the specified severity are logged according to the
-             given log-action";
-        }
-      }
-      default "equals-or-higher";
-      description
-        "This leaf describes the option to specify how the
-         severity comparison is performed.";
-    }
-  }
-
-  grouping syslog-selector {
-    description
-      "This grouping defines a Syslog selector which is used to
-       select log messages for the log-action (buffer, file,
-       etc). Choose one of the following:
-         no-log-facility
-         log-facility [<facility> <severity>...]";
-    container log-selector {
-      description
-        "This container describes the log selector parameters
-         for Syslog.";
-      choice selector-facility {
-        mandatory true;
-        description
-          "This choice describes the option to specify no
-           facilities, or a specific facility which can be
-           all for all facilities.";
-        case no-log-facility {
-          description
-            "This case specifies no facilities will match when
-             comparing the Syslog message facility. This is a
-             method that can be used to effectively disable a
-             particular log-action (buffer, file, etc).";
-          leaf no-facilities {
-            type empty;
-            description
-              "This leaf specifies that no facilities are selected
-               for this log-action.";
-          }
-        }
-        case log-facility {
-          description
-            "This case specifies one or more specified facilities
-             will match when comparing the Syslog message facility.";
-          list log-facility {
-            key "facility";
-            description
-              "This list describes a collection of Syslog
-               facilities and severities.";
-            leaf facility {
-              type union {
-                type identityref {
-                  base syslog-facility;
-                }
-                type enumeration {
-                  enum all {
-                    description
-                      "This enum describes the case where all
-                       facilities are requested.";
-                  }
-                }
-              }
-              description
-                "The leaf uniquely identifies a Syslog facility.";
-            }
-            uses syslog-severity;
-          }
-        }
-      }
-    }
-  }
-
-  container syslog {
-    description
-      "This container describes the configuration parameters for
-       Syslog.";
-    leaf local-syslog-filename {
-      type string;
-      config false;
-      mandatory true;
-      description
-        "The syslog file name. It should be a fully qualified name
-         so that the user can get the file using transfer RPC.";
-    }
-    container log-actions {
-      description
-        "This container describes the log-action parameters
-         for Syslog.";
-      container remote {
-        description
-          "This container describes the configuration parameters for
-           remote logging.";
-        list destination {
-          key "name";
-          description
-            "This list describes a collection of remote logging
-             destinations.";
-          leaf name {
-            type string;
-            description
-              "An arbitrary name for the endpoint to connect to.";
-          }
-          choice transport {
-            mandatory true;
-            description
-              "This choice describes the transport option.";
-            case tcp {
-              container tcp {
-                description
-                  "This container describes the TCP transport
-                   options.";
-                reference
-                  "RFC 6587: Transmission of Syslog Messages over TCP";
-                leaf address {
-                  type inet:host;
-                  description
-                    "The leaf uniquely specifies the address of
-                     the remote host. One of the following must
-                     be specified: an ipv4 address, an ipv6
-                     address, or a host name.";
-                }
-                leaf port {
-                  type inet:port-number;
-                  default "514";
-                  description
-                    "This leaf specifies the port number used to
-                     deliver messages to the remote server.";
-                }
-              }
-            }
-            case udp {
-              container udp {
-                description
-                  "This container describes the UDP transport
-                   options.";
-                reference
-                  "RFC 5426: Transmission of Syslog Messages over UDP";
-                leaf address {
-                  type inet:host;
-                  description
-                    "The leaf uniquely specifies the address of
-                     the remote host. One of the following must be
-                     specified: an ipv4 address, an ipv6 address,
-                     or a host name.";
-                }
-                leaf port {
-                  type inet:port-number;
-                  default "514";
-                  description
-                    "This leaf specifies the port number used to
-                     deliver messages to the remote server.";
-                }
-              }
-            }
-          }
-          uses syslog-selector;
-        }
-      }
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-telemetry-types@2019-11-29.yang b/ordmodels/device/src/main/yang/org-openroadm-telemetry-types@2019-11-29.yang
deleted file mode 100644 (file)
index ba78942..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-module org-openroadm-telemetry-types {
-  yang-version 1;
-  namespace "http://org/openroadm/telemetry-types";
-  prefix org-openroadm-telemetry-types;
-
-  import openconfig-telemetry-types {
-    prefix openconfig-telemetry-types;
-    revision-date 2017-08-24;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "This model extends openconfig-telemetry-types.yang
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Initial revision.";
-  }
-
-  identity ENC_JSON {
-    base openconfig-telemetry-types:DATA_ENCODING_METHOD;
-    description
-      "JSON encoded based on RFC7159";
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-wavelength-map@2016-10-14.yang b/ordmodels/device/src/main/yang/org-openroadm-wavelength-map@2016-10-14.yang
deleted file mode 100644 (file)
index 451cae6..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-module org-openroadm-wavelength-map {
-  namespace "http://org/openroadm/wavelength-map";
-  prefix org-openroadm-wavelength-map;
-
-  organization "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for mapping wavelength-number to center frequency and wavelength value.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     AT&T Intellectual Property.  All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping wavelength-map-g {
-    list wavelengths {
-      key "wavelength-number";
-      leaf wavelength-number {
-        type uint32;
-      }
-      config false;
-      leaf center-frequency {
-        type decimal64 {
-          fraction-digits 3;
-          range "191.350..196.100";
-        }
-        units "THz";
-        description
-          "Frequency of the transmit optical channel
-           Domain range:  191.350THz .. 196.100THz ";
-      }
-      leaf wavelength {
-        type decimal64 {
-          fraction-digits 2;
-          range "1528.77..1566.72";
-        }
-        units "nm";
-        description
-          "Lambda corresponding to transmit frequency
-           Domain range:  1528.72nm .. 1566.72nm ";
-      }
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-wavelength-map@2017-12-15.yang b/ordmodels/device/src/main/yang/org-openroadm-wavelength-map@2017-12-15.yang
deleted file mode 100755 (executable)
index febbb0b..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-module org-openroadm-wavelength-map {
-  namespace "http://org/openroadm/wavelength-map";
-  prefix org-openroadm-wavelength-map;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for mapping wavelength-number to center frequency and wavelength value.
-     
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016, 
-     AT&T Intellectual Property.  All other rights reserved.
-     
-     Redistribution and use in source and binary forms, with or without modification, 
-     are permitted provided that the following conditions are met:
-     
-     * Redistributions of source code must retain the above copyright notice, this 
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice, 
-       this list of conditions and the following disclaimer in the documentation and/or 
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its 
-       contributors may be used to endorse or promote products derived from this software 
-       without specific prior written permission.
-     
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS'' 
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT, 
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA, 
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping wavelength-map-g {
-    list wavelengths {
-      key "wavelength-number";
-      config false;
-      leaf wavelength-number {
-        type uint32;
-      }
-      leaf center-frequency {
-        type decimal64 {
-          fraction-digits 3;
-          range "191.350..196.100";
-        }
-        units "THz";
-        description
-          "Frequency of the transmit optical channel
-           Domain range:  191.350THz .. 196.100THz ";
-      }
-      leaf wavelength {
-        type decimal64 {
-          fraction-digits 2;
-          range "1528.77..1566.72";
-        }
-        units "nm";
-        description
-          "Lambda corresponding to transmit frequency
-           Domain range:  1528.72nm .. 1566.72nm ";
-      }
-    }
-  }
-}
diff --git a/ordmodels/device/src/main/yang/org-openroadm-wavelength-map@2019-11-29.yang b/ordmodels/device/src/main/yang/org-openroadm-wavelength-map@2019-11-29.yang
deleted file mode 100644 (file)
index 80b2414..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-module org-openroadm-wavelength-map {
-  namespace "http://org/openroadm/wavelength-map";
-  prefix org-openroadm-wavelength-map;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for mapping wavelength-number to center frequency and wavelength value.
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping wavelength-map-g {
-    list wavelengths {
-      key "wavelength-number";
-      config false;
-      leaf wavelength-number {
-        type uint32;
-      }
-      leaf center-frequency {
-        type decimal64 {
-          fraction-digits 3;
-          range "191.350..196.100";
-        }
-        units "THz";
-        description
-          "Frequency of the transmit optical channel
-           Domain range:  191.350THz .. 196.100THz ";
-      }
-      leaf wavelength {
-        type decimal64 {
-          fraction-digits 2;
-          range "1528.77..1566.72";
-        }
-        units "nm";
-        description
-          "Lambda corresponding to transmit frequency
-           Domain range:  1528.72nm .. 1566.72nm ";
-      }
-    }
-  }
-}
diff --git a/ordmodels/network/pom.xml b/ordmodels/network/pom.xml
deleted file mode 100644 (file)
index b47a140..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Copyright © 2016 Orange and others. All rights reserved.
-
-This program and the accompanying materials are made available under the
-terms of the Eclipse Public License v1.0 which accompanies this distribution,
-and is available at http://www.eclipse.org/legal/epl-v10.html
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.opendaylight.mdsal</groupId>
-    <artifactId>binding-parent</artifactId>
-    <version>8.0.11</version>
-    <relativePath/>
-  </parent>
-
-  <groupId>org.opendaylight.transportpce.ordmodels</groupId>
-  <artifactId>transportpce-ordmodels-network</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
-  <packaging>bundle</packaging>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.opendaylight.transportpce.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>concepts</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>yang-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
-      <artifactId>rfc6991-ietf-inet-types</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
-      <artifactId>rfc6991-ietf-yang-types</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
-      <artifactId>rfc8345-ietf-network-topology</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
-      <artifactId>rfc8345-ietf-network</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/ordmodels/network/src/main/yang/org-openroadm-amplifier@2021-09-24.yang b/ordmodels/network/src/main/yang/org-openroadm-amplifier@2021-09-24.yang
deleted file mode 100644 (file)
index c60940f..0000000
+++ /dev/null
@@ -1,173 +0,0 @@
-module org-openroadm-amplifier {
-  yang-version 1.1;
-  namespace "http://org/openroadm/amplifier";
-  prefix amp;
-
-  import org-openroadm-common-amplifier-types {
-    prefix org-openroadm-common-amplifier-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-link-types {
-    prefix org-openroadm-common-link-types;
-    revision-date 2019-11-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org.";
-  description
-    "YANG definitions for an amplifier in Network Model
-
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2017,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2021-09-24 {
-       description
-         "Version 10.0";
-  }  
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-17 {
-    description
-      "Version 2.0";
-  }
-
-  grouping amplifier-node-attributes {
-    description
-      "Defines the group of amplifier attributes";
-    leaf amp-type {
-      type org-openroadm-common-amplifier-types:amplifier-types;
-      config true;
-      mandatory true;
-      description
-        "Amplifier type";
-    }
-    leaf amp-gain-range {
-      type org-openroadm-common-amplifier-types:amplifier-gain-range;
-      config true;
-      description
-        "Amplifier gain-range (gain-range 1 to 4 for switched gain amplifiers)
-         gain-range-1 for standard amplifiers";
-    }
-    leaf ingress-span-loss-aging-margin {
-      type org-openroadm-common-link-types:ratio-dB;
-      config true;
-      description
-        "Span-loss margin used to set optical amplifier gain and output-voa
-         extracted from corresponding device OTS interface container, optional
-         since it concerns only line facing amp";
-    }
-    leaf gain {
-      type org-openroadm-common-link-types:ratio-dB;
-      config true;
-      mandatory true;
-      description
-        "Overall Amplifier Signal gain, excluding ASE, including VOA attenuation
-         retrieved from operational value (PM)";
-    }
-    leaf initially-planned-gain {
-      type org-openroadm-common-link-types:ratio-dB;
-      config true;
-      description
-        "Overall Amplifier Signal gain, excluding ASE, including VOA attenuation:
-         value coming from planning tool initial design";
-    }
-    leaf tilt {
-      type org-openroadm-common-link-types:ratio-dB;
-      config true;
-      description
-        "Tilt of smart EDFA retrieved from operational value (PM)";
-    }
-    leaf initially-planned-tilt {
-      type org-openroadm-common-link-types:ratio-dB;
-      config true;
-      description
-        "Tilt of smart EDFA:
-         value coming from planning tool initial design";
-    }
-    leaf out-voa-att {
-      type org-openroadm-common-link-types:ratio-dB;
-      config true;
-      description
-        "output VOA attenuation";
-    }
-    leaf initially-planned-out-voa-att {
-      type org-openroadm-common-link-types:ratio-dB;
-      config true;
-      description
-        "output VOA attenuation: value coming from planning tool initial design.
-         As in R2.0, output VOA can not be configured by controller, this parameter may be used by the controller
-         to check that value set by amplifiers is in the range of calculated value and take relevant decision if not";
-    }
-    leaf eol-max-load-pIn {
-      type org-openroadm-common-link-types:power-dBm;
-      config true;
-      description
-        "End Of Life Total input power at maximum load used for amplifier and VOA setting
-         extracted from corresponding device OTS interface container";
-    }
-    leaf egress-average-channel-power {
-      type org-openroadm-common-link-types:power-dBm;
-      config true;
-      description
-        "Based upon the total max power across the 4.8 THz passband.";
-    }
-    leaf-list supported-operational-modes {
-      type string;
-      config true;
-      description
-        "defines the supported openroadm specifications";
-    }
-  }
-}
diff --git a/ordmodels/network/src/main/yang/org-openroadm-clli-network@2019-11-29.yang b/ordmodels/network/src/main/yang/org-openroadm-clli-network@2019-11-29.yang
deleted file mode 100644 (file)
index be1c3c6..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-module org-openroadm-clli-network {
-  yang-version 1.1;
-  namespace "http://org/openroadm/clli/network";
-  prefix cn;
-
-  import ietf-network {
-    prefix nd;
-    revision-date 2018-02-26;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org.";
-  description
-    "YANG definitions for a CLLI Network
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-
-  augment "/nd:networks/nd:network/nd:network-types" {
-    description
-      "Introduce new network type for the Open ROADM optical network";
-    container clli-network {
-      presence "indicates optical network of Open ROADMs";
-      description
-        "The presence of the container node indicates Open ROADM
-         network";
-    }
-  }
-
-  augment "/nd:networks/nd:network/nd:node" {
-    when '../nd:network-types/cn:clli-network';
-    description
-      "Augment the generic network node with Open ROADM attributes.";
-    leaf clli {
-      type string;
-      description
-        "CLLI identifier";
-    }
-  }
-}
diff --git a/ordmodels/network/src/main/yang/org-openroadm-common-network@2021-12-10.yang b/ordmodels/network/src/main/yang/org-openroadm-common-network@2021-12-10.yang
deleted file mode 100644 (file)
index 9d23a59..0000000
+++ /dev/null
@@ -1,269 +0,0 @@
-module org-openroadm-common-network {
-  yang-version 1.1;
-  namespace "http://org/openroadm/common/network";
-  prefix cnet;
-
-  import ietf-network {
-    prefix nd;
-    revision-date 2018-02-26;
-  }
-  import ietf-network-topology {
-    prefix nwt;
-    revision-date 2018-02-26;
-  }
-  import org-openroadm-network-types {
-    prefix org-openroadm-network-types;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-common-state-types {
-    prefix org-openroadm-common-state-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-equipment-states-types {
-    prefix org-openroadm-equipment-states-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-node-types {
-    prefix org-openroadm-common-node-types;
-    revision-date 2021-05-28;
-  }
-
-  organization
-    "OPEN ROADM MSA";
-  contact
-    "www.OpenROADM.org.";
-  description
-    "Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2021-12-10 {
-    description
-      "Version 10.1";
-  }
-  revision 2021-09-24 {
-    description
-      "Version 10.0";
-  }
-  revision 2021-03-26 {
-    description
-      "Version 9.0";
-  }
-  revision 2020-12-11 {
-    description
-      "Version 8.1";
-  }
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-
-  augment "/nd:networks/nd:network/nd:network-types" {
-    description
-      "Introduce new network type for the Open ROADM common network";
-    container openroadm-common-network {
-      presence "indicates common network of Open ROADMs";
-      description
-        "The presence of the container node indicates Open ROADM common network";
-    }
-  }
-
-  augment "/nd:networks/nd:network" {
-    description
-      "Introduce new network type for the Open ROADM common network";
-    uses org-openroadm-network-types:SRLG-list;
-  }  
-
-  augment "/nd:networks/nd:network/nd:node" {
-    when '../nd:network-types/cnet:openroadm-common-network';
-    description
-      "Augment the generic network node with Open ROADM common attributes.";
-    leaf node-type {
-      type org-openroadm-network-types:openroadm-node-type;
-      description
-        "A component of the network topology. Once the node-type is configured, it should not be modified.";
-    }
-    leaf node-subtype {
-      type org-openroadm-common-node-types:node-subtypes;
-      description
-        "An optional refinement of the node-type. Once the node-subtype is configured, it
-         should not be modified.";
-    }
-    leaf lifecycle-state {
-      type org-openroadm-common-state-types:lifecycle-state;
-      description
-        "Lifecycle State of a node. Whether it is planned, deployed, in maintenance, etc.";
-    }
-    leaf operational-state {
-      type org-openroadm-common-state-types:state;
-    }
-    leaf administrative-state {
-      type org-openroadm-equipment-states-types:admin-states;
-    }
-  }
-
-  augment "/nd:networks/nd:network/nd:node/nwt:termination-point" {
-    when '../../nd:network-types/cnet:openroadm-common-network';
-    leaf tp-type {
-      type org-openroadm-network-types:openroadm-tp-type;
-      description
-        "The type of a termination point in the ROADM topology.";
-    }
-    leaf physical-tp {
-      type boolean;
-      mandatory false;
-      description
-        "Applies to Termination Points that map to physical ports or slots on circuit packs.
-          Set to True when the termination point maps to ports of an existing circuit-pack,
-          False, when mapped to a slot (pluggable optics Holder) --> virtual tp.
-          This attribute is not present for other Termination Points.";
-    }
-    leaf-list associated-connection-map-tp {
-      type leafref {
-        path "/nd:networks/nd:network/nd:node/nwt:termination-point/nwt:tp-id";
-      }
-      description
-        "Used to identify relationships between client and network ports in transponders and
-          uni-directional regens. Provides the list of tps the tp is connected to, as defined
-          in the device connection map.";
-    }
-    leaf eqpt-srg-id {
-      type uint32;
-      description
-        "Shared Risk Group identifier. All ports in a circuit-pack will have same srg-id";
-    }
-    leaf lifecycle-state {
-      type org-openroadm-common-state-types:lifecycle-state;
-      description
-        "Lifecycle State of a termination point. Whether it is planned, deployed, in maintenance, etc.";
-    }
-    leaf operational-state {
-      type org-openroadm-common-state-types:state;
-    }
-    leaf administrative-state {
-      type org-openroadm-equipment-states-types:admin-states;
-    }
-  }
-
-  augment "/nd:networks/nd:network/nwt:link" {
-    when '../nd:network-types/cnet:openroadm-common-network';
-    description
-      "This augmentation defines common link attributes in the Open ROADM common network";
-    leaf link-type {
-      type org-openroadm-network-types:openroadm-link-type;
-    }
-    leaf clfi {
-      type string;
-    }
-    leaf opposite-link {
-      type leafref {
-        path "../../nwt:link/nwt:link-id";
-      }
-      description
-        "optional - pointer to reverse link in case of bidirectional link. Supersedes opposite-link
-         originally defined in OMS-attributes container, to apply to any kind of link in the topology";
-    }
-    leaf link-length {
-      type decimal64 {
-        fraction-digits 2;
-      }
-      units "km";
-    }
-    leaf link-latency {
-      type uint32;
-      units "microseconds";
-      description
-        "Latency of a link (microseconds)";
-    }
-    leaf TE-metric {
-      type uint32;
-      description
-        "defines a Traffic Engineering metric which could be used for any type of link.
-         Supersedes TE-metric originally defined in OMS-attributes grouping";
-    }
-    uses org-openroadm-network-types:link-concatenation;
-    uses org-openroadm-network-types:future-SRLGs {
-      augment "future-SRLGs" {
-        leaf-list SRLG-Id {
-          type leafref {
-            path "/nd:networks/nd:network/SRLG-list/SRLG-Id";
-          }
-        }  
-      }
-    }
-    leaf administrative-group {
-      type uint32;
-      description
-        "according to RFC 3630 definition";
-    }
-    leaf operational-state {
-      type org-openroadm-common-state-types:state;
-    }
-    leaf administrative-state {
-      type org-openroadm-equipment-states-types:admin-states;
-    }
-    leaf lifecycle-state {
-      type org-openroadm-common-state-types:lifecycle-state;
-      description
-        "Lifecycle State of a link. Whether it is planned, deployed, in maintenance, etc.";
-    }
-  }
-}
diff --git a/ordmodels/network/src/main/yang/org-openroadm-degree@2021-12-10.yang b/ordmodels/network/src/main/yang/org-openroadm-degree@2021-12-10.yang
deleted file mode 100644 (file)
index fff0016..0000000
+++ /dev/null
@@ -1,173 +0,0 @@
-module org-openroadm-degree {
-  yang-version 1.1;
-  namespace "http://org/openroadm/degree";
-  prefix dgr;
-
-  import org-openroadm-common-link-types {
-    prefix org-openroadm-common-link-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-network-types {
-    prefix org-openroadm-network-types;
-    revision-date 2021-12-10;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org.";
-  description
-    "YANG definitions for a Degree in Network Model
-
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2021-12-10 {
-    description
-      "Version 10.1";
-  }
-  revision 2021-09-24 {
-       description
-         "Version 10.0";
-  } 
-  revision 2021-03-26 {
-    description
-      "Version 9.0";
-  }
-  revision 2020-12-11 {
-    description
-      "Version 8.1";
-  }
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping degree-used-wavelengths {
-    description
-      "This list is created to accommodate fixed grid (1.2.1) as well as flex grid (2.0 above). In case of fixed grid
-       index number will refer to one of the 96 WL defined in the wavelength map file. In case of flex grid this
-       will hold list of used spectra";
-    list used-wavelengths {
-      key "index";
-      uses org-openroadm-network-types:wavelengths;
-    }
-  }
-
-  grouping degree-node-attributes {
-    description
-      "Defines the group of degree attributes";
-    leaf degree-number {
-      type uint16;
-    }
-    leaf max-wavelengths {
-      type uint32;
-      description
-        "maximum # of wavelengths";
-    }
-    leaf ingress-span-loss-aging-margin {
-      type org-openroadm-common-link-types:ratio-dB;
-      config true;
-      description
-        "Span-loss margin extracted from corresponding device OTS interface container, optional";
-    }
-    leaf eol-max-load-pIn {
-      type org-openroadm-common-link-types:power-dBm;
-      config true;
-      description
-        "End Of Life Total input power at maximum load extracted from corresponding device OTS interface container";
-    }
-    leaf egress-average-channel-power {
-      type org-openroadm-common-link-types:power-dBm;
-      config true;
-      description
-        "Based upon the total max power across the 4.8 THz passband.";
-    }
-    leaf-list supported-operational-modes {
-      type string;
-      config true;
-      description
-        "defines the supported openroadm specifications";
-    }
-  }
-}
diff --git a/ordmodels/network/src/main/yang/org-openroadm-external-pluggable@2021-12-10.yang b/ordmodels/network/src/main/yang/org-openroadm-external-pluggable@2021-12-10.yang
deleted file mode 100644 (file)
index 2b5fe47..0000000
+++ /dev/null
@@ -1,167 +0,0 @@
-module org-openroadm-external-pluggable {
-  yang-version 1.1;
-  namespace "http://org/openroadm/external/pluggable";
-  prefix plg;
-
-  import org-openroadm-common-equipment-types {
-    prefix org-openroadm-common-equipment-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-state-types {
-    prefix org-openroadm-common-state-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-optical-channel-types {
-    prefix org-openroadm-common-optical-channel-types;
-    revision-date 2021-12-10;
-  }
-
-  organization
-    "OPEN ROADM MSA";
-  contact
-    "OpenROADM.org.";
-  description
-    "YANG definitions for External Pluggable
-
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2021-12-10 {
-    description
-      "Version 10.1";
-  }
-  revision 2021-09-24 {
-       description
-         "Version 10.0";
-  }
-  revision 2021-03-26 {
-    description
-      "Version 9.0";
-  }
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping pluggable-node-attributes {
-    leaf pluggable-id {
-      type string;
-      description
-        "Network-wide unique identifier for a pluggable";
-    }
-    leaf customer-code {
-      type string;
-      description
-        "Owner of the pluggable";
-    }
-    container tail {
-      leaf client-equipment {
-        type string;
-      }
-      leaf client-equipment-id {
-        type string;
-      }
-      leaf clfi {
-        type string;
-      }
-    }
-  }
-
-  grouping pluggable-tp-attributes {
-    leaf rate {
-      type identityref {
-        base org-openroadm-common-optical-channel-types:och-rate-identity;
-      }
-      description
-        "rate";
-    }
-    leaf modulation-format {
-      type org-openroadm-common-optical-channel-types:modulation-format;
-    }
-    leaf optic {
-      type org-openroadm-common-equipment-types:optic-types;
-    }
-    leaf state {
-      type org-openroadm-common-state-types:state;
-      description
-        "A xponder can be in one of the following
-               states";
-    }
-  }
-}
diff --git a/ordmodels/network/src/main/yang/org-openroadm-link@2021-12-10.yang b/ordmodels/network/src/main/yang/org-openroadm-link@2021-12-10.yang
deleted file mode 100644 (file)
index 437483a..0000000
+++ /dev/null
@@ -1,279 +0,0 @@
-module org-openroadm-link {
-  yang-version 1.1;
-  namespace "http://org/openroadm/link";
-  prefix link;
-
-  import ietf-network {
-    prefix nd;
-    revision-date 2018-02-26;
-  }
-  import org-openroadm-equipment-states-types {
-    prefix org-openroadm-equipment-states-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-link-types {
-    prefix org-openroadm-common-link-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-node-types {
-    prefix org-openroadm-common-node-types;
-    revision-date 2021-05-28;
-  }
-  import org-openroadm-amplifier {
-    prefix org-openroadm-amplifier;
-    revision-date 2021-09-24;
-  }
-  import org-openroadm-network-types {
-    prefix org-openroadm-network-types;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-common-network {
-    prefix cnet;
-    revision-date 2021-12-10;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org.";
-  description
-    "YANG definitions for an amplifier in Network Model
-
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2017,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2021-12-10 {
-    description
-      "Version 10.1";
-  }
-  revision 2021-09-24 {
-    description
-      "Version 10.0";
-  }
-  revision 2021-05-28 {
-    description
-      "Version 9.1";
-  }
-  revision 2021-03-26 {
-    description
-      "Version 9.0";
-  }
-  revision 2020-12-11 {
-    description
-      "Version 8.1";
-  }
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-17 {
-    description
-      "Version 2.0";
-  }
-
-  grouping span-attributes {
-    leaf auto-spanloss {
-      type boolean;
-      default "true";
-      description
-        "Flag to enable/disable automatic spanloss measurement";
-    }
-    leaf spanloss-base {
-      type org-openroadm-common-link-types:ratio-dB;
-      description
-        "Baseline ROADM span loss measured and accepted during
-         degree turn-up. May be re-set to current value after a fiber repair or change.";
-    }
-    leaf spanloss-current {
-      type org-openroadm-common-link-types:ratio-dB;
-      description
-        "Current ROADM span loss measured and accepted during
-         degree turn-up. Updated periodically if auto-spanloss is enabled.";
-    }
-    leaf spanloss-last-measured {
-      type org-openroadm-common-link-types:ratio-dB;
-      description
-        "Last measured ROADM span loss, may or may not have been accepted and pushed to the NE.";
-    }
-    leaf engineered-spanloss {
-      type org-openroadm-common-link-types:ratio-dB;
-      description
-        "ROADM span loss provided by an external system";
-    }
-    uses org-openroadm-network-types:link-concatenation {
-      augment link-concatenation {
-        leaf fiber-type {
-          type enumeration {
-            enum smf {
-              value 0;
-              description
-                "Single Mode Fiber";
-            }
-            enum eleaf {
-              value 1;
-              description
-                "ELEAF";
-            }
-            enum oleaf {
-              value 2;
-              description
-                "OLEAF";
-            }
-            enum dsf {
-              value 3;
-              description
-                "DSF";
-            }
-            enum truewave {
-              value 4;
-              description
-                "TRUEWAVE Reduced Slope";
-            }
-            enum truewavec {
-              value 5;
-              description
-                "TRUEWAVE Classic";
-            }
-            enum nz-dsf {
-              value 6;
-              description
-                "NZ-DSF";
-            }
-            enum ull {
-              value 7;
-              description
-                "Ultra Low Loss (ULL)";
-            }
-          }
-        }
-        leaf pmd {
-          type org-openroadm-common-link-types:fiber-pmd;
-          description
-            "Total PMD";
-        }
-        leaf subject-to-high-SOP-changes {
-         type boolean;
-         description
-                 "identifies fibers that may experience high polarization rotation rates
-                  and which might be inadequate for some modulation format";
-        }
-      }
-    }
-    uses org-openroadm-network-types:future-SRLGs {
-      augment "future-SRLGs" {
-        leaf-list SRLG-Id {
-          type leafref {
-            path "/nd:networks/nd:network/cnet:SRLG-list/cnet:SRLG-Id";
-          }
-        }  
-      }
-    }
-  } 
-  grouping amplified-link-attributes {
-    list amplified-link {
-      key "section-elt-number";
-      description
-        "defines the spans and the amplifier blocks of the amplified lines";
-      leaf section-elt-number {
-        type uint16;
-        description
-          "Id of the section element (whether it's a Span or an Amp)";
-      }
-      container section-element {
-        choice section-element {
-          case ila {
-            container ila {
-              uses org-openroadm-amplifier:amplifier-node-attributes;
-              uses org-openroadm-network-types:type-variety-grp;
-              leaf node-id {
-                type org-openroadm-common-node-types:node-id-type;
-                mandatory true;
-                description
-                  "Node id corresponding to the amplifier ";
-              }
-              leaf administrative-state {
-                type org-openroadm-equipment-states-types:admin-states;
-              }
-            }
-          }
-          case span {
-            container span {
-              uses link:span-attributes;
-              leaf administrative-state {
-                type org-openroadm-equipment-states-types:admin-states;
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-}
diff --git a/ordmodels/network/src/main/yang/org-openroadm-network-topology-types@2020-12-11.yang b/ordmodels/network/src/main/yang/org-openroadm-network-topology-types@2020-12-11.yang
deleted file mode 100644 (file)
index 8f17cac..0000000
+++ /dev/null
@@ -1,187 +0,0 @@
-module org-openroadm-network-topology-types {
-  yang-version 1.1;
-  namespace "http://org/openroadm/network/topology/types";
-  prefix org-openroadm-network-topology-types;
-
-  import ietf-network {
-    prefix nd;
-    revision-date 2018-02-26;
-  }
-  import ietf-network-topology {
-    prefix nwt;
-    revision-date 2018-02-26;
-  }
-  import org-openroadm-switching-pool-types {
-    prefix org-openroadm-switching-pool-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-port-types {
-    prefix org-openroadm-port-types;
-    revision-date 2020-12-11;
-  }
-
-  organization
-    "OPEN ROADM MSA";
-  contact
-    "www.OpenROADM.org.";
-  description
-    "Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2020-12-11 {
-    description
-      "Version 8.1";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-
-  grouping xpdr-tp-bandwidth-sharing {
-    list tp-bandwidth-sharing {
-      key "tp-sharing-id";
-      leaf tp-sharing-id {
-        type uint16;
-      }
-      leaf-list tp-list {
-        type nwt:tp-id;
-      }
-      leaf shared-bandwidth {
-        type uint16;
-        units "Gbps";
-      }
-      list possible-tp-config {
-        key "config-id";
-        leaf config-id {
-          type uint16;
-        }
-        list tp-if-type-config {
-          key "tp-name";
-          leaf tp-name {
-            type leafref {
-              path "/nd:networks/nd:network/nd:node/nwt:termination-point/nwt:tp-id";
-            }
-            description
-              "termination-point identifier";
-          }
-          leaf-list tp-if-type {
-            type identityref {
-              base org-openroadm-port-types:supported-if-capability;
-            }
-          }
-          leaf otsi-rate {
-            type uint16;
-            units "Gbps";
-            description
-              "Optical Tributary Signal (OTSi) rate in Gbps";
-          }
-        }
-      }
-    }
-  }
-
-  grouping xpdr-odu-switching-pools {
-    list odu-switching-pools {
-      key "switching-pool-number";
-      leaf switching-pool-number {
-        type uint16;
-        description
-          "Unique identifier for this odu-switching-pool";
-      }
-      leaf switching-pool-type {
-        type org-openroadm-switching-pool-types:switching-pool-types;
-      }
-      list non-blocking-list {
-        key "nbl-number";
-        description
-          "List of ports in a non-blocking switch element";
-        leaf nbl-number {
-          type uint16;
-          description
-            "Identifier for this non-blocking-list. Unique within odu-switching-pool";
-        }
-        leaf interconnect-bandwidth-unit {
-          type uint32;
-          description
-            "Switch fabric interconnect bandwidth unit rate in bits per second.
-             Represents granularity of switch fabric";
-        }
-        leaf capable-interconnect-bandwidth {
-          type uint32;
-          description
-            "Total interconnect bandwidth for a non-blocking element expressed as
-             number of inter-connect-bandwidth units";
-        }
-        leaf available-interconnect-bandwidth {
-          type uint32;
-          description
-            "Total interconnect bandwidth available for a non-blocking element can use as
-             number of inter-connect-bandwidth units";
-        }
-        leaf-list tp-list {
-          type nwt:tp-id;
-          description
-            "Termination point. Unique within device";
-        }
-      }
-    }
-  }
-
-  grouping xpdr-otn-tail-attributes {
-    leaf tp-id {
-      type nwt:tp-id;
-    }
-    leaf network-ref {
-      type leafref {
-        path "/nd:networks/nd:network/nd:network-id";
-      }
-      description
-        "Used to reference a network, for example an underlay
-         network.";
-    }
-    leaf node-ref {
-      type leafref {
-        path "/nd:networks/nd:network[nd:network-id=current()/../network-ref]/nd:node/nd:node-id";
-      }
-      description
-        "Used to reference a node.
-         Nodes are identified relative to the network they are
-         contained in.";
-    }
-  }
-}
diff --git a/ordmodels/network/src/main/yang/org-openroadm-network-topology@2021-12-10.yang b/ordmodels/network/src/main/yang/org-openroadm-network-topology@2021-12-10.yang
deleted file mode 100644 (file)
index 70f533c..0000000
+++ /dev/null
@@ -1,354 +0,0 @@
-module org-openroadm-network-topology {
-  yang-version 1.1;
-  namespace "http://org/openroadm/network/topology";
-  prefix topo;
-
-  import ietf-network {
-    prefix nd;
-    revision-date 2018-02-26;
-  }
-  import ietf-network-topology {
-    prefix nwt;
-    revision-date 2018-02-26;
-  }
-  import org-openroadm-network-types {
-    prefix org-openroadm-network-types;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-srg {
-    prefix srg;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-degree {
-    prefix dgr;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-xponder {
-    prefix xpdr;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-external-pluggable {
-    prefix plg;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-link {
-    prefix link;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-common-network {
-    prefix cnet;
-    revision-date 2021-12-10;
-  }
-
-  organization
-    "OPEN ROADM MSA";
-  contact
-    "OpenROADM.org.";
-  description
-    "YANG definitions for network view of a ROADM
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2021-12-10 {
-    description
-      "Version 10.1";
-  }
-  revision 2021-09-24 {
-    description
-      "Version 10.0";
-  }
-  revision 2021-05-28 {
-    description
-      "Version 9.1";
-  }
-  revision 2021-03-26 {
-    description
-      "Version 9.0";
-  }
-  revision 2020-12-11 {
-    description
-      "Version 8.1";
-  }
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-
-  deviation "/nd:networks/nd:network/nd:node/cnet:node-type" {
-    deviate add {
-      must "(not /nd:networks/nd:network/nd:network-types/cnet:openroadm-common-network/openroadm-topology) or
-            (/nd:network/nd:network-types/cnet:openroadm-common-network/openroadm-topology and
-            (../cnet:node-type = 'DEGREE' or ../cnet:node-type = 'SRG' or ../cnet:node-type = 'TPDR' or ../cnet:node-type = 'SWITCH' or
-             ../cnet:node-type = 'REGEN' or ../cnet:node-type = 'REGEN-UNI' or ../cnet:node-type = 'EXT-PLUGGABLE' or
-             ../cnet:node-type = 'MUXPDR'))" {
-          error-message "Invalid node type for openroadm-topology";
-          description
-            "The valid node types in the ROADM topology are 'SRG', 'DEGREE',
-             'TPDR', 'SWITCH', 'REGEN', 'REGEN-UNI', 'EXT-PLUGGABLE' and 'MUXPDR'";
-      }
-    }
-  }
-
-  deviation "/nd:networks/nd:network/nd:node/nwt:termination-point/cnet:tp-type" {
-    description
-      "Defines which TP types can be instantiated on which Node types";
-    deviate add {
-      must "/nd:network/nd:node/cnet:node-type != 'DEGREE' or (../../cnet:node-type = 'DEGREE'  and
-            (../cnet:tp-type = 'DEGREE-TX-TTP' or ../cnet:tp-type = 'DEGREE-RX-TTP' or  ../cnet:tp-type = 'DEGREE-TXRX-TTP' or
-            ../cnet:tp-type = 'DEGREE-TX-CTP' or ../cnet:tp-type = 'DEGREE-RX-CTP' or ../cnet:tp-type = 'DEGREE-TXRX-CTP'))" {
-          error-message "Invalid TP for node type 'DEGREE'";
-      }
-      must "/nd:network/nd:node/cnet:node-type != 'SRG' or (../../cnet:node-type = 'SRG' and
-            (../cnet:tp-type = 'SRG-TX-CP' or ../cnet:tp-type = 'SRG-RX-CP' or ../cnet:tp-type = 'SRG-TXRX-CP' or
-            ../cnet:tp-type = 'SRG-RX-PP' or ../cnet:tp-type = 'SRG-TX-PP' or ../cnet:tp-type = 'SRG-TXRX-PP'))" {
-          error-message "Invalid TP for node type 'SRG'";
-      }
-      must " (/nd:network/nd:node/cnet:node-type != 'TPDR' and ../../cnet:node-type != 'MUXPDR' and ../../cnet:node-type != 'REGEN' and
-            ../../cnet:node-type != 'REGEN-UNI' and ../../cnet:node-type != 'SWITCH')
-            or ((../../cnet:node-type = 'TPDR' or ../../cnet:node-type = 'MUXPDR' or ../../cnet:node-type = 'REGEN' or
-            ../../cnet:node-type = 'REGEN-UNI' or ../../cnet:node-type = 'SWITCH') and
-            (../cnet:tp-type = 'XPONDER-NETWORK' or ../cnet:tp-type = 'XPONDER-CLIENT' or ../cnet:tp-type = 'XPONDER-PORT'))" {
-          error-message "Invalid TP for node type 'XPONDER'";
-      }
-      must "/nd:network/nd:node/cnet:node-type != 'EXT-PLUGGABLE' or (../../cnet:node-type = 'EXT-PLUGGABLE' and ../cnet:tp-type = 'EXT-PLUGGABLE-TP')" {
-        error-message "Invalid TP for node type 'EXT-PLUGGABLE'";
-      }
-    }
-  }
-
-  deviation "/nd:networks/nd:network/nwt:link/cnet:link-type" {
-    deviate add {
-      must "(not /nd:network/nd:network-types/cnet:openroadm-common-network/openroadm-topology) or
-            (/nd:network/nd:network-types/cnet:openroadm-common-network/openroadm-topology and
-            (../cnet:link-type = 'ROADM-TO-ROADM' or ../cnet:link-type = 'ADD-LINK' or ../cnet:link-type = 'DROP-LINK' or
-             ../cnet:link-type = 'EXPRESS-LINK' or ../cnet:link-type = 'XPONDER-INPUT' or ../cnet:link-type = 'XPONDER-OUTPUT'))" {
-          error-message "Invalid link type for openroadm-topology";
-          description
-            "The valid link types in the ROADM topology are 'ROADM-TO-ROADM', 'ADD-LINK',
-             'DROP-LINK', 'EXPRESS-LINK', 'XPONDER-INPUT', 'XPONDER-OUTPUT'";
-      }
-    }
-  }
-
-  augment "/nd:networks/nd:network/nd:network-types/cnet:openroadm-common-network" {
-    description
-      "Introduce new network type for the Open ROADM optical
-       `     network topology";
-    container openroadm-topology {
-      presence "indicates optical network topology for Open ROADMs";
-    }
-  }
-
-  augment "/nd:networks/nd:network/nd:node" {
-    when '../nd:network-types/cnet:openroadm-common-network/topo:openroadm-topology';
-    description
-      "This augmentations adds the ROADM Node type to the generic node
-       definition and defines node-specific attributes for each node type
-       in the ROADM Topology.";
-    container srg-attributes {
-      when "../cnet:node-type = 'SRG'";
-      description
-        "Topology-related attributes for SRG nodes";
-      uses srg:srg-node-attributes;
-      uses org-openroadm-network-types:available-freq-map;
-      uses org-openroadm-network-types:type-variety-grp;
-    }
-    container degree-attributes {
-      when "../cnet:node-type = 'DEGREE'";
-      description
-        "Topology-related attributes for degree nodes";
-      uses dgr:degree-node-attributes;
-      uses org-openroadm-network-types:available-freq-map;
-      uses org-openroadm-network-types:type-variety-grp;
-    }
-    container xpdr-attributes {
-      when "../cnet:node-type = 'TPDR' or ../cnet:node-type = 'MUXPDR' or ../cnet:node-type = 'REGEN' or
-            ../cnet:node-type = 'REGEN-UNI' or ../cnet:node-type = 'SWITCH'";
-      description
-        "Topology-related attributes for Xponder nodes";
-      uses xpdr:xpdr-topo-node-attributes;
-    }
-  }
-
-  augment "/nd:networks/nd:network/nd:node/nwt:termination-point" {
-    when '../../nd:network-types/cnet:openroadm-common-network/topo:openroadm-topology';
-    description
-      "Defines the type of a termination point in the ROADM topology and
-       TP-specific attributes for each termination point type.";
-    container tx-ttp-attributes {
-      when "../cnet:tp-type = 'DEGREE-TX-TTP' or ../cnet:tp-type = 'DEGREE-TXRX-TTP'";
-      description
-        "There must be only one TP of type DEGREE-TX-TTP in any given
-         degree node";
-      uses dgr:degree-used-wavelengths;
-      uses org-openroadm-network-types:available-freq-map;
-    }
-    container rx-ttp-attributes {
-      when "../cnet:tp-type = 'DEGREE-RX-TTP'";
-      description
-        "There must be only one TP of type DEGREE-RX-TTP in any given
-         degree node";
-      uses dgr:degree-used-wavelengths;
-      uses org-openroadm-network-types:available-freq-map;
-    }
-    container ctp-attributes {
-      when "../cnet:tp-type = 'DEGREE-TX-CTP' or ../cnet:tp-type = 'DEGREE-RX-CTP' or ../cnet:tp-type = 'DEGREE-TXRX-CTP'";
-      uses org-openroadm-network-types:available-freq-map;
-    }
-    container cp-attributes {
-      when "../cnet:tp-type = 'SRG-TX-CP' or ../cnet:tp-type = 'SRG-RX-CP' or ../cnet:tp-type = 'SRG-TXRX-CP'";
-      description
-        "This list is created to accommodate fixed grid (1.2.1) as well as flex grid (2.0 above). In case of fixed grid
-         index number will refer to one of the 96 WL defined in the wavelength map file. In case of flex grid this
-         will hold list of used spectra";
-      uses org-openroadm-network-types:available-freq-map;
-    }
-    container pp-attributes {
-      when "../cnet:tp-type = 'SRG-TXRX-PP' or ../cnet:tp-type = 'SRG-TX-PP' or ../cnet:tp-type = 'SRG-RX-PP' ";
-      description
-        "This list is created to accommodate fixed grid (1.2.1) as well as flex grid (2.0 above). In case of fixed grid
-         index number will refer to one of the 96 WL defined in the wavelength map file. In case of flex grid this
-         will hold list of used spectra";
-      list used-wavelength {
-        key "index";
-        uses org-openroadm-network-types:wavelengths;
-      }
-      uses org-openroadm-network-types:available-freq-map;
-    }
-    container xpdr-client-attributes {
-      when "../../cnet:node-type = 'TPDR' and ../cnet:tp-type = 'XPONDER-CLIENT'";
-      description
-        "Topology layer will allow client TPs only for Transponder nodes";
-      uses xpdr:xpdr-connection-attributes;
-      uses xpdr:xpdr-port-connection-attributes;
-      uses xpdr:supported-client-services;
-    }
-    container xpdr-network-attributes {
-      when "../cnet:tp-type = 'XPONDER-NETWORK'";
-      uses xpdr:xpdr-connection-attributes;
-      uses xpdr:xpdr-port-connection-attributes;
-      uses xpdr:xpdr-mode-attributes;
-      uses org-openroadm-network-types:type-variety-grp;
-    }
-    container xpdr-port-attributes {
-      when "../cnet:tp-type = 'XPONDER-PORT'";
-      uses xpdr:xpdr-connection-attributes;
-      uses xpdr:xpdr-port-connection-attributes;
-      uses xpdr:xpdr-mode-attributes;
-      uses org-openroadm-network-types:type-variety-grp;
-    }
-    container ext-pluggable-attributes {
-      when "../cnet:tp-type = 'EXT-PLUGGABLE-TP'";
-      uses plg:pluggable-tp-attributes;
-      uses xpdr:xpdr-port-connection-attributes;
-      uses xpdr:xpdr-mode-attributes;
-      uses org-openroadm-network-types:type-variety-grp;
-    }
-  }
-
-  augment "/nd:networks/nd:network/nwt:link" {
-    when '../nd:network-types/cnet:openroadm-common-network/topo:openroadm-topology';
-    description
-      "This augmentation defines ROADM link types in the ROADM topology";
-    leaf amplified {
-      when "../cnet:link-type = 'ROADM-TO-ROADM'";
-      type boolean;
-      description
-        "defines whether an ROADM-TO-ROADM Link includes line amplifiers or not";
-    }
-    container OMS-attributes {
-      when "../cnet:link-type = 'ROADM-TO-ROADM'";
-      description
-        "";
-      container span {
-        when "../../amplified = 'false'";
-        description
-          "";
-        uses link:span-attributes;
-      }
-      container amplified-link {
-        when "../../amplified = 'true'";
-        description
-          "when amplified is set to true, rather than a simple OMS section
-           we have an amplified link";
-        uses link:amplified-link-attributes;
-      }
-    }
-  }
-}
diff --git a/ordmodels/network/src/main/yang/org-openroadm-network-types@2021-12-10.yang b/ordmodels/network/src/main/yang/org-openroadm-network-types@2021-12-10.yang
deleted file mode 100644 (file)
index 43c5298..0000000
+++ /dev/null
@@ -1,417 +0,0 @@
-module org-openroadm-network-types {
-  yang-version 1.1;
-  namespace "http://org/openroadm/network/types";
-  prefix nt;
-
-  import ietf-yang-types {
-    prefix yang;
-    revision-date 2013-07-15;
-  }
-  import org-openroadm-common-optical-channel-types {
-    prefix org-openroadm-common-optical-channel-types;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-port-types {
-    prefix org-openroadm-port-types;
-    revision-date 2020-12-11;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2021-12-10;
-  }
-
-  organization
-    "OPEN ROADM MSA";
-  contact
-    "www.OpenROADM.org.";
-  description
-    "Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2021-12-10 {
-    description
-      "Version 10.1";
-  }
-  revision 2021-09-24 {
-    description
-      "Version 10.0";
-  }
-  revision 2021-03-26 {
-    description
-      "Version 9.0";
-  }
-  revision 2020-12-11 {
-    description
-      "Version 8.1";
-  }
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-
-  typedef openroadm-node-type {
-    type enumeration {
-      enum ROADM {
-        value 1;
-      }
-      enum DEGREE {
-        value 11;
-      }
-      enum SRG {
-        value 12;
-      }
-      enum XPONDER {
-        value 3;
-      }
-      enum EXT-PLUGGABLE {
-        value 4;
-      }
-      enum TPDR {
-        value 13;
-      }
-      enum MUXPDR {
-        value 14;
-      }
-      enum REGEN {
-        value 15;
-      }
-      enum REGEN-UNI {
-        value 16;
-      }
-      enum SWITCH {
-        value 17;
-      }
-    }
-  }
-
-  typedef openroadm-tp-type {
-    type enumeration {
-      enum DEGREE-TX-TTP {
-        value 1;
-      }
-      enum DEGREE-RX-TTP {
-        value 2;
-      }
-      enum DEGREE-TX-CTP {
-        value 3;
-      }
-      enum DEGREE-RX-CTP {
-        value 4;
-      }
-      enum SRG-TX-CP {
-        value 5;
-      }
-      enum SRG-RX-CP {
-        value 6;
-      }
-      enum SRG-TXRX-PP {
-        value 7;
-      }
-      enum SRG-RX-PP {
-        value 8;
-      }
-      enum SRG-TX-PP {
-        value 9;
-      }
-      enum XPONDER-NETWORK {
-        value 10;
-      }
-      enum XPONDER-CLIENT {
-        value 11;
-      }
-      enum EXT-PLUGGABLE-TP {
-        value 12;
-      }
-      enum DEGREE-TXRX-TTP {
-        value 13;
-      }
-      enum SRG-TXRX-CP {
-        value 14;
-      }
-      enum XPONDER-PORT {
-        value 15;
-      }
-      enum DEGREE-TXRX-CTP {
-        value 16;
-      }
-    }
-  }
-
-  typedef openroadm-link-type {
-    type enumeration {
-      enum EXPRESS-LINK {
-        value 1;
-      }
-      enum ADD-LINK {
-        value 2;
-      }
-      enum DROP-LINK {
-        value 3;
-      }
-      enum ROADM-TO-ROADM {
-        value 4;
-      }
-      enum XPONDER-INPUT {
-        value 5;
-      }
-      enum XPONDER-OUTPUT {
-        value 6;
-      }
-      enum OTN-LINK {
-        value 7;
-      }
-    }
-  }
-
-  typedef openroadm-node-connection-status {
-    type enumeration {
-      enum CONNECTED {
-        value 1;
-      }
-      enum CONNECTING {
-        value 2;
-      }
-      enum UNABLE-TO-CONNECT {
-        value 3;
-      }
-    }
-  }
-
-  grouping available-freq-map {
-    list avail-freq-maps {
-      key "map-name";
-      description
-        "Available spectrum information";
-      leaf map-name {
-        type string;
-        description
-          "Identifier of the map. For C-band, recommend map-name = 'cband'";
-      }
-      leaf start-edge-freq {
-        type org-openroadm-common-optical-channel-types:frequency-THz;
-        description
-          "Starting edge frequency (min frequency) for the frequency map. For C-band, the recommendation is start-edge-freq = 191.325 THz";
-      }
-      leaf freq-map-granularity {
-        type org-openroadm-common-optical-channel-types:frequency-GHz;
-        description
-          "frequency granularity of each bit in the bitmap.  For C-band, the recommendation is freq-map-granularity = 6.25 GHz";
-      }
-      leaf effective-bits {
-        type uint16;
-        description
-          "Number of effective bits in the frequency bitmap.  Note the freq-map bitmap will be padded with 0 for byte alignment.";
-      }
-      leaf freq-map {
-        type binary;
-        description
-          "Frequency bitmap.  Setting the value of the binary bit to 1 indicates that the corresponding spectrum is available and
-           setting to 0 indicates the corresponding spectrum is unavailable (used or unsupported).";
-      }
-    }
-  }
-
-  grouping wavelengths {
-    leaf index {
-      type int32;
-      description
-        "Index should be related to the frequency based on the formula 193.1 + index * .00625 THz";
-    }
-    uses flex-wave;
-  }
-
-  grouping flex-wave {
-    leaf frequency {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      config true;
-      description
-        "Center Frequency in THz";
-    }
-    leaf width {
-      type org-openroadm-common-optical-channel-types:frequency-GHz;
-      config true;
-      description
-        "Frequency width in GHz.";
-    }
-  }
-
-  grouping type-variety-grp {
-    leaf type-variety {
-      type string;
-      config true;
-      description
-        "Equipment type variety defined by the Open ROADM MSA or by the vendor for bookending applications.
-         This field is used by external path computation tools as a reference in a catalog to get additional
-         information about the equipment’s optical capabilities.";
-    }
-  }
-
-  grouping xpdr-tp-supported-interfaces {
-    list supported-interface-capability {
-      key "if-cap-type";
-      description
-        "Supported interface capability on the port.";
-      leaf if-cap-type {
-        type identityref {
-          base org-openroadm-port-types:supported-if-capability;
-        }
-        description
-          "Interface type/hierarchy/rate supported on this port";
-      }
-    }
-  }
-
-  grouping node-due-date-list {
-    list due-dates {
-      key "id";
-      leaf id {
-        type uint16;
-      }
-      leaf start-date {
-        type yang:date-and-time;
-        description
-          "date and time node will begin maintenance status or date when node is planned";
-      }
-      leaf end-date {
-        type yang:date-and-time;
-        description
-          "date and time node will end maintenance or date when node is deployed";
-      }
-    }
-  }
-
-  grouping link-concatenation {
-    list link-concatenation {
-      key "SRLG-Id";
-      leaf SRLG-Id {
-        type uint32;
-        description
-          "unique identifier for SRLG";
-      }
-      leaf SRLG-length {
-        type decimal64 {
-          fraction-digits 2;
-        }
-        description
-          "Fiber length in desired distance unit of measure";
-      }
-    }
-  }
-
-  grouping SRLG-list{
-    list SRLG-list {
-      key "SRLG-Id";
-      description 
-        "List of all SRLG-Ids. Controller will be responsible to maintain completeness of SRLG-Ids by doing union of 
-         internal and external SRLG information.";
-      leaf SRLG-Id {
-        type uint32;
-        description
-          "unique identifier for SRLG";
-      }
-      leaf SRLG-name {
-        type string;
-        description
-          "Name of the SRLG";
-      }
-      leaf SRLG-type {
-        type org-openroadm-common-types:SRLG-type;
-        description
-          "Type of SRLG, Site SRLG, Node SRLG, Fiber SRLG or Link SRLG";
-      }
-      leaf SRLG-length {
-        type decimal64 {
-          fraction-digits 2;
-        }
-        description
-          "Fiber length in desired distance unit of measure";
-      }
-    }
-  }
-
-  grouping future-SRLGs {
-    list future-SRLGs {
-      key "start-date";
-      description
-        "Start date represents end date for currently active SRLGs. Start date will represent start date for planned SRLGs";
-      leaf start-date {
-        type yang:date-and-time;
-      }
-    }
-  }
-}
diff --git a/ordmodels/network/src/main/yang/org-openroadm-network@2021-12-10.yang b/ordmodels/network/src/main/yang/org-openroadm-network@2021-12-10.yang
deleted file mode 100644 (file)
index 56b50e2..0000000
+++ /dev/null
@@ -1,244 +0,0 @@
-module org-openroadm-network {
-  yang-version 1.1;
-  namespace "http://org/openroadm/network";
-  prefix net;
-
-  import ietf-network {
-    prefix nd;
-    revision-date 2018-02-26;
-  }
-  import org-openroadm-network-types {
-    prefix nt;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-roadm {
-    prefix roadm;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-external-pluggable {
-    prefix plg;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-xponder {
-    prefix xpdr;
-    revision-date 2021-12-10;
-  }
-  import ietf-inet-types {
-    prefix inet;
-    revision-date 2013-07-15;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-common-network {
-    prefix cnet;
-    revision-date 2021-12-10;
-  }
-
-  organization
-    "OPEN ROADM MSA";
-  contact
-    "www.OpenROADM.org.";
-  description
-    "Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2021-12-10 {
-    description
-      "Version 10.1";
-  }
-  revision 2021-09-24 {
-    description
-      "Version 10.0";
-  }
-  revision 2021-05-28 {
-    description
-      "Version 9.1";
-  }
-  revision 2021-03-26 {
-    description
-      "Version 9.0";
-  }
-  revision 2020-12-11 {
-    description
-      "Version 8.1";
-  }
-  revision 2020-09-25 {
-    description
-      "Version 8.0";
-  }
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  deviation "/nd:networks/nd:network/nd:node/cnet:node-type" {
-    deviate add {
-      must "(not /nd:network/nd:network-types/cnet:openroadm-common-network/openroadm-network) or
-            (/nd:network/nd:network-types/cnet:openroadm-common-network/openroadm-network and
-            (../cnet:node-type = 'ROADM' or ../cnet:node-type = 'XPONDER' or ../cnet:node-type = 'EXT-PLUGGABLE'))" {
-          error-message "Invalid node type for openroadm-network";
-          description
-            "The valid node types in the ROADM network are XPONDER, EXT-PLUGGABLE and ROADM.";
-      }
-    }
-  }
-
-  augment "/nd:networks/nd:network/nd:network-types/cnet:openroadm-common-network" {
-    description
-      "Introduce new network type for the Open ROADM optical network";
-    container openroadm-network {
-      presence "indicates optical network of Open ROADMs";
-      description
-        "The presence of the container node indicates Open ROADM
-         network";
-    }
-  }
-
-  augment "/nd:networks/nd:network/nd:node" {
-    when '../nd:network-types/cnet:openroadm-common-network/net:openroadm-network';
-    description
-      "Augment the generic network node with Open ROADM attributes.";
-    leaf software-version {
-      type string;
-      description
-        "Vendor software version";
-    }
-    leaf openroadm-version {
-      type org-openroadm-common-types:openroadm-version-type;
-      description
-        "OpenROADM software version";
-    }
-    leaf vendor {
-      type string;
-      description
-        "Identifier of the supplier";
-    }
-    leaf model {
-      type string;
-      description
-        "Identifier of the supplier's equipment";
-    }
-    leaf domain-subnetwork {
-      type string;
-      description
-        "Specific Domain-Subnetwork in which the node resides";
-    }
-    leaf ip {
-      type inet:ip-address;
-      description
-        "IP address assigned to the node";
-    }
-    leaf relay-rack {
-      type string;
-      description
-        "Frame Identification Code (FIC)";
-    }
-    leaf shelf {
-      type string;
-    }
-    leaf node-connection-status {
-      type nt:openroadm-node-connection-status;
-    }
-    container roadm-attributes {
-      when "../cnet:node-type = 'ROADM'";
-      description
-        "Attributes for the ROADM Node.";
-      uses roadm:roadm-node-attributes;
-    }
-    container xpdr-attributes {
-      when "../cnet:node-type = 'XPONDER'";
-      uses xpdr:xpdr-node-attributes;
-    }
-    container pluggable-attributes {
-      when "../cnet:node-type = 'EXT-PLUGGABLE'";
-      uses plg:pluggable-node-attributes;
-    }
-    container plan-due-dates {
-      uses nt:node-due-date-list;
-    }
-    container node-maintenance-schedule {
-      uses nt:node-due-date-list;
-    }
-  }
-}
diff --git a/ordmodels/network/src/main/yang/org-openroadm-otn-network-topology@2021-12-10.yang b/ordmodels/network/src/main/yang/org-openroadm-otn-network-topology@2021-12-10.yang
deleted file mode 100644 (file)
index 697d03d..0000000
+++ /dev/null
@@ -1,242 +0,0 @@
-module org-openroadm-otn-network-topology {
-  yang-version 1.1;
-  namespace "http://org/openroadm/otn/network/topology";
-  prefix otn-topo;
-
-  import ietf-network {
-    prefix nd;
-    revision-date 2018-02-26;
-  }
-  import ietf-network-topology {
-    prefix nwt;
-    revision-date 2018-02-26;
-  }
-  import org-openroadm-network-types {
-    prefix org-openroadm-network-types;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-network-topology-types {
-    prefix org-openroadm-network-topology-types;
-    revision-date 2020-12-11;
-  }
-  import org-openroadm-xponder {
-    prefix xpdr;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-common-network {
-    prefix cnet;
-    revision-date 2021-12-10;
-  }
-
-  organization
-    "OPEN ROADM MSA";
-  contact
-    "OpenROADM.org.";
-  description
-    "YANG definitions for network view of a ROADM
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2021-12-10 {
-    description
-      "Version 10.1";
-  }
-  revision 2021-09-24 {
-    description
-      "Version 10.0";
-  }
-  revision 2021-03-26 {
-    description
-      "Version 9.0";
-  }
-  revision 2020-12-11 {
-    description
-      "Version 8.1";
-  }
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-
-  deviation "/nd:networks/nd:network/nd:node/cnet:node-type" {
-    deviate add {
-      must "(not /nd:network/nd:network-types/cnet:openroadm-common-network/otn-topology) or
-            (/nd:network/nd:network-types/cnet:openroadm-common-network/otn-topology and
-            (../cnet:node-type = 'SWITCH' or ../cnet:node-type = 'MUXPDR' or ../cnet:node-type = 'TPDR' or
-             ../cnet:node-type = 'REGEN' or ../cnet:node-type = 'REGEN-UNI'))" {
-          error-message "Invalid node type for otn-topology";
-          description
-            "The type of a node in the OTN topology";
-      }
-    }
-  }
-
-  deviation "/nd:networks/nd:network/nd:node/nwt:termination-point/cnet:tp-type" {
-    description
-      "Defines which TP types can be instantiated on which Node types";
-    deviate add {
-      must "(/nd:network/nd:node/cnet:node-type != 'MUXPDR' and ../../cnet:node-type != 'SWITCH' and ../../cnet:node-type != 'TPDR'
-            and ../cnet:node-type != 'REGEN' and ../cnet:node-type != 'REGEN-UNI') or
-            ((../../cnet:node-type = 'MUXPDR' or ../../cnet:node-type = 'SWITCH' or ../../cnet:node-type = 'TPDR' or
-            ../cnet:node-type = 'REGEN' or ../cnet:node-type = 'REGEN-UNI') and
-            (../cnet:tp-type = 'XPONDER-NETWORK' or ../cnet:tp-type = 'XPONDER-CLIENT' or ../cnet:tp-type = 'XPONDER-PORT'))" {
-          error-message "Invalid TP for node type Xponder";
-      }
-    }
-  }
-
-  deviation "/nd:networks/nd:network/nwt:link/cnet:link-type" {
-    deviate add {
-      must "(not /nd:network/nd:network-types/cnet:openroadm-common-network/otn-topology) or
-            (/nd:network/nd:network-types/cnet:openroadm-common-network/otn-topology and ../cnet:link-type = 'OTN-LINK')" {
-          error-message "Invalid link type for otn-topology";
-          description
-            "The valid link type in the OTN topology is 'OTN-LINK'";
-      }
-    }
-  }
-
-  augment "/nd:networks/nd:network/nd:network-types/cnet:openroadm-common-network" {
-    description
-      "Introduce new network type for the Open ROADM OTN network topology";
-    container otn-topology {
-      presence "indicates OTN topology for Transponder, Muxponder, Switchponder and OTN-switch";
-    }
-  }
-
-  augment "/nd:networks/nd:network/nd:node" {
-    when '../nd:network-types/cnet:openroadm-common-network/otn-topo:otn-topology';
-    description
-      "This augmentations adds the OTN Node type to the generic node
-       definition and defines node-specific attributes for each node type
-       in the OTN Topology.";
-    container tp-bandwidth-sharing {
-      when "../cnet:node-type = 'MUXPDR' or ../cnet:node-type = 'SWITCH' or ../cnet:node-type = 'TPDR'";
-      uses org-openroadm-network-topology-types:xpdr-tp-bandwidth-sharing;
-    }
-    container switching-pools {
-      when "../cnet:node-type = 'MUXPDR' or ../cnet:node-type = 'SWITCH' or ../cnet:node-type = 'TPDR'";
-      description
-        "ODU Switching pool";
-      uses org-openroadm-network-topology-types:xpdr-odu-switching-pools;
-    }
-    container xpdr-attributes {
-      when "../cnet:node-type = 'MUXPDR' or ../cnet:node-type = 'SWITCH' or ../cnet:node-type = 'TPDR' or
-            ../cnet:node-type = 'REGEN' or ../cnet:node-type = 'REGEN-UNI'";
-      description
-        "Topology-related attributes for Xponder nodes";
-      uses xpdr:xpdr-topo-node-attributes;
-    }
-  }
-
-  augment "/nd:networks/nd:network/nd:node/nwt:termination-point" {
-    when '../../nd:network-types/cnet:openroadm-common-network/otn-topo:otn-topology';
-    description
-      "Defines the type of a termination point in the OTN topology and
-       TP-specific attributes for each termination point type.";
-    container tp-supported-interfaces {
-      when "../cnet:tp-type = 'XPONDER-NETWORK' or ../cnet:tp-type = 'XPONDER-CLIENT' or ../cnet:tp-type = 'XPONDER-PORT'";
-      description
-        "Supported interface capability on the port.";
-      uses org-openroadm-network-types:xpdr-tp-supported-interfaces;
-    }
-    container xpdr-tp-port-connection-attributes {
-      when "../cnet:tp-type = 'XPONDER-NETWORK' or ../cnet:tp-type = 'XPONDER-CLIENT' or ../cnet:tp-type = 'XPONDER-PORT'";
-      description
-        "Topology-related attributes for Xpdr nodes";
-      uses xpdr:xpdr-otn-tp-attributes;
-      uses xpdr:xpdr-port-connection-attributes;
-      uses org-openroadm-network-topology-types:xpdr-otn-tail-attributes;
-      uses xpdr:supported-client-services;
-    }
-  }
-
-  augment "/nd:networks/nd:network/nwt:link" {
-    when '../nd:network-types/cnet:openroadm-common-network/otn-topo:otn-topology';
-    description
-      "This augmentation defines Logical link types in the OTN topology connecting OTN elements";
-    leaf available-bandwidth {
-      type uint32;
-      description
-        "Available bandwidth between OTN elements";
-    }
-    leaf used-bandwidth {
-      type uint32;
-      description
-        "Used bandwidth between OTN elements";
-    }
-    leaf ODU-protected {
-      type boolean;
-      description
-        "ODU protection flag";
-    }
-  }
-}
diff --git a/ordmodels/network/src/main/yang/org-openroadm-roadm@2019-11-29.yang b/ordmodels/network/src/main/yang/org-openroadm-roadm@2019-11-29.yang
deleted file mode 100644 (file)
index 801a690..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-module org-openroadm-roadm {
-  yang-version 1.1;
-  namespace "http://org/openroadm/roadm";
-  prefix roadm;
-
-  organization
-    "OPEN ROADM MSA";
-  contact
-    "OpenROADM.org.";
-  description
-    "YANG definitions for network view of a ROADM
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping roadm-node-attributes {
-    leaf max-degrees {
-      type uint16;
-      description
-        "Max no. of degrees supported by the node";
-    }
-    leaf max-srgs {
-      type uint16;
-      description
-        "Max no. of SRGs supported by the node";
-    }
-    leaf current-degrees {
-      type uint16;
-      description
-        "Current no. of degrees supported by the node";
-    }
-    leaf current-srgs {
-      type uint16;
-      description
-        "Current no. of SRGs supported by the node";
-    }
-  }
-}
diff --git a/ordmodels/network/src/main/yang/org-openroadm-srg@2021-12-10.yang b/ordmodels/network/src/main/yang/org-openroadm-srg@2021-12-10.yang
deleted file mode 100644 (file)
index 594ade1..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-module org-openroadm-srg {
-  yang-version 1.1;
-  namespace "http://org/openroadm/srg";
-  prefix srg;
-
-  import org-openroadm-common-optical-channel-types {
-    prefix org-openroadm-common-optical-channel-types;
-    revision-date 2021-12-10;
-  }
-
-  organization
-    "OPEN ROADM MSA";
-  contact
-    "OpenROADM.org.";
-  description
-    "YANG definitions for an Add/Drop group in Network Model
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2021-12-10 {
-    description
-      "Version 10.1";
-  }
-  revision 2021-09-24 {
-       description
-         "Version 10.0";
-  }
-  revision 2021-03-26 {
-    description
-      "Version 9.0";
-  }
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping srg-node-attributes {
-    leaf srg-number {
-      type uint16;
-    }
-    leaf max-pp {
-      type uint32;
-      description
-        "Maximum number of add/drop port pairs in an SRG";
-    }
-    leaf current-provisioned-pp {
-      type uint32;
-      description
-        "current provisioned number of port pair in a given SRG";
-    }
-    leaf wavelength-duplication {
-      type org-openroadm-common-optical-channel-types:wavelength-duplication-type;
-    }
-    leaf-list supported-operational-modes {
-      type string;
-      config true;
-      description
-        "defines the supported openroadm specifications";
-    }
-  }
-}
diff --git a/ordmodels/network/src/main/yang/org-openroadm-xponder@2021-12-10.yang b/ordmodels/network/src/main/yang/org-openroadm-xponder@2021-12-10.yang
deleted file mode 100644 (file)
index 23a18d4..0000000
+++ /dev/null
@@ -1,315 +0,0 @@
-module org-openroadm-xponder {
-  yang-version 1.1;
-  namespace "http://org/openroadm/xponder";
-  prefix xpdr;
-
-  import org-openroadm-network-types {
-    prefix org-openroadm-network-types;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-common-equipment-types {
-    prefix org-openroadm-common-equipment-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-state-types {
-    prefix org-openroadm-common-state-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-optical-channel-types {
-    prefix org-openroadm-common-optical-channel-types;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-otn-common-types {
-    prefix org-openroadm-otn-common-types;
-    revision-date 2021-09-24;
-  }
-  import org-openroadm-service-format {
-    prefix org-openroadm-service-format;
-    revision-date 2019-11-29;
-  }
-
-  organization
-    "OPEN ROADM MSA";
-  contact
-    "OpenROADM.org.";
-  description
-    "YANG definitions for xponder
-
-     Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-     All other rights reserved.
-
-     Redistribution and use in source and binary forms, with or without modification,
-     are permitted provided that the following conditions are met:
-
-     * Redistributions of source code must retain the above copyright notice, this
-       list of conditions and the following disclaimer.
-     * Redistributions in binary form must reproduce the above copyright notice,
-       this list of conditions and the following disclaimer in the documentation and/or
-       other materials provided with the distribution.
-     * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-       contributors may be used to endorse or promote products derived from this software
-       without specific prior written permission.
-
-     THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-     WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-     IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-     INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-     OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-     WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-     ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-     POSSIBILITY OF SUCH DAMAGE.";
-
-  revision 2021-12-10 {
-    description
-      "Version 10.1";
-  }
-  revision 2021-09-24 {
-    description
-      "Version 10.0";
-  }
-  revision 2021-03-26 {
-    description
-      "Version 9.0";
-  }
-  revision 2020-12-11 {
-    description
-      "Version 8.1";
-  }
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping xpdr-node-attributes {
-    leaf customer-code {
-      type string;
-      description
-        "Owner of the xponder";
-    }
-  }
-
-  grouping xpdr-topo-node-attributes {
-    leaf xpdr-number {
-      type uint16;
-    }
-  }
-
-  grouping xpdr-connection-attributes {
-    leaf local-lgx {
-      type string;
-    }
-    leaf rate {
-      type identityref {
-        base org-openroadm-common-optical-channel-types:optical-rate-identity;
-      }
-      description
-        "rate";
-    }
-    leaf modulation-format {
-      type org-openroadm-common-optical-channel-types:modulation-format;
-    }
-    leaf optic {
-      type org-openroadm-common-equipment-types:optic-types;
-    }
-    leaf state {
-      type org-openroadm-common-state-types:state;
-      description
-        "A xponder can be in one of the following
-                 states";
-    }
-  }
-
-  grouping xpdr-port-connection-attributes {
-    container wavelength {
-      uses org-openroadm-network-types:flex-wave;
-    }
-    leaf tail-equipment {
-      type string;
-      description
-        "Type of equipment connected to the tail
-         for example packet box";
-    }
-    leaf tail-equipment-id {
-      type string;
-      description
-        "Identifier of equipment connected to the
-         tail for example client equipement ID";
-    }
-    leaf tail-clfi {
-      type string;
-    }
-  }
-
-  grouping xpdr-otn-tp-attributes {
-    leaf rate {
-      type identityref {
-        base org-openroadm-otn-common-types:odu-rate-identity;
-      }
-      description
-        "rate identity of the ODU. 'identityref' is used
-         to allow to extend for future higher rates";
-    }
-    list odtu-tpn-pool {
-      key "odtu-type";
-      leaf odtu-type {
-        type identityref {
-          base org-openroadm-otn-common-types:odtu-type-identity;
-        }
-        description
-          "ODTU type, part of the MSI (Multiplex Structure Identifier)";
-      }
-      leaf-list tpn-pool {
-        type uint16;
-        description
-          "List of available Tributary Port Number (0-based), part of the MSI";
-      }
-    }
-    leaf-list ts-pool {
-      type uint16;
-      description
-        "List of available Tributary Slots used by port";
-    }
-    leaf-list opucn-ts-pool {
-      type org-openroadm-otn-common-types:opucn-trib-slot-def;
-      description
-        "List of available OPUCn Tributary Slots used by port";
-    }
-  }
-
-  grouping xpdr-mode-attributes {
-    container supported-operational-modes {
-      list operational-mode {
-        key "mode-id";
-        description
-          "list of supported operational modes";
-        leaf mode-id {
-          type string;
-          description
-            "Optical profile operational mode identifier";
-        }
-        leaf spectral-width {
-          type org-openroadm-common-optical-channel-types:frequency-GHz;
-          units "GHz";
-          description
-            "The required minimum signal spectral width of signal at -22 dbm.";
-        }
-      }
-    }
-    leaf operational-mode {
-      type string;
-      config true;
-      description
-        "The provisioned operational-mode of the equipment.";
-    }
-  }
-
-  grouping supported-client-services {
-    container supported-client-services {
-      list supported-client-service {
-        key "service-format";
-        description
-          "Supported Client Services";
-        leaf service-format {
-          type org-openroadm-service-format:service-format;
-          description
-            "Format of the requested service: Ethernet, OTU, etc.";
-        }
-        leaf-list service-rate {
-          type uint32;
-          description
-            "Rate of the requested service in GBps. Not used when service-format=other.";
-        }
-        leaf-list other-service-format-and-rate {
-          type string;
-          description
-            "Used when service-format is set to other in the bookend xponder use case.
-             The use of other-service-format-and-rate is not standardized in the Open ROADM MSA
-             and intended to allow the controller to support non-Open ROADM service formats.
-             This value encodes both the service format and the rate supported.
-             This field should not be specified when service format != other.";
-        }
-      }
-    }
-    uses provisioned-client-service;
-  }
-
-  grouping provisioned-client-service {
-    leaf service-format {
-      type org-openroadm-service-format:service-format;
-      description
-        "Format of the provisioned service: Ethernet, OTU, etc.";
-    }
-    leaf service-rate {
-      type uint32;
-      description
-        "Provisioned rate of the requested service in GBps. Not used when service-format=other.";
-    }
-    leaf other-service-format-and-rate {
-      type string;
-      description
-        "Used when service-format is set to other in the bookend xponder use case.
-         The use of other-service-format-and-rate is not standardized in the Open ROADM MSA
-         and intended to allow the controller to support non-Open ROADM service formats.
-         This value encodes the provisioned service format and the rate supported.
-         This field should not be specified when service format != other.";
-    }
-  }
-}
diff --git a/ordmodels/network/src/main/yang/transportpce-topology@2022-01-23.yang b/ordmodels/network/src/main/yang/transportpce-topology@2022-01-23.yang
deleted file mode 100644 (file)
index 39c7399..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-module transportpce-topology {
-    yang-version 1.1;
-    namespace "http://transportpce/topology";
-    prefix "transportpce-topology";
-
-    import ietf-network {
-        prefix nd;
-        revision-date 2018-02-26;
-      }
-    import ietf-network-topology {
-        prefix nwt;
-        revision-date 2018-02-26;
-      }
-    import org-openroadm-common-network {
-        prefix cnet;
-      }
-
-    organization
-        "TransportPCE team";
-    contact
-        "TransportPCE team";
-
-    revision 2022-01-23 {
-        description "Update otn-link-type enum for intermediate rates (B100G)";
-    }
-    revision 2021-05-11 {
-        description "Update otn-link-type enum for higher rates";
-    }
-    revision 2020-10-19 {
-        description "Update to 7.1.0 Openroadm network and common models";
-    }
-    revision 2020-01-29 {
-        description "Add transportpce augmentation to manage otn-link-type in otn-topology";
-    }
-    revision 2020-01-23 {
-        description "Add transportpce augmentation for otn-topology";
-    }
-    revision 2019-06-25 {
-        description "Initial revision";
-    }
-
-    typedef otn-link-type {
-      type enumeration {
-        enum "OTU4" {
-          value 0;
-        }
-        enum "ODU4" {
-          value 1;
-        }
-        enum "ODTU4" {
-          value 2;
-        }
-        enum "ODU2e" {
-          value 3;
-        }
-        enum "ODU0" {
-          value 4;
-        }
-        enum "OTUC4" {
-          value 5;
-        }
-        enum "ODUC4" {
-          value 6;
-        }
-        enum "OTUC3" {
-          value 7;
-        }
-        enum "ODUC3" {
-          value 8;
-        }
-        enum "OTUC2" {
-          value 9;
-        }
-        enum "ODUC2" {
-          value 10;
-        }
-      }
-    }
-
-    augment "/nd:networks/nd:network/nd:node/nwt:termination-point" {
-        when "../../nd:network-types/cnet:openroadm-common-network/openroadm-topology or ../../nd:network-types/cnet:openroadm-common-network/otn-topology";
-        description
-          "Defines associated logical-connection-point for XPDR port.";
-        leaf associated-connection-map-port {
-          when
-            "../cnet:tp-type = 'XPONDER-CLIENT' or ../cnet:tp-type = 'XPONDER-NETWORK'";
-          type string;
-          description
-            "The xpdr port connectable regarding the device connection-map";
-        }
-    }
-
-    augment "/nd:networks/nd:network/nwt:link" {
-        when "../nd:network-types/cnet:openroadm-common-network/otn-topology";
-        description
-          "Defines more accurate otn link types to differentiate otn links in otn-topology";
-        leaf otn-link-type {
-          when
-            "../cnet:link-type = 'OTN-LINK'";
-          type otn-link-type;
-          description
-              "type of otn link, to help link management inside transportpce";
-          }
-    }
-}
diff --git a/ordmodels/pom.xml b/ordmodels/pom.xml
deleted file mode 100644 (file)
index 8ae2894..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Copyright © 2016 Orange and others. All rights reserved.
-
-This program and the accompanying materials are made available under the
-terms of the Eclipse Public License v1.0 which accompanies this distribution,
-and is available at http://www.eclipse.org/legal/epl-v10.html
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.opendaylight.mdsal</groupId>
-    <artifactId>binding-parent</artifactId>
-    <version>8.0.11</version>
-    <relativePath/>
-  </parent>
-
-  <groupId>org.opendaylight.transportpce</groupId>
-  <artifactId>transportpce-ordmodels</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
-  <packaging>pom</packaging>
-
-  <modules>
-    <module>common</module>
-    <module>device</module>
-    <module>network</module>
-    <module>service</module>
-  </modules>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-deploy-plugin</artifactId>
-        <configuration>
-          <skip>true</skip>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-install-plugin</artifactId>
-        <configuration>
-          <skip>true</skip>
-        </configuration>
-      </plugin>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-javadoc-plugin</artifactId>
-        <configuration>
-          <sourcepath>*/target/generated-sources/mdsal-binding/*</sourcepath>
-          <excludePackageNames>*</excludePackageNames>
-        </configuration>
-      </plugin>
-      <!-- skipping test since this is a util project / folder -->
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-surefire-plugin</artifactId>
-        <configuration>
-          <skipTests>true</skipTests>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
-  <reporting>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-javadoc-plugin</artifactId>
-        <configuration>
-          <sourcepath>*/target/generated-sources/mdsal-binding/*</sourcepath>
-          <excludePackageNames>*</excludePackageNames>
-        </configuration>
-      </plugin>
-    </plugins>
-  </reporting>
-</project>
diff --git a/ordmodels/service/pom.xml b/ordmodels/service/pom.xml
deleted file mode 100644 (file)
index 10fa822..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Copyright © 2016 Orange and others. All rights reserved.
-
-This program and the accompanying materials are made available under the
-terms of the Eclipse Public License v1.0 which accompanies this distribution,
-and is available at http://www.eclipse.org/legal/epl-v10.html
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.opendaylight.mdsal</groupId>
-    <artifactId>binding-parent</artifactId>
-    <version>8.0.11</version>
-    <relativePath/>
-  </parent>
-
-  <groupId>org.opendaylight.transportpce.ordmodels</groupId>
-  <artifactId>transportpce-ordmodels-service</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
-  <packaging>bundle</packaging>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.opendaylight.transportpce.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-common</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>concepts</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>yang-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
-      <artifactId>rfc6991-ietf-inet-types</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
-      <artifactId>rfc6991-ietf-yang-types</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/ordmodels/service/src/main/yang/org-openroadm-ber-test@2021-12-10.yang b/ordmodels/service/src/main/yang/org-openroadm-ber-test@2021-12-10.yang
deleted file mode 100644 (file)
index 5d859a0..0000000
+++ /dev/null
@@ -1,312 +0,0 @@
-module org-openroadm-ber-test {
-  namespace "http://org/openroadm/ber-test";
-  prefix org-openroadm-ber-test;
-
-  import org-openroadm-common-service-types {
-    prefix org-openroadm-common-service-types;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-common-ber-test {
-    prefix org-openroadm-common-ber-test;
-    revision-date 2020-05-29;
-  }
-  import ietf-yang-types {
-    prefix yang;
-    revision-date 2013-07-15;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for ber test
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2021-12-10 {
-    description
-      "Version 10.1";
-  }
-  revision 2021-09-24 {
-    description
-      "Version 10.0";
-  }
-  revision 2021-05-28 {
-    description
-      "Version 9.1";
-  }
-  revision 2021-03-26 {
-    description
-      "Version 9.0";
-  }
-  revision 2020-12-11 {
-    description
-      "Version 8.1";
-  }
-  revision 2020-09-25 {
-    description
-      "Version 8.0";
-  }
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-
-  identity service-rpc-identity {
-    description
-      "Identifies the service rpc associated with this callback";
-  }
-
-  identity ber-test {
-    base service-rpc-identity;
-    description
-      "Identity for the ber-test rpc";
-  }
-
-  grouping ber-measurement {
-    leaf ber-passed {
-      type boolean;
-    }
-    leaf target-prefec-ber {
-      type decimal64 {
-        fraction-digits 4;
-      }
-    }
-    leaf measured-prefec-ber {
-      type decimal64 {
-        fraction-digits 4;
-      }
-    }
-  }
-
-  grouping ber-test-result-details-container {
-    container ber-results {
-      uses org-openroadm-common-ber-test:ber-test-options-container;
-      leaf line-rate {
-        type uint64;
-        units "seconds";
-      }
-      container a-end-ber-measurement {
-        uses ber-measurement;
-      }
-      container z-end-ber-measurement {
-        uses ber-measurement;
-      }
-    }
-  }
-
-  grouping ber-test-complex-result-details-container {
-    container ber-test-result-details {
-      list supporting-service-details {
-        key "index";
-        leaf index {
-          type uint16;
-          description
-            "Local id for list ";
-        }
-        uses org-openroadm-common-service-types:service-identifiers-container;
-        uses org-openroadm-common-service-types:service-ends-container;
-        leaf line-rate {
-          type uint64;
-          units "seconds";
-        }
-        container a-end-ber-measurement {
-          uses ber-measurement;
-        }
-        container z-end-ber-measurement {
-          uses ber-measurement;
-        }
-      }
-    }
-  }
-
-  grouping ber-test-complex-result-container {
-    container ber-results {
-      uses org-openroadm-common-ber-test:ber-test-options-container;
-      uses ber-test-complex-result-details-container;
-    }
-  }
-
-  rpc ber-test {
-    description
-      "This is the ber-test rpc. It is supported for a service in the service-list.";
-    input {
-      uses org-openroadm-common-service-types:sdnc-request-header;
-      leaf service-name {
-        type string;
-        mandatory true;
-      }
-      uses org-openroadm-common-ber-test:ber-test-options-container;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-    }
-  }
-
-  rpc complex-ber-test {
-    description
-      "This is the complex-ber-test rpc. It is supported for a service in the service-list.";
-    input {
-      uses org-openroadm-common-service-types:sdnc-request-header;
-      leaf service-name {
-        type string;
-        mandatory true;
-      }
-      uses org-openroadm-common-ber-test:complex-ber-test-options-container;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-    }
-  }
-
-  rpc service-rpc-ber-test-async-callback {
-    description
-      "This is the callback notification that the controller invokes on the carrier system.";
-    input {
-      uses org-openroadm-common-service-types:configuration-response-common;
-      uses org-openroadm-common-service-types:service-identifiers-container;
-      leaf rpc-timestamp {
-        type yang:date-and-time;
-        units "seconds";
-        description
-          "timestamp of the initial rpc command that invoked the test";
-      }
-      leaf timestamp {
-        type yang:date-and-time;
-        units "seconds";
-        description
-          "timestamp of the callback/notification.";
-      }
-      uses ber-test-result-details-container;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-    }
-  }
-
-  rpc complex-service-rpc-ber-test-async-callback {
-    description
-      "This is the callback notification that the controller invokes on the carrier system.";
-    input {
-      uses org-openroadm-common-service-types:configuration-response-common;
-      uses org-openroadm-common-service-types:service-identifiers-container;
-      leaf rpc-timestamp {
-        type yang:date-and-time;
-        units "seconds";
-        description
-          "timestamp of the initial rpc command that invoked the test";
-      }
-      leaf timestamp {
-        type yang:date-and-time;
-        units "seconds";
-        description
-          "timestamp of the callback/notification.";
-      }
-      uses ber-test-complex-result-container;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-    }
-  }
-
-  notification service-notification-ber-test {
-    description
-      "This is the callback notification that the controller invokes on the carrier system.";
-    uses org-openroadm-common-service-types:configuration-response-common;
-    uses org-openroadm-common-service-types:service-identifiers-container;
-    leaf rpc-timestamp {
-      type yang:date-and-time;
-      units "seconds";
-      description
-        "timestamp of the initial rpc command that invoked the test";
-    }
-    leaf timestamp {
-      type yang:date-and-time;
-      units "seconds";
-      description
-        "timestamp of the callback/notification.";
-    }
-    uses ber-test-result-details-container;
-  }
-
-  notification complex-service-notification-ber-test {
-    description
-      "This is the callback notification that the controller invokes on the carrier system.";
-    uses org-openroadm-common-service-types:configuration-response-common;
-    uses org-openroadm-common-service-types:service-identifiers-container;
-    leaf rpc-timestamp {
-      type yang:date-and-time;
-      units "seconds";
-      description
-        "timestamp of the initial rpc command that invoked the test";
-    }
-    leaf timestamp {
-      type yang:date-and-time;
-      units "seconds";
-      description
-        "timestamp of the callback/notification.";
-    }
-    uses ber-test-complex-result-details-container;
-  }
-}
diff --git a/ordmodels/service/src/main/yang/org-openroadm-common-ber-test@2020-05-29.yang b/ordmodels/service/src/main/yang/org-openroadm-common-ber-test@2020-05-29.yang
deleted file mode 100644 (file)
index dc92734..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-module org-openroadm-common-ber-test {
-  namespace "http://org/openroadm/common-ber-test";
-  prefix org-openroadm-common-ber-test;
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions for ber test that are common to the ber-test rpc and its
-     associated callback rpc (service-rpc-async-callback)
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-
-  grouping ber-test-options-container {
-    container ber-options {
-      leaf target-prefec-ber {
-        type decimal64 {
-          fraction-digits 18;
-        }
-      }
-      leaf duration {
-        type uint16;
-        units "seconds";
-      }
-      leaf pm-polling-timeout {
-        type uint16;
-        units "seconds";
-      }
-      leaf retry-attempts {
-        type uint16;
-      }
-    }
-  }
-
-  grouping complex-ber-test-options-container {
-    container complex-ber-options {
-      uses ber-test-options-container;
-      leaf is-complex-result {
-        type boolean;
-        default "false";
-        description
-          "True: Indicates that the results should be provided via complex-service-rpc-ber-test-async-callback. False: Indicates that the results should be provided via  service-rpc-ber-test-async-callback";
-      }
-    }
-  }
-}
diff --git a/ordmodels/service/src/main/yang/org-openroadm-common-service-types@2021-12-10.yang b/ordmodels/service/src/main/yang/org-openroadm-common-service-types@2021-12-10.yang
deleted file mode 100644 (file)
index 2c4f24e..0000000
+++ /dev/null
@@ -1,1874 +0,0 @@
-module org-openroadm-common-service-types {
-  namespace "http://org/openroadm/common/service/types";
-  prefix org-openroadm-common-service-types;
-
-  import ietf-yang-types {
-    prefix yang;
-    revision-date 2013-07-15;
-  }
-  import ietf-inet-types {
-    prefix inet;
-    revision-date 2013-07-15;
-  }
-  import org-openroadm-routing-constraints {
-    prefix org-openroadm-routing-constraints;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-topology {
-    prefix org-openroadm-topology;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-common-equipment-types {
-    prefix org-openroadm-common-equipment-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-state-types {
-    prefix org-openroadm-common-state-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-node-types {
-    prefix org-openroadm-common-node-types;
-    revision-date 2021-05-28;
-  }
-  import org-openroadm-resource-types {
-    prefix org-openroadm-resource-types;
-    revision-date 2021-09-24;
-  }
-  import org-openroadm-otn-common-types {
-    prefix org-openroadm-otn-common-types;
-    revision-date 2021-09-24;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-equipment-states-types {
-    prefix org-openroadm-equipment-states-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-service-format {
-    prefix org-openroadm-service-format;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-attributes {
-    prefix org-openroadm-common-attributes;
-    revision-date 2021-09-24;
-  }
-  import org-openroadm-common-phy-codes {
-    prefix org-openroadm-common-phy-codes;
-    revision-date 2021-05-28;
-  }
-  import org-openroadm-common-optical-channel-types {
-    prefix org-openroadm-common-optical-channel-types;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-resource {
-    prefix org-openroadm-resource;
-    revision-date 2021-12-10;
-  }
-  
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common service types.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2021-12-10 {
-    description
-      "Version 10.1";
-  }
-  revision 2021-09-24 {
-    description
-      "Version 10.0";
-  }
-  revision 2021-05-28 {
-    description
-      "Version 9.1";
-  }
-  revision 2021-03-26 {
-    description
-      "Version 9.0";
-  }
-  revision 2020-12-11 {
-    description
-      "Version 8.1";
-  }
-  revision 2020-09-25 {
-    description
-      "Version 8.0";
-  }
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  identity service-resiliency-type-identity {
-    description
-      "A unique resiliency type identification of the service.";
-  }
-
-  identity unprotected {
-    base service-resiliency-type-identity;
-    description
-      "the service is not protected in the OpenROADM layer";
-  }
-
-  identity unprotected-diversely-routed {
-    base service-resiliency-type-identity;
-    description
-      "the service is not protected in the OpenROADM layer, but may be protected in a higher layer
-          a coupled service that may be routed partially or fully disjointly is defined";
-  }
-
-  identity protected {
-    base service-resiliency-type-identity;
-    description
-      "the service is protected in the OpenROADM layer : the protection is handled
-       autonomously in this layer";
-  }
-
-  identity restorable {
-    base service-resiliency-type-identity;
-    description
-      "the service can be restored autonomously in the OpenROADM layer";
-  }
-
-  identity external-trigger-restorable {
-    base service-resiliency-type-identity;
-    description
-      "the service can be restored in the OpenROADM layer, but the restoration is triggered
-       at a higher layer through service models' rpc";
-  }
-
-  typedef rpc-actions {
-    type enumeration {
-      enum service-create {
-        value 1;
-      }
-      enum service-feasibility-check {
-        value 2;
-      }
-      enum service-delete {
-        value 3;
-      }
-      enum equipment-notification {
-        value 4;
-      }
-      enum temp-service-create {
-        value 5;
-      }
-      enum temp-service-delete {
-        value 6;
-      }
-      enum service-roll {
-        value 7;
-      }
-      enum service-reconfigure {
-        value 8;
-      }
-      enum service-restoration {
-        value 9;
-      }
-      enum service-reversion {
-        value 10;
-      }
-      enum service-reroute {
-        value 11;
-      }
-      enum service-reroute-confirm {
-        value 12;
-      }
-      enum network-re-optimization {
-        value 13;
-      }
-      enum service-feasibility-check-bulk {
-        value 14;
-      }
-      enum ber-test {
-        value 15;
-      }
-      enum controller-parameters-setting {
-        value 16;
-      }
-      enum optical-tunnel-create {
-          value 17;
-      }
-      enum optical-tunnel-request-cancel {
-          value 18;
-      }
-      enum fill-catalog-with-or-operational-modes {
-          value 19;
-      }
-      enum fill-catalog-with-specific-operational-modes {
-          value 20;
-      }
-    }
-    description
-      "rpc-actions include all the rpc methods";
-  }
-
-  typedef ethernet-encoding-type {
-    type enumeration {
-      enum 10GBASE-W {
-        value 1;
-      }
-      enum 10GBASE-R {
-        value 2;
-      }
-    }
-  }
-
-  typedef mapping-mode-type {
-    type enumeration {
-      enum GFP-F {
-        value 1;
-        reference
-          "GFP-F - ITU-T G.7041 SubClause 7.1, Payload Only";
-      }
-      enum GFP-E {
-        value 2;
-        reference
-          "GFP-E - ITU-T G.7041 SubClause 7.9, Payload + Preamble + Ordered Sets";
-      }
-      enum PCS-Transparent {
-        value 3;
-        reference
-          "PCS-Transparent - ITU-T G.709 Subclause 17.2 , CBR10G3 mapping to ODU2e";
-      }
-    }
-  }
-
-  typedef service-layer-type {
-    type enumeration {
-      enum wdm {
-        value 1;
-      }
-      enum otn {
-        value 2;
-      }
-    }
-  }
-
-  typedef service-notification-types {
-    type enumeration {
-      enum service-create-result {
-        value 1;
-      }
-      enum service-reconfigure-result {
-        value 2;
-      }
-      enum service-delete-result {
-        value 3;
-      }
-      enum service-roll-result {
-        value 4;
-      }
-      enum service-revert-result {
-        value 5;
-      }
-      enum service-reroute-result {
-        value 6;
-      }
-      enum service-restoration-result {
-        value 7;
-      }
-      enum successful-path-computation-resource-reserved {
-        value 8;
-      }
-      enum path-computation-failed {
-        value 9;
-      }
-    }
-  }
-
-  typedef connection-type {
-    type enumeration {
-      enum service {
-        value 1;
-      }
-      enum infrastructure {
-        value 2;
-      }
-      enum roadm-line {
-        value 3;
-      }
-      enum optical-tunnel {
-        value 4;
-      }
-    }
-  }
-
-  typedef resource-status-type {
-    type enumeration {
-      enum deployed {
-        value 1;
-        description
-          "find the best route using deployed network resources,
-           regardless of network failures; lifecycle-state must
-           be deployed and operational-state is ignored.";
-      }
-      enum in-service {
-        value 2;
-        description
-          "find the best route using deployed network resources,
-           but route around failed resources; lifecycle-state
-           must be deployed and operational-state must be
-           inService.";
-      }
-      enum planned {
-        value 3;
-        description
-          "find the best route using both deployed and planned
-           network resources; lifecycle-state must be planned
-           or deployed (deploying, deployed-updating, deployed-
-           augmented, and deploy-failed may be considered
-           planned states) and operational-state is ignored. if
-           planned is selected, due-date must be specified in
-           the service request.";
-      }
-    }
-    default "deployed";
-    description
-      "identifies the state of network resources required to
-       complete a service request.  default is deployed";
-  }
-
-  typedef service-condition {
-    type enumeration {
-      enum restored-temporarily {
-        value 1;
-      }
-      enum re-routed-temporarily {
-        value 2;
-      }
-      enum activated-for-service {
-        value 3;
-      }
-      enum activated-for-further-check {
-        value 4;
-      }
-      enum activated-for-troubleshooting-failure {
-        value 5;
-      }
-    }
-  }
-
-  grouping service-and-supporting-services {
-    description
-      "Service identifiers and supporting services details";
-    uses service-identifiers-container;
-    uses supporting-services-identifiers-and-ends;
-  }
-
-  grouping supporting-services-identifiers-and-ends {
-    container supporting-services {
-      list supporting-service-details {
-        key "index";
-        leaf index {
-          type uint16;
-          description
-            "Service number of the supporting service";
-        }
-        uses service-identifiers-container;
-        uses service-ends-container;
-      }
-    }
-  }
-
-  grouping trail-trace {
-    description
-      "Trail trace grouping";
-    uses org-openroadm-common-attributes:trail-trace-tx;
-    uses org-openroadm-common-attributes:trail-trace-other;
-  }
-
-  grouping tcm-attributes {
-    description
-      "Tandem Connection Monitoring (TCM) attributes";
-    leaf layer {
-      type uint8 {
-        range "1..6";
-      }
-      description
-        "TCM layer";
-    }
-    leaf monitoring-mode {
-      type enumeration {
-        enum not-terminated {
-          description
-            "Not Terminated: no detection or generation.
-             Overhead is passed through the interface transparently in receive direction
-             unless extension is set for erase";
-        }
-        enum terminated {
-          description
-            "Terminated: detection and generation enabled.
-             Overhead is erased (replaced with all zeros) in receive direction, unless
-             extension is set to passthrough";
-        }
-        enum monitored {
-          description
-            "Monitored: detection enabled.
-             Overhead is passed through the interface transparently in receive direction
-             unless extension is set for erase";
-        }
-      }
-      description
-        "Monitoring mode of the TCM layer";
-    }
-    leaf ltc-act-enabled {
-      type boolean;
-      description
-        "enable/disable alarm transfer on detection of Loss of Tandem Connection (LTC)";
-    }
-    leaf proactive-delay-measurement-enabled {
-      type boolean;
-      description
-        "enable/disable proactive Delay Measurement for TCM";
-    }
-    leaf tcm-direction {
-      type org-openroadm-otn-common-types:tcm-direction-enum;
-      description
-        "Direction of TCM.";
-    }
-    uses trail-trace;
-    uses org-openroadm-common-attributes:deg-threshold;
-  }
-
-  grouping otn-attributes-grp {
-    container otn-attributes {
-      when "(../service-format='OTU' or ../service-format='ODU')" {
-        description
-          "For any OTN services (OTU and OTN)";
-      }
-      uses org-openroadm-common-attributes:parent-odu-allocation;
-      uses org-openroadm-common-types:fec-grouping {
-        description
-          "OTN FEC / Forward Error Correction";
-      }
-      uses org-openroadm-common-attributes:trail-trace-tx;
-      uses org-openroadm-common-attributes:trail-trace-other;
-      uses org-openroadm-common-attributes:deg-threshold;
-      leaf-list reserved-tcm-layer {
-        type uint8;
-      }
-      list tcm {
-        key "layer tcm-direction";
-        max-elements 12;
-        description
-          "Tandem Connection Management";
-        uses tcm-attributes;
-      }
-    }
-  }
-
-  grouping ethernet-subrate-attributes-grp {
-    container ethernet-attributes {
-      when "(../service-format='Ethernet')" {
-        description
-          "For any Ethernet services";
-      }
-      uses org-openroadm-common-types:fec-grouping {
-        description
-          "ETH FEC / Forward Error Correction";
-      }
-      uses org-openroadm-common-service-types:subrate-eth-sla;
-    }
-  }
-
-  grouping service-ends-container {
-    container service-a-end {
-      uses service-endpoint-summary;
-    }
-    container service-z-end {
-      uses service-endpoint-summary;
-    }
-  }
-
-  grouping service-endpoint-summary {
-    description
-      "Brief form of service-endpoint";
-    container service-endpoint-details {
-      leaf clli {
-        type string;
-        mandatory true;
-        description
-          "CLLI. Note this CLLI must match the site associated with the device-id of this endpoint";
-      }
-      uses org-openroadm-resource-types:device-id;
-      container tx-direction {
-        uses service-port;
-      }
-      container rx-direction {
-        uses service-port;
-      }
-    }
-  }
-
-  grouping intermediate-site-container {
-    description
-      "Intermediate site used in the service feasibility check output.
-       This is different from the service-endpoint structure";
-    list intermediate-site {
-      key "clli";
-      description
-        "List of intermediate sites in the service feasiblity check
-         output response";
-      leaf clli {
-        type string;
-      }
-      list node {
-        key "node-id";
-        leaf node-id {
-          type org-openroadm-common-node-types:node-id-type;
-          description
-            "List of nodes within a CLLI";
-        }
-        list equipment-required {
-          key "equipment-identifier";
-          description
-            "List of required equipment, including equipment type, state and
-             quantity";
-          uses equipment-info;
-        }
-      }
-    }
-  }
-
-  grouping service-identifiers-container {
-    container service-identifiers {
-      leaf service-name {
-        type string;
-      }
-      leaf common-id {
-        type string;
-      }
-      leaf version-number {
-        type uint64;
-      }
-    }
-  }
-
-  grouping configuration-response-common {
-    container configuration-response-common {
-      leaf request-id {
-        type string;
-        mandatory true;
-      }
-      leaf response-code {
-        type string;
-        mandatory true;
-      }
-      leaf response-message {
-        type string;
-      }
-      leaf ack-final-indicator {
-        type string;
-        mandatory true;
-      }
-    }
-  }
-
-  grouping response-parameters {
-    container response-parameters {
-      description
-        "Violated soft constraints";
-      uses org-openroadm-routing-constraints:routing-constraints;
-    }
-  }
-
-  grouping subrate-eth-sla {
-    container subrate-eth-sla {
-      presence "Explicit assignment of subrate ethernet allocation";
-      description
-        "SLA (Service Level Agreement) for subrate Ethernet";
-      uses org-openroadm-common-types:eth-rate-and-burst-size;
-    }
-  }
-
-  grouping external-interface-characteristics {
-    list supported-operational-modes {
-      key "preference";
-      description
-        "list of supported operational modes associated to a preference
-         for their selection by the Path Computation Engine (1 is the highest priority)
-         only one operational mode shall be associated to a preference. 2 leaves present
-         since this mode could be either specific or an openROADM operational-mode";
-      leaf preference {
-        type int16;
-        description
-          "preference/priority associated to the operational mode";
-      }
-      leaf operational-mode-id {
-        type string;
-        description
-          "the supported operational mode : either openROADM or specific ";
-      }
-    }
-    leaf min-frequency {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      description
-        "Minimum acceptable Frequency in THz.";
-    }
-    leaf max-frequency {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      description
-        "Minimum acceptable Frequency in THz.";
-    }
-    leaf min-granularity {
-      type org-openroadm-common-optical-channel-types:frequency-GHz;
-      description
-        "Minimum grid granularity in GHz.";
-    }
-  }
-
-  grouping service-endpoint {
-    leaf service-format {
-      type org-openroadm-service-format:service-format;
-      mandatory true;
-      description
-        "Format of the requested service: Ethernet, OTU, etc.";
-    }
-    leaf service-rate {
-      when "../service-format != 'OMS' and ../service-format != 'ODU'" {
-        description
-          "service rate not applicable when service
-           format is roadmline or ODU; valid for OTU since service-rate has
-           already been supported for wdm layer OTU services (100 for OTU4)";
-      }
-      type uint32;
-      description
-        "Rate of the requested service in GBps";
-    }
-    leaf is-split-lambda {
-      type boolean;
-      default "false";
-      description
-        "This flag allows to specify whether to use split-lambda. It can be user controlled
-         (or specified) or controller initiated. This is only applicable for line-service or
-         network ports";
-    }
-    leaf split-lambda-service-rate {
-      when "../is-split-lambda = 'true' and
-            ../service-format != 'OMS' and
-            ../service-format != 'ODU'";
-      type uint32;
-      description
-        "This service rate is only applicable when the split-lambda is enabled.
-         It will help to identify how many wavelengths to use. Only applicable
-         to the WDM layer and OTUCn services.";
-    }
-    leaf other-service-format-and-rate {
-      type string;
-      description
-        "Used when service-format is set to other in the bookend xponder use case.
-         The use of other-service-format-and-rate is not standardized in the Open ROADM MSA
-         and intended to allow the controller to support non-Open ROADM service formats.
-         This value encodes both the service format and the rate supported.
-         This field should not be specified when service format != other.";
-    }
-    leaf otu-service-rate {
-      when "../service-format = 'OTU'" {
-        description
-          "only applicable for OTU services";
-      }
-      type identityref {
-        base org-openroadm-otn-common-types:otu-rate-identity;
-      }
-      description
-        "OTU Rate of the requested service";
-    }
-    leaf odu-service-rate {
-      when "../service-format = 'ODU'" {
-        description
-          "only applicable for ODU services";
-      }
-      type identityref {
-        base org-openroadm-otn-common-types:odu-rate-identity;
-      }
-      description
-        "ODU Rate of the requested service";
-    }
-    leaf ethernet-encoding {
-      when "(../service-format='Ethernet')
-            and
-            (../service-rate=10)" {
-        description
-          "Applicable only to Ethernet 10G services";
-      }
-      type ethernet-encoding-type;
-      description
-        "Ethernet encoding type";
-    }
-    leaf mapping-mode {
-      when "(../service-format='Ethernet')
-            and
-            (../service-rate=10)" {
-        description
-          "Mapping Mode, currently only defined for Ethernet 10G services";
-      }
-      type mapping-mode-type;
-      description
-        "Mapping mode.";
-    }
-    leaf client-phy-code {
-      type identityref {
-        base org-openroadm-common-phy-codes:client-phy-code-identity;
-      }
-      description
-        "Client PHY Code for the service end point.";
-    }
-    uses otn-attributes-grp;
-    leaf clli {
-      type string;
-      mandatory true;
-      description
-        "CLLI. Note this CLLI must match the site associated with the device-id of this
-         endpoint";
-    }
-    uses org-openroadm-resource-types:device-id;
-    list tx-direction {
-      key "index";
-      leaf index {
-        type uint8;
-        description
-          "Used to list tx-direction attributes for each split-lambda wavelength/service";
-      }
-      uses service-port;
-      uses service-lgx;
-      uses service-tail;
-    }
-    list rx-direction {
-      key "index";
-      leaf index {
-        type uint8;
-        description
-          "used to list rx-direction attributes for each split-lambda wavelength/service";
-      }
-      uses service-port;
-      uses service-lgx;
-      uses service-tail;
-    }
-    leaf optic-type {
-      type org-openroadm-common-equipment-types:optic-types;
-    }
-    container router {
-      description
-        "Needed for communication with DWDM pluggable";
-      leaf node-id {
-        type org-openroadm-common-node-types:node-id-type;
-        description
-          "Node id. This is reported against the service, but may not get reflected in the service in the network.";
-      }
-      leaf ip-address {
-        type inet:ip-address;
-        description
-          "Router IP Address. This is reported against the service, but may not get reflected in the service in the network.";
-      }
-      leaf url {
-        type string;
-        description
-          "URL needed for communication with DWDM pluggable. This is reported against the service, but may not get reflected in the service in the network.";
-      }
-    }
-    leaf user-label {
-      type string;
-      mandatory false;
-      description
-        "Label for service endpoint, defined by the user";
-    }
-    uses ethernet-subrate-attributes-grp;
-    leaf project-id {
-        type string;
-        description
-          "Project identifier for the service end point";
-     }
-     leaf project-note {
-        type string;
-        description
-          "Additional details associated with the service end point project";
-     }
-  }
-
-  typedef existing-resource-reuse-type {
-    description
-      "Used to indicate the type of resource that the existing service
-      can reuse wherever possible (best-effort)";
-    type enumeration {
-      enum regenerator {
-        description
-          "Indicates reuse regenerator";
-        value 1;
-      }
-      enum wavelength {
-        description
-          "Indicates reuse of wavelength";
-        value 2;
-      }
-      enum spectrum-portion {
-        description
-          "Indicates reuse of frequency slot(s). Reuse the exact       
-          or partial portion of the spectrum of the original service
-          specturm";
-        value 3;
-      }
-      enum xponder {
-        description
-          "This could be a transponder/muxponder/switchponder";
-        value 4;
-      }
-      enum all {
-        description
-          "Reuse all possible options";
-          value 99;
-      }
-    }
-  }
-
-  grouping existing-service-grouping {
-    container existing-service-attributes {
-      description
-        "This consists of all the attributes related to the existing service";
-      leaf is-existing {
-        type boolean;
-        description
-          "This is set true if feasibility check is on an existing service with or 
-          without new constraints. Feasibility is done as if current service 
-          and its resources are released";
-      }
-      leaf existing-service-name {
-        when "../is-existing = 'true'";
-        type string; 
-        description
-          "Name of the existing service";
-      }
-      leaf reuse-existing-resources {
-        type boolean;
-        description
-          "If true reuse the existing equipment wherever possible";
-      }
-      leaf-list reusable-existing-resources {
-        when "../reuse-existing-resources = 'true'";
-        type existing-resource-reuse-type;
-        description
-          "List of existing resources that can be reused;
-          This list is enabled only when the reuse-existing-equipment 
-          is set true";
-      }
-    }
-  }
-
-  grouping sdnc-request-header {
-    container sdnc-request-header {
-      leaf request-id {
-        type string;
-      }
-      leaf rpc-action {
-        type rpc-actions;
-      }
-      leaf notification-url {
-        type string;
-      }
-      leaf request-system-id {
-        type string;
-      }
-    }
-  }
-
-  grouping service-port {
-    container port {
-      description
-        "From the device model perspective the port-device-name plus the port-circuit-pack-name plus the port-name uniquely identifies the port.
-         From the network model perspective the openroadm-topology-ref plus port-device-name plus port-name uniquely identify the termination point in the network model.";
-      leaf port-device-name {
-        type string;
-      }
-      leaf port-circuit-pack-name {
-        type string;
-      }
-      leaf port-circuit-pack-type {
-        type string;
-      }
-      leaf port-type {
-        type string;
-      }
-      leaf port-name {
-        type string;
-      }
-      leaf port-rack {
-        type string;
-      }
-      leaf port-shelf {
-        type string;
-      }
-      leaf port-slot {
-        type string;
-      }
-      leaf port-sub-slot {
-        type string;
-      }
-    }
-  }
-
-  grouping service-lgx {
-    container lgx {
-      leaf lgx-device-name {
-        type string;
-      }
-      leaf lgx-port-name {
-        type string;
-      }
-      leaf lgx-port-rack {
-        type string;
-      }
-      leaf lgx-port-shelf {
-        type string;
-      }
-    }
-  }
-
-  grouping service-tail {
-    container tail {
-      container tail-roadm {
-        description
-          "ROADM on which the transponder is connected to (TID, IP Address,
-           or FQDN)";
-        uses org-openroadm-resource-types:device-id;
-      }
-      container xponder-port {
-        description
-          "Muxponder port used in tail, that will get used as a service endpoint.";
-        leaf circuit-pack-name {
-          type string;
-        }
-        leaf port-name {
-          type string;
-        }
-      }
-      leaf tail-roadm-port-aid {
-        type string;
-        description
-          "This will provide the transponder port needed to inter-city ROADM
-           connection";
-      }
-      leaf tail-roadm-port-rack-location {
-        type string;
-        description
-          "Transponder's location";
-      }
-    }
-  }
-
-  grouping service-information {
-    leaf due-date {
-      type yang:date-and-time;
-      description
-        "Date and time service to be turn up. If time is not specified for a given date,
-         default to midnight. Service turned up immediately if no due date is specified";
-    }
-    leaf end-date {
-      type yang:date-and-time;
-      mandatory false;
-      description
-        "Date and time service to be removed";
-    }
-    uses eventHorizon;
-    leaf nc-code {
-      type string;
-      description
-        "NC code applied to wavelength service only. This is reported against the service,
-         but may not get reflected in the service in the network.";
-    }
-    leaf nci-code {
-      type string;
-      description
-        "NCI code applied to wavelength service only. This is reported against the service,
-         but may not get reflected in the service in the network.";
-    }
-    leaf secondary-nci-code {
-      type string;
-      description
-        "NC code applied to wavelength service only. This is reported against the service,
-         but may not get reflected in the service in the network.";
-    }
-    leaf customer {
-      type string;
-      description
-        "To be included in ticket information. This is reported against the service,
-         but may not get reflected in the service in the network.";
-    }
-    leaf customer-contact {
-      type string;
-      description
-        "Customer contact information to be included in ticket information.
-         This is reported against the service, but may not get reflected in the service
-         in the network.";
-    }
-    leaf operator-contact {
-      type string;
-      description
-        "Operator contact information to be included in ticket information.
-         This is reported against the service, but may not get reflected in the service
-         in the network.";
-    }
-    leaf service-layer {
-      type service-layer-type;
-      default "wdm";
-      description
-        "Layer associated with service (e.g. wdm or otn)";
-    }
-    leaf clli-network-ref {
-      type string;
-      description
-        "Assumption: a service would not span multiple clli-network layers.
-         Reference to the network-id of the clli-network layer.";
-    }
-    leaf openroadm-network-ref {
-      type string;
-      description
-        "Assumption: a service would not span multiple openroadm-network layers.
-         Reference to the network-id of the openroadm-network layer.";
-    }
-    leaf openroadm-topology-ref {
-      type string;
-      description
-        "Assumption: a service would not span multiple topology layers.
-         Reference to the network-id of either the openroadm-topology
-         or the otn-topology layer depending upon service-layer (wdm or otn).";
-    }
-    leaf sla-id {
-      type string;
-      description
-        "Service Level Agreement";
-    }
-    leaf bandwidth-calendaring {
-      type boolean;
-      description
-        "True if service is active only during a specific time period";
-    }
-    container bw-calendaring-parameters {
-      when "../bandwidth-calendaring = 'true'" {
-        description
-          "Includes all attributes associated with bandwidth calendaring option.
-           Used to set service profile : each service corresponds to one specific
-           time-period. Services defined on complementary time periods can be linked
-           together through the coupled-service attribute ";
-      }
-      list bw-calendaring-coupled-services {
-        key "service-index";
-        leaf service-index {
-          type uint16;
-          description
-            "service-number of the service that may be associated to the considered service";
-        }
-        leaf service-name {
-          type string;
-          description
-            "service-name of the service that may be associated to the considered service in service-list";
-        }
-        leaf common-id {
-          type string;
-          description
-            "common-id of the service that may be associated to the considered service in temp-service-list";
-        }
-        leaf version-number {
-          type uint64;
-          description
-            "common-id of the service that may be associated to the considered service in versioned-service-list";
-        }
-      }
-      list recurrence-pattern {
-        key "recurrence-id";
-        leaf recurrence-id {
-          type uint32;
-          description
-            "id of the pattern defining the time during which the service is active ";
-        }
-        leaf-list day-of-the-week {
-          type enumeration {
-            enum Monday {
-              value 1;
-            }
-            enum Tuesday {
-              value 2;
-            }
-            enum Wednesday {
-              value 3;
-            }
-            enum Thursday {
-              value 4;
-            }
-            enum Friday {
-              value 5;
-            }
-            enum Saturday {
-              value 6;
-            }
-            enum Sunday {
-              value 7;
-            }
-          }
-          description
-            "Each day for which the service is active from stat-time to end-time";
-        }
-        leaf start-time {
-          type string {
-            pattern '\d{2}:\d{2}:\d{2}';
-          }
-          description
-            "start time expressed as hour:min:seconds";
-        }
-        leaf end-time {
-          type string {
-            pattern '\d{2}:\d{2}:\d{2}';
-          }
-          description
-            "end time expressed as hour:min:seconds";
-        }
-      }
-    }
-  }
-
-  grouping routing-metric {
-    container routing-metric {
-      description
-        "Describes the metrics used to route a service.
-         All parameters of integer type, to set the priority of the routing criterion
-         '0' means the criterion is not used,
-         '1'coresponds to the highest priority,
-         '255'coresponds to the lowest priority.
-         Priority might be handled in several way : 1) To select one from several paths with the same metrics,
-         using lower priority metrics until metrics calculated allow the selection; 2) Using priority as
-         a weight for composite metric calculation";
-      leaf wdm-hop-count {
-        type uint8 {
-          range "0..255";
-        }
-        default "1";
-        description
-          "Metric corresponding to the number of hop in the wdm layer";
-      }
-      leaf otn-hop-count {
-        type uint8 {
-          range "0..255";
-        }
-        default "0";
-        description
-          "Metric corresponding to the number of hop in the otn layer";
-      }
-      leaf wdm-load {
-        type uint8 {
-          range "0..255";
-        }
-        default "0";
-        description
-          "Metric corresponding to the load of the wdm layer
-           Can be used to avoid using heavy loaded links ";
-      }
-      leaf otn-load {
-        type uint8 {
-          range "0..255";
-        }
-        default "0";
-        description
-          "Metric corresponding to the load of the otn layer.
-           Can be used to avoid using heavy loaded links/switchs ";
-      }
-      leaf latency {
-        type uint8 {
-          range "0..255";
-        }
-        default "0";
-        description
-          "Metric corresponding to the latency. Total path latency can be calculated from
-           SRLG length of the OMS and the latency introduced by the equipment";
-      }
-      leaf distance {
-        type uint8 {
-          range "0..255";
-        }
-        default "0";
-        description
-          "Metric associated with the distance. Total path distance can be
-           calculated from SRLG length of the OMS";
-      }
-      leaf wdm-TE-metric {
-        type uint8 {
-          range "0..255";
-        }
-        default "0";
-        description
-          "Used when routing shall be performed according to specific pre-defined
-           TE-Metric. Total path metric can be calculated from OMS TE-metric attribute
-           defined in org-openroadm-link module";
-      }
-      leaf adaptation-number {
-        type uint8 {
-          range "0..255";
-        }
-        default "0";
-        description
-          "Metric associated with the adaptation between layers. Total path metric can
-           can be calculated from the total number of transition between layers";
-      }
-      leaf otn-TE-metric {
-        type uint8 {
-          range "0..255";
-        }
-        default "0";
-        description
-          "Used when routing shall be performed according to specific pre-defined
-           metric associated with OTN (OTU/ODU level)";
-      }
-    }
-  }
-
-  grouping service-resiliency {
-    container service-resiliency {
-      leaf resiliency {
-        type identityref {
-          base service-resiliency-type-identity;
-        }
-        description
-          "describes the type of resiliency and the associated layer ";
-      }
-      leaf revertive {
-        when "../resiliency != 'unprotected' and ../resiliency != 'unprotected-diversely-routed'" {
-          description
-            "revertive not applicable when service is neither protected nor restorable";
-        }
-        type boolean;
-        description
-          "defines if the service shall revert to the initial working path
-           after protection or restoration has been triggered and fault condition
-           has disappeared";
-      }
-      leaf wait-to-restore {
-        when "../revertive = 'true'" {
-          description
-            "wait-to-restore applies for service defined as revertive ";
-        }
-        type uint64;
-        units "ms";
-        description
-          "time delay to revert to initial path after conditions for reversion are satisfied";
-      }
-      leaf holdoff-time {
-        when "../resiliency != 'unprotected' and ../resiliency != 'unprotected-diversely-routed'" {
-          description
-            "holdoff-time applies when services are either protected or restorable";
-        }
-        type uint64;
-        units "ms";
-        description
-          "time delay to initiate a protection or restoration event";
-      }
-      leaf pre-calculated-backup-path-number {
-        when "../resiliency = 'restorable' or ../resiliency = 'external-trigger-restorable'" {
-          description
-            "when service is restorable, defines the
-             number of paths that shall be or have been pre-calculated";
-        }
-        type uint8;
-        description
-          "Associated to service-create / reconfigure / feasibility-check rpcs
-           --> defines the target number of backup-paths to be calculated by PCE. This is an
-           optional parameter : operator can provide it to conform with specific engineering rules.
-           If not provided, PCE will evaluate the number of backup path to be provided automously.
-           Associated with service --> gives the effective number of backup-paths
-           returned/calculated by PCE that can be find in topology container";
-      }
-      container coupled-service {
-        when "../resiliency = 'unprotected-diversely-routed'" {
-          description
-            "for unprotected-diversely-routed services only one path is defined.
-             Allows providing a link between services that are coupled
-             through a routing disjonction criterion";
-        }
-        list coupled-services {
-          key "service-index";
-          leaf service-index {
-            type uint16;
-            description
-              "service-number of the service that may be routed disjointly to the considered service";
-          }
-          leaf service-name {
-            type string;
-            description
-              "service-name of the service that may be routed disjointly to the considered service in service-list";
-          }
-          leaf common-id {
-            type string;
-            description
-              "common-id of the service that may be routed disjointly to the considered service in temp-service-list";
-          }
-          leaf version-number {
-            type uint64;
-            description
-              "common-id of the service that may be routed disjointly to the considered service in versioned-service-list";
-          }
-        }
-      }
-    }
-  }
-
-  grouping service-order {
-    description
-      "Service Order information for service";
-    leaf order-id {
-      type string;
-      description
-        "Order identifier for this service";
-    }
-    leaf order-note {
-      type string;
-      description
-        "Additional details associated with the service order";
-    }
-  }
-
-  grouping resource-status {
-    description
-      "Grouping used to consisistenty apply resource-status
-       naming to appropriate RPC.";
-    leaf resource-status {
-      type resource-status-type;
-      description
-        "identifies the state of network resources required
-         to complete a service request.";
-    }
-  }
-
-  grouping service {
-    leaf service-name {
-      type string;
-      description
-        "Identifier for the service to be created in
-         the ROADM network, e.g., CLFI, CLCI, etc.";
-    }
-    leaf common-id {
-      type string;
-      description
-        "To be used by the ROADM controller to identify the routing
-         constraints received from planning application (PED).";
-    }
-    uses service-order;
-    uses sdnc-request-header;
-    uses service-resiliency;
-    uses routing-metric;
-    leaf connection-type {
-      type connection-type;
-      mandatory true;
-      description
-        "Connection type";
-    }
-    leaf lifecycle-state {
-      type org-openroadm-common-state-types:lifecycle-state;
-      description
-        "Lifecycle State of service. Whether it is planned, deployed, in maintenance, etc.";
-    }
-    uses resource-status;
-    leaf administrative-state {
-      type org-openroadm-equipment-states-types:admin-states;
-      description
-        "Administrative State: Intended state of service";
-    }
-    leaf operational-state {
-      type org-openroadm-common-state-types:state;
-      config false;
-      description
-        "Operational State: Actual state of service";
-    }
-    leaf condition {
-      type service-condition;
-      description
-        "Service Condition: Additional information about the state of the service. Only sent when applicable.";
-    }
-    container service-a-end {
-      uses service-endpoint;
-    }
-    container service-z-end {
-      uses service-endpoint;
-    }
-    uses org-openroadm-routing-constraints:routing-constraints;
-    uses service-information;
-    leaf latency {
-      type decimal64 {
-        fraction-digits 3;
-      }
-      description
-        "One-way latency (in milliseconds) on service";
-      units "milliseconds";
-    }
-    leaf-list fiber-span-srlgs {
-      type string;
-      description
-        "Shared risk link group identifiers";
-    }
-    list equipment-srgs {
-      key "srg-number";
-      uses org-openroadm-resource-types:srg-number;
-    }
-    leaf-list supporting-service-name {
-      type string;
-      description
-        "The service name that this runs over top. If connection-type is service, then this is the related
-         connection-type = infrastructure service, for example.";
-    }
-    leaf current-active-path-id {
-      type uint8;
-      description
-        "defines the current active path : '0' if active path is the working path
-         id of the active backup path if protection or restoration has been triggered";
-    }
-    container topology {
-      description
-        "topology corresponds to working-path which is the default path. It defines the initial path
-         to which services defined as revertive may revert to when the failure condition disappear";
-      uses org-openroadm-topology:topology;
-    }
-    container backup-topology {
-      list backup-path {
-        key "backup-path-id";
-        leaf backup-path-id {
-          type uint8 {
-            range "1..255";
-          }
-          description
-            "Several backup paths may be used when backup-paths are pre-calculated.
-             Backup-path-id avoids 0 which is associated with working path in current-active-path";
-        }
-        leaf failure-case-id {
-          type string;
-          description
-            "A failure case Id can be used to associate a backup-path to a specific failure (srlg, OMS,...)";
-        }
-        uses org-openroadm-topology:topology;
-      }
-    }
-    container network-topology {
-      uses org-openroadm-topology:network-topology;
-    }
-    container network-backup-topology {
-      list backup-path {
-        key "backup-path-id";
-        leaf backup-path-id {
-          type uint8 {
-            range "1..255";
-          }
-          description
-            "Several backup paths may be used when backup-paths are pre-calculated.
-             Backup-path-id avoids 0 which is associated with working path in current-active-path";
-        }
-        leaf failure-case-id {
-          type string;
-          description
-            "A failure case Id can be used to associate a backup-path to a specific failure (srlg, OMS,...)";
-        }
-        uses org-openroadm-topology:network-topology;
-      }
-    }
-    leaf is-bandwidth-locked {
-      type boolean;
-      default "false";
-      description
-        "Bandwidth lock (true, false) indicates whether the service is administratively
-         prohibited from taking on more capacity - ie whether it can be used as a supporting
-         service in any new service creations. Unlike administrative status, this does not
-         impact any previous planned or deployed services.";
-    }
-  }
-
-  grouping service-notification-result {
-    leaf service-name {
-      type string;
-      description
-        "Identifier for the service e.g., CLFI, CLCI, etc.";
-    }
-    leaf version-number {
-      type uint64;
-      description
-        "Identifier for the versioned service";
-    }
-    leaf common-id {
-      type string;
-      description
-        "Identifier for the temp service";
-    }
-    leaf actual-date {
-      type yang:date-and-time;
-      description
-        "Actual date and time (if successful)";
-    }
-  }
-
-  grouping service-port-list {
-    list port {
-      key "circuit-pack-name port-name";
-      description
-        "List allows to output more than one piece of equipment per CLLI;
-         Port-name is unique in the context of circuit-pack";
-      leaf circuit-pack-name {
-        type string;
-      }
-      leaf port-name {
-        type string;
-      }
-      leaf lifecycle-state {
-        type org-openroadm-common-state-types:lifecycle-state;
-      }
-    }
-  }
-
-  grouping equipment-info {
-    leaf equipment-type {
-      type string;
-      description
-        "The set of valid value is derived from the equipment-type grouping used in the device model.";
-    }
-    leaf equipment-identifier {
-      type string;
-    }
-    leaf lifecycle-state {
-      type org-openroadm-common-state-types:lifecycle-state;
-    }
-    leaf equipment-rack {
-        type string;
-      }
-      leaf equipment-shelf {
-        type string;
-      }
-      leaf equipment-slot {
-        type string;
-      }
-      leaf equipment-sub-slot {
-        type string;
-      }
-      leaf is-reused {
-        type boolean;
-        description
-          "This is set true if the equipment-required is being reused for
-          service roll";
-      }
-    uses service-port-list;
-  }
-
-  grouping eventHorizon {
-    leaf eventHorizonStart {
-      type yang:date-and-time;
-      description
-        "Start time to ensure that the service is routable and viable. Required resources shall
-         be considered reserved from this time. If not provided, defaults to due-date.";
-    }
-    leaf eventHorizonEnd {
-      type yang:date-and-time;
-      description
-        "End time to ensure that the service is routable and viable. Required resources shall
-         be considered reserved until this time. If not provided, defaults to end-date.";
-    }
-  }
-
-  grouping service-hierarchy {
-    leaf service-identifier {
-      type string;
-      description
-        "Based on the level in the service hierarchy, this indentifier can be for the
-         proposed or existing service";
-    }
-    leaf service-layer {
-      type service-layer-type;
-      default "wdm";
-      description
-        "Layer associated with service (e.g. wdm or otn)";
-    }
-    container service-a-end {
-      leaf clli {
-        type string;
-        description
-          "Based on the level in the service hierarchy, A-end CLLI of the
-           proposed or existing service.";
-      }
-    }
-    container service-z-end {
-      leaf clli {
-        type string;
-        description
-          "Based on the level in the service hierarchy, Z-end CLLI of the
-           proposed or existing service.";
-      }
-    }
-    list supporting-service {
-      key "id";
-      uses supporting-service;
-    }
-    container transport-assignment {
-      container mc-ttp {
-        description
-          "Media Channel Trail Termination Point (MC-TTP)";
-        uses org-openroadm-resource:mc-ttp-attributes;
-      }
-      list nmc-ctp {
-        key "id";
-        description
-          "List of Network Media Channel Connection Termination Point (NMC-CTP)";
-        leaf id {
-          type string;
-          description
-            "This used to indentify the NMC in the MC. For example split-lambda would
-            have two NMCs";
-        }
-        uses org-openroadm-resource:nmc-ctp-attributes;
-      }
-      container odu-allocation {
-        description
-          "parent odu allocation";
-        leaf trib-port-number {
-          type uint16 {
-            range "1 .. 80";
-          }
-          description
-            "Assigned tributary port number in parent OPU";
-        }
-        choice trib-slots-choice {
-          description
-            "trib slot selection";
-          case opu {
-            leaf  min-trib-slot {
-              type uint16;
-              description
-                "Minimum assigned trib slots occupied in parent OPU MSI";
-            }
-            leaf  max-trib-slot {
-              type uint16;
-              description
-                "Maximum assigned trib slots occupied in parent OPU MSI";
-            }
-          }
-          case opucn {
-            leaf opucn-min-trib-slot {
-              type org-openroadm-otn-common-types:opucn-trib-slot-def;
-              description
-                "Minimum OPUCn 5G trib slots in the form of TS #A.B (G.709)";
-            }
-            leaf opucn-max-trib-slot {
-              type org-openroadm-otn-common-types:opucn-trib-slot-def;
-              description
-                  "Maximum OPUCn 5G trib slots in the form of TS #A.B (G.709)";
-            }
-          }
-        }
-      }
-      leaf is-reused {
-        type boolean;
-        description
-          "This flag is true if the spectral assignment overlaps--in part or in full--with 
-          that of the active instance of the service. A determination whether the overlap 
-          is full or partial requires a detailed comparison of spectral assignments; it 
-          is not indicated here.";
-      }
-    }
-  }
-
-  grouping supporting-service {
-    leaf service-identifier {
-      type string;
-    }
-    leaf id {
-      type string;
-    }
-    container service-a-end {
-      uses supporting-service-detail;
-    }
-    container service-z-end {
-      uses supporting-service-detail;
-    }
-  }
-
-  grouping supporting-service-detail {
-    leaf service-format {
-      type org-openroadm-service-format:service-format;
-      mandatory true;
-      description
-        "Format of the requested service: Ethernet, OTU, etc.";
-    }
-    leaf service-rate {
-      when "../service-format != 'OMS' and ../service-format != 'ODU'" {
-        description
-          "service rate not applicable when service
-           format is roadmline or ODU; valid for OTU since service-rate has
-           already been supported for wdm layer OTU services (100 for OTU4)";
-      }
-      type uint32;
-      description
-        "Rate of the requested service in GBps";
-    }
-    leaf other-service-format-and-rate {
-      type string;
-      description
-        "Used when service-format is set to other in the bookend xponder use case.
-         The use of other-service-format-and-rate is not standardized in the Open ROADM MSA
-         and intended to allow the controller to support non-Open ROADM service formats.
-         This value encodes both the service format and the rate supported.
-         This field should not be specified when service format != other.";
-    }
-    leaf otu-service-rate {
-      when "../service-format = 'OTU'" {
-        description
-          "only applicable for OTU services";
-      }
-      type identityref {
-        base org-openroadm-otn-common-types:otu-rate-identity;
-      }
-      description
-        "OTU Rate of the requested service";
-    }
-    leaf odu-service-rate {
-      when "../service-format = 'ODU'" {
-        description
-          "only applicable for ODU services";
-      }
-      type identityref {
-        base org-openroadm-otn-common-types:odu-rate-identity;
-      }
-      description
-        "ODU Rate of the requested service";
-    }
-    leaf clli {
-      type string;
-      description
-        "CLLI of the supporting service";
-    }
-    leaf node-id {
-      type org-openroadm-common-node-types:node-id-type;
-      description
-        "Node id. This is reported against the service, but may not get
-         reflected in the service in the network.";
-    }
-  }
-
-  grouping max-regeneration-options {
-    leaf max-regeneration-options {
-      type uint8;
-      default "1";
-      description
-        "Max regeneration options, is maximum number of regeneration-option-list elements requested in
-         service-feasibility output. RNC can return less number of regeneration-options based on it's
-         calculation but should not return more than max-regeneration-options. The goal of this field
-         is to avoid RNC from having performance issues.";
-    }
-  }
-
-  grouping regeneration-option-list {
-    list regeneration-option-list {
-      key "regeneration-option-rank";
-      leaf regeneration-option-rank {
-        type uint8;
-        description
-          "Regen option rank is derived rank based on optical performance or based on other metrics.";
-      }
-      list regeneration-clli-list {
-        key "sequence-id";
-        leaf sequence-id {
-          type uint8;
-          description
-            "Sequence id will define order of regeneration location for output path in A to Z direction.";
-        }
-        leaf regeneration-clli {
-          type string;
-          description
-            "CLLI for the site where regeneraton is located or bring proposed.";
-        }
-        leaf lifecycle-state {
-          type org-openroadm-common-state-types:lifecycle-state;
-          description
-            "Lifecycle State for regeneration CLLI indicating whether regen is already deployed or being proposed
-             for at this site.";
-        }
-      }
-    }
-  }
-}
diff --git a/ordmodels/service/src/main/yang/org-openroadm-controller-customization@2021-12-10.yang b/ordmodels/service/src/main/yang/org-openroadm-controller-customization@2021-12-10.yang
deleted file mode 100644 (file)
index 49b2b27..0000000
+++ /dev/null
@@ -1,795 +0,0 @@
-module org-openroadm-controller-customization {
-  yang-version 1.1;
-  namespace "http://org/openroadm/controller/customization";
-  prefix org-openroadm-controller-customization;
-
-  import org-openroadm-common-link-types {
-    prefix org-openroadm-common-link-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-node-types {
-    prefix org-openroadm-common-node-types;
-    revision-date 2021-05-28;
-  }
-  import org-openroadm-common-service-types {
-    prefix org-openroadm-common-service-types;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-common-optical-channel-types {
-    prefix org-openroadm-common-optical-channel-types;
-    revision-date 2021-12-10;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of services.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2021-12-10 {
-    description
-      "Version 10.1";
-  }
-  revision 2021-09-24 {
-    description
-      "Version 10.0";
-  }
-  revision 2021-05-28 {
-    description
-      "Version 9.1";
-  }
-  revision 2021-03-26 {
-    description
-      "Version 9.0";
-  }
-  revision 2020-12-11 {
-    description
-      "Version 8.1";
-  }
-  revision 2020-09-25 {
-    description
-      "Version 8.0";
-  }
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-
-  typedef notification-events {
-    type enumeration {
-      enum roadm-to-roadm-link-creation {
-        value 1;
-      }
-      enum roadm-to-roadm-link-deletion {
-        value 2;
-      }
-      enum otn-link-creation {
-        value 3;
-      }
-      enum otn-link-deletion {
-        value 4;
-      }
-      enum xpdr-in-out-link-creation {
-        value 5;
-      }
-      enum xpdr-in-out-link-deletion {
-        value 6;
-      }
-      enum link-state-change {
-        value 7;
-      }
-      enum otn-link-bandwidth-usage-change {
-        value 8;
-      }
-      enum node-creation {
-        value 9;
-      }
-      enum node-deletion {
-        value 10;
-      }
-      enum node-state-change {
-        value 11;
-      }
-      enum tp-creation {
-        value 12;
-      }
-      enum tp-deletion {
-        value 13;
-      }
-      enum tp-state-change {
-        value 14;
-      }
-      enum ila-state-change {
-        value 15;
-      }
-      enum none {
-        value 16;
-      }
-      enum all {
-        value 17;
-      }
-    }
-    description
-      "Define possible notification events.";
-  }
-
-  typedef rmsa-policy {
-    type enumeration {
-      enum maximize-capacity {
-        value 1;
-      }
-      enum maximize-reach {
-        value 2;
-      }
-      enum minimize-margins {
-        value 3;
-      }
-      enum maximize-margins {
-        value 4;
-      }
-      enum customer-spectrum-partitioning {
-        value 5;
-      }
-      enum fragmentation-limiting-partitioning {
-        value 6;
-      }
-    }
-    description
-      "Defines Routing Modulation and and Spectrum Allocation policies.";
-  }
-
-  typedef non-rpc-related-notification-type {
-    type enumeration {
-      enum service-state-change {
-        value 1;
-      }
-      enum topology-change {
-        value 2;
-      }
-      enum exceeded-attenuation-crossing-warning {
-        value 3;
-      }
-      enum insufficient-margin-crossing-alarm {
-        value 4;
-      }
-      enum autonomous-optical-restoration-triggered {
-        value 5;
-      }
-    }
-    description
-      "Defines notification types for non rpc related notifications.";
-  }
-
-  typedef restriction-scope {
-    description
-      "Used to indicate the scope of global restrictions";
-    type enumeration {
-      enum service-create {
-        value 1;
-      }
-      enum service-create-bulk {
-        value 2;
-      }
-      enum temp-service-create {
-        value 3;
-      }
-      enum temp-service-create-bulk {
-        value 4;
-      }
-      enum service-feasibility-check {
-        value 5;
-      }
-      enum service-feasibility-check-bulk {
-        value 6;
-      }
-      enum service-roll {
-        value 7;
-      }
-      enum service-reconfigure {
-        value 8;
-      }
-      enum service-restoration {
-        value 9;
-      }
-      enum service-reroute {
-        value 10;
-      }
-      enum network-re-optimization {
-        value 11;
-      }
-      enum all {
-        value 12;
-      }
-    }
-  }
-
-  typedef restriction-type {
-    description
-      "Used to indicate type of restriction for site or node";
-    type enumeration {
-      enum add-drop {
-        value 1;
-        description 
-          "Add/drops are forbidden at the associated node (or site).
-          No service may add or drop at site/node";
-      }
-      enum pass-through {
-        value 2;
-        description
-          "Routing through the associated node (or site) is forbidden.
-          No service may pass-through at site/node";
-      } 
-      enum both {
-        value 3;
-        description
-          "Both adds/drops and through routing are forbidden for 
-          the associated node (or site).";
-      }
-    }
-  }
-
-  typedef regeneration-restriction-type {
-    description
-      "Used to indicate the type of restriction for the regeneration type";
-    type enumeration {
-      enum do-not-propose {
-        value 1;
-        description
-          "Proposing new regens (via a feasibility check) 
-          at the associated node (or site) is forbidden.";
-      }
-      enum do-not-use-existing {
-        value 2;
-        description
-          "Use of an existing regen at the associated node 
-          (or site) is forbidden.";
-      }
-      enum both {
-        value 3;
-        description
-          "Both use of existing regens and proposal of new regens
-           are forbidden at the associated node (or site).";
-      }
-    }
-  }
-
-  grouping spectrum-portion {
-    description
-      "Specifies a portion of the spectrum and its characteristics.";
-    leaf spectrum-portion-id {
-      type uint8;
-      description
-        "Identifies a spectrum portion with specific characteristics.";
-    }
-    leaf start-edge-frequency {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      description
-        "If present, this parameter states the lowest frequency to start
-         filling the spectrum, or a spectrum portion if stop-bandwidth
-         is also defined.";
-    }
-    leaf stop-edge-frequency {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      description
-        "If present and associated with a start frequency, this parameter
-         states the upper frequency broundary to fill the spectrum portion.
-         If present, in the absence of a start frequency, this parameter
-         states the highest frequency to start filling the spectrum.";
-    }
-    leaf-list dedicated-customer {
-      type string;
-      description
-        "Applies only to spectrum-portion (both start and stop edge frequencies
-         defined), when the spectrum-portion is dedicated to some customers.
-         This list shall includes customer-codes identifying specific customers.
-         No customer out of this list can share the bandwidth of this spectrum
-         portion";
-    }
-    leaf-list non-authorized-customer {
-      type string;
-      description
-        "Applies only to spectrum-portion (both start and stop edge frequencies
-         defined), when the spectrum-portion is dedicated to some customers.
-         This list shall includes customer-codes identifying specific customers,
-         that are not allowed to share the bandwidth of this spectrum portion";
-    }
-  }
-
-  grouping controller-parameters {
-    description
-      "Defines the structure of Service/controller-behaviour-settings container,
-       as well as the structure of controller-parameters-setting rpc input";
-    container non-rpc-related-notification-settings {
-      description
-        "Defines url, notification-type and type of events that shall / shall not
-         trigger notifications";
-      list non-rpc-related-notification-url-list {
-        key "non-rpc-related-notification-type";
-        description
-          "Used to record url to be used when forwarding non rpc related
-           notifications.";
-        leaf non-rpc-related-notification-type {
-          type non-rpc-related-notification-type;
-          description
-            "Type of notification will trigger specific leaves.";
-        }
-        leaf notification-url {
-          type string;
-          description
-            "Defines the url the notification is sent to.";
-        }
-        leaf-list events-disabling-notification {
-          when "../non-rpc-related-notification-type = 'topology-change'";
-          type notification-events;
-          description
-            "List of events for which notifications to SDN-Controller are
-             not desirabled. The filtering is currently activated only on topological
-             changes which could lead to large volumes of data.";
-        }
-        leaf-list events-triggering-notification {
-          when "../non-rpc-related-notification-type = 'topology-change'";
-          type notification-events;
-          description
-            "List of events for which notifications to SDN-Controller are
-             desirabled. Has the priority with regards to events-disabling-notification.
-             As an example if events-disabling-notification is set to all,
-             events set in events-triggering-notification will be the only
-             events to be notified";
-        }
-      }
-    }
-    container spectrum-filling {
-      description
-        "Spectrum may be filled according to specific rules to limit partitionning
-         or to dedicate part of the spectrum to some specific clients (customer-code)";
-      list spectrum-filling-rules {
-        key "rule-id";
-        description
-          "Defines a set of rules used to fill the spectrum";
-        leaf rule-id {
-          type uint16;
-          description
-            "defines the rule identifier";
-        }
-        leaf priority {
-          type uint8;
-          description
-            "The rules shall be applied sequentially according to their defined
-             priority (Highest:1, lowest:255). Rules with highest priority
-             will be applied first";
-        }
-        leaf RMSA-policy {
-          type rmsa-policy;
-          description
-            "Defines the Routing, Spectrum & Mode assignment policy to be applied";
-        }
-        container spectrum-range-of-appliance {
-          when "../RMSA-policy = 'customer-spectrum-partitioning' or ../RMSA-policy
-                              = 'fragmentation-limiting-partitioning'";
-          description
-            "Defines, when needed, the spectrum range to which the rule applies";
-          uses spectrum-portion;
-          leaf dedicated-signal-bandwidth-multiple {
-            when "../../RMSA-policy = 'fragmentation-limiting-partitioning'" {
-              description
-                "For fragmentation partitioning, defines which part of the spectrum
-                 will be used according to the signal spectral occupation";
-            }
-            type uint8;
-            description
-              "Used for spectrum partitioning to reduce fragmentation. Defines
-               the width of the service to be provisioned in the spectrum portion.
-               As an example a spectrum portion can be dedicated to signals with
-               a 50 GHz multiple spectral occupation, whereas another portion
-               of the spectrum is dedicated to signal with a 75 GHz multiple
-               spectral occupation";
-          }
-        }
-      }
-    }
-    container margins {
-      description
-        "defines all margins operator may want to specify";
-      leaf minimum-fiber-attenuation-bol-margin {
-        type org-openroadm-common-link-types:ratio-dB;
-        description
-          "Minimum fiber-attenuation margin to be considered for path calculation
-           at begining of life. The path calculation shall be made considering on
-           each link the engineered-spanloss (provided by an external sytem)
-           _The RNC shall raise an ALARM to the northbound Controller through
-           an insufficient-margin-crossing-alarm as soon as:
-           (span-loss-base + minimum-fiber-attenuation-bol-margin) - engineered-spanloss >
-           threshold-observed-vs-design-margin
-           _The RNC shall raise a WARNING to the northbound Controller through
-           an exceeded-attenuation-crossing-warning as soon as : (engineered-spanloss
-           - spanloss-current) < threshold-observed-vs-design-attenuation.";
-      }
-      leaf threshold-observed-vs-design-attenuation {
-        type org-openroadm-common-link-types:ratio-dB;
-        description
-          "Defines the threshold used to raise an alarm when fiber initial attenuation
-           is too close to the engineered-spanloss, meaning the value accounted for the
-           design has been underestimated and a new design shall triggered.";
-      }
-      leaf threshold-observed-vs-design-margin {
-        type org-openroadm-common-link-types:ratio-dB;
-        description
-          "Defines the threshold used to raise a warning when fiber measured attenuation
-           comes too close to the engineered-spanloss, so that remaining margin is considered
-           as too limited.";
-      }
-      list minimum-osnr-margins {
-        key "margin-id";
-        description
-          "osnr margins to be considered may differ according to the rate and the modulation format";
-        leaf margin-id {
-          type string;
-          description
-            "defines a margin for specific line-rates and modulation formats";
-        }
-        leaf minimum-osnr-margin-value {
-          type org-openroadm-common-link-types:ratio-dB;
-          description
-            "Minimum OSNR margin to be considered to keep an acceptable OSNR value
-              at end of life for the associated line-rates and modulation-formats";
-        }
-        leaf-list line-rates {
-          type uint64;
-          description
-            "Line-rates to which the osnr-margin applies";
-        }
-        leaf-list modulation-formats {
-          type org-openroadm-common-optical-channel-types:modulation-format;
-          description
-            "Modulation-formats to which the osnr-margin applies";
-        }
-      }
-    }
-    container metrics-policy {
-      description
-        "Defines how the RNC shall interpret the routing-metrics";
-      leaf composite-metric-versus-selective {
-        type boolean;
-        description
-          "Defines the way the RNC shall interpret the priorities defined
-           for the metrics: _ True corresponds to a weighted composite metric,
-           _ False corresponds to a selective priority based metric";
-      }
-    }
-    container regeneration-policy {
-      description
-        "Defines rules to place regenerators when a service-feasibility-check
-        rpc is invoked, or when a service-create rpc is invoked if spare
-        regenerators are already in place";
-      leaf global-placement {
-        type enumeration {
-          enum regenerator-banks {
-            value 1;
-          }
-          enum distributed {
-            value 2;
-          }
-        }
-        description
-          "To priviledge the positioning in specific locations";
-      }
-      leaf on-path-positioning {
-        type enumeration {
-          enum maximize-rate {
-            value 1;
-          }
-          enum latest-convenient-hop {
-            value 2;
-          }
-        }
-        description
-          "To position regenerators as far as possible on the path or optimizing
-          performances";
-      }
-      leaf path-symmetry {
-        type boolean;
-        description
-          "True corresponds to same location on A to Z and Z to A paths
-          False allows positioning regenerators in different nodes for A
-          to Z and Z to A paths";
-      }
-      leaf-list preferred-sites {
-          type string;
-          description
-            "CLLI's of the sites to be privileged when positioning regenerators
-            in specific locations";
-      }
-    }
-    container global-restriction {
-      container site-restriction {
-        leaf-list restriction-scopes {
-          description
-            "Set of the restriction scopes applicable for the site-restriction.
-            Default scope is set to all RPCs";
-          type restriction-scope;
-          default "all";
-        }
-        list site {
-          key "site-id";
-          description
-            "List of sites to be excluded from paths when routing.";
-          leaf site-id {
-            type string;
-          }
-          leaf restriction-type {
-            type restriction-type;
-            default "both";
-          }
-        }
-      }
-      container node-restriction {
-        leaf-list restriction-scopes {
-          description
-            "Set of the restriction scopes applicable for the node-restriction.
-            Default scope is set to all RPCs";
-          type restriction-scope;
-          default "all";
-        }
-        list node {
-          key "node-id";
-          description
-            "List of equipment nodes to be excluded from paths when routing.";
-          leaf node-id {
-            type org-openroadm-common-node-types:node-id-type;
-          }
-          leaf restriction-type {
-            type restriction-type;
-            default "both";
-          }
-        }
-      }
-      container regeneration-site-restriction {
-        leaf-list restriction-scopes {
-          description
-            "Set of the restriction scopes applicable for the regeneration-restriction.
-            Default scope is set to all RPCs";
-          type restriction-scope;
-          default "all";
-        }
-        list forbidden-site {
-          key "site-id";
-          description
-            "List of forbidden sites where regenerators shall not be placed";
-          leaf site-id {
-            type string;
-          }
-          leaf regeneration-restriction-type {
-            type regeneration-restriction-type;
-            default "both";
-          }
-        }
-      }
-      container regeneration-node-restriction {
-        leaf-list restriction-scopes {
-          description
-            "Set of the restriction scopes applicable for the regeneration-restriction.
-            Default scope is set to all RPCs";
-          type restriction-scope;
-          default "all";
-        }
-        list forbidden-node {
-          key "node-id";
-          description
-            "List of forbidden nodes where regenerators shall not be placed";
-          leaf node-id {
-            type org-openroadm-common-node-types:node-id-type;
-          }
-          leaf regeneration-restriction-type {
-            type regeneration-restriction-type;
-            default "both";
-          }
-        }
-      }
-      container link-restriction {
-        leaf-list restriction-scopes {
-          description
-            "Set of the resctriction scopes applicable for the link-restriction.
-            Default scope is set to all RPCs";
-          type restriction-scope;
-          default "all";
-        }
-        leaf-list link-id {
-          type string;
-          description
-            "List of links to be excluded from paths when routing.";
-        }
-      }
-      container supporting-service-restriction {
-        leaf-list restriction-scopes {
-          description
-            "Set of the resctriction scopes applicable for the supporting-services.
-            Default scope is set to all RPCs";
-          type restriction-scope;
-          default "all";
-        }
-        leaf-list supporting-services {
-          type string;
-          description
-            "List of supporting services to be excluded from paths when routing";
-        }
-      }
-    }
-    container default-behaviour {
-      description
-        "Parameters in this container are used to define default behaviour
-         in case optional parameters in rpc have not been defined";
-      leaf default-backup-path-number {
-        type uint16;
-        description
-          "0 means on the fly path calculation. Higher number corresponds
-           to backup path pre-calculation, and states the number of paths
-           to be calculated";
-      }
-      leaf reversion {
-        type boolean;
-        description
-          "Concerns reversion for service that have a resiliency defined
-           as restorable (restoration handled autonomously by the controller
-           at the WDM/OTN layer)";
-      }
-      leaf wait-to-restore {
-        type uint64;
-        units "ms";
-        description
-          "time delay to revert to initial path after conditions for reversion
-           are satisfied";
-      }
-      leaf holdoff-time {
-        type uint64;
-        units "ms";
-        description
-          "time delay to initiate a protection or restoration event";
-      }
-    }
-    container sla-definition {
-      description
-        "Definition of Service Level Agreements parameters";
-      list sla-parameters {
-        key "sla-id";
-        description
-          "Defines several SLA profiles and associated expected behaviour";
-        leaf sla-id {
-          type string;
-          description
-            "sla-id as defined by the operator";
-        }
-        leaf preemption {
-          type boolean;
-          description
-            "False : service shall never be preempted True : preemption of
-             the service is allowed";
-        }
-        leaf restoration-priority {
-          type uint8;
-          description
-            "The service shall be restored according to the defined priority
-             (First:1, latest:255). Services with highest priority will be restored first";
-        }
-      }
-    }
-    container failure-case-list {
-      description
-        "Use to provide information on failure cases associated with backup-path
-         pre-calculation: If PCE supports the calculation of multiple backup-paths,
-         these might be identified through a failure case-id corresponding
-         to a node, physical-link or logical-link failure";
-      list failure-case {
-        key "failure-case-id";
-        description
-          "Describes and identifies different failure-cases. Each of them can be
-           associated with one or several backup-paths in the context of backup-path
-           pre-calculation";
-        leaf failure-case-id {
-          type uint32;
-          description
-            "Identifies a failure case";
-        }
-        leaf failure-type {
-          type enumeration {
-            enum node-failure {
-              value 1;
-            }
-            enum logical-link-failure {
-              value 2;
-            }
-            enum physiscal-link-failure {
-              value 3;
-            }
-          }
-          description
-            "describes failure type that can be simulated in a planner or by a PCE
-             to calculate a backup path";
-        }
-        leaf-list nodes {
-          when "../failure-type = 'node-failure'" {
-            description
-              "List of nodes impacted by the failure (not only single failures
-               may be envisaged).";
-          }
-          type string;
-          description
-            "Nodes as they appear in the openroadm-topology or otn-topology
-             layer";
-        }
-        leaf-list logical-links {
-          when "../failure-type = 'logical-link-failure'" {
-            description
-              "List of logical links impacted by the failure (not only single
-               failures may be envisaged).";
-          }
-          type string;
-          description
-            "logical links as they appear in the otn-topology layer";
-        }
-        leaf-list physical-links {
-          when "../failure-type = 'physical-link-failure'" {
-            description
-              "List of physical links impacted by the failure (not only single
-               failures may be envisaged).";
-          }
-          type string;
-          description
-            "physical-links as they appear in the openroadm-topology layer";
-        }
-      }
-    }
-  }
-  
-  rpc controller-parameters-setting {
-    description
-      "Rpc used to populate controller parameters in the Data Store
-       of the RNC.";
-    input {
-      uses org-openroadm-common-service-types:sdnc-request-header;
-      uses controller-parameters;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-      leaf-list unsupported-customization-options {
-        type string;
-        description
-          "Provides a list of customization parameters that are not supported by
-           the RNC controller. Leaflist items corresponds to the yang nodes of
-           controller-parameters that the RNC does not handle. It is assumed that
-           for a yang node provided in the list, all nodes/leaves at a lower level
-           in the hierarchy are also not supported by the RNC";
-      }
-    }
-  }
-}
diff --git a/ordmodels/service/src/main/yang/org-openroadm-operational-mode-catalog@2021-12-10.yang b/ordmodels/service/src/main/yang/org-openroadm-operational-mode-catalog@2021-12-10.yang
deleted file mode 100644 (file)
index 51a059e..0000000
+++ /dev/null
@@ -1,624 +0,0 @@
-module org-openroadm-operational-mode-catalog {
-  namespace "http://org/openroadm/operational-mode-catalog";
-  prefix org-openroadm-operational-mode-catalog;
-
-  import org-openroadm-common-optical-channel-types {
-    prefix org-openroadm-common-optical-channel-types;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-common-link-types {
-    prefix org-openroadm-common-link-types;
-    revision-date 2019-11-29;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2021-12-10;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of common attributes.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2021-12-10 {
-    description
-      "Version 10.1";
-  }
-  revision 2021-09-24 {
-    description
-      "Version 10";
-  }
-
-  typedef impairment-type {
-    type enumeration {
-      enum CD-ps/nm;
-      enum PDL-dB;
-      enum PMD-ps;
-      enum power-dBm;
-      enum cross-talk-total-power-dB;
-      enum colorless-drop-adjacent-channel-crosstalk-GHz;
-    }
-    description
-      "definition of impairment type and unit used in penaty list";
-  }
-
-  grouping operational-mode-grid-parameters {
-    description
-      "main parameters required to describe grid usage";
-    leaf min-central-frequency {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      mandatory true;
-      description
-        "min supported frequency";
-    }
-    leaf max-central-frequency {
-      type org-openroadm-common-optical-channel-types:frequency-THz;
-      mandatory true;
-      description
-        "max supported frequency";
-    }
-    leaf central-frequency-granularity {
-      type org-openroadm-common-optical-channel-types:frequency-GHz;
-      mandatory true;
-      description
-        "granularity supported for the central frequency setting";
-    }
-    leaf min-spacing {
-      type org-openroadm-common-optical-channel-types:frequency-GHz;
-      mandatory true;
-      description
-        "minimum spacing required between 2 channels";
-    }
-  }
-
-  grouping operational-mode-roadm-base-parameters {
-    description
-      "main parameters used to qualify amplifier and ROADM (express/add/drop)";
-    leaf per-channel-Pin-min {
-      type org-openroadm-common-link-types:ratio-dB;
-      description
-        "minimum input power";
-    }
-    leaf per-channel-Pin-max {
-      type org-openroadm-common-link-types:ratio-dB;
-      description
-        "maximum output power";
-    }
-    leaf max-introduced-pdl {
-      type org-openroadm-common-link-types:ratio-dB;
-      description
-        "polarization dependent gain/loss";
-    }
-    leaf max-introduced-dgd {
-      type decimal64 {
-        fraction-digits 2;
-      }
-      units "ps/nm";
-      description
-        "Maximum diferential group delay";
-    }
-    leaf max-introduced-cd {
-      type decimal64 {
-        fraction-digits 2;
-      }
-      units "ps";
-      description
-        "Maximum introduced chromatic dispersion";
-    }
-  }
-
-  grouping polynomial-fit {
-       description
-         "polynomial fit used to model noise mask";
-    container osnr-polynomial-fit {
-        description
-          "describe the osnr contribution of amplifier/roadm
-           OSNR (dB/0.1nm) = A*Pin^3+B*Pin^2+C*Pin+D, Pin (dBm) ";
-        leaf A {
-          type decimal64 {
-            fraction-digits 8;
-          }
-          description
-            "A*Pin^3";
-        }
-        leaf B {
-          type decimal64 {
-            fraction-digits 8;
-          }
-          description
-            "B*Pin^2";
-        }
-        leaf C {
-          type decimal64 {
-            fraction-digits 8;
-          }
-          description
-            "C*Pin";
-        }
-        leaf D {
-          type decimal64 {
-            fraction-digits 8;
-          }
-          description
-            "Constant";
-        }
-      }
-  }
-  
-  grouping power-mask {
-    description
-      "describes how power shall be set according preceeding span loss";
-    list mask-power-vs-pin {
-      key "lower-boundary upper-boundary";
-      description
-        "for power range provides C and D parameter : Pout[50GHz BW] (dBm) = C*span-loss (dBm)+ D";
-      leaf lower-boundary {
-        type uint32;
-        description
-          "defines the lower Power boundary for which C & Dparameters apply";
-      }
-      leaf upper-boundary {
-        type uint32;
-        description
-          "defines the upper Power boundary for which C & Dparameters apply";
-      }
-      leaf C {
-        type decimal64 {
-          fraction-digits 8;
-        }
-        description
-          "C*span-loss";
-      }
-      leaf D {
-        type decimal64 {
-          fraction-digits 8;
-        }
-        description
-          "Constant";
-      }
-      leaf fiber-type {
-        type enumeration {
-          enum smf {
-            value 0;
-            description
-              "Single Mode Fiber";
-          }
-          enum eleaf {
-            value 1;
-            description
-              "ELEAF";
-          }
-          enum oleaf {
-            value 2;
-            description
-              "OLEAF";
-          }
-          enum dsf {
-            value 3;
-            description
-              "DSF";
-          }
-          enum truewave {
-            value 4;
-            description
-              "TRUEWAVE Reduced Slope";
-          }
-          enum truewavec {
-            value 5;
-            description
-              "TRUEWAVE Classic";
-          }
-          enum nz-dsf {
-            value 6;
-            description
-              "NZ-DSF";
-          }
-          enum ull {
-            value 7;
-            description
-              "Ultra Low Loss (ULL)";
-          }
-        }
-        description
-          "enumeration of the different existing fiber type";
-      }
-    }
-  }
-
-  grouping operational-mode-roadm-add-parameters {
-    description
-      "includes parameters to be used for specification modeling";
-    container Add {
-      description
-        "add block-specification";
-      list add-openroadm-operational-mode {
-        key "openroadm-operational-mode-id";
-        description
-          "defines the openroadm operational mode pointing to an official specification ";
-        leaf openroadm-operational-mode-id {
-          type string;
-          description
-            "openroadm operational mode which points to a specific spreadsheet of optical specifications";
-        }
-        leaf incremental-osnr {
-               type org-openroadm-common-link-types:ratio-dB;
-               description
-                       "incremental osnr considering noisless input at 0dBm";
-        }
-        uses operational-mode-roadm-base-parameters;
-        uses power-mask;
-      }
-    }
-  }
-
-  grouping operational-mode-common-amplifier-drop-parameters {
-    description
-      "includes parameters to be used for specification modeling";
-    list openroadm-operational-mode {
-      key "openroadm-operational-mode-id";
-      description
-        "defines the openroadm operational mode pointing to an official specification ";
-      leaf openroadm-operational-mode-id {
-        type string;
-        description
-          "openroadm operational mode which points to a specific spreadsheet of optical specifications";
-      }
-      uses operational-mode-roadm-base-parameters;
-      uses polynomial-fit;
-      leaf per-channel-Pout-min {
-        type org-openroadm-common-link-types:ratio-dB;
-        description
-          "Minimum output power";
-      }
-      leaf per-channel-Pout-max {
-        type org-openroadm-common-link-types:ratio-dB;
-        description
-          "Maximum output power";
-      }
-    }
-  }
-
-  grouping operational-mode-roadm-drop-parameters {
-    description
-      "includes parameters to be used for specification modeling";
-    container Drop {
-      description
-        "drop block-specification";
-      uses operational-mode-common-amplifier-drop-parameters;
-    }
-  }
-
-  grouping operational-mode-roadm-express-parameters {
-    description
-      "includes parameters to be used for specification modeling";
-    container Express {
-      description
-        "Express specifications";
-      list openroadm-operational-mode {
-        key "openroadm-operational-mode-id";
-        description
-          "defines the openroadm operational mode pointing to an official specification ";
-        leaf openroadm-operational-mode-id {
-          type string;
-          description
-            "openroadm operational mode which points to a specific spreadsheet of optical specifications";
-        }
-        uses operational-mode-roadm-base-parameters;
-        uses polynomial-fit;
-        uses power-mask;
-      }
-    }
-  }
-
-  grouping operational-mode-amplifier-parameters {
-    description
-      "includes parameters to be used for specification modeling";
-    container Amplifier {
-      description
-        "drop block-specification";
-      uses operational-mode-common-amplifier-drop-parameters;
-      leaf min-gain {
-         type org-openroadm-common-link-types:ratio-dB;
-         description
-                 "minimum gain of nominal gain range";
-      }
-      leaf max-gain {
-         type org-openroadm-common-link-types:ratio-dB;
-         description
-                 "maximum gain of nominal gain range";
-      }
-      leaf max-extended-gain {
-         type org-openroadm-common-link-types:ratio-dB;
-         description
-                 "maximum gain of extended gain range";
-      }
-      list mask-gain-ripple-vs-tilt {
-          key "lower-boundary upper-boundary";
-          description
-            "for gain ripple, provides C and D parameter : Max-gain-ripple (dB) = C*target-tilt (dB)+ D.
-                 Tilt applies to extended gain range";
-          leaf lower-boundary {
-            type int32;
-            description
-              "defines the lower tilt boundary for which C & Dparameters apply";
-          }
-          leaf upper-boundary {
-            type int32;
-            description
-              "defines the upper tilt boundary for which C & Dparameters apply";
-          }
-          leaf C {
-            type decimal64 {
-              fraction-digits 2;
-            }
-            description
-              "C*span-loss";
-          }
-          leaf D {
-            type decimal64 {
-              fraction-digits 2;
-            }
-            description
-              "Constant";
-          }
-      }
-    }
-  }
-
-  grouping operational-mode-transponder-parameters {
-    description
-      "describes parameters used to qualify xponders line performances";
-    leaf baud-rate {
-      type decimal64 {
-        fraction-digits 1;
-      }
-      units "Gbauds";
-      description
-        "baud-rate in Gbauds";
-    }
-    leaf line-rate {
-      type decimal64 {
-        fraction-digits 1;
-      }
-      units "Gbps";
-      mandatory true;
-      description
-        "line coding rate in Gbps";
-    }
-    leaf modulation-format {
-      type org-openroadm-common-optical-channel-types:modulation-format;
-      mandatory true;
-      description
-        "modulation format as defined in openroadm";
-    }
-    leaf min-TX-osnr {
-      type org-openroadm-common-link-types:ratio-dB;
-      mandatory true;
-      description
-        "Defined in 0.1 nm @ 193.6 Thz bandwidth";
-    }
-    list TX-OOB-osnr {
-      key "WR-openroadm-operational-mode-id";
-      description
-        "describe noise contribution associated with a specific transponder
-         according to the multiplexing architecture of the SRG it is connected to";
-      leaf WR-openroadm-operational-mode-id {
-        type string;
-        description
-          "openroadm operational mode of the multiplexor which the transponder is connected to";
-      }
-      leaf min-OOB-osnr-multi-channel-value {
-        type org-openroadm-common-link-types:ratio-dB;
-        mandatory true;
-        description
-          "Measured outside +/-150GHz BW, including SMSR, and 15 channels worst case contribution";
-      }
-      leaf min-OOB-osnr-single-channel-value {
-        type org-openroadm-common-link-types:ratio-dB;
-        mandatory true;
-        description
-          "Measured outside +/-150GHz BW, excluding SMSR, single channel";
-      }
-    }
-    list output-power-range {
-      key "WR-openroadm-operational-mode-id";
-      description
-          "describe output power range associated with a specific transponder
-           according to the multiplexing architecture of the SRG it is connected to";
-      leaf WR-openroadm-operational-mode-id {
-        type string;
-        description
-            "openroadm operational mode of the multiplexor which the transponder is connected to";
-      }
-      leaf min-output-power {
-        type org-openroadm-common-link-types:ratio-dB;
-        mandatory true;
-        description
-          "minimum supported output-power";
-      }
-      leaf max-output-power {
-        type org-openroadm-common-link-types:ratio-dB;
-        mandatory true;
-        description
-          "maximum supported output-power";
-      }
-    }
-    leaf min-RX-osnr-tolerance {
-      type org-openroadm-common-link-types:ratio-dB;
-      mandatory true;
-      description
-        "Defined in 0.1 nm @ 193.6 Thz bandwidth";
-    }
-    leaf min-input-power-at-RX-osnr {
-      type org-openroadm-common-link-types:ratio-dB;
-      mandatory true;
-      description
-        "minimum input-power for given osnr tolerance";
-    }
-    leaf max-input-power {
-      type org-openroadm-common-link-types:ratio-dB;
-      mandatory true;
-      description
-        "maximum supported intput-power causing either an overload or the damage of the receiver";
-    }
-    leaf channel-width {
-       type org-openroadm-common-optical-channel-types:frequency-GHz;
-       description
-               "-20 dB channel width, required for target power calculation";
-    }
-    leaf fec-type {
-        type identityref {
-           base org-openroadm-common-types:fec-identity;
-        }
-        description
-          "fec type";
-    }
-    leaf min-roll-off {
-      type decimal64 {
-        fraction-digits 2;
-      }
-      units "dB/decade";
-      description
-        "Minimum Roll-off factor";
-    }
-    leaf max-roll-off {
-      type decimal64 {
-        fraction-digits 2;
-        }
-      units "dB/decade";
-      description
-        "Maximum Roll-off factor";
-    }    
-    list penalties {
-      key "parameter-and-unit up-to-boundary";
-      description
-        "Penalties includes contributions from different impairments including
-        cd, pmd, low RX Power, pdl,...";
-      leaf parameter-and-unit {
-        type impairment-type;
-        description
-          "impairment leading to the penalty";
-      }
-      leaf up-to-boundary {
-           type decimal64 {
-          fraction-digits 2;
-        }
-        description
-          "defines the upper (for positive values) and lower (for negative values)
-           limit for which the penalty value is valid";
-      }
-      leaf penalty-value {
-        type org-openroadm-common-link-types:ratio-dB;
-        description
-          "defined penalty in dB";
-      }
-    }
-  }
-
-  grouping operational-mode-catalog {
-    description
-      "this catalog is used to store data related to operational modes and related specifications
-       for OpenROADM operational modes this allows translating official specifications
-       for other Operational modes this provides the controller with the specifications
-       of bookended/alien transponders
-       The catalog shall be fed using operational-mode-setting rpc";
-    container openroadm-operational-modes {
-      description
-        "All operational modes corresponding to official OpenROAM specifications";
-      container grid-parameters {
-        description
-          "Parameters associated with global spectrum use";
-        uses operational-mode-grid-parameters;
-      }
-      container xponders-pluggables {
-         presence "Container includes mandatory nodes but may however not be present 
-                 in the rpc used to feed the catalog (merge operation)";
-         description
-              "Parameters associated with xponders and pluggables";
-        list xponder-pluggable-openroadm-operational-mode {
-          key "openroadm-operational-mode-id";
-          description
-            "defines the openroadm operational mode pointing to an official specification ";
-          leaf openroadm-operational-mode-id {
-            type string;
-            description
-              "openroadm operational mode which points to a specific spreadsheet of optical specifications";
-          }          
-          uses operational-mode-transponder-parameters;
-        }
-      }
-      container roadms {
-        description
-          "Parameters associated with roadms";
-        uses operational-mode-roadm-express-parameters;
-        uses operational-mode-roadm-add-parameters;
-        uses operational-mode-roadm-drop-parameters;
-      }
-      container amplifiers {
-        description
-          "Parameters associated with amplifiers";
-        uses operational-mode-amplifier-parameters;
-      }
-    }
-    container specific-operational-modes {
-      description
-        "All specific operational modes corresponding to bookended or alien units";
-      list specific-operational-mode {
-        key "operational-mode-id";
-        description
-          "List of all declared specific operationnal modes";
-        leaf operational-mode-id {
-          type string;
-          description
-            "unique identifier which identifies the operational mode";
-        }
-        leaf originator {
-               type string;
-               description
-                       "identifies the system vendor which originated associated specification";
-        }
-        leaf sponsor {
-               type string;
-               description
-                       "identifies the service provider which reviewed and sponsored associated specification";
-        }
-        uses operational-mode-grid-parameters;
-        uses operational-mode-transponder-parameters;
-        leaf configurable-output-power {
-               type boolean;
-               mandatory true;
-               description
-                       "defines whether the output power can be set or not";
-        }
-      }
-    }
-  }
-}
diff --git a/ordmodels/service/src/main/yang/org-openroadm-routing-constraints@2021-12-10.yang b/ordmodels/service/src/main/yang/org-openroadm-routing-constraints@2021-12-10.yang
deleted file mode 100644 (file)
index 6387232..0000000
+++ /dev/null
@@ -1,330 +0,0 @@
-module org-openroadm-routing-constraints {
-  namespace "http://org/openroadm/routing/constraints";
-  prefix org-openroadm-routing-constraints;
-
-  import org-openroadm-common-node-types {
-    prefix org-openroadm-common-node-types;
-    revision-date 2021-05-28;
-  }
-  import org-openroadm-network-resource {
-    prefix org-openroadm-network-resource;
-    revision-date 2019-11-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of routing constraints.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2021-12-10 {
-    description
-      "Version 10.1";
-  }
-  revision 2021-09-24 {
-    description
-      "Version 10.0";
-  }
-  revision 2021-05-28 {
-    description
-      "Version 9.1";
-  }
-  revision 2020-12-11 {
-    description
-      "Version 8.1";
-  }
-  revision 2020-09-25 {
-    description
-      "Version 8.0";
-  }
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping routing-constraints {
-    container hard-constraints {
-      uses constraints;
-    }
-    container soft-constraints {
-      uses constraints;
-    }
-  }
-
-  grouping constraints {
-    leaf-list customer-code {
-      type string;
-    }
-    leaf-list operational-mode {
-      type string;
-    }
-    container diversity {
-      uses diversity-existing-service-constraints;
-      uses diversity-constraints;
-      description
-        "Diversity constraints for single or bulk requests.
-        diversity-constraints provides more options for bulk requests";
-    }
-    container exclude {
-      uses common-constraints;
-      leaf-list supporting-service-name {
-        type string;
-        description
-          "Supporting service(s) to exclude from this route.";
-      }
-    }
-    container include {
-      uses common-constraints;
-      leaf-list supporting-service-name {
-        type string;
-        description
-          "Supporting service(s) to include in this route.";
-      }
-    }
-    container latency {
-      description
-        "Maximum allowed one-way latency in milliseconds";
-      leaf max-latency {
-        type decimal64 {
-          fraction-digits 3;
-        }
-        units "milliseconds";
-      }
-    }
-    container hop-count {
-      description
-        "Maximum hops allowed";
-      leaf max-wdm-hop-count {
-        type uint8;
-      }
-      leaf max-otn-hop-count {
-        type uint8;
-      }
-    }
-    container TE-metric {
-      description
-        "Maximum cost allowed";
-      leaf max-wdm-TE-metric {
-        type uint32;
-      }
-      leaf max-otn-TE-metric {
-        type uint32;
-      }
-    }
-    container distance {
-      description
-        "Maximum distance allowed";
-      leaf max-distance {
-        type decimal64 {
-          fraction-digits 2;
-        }
-        units "km";
-      }
-    }
-    container co-routing {
-      list service-identifier-list {
-        description
-          "Indicates that new services that are part of the bulk service request
-          should be co-routed";
-        key "service-identifier";
-        leaf service-identifier {
-          type string;
-          description
-            "This can be a service-name or a common-id";
-        }
-        uses service-applicability-g;
-      }
-    }
-  }
-
-
-  grouping common-constraints {
-    leaf-list fiber-bundle {
-      type string;
-    }
-    leaf-list srlg-id {
-      type uint32;
-      description
-        "unique identifier for SRLG";
-    }
-    leaf-list site {
-      type string;
-      description
-        "site identifies the clli.
-         clli from the device model; clli-network-ref + clli from the network model.";
-    }
-    leaf-list node-id {
-      type org-openroadm-common-node-types:node-id-type;
-      description
-        "node-id from the device model; openroadm-network-ref + node-id from the network model.";
-    }
-    list link-identifier {
-      key "link-network-id link-id";
-      description
-        "Refers to link-id(s) from the network model.
-         The openroadm-topology-ref + link-id identifies the link in the network model.";
-      uses org-openroadm-network-resource:network-link-name;
-    }
-  }
-
-  grouping equipment{
-    container equipment {
-      leaf roadm-srg {
-        type boolean;
-        description "ROADM shared-risk-group diversity";
-      }
-      leaf xponder-srg {
-        type boolean;
-        description "xponder eqpt-srg-id diversity";
-      }
-      description
-        "Equipment Diversity Contraints";
-    }
-  }
-
-  grouping existing-service-applicability-g {
-    container existing-service-applicability {
-      leaf site {
-        type boolean;
-      }
-      leaf node {
-        type boolean;
-      }
-      leaf srlg {
-        type boolean;
-      }
-      leaf link {
-        type boolean;
-      }
-      uses equipment;
-    }
-  }
-
-  grouping service-applicability-g {
-    container service-applicability {
-      leaf site {
-        type boolean;
-      }
-      leaf node {
-        type boolean;
-      }
-      leaf srlg {
-        type boolean;
-      }
-      leaf link {
-        type boolean;
-      }
-      uses equipment;
-    }
-  }
-
-  grouping diversity-existing-service-constraints {
-    list service-identifier-list {
-        description
-          "Indicates that new services that are part of the bulk service request
-          should be co-routed";
-        key "service-indentifier";
-        leaf service-indentifier {
-          type string;
-          description
-            "This can be a service-name or a common-id";
-        }
-        uses service-applicability-g;
-    }
-    /*
-    leaf-list existing-service {
-      type string;
-      description
-        "Diverse from existing services identified by facility CLFI";
-    }
-    uses existing-service-applicability-g;
-    */
-  }
-
-  grouping diversity-constraints {
-    leaf diversity-type {
-      type enumeration {
-        enum serial {
-          value 1;
-          description
-            "Indicates that new services that are part of the bulk service request 
-            should be routed serially for diversity.";
-        }
-        enum synchronous {
-          value 2;
-          description
-            "Indicates that new services that are part of the bulk service request 
-            should be routed synchronously for diversity.";
-        }
-      }
-      description 
-        "This is only used when creating services using service-create-bulk. 
-        It is expected that 'diversity-type' should be same for all services,
-        within the group. Which means it can be either 'serial' or 'synchronous'
-        but not both.";
-    }
-  }
-}
diff --git a/ordmodels/service/src/main/yang/org-openroadm-service@2021-12-10.yang b/ordmodels/service/src/main/yang/org-openroadm-service@2021-12-10.yang
deleted file mode 100644 (file)
index 9f9f0b1..0000000
+++ /dev/null
@@ -1,1697 +0,0 @@
-module org-openroadm-service {
-  yang-version 1.1;
-  namespace "http://org/openroadm/service";
-  prefix org-openroadm-service;
-
-  import ietf-yang-types {
-    prefix yang;
-    revision-date 2013-07-15;
-  }
-  import org-openroadm-routing-constraints {
-    prefix org-openroadm-routing-constraints;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-common-types {
-    prefix org-openroadm-common-types;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-resource-types {
-    prefix org-openroadm-resource-types;
-    revision-date 2021-09-24;
-  }
-  import org-openroadm-resource {
-    prefix org-openroadm-resource;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-common-service-types {
-    prefix org-openroadm-common-service-types;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-controller-customization {
-    prefix org-openroadm-controller-customization;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-topology {
-    prefix org-openroadm-topology;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-operational-mode-catalog {
-    prefix org-openroadm-operational-mode-catalog;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-common-optical-channel-types {
-    prefix org-openroadm-common-optical-channel-types;
-    revision-date 2021-12-10;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of services.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2021-12-10 {
-    description
-      "Version 10.1";
-  }
-  revision 2021-09-24 {
-    description
-      "Version 10.0";
-  }
-  revision 2021-05-28 {
-    description
-      "Version 9.1";
-  }
-  revision 2021-03-26 {
-    description
-      "Version 9.0";
-  }
-  revision 2020-12-11 {
-    description
-      "Version 8.1";
-  }
-  revision 2020-09-25 {
-    description
-      "Version 8.0";
-  }
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-05-30 {
-    description
-      "Version 3.1.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping proposed-equipment-g {
-    leaf propose-equipment {
-      type enumeration {
-        enum never {
-          value 1;
-        }
-        enum ifNeeded {
-          value 2;
-        }
-        enum always {
-          value 3;
-        }
-      }
-      default "ifNeeded";
-      description
-        "Whether or not this request can propose new equipment that could
-         be used to fulfill this request. If never, the request will just
-         use existing deployed and planned equipment. If ifNeeded, routes using existing equipment
-         will be preferred. If always, a route with proposed equipment shall be returned, if possible";
-    }
-  }
-
-  grouping service-feasibility-check-inputs {
-    leaf connection-type {
-      type org-openroadm-common-service-types:connection-type;
-    }
-    uses org-openroadm-common-service-types:resource-status;
-    uses org-openroadm-common-service-types:routing-metric;
-    uses org-openroadm-common-service-types:service-resiliency;
-    uses proposed-equipment-g;
-    container service-a-end {
-      uses org-openroadm-common-service-types:service-endpoint;
-      container requesting-interface-properties {
-        when "../../connection-type = 'optical-tunnel'" {
-          description
-            "an optical-tunnel service creation request triggers a container
-              that includes the description of the characteristics of the
-              external optical transceiver handled by a 3rd party controller";
-        }
-        uses org-openroadm-common-service-types:external-interface-characteristics;
-      }
-    }
-    container service-z-end {
-      uses org-openroadm-common-service-types:service-endpoint;
-      container requesting-interface-properties {
-        when "../../connection-type = 'optical-tunnel'" {
-          description
-            "an optical-tunnel service creation request triggers a container
-              that includes the description of the characteristics of the
-              external optical transceiver handled by a 3rd party controller";
-        }
-        uses org-openroadm-common-service-types:external-interface-characteristics;
-      }
-    }
-    uses org-openroadm-routing-constraints:routing-constraints;
-    uses org-openroadm-common-service-types:service-information;
-    uses org-openroadm-common-service-types:max-regeneration-options;
-    uses org-openroadm-common-service-types:existing-service-grouping {
-      refine "existing-service-attributes/reusable-existing-resources" {
-        default "all";
-      }
-    }
-  }
-
-  grouping service-feasibility-check-outputs {
-    leaf connection-type {
-      type org-openroadm-common-service-types:connection-type;
-    }
-    uses org-openroadm-common-service-types:resource-status;
-    uses org-openroadm-common-service-types:routing-metric;
-    uses org-openroadm-common-service-types:service-resiliency;
-    uses proposed-equipment-g;
-    uses org-openroadm-common-service-types:service-information;
-    container service-a-end {
-      uses org-openroadm-common-service-types:service-endpoint;
-      list equipment-required {
-        key "equipment-identifier";
-        description
-          "List of required equipment, including equipment type, state and
-           quantity";
-        uses org-openroadm-common-service-types:equipment-info;
-      }
-      container expected-settings-and-performances {
-        when "(../../connection-type = 'optical-tunnel' or ../../connection-type = 'infrastructure')" {
-          description
-            "Performances and settings are provided for wavelength services
-             whether they are based on end to end services or optical-tunnels";
-        }
-        uses org-openroadm-resource:common-och-otsi-attributes;
-        uses org-openroadm-resource:path-computation-outputs;
-      }
-    }
-    container service-z-end {
-      uses org-openroadm-common-service-types:service-endpoint;
-      list equipment-required {
-        key "equipment-identifier";
-        description
-          "List of required equipment, including equipment type, state and
-           quantity";
-        uses org-openroadm-common-service-types:equipment-info;
-      }
-      container expected-settings-and-performances {
-        when "(../../connection-type = 'optical-tunnel' or ../../connection-type = 'infrastructure')" {
-          description
-            "Performances and settings are provided for wavelength services
-             whether they are based on end to end services or optical-tunnels";
-        }
-        uses org-openroadm-resource:common-och-otsi-attributes;
-        uses org-openroadm-resource:path-computation-outputs;
-      }
-    }
-    uses org-openroadm-common-service-types:intermediate-site-container;
-    container requested-service-topology {
-      description
-        "This corresponds to the topology of the service requested. Includes all the
-         containers: topology, backup topology, network topology, and
-         network backup-topology";
-      container topology {
-        description
-          "topology corresponds to working-path which is the default path. It defines the initial path
-           to which services defined as revertive may revert to when the failure condition disappear";
-        uses org-openroadm-topology:topology;
-      }
-      container backup-topology {
-        list backup-path {
-          key "backup-path-id";
-          leaf backup-path-id {
-            type uint8 {
-              range "1..255";
-            }
-            description
-              "Several backup paths may be used when backup-paths are pre-calculated.
-               Backup-path-id avoids 0 which is associated with working path in current-active-path";
-          }
-          leaf failure-case-id {
-            type string;
-            description
-              "A failure case Id can be used to associate a backup-path to a specific failure (srlg, OMS,...)";
-          }
-          uses org-openroadm-topology:topology;
-        }
-      }
-      container network-topology {
-        uses org-openroadm-topology:network-topology;
-      }
-      container network-backup-topology {
-        list backup-path {
-          key "backup-path-id";
-          leaf backup-path-id {
-            type uint8 {
-              range "1..255";
-            }
-            description
-              "Several backup paths may be used when backup-paths are pre-calculated.
-               Backup-path-id avoids 0 which is associated with working path in current-active-path";
-          }
-          leaf failure-case-id {
-            type string;
-            description
-              "A failure case Id can be used to associate a backup-path to a specific failure (srlg, OMS,...)";
-          }
-          uses org-openroadm-topology:network-topology;
-        }
-      }
-    }
-    list supporting-service-hierarchy {
-      key "service-identifier";
-      description
-        "This lists all the supporting services and their respective hierarchy, includes the
-         proposed one";
-      uses org-openroadm-common-service-types:service-hierarchy;
-    }
-    uses service-path-metrics;
-    uses org-openroadm-common-service-types:max-regeneration-options;
-    uses org-openroadm-common-service-types:regeneration-option-list;
-    uses org-openroadm-common-service-types:existing-service-grouping {
-      refine "existing-service-attributes/reusable-existing-resources" {
-        default "all";
-      }
-    }
-  }
-
-  grouping service-path-metrics {
-    container primary-path-metrics {
-      description
-        "These service metrics are associated with primary
-         service path";
-      uses service-metrics;
-    }
-    list backup-path-metrics {
-      key "backup-path-id";
-      description
-        "These service metrics are associated with the backup
-         service path";
-      leaf backup-path-id {
-        type uint8 {
-          range "1..255";
-        }
-        description
-          "Unique identifier for the backup service path";
-      }
-      uses service-metrics;
-    }
-  }
-
-  grouping service-metrics {
-    container service-metrics {
-      description
-        "All the metrics associated with end-to-end service feasibility
-         This container will have all the metrics that have'max' contraint in
-         org-openroadm-routing-constraints";
-      leaf latency {
-        description
-          "Provides one-way end-to-end latency (in milliseconds) of a service-path; 
-          It can be measured or estimated";
-        type decimal64 {
-          fraction-digits 3;
-        }
-        units "milliseconds";
-      }
-      leaf distance {
-        type decimal64 {
-          fraction-digits 2;
-        }
-        units "km";
-        description
-          "Provides end-to-end distance of a service-path";
-      }
-      container hop-count {
-        description
-          "Maximum hops allowed";
-        leaf wdm-hop-count {
-          type uint8;
-        }
-        leaf otn-hop-count {
-          type uint8;
-        }
-      }
-      container TE-metric {
-        description
-          "Maximum cost allowed";
-        leaf wdm-TE-metric {
-          type uint32;
-        }
-        leaf otn-TE-metric {
-          type uint32;
-        }
-      }
-    }
-  }
-
-  rpc service-create {
-    description
-      "Whether this request passed initial validation and was accepted for processing. Once the request completes processing, a
-       service-rpc-result Notification shall be sent.";
-    input {
-      leaf service-name {
-        type string;
-        mandatory true;
-        description
-          "Identifier for the service to be created in
-           the ROADM network, e.g., CLFI, CLCI, etc. This is reported against the service, but may not get reflected in the service in the network.";
-      }
-      leaf common-id {
-        type string;
-        description
-          "To be used by the ROADM controller to identify the routing constraints received from planning application (PED).";
-      }
-      uses org-openroadm-common-service-types:service-order;
-      uses org-openroadm-common-service-types:sdnc-request-header;
-      uses org-openroadm-common-service-types:routing-metric;
-      uses org-openroadm-common-service-types:service-resiliency;
-      leaf connection-type {
-        type org-openroadm-common-service-types:connection-type;
-        mandatory true;
-      }
-      uses org-openroadm-common-service-types:resource-status;
-      container service-a-end {
-        uses org-openroadm-common-service-types:service-endpoint;
-      }
-      container service-z-end {
-        uses org-openroadm-common-service-types:service-endpoint;
-      }
-      uses org-openroadm-routing-constraints:routing-constraints;
-      uses org-openroadm-common-service-types:service-information;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-      uses org-openroadm-common-service-types:response-parameters;
-    }
-  }
-
-  rpc service-create-bulk {
-    description
-      "Whether this request passed initial validation and was accepted for processing.
-       Once the request completes processing, a service-rpc-result Notification shall be
-       sent. This is 'all' or 'nothing' operation, which means that either all services
-       are created or none of them will be created.";
-    input {
-      uses org-openroadm-common-service-types:sdnc-request-header;
-      list service-request-list {
-        key "service-name";
-        leaf service-name {
-          type string;
-          mandatory true;
-          description
-            "Identifier for the service to be created in
-             the ROADM network, e.g., CLFI, CLCI, etc. This is reported against the service, but may not get reflected in the service in the network.";
-        }
-        leaf common-id {
-          type string;
-          description
-            "To be used by the ROADM controller to identify the routing constraints received from planning application (PED).";
-        }
-        uses org-openroadm-common-service-types:service-order;
-        uses org-openroadm-common-service-types:routing-metric;
-        uses org-openroadm-common-service-types:service-resiliency;
-        leaf connection-type {
-          type org-openroadm-common-service-types:connection-type;
-          mandatory true;
-        }
-        uses org-openroadm-common-service-types:resource-status;
-        container service-a-end {
-          uses org-openroadm-common-service-types:service-endpoint;
-        }
-        container service-z-end {
-          uses org-openroadm-common-service-types:service-endpoint;
-        }
-        uses org-openroadm-routing-constraints:routing-constraints;
-        uses org-openroadm-common-service-types:service-information;
-      }
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-      list service-response-list {
-        key "service-name";
-        leaf service-name {
-          type string;
-          mandatory true;
-        }
-        uses org-openroadm-common-service-types:response-parameters;
-      }
-    }
-  }
-
-  rpc temp-service-create-bulk {
-    input {
-      uses org-openroadm-common-service-types:sdnc-request-header;
-      list service-request-list {
-        key "common-id";
-        leaf common-id {
-          type string;
-          mandatory true;
-          description
-            "To be used by the ROADM controller to identify the routing constraints
-             received from planning application (PED).";
-        }
-        uses org-openroadm-common-service-types:service-order;
-        uses org-openroadm-common-service-types:routing-metric;
-        uses org-openroadm-common-service-types:service-resiliency;
-        leaf connection-type {
-          type org-openroadm-common-service-types:connection-type;
-          mandatory true;
-        }
-        uses org-openroadm-common-service-types:resource-status;
-        container service-a-end {
-          uses org-openroadm-common-service-types:service-endpoint;
-        }
-        container service-z-end {
-          uses org-openroadm-common-service-types:service-endpoint;
-        }
-        uses org-openroadm-routing-constraints:routing-constraints;
-        uses org-openroadm-common-service-types:service-information;
-        uses org-openroadm-common-service-types:existing-service-grouping {
-            refine "existing-service-attributes/reusable-existing-resources" {
-              default "all";
-            }
-        }
-      }
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-      list service-response-list {
-        key "common-id";
-        leaf common-id {
-          type string;
-          mandatory true;
-        }
-        uses org-openroadm-common-service-types:response-parameters;
-        uses org-openroadm-common-service-types:existing-service-grouping {
-            refine "existing-service-attributes/reusable-existing-resources" {
-              default "all";
-            }
-        }
-      }
-    }
-  }
-
-  rpc service-create-result-notification-request {
-    description
-      "This is the callback notification that the controller invokes on the carrier system.";
-    input {
-      uses org-openroadm-common-service-types:configuration-response-common;
-      uses org-openroadm-common-service-types:service-identifiers-container;
-      uses service-path-metrics;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-    }
-  }
-
-  rpc service-create-complex-result-notification-request {
-    description
-      "This is the callback notification that the controller invokes on the carrier system.";
-    input {
-      uses org-openroadm-common-service-types:configuration-response-common;
-      uses org-openroadm-common-service-types:service-and-supporting-services;
-      uses service-path-metrics;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-    }
-  }
-
-  rpc service-delete-result-notification-request {
-    description
-      "This is the callback notification that the controller invokes on the carrier system.";
-    input {
-      uses org-openroadm-common-service-types:configuration-response-common;
-      uses org-openroadm-common-service-types:service-identifiers-container;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-    }
-  }
-
-  rpc service-delete-complex-result-notification-request {
-    description
-      "This is the callback notification that the controller invokes on the carrier system.";
-    input {
-      uses org-openroadm-common-service-types:configuration-response-common;
-      uses org-openroadm-common-service-types:service-and-supporting-services;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-    }
-  }
-
-  rpc service-feasibility-check {
-    description
-      "Whether a service was possible to be created, and if so
-       the routing constraints match and the a and z end connection that have
-       to match
-       Takes a potential service and determines if it is possible in the network
-       using equipment that is installed on the network, formally planned or proposed for planning.
-       No resources are reserved, provisioned or planned as a result of this operation";
-    input {
-      leaf common-id {
-        type string;
-        mandatory true;
-        description
-          "To be used by the ROADM controller to identify the routing constraints
-           received from planning application (PED).";
-      }
-      uses org-openroadm-common-service-types:sdnc-request-header;
-      uses service-feasibility-check-inputs;
-    }
-    output {
-      leaf common-id {
-        type string;
-        mandatory true;
-        description
-          "To be used by the ROADM controller to identify the routing constraints
-           received from planning application (PED).";
-      }
-      uses org-openroadm-common-service-types:configuration-response-common;
-      uses org-openroadm-common-service-types:response-parameters;
-      uses service-feasibility-check-outputs;
-    }
-  }
-
-  rpc service-feasibility-check-bulk {
-    description
-      "Whether a service was possible to be created, and if so
-       the routing constraints match and the a and z end connection that have
-       to match
-
-       Takes a list of potential services and determines if they are possible in the network
-       using equipment that is installed on the network, formally planned or proposed for planning.
-       All services are treated collectively to ensure that a given resource is not used more than once.
-       No resources are reserved, provisioned or planned as a result of this operation";
-    input {
-      uses org-openroadm-common-service-types:sdnc-request-header;
-      list service-request-list {
-        key "common-id";
-        leaf common-id {
-          type string;
-          mandatory true;
-          description
-            "To be used by the ROADM controller to identify the routing constraints
-             received from planning application (PED).";
-        }
-        uses service-feasibility-check-inputs;
-      }
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-      list service-response-list {
-        key "common-id";
-        leaf common-id {
-          type string;
-          mandatory true;
-          description
-            "To be used by the ROADM controller to identify the routing constraints
-             received from planning application (PED).";
-        }
-        uses org-openroadm-common-service-types:response-parameters;
-        uses service-feasibility-check-outputs;
-      }
-    }
-  }
-
-  rpc service-delete {
-    description
-      "Whether this request passed initial validation and was accepted for processing. Once the request completes processing, a
-       service-rpc-result Notification shall be sent. Once the service has been deleted, it no longer will appear in the service list";
-    input {
-      uses org-openroadm-common-service-types:sdnc-request-header;
-      container service-delete-req-info {
-        leaf service-name {
-          type string;
-          mandatory true;
-          description
-            "Identifier for the service to be deleted in
-             the ROADM network, e.g., CLFI, CLCI, etc.";
-        }
-        leaf due-date {
-          type yang:date-and-time;
-          description
-            "date and time service to be turned down. If missing, now.";
-        }
-        leaf tail-retention {
-          type enumeration {
-            enum yes {
-              value 1;
-              description
-                "tails are left intact ";
-            }
-            enum no {
-              value 2;
-              description
-                "tails are deleted";
-            }
-          }
-          mandatory true;
-        }
-      }
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-    }
-  }
-
-  rpc equipment-notification {
-    input {
-      uses org-openroadm-common-service-types:sdnc-request-header;
-      leaf equipment-id {
-        type string;
-        mandatory true;
-      }
-      leaf equipment-name {
-        type string;
-      }
-      leaf equipment-type {
-        type string;
-        mandatory true;
-        description
-          "The set of valid value is derived from the equipment-type grouping used in the device model.";
-      }
-      leaf equipment-vendor {
-        type string;
-        mandatory true;
-      }
-      leaf equipment-customer {
-        type string;
-      }
-      leaf equipment-clli {
-        type string;
-        mandatory true;
-      }
-      leaf equipment-ip {
-        type string;
-      }
-      leaf controller-id {
-        type string;
-        mandatory true;
-      }
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-    }
-  }
-
-  rpc temp-service-create {
-    input {
-      leaf common-id {
-        type string;
-        mandatory true;
-        description
-          "To be used by the ROADM controller to identify the routing constraints received from planning application (PED).";
-      }
-      uses org-openroadm-common-service-types:service-order;
-      uses org-openroadm-common-service-types:sdnc-request-header;
-      leaf connection-type {
-        type org-openroadm-common-service-types:connection-type;
-        mandatory true;
-      }
-      uses org-openroadm-common-service-types:resource-status;
-      container service-a-end {
-        uses org-openroadm-common-service-types:service-endpoint;
-        container requesting-interface-properties {
-          when "../../connection-type = 'optical-tunnel'" {
-            description
-              "an optical-tunnel service creation request triggers a container
-               that includes the description of the characteristics of the
-               external optical transceiver handled by a 3rd party controller";
-          }
-          uses org-openroadm-common-service-types:external-interface-characteristics;
-        }
-      }
-      container service-z-end {
-        uses org-openroadm-common-service-types:service-endpoint;
-        container requesting-interface-properties {
-          when "../../connection-type = 'optical-tunnel'" {
-            description
-              "an optical-tunnel service creation request triggers a container
-               that includes the description of the characteristics of the
-               external optical transceiver handled by a 3rd party controller";
-          }
-          uses org-openroadm-common-service-types:external-interface-characteristics;
-        }
-      }
-      uses org-openroadm-routing-constraints:routing-constraints;
-      uses org-openroadm-common-service-types:service-information;
-      uses org-openroadm-common-service-types:routing-metric;
-      uses org-openroadm-common-service-types:service-resiliency;
-      uses org-openroadm-common-service-types:existing-service-grouping {
-        refine "existing-service-attributes/reusable-existing-resources" {
-          default "all";
-        }
-      }
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-      uses org-openroadm-common-service-types:response-parameters;
-      uses org-openroadm-common-service-types:existing-service-grouping {
-        refine "existing-service-attributes/reusable-existing-resources" {
-          default "all";
-        }
-      }
-    }
-  }
-
-  rpc temp-service-delete {
-    input {
-      leaf common-id {
-        type string;
-        mandatory true;
-      }
-      uses org-openroadm-common-service-types:sdnc-request-header;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-    }
-  }
-
-  rpc service-roll {
-    description
-      "This rpc can be use to roll a service according to 2 possible options :
-         A new path may (no path pre-calculation) or may not be calculated according
-         to the parameters provided (which includes metrics). If path computation has been triggered
-         and is successful, a new path is provided, and the service can be rolled according to that path.";
-    input {
-      leaf service-name {
-        type string;
-        mandatory true;
-        description
-          "Identifier for the service to be rolled in
-           the ROADM network, e.g., CLFI, CLCI, etc.";
-      }
-      leaf due-date {
-        type yang:date-and-time;
-        description
-          "date and time service to be rolled";
-      }
-      uses org-openroadm-common-service-types:sdnc-request-header;
-      uses org-openroadm-common-service-types:routing-metric;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-    }
-  }
-
-  rpc service-roll-result-notification-request {
-    description
-      "This is the callback notification that the controller invokes on the carrier system.";
-    input {
-      uses org-openroadm-common-service-types:configuration-response-common;
-      uses org-openroadm-common-service-types:service-identifiers-container;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-    }
-  }
-
-  rpc service-reconfigure {
-    description
-      "Whether this request passed initial validation and was accepted for processing. Once the request completes processing, a
-       service-rpc-result Notification shall be sent.";
-    input {
-      uses org-openroadm-common-service-types:sdnc-request-header;
-      leaf service-name {
-        type string;
-        mandatory true;
-        description
-          "Existing identifier for the service to be
-           reconfigured in the ROADM network, e.g., CLFI, CLCI, etc.";
-      }
-      leaf new-service-name {
-        type string;
-        description
-          "New identifier for the service to be
-           reconfigured in the ROADM network, e.g., CLFI, CLCI, etc.";
-      }
-      leaf data-reload {
-        type boolean;
-        description 
-          "Indicates whether the data of existing service needs to be refreshed or 
-          reloaded. No reprovisioning/reconfiguration should be done to the service, 
-          only data is updated. May generate data conflict to existing service         
-          after reload. If set true, the data of existing service will be refreshed";
-      }
-      leaf common-id {
-        type string;
-        description
-          "To be used by the ROADM controller to identify the routing
-           constraints received from planning application (PED).";
-      }
-      uses org-openroadm-common-service-types:service-order;
-      leaf connection-type {
-        type org-openroadm-common-service-types:connection-type;
-      }
-      uses org-openroadm-common-service-types:resource-status;
-      container service-a-end {
-        uses org-openroadm-common-service-types:service-endpoint;
-        container requesting-interface-properties {
-          when "../../connection-type = 'optical-tunnel'" {
-            description
-              "an optical-tunnel service creation request triggers a container
-                that includes the description of the characteristics of the
-                external optical transceiver handled by a 3rd party controller";
-          }
-          uses org-openroadm-common-service-types:external-interface-characteristics;
-        }
-      }
-      container service-z-end {
-        uses org-openroadm-common-service-types:service-endpoint;
-        container requesting-interface-properties {
-          when "../../connection-type = 'optical-tunnel'" {
-            description
-              "an optical-tunnel service creation request triggers a container
-                that includes the description of the characteristics of the
-                external optical transceiver handled by a 3rd party controller";
-          }
-          uses org-openroadm-common-service-types:external-interface-characteristics;
-        }
-      }
-      uses org-openroadm-routing-constraints:routing-constraints;
-      uses org-openroadm-common-service-types:service-information;
-      uses org-openroadm-common-service-types:routing-metric;
-      uses org-openroadm-common-service-types:service-resiliency;
-    }
-    output {
-      // Augment the reconfigure response with the data-reload
-      uses org-openroadm-common-service-types:configuration-response-common {
-        augment "configuration-response-common" {
-          leaf ack-data-reload-indicator {
-            type string;
-            description
-              "This optional, meaning this will be populated only when
-              the data-reload indicator is set true";
-          }
-        }
-      }
-      uses org-openroadm-common-service-types:response-parameters;
-    }
-  }
-
-  rpc service-reconfigure-bulk {
-         description
-      "Whether bulk of requests passed initial validation and was accepted for 
-      processing. Once the request completes processing, a service-rpc-result 
-      Notification shall be sent.";
-         input {
-      uses org-openroadm-common-service-types:sdnc-request-header;
-      list service-reconfigure-list {
-        key "service-name";
-        leaf service-name {
-          type string;
-          mandatory true;
-          description
-            "Existing identifier for the service to be
-            reconfigured in the ROADM network, e.g., CLFI, CLCI, etc.";
-        }
-        leaf new-service-name {
-          type string;
-          description
-            "New identifier for the service to be
-            reconfigured in the ROADM network, e.g., CLFI, CLCI, etc.";
-        }
-        leaf data-reload {
-          type boolean;
-          description 
-            "Indicates whether the data of existing service needs to be refreshed or 
-            reloaded. No reprovisioning/reconfiguration should be done to the service, 
-            only data is updated. May generate data conflict to existing service       
-            after reload. If set true, the data of existing service will be refreshed";
-        }
-        leaf common-id {
-          type string;
-          description
-            "To be used by the ROADM controller to identify the routing
-            constraints received from planning application (PED).";
-        }
-        uses org-openroadm-common-service-types:service-order;
-        leaf connection-type {
-          type org-openroadm-common-service-types:connection-type;
-        }
-        uses org-openroadm-common-service-types:resource-status;
-        container service-a-end {
-          uses org-openroadm-common-service-types:service-endpoint;
-        }
-        container service-z-end {
-          uses org-openroadm-common-service-types:service-endpoint;
-        }
-        uses org-openroadm-routing-constraints:routing-constraints;
-        uses org-openroadm-common-service-types:service-information;
-        uses org-openroadm-common-service-types:routing-metric;
-        uses org-openroadm-common-service-types:service-resiliency;
-      }
-    }
-    output {
-                 uses org-openroadm-common-service-types:configuration-response-common {
-                   augment "configuration-response-common" {
-                           leaf ack-data-reload-indicator {
-                       type string;
-            description
-                   "This optional, meaning this will be populated only when 
-               the data-reload indicator is set true";
-                   }
-                   } 
-                 }
-                 list service-reconfigure-response-list {
-                   key "service-name";
-                   leaf service-name {
-                           type string;
-                           mandatory true;
-                           description
-            "Existing identifier for the service to be
-            reconfigured in the ROADM network, e.g.,   CLFI, CLCI, etc.";
-                   } 
-      }
-      uses org-openroadm-common-service-types:response-parameters;
-    }
-  }
-
-
-
-
-  rpc service-reconfigure-result-notification-request {
-    description
-      "This is the callback notification that the controller invokes on the carrier system.";
-    input {
-      uses org-openroadm-common-service-types:configuration-response-common;
-      uses org-openroadm-common-service-types:service-identifiers-container;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-    }
-  }
-
-  rpc service-restoration {
-    description
-      "Whether this request passed initial validation and was accepted for processing. Once the request completes processing, a
-       service-rpc-result Notification shall be sent.
-       This rpc can be use to reroute a service according to 2 possible options :
-        \t_Option1 : neither the backup-path-id nor the failure-case-id are provided, a new path shall be
-           calculated according to the parameters provided (which includes metrics). If path computation
-           is successful, a new path is provided, and the service is rerouted according to that path.
-        \t_Option2 : if a backup-path-id or a failure-case-id are provided, the service shall
-           be rerouted according to the corresponding path. If path computation is triggered and successful,
-           a new path is provided, and the service is rerouted according to that path.";
-    input {
-      leaf service-name {
-        type string;
-        mandatory true;
-        description
-          "Identifier for the service to be restored in
-           the ROADM network, e.g., CLFI, CLCI, etc.";
-      }
-      leaf option {
-        type enumeration {
-          enum permanent {
-            value 1;
-            description
-              "A spare regen can be used to restore the
-               service permanently without reverting back to the
-               original regen";
-          }
-          enum temporary {
-            value 2;
-            description
-              "a spare regen can be used to restore the
-               service temporarily.   The service needs to be reverted
-               back to the original regen transponder";
-          }
-        }
-        mandatory true;
-      }
-      leaf backup-path-id {
-        type uint8 {
-          range "1..255";
-        }
-        description
-          "When present, states that the service shall be rerouted according to a specific backup path";
-      }
-      leaf failure-case-id {
-        type string;
-        description
-          "When present, states that the service shall be rerouted according to a specific backup path.
-           This last corresponds to the provided failure case id";
-      }
-      uses org-openroadm-common-service-types:sdnc-request-header;
-      uses org-openroadm-common-service-types:routing-metric;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-    }
-  }
-
-  rpc service-restoration-result-notification-request {
-    description
-      "This is the callback notification that the controller invokes on the carrier system.";
-    input {
-      uses org-openroadm-common-service-types:configuration-response-common;
-      uses org-openroadm-common-service-types:service-identifiers-container;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-    }
-  }
-
-  rpc service-reversion {
-    description
-      "Whether this request passed initial validation and was accepted for processing. Once the request completes processing, a
-       service-rpc-result Notification shall be sent.";
-    input {
-      leaf service-name {
-        type string;
-        mandatory true;
-        description
-          "Identifier for the service to be reverted
-           in the ROADM network, e.g., CLFI, CLCI, etc. ";
-      }
-      leaf due-date {
-        type yang:date-and-time;
-        description
-          "date and time service to be reverted";
-      }
-      uses org-openroadm-common-service-types:sdnc-request-header;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-    }
-  }
-
-  rpc service-reversion-result-notification-request {
-    description
-      "This is the callback notification that the controller invokes on the carrier system.";
-    input {
-      uses org-openroadm-common-service-types:configuration-response-common;
-      uses org-openroadm-common-service-types:service-identifiers-container;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-    }
-  }
-
-  rpc service-reroute {
-    description
-      "Whether this request was validated and processed correctly. If successful, it returns the proposed new route.
-       If acceptable, this request should be followed by a service-reroute-confirm to complete the reroute operation.";
-    input {
-      leaf service-name {
-        type string;
-        mandatory true;
-        description
-          "Identifier for the service to be re-routed in
-           the ROADM network, e.g., CLFI, CLCI, etc.";
-      }
-      uses org-openroadm-common-service-types:sdnc-request-header;
-      uses org-openroadm-common-service-types:routing-metric;
-      uses org-openroadm-common-service-types:service-resiliency;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-      uses org-openroadm-routing-constraints:routing-constraints;
-    }
-  }
-
-  rpc service-reroute-confirm {
-    description
-      "Whether this request passed initial validation and was accepted for processing. Once the request completes processing, a
-       service-rpc-result Notification shall be sent.";
-    input {
-      leaf service-name {
-        type string;
-        mandatory true;
-        description
-          "Identifier for the service to be re-routed in
-           the ROADM network, e.g., CLFI, CLCI, etc.";
-      }
-      uses org-openroadm-common-service-types:sdnc-request-header;
-      uses org-openroadm-routing-constraints:routing-constraints;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-    }
-  }
-
-  rpc service-reroute-confirm-result-notification-request {
-    description
-      "This is the callback notification that the controller invokes on the carrier system.";
-    input {
-      uses org-openroadm-common-service-types:configuration-response-common;
-      uses org-openroadm-common-service-types:service-identifiers-container;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-    }
-  }
-
-  rpc optical-tunnel-create {
-    description
-      "This rpc is used in a second step of service creation when the connection-type is
-          an optical-tunnel. The optical tunnel rendering implies that end terminals optical
-          interfaces such as router pluggables are tuned to the a correct wavelength and that
-          the output power is set so that control loop can operate during connection setting.
-          The rpc is invoked to confirm the optical tunnel can be established.";
-    input {
-      leaf service-name {
-        type string;
-        mandatory true;
-        description
-          "Identifier used in the second step of the optical-tunnel service creation.  
-           Identifies the service (optical tunnel between SRG PPs) to be created 
-           in the ROADM network.";
-      }
-      leaf common-id {
-        type string;
-        mandatory true;
-        description
-          "Identifier used in the first step of optical-tunnelservice creation using 
-          temp-service-create rpc. Identifies the temporary service for which resources 
-          have been reserved after a successful path computation";
-      }
-      leaf set-frequency {
-        type org-openroadm-common-optical-channel-types:frequency-THz;
-        mandatory true;
-        description
-          "Center Frequency in THz.";
-      }
-      leaf full-bandwidth-at-3dB {
-        type org-openroadm-common-optical-channel-types:frequency-GHz;
-        mandatory true;
-        description
-          "Signal full bandwidth at 3dB bellow the peak in GHz.";
-      }
-      leaf full-bandwidth-at-10dB {
-        type org-openroadm-common-optical-channel-types:frequency-GHz;
-        mandatory true;
-        description
-            "Signal full bandwidth at 10dB bellow the peak in GHz.";
-      }
-      uses org-openroadm-common-service-types:sdnc-request-header;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-    }
-  }
-
-  rpc optical-tunnel-request-cancel {
-    description
-      "This rpc is used to abort service creation when the connection-type is
-            an optical-tunnel, if the conditions required to set-up the end to end service
-          can not be met by the end terminals optical interfaces such as router pluggables.
-          When the rpc is invoked, any resource temporary reserved for the second step of
-          service creation shall be released : this rpc cancels service path rendering between
-          SRG PPs.";
-    input {
-      leaf service-name {
-        type string;
-        description
-          "Identifier used in the first step of service creation using service create rpc.";
-      }
-      leaf common-id {
-        type string;
-        description
-          "Identifier used in the first step of optical-tunnelservice creation using 
-           temp-service-create rpc. Identifies the temporary service for which resources 
-           have been reserved after a successful path computation";
-      } 
-      uses org-openroadm-common-service-types:sdnc-request-header;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-    }
-  }
-
-  rpc network-re-optimization {
-    input {
-      leaf service-name {
-        type string;
-        description
-          "Identifier for the service in the ROADM network,
-           e.g., CLFI, CLCI, etc. whose path is to be checked by the RNC
-           for re-optimization";
-      }
-      leaf a-end {
-        type string;
-        description
-          "Services whose A-ends are terminated at the
-           specified office location are to be checked by the RNC for
-           re-optimization";
-      }
-      leaf z-end {
-        type string;
-        description
-          "Services whose Z-ends are terminated at the
-           specified office location are to be checked by the RNC for
-           re-optimization ";
-      }
-      leaf pass-through {
-        type string;
-        description
-          "Services that are pass-through (either via
-           regen or express) at the specified office location are to
-           be checked by the RNC for re-optimization";
-      }
-      leaf customer-code {
-        type string;
-        description
-          "Services that belong to the specified customer
-           are to be checked by the RNC for re-optimization ";
-      }
-      uses org-openroadm-common-service-types:sdnc-request-header;
-      uses org-openroadm-common-service-types:routing-metric;
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-      leaf optimization-candidate {
-        type string;
-      }
-    }
-  }
-
-rpc add-openroadm-operational-modes-to-catalog {
-           description
-             "This rpc is used to feed the operational mode catalog with openroadm operational modes";
-           input {
-             uses org-openroadm-common-service-types:sdnc-request-header;
-             container operational-mode-info {
-                    container grid-parameters {
-                                    description
-                                      "Parameters associated with global spectrum use";
-                                    uses org-openroadm-operational-mode-catalog:operational-mode-grid-parameters;
-                            }
-                                container xponders-pluggables {
-                                        description
-                                           "Parameters associated with xponders and pluggables";
-                                    list xponder-pluggable-openroadm-operational-mode {
-                                               key "openroadm-operational-mode-id";
-                                               description
-                                                 "defines the openroadm operational mode pointing to an official specification ";
-                                               leaf openroadm-operational-mode-id {
-                                                   type string;
-                                                   description
-                                                       "openroadm operational mode which points to a specific spreadsheet of optical specifications";
-                                                   }
-                                       uses org-openroadm-operational-mode-catalog:operational-mode-transponder-parameters;
-                        }
-                                }
-                                container roadms {
-                                    description
-                                      "Parameters associated with roadms";
-                                    uses org-openroadm-operational-mode-catalog:operational-mode-roadm-express-parameters;
-                                    uses org-openroadm-operational-mode-catalog:operational-mode-roadm-add-parameters;
-                                    uses org-openroadm-operational-mode-catalog:operational-mode-roadm-drop-parameters;
-                            }
-                                container amplifiers {
-                                    description
-                                      "Parameters associated with amplifiers";
-                                    uses org-openroadm-operational-mode-catalog:operational-mode-amplifier-parameters;
-                            }
-             }
-           }
-           output {
-             uses org-openroadm-common-service-types:configuration-response-common;
-           }
-  }
-  rpc add-specific-operational-modes-to-catalog {
-    description
-      "This rpc is used to feed the operational mode catalog with specific operational modes for
-           \txponders or external pluggables";
-    input {
-      uses org-openroadm-common-service-types:sdnc-request-header;
-      container operational-mode-info {
-        container specific-operational-modes {
-          description
-            "All specific operational modes corresponding to bookended or alien units";
-          list specific-operational-mode {
-            key "operational-mode-id";
-            description
-              "List of all declared specific operationnal modes";
-            leaf operational-mode-id {
-              type string;
-              description
-                "unique identifier which identifies the operational mode";
-            }
-            uses org-openroadm-operational-mode-catalog:operational-mode-grid-parameters;
-            uses org-openroadm-operational-mode-catalog:operational-mode-transponder-parameters;
-          }
-        }
-      }
-    }
-    output {
-      uses org-openroadm-common-service-types:configuration-response-common;
-    }
-  }
-  
-  rpc service-srlg-get {
-    input {
-      leaf service-name {
-        type string;
-        description
-          "Identifier for the service in the ROADM network,
-          e.g., CLFI, CLCI, etc. whose path or other risks must be evaluated by the RNC";
-      }
-      leaf SRLG-type {
-        type org-openroadm-common-types:SRLG-type;
-        description
-          "Type of SRLG, Site SRLG, Node SRLG, Fiber SRLG or Link SRLG. If SRLG-type is not provided 
-          in input, output should include all types of SRLGs for a given service-name";
-      }
-      leaf due-date {
-        type yang:date-and-time;
-        description
-          "Due-date is required to get list of SRLGs for specific validity period. If Due-date is not 
-          provited in the input, RPC should return list of current/active SRLGS";
-      }
-    }
-    output {
-      list SRLG-list {
-        key "SRLG-Id";
-        leaf SRLG-Id {
-          type uint32;
-          description
-            "unique identifier for SRLG";
-        }
-        leaf SRLG-name {
-          type string;
-          description
-            "Name of the SRLG";
-        }
-        leaf SRLG-type {
-          type org-openroadm-common-types:SRLG-type; 
-          description
-            "Type of SRLG, Site SRLG, Node SRLG, Fiber SRLG or Link SRLG";
-        }
-        leaf SRLG-length {
-          type decimal64 {
-            fraction-digits 2;
-          }
-          description
-            "Fiber length in desired distance unit of measure";
-        }
-      }
-    } 
-  }
-
-  notification service-rpc-result {
-    description
-      "This Notification indicates result of service RPC";
-    leaf notification-type {
-      type org-openroadm-common-service-types:service-notification-types;
-    }
-    uses org-openroadm-common-types:rpc-response-status;
-    uses org-openroadm-common-service-types:service-notification-result;
-    container path-computation-result {
-      when "../notification-type = 'path-computation-result'" {
-        description
-          "an optical-tunnel service triggers the leaf providing
-           information on the operationnal mode selected by the pce";
-      }
-      container aToZ {
-        description
-          "Describes the settings and the performances for the A to Z path";
-        uses org-openroadm-resource:common-och-otsi-attributes;
-        uses org-openroadm-resource:path-computation-outputs;
-      }
-      container zToA {
-        description
-          "Describes the settings and the performances for the Z to A path";
-        uses org-openroadm-resource:common-och-otsi-attributes;
-        uses org-openroadm-resource:path-computation-outputs;
-      }
-    }
-  }
-
-  notification service-traffic-flow {
-    description
-      "This Notification indicates that traffic is flowing again on the service after an administrative action has completed";
-    leaf service-name {
-      type string;
-      mandatory true;
-      description
-        "Identifier for the service being reported on";
-    }
-    leaf version-number {
-      type uint64;
-      description
-        "Identifier for the versioned service";
-    }
-    leaf actual-date {
-      type yang:date-and-time;
-      description
-        "Actual date and time traffic started flowing";
-    }
-  }
-
-  notification service-notification {
-    description
-      "This Notification that a service has been added, modified or removed.
-       A resourceCreation notification shall contain the created service in its entirety.
-       A resourceModified notification shall contain just the modified field, plus the service identifier
-       A resourceDeleted notification shall just contain the service identifier";
-    leaf notificationType {
-      type org-openroadm-resource-types:resource-notification-type;
-      description
-        "Whether this notification indicates a service creation, service modification or service deletion.";
-    }
-    leaf version-number {
-      type uint64;
-      description
-        "Identifier for the versioned service";
-    }
-    uses org-openroadm-common-service-types:service;
-  }
-
-  notification optical-tunnel-created {
-    description
-      "This Notification is used to confirm that an optical-tunnel service has been created.
-       It shall contain the created service in its entirety";
-    leaf notificationType {
-      type org-openroadm-resource-types:resource-notification-type;
-      description
-        "Whether this notification indicates a service creation, or service-reconfigure.";
-    }
-    leaf version-number {
-      type uint64;
-      description
-        "Identifier for the versioned service";
-    }
-    leaf actual-date {
-      type yang:date-and-time;
-      description
-        "Actual date and time traffic started flowing";
-    }
-    uses org-openroadm-common-service-types:service;
-  }
-  
-  notification non-rpc-related-notification {
-    description
-      "Used to notify SDN controller that :
-       _a change occured in the data tree associated with the topology or the service Datastore of the RNC
-       _the attenuation on a ROADM to ROADM link as exceeded the value that can be accepted with current design
-       _the restoration of an optical OTN/WDM service";
-    leaf notificationType {
-      type org-openroadm-controller-customization:non-rpc-related-notification-type;
-      description
-        "This notification indicates whether a change occured in the data tree
-         associated with the topology or the service Datastore, an out of limit
-         attenuation on a WDM link, or the restoration of an optical WDM/OTN service.";
-    }
-    leaf notificationId {
-      type string;
-      description
-        "Unique identifier for the notification.";
-    }
-    leaf notification-time {
-      type yang:date-and-time;
-      description
-        "Time at which notification is raised";
-    }
-    leaf service-name {
-      when "../notificationType = 'service-state-change' or ../notificationType = 'autonomous-optical-restoration-triggered'" {
-        description
-          "When Service Data store is modified, or a restoration has been triggered
-           service-name is provided";
-      }
-      type string;
-    }
-    leaf impacted-resource-type {
-      when "../notificationType = 'topology-change' or ../notificationType = 'service-state-change'" {
-        description
-          "Used to provide additional information on the type of resource impacted by the
-           change in the data-store, to target more effectively consecutive request";
-      }
-      type string;
-    }
-    leaf impacted-resource-id {
-      when "../notificationType = 'topology-change' or ../notificationType = 'service-state-change'" {
-        description
-          "Identifies the resource impacted by the change in the data-store";
-      }
-      type string;
-    }
-    leaf topology-layer {
-      when "../notificationType = 'topology-change'" {
-        description
-          "indicates the layer associated with the topological change";
-      }
-      type enumeration {
-        enum openroadm-topology {
-          value 1;
-        }
-        enum otn-topology {
-          value 2;
-        }
-      }
-    }
-  }
-
-  container service-list {
-    description
-      "List of service. Can only be created, deleted, modified, etc. using special RPCs. Will only contain one service with a given name.
-       Does not contain historical (deleted or rather those passed their end time) or draft services. If two services exist with the same
-       name (with non-lapping start-end times for example), this table will contain the current one. If only planned services exist for
-       the name, the one with the earliest start time will be present
-      ";
-    list services {
-      key "service-name";
-      uses org-openroadm-common-service-types:service;
-    }
-  }
-  container versioned-service-list {
-    description
-      "List of service, regardless of lifecycle state. Can only be created, deleted, modified, etc. using special RPCs. Can report more than one
-       version of a service, if supported by the implementation. May contain deleted services, multiple versions of the same service, as identified
-       by its name, etc.";
-    list services {
-      key "service-name version-number";
-      leaf version-number {
-        type uint64;
-      }
-      uses org-openroadm-common-service-types:service;
-    }
-  }
-  container temp-service-list {
-    description
-      "List of temporary services Can only be created, deleted, modified, etc. using special RPCs.";
-    list services {
-      key "common-id";
-      uses org-openroadm-common-service-types:service {
-        refine "service-name" {
-          mandatory false;
-        }
-        augment "service-a-end" {
-          list equipment-required {
-            key "equipment-identifier";
-            description
-              "List of required equipment, including equipment type, state and
-              quantity";
-            uses org-openroadm-common-service-types:equipment-info;
-          }
-        }
-        augment "service-z-end" {
-          list equipment-required {
-            key "equipment-identifier";
-            description
-              "List of required equipment, including equipment type, state and
-              quantity";
-            uses org-openroadm-common-service-types:equipment-info;
-          }
-        }
-      }
-      uses org-openroadm-common-service-types:intermediate-site-container;
-      list supporting-service-hierarchy {
-        key "service-identifier";
-        uses org-openroadm-common-service-types:service-hierarchy;
-        description
-          "This lists all the supporting services and their respective hierarchy, includes the
-          proposed one";
-      }
-      uses org-openroadm-common-service-types:existing-service-grouping {
-        refine "existing-service-attributes/reusable-existing-resources" {
-          default "all";
-        }
-      }
-    }
-  }
-  container controller-behaviour-settings {
-    description
-      "Parameters allowing to set the controller behaviour";
-    uses org-openroadm-controller-customization:controller-parameters;
-  }
-  container operational-mode-catalog {
-    description
-      "Store parameters associated with openroadm specifications and specific operational modes";
-    uses org-openroadm-operational-mode-catalog:operational-mode-catalog;
-  }
-}
diff --git a/ordmodels/service/src/main/yang/org-openroadm-topology@2021-12-10.yang b/ordmodels/service/src/main/yang/org-openroadm-topology@2021-12-10.yang
deleted file mode 100644 (file)
index 9cce1d1..0000000
+++ /dev/null
@@ -1,233 +0,0 @@
-module org-openroadm-topology {
-  namespace "http://org/openroadm/topology";
-  prefix org-openroadm-topology;
-
-  import org-openroadm-resource {
-    prefix org-openroadm-resource;
-    revision-date 2021-12-10;
-  }
-  import org-openroadm-network-resource {
-    prefix org-openroadm-network-resource;
-    revision-date 2019-11-29;
-  }
-
-  organization
-    "Open ROADM MSA";
-  contact
-    "OpenROADM.org";
-  description
-    "YANG definitions of topology.
-
-      Copyright of the Members of the Open ROADM MSA Agreement dated (c) 2016,
-      All other rights reserved.
-
-      Redistribution and use in source and binary forms, with or without modification,
-      are permitted provided that the following conditions are met:
-
-      * Redistributions of source code must retain the above copyright notice, this
-        list of conditions and the following disclaimer.
-      * Redistributions in binary form must reproduce the above copyright notice,
-        this list of conditions and the following disclaimer in the documentation and/or
-        other materials provided with the distribution.
-      * Neither the Members of the Open ROADM MSA Agreement nor the names of its
-        contributors may be used to endorse or promote products derived from this software
-        without specific prior written permission.
-
-      THIS SOFTWARE IS PROVIDED BY THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT ''AS IS''
-      AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-      WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
-      IN NO EVENT THE MEMBERS OF THE OPEN ROADM MSA  AGREEMENT BE LIABLE FOR ANY DIRECT,
-      INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
-      NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;  LOSS OF USE, DATA,
-      OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-      WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-      ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-      POSSIBILITY OF SUCH DAMAGE";
-
-  revision 2021-12-10 {
-    description
-      "Version 10.1";
-  }
-  revision 2021-09-24 {
-    description
-      "Version 10.0";
-  }
-  revision 2021-05-28 {
-    description
-      "Version 9.1";
-  }
-  revision 2021-03-26 {
-    description
-      "Version 9.0";
-  }
-  revision 2020-05-29 {
-    description
-      "Version 7.1.0";
-  }
-  revision 2020-03-27 {
-    description
-      "Version 7.0.0";
-  }
-  revision 2019-11-29 {
-    description
-      "Version 6.1.0";
-  }
-  revision 2019-09-27 {
-    description
-      "Version 6.0.0";
-  }
-  revision 2019-05-31 {
-    description
-      "Version 5.1.0";
-  }
-  revision 2019-03-29 {
-    description
-      "Version 5.0.0";
-  }
-  revision 2018-11-30 {
-    description
-      "Version 4.1.0";
-  }
-  revision 2018-09-28 {
-    description
-      "Version 4.0.0";
-  }
-  revision 2018-03-30 {
-    description
-      "Version 3.0.0";
-  }
-  revision 2017-12-15 {
-    description
-      "Version 2.2";
-  }
-  revision 2017-09-29 {
-    description
-      "Version 2.1";
-  }
-  revision 2017-07-28 {
-    description
-      "Version 2.0.1 - added revision-date to imports";
-  }
-  revision 2017-06-26 {
-    description
-      "Version 2.0";
-  }
-  revision 2016-10-14 {
-    description
-      "Version 1.2";
-  }
-
-  grouping topology {
-    description
-      "Topology reports the individual hops along the service in the A to Z direction and Z to A directions.  This includes both ports internal to a device and those
-       at its edge that are available for externally connections. It includes both physical and logical ports.
-       Physical ports are ordered with the logical ports that run over them as follows:
-       a.\t On ingress to a node/card, physical then logical
-       b.\t On egress to a node/card, logical then physical";
-    list aToZ {
-      key "id";
-      leaf id {
-        type string;
-        description
-          "Unique identifier for this topology component within this service";
-      }
-         container computation-results {
-                 description 
-                       "parameters resulting of path computation";
-                 uses org-openroadm-resource:path-computation-outputs;
-         }
-      uses route_info;
-      uses hop;
-    }
-    list zToA {
-      key "id";
-      leaf id {
-        type string;
-        description
-          "Unique identifier for this topology component within this service";
-      }
-         container computation-results {
-                 description 
-                       "parameters resulting of path computation";
-                 uses org-openroadm-resource:path-computation-outputs;
-         }
-      uses route_info;
-      uses hop;
-    }
-  }
-
-  grouping route_info {
-      leaf subroute_id {
-        type string;
-        description
-          "Unique identifier for the subroute or segment of the topology";
-      }
-      leaf-list previous_ids {
-        type string;
-        description
-          "Pointer to the previous id or set of ids that allows reconstruction
-           of the end-to-end route from the segments. Can be omitted if the
-           previous-id = current-id – 1 (if id is a number-based string) or if
-           each subroute is already representing an end-to-end route.";
-      }
-  }
-
-  grouping hop {
-    leaf hop-type {
-      type enumeration {
-        enum node-external {
-          value 1;
-          description
-            "The given resource is on the edge of the node, and used in relationships to resources outside of the node.";
-        }
-        enum node-internal {
-          value 2;
-          description
-            "The given resource is internally to the node";
-        }
-      }
-    }
-    uses org-openroadm-resource:resource {
-      augment "resource/resource/interface" {
-        uses org-openroadm-resource:resource-reporting;
-      }
-      augment "resource/resource/circuit-pack" {
-        leaf circuit-pack-type {
-          type string;
-          description
-            "Type of circuit-pack";
-        }
-        leaf circuit-pack-product-code {
-          type string;
-          description
-            "Product code of the circuit-pack";
-        }
-      }
-    }
-  }
-
-  grouping network-topology {
-    description
-      "network-topology defines the ordered a-to-z and z-to-a topology in terms of network model entities: tp-id and link-id";
-    list a-to-z {
-      key "id";
-      leaf id {
-        type string;
-        description
-          "Unique identifier for this network-topology component within this service";
-      }
-      uses route_info;
-      uses org-openroadm-network-resource:network-resource;
-    }
-    list z-to-a {
-      key "id";
-      leaf id {
-        type string;
-        description
-          "Unigue identifier for this network-topology component within this service";
-      }
-      uses route_info;
-      uses org-openroadm-network-resource:network-resource;
-    }
-  }
-}
index 7d340d04edc94f98feb4649b5cb18726e8c84054..ada9a590cd2d9214505a3941bd01d25ea4081547 100644 (file)
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>8.0.11</version>
+    <version>13.0.1</version>
     <relativePath/>
   </parent>
 
   <groupId>org.opendaylight.transportpce</groupId>
   <artifactId>transportpce-pce</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
+  <version>10.0.0-SNAPSHOT</version>
   <packaging>bundle</packaging>
 
+  <properties>
+    <transportpce.models.version>20.0.0-SNAPSHOT</transportpce.models.version>
+  </properties>
+
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.opendaylight.transportpce.models</groupId>
+        <artifactId>transportpce-models-artifacts</artifactId>
+        <version>${transportpce.models.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+      <dependency>
+        <groupId>org.opendaylight.mdsal</groupId>
+        <artifactId>mdsal-artifacts</artifactId>
+        <version>13.0.1</version>
+        <scope>import</scope>
+        <type>pom</type>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
   <dependencies>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-common</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-2.2.1</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-device</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-7.1.0</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-network</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-13.1.0</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-service</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-device-7.1.0</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-network-13.1.0</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-service-13.1.0</artifactId>
     </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
       <groupId>org.opendaylight.yangtools</groupId>
       <artifactId>yang-common</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>yang-model-api</artifactId>
-    </dependency>
     <dependency>
       <groupId>org.opendaylight.yangtools</groupId>
       <artifactId>yang-data-api</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>yang-data-impl</artifactId>
-    </dependency>
     <dependency>
       <groupId>org.opendaylight.yangtools</groupId>
       <artifactId>yang-data-codec-gson</artifactId>
       <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
       <artifactId>rfc6991-ietf-inet-types</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
-      <artifactId>rfc6991-ietf-yang-types</artifactId>
-    </dependency>
     <dependency>
       <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
       <artifactId>rfc8345-ietf-network</artifactId>
       <groupId>org.opendaylight.mdsal</groupId>
       <artifactId>mdsal-binding-api</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.opendaylight.mdsal</groupId>
-      <artifactId>mdsal-binding-dom-codec</artifactId>
-    </dependency>
     <dependency>
       <groupId>org.opendaylight.mdsal</groupId>
       <artifactId>mdsal-binding-dom-codec-spi</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.opendaylight.mdsal</groupId>
-      <artifactId>mdsal-binding-runtime-api</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.mdsal</groupId>
-      <artifactId>mdsal-binding-runtime-spi</artifactId>
-    </dependency>
     <dependency>
       <groupId>com.google.guava</groupId>
       <artifactId>guava</artifactId>
     </dependency>
-    <dependency>
-      <groupId>com.google.code.gson</groupId>
-      <artifactId>gson</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-databind</artifactId>
-    </dependency>
     <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-annotations</artifactId>
     </dependency>
-    <dependency>
-      <groupId>com.fasterxml.jackson.core</groupId>
-      <artifactId>jackson-core</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.fasterxml.jackson.datatype</groupId>
-      <artifactId>jackson-datatype-jsr310</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>javax.ws.rs</groupId>
-      <artifactId>javax.ws.rs-api</artifactId>
-    </dependency>
     <dependency>
       <groupId>org.glassfish.jersey.core</groupId>
       <artifactId>jersey-common</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.glassfish.jersey.core</groupId>
-      <artifactId>jersey-server</artifactId>
-    </dependency>
     <dependency>
       <groupId>org.glassfish.jersey.core</groupId>
       <artifactId>jersey-client</artifactId>
     <dependency>
       <groupId>org.jgrapht</groupId>
       <artifactId>jgrapht-core</artifactId>
-      <version>1.2.0</version>
+      <version>1.5.2</version>
+    </dependency>
+    <dependency>
+      <groupId>com.github.spotbugs</groupId>
+      <artifactId>spotbugs-annotations</artifactId>
+      <optional>true</optional>
+    </dependency>
+    <dependency>
+      <groupId>jakarta.ws.rs</groupId>
+      <artifactId>jakarta.ws.rs-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.service.component.annotations</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.service.metatype.annotations</artifactId>
     </dependency>
 
     <!-- Testing Dependencies -->
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-device-2.2.1</artifactId>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>org.opendaylight.transportpce</groupId>
       <artifactId>test-common</artifactId>
       <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.yangtools</groupId>
+      <artifactId>yang-model-api</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.yangtools</groupId>
+      <artifactId>yang-data-impl</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
+      <artifactId>rfc6991-ietf-yang-types</artifactId>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>org.opendaylight.mdsal</groupId>
       <artifactId>mdsal-binding-generator</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-core</artifactId>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>mdsal-binding-runtime-api</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>mdsal-binding-runtime-spi</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>mdsal-binding-dom-codec</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>org.powermock</groupId>
-      <artifactId>powermock-core</artifactId>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>org.powermock</groupId>
-      <artifactId>powermock-api-mockito2</artifactId>
+      <groupId>com.google.code.gson</groupId>
+      <artifactId>gson</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>org.powermock</groupId>
-      <artifactId>powermock-module-junit4</artifactId>
+      <groupId>org.glassfish.jersey.core</groupId>
+      <artifactId>jersey-server</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>
     <dependency>
       <groupId>org.glassfish.grizzly</groupId>
       <artifactId>grizzly-http-server</artifactId>
-      <version>2.4.0</version>
+      <version>4.0.2</version>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>javax.activation</groupId>
-      <artifactId>javax.activation-api</artifactId>
-      <version>1.2.0</version>
+      <groupId>jakarta.activation</groupId>
+      <artifactId>jakarta.activation-api</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>
index a1c20992296ceb9afe677586f4a2adbd7a54595a..72476971b1dc4ddd7e83e85594d760a3f6194796 100644 (file)
@@ -7,7 +7,8 @@
  */
 package org.opendaylight.transportpce.pce;
 
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRerouteRequestInput;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -56,4 +57,18 @@ public final class PceComplianceCheck {
         return new PceComplianceCheckResult(result, message);
     }
 
+    public static PceComplianceCheckResult check(PathComputationRerouteRequestInput input) {
+        if (input == null) {
+            return new PceComplianceCheckResult(false, "");
+        }
+        if (input.getEndpoints() == null
+                || input.getEndpoints().getAEndTp() == null
+                || input.getEndpoints().getZEndTp() == null) {
+            String message = "At least one of the termination points is missing";
+            LOG.debug(message);
+            return new PceComplianceCheckResult(false, message);
+        }
+        return new PceComplianceCheckResult(true, "");
+    }
+
 }
index fa5796f88f554390193a3c611aa3e5d2b9151029..6e2f3d5b37d84f59ee9102314cee5e2c8e28e6b3 100644 (file)
@@ -14,27 +14,29 @@ import java.util.Map;
 import org.opendaylight.transportpce.common.ResponseCodes;
 import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.transportpce.common.fixedflex.GridConstant;
+import org.opendaylight.transportpce.common.fixedflex.GridUtils;
 import org.opendaylight.transportpce.pce.networkanalyzer.PceLink;
 import org.opendaylight.transportpce.pce.networkanalyzer.PceResult;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev211210.FrequencyTHz;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev230526.FrequencyTHz;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.ModulationFormat;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev181130.OpucnTribSlotDef;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZ;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZKey;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToA;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToABuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToAKey;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.Resource;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.ResourceBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.LinkBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.NodeBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.TerminationPoint;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.TerminationPointBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OpucnTribSlotDef;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZ;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToA;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToABuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToAKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.Resource;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.ResourceBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.LinkBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.NodeBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.TerminationPoint;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.TerminationPointBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -86,10 +88,11 @@ public class PcePathDescription {
      * @return a builder for AtoZDirection object
      */
     private AToZDirectionBuilder buildAtoZDirection(Map<AToZKey, AToZ> atozMap) {
+        ModulationFormat modulationFormat = GridConstant.RATE_MODULATION_FORMAT_MAP
+                .getOrDefault(Uint32.valueOf(rc.getRate()), ModulationFormat.DpQpsk);
         AToZDirectionBuilder atoZDirectionBldr = new AToZDirectionBuilder()
             .setRate(Uint32.valueOf(rc.getRate()))
-            .setModulationFormat(GridConstant.RATE_MODULATION_FORMAT_MAP
-                    .getOrDefault(Uint32.valueOf(rc.getRate()), ModulationFormat.DpQpsk).getName())
+            .setModulationFormat(modulationFormat.getName())
             .setAToZ(atozMap);
         switch (rc.getServiceType()) {
             case StringConstants.SERVICE_TYPE_400GE:
@@ -98,9 +101,15 @@ public class PcePathDescription {
             case StringConstants.SERVICE_TYPE_OTUC4:
             case StringConstants.SERVICE_TYPE_100GE_T:
             case StringConstants.SERVICE_TYPE_OTU4:
-                atoZDirectionBldr.setAToZMaxFrequency(new FrequencyTHz(rc.getMaxFreq()));
-                atoZDirectionBldr.setAToZMinFrequency(new FrequencyTHz(rc.getMinFreq()));
-                atoZDirectionBldr.setAToZWavelengthNumber(Uint32.valueOf(rc.getResultWavelength()));
+                atoZDirectionBldr
+                        .setAToZMaxFrequency(new FrequencyTHz(Decimal64.valueOf(rc.getMaxFreq())))
+                        .setAToZMinFrequency(new FrequencyTHz(Decimal64.valueOf(rc.getMinFreq())))
+                        .setAToZWavelengthNumber(Uint32.valueOf(rc.getResultWavelength()))
+                        // Used precision 5 to get the exact decimal values of the frequency
+                        .setCentralFrequency(new FrequencyTHz(GridUtils.getCentralFrequencyWithPrecision(
+                                rc.getMinFreq(), rc.getMaxFreq(), 5).getValue()))
+                        .setWidth(GridUtils.getWidthFromRateAndModulationFormat(
+                                Uint32.valueOf(rc.getRate()), modulationFormat));
                 break;
             case StringConstants.SERVICE_TYPE_100GE_M:
             case StringConstants.SERVICE_TYPE_100GE_S:
@@ -134,9 +143,10 @@ public class PcePathDescription {
      * @return a builder for ZtoADirection object
      */
     private ZToADirectionBuilder buildZtoADirection(Map<ZToAKey, ZToA> ztoaMap) {
+        ModulationFormat modulationFormat = GridConstant.RATE_MODULATION_FORMAT_MAP
+                .getOrDefault(Uint32.valueOf(rc.getRate()), ModulationFormat.DpQpsk);
         ZToADirectionBuilder ztoADirectionBldr = new ZToADirectionBuilder().setRate(Uint32.valueOf(rc.getRate()))
-                .setModulationFormat(GridConstant.RATE_MODULATION_FORMAT_MAP
-                        .getOrDefault(Uint32.valueOf(rc.getRate()), ModulationFormat.DpQpsk).getName())
+                .setModulationFormat(modulationFormat.getName())
                 .setZToA(ztoaMap);
         switch (rc.getServiceType()) {
             case StringConstants.SERVICE_TYPE_400GE:
@@ -145,9 +155,14 @@ public class PcePathDescription {
             case StringConstants.SERVICE_TYPE_OTUC4:
             case StringConstants.SERVICE_TYPE_100GE_T:
             case StringConstants.SERVICE_TYPE_OTU4:
-                ztoADirectionBldr.setZToAMaxFrequency(new FrequencyTHz(rc.getMaxFreq()));
-                ztoADirectionBldr.setZToAMinFrequency(new FrequencyTHz(rc.getMinFreq()));
-                ztoADirectionBldr.setZToAWavelengthNumber(Uint32.valueOf(rc.getResultWavelength()));
+                ztoADirectionBldr
+                        .setZToAMaxFrequency(new FrequencyTHz(Decimal64.valueOf(rc.getMaxFreq())))
+                        .setZToAMinFrequency(new FrequencyTHz(Decimal64.valueOf(rc.getMinFreq())))
+                        .setZToAWavelengthNumber(Uint32.valueOf(rc.getResultWavelength()))
+                        .setCentralFrequency(new FrequencyTHz(GridUtils.getCentralFrequencyWithPrecision(
+                                rc.getMinFreq(), rc.getMaxFreq(), 4).getValue()))
+                        .setWidth(GridUtils.getWidthFromRateAndModulationFormat(
+                                Uint32.valueOf(rc.getRate()), modulationFormat));
                 break;
             case StringConstants.SERVICE_TYPE_100GE_M:
             case StringConstants.SERVICE_TYPE_100GE_S:
@@ -184,7 +199,7 @@ public class PcePathDescription {
         AToZ lastResource = null;
 
         // build A side Client TP
-        String tpName = path.get(0).getClient();
+        String tpName = path.get(0).getClientA();
         String xname = path.get(0).getSourceId().getValue();
         TerminationPoint stp = new TerminationPointBuilder()
                 .setTpId(tpName).setTpNodeId(xname)
@@ -198,10 +213,10 @@ public class PcePathDescription {
         for (PceLink pcelink : path) {
             String srcName = pcelink.getSourceId().getValue();
             // Nodes
-            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce
-                .resource.resource.resource.Node sourceNode = new NodeBuilder()
-                .setNodeId(srcName)
-                .build();
+            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501
+                    .pce.resource.resource.resource.Node sourceNode = new NodeBuilder()
+                    .setNodeId(srcName)
+                    .build();
 
             // Source Resource
             AToZKey sourceKey = new AToZKey(index.toString());
@@ -225,10 +240,10 @@ public class PcePathDescription {
 
             String linkName = pcelink.getLinkId().getValue();
             // Link
-            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce
-                .resource.resource.resource.Link atozLink = new LinkBuilder()
-                .setLinkId(linkName)
-                .build();
+            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501
+                    .pce.resource.resource.resource.Link atozLink = new LinkBuilder()
+                    .setLinkId(linkName)
+                    .build();
 
             // Link Resource
             AToZKey linkKey = new AToZKey(index.toString());
@@ -251,7 +266,7 @@ public class PcePathDescription {
             index += 1;
             atozMap.put(ttpResource.key(),ttpResource);
 
-            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce
+            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce
                 .resource.resource.resource.Node targetNode = new NodeBuilder()
                 .setNodeId(destName)
                 .build();
@@ -269,7 +284,7 @@ public class PcePathDescription {
         }
 
         // build Z side Client TP
-        tpName = lastLink.getClient();
+        tpName = lastLink.getClientZ();
         xname = lastLink.getDestId().getValue();
         stp = new TerminationPointBuilder()
                 .setTpNodeId(xname).setTpId(tpName)
@@ -290,7 +305,7 @@ public class PcePathDescription {
 
         // build Z size Client TP
         PceLink pcelink = this.allPceLinks.get(path.get(0).getOppositeLink());
-        String tpName = pcelink.getClient();
+        String tpName = pcelink.getClientA();
         String xname = pcelink.getSourceId().getValue();
         TerminationPoint stp = new TerminationPointBuilder()
                 .setTpNodeId(xname).setTpId(tpName)
@@ -311,7 +326,7 @@ public class PcePathDescription {
 
 
             // Nodes
-            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce
+            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce
                 .resource.resource.resource.Node sourceNode = new NodeBuilder()
                 .setNodeId(srcName).build();
 
@@ -338,7 +353,7 @@ public class PcePathDescription {
 
             String linkName = pcelink.getLinkId().getValue();
             // Link
-            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce
+            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce
                 .resource.resource.resource.Link ztoaLink = new LinkBuilder()
                 .setLinkId(linkName).build();
 
@@ -363,7 +378,7 @@ public class PcePathDescription {
             ztoaList.put(ttpResource.key(),ttpResource);
 
 
-            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce
+            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce
                 .resource.resource.resource.Node targetNode = new NodeBuilder()
                 .setNodeId(destName).build();
             // Target Resource
@@ -378,7 +393,7 @@ public class PcePathDescription {
         }
 
         // build Z side Client TP
-        tpName = lastLink.getClient();
+        tpName = lastLink.getClientZ();
         xname = lastLink.getDestId().getValue();
         stp = new TerminationPointBuilder()
                 .setTpNodeId(xname).setTpId(tpName).build();
index ea0c17f44d4d3305385b2b458d3490829801a620..08b46d744edc30a86cd5ff183a7b0ea1cb0421c2 100644 (file)
@@ -11,6 +11,7 @@ package org.opendaylight.transportpce.pce;
 import org.opendaylight.transportpce.common.ResponseCodes;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
+import org.opendaylight.transportpce.pce.constraints.OperatorConstraints;
 import org.opendaylight.transportpce.pce.constraints.PceConstraints;
 import org.opendaylight.transportpce.pce.constraints.PceConstraintsCalc;
 import org.opendaylight.transportpce.pce.gnpy.GnpyException;
@@ -20,12 +21,14 @@ import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumer;
 import org.opendaylight.transportpce.pce.graph.PceGraph;
 import org.opendaylight.transportpce.pce.networkanalyzer.PceCalculation;
 import org.opendaylight.transportpce.pce.networkanalyzer.PceResult;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.service.path.rpc.result.PathDescriptionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.HardConstraints;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirection;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirection;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PceConstraintMode;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.reroute.request.input.Endpoints;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.service.path.rpc.result.PathDescriptionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.HardConstraints;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirection;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirection;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.PceMetric;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -34,6 +37,7 @@ import org.slf4j.LoggerFactory;
  * Class for Sending
  * PCE requests :
  * - path-computation-request
+ * - path-computation-reroute
  * - cancel-resource-reserve.
  * @author Martial Coulibaly ( martial.coulibaly@gfi.com ) on behalf of Orange
  *
@@ -61,6 +65,8 @@ public class PceSendingPceRPCs {
     private String responseCode;
     private final GnpyConsumer gnpyConsumer;
     private PortMapping portMapping;
+    // Define the termination points whose reservation status is not taken into account during the pruning process
+    private Endpoints endpoints;
 
     public PceSendingPceRPCs(GnpyConsumer gnpyConsumer) {
         setPathDescription(null);
@@ -69,15 +75,26 @@ public class PceSendingPceRPCs {
         this.gnpyConsumer = gnpyConsumer;
     }
 
-    public PceSendingPceRPCs(PathComputationRequestInput input,
-        NetworkTransactionService networkTransaction, GnpyConsumer gnpyConsumer, PortMapping portMapping) {
+    public PceSendingPceRPCs(PathComputationRequestInput input, NetworkTransactionService networkTransaction,
+                             GnpyConsumer gnpyConsumer, PortMapping portMapping) {
         this.gnpyConsumer = gnpyConsumer;
         setPathDescription(null);
-
         // TODO compliance check to check that input is not empty
         this.input = input;
         this.networkTransaction = networkTransaction;
         this.portMapping = portMapping;
+        this.endpoints = null;
+    }
+
+    public PceSendingPceRPCs(PathComputationRequestInput input, NetworkTransactionService networkTransaction,
+                             GnpyConsumer gnpyConsumer, PortMapping portMapping,
+                             Endpoints endpoints) {
+        this.gnpyConsumer = gnpyConsumer;
+        setPathDescription(null);
+        this.input = input;
+        this.networkTransaction = networkTransaction;
+        this.portMapping = portMapping;
+        this.endpoints = endpoints;
     }
 
     public void cancelResourceReserve() {
@@ -93,10 +110,11 @@ public class PceSendingPceRPCs {
         LOG.info("cancelResourceReserve ...");
     }
 
-    public void pathComputationWithConstraints(PceConstraints hardConstraints, PceConstraints softConstraints) {
+    private void pathComputationWithConstraints(PceConstraints hardConstraints, PceConstraints softConstraints,
+            PceConstraintMode mode) {
 
-        PceCalculation nwAnalizer =
-            new PceCalculation(input, networkTransaction, hardConstraints, softConstraints, rc, portMapping);
+        PceCalculation nwAnalizer = new PceCalculation(input, networkTransaction, hardConstraints, softConstraints, rc,
+                portMapping, endpoints);
         nwAnalizer.retrievePceNetwork();
         rc = nwAnalizer.getReturnStructure();
         String serviceType = nwAnalizer.getServiceType();
@@ -104,9 +122,11 @@ public class PceSendingPceRPCs {
             LOG.error("In pathComputationWithConstraints, nwAnalizer: result = {}", rc);
             return;
         }
+        OperatorConstraints opConstraints = new OperatorConstraints(networkTransaction);
         LOG.info("PceGraph ...");
         PceGraph graph = new PceGraph(nwAnalizer.getaendPceNode(), nwAnalizer.getzendPceNode(),
-                nwAnalizer.getAllPceNodes(), hardConstraints, softConstraints, rc, serviceType);
+                nwAnalizer.getAllPceNodes(), nwAnalizer.getAllPceLinks(), hardConstraints,
+                rc, serviceType, networkTransaction, mode, opConstraints.getBitMapConstraint(input.getCustomerName()));
         graph.calcPath();
         rc = graph.getReturnStructure();
         if (!rc.getStatus()) {
@@ -143,7 +163,7 @@ public class PceSendingPceRPCs {
         PceConstraintsCalc constraints = new PceConstraintsCalc(input, networkTransaction);
         pceHardConstraints = constraints.getPceHardConstraints();
         pceSoftConstraints = constraints.getPceSoftConstraints();
-        pathComputationWithConstraints(pceHardConstraints, pceSoftConstraints);
+        pathComputationWithConstraints(pceHardConstraints, pceSoftConstraints, PceConstraintMode.Loose);
         this.success = rc.getStatus();
         this.message = rc.getMessage();
         this.responseCode = rc.getResponseCode();
@@ -217,7 +237,7 @@ public class PceSendingPceRPCs {
         PceConstraintsCalc constraintsGnpy = new PceConstraintsCalc(inputFromGnpy, networkTransaction);
         PceConstraints gnpyHardConstraints = constraintsGnpy.getPceHardConstraints();
         PceConstraints gnpySoftConstraints = constraintsGnpy.getPceSoftConstraints();
-        pathComputationWithConstraints(gnpyHardConstraints, gnpySoftConstraints);
+        pathComputationWithConstraints(gnpyHardConstraints, gnpySoftConstraints, PceConstraintMode.Strict);
         AToZDirection atoz = rc.getAtoZDirection();
         ZToADirection ztoa = rc.getZtoADirection();
         if (gnpyToCheckFeasiblity(atoz, ztoa,gnpy)) {
@@ -237,7 +257,7 @@ public class PceSendingPceRPCs {
 
     private PceGraph patchRerunGraph(PceGraph graph) {
         LOG.info("In pathComputation patchRerunGraph : rerun Graph with metric = PROPAGATION-DELAY ");
-        graph.setConstrains(pceHardConstraints, pceSoftConstraints);
+        graph.setConstrains(pceHardConstraints);
         graph.calcPath();
         return graph;
     }
index a793e6d58439ade4920ee5de5294e6a29c64eed7..c04aec4adfcd182ec427960068009040219de94d 100644 (file)
@@ -7,6 +7,7 @@
  */
 package org.opendaylight.transportpce.pce;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.Serializable;
 import java.util.Comparator;
 
@@ -17,7 +18,7 @@ import java.util.Comparator;
  *
  */
 @SuppressWarnings("serial")
-@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+@SuppressFBWarnings(
     value = "SE_NO_SERIALVERSIONID",
     justification = "https://github.com/rzwitserloot/lombok/wiki/WHY-NOT:-serialVersionUID")
 public class SortPortsByName implements Comparator<String>, Serializable {
diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/constraints/OperatorConstraints.java b/pce/src/main/java/org/opendaylight/transportpce/pce/constraints/OperatorConstraints.java
new file mode 100644 (file)
index 0000000..7e0048f
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.pce.constraints;
+
+import java.util.BitSet;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.transportpce.common.fixedflex.GridConstant;
+import org.opendaylight.transportpce.common.fixedflex.GridUtils;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev230526.FrequencyTHz;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.controller.customization.rev230526.controller.parameters.SpectrumFilling;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.controller.customization.rev230526.controller.parameters.spectrum.filling.SpectrumFillingRules;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.controller.customization.rev230526.controller.parameters.spectrum.filling.SpectrumFillingRulesKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ControllerBehaviourSettings;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/*
+ * Class to handle Operator Constraints associated with Specific Engineering rules
+ * as they are defined in the controller-behaviour-settings container of the service
+ * Data-Store.
+ *
+ */
+
+public class OperatorConstraints {
+
+    /* Logging. */
+    private static final Logger LOG = LoggerFactory.getLogger(OperatorConstraints.class);
+    private static final String SPECTRUM_LOG_MSG =
+        "Specific Spectrum filling Rules have been defined for {} the spectrum range {} - {}";
+    private NetworkTransactionService networkTransaction;
+
+    public OperatorConstraints(NetworkTransactionService networkTransaction) {
+
+        this.networkTransaction = networkTransaction;
+
+    }
+
+    public BitSet getBitMapConstraint(String customerName) {
+        BitSet referenceBitSet = new BitSet(GridConstant.EFFECTIVE_BITS);
+        referenceBitSet.set(0, GridConstant.EFFECTIVE_BITS, true);
+        InstanceIdentifier<SpectrumFilling> sfIID =
+            InstanceIdentifier
+                .builder(ControllerBehaviourSettings.class)
+                .child(SpectrumFilling.class)
+                .build();
+
+        try {
+            if (networkTransaction.read(LogicalDatastoreType.CONFIGURATION, sfIID).get().isPresent()) {
+                SpectrumFilling spectrumConstraint = networkTransaction
+                    .read(LogicalDatastoreType.CONFIGURATION, sfIID)
+                    .get().orElseThrow();
+                if (spectrumConstraint.getSpectrumFillingRules().isEmpty()) {
+                    return referenceBitSet;
+                }
+                if (customerName == null) {
+                    for (Map.Entry<SpectrumFillingRulesKey, SpectrumFillingRules> rule:
+                            spectrumConstraint.getSpectrumFillingRules().entrySet()) {
+                        var spectrumRangeOfAppl = rule.getValue().getSpectrumRangeOfAppliance();
+                        var dedicatedCustomer = spectrumRangeOfAppl.getDedicatedCustomer();
+                        if (dedicatedCustomer == null || dedicatedCustomer.isEmpty()) {
+                            continue;
+                        }
+                        // Spectrum portion is dedicated to some customers that do not include this one
+                        FrequencyTHz startFreq = spectrumRangeOfAppl.getStartEdgeFrequency();
+                        FrequencyTHz stopFreq = spectrumRangeOfAppl.getStopEdgeFrequency();
+                        referenceBitSet.set(
+                            GridUtils.getIndexFromFrequency(startFreq.getValue()),
+                            GridUtils.getIndexFromFrequency(stopFreq.getValue()),
+                            false);
+                        LOG.info(SPECTRUM_LOG_MSG,
+                            "other customers, preventing the customer from using", startFreq, stopFreq);
+                    }
+                    return referenceBitSet;
+                }
+
+                for (Map.Entry<SpectrumFillingRulesKey, SpectrumFillingRules> rule:
+                        spectrumConstraint.getSpectrumFillingRules().entrySet()) {
+                    var spectrumRangeOfAppl = rule.getValue().getSpectrumRangeOfAppliance();
+                    FrequencyTHz startFreq = spectrumRangeOfAppl.getStartEdgeFrequency();
+                    FrequencyTHz stopFreq = spectrumRangeOfAppl.getStopEdgeFrequency();
+                    var nonAuthorizedCustomer = spectrumRangeOfAppl.getNonAuthorizedCustomer();
+                    if (nonAuthorizedCustomer != null && nonAuthorizedCustomer.contains(customerName)) {
+                        //Customer shall not be put in this spectrum portion
+                        referenceBitSet.set(
+                            GridUtils.getIndexFromFrequency(startFreq.getValue()),
+                            GridUtils.getIndexFromFrequency(stopFreq.getValue()),
+                            false);
+                        LOG.info(SPECTRUM_LOG_MSG,
+                            "customer " + customerName + ", exluding it from", startFreq, stopFreq);
+                        continue;
+                    }
+                    var dedicatedCustomer = spectrumRangeOfAppl.getDedicatedCustomer();
+                    if (dedicatedCustomer == null || dedicatedCustomer.isEmpty()) {
+                        continue;
+                    }
+                    if (dedicatedCustomer.contains(customerName)) {
+                        // Spectrum portion is dedicated to customers including this one
+                        referenceBitSet.set(
+                            GridUtils.getIndexFromFrequency(startFreq.getValue()),
+                            GridUtils.getIndexFromFrequency(stopFreq.getValue()),
+                            true);
+                        LOG.info(SPECTRUM_LOG_MSG,
+                            "customer " + customerName + ", to dedicate", startFreq, stopFreq + " to it");
+                        continue;
+                    }
+                    // Spectrum portion is dedicated to some customers that do not include this one
+                    referenceBitSet.set(
+                        GridUtils.getIndexFromFrequency(startFreq.getValue()),
+                        GridUtils.getIndexFromFrequency(stopFreq.getValue()),
+                        false);
+                    LOG.info(SPECTRUM_LOG_MSG,
+                        "other customers, preventing the customer from using", startFreq, stopFreq);
+                }
+                return referenceBitSet;
+            }
+        } catch (InterruptedException | ExecutionException e1) {
+            LOG.error("Exception caught handling Spectrum filling Rules ", e1.getCause());
+        }
+        LOG.info("Did not succeed finding any Specific Spectrum filling Rules defined in Configuration Datastore");
+        return referenceBitSet;
+    }
+}
index 22809649ac00dc5af71a391ddaafb8901ec0886e..4b63819f857a6961b96b9616158eec1a63404d16 100644 (file)
@@ -9,6 +9,7 @@ package org.opendaylight.transportpce.pce.constraints;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.StringJoiner;
 import org.opendaylight.transportpce.pce.networkanalyzer.PceOpticalNode;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.PceMetric;
 import org.slf4j.Logger;
@@ -173,6 +174,13 @@ public class PceConstraints {
             return name;
         }
 
+        @Override
+        public String toString() {
+            return new StringJoiner(", ", ResourcePair.class.getSimpleName() + "[", "]")
+                    .add("type=" + type)
+                    .add("name='" + name + "'")
+                    .toString();
+        }
     }
 
     public List<ResourcePair> getListToInclude() {
index 1c4acfac27f5362eb497084bf9c663c2450a03ab..6db7c9b2c3a1d711506f7ab26ae6449bd4ff62a3 100644 (file)
@@ -20,22 +20,22 @@ import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.Timeouts;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.pce.constraints.PceConstraints.ResourcePair;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.Constraints;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.CoRouting;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.Diversity;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.Exclude;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.Include;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.diversity.existing.service.constraints.ServiceIdentifierList;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.diversity.existing.service.constraints.ServiceIdentifierListKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.HardConstraints;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.SoftConstraints;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.service.applicability.g.ServiceApplicability;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.PathDescription;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZ;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.Link;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.Node;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.Constraints;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.CoRouting;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.Diversity;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.Exclude;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.Include;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.diversity.existing.service.constraints.ServiceIdentifierList;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.diversity.existing.service.constraints.ServiceIdentifierListKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.HardConstraints;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.SoftConstraints;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.service.applicability.g.ServiceApplicability;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.PathDescription;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZ;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.Link;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.Node;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.PceMetric;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.ServicePathList;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePaths;
@@ -111,25 +111,22 @@ public class PceConstraintsCalc {
     private void readExclude(Exclude exclude, PceConstraints constraints) {
         //TODO: Implement other exclude constraints: fiber-bundle, link-identifier
         // and supporting-service-name
-        List<NodeIdType> nodes = exclude.getNodeId();
-        if (nodes != null) {
+        if (exclude.getNodeId() != null) {
             List<String> elementsToExclude = new ArrayList<>();
-            for (NodeIdType node : nodes) {
+            for (NodeIdType node : exclude.getNodeId()) {
                 elementsToExclude.add(node.getValue());
             }
             constraints.setExcludeSupNodes(elementsToExclude);
         }
-        List<Uint32> srlgs = exclude.getSrlgId();
-        if (srlgs != null) {
+        if (exclude.getSrlgId() != null) {
             List<Long> elementsToExclude = new ArrayList<>();
-            for (Uint32 srlg : srlgs) {
+            for (Uint32 srlg : exclude.getSrlgId()) {
                 elementsToExclude.add(srlg.longValue());
             }
             constraints.setExcludeSRLG(elementsToExclude);
         }
-        List<String> sites = exclude.getSite();
-        if (sites != null) {
-            constraints.setExcludeCLLI(exclude.getSite());
+        if (exclude.getSite() != null) {
+            constraints.setExcludeCLLI(new ArrayList<>(exclude.getSite()));
         }
         if (exclude.getFiberBundle() != null || exclude.getLinkIdentifier() != null
             || exclude.getSupportingServiceName() != null) {
@@ -139,21 +136,18 @@ public class PceConstraintsCalc {
     }
 
     private void readInclude(Include include, PceConstraints constraints) {
-        List<NodeIdType> nodes = include.getNodeId();
-        if (nodes != null) {
-            for (NodeIdType node : nodes) {
+        if (include.getNodeId() != null) {
+            for (NodeIdType node : include.getNodeId()) {
                 constraints.setListToInclude(new ResourcePair(PceConstraints.ResourceType.NODE, node.getValue()));
             }
         }
-        List<Uint32> srlgs = include.getSrlgId();
-        if (srlgs != null) {
-            for (Uint32 srlg : srlgs) {
+        if (include.getSrlgId() != null) {
+            for (Uint32 srlg : include.getSrlgId()) {
                 constraints.setListToInclude(new ResourcePair(PceConstraints.ResourceType.SRLG, srlg.toString()));
             }
         }
-        List<String> sites = include.getSite();
-        if (sites != null) {
-            for (String site : sites) {
+        if (include.getSite() != null) {
+            for (String site : include.getSite()) {
                 constraints.setListToInclude(new ResourcePair(PceConstraints.ResourceType.CLLI, site));
             }
         }
@@ -172,15 +166,15 @@ public class PceConstraintsCalc {
         Map<ServiceIdentifierListKey, ServiceIdentifierList> serviceIdList = diversity.getServiceIdentifierList();
         Collection<ServiceIdentifierList> services = serviceIdList.values();
         for (ServiceIdentifierList serviceIdentifier : services) {
-            String serviceId = serviceIdentifier.getServiceIndentifier();
+            String serviceId = serviceIdentifier.getServiceIdentifier();
             ServiceApplicability serviceApplicability = serviceIdentifier.getServiceApplicability();
             Optional<PathDescription> serviceOpt = getPathDescriptionFromDatastore(serviceId);
             if (serviceOpt.isPresent()) {
-                List<String> serviceNodes = getAToZNodeList(serviceOpt.get());
+                List<String> serviceNodes = getAToZNodeList(serviceOpt.orElseThrow());
                 if (serviceApplicability.getNode() && !serviceNodes.isEmpty()) {
                     constraints.setExcludeNodes(serviceNodes);
                 }
-                List<String> serviceLinks = getSRLGList(serviceOpt.get());
+                List<String> serviceLinks = getSRLGList(serviceOpt.orElseThrow());
                 if (serviceApplicability.getLink() && !serviceLinks.isEmpty()) {
                     constraints.setExcludeSrlgLinks(serviceLinks);
                 }
@@ -241,7 +235,7 @@ public class PceConstraintsCalc {
             LOG.info("PCE diversity constraints: Getting path description for service {}", serviceName);
             ServicePaths servicePaths =
                 networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, pathDescriptionIID)
-                    .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS).get();
+                    .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS).orElseThrow();
             if (servicePaths != null) {
                 PathDescription path = servicePaths.getPathDescription();
                 if (path != null) {
index 2f254e10954acc578eced27b844ce414ee13bcd4..bfe3acc6850fb175bdffcad8f86ddd4f1f3495de 100644 (file)
@@ -8,22 +8,22 @@
 
 package org.opendaylight.transportpce.pce.gnpy;
 
-import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.Result;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.explicit.route.hop.type.NumUnnumHop;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.generic.path.properties.path.properties.PathMetric;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.generic.path.properties.path.properties.PathRouteObjects;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.result.Response;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.result.response.response.type.NoPathCase;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.result.response.response.type.PathCase;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.Result;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.explicit.route.hop.type.NumUnnumHop;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.generic.path.properties.path.properties.PathMetric;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.generic.path.properties.path.properties.PathRouteObjects;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.result.Response;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.result.response.response.type.NoPathCase;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.result.response.response.type.PathCase;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.Include;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.IncludeBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.HardConstraints;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.HardConstraintsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.Include;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.IncludeBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.HardConstraints;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.HardConstraintsBuilder;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -48,7 +48,6 @@ public class GnpyResult {
         }
         LOG.info("The response id is {}; ", responses.get(0).getResponseId());
         this.response = responses.get(0);
-        analyzeResult();
     }
 
     public boolean getPathFeasibility() {
@@ -78,8 +77,8 @@ public class GnpyResult {
                             .getPathProperties().nonnullPathMetric().values();
                     LOG.info("GNPy : path is not feasible : {}", noPathType);
                     for (PathMetric pathMetric : pathMetricList) {
-                        String metricType = pathMetric.getMetricType().getSimpleName();
-                        BigDecimal accumulativeValue = pathMetric.getAccumulativeValue();
+                        String metricType = pathMetric.getMetricType().toString();
+                        Decimal64 accumulativeValue = pathMetric.getAccumulativeValue();
                         LOG.info("Metric type {} // AccumulatriveValue {}", metricType, accumulativeValue);
                     }
                 }
@@ -90,8 +89,8 @@ public class GnpyResult {
                         .getPathProperties().nonnullPathMetric().values();
                 // Path metrics
                 for (PathMetric pathMetric : pathMetricList) {
-                    String metricType = pathMetric.getMetricType().getSimpleName();
-                    BigDecimal accumulativeValue = pathMetric.getAccumulativeValue();
+                    String metricType = pathMetric.getMetricType().toString();
+                    Decimal64 accumulativeValue = pathMetric.getAccumulativeValue();
                     LOG.info("Metric type {} // AccumulatriveValue {}", metricType, accumulativeValue);
                 }
                 // Path route objects
index 26c1b4c6b50b01f7524518bd02adc0e4f0d710fa..9208f61519af988658f095bd0d112185f4a920db 100644 (file)
@@ -11,14 +11,16 @@ package org.opendaylight.transportpce.pce.gnpy;
 import com.google.common.collect.HashBasedTable;
 import com.google.common.collect.Table;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
+import java.util.Set;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.transportpce.common.ServiceRateConstant;
@@ -28,40 +30,43 @@ import org.opendaylight.transportpce.pce.constraints.PceConstraints;
 import org.opendaylight.transportpce.pce.constraints.PceConstraints.ResourcePair;
 import org.opendaylight.transportpce.pce.gnpy.utils.AToZComparator;
 import org.opendaylight.transportpce.pce.gnpy.utils.ZToAComparator;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.topo.Elements;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.topo.ElementsKey;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.RouteIncludeEro;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.TeHopType;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.TePathDisjointness;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.common.constraints_config.TeBandwidth;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.common.constraints_config.TeBandwidthBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.explicit.route.hop.Type;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.explicit.route.hop.type.NumUnnumHopBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.explicit.route.hop.type.num.unnum.hop.NumUnnumHop;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.generic.path.constraints.PathConstraints;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.generic.path.constraints.PathConstraintsBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.gnpy.specific.parameters.EffectiveFreqSlot;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.gnpy.specific.parameters.EffectiveFreqSlotBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.path.route.objects.ExplicitRouteObjects;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.path.route.objects.ExplicitRouteObjectsBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.path.route.objects.explicit.route.objects.RouteObjectIncludeExclude;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.path.route.objects.explicit.route.objects.RouteObjectIncludeExcludeBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.path.route.objects.explicit.route.objects.RouteObjectIncludeExcludeKey;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.service.PathRequest;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.service.PathRequestBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.service.PathRequestKey;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.synchronization.info.Synchronization;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.synchronization.info.SynchronizationBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.synchronization.info.synchronization.Svec;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.synchronization.info.synchronization.SvecBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev211210.FrequencyTHz;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.Elements;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.ElementsKey;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.RouteIncludeEro;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.TeHopType;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.TePathDisjointness;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.common.constraints_config.TeBandwidth;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.common.constraints_config.TeBandwidthBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.explicit.route.hop.Type;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.explicit.route.hop.type.NumUnnumHopBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.explicit.route.hop.type.num.unnum.hop.NumUnnumHop;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.generic.path.constraints.PathConstraints;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.generic.path.constraints.PathConstraintsBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.gnpy.specific.parameters.EffectiveFreqSlot;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.gnpy.specific.parameters.EffectiveFreqSlotBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.path.route.objects.ExplicitRouteObjects;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.path.route.objects.ExplicitRouteObjectsBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.path.route.objects.explicit.route.objects.RouteObjectIncludeExclude;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.path.route.objects.explicit.route.objects.RouteObjectIncludeExcludeBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.path.route.objects.explicit.route.objects.RouteObjectIncludeExcludeKey;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.service.PathRequest;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.service.PathRequestBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.service.PathRequestKey;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.synchronization.info.Synchronization;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.synchronization.info.SynchronizationBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.synchronization.info.synchronization.Svec;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.synchronization.info.synchronization.SvecBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev230526.FrequencyTHz;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.ModulationFormat;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirection;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirection;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZ;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToA;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.Resource;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirection;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirection;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZ;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToA;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.Resource;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.Link;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.Node;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -227,28 +232,16 @@ public class GnpyServiceImpl {
     //Create a new resource node or link
     private Long createResource(@Nullable Resource resource, Long index) throws GnpyException {
         Long idx = index;
-        if (resource
-            instanceof
-                org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705
-                    .pce.resource.resource.resource.Node) {
-            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705
-                .pce.resource.resource.resource.Node node =
-                (org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705
-                    .pce.resource.resource.resource.Node) resource;
+        if (resource instanceof Node) {
+            Node node = (Node) resource;
             if (node.getNodeId() == null) {
                 throw new GnpyException("In gnpyServiceImpl: nodeId is null");
             }
             idx = addNodeToRouteObject(this.mapDisgNodeRefNode.get(node.getNodeId()),idx);
         }
 
-        if (resource
-            instanceof
-                org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705
-                    .pce.resource.resource.resource.Link) {
-            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705
-                .pce.resource.resource.resource.Link link =
-                (org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705
-                    .pce.resource.resource.resource.Link) resource;
+        if (resource instanceof Link) {
+            Link link = (Link) resource;
             idx = addLinkToRouteObject(link.getLinkId(),idx);
         }
         return idx;
@@ -327,7 +320,7 @@ public class GnpyServiceImpl {
 
     // Add routeObjectIncludeExclude
     private RouteObjectIncludeExclude addRouteObjectIncludeExclude(String nodeId, Uint32 teTpValue, Long index) {
-        NumUnnumHop numUnnumHop = new org.opendaylight.yang.gen.v1.gnpy.path.rev220221.explicit.route.hop.type.num
+        NumUnnumHop numUnnumHop = new org.opendaylight.yang.gen.v1.gnpy.path.rev220615.explicit.route.hop.type.num
             .unnum.hop.NumUnnumHopBuilder()
                 .setNodeId(nodeId)
                 .setLinkTpId(teTpValue.toString())
@@ -335,7 +328,7 @@ public class GnpyServiceImpl {
         Type type1 = new NumUnnumHopBuilder().setNumUnnumHop(numUnnumHop).build();
         // Create routeObjectIncludeExclude element
         return new RouteObjectIncludeExcludeBuilder()
-            .setIndex(Uint32.valueOf(index)).setExplicitRouteUsage(RouteIncludeEro.class).setType(type1).build();
+            .setIndex(Uint32.valueOf(index)).setExplicitRouteUsage(RouteIncludeEro.VALUE).setType(type1).build();
     }
 
     //Create the path constraints
@@ -347,14 +340,14 @@ public class GnpyServiceImpl {
         if (minFrequency != null && maxFrequency != null && modulationFormat != null) {
             LOG.info("Creating path constraints for rate {}, modulationFormat {}, min freq {}, max freq {}", rate,
                     modulationFormat, minFrequency, maxFrequency);
-            ModulationFormat mformat = ModulationFormat.DpQpsk;
-            Optional<ModulationFormat> optionalModulationFormat = ModulationFormat.forName(modulationFormat);
-            if (optionalModulationFormat.isPresent()) {
-                mformat = optionalModulationFormat.get();
+            ModulationFormat mformat = ModulationFormat.forName(modulationFormat);
+            if (mformat == null) {
+                mformat = ModulationFormat.DpQpsk;
             }
             spacing = GridConstant.FREQUENCY_SLOT_WIDTH_TABLE.get(Uint32.valueOf(rate), mformat);
-            FrequencyTHz centralFrequency = GridUtils
-                    .getCentralFrequency(minFrequency.getValue(), maxFrequency.getValue());
+            FrequencyTHz centralFrequency = GridUtils.getCentralFrequency(
+                    minFrequency.getValue().decimalValue(),
+                    maxFrequency.getValue().decimalValue());
             int centralFrequencyBitSetIndex = GridUtils.getIndexFromFrequency(centralFrequency.getValue());
             mvalue = (int) Math.ceil(spacing.doubleValue() / (GridConstant.GRANULARITY));
             nvalue = GridUtils.getNFromFrequencyIndex(centralFrequencyBitSetIndex);
@@ -365,20 +358,22 @@ public class GnpyServiceImpl {
                 .setM(Uint32.valueOf(mvalue / 2)).setN(nvalue).build();
 
         TeBandwidth teBandwidth = new TeBandwidthBuilder()
-                .setPathBandwidth(BigDecimal.valueOf(rate * 1e9))
+                .setPathBandwidth(Decimal64.valueOf(BigDecimal.valueOf(rate * 1e9)))
                 .setTechnology("flexi-grid").setTrxType("OpenROADM MSA ver. 5.0")
                 .setTrxMode(TRX_MODE_TABLE.get(Uint32.valueOf(rate), spacing))
-                .setOutputPower(GridUtils.convertDbmW(GridConstant.OUTPUT_POWER_100GB_DBM
-                        + 10 * Math.log10(mvalue / (double)GridConstant.NB_SLOTS_100G)))
+                .setOutputPower(Decimal64.valueOf(GridUtils.convertDbmW(GridConstant.OUTPUT_POWER_100GB_DBM
+                        + 10 * Math.log10(mvalue / (double)GridConstant.NB_SLOTS_100G))
+                        .setScale(6, RoundingMode.CEILING)))
                 .setEffectiveFreqSlot(Map.of(effectiveFreqSlot.key(), effectiveFreqSlot))
-                .setSpacing(spacing.multiply(BigDecimal.valueOf(1e9))).build();
+                .setSpacing(Decimal64.valueOf(spacing.multiply(BigDecimal.valueOf(1e9))))
+                .build();
         return new PathConstraintsBuilder().setTeBandwidth(teBandwidth).build();
     }
 
     //Create the synchronization
     private List<Synchronization> extractSynchronization(Uint32 requestId) {
         // Create RequestIdNumber
-        List<String> requestIdNumber = new ArrayList<>();
+        Set<String> requestIdNumber = new HashSet<>();
         requestIdNumber.add(requestId.toString());
         // Create a synchronization
         Svec svec = new SvecBuilder().setRelaxable(true)
index abdcb703801eff7f0d6571f09edd7c4cf663dddd..ad3ffb06c2b39a04de041cfb621527ad100ca815 100644 (file)
@@ -9,6 +9,7 @@
 package org.opendaylight.transportpce.pce.gnpy;
 
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -19,39 +20,39 @@ import java.util.stream.IntStream;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.NetworkUtils;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.Coordinate;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.Km;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.edfa.params.Operational;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.edfa.params.OperationalBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.element.type.choice.element.type.Edfa;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.element.type.choice.element.type.EdfaBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.element.type.choice.element.type.FiberRoadmBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.element.type.choice.element.type.Transceiver;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.element.type.choice.element.type.TransceiverBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.element.type.choice.element.type.fiberroadm.Params;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.element.type.choice.element.type.fiberroadm.ParamsBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.element.type.choice.element.type.fiberroadm.params.fiberroadmfused.Fiber;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.element.type.choice.element.type.fiberroadm.params.fiberroadmfused.FiberBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.element.type.choice.element.type.fiberroadm.params.fiberroadmfused.Roadm;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.element.type.choice.element.type.fiberroadm.params.fiberroadmfused.RoadmBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.location.attributes.Location;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.location.attributes.LocationBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.topo.Connections;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.topo.ConnectionsBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.topo.Elements;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.topo.ElementsBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.topo.ElementsKey;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.topo.elements.Metadata;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.topo.elements.MetadataBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.SpanAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.AmplifiedLink;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.amplified.link.section.element.section.element.Span;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.amplified.link.section.element.section.element.ila.Ila;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.rev211210.Node1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.link.OMSAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.link.concatenation.LinkConcatenation;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.Coordinate;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.Km;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.edfa.params.Operational;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.edfa.params.OperationalBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.Edfa;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.EdfaBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.FiberRoadmBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.Transceiver;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.TransceiverBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.fiberroadm.Params;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.fiberroadm.ParamsBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.fiberroadm.params.fiberroadmfused.Fiber;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.fiberroadm.params.fiberroadmfused.FiberBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.fiberroadm.params.fiberroadmfused.Roadm;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.element.type.choice.element.type.fiberroadm.params.fiberroadmfused.RoadmBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.location.attributes.Location;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.location.attributes.LocationBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.Connections;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.ConnectionsBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.Elements;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.ElementsBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.ElementsKey;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.elements.Metadata;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.elements.MetadataBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.SpanAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link.attributes.AmplifiedLink;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link.attributes.amplified.link.section.element.section.element.Span;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link.attributes.amplified.link.section.element.section.element.ila.Ila;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.rev230526.Node1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.link.OMSAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.link.concatenation.LinkConcatenation;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
@@ -61,6 +62,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -130,10 +132,8 @@ public class GnpyTopoImpl {
                     "In GnpyTopoImpl : openroadm topology network or openroadm network are not well mounted ...");
             }
         } catch (InterruptedException | ExecutionException e) {
-            this.networkTransactionService.close();
             throw new GnpyException("In gnpyTopoImpl: error in reading the topology", e);
         }
-        this.networkTransactionService.close();
     }
 
     private void extractElements(java.util.Optional<Network> openRoadmTopo,
@@ -142,8 +142,8 @@ public class GnpyTopoImpl {
             throw new GnpyException("In gnpyTopoImpl: openRoadmNet or openRoadmTopo is not present");
         }
         // Create the list of nodes
-        Collection<Node> openRoadmNetNodeList = openRoadmNet.get().nonnullNode().values();
-        Collection<Node> openRoadmTopoNodeList = openRoadmTopo.get().nonnullNode().values();
+        Collection<Node> openRoadmNetNodeList = openRoadmNet.orElseThrow().nonnullNode().values();
+        Collection<Node> openRoadmTopoNodeList = openRoadmTopo.orElseThrow().nonnullNode().values();
 
         if (openRoadmTopoNodeList.isEmpty() || openRoadmNetNodeList.isEmpty()) {
             throw new GnpyException("In gnpyTopoImpl: no nodes in the openradm topology or openroadm network");
@@ -164,13 +164,13 @@ public class GnpyTopoImpl {
                 // Retrieve the mapping between the openRoadm topology and openRoadm network
                 mapDisgNodeRefNode.put(openRoadmTopoNode.getNodeId().getValue(), nodeRef);
                 Node1 openRoadmNetNode1 = null;
-                org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
+                org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
                     .Node1 commonNetworkNode1 = null;
                 for (Node openRoadmNetNode : openRoadmNetNodeList) {
                     if (openRoadmNetNode.getNodeId().getValue().equals(nodeRef)) {
                         openRoadmNetNode1 = openRoadmNetNode.augmentation(Node1.class);
                         commonNetworkNode1 = openRoadmNetNode.augmentation(org.opendaylight.yang.gen.v1
-                            .http.org.openroadm.common.network.rev211210.Node1.class);
+                            .http.org.openroadm.common.network.rev230526.Node1.class);
                         break;
                     }
                 }
@@ -204,7 +204,7 @@ public class GnpyTopoImpl {
         if (!openRoadmTopo.isPresent()) {
             throw new GnpyException("In gnpyTopoImpl: openroadmTopo is not present");
         }
-        Network1 nw1 = openRoadmTopo.get().augmentation(Network1.class);
+        Network1 nw1 = openRoadmTopo.orElseThrow().augmentation(Network1.class);
         Collection<Link> linksList = nw1.nonnullLink().values();
         // 1:EXPRESS-LINK    2:ADD-LINK       3:DROP-LINK
         // 4:ROADM-To-ROADM  5:XPONDER-INPUT  6:XPONDER-OUTPUT
@@ -217,9 +217,9 @@ public class GnpyTopoImpl {
 
         for (Link link : linksList) {
             Link1 link1 = link.augmentation(Link1.class);
-            org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210
+            org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526
                 .Link1 openroadmNetworkLink1 = link.augmentation(org.opendaylight.yang.gen.v1.http
-                        .org.openroadm.network.topology.rev211210.Link1.class);
+                        .org.openroadm.network.topology.rev230526.Link1.class);
             if (link1.getLinkType() == null) {
                 throw new GnpyException("In gnpyTopoImpl: the link type is null");
             }
@@ -295,8 +295,8 @@ public class GnpyTopoImpl {
         String nodeId = ila.getNodeId().getValue();
         mapDisgNodeRefNode.put(nodeId, nodeId);
         Elements element = createElementsEdfa(LATITUDE, LONGITUTE, REGION, CITY,
-                ila.getGain().getValue(), ila.getTilt().getValue(),
-                ila.getOutVoaAtt().getValue(), "std_medium_gain",
+                ila.getGain().getValue().decimalValue(), ila.getTilt().getValue().decimalValue(),
+                ila.getOutVoaAtt().getValue().decimalValue(), "std_medium_gain",
                 nodeId);
         this.elements.put(element.key(),element);
         return nodeId;
@@ -337,18 +337,22 @@ public class GnpyTopoImpl {
     private Elements createElementsFiber(double latitude, double longitude, String region, String city, String uidFiber,
             double length, double attIn, double lossCoef, double connIn, double connOut, String typeVariety) {
         // Create an amplifier after the ROADM
-        Coordinate c1 = new Coordinate(BigDecimal.valueOf(latitude));
-        Coordinate c2 = new Coordinate(BigDecimal.valueOf(longitude));
+        Coordinate c1 = new Coordinate(Decimal64.valueOf(String.valueOf(latitude)));
+        Coordinate c2 = new Coordinate(Decimal64.valueOf(String.valueOf(longitude)));
         Location location1 = new LocationBuilder().setRegion(region).setCity(city).setLatitude(c1).setLongitude(c2)
                 .build();
         Metadata metadata1 = new MetadataBuilder().setLocation(location1).build();
-        Fiber fiber = new FiberBuilder().setLength(BigDecimal.valueOf(length)).setLengthUnits(Km.class)
-                .setAttIn(BigDecimal.valueOf(attIn)).setLossCoef(BigDecimal.valueOf(lossCoef))
-                .setConIn(BigDecimal.valueOf(connIn))
-                .setConOut(BigDecimal.valueOf(connOut)).build();
+        Fiber fiber = new FiberBuilder()
+            .setLength(Decimal64.valueOf(String.valueOf(length)))
+            .setLengthUnits(Km.VALUE)
+            .setAttIn(Decimal64.valueOf(String.valueOf(attIn)))
+            .setLossCoef(Decimal64.valueOf(String.valueOf(lossCoef)).scaleTo(5, RoundingMode.CEILING))
+            .setConIn(Decimal64.valueOf(String.valueOf(connIn)))
+            .setConOut(Decimal64.valueOf(String.valueOf(connOut)))
+            .build();
         Params params1 = new ParamsBuilder().setFiberroadmfused(fiber).build();
         return new ElementsBuilder().setUid(uidFiber)
-                .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.Fiber.class)
+                .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.Fiber.VALUE)
                 .setTypeVariety(typeVariety).setMetadata(metadata1)
                 .setElementType(new FiberRoadmBuilder().setParams(params1).build()).build();
     }
@@ -359,17 +363,20 @@ public class GnpyTopoImpl {
     private Elements createElementsEdfa(double latitude, double longitude, String region, String city,
             BigDecimal gainTarget, BigDecimal tiltTarget, BigDecimal outVoa, String typeVariety, String uidEdfa) {
         // Create an amplifier after the ROADM
-        Coordinate c1 = new Coordinate(BigDecimal.valueOf(latitude));
-        Coordinate c2 = new Coordinate(BigDecimal.valueOf(longitude));
+        Coordinate c1 = new Coordinate(Decimal64.valueOf(String.valueOf(latitude)));
+        Coordinate c2 = new Coordinate(Decimal64.valueOf(String.valueOf(longitude)));
         Location location1 = new LocationBuilder().setRegion(region).setCity(city).setLatitude(c1).setLongitude(c2)
                 .build();
         Metadata metadata1 = new MetadataBuilder().setLocation(location1).build();
-        Operational operational = new OperationalBuilder().setGainTarget(gainTarget).setTiltTarget(tiltTarget)
-                .setOutVoa(outVoa).build();
+        Operational operational = new OperationalBuilder()
+            .setGainTarget(Decimal64.valueOf(gainTarget))
+            .setTiltTarget(Decimal64.valueOf(tiltTarget))
+            .setOutVoa(Decimal64.valueOf(outVoa))
+            .build();
         Edfa edfa = new EdfaBuilder()
                 .setOperational(operational).build();
         return new ElementsBuilder().setUid(uidEdfa)
-                .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.Edfa.class)
+                .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.Edfa.VALUE)
                 .setMetadata(metadata1).setElementType(edfa).setTypeVariety(typeVariety).build();
     }
 
@@ -378,15 +385,17 @@ public class GnpyTopoImpl {
      */
     private Elements createElementsRoadm(double latitude, double longitude, String region, String city,
             double targetPchOutDb, String uidRoadm) {
-        Coordinate c1 = new Coordinate(BigDecimal.valueOf(latitude));
-        Coordinate c2 = new Coordinate(BigDecimal.valueOf(longitude));
+        Coordinate c1 = new Coordinate(Decimal64.valueOf(String.valueOf(latitude)));
+        Coordinate c2 = new Coordinate(Decimal64.valueOf(String.valueOf(longitude)));
         Location location1 = new LocationBuilder().setRegion(region).setCity(city).setLatitude(c1).setLongitude(c2)
                 .build();
         Metadata metadata1 = new MetadataBuilder().setLocation(location1).build();
-        Roadm roadm = new RoadmBuilder().setTargetPchOutDb(BigDecimal.valueOf(targetPchOutDb)).build();
+        Roadm roadm = new RoadmBuilder()
+            .setTargetPchOutDb(Decimal64.valueOf(String.valueOf(targetPchOutDb)))
+            .build();
         Params params1 = new ParamsBuilder().setFiberroadmfused(roadm).build();
         return new ElementsBuilder().setUid(uidRoadm)
-                .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.Roadm.class)
+                .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.Roadm.VALUE)
                 .setMetadata(metadata1).setElementType(new FiberRoadmBuilder().setParams(params1).build()).build();
     }
 
@@ -395,14 +404,14 @@ public class GnpyTopoImpl {
      */
     private Elements createElementsTransceiver(double latitude, double longitude, String region, String city,
             String uidTrans) {
-        Coordinate c1 = new Coordinate(BigDecimal.valueOf(latitude));
-        Coordinate c2 = new Coordinate(BigDecimal.valueOf(longitude));
+        Coordinate c1 = new Coordinate(Decimal64.valueOf(String.valueOf(latitude)));
+        Coordinate c2 = new Coordinate(Decimal64.valueOf(String.valueOf(longitude)));
         Location location1 = new LocationBuilder().setRegion(region).setCity(city).setLatitude(c1).setLongitude(c2)
                 .build();
         Metadata metadata1 = new MetadataBuilder().setLocation(location1).build();
         Transceiver transceiver = new TransceiverBuilder().build();
         return new ElementsBuilder().setUid(uidTrans)
-                .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.Transceiver.class)
+                .setType(org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.Transceiver.VALUE)
                 .setMetadata(metadata1).setElementType(transceiver).build();
     }
 
index f856e08d92fc9f7fe190f15d9b3b73c1cf14f199..9ae44120c060c63cb3a6702951564bf43db9e254 100644 (file)
@@ -17,17 +17,17 @@ import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumer;
 import org.opendaylight.yang.gen.v1.gnpy.gnpy.api.rev220221.RequestBuilder;
 import org.opendaylight.yang.gen.v1.gnpy.gnpy.api.rev220221.request.ServiceBuilder;
 import org.opendaylight.yang.gen.v1.gnpy.gnpy.api.rev220221.request.TopologyBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.topo.Connections;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220221.topo.Elements;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.Result;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.generic.path.properties.path.properties.PathRouteObjects;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.service.PathRequest;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.synchronization.info.Synchronization;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.HardConstraints;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirection;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirection;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.Connections;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.network.topology.rev220615.topo.Elements;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.Result;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.generic.path.properties.path.properties.PathRouteObjects;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.service.PathRequest;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.synchronization.info.Synchronization;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.HardConstraints;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirection;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirection;
 import org.opendaylight.yangtools.yang.common.Uint32;
 
 /**
diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/consumer/GnpyApiModule.java b/pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/consumer/GnpyApiModule.java
deleted file mode 100644 (file)
index f750005..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright © 2021 Orange, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.transportpce.pce.gnpy.consumer;
-
-import com.fasterxml.jackson.databind.module.SimpleModule;
-import com.fasterxml.jackson.datatype.jsr310.PackageVersion;
-import org.opendaylight.transportpce.common.converter.JsonStringConverter;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.api.rev220221.Request;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.Result;
-
-
-
-//This class is a temporary workaround while waiting jackson
-//support in yang tools https://git.opendaylight.org/gerrit/c/yangtools/+/94852
-public class GnpyApiModule extends SimpleModule {
-
-    private static final long serialVersionUID = 1L;
-
-    public GnpyApiModule(JsonStringConverter<Request> requestConverter, JsonStringConverter<Result> resultConverter) {
-        super(PackageVersion.VERSION);
-        addSerializer(Request.class, new RequestSerializer(requestConverter));
-        addDeserializer(Result.class, new ResultDeserializer(resultConverter));
-    }
-}
index b45a3880f3cb92af924993a06e160fcefce2eaef..f1976d1e37780bdb0b31d5ca9e9f7186b402bc8f 100644 (file)
@@ -9,7 +9,7 @@ package org.opendaylight.transportpce.pce.gnpy.consumer;
 
 
 import org.opendaylight.yang.gen.v1.gnpy.gnpy.api.rev220221.Request;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.Result;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.Result;
 
 
 public interface GnpyConsumer {
index cd4b6eb69913b9f7c070c8101772948ef6f504d8..7d307636ac6d99187a48bfcdb5f5b060cf21126b 100644 (file)
@@ -18,28 +18,49 @@ import org.glassfish.jersey.logging.LoggingFeature;
 import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
 import org.opendaylight.transportpce.common.converter.JsonStringConverter;
 import org.opendaylight.yang.gen.v1.gnpy.gnpy.api.rev220221.Request;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.Result;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.Result;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.osgi.service.metatype.annotations.AttributeDefinition;
+import org.osgi.service.metatype.annotations.ObjectClassDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@Component(configurationPid = "org.opendaylight.transportpce.pce")
 public class GnpyConsumerImpl implements GnpyConsumer {
+    @ObjectClassDefinition
+    public @interface Configuration {
+        @AttributeDefinition
+        String url() default "http://127.0.0.1:8008";
+        @AttributeDefinition
+        String username() default "gnpy";
+        @AttributeDefinition
+        String password() default "gnpy";
+    }
+
     private static final Logger LOG = LoggerFactory.getLogger(GnpyConsumerImpl.class);
 
-    private GnpyResource api;
-    JsonStringConverter<Request> gnpyRequestConverter;
-    JsonStringConverter<Result> resultConverter;
+    private final GnpyResource api;
+
+    @Activate
+    public GnpyConsumerImpl(final Configuration configuration,
+            @Reference BindingDOMCodecServices bindingDOMCodecServices) {
+        this(configuration.url(), configuration.username(), configuration.password(), bindingDOMCodecServices);
+    }
 
     public GnpyConsumerImpl(String baseUrl, String username, String password,
             BindingDOMCodecServices bindingDOMCodecServices) {
-        gnpyRequestConverter = new JsonStringConverter<>(bindingDOMCodecServices);
-        resultConverter = new JsonStringConverter<>(bindingDOMCodecServices);
+        JsonStringConverter<Request> gnpyRequestConverter = new JsonStringConverter<>(bindingDOMCodecServices);
+        JsonStringConverter<Result> resultConverter = new JsonStringConverter<>(bindingDOMCodecServices);
 
-        JsonConfigurator jsonConfigurator = new JsonConfigurator(gnpyRequestConverter, resultConverter);
         Client client = ClientBuilder.newClient();
         HttpAuthenticationFeature authFeature = HttpAuthenticationFeature.basic(username, password);
         client.register(authFeature);
         client.register(new LoggingFeature(java.util.logging.Logger.getLogger(this.getClass().getName())))
-            .register(JacksonFeature.class).register(jsonConfigurator);
+            .register(JacksonFeature.class)
+                .register(new ResultMessageBodyReader(resultConverter))
+                .register(new RequestMessageBodyWriter(gnpyRequestConverter));
         api = WebResourceFactory.newResource(GnpyResource.class, client.target(baseUrl));
     }
 
index a30112c8a5ba51173d95f074f612d6722304bf27..ba9a2daab760a923172bdb8c4c03f2e4b50fe1c4 100644 (file)
@@ -15,7 +15,7 @@ import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import org.opendaylight.yang.gen.v1.gnpy.gnpy.api.rev220221.Request;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.Result;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.Result;
 
 
 @Path("/api/v1")
diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/consumer/JsonConfigurator.java b/pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/consumer/JsonConfigurator.java
deleted file mode 100644 (file)
index 9bc3732..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright © 2021 Orange, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.transportpce.pce.gnpy.consumer;
-
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.databind.DeserializationFeature;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-import javax.ws.rs.ext.ContextResolver;
-import org.opendaylight.transportpce.common.converter.JsonStringConverter;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.api.rev220221.Request;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.Result;
-
-public class JsonConfigurator implements ContextResolver<ObjectMapper> {
-
-    private final ObjectMapper mapper;
-
-    public JsonConfigurator(JsonStringConverter<Request> requestConverter,
-            JsonStringConverter<Result> resultConverter) {
-        mapper = new ObjectMapper();
-        mapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
-        mapper.enable(SerializationFeature.INDENT_OUTPUT);
-        mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
-        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
-        mapper.registerModule(new GnpyApiModule(requestConverter, resultConverter));
-    }
-
-    @Override
-    public ObjectMapper getContext(Class<?> type) {
-        return mapper;
-    }
-
-}
diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/consumer/RequestMessageBodyWriter.java b/pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/consumer/RequestMessageBodyWriter.java
new file mode 100644 (file)
index 0000000..ea4560c
--- /dev/null
@@ -0,0 +1,57 @@
+/*
+ * Copyright © 2022 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.pce.gnpy.consumer;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.nio.charset.StandardCharsets;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.MessageBodyWriter;
+import org.opendaylight.transportpce.common.converter.JsonStringConverter;
+import org.opendaylight.yang.gen.v1.gnpy.gnpy.api.rev220221.Request;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class RequestMessageBodyWriter implements MessageBodyWriter<Request> {
+    private static final Logger LOG = LoggerFactory.getLogger(RequestMessageBodyWriter.class);
+    private final InstanceIdentifier<Request> idRequest = InstanceIdentifier.builder(Request.class).build();
+    private final JsonStringConverter<Request> converter;
+
+    public RequestMessageBodyWriter(JsonStringConverter<Request> converter) {
+        this.converter = converter;
+    }
+
+    @Override
+    @SuppressWarnings("java:S1872")
+    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
+        return "org.opendaylight.yang.rt.v1.obj.gnpy.gnpy.api.rev220221.Request"
+                .equals(type.getName())
+            || "org.opendaylight.yang.gen.v1.gnpy.gnpy.api.rev220221.RequestBuilder$RequestImpl"
+                .equals(type.getName());
+    }
+
+    @Override
+    public void writeTo(Request request, Class<?> type, Type genericType, Annotation[] annotations,
+                        MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream)
+            throws IOException, WebApplicationException {
+        // we have to use a string because GNPy does not support prefix
+        String jsonStringFromDataObject = converter
+                .createJsonStringFromDataObject(idRequest, request,
+                        JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02)
+                .replace("gnpy-network-topology:", "");
+        LOG.debug("Serialized request {}", jsonStringFromDataObject);
+        entityStream.write(jsonStringFromDataObject
+                .getBytes(StandardCharsets.UTF_8));
+    }
+}
diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/consumer/RequestSerializer.java b/pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/consumer/RequestSerializer.java
deleted file mode 100644 (file)
index 4dd687c..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright © 2021 Orange, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.transportpce.pce.gnpy.consumer;
-
-import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.SerializerProvider;
-import com.fasterxml.jackson.databind.ser.std.StdSerializer;
-import java.io.IOException;
-import org.opendaylight.transportpce.common.converter.JsonStringConverter;
-import org.opendaylight.yang.gen.v1.gnpy.gnpy.api.rev220221.Request;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-//This class is a temporary workaround while waiting jackson
-//support in yang tools https://git.opendaylight.org/gerrit/c/yangtools/+/94852
-@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(value = "SE_BAD_FIELD", justification = "temporary class")
-
-public class RequestSerializer extends StdSerializer<Request> {
-    private static final long serialVersionUID = 1L;
-    private static final Logger LOG = LoggerFactory.getLogger(RequestSerializer.class);
-    private JsonStringConverter<Request> converter;
-    private InstanceIdentifier<Request> idRequest = InstanceIdentifier.builder(Request.class).build();
-
-    public RequestSerializer(JsonStringConverter<Request> converter) {
-        super(Request.class);
-        this.converter = converter;
-    }
-
-    @Override
-    public void serialize(Request value, JsonGenerator gen, SerializerProvider provider) throws IOException {
-        String requestStr = this.converter
-                .createJsonStringFromDataObject(this.idRequest, value,
-                        JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02);
-        requestStr =  requestStr.replace("gnpy-network-topology:", "");
-        LOG.info("Serialized request {}", requestStr);
-        gen.writeRaw(requestStr);
-    }
-}
diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/consumer/ResultDeserializer.java b/pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/consumer/ResultDeserializer.java
deleted file mode 100644 (file)
index 8ddbb41..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright © 2021 Orange, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.transportpce.pce.gnpy.consumer;
-
-import com.fasterxml.jackson.core.JsonParser;
-import com.fasterxml.jackson.databind.DeserializationContext;
-import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
-import java.io.IOException;
-import org.opendaylight.transportpce.common.converter.JsonStringConverter;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.Result;
-import org.opendaylight.yangtools.yang.common.QName;
-import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
-import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-
-//This class is a temporary workaround while waiting jackson
-//support in yang tools https://git.opendaylight.org/gerrit/c/yangtools/+/94852
-@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(value = "SE_BAD_FIELD", justification = "temporary class")
-public class ResultDeserializer extends StdDeserializer<Result> {
-
-    private static final Logger LOG = LoggerFactory.getLogger(ResultDeserializer.class);
-    private static final long serialVersionUID = 1L;
-    private JsonStringConverter<Result> converter;
-    private YangInstanceIdentifier yangId;
-
-    public ResultDeserializer(JsonStringConverter<Result> converter) {
-        super(Result.class);
-        this.converter = converter;
-        QName pathQname = Result.QNAME;
-        LOG.info("QName of the first result class {}", pathQname);
-        yangId = YangInstanceIdentifier.of(pathQname);
-    }
-
-    @Override
-    public Result deserialize(JsonParser parser, DeserializationContext ctxt) throws IOException {
-        return converter.createDataObjectFromJsonString(yangId,parser.readValueAsTree().toString(),
-            JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02);
-    }
-
-}
diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/consumer/ResultMessageBodyReader.java b/pce/src/main/java/org/opendaylight/transportpce/pce/gnpy/consumer/ResultMessageBodyReader.java
new file mode 100644 (file)
index 0000000..e1bcb18
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright © 2022 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.pce.gnpy.consumer;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.MessageBodyReader;
+import org.opendaylight.transportpce.common.converter.JsonStringConverter;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.Result;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
+
+public class ResultMessageBodyReader implements MessageBodyReader<Result> {
+    private final JsonStringConverter<Result> converter;
+    private final YangInstanceIdentifier yangId;
+
+    public ResultMessageBodyReader(JsonStringConverter<Result> converter) {
+        QName pathQname = Result.QNAME;
+        yangId = YangInstanceIdentifier.of(pathQname);
+        this.converter = converter;
+    }
+
+    @Override
+    @SuppressWarnings("java:S1872")
+    public boolean isReadable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
+        return "org.opendaylight.yang.gen.v1.gnpy.path.rev220615.Result"
+                .equals(type.getName());
+    }
+
+    @Override
+    public Result readFrom(Class<Result> type, Type genericType, Annotation[] annotations,
+                           MediaType mediaType, MultivaluedMap<String, String> httpHeaders, InputStream entityStream)
+            throws IOException, WebApplicationException {
+        return converter.createDataObjectFromInputStream(yangId, entityStream,
+                JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02);
+    }
+}
index 0f1b32aa1e282ddca7ea60495474e3a7e6fce624..262b7cc19974c1e525a5962794686a51216fc875 100644 (file)
@@ -8,12 +8,13 @@
 
 package org.opendaylight.transportpce.pce.gnpy.utils;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.Serializable;
 import java.util.Comparator;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZ;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZ;
 
 @SuppressWarnings("serial")
-@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+@SuppressFBWarnings(
     value = "SE_NO_SERIALVERSIONID",
     justification = "https://github.com/rzwitserloot/lombok/wiki/WHY-NOT:-serialVersionUID")
 public class AToZComparator implements Comparator<AToZ>, Serializable {
index 4571c638013b236a011eff863cb02295a6990db9..e946ce9f4c0eb298ba8b3b4462fed55ad7bc0b31 100644 (file)
@@ -8,12 +8,13 @@
 
 package org.opendaylight.transportpce.pce.gnpy.utils;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.Serializable;
 import java.util.Comparator;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToA;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToA;
 
 @SuppressWarnings("serial")
-@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+@SuppressFBWarnings(
     value = "SE_NO_SERIALVERSIONID",
     justification = "https://github.com/rzwitserloot/lombok/wiki/WHY-NOT:-serialVersionUID")
 public class ZToAComparator implements Comparator<ZToA>, Serializable {
index 90c995d219a74a4d9af4bcfe6f68d714a675c52c..168f7f8fea8e6349d127d27ac28e58801c64da39 100644 (file)
@@ -10,7 +10,7 @@ package org.opendaylight.transportpce.pce.graph;
 
 import org.jgrapht.GraphPath;
 import org.jgrapht.alg.shortestpath.PathValidator;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
index a7a45e765709f05028509b5be8c5f3bdf7965cb3..994d3256fcbdce825275437c91d2357e60b176f2 100644 (file)
@@ -9,23 +9,32 @@
 package org.opendaylight.transportpce.pce.graph;
 
 import java.util.ArrayList;
+import java.util.BitSet;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import org.jgrapht.Graph;
 import org.jgrapht.GraphPath;
-import org.jgrapht.alg.shortestpath.KShortestSimplePaths;
 import org.jgrapht.alg.shortestpath.PathValidator;
+import org.jgrapht.alg.shortestpath.YenKShortestPath;
 import org.jgrapht.graph.DefaultDirectedWeightedGraph;
 import org.opendaylight.transportpce.common.ResponseCodes;
 import org.opendaylight.transportpce.common.StringConstants;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.pce.constraints.PceConstraints;
 import org.opendaylight.transportpce.pce.networkanalyzer.PceLink;
 import org.opendaylight.transportpce.pce.networkanalyzer.PceNode;
 import org.opendaylight.transportpce.pce.networkanalyzer.PceResult;
 import org.opendaylight.transportpce.pce.networkanalyzer.PceResult.LocalCause;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PceConstraintMode;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -35,40 +44,44 @@ public class PceGraph {
 
     ////////////////////////// for Graph ///////////////////////////
     // how many paths to bring
-    private int kpathsToBring = 10;
-
-    // max #hops
-    private int mhopsPerPath = 50;
+    private int kpathsToBring = 15;
 
     // input
     private Map<NodeId, PceNode> allPceNodes = new HashMap<>();
+    private Map<LinkId, PceLink> allPceLinks = new HashMap<>();
     private PceNode apceNode = null;
     private PceNode zpceNode = null;
     private String serviceType = "";
-
+    private Double margin = null;
     PceConstraints pceHardConstraints;
-    PceConstraints pceSoftConstraints;
+    private PceConstraintMode pceConstraintMode;
+    private BitSet spectrumConstraint;
 
     // results
     private PceResult pceResult = null;
     private List<PceLink> shortestPathAtoZ = null;
 
     // for path calculation
-    List<GraphPath<String, PceGraphEdge>> allWPaths = null;
+    Map<Integer, GraphPath<String, PceGraphEdge>> allWPaths = null;
 
     private List<PceLink> pathAtoZ = new ArrayList<>();
 
+    private final NetworkTransactionService networkTransactionService;
+
     public PceGraph(PceNode aendNode, PceNode zendNode, Map<NodeId, PceNode> allPceNodes,
-            PceConstraints pceHardConstraints, PceConstraints pceSoftConstraints, PceResult pceResult,
-            String serviceType) {
+            Map<LinkId, PceLink> allPceLinks, PceConstraints pceHardConstraints,PceResult pceResult, String serviceType,
+            NetworkTransactionService networkTransactionService, PceConstraintMode mode, BitSet spectrumConstraint) {
         super();
         this.apceNode = aendNode;
         this.zpceNode = zendNode;
         this.allPceNodes = allPceNodes;
+        this.allPceLinks = allPceLinks;
         this.pceResult = pceResult;
         this.pceHardConstraints = pceHardConstraints;
-        this.pceSoftConstraints = pceSoftConstraints;
         this.serviceType = serviceType;
+        this.networkTransactionService = networkTransactionService;
+        this.pceConstraintMode = mode;
+        this.spectrumConstraint = spectrumConstraint;
 
         LOG.info("In GraphCalculator: A and Z = {} / {} ", aendNode, zendNode);
         LOG.debug("In GraphCalculator: allPceNodes size {}, nodes {} ", allPceNodes.size(), allPceNodes);
@@ -78,26 +91,29 @@ public class PceGraph {
 
         LOG.info(" In PCE GRAPH calcPath : K SHORT PATHS algorithm ");
 
-        DefaultDirectedWeightedGraph<String, PceGraphEdge> weightedGraph =
+        Graph<String, PceGraphEdge> weightedGraph =
                 new DefaultDirectedWeightedGraph<>(PceGraphEdge.class);
         populateWithNodes(weightedGraph);
         populateWithLinks(weightedGraph);
 
         if (!runKgraphs(weightedGraph)) {
-            LOG.info("In calcPath : pceResult {}", pceResult);
+            LOG.error("In calcPath : pceResult {}", pceResult);
             return false;
         }
-
         // validate found paths
         pceResult.setRC(ResponseCodes.RESPONSE_FAILED);
-        for (GraphPath<String, PceGraphEdge> path : allWPaths) {
-            PostAlgoPathValidator papv = new PostAlgoPathValidator();
-            pceResult = papv.checkPath(path, allPceNodes, pceResult, pceHardConstraints, serviceType);
-            LOG.info("In calcPath after PostAlgoPathValidator {} {}",
-                    pceResult.getResponseCode(), ResponseCodes.RESPONSE_OK);
-
-            if (!pceResult.getResponseCode().equals(ResponseCodes.RESPONSE_OK)) {
-                LOG.warn("In calcPath: post algo validations DROPPED the path {}", path);
+        for (Entry<Integer, GraphPath<String, PceGraphEdge>> entry : allWPaths.entrySet()) {
+            GraphPath<String, PceGraphEdge> path = entry.getValue();
+            LOG.info("validating path n° {} - {}", entry.getKey(), path.getVertexList());
+            PostAlgoPathValidator papv = new PostAlgoPathValidator(networkTransactionService, spectrumConstraint);
+            pceResult = papv.checkPath(
+                    path, allPceNodes, allPceLinks, pceResult, pceHardConstraints, serviceType, pceConstraintMode);
+            this.margin = papv.getTpceCalculatedMargin();
+            if (ResponseCodes.RESPONSE_OK.equals(pceResult.getResponseCode())) {
+                LOG.info("Path is validated");
+            } else {
+                LOG.warn("In calcPath: post algo validations DROPPED the path {}; for following cause: {}",
+                    path, pceResult.getLocalCause());
                 continue;
             }
 
@@ -116,7 +132,7 @@ public class PceGraph {
                 case StringConstants.SERVICE_TYPE_OTUC4:
                 case StringConstants.SERVICE_TYPE_400GE:
                 case StringConstants.SERVICE_TYPE_OTU4:
-                    LOG.info(
+                    LOG.debug(
                         "In calcPath Path FOUND path for wl [{}], min Freq assignment {}, max Freq assignment {},"
                         + " hops {}, distance per metrics {}, path AtoZ {}",
                         pceResult.getResultWavelength(), pceResult.getMinFreq(), pceResult.getMaxFreq(),
@@ -124,7 +140,7 @@ public class PceGraph {
                     break;
 
                 default:
-                    LOG.info(
+                    LOG.debug(
                         "In calcPath Path FOUND path for hops {}, distance per metrics {}, path AtoZ {}",
                         pathAtoZ.size(), path.getWeight(), pathAtoZ);
                     break;
@@ -142,17 +158,21 @@ public class PceGraph {
         return (pceResult.getStatus());
     }
 
-    private boolean runKgraphs(DefaultDirectedWeightedGraph<String, PceGraphEdge> weightedGraph) {
+    private boolean runKgraphs(Graph<String, PceGraphEdge> weightedGraph) {
 
         if (weightedGraph.edgeSet().isEmpty() || weightedGraph.vertexSet().isEmpty()) {
             return false;
         }
         PathValidator<String, PceGraphEdge> wpv = new InAlgoPathValidator();
 
-        // KShortestPaths on weightedGraph
-        KShortestSimplePaths<String, PceGraphEdge> swp =
-            new KShortestSimplePaths<>(weightedGraph, mhopsPerPath, wpv);
-        allWPaths = swp.getPaths(apceNode.getNodeId().getValue(), zpceNode.getNodeId().getValue(), kpathsToBring);
+        // YenShortestPath on weightedGraph
+        YenKShortestPath<String, PceGraphEdge> swp = new YenKShortestPath<>(weightedGraph, wpv);
+        List<GraphPath<String, PceGraphEdge>> weightedPathList = swp
+            .getPaths(apceNode.getNodeId().getValue(), zpceNode.getNodeId().getValue(), kpathsToBring);
+        allWPaths = IntStream
+            .range(0, weightedPathList.size())
+            .boxed()
+            .collect(Collectors.toMap(Function.identity(), weightedPathList::get));
 
         if (allWPaths.isEmpty()) {
             LOG.info(" In runKgraphs : algorithm didn't find any path");
@@ -162,10 +182,8 @@ public class PceGraph {
         }
 
         // debug print
-        for (GraphPath<String, PceGraphEdge> path : allWPaths) {
-            LOG.debug("path Weight: {} : {}", path.getWeight(), path.getVertexList());
-        }
-
+        allWPaths
+            .forEach((k, v) -> LOG.info("path n° {} - weight: {} - path: {}", k, v.getWeight(), v.getVertexList()));
         return true;
     }
 
@@ -186,7 +204,7 @@ public class PceGraph {
         return true;
     }
 
-    private void populateWithNodes(DefaultDirectedWeightedGraph<String, PceGraphEdge> weightedGraph) {
+    private void populateWithNodes(Graph<String, PceGraphEdge> weightedGraph) {
         Iterator<Map.Entry<NodeId, PceNode>> nodes = allPceNodes.entrySet().iterator();
         while (nodes.hasNext()) {
             Map.Entry<NodeId, PceNode> node = nodes.next();
@@ -197,7 +215,7 @@ public class PceGraph {
         }
     }
 
-    private boolean populateWithLinks(DefaultDirectedWeightedGraph<String, PceGraphEdge> weightedGraph) {
+    private boolean populateWithLinks(Graph<String, PceGraphEdge> weightedGraph) {
 
         Iterator<Map.Entry<NodeId, PceNode>> nodes = allPceNodes.entrySet().iterator();
         while (nodes.hasNext()) {
@@ -262,10 +280,6 @@ public class PceGraph {
         this.kpathsToBring = kpathsToBring;
     }
 
-    public void setMhopsPerPath(int mhopsPerPath) {
-        this.mhopsPerPath = mhopsPerPath;
-    }
-
     public List<PceLink> getPathAtoZ() {
         return shortestPathAtoZ;
     }
@@ -274,8 +288,11 @@ public class PceGraph {
         return pceResult;
     }
 
-    public void setConstrains(PceConstraints pceHardConstraintsInput, PceConstraints pceSoftConstraintsInput) {
+    public Double getmargin() {
+        return margin;
+    }
+
+    public void setConstrains(PceConstraints pceHardConstraintsInput) {
         this.pceHardConstraints = pceHardConstraintsInput;
-        this.pceSoftConstraints = pceSoftConstraintsInput;
     }
 }
index 6983d3f18e5808dfcab9eabb1b0786d120e169e4..e5a4f251f8c31dc54d947fb5ac1cfd0608f186a5 100644 (file)
@@ -7,11 +7,12 @@
  */
 package org.opendaylight.transportpce.pce.graph;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.jgrapht.graph.DefaultWeightedEdge;
 import org.opendaylight.transportpce.pce.networkanalyzer.PceLink;
 
 @SuppressWarnings("serial")
-@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+@SuppressFBWarnings(
     value = "SE_NO_SERIALVERSIONID",
     justification = "https://github.com/rzwitserloot/lombok/wiki/WHY-NOT:-serialVersionUID")
 public class PceGraphEdge extends DefaultWeightedEdge {
index 61e7f145aa52e840d302b93e5cd0cae3b06e977a..53353aeae0415acfb29aa9867e4f4d2de734be67 100644 (file)
@@ -9,27 +9,45 @@
 package org.opendaylight.transportpce.pce.graph;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.BitSet;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.stream.Collectors;
 import org.jgrapht.GraphPath;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.transportpce.common.InstanceIdentifiers;
 import org.opendaylight.transportpce.common.ResponseCodes;
 import org.opendaylight.transportpce.common.StringConstants;
+import org.opendaylight.transportpce.common.catalog.CatalogConstant;
+import org.opendaylight.transportpce.common.catalog.CatalogConstant.CatalogNodeType;
+import org.opendaylight.transportpce.common.catalog.CatalogUtils;
 import org.opendaylight.transportpce.common.fixedflex.GridConstant;
 import org.opendaylight.transportpce.common.fixedflex.GridUtils;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.pce.constraints.PceConstraints;
 import org.opendaylight.transportpce.pce.constraints.PceConstraints.ResourcePair;
+import org.opendaylight.transportpce.pce.networkanalyzer.PceLink;
 import org.opendaylight.transportpce.pce.networkanalyzer.PceNode;
 import org.opendaylight.transportpce.pce.networkanalyzer.PceResult;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.SpectrumAssignment;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.SpectrumAssignmentBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev181130.OpucnTribSlotDef;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PceConstraintMode;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.SpectrumAssignment;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.SpectrumAssignmentBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OpucnTribSlotDef;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Uint16;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -38,26 +56,33 @@ public class PostAlgoPathValidator {
     /* Logging. */
     private static final Logger LOG = LoggerFactory.getLogger(PostAlgoPathValidator.class);
 
-    private static final double MIN_OSNR_W100G = 17;
-    private static final double TRX_OSNR = 33;
-    private static final double ADD_OSNR = 30;
     public static final Long CONST_OSNR = 1L;
     public static final double SYS_MARGIN = 0;
 
+    private Double tpceCalculatedMargin = 0.0;
+    private final NetworkTransactionService networkTransactionService;
+    private final BitSet spectrumConstraint;
+
+    public PostAlgoPathValidator(NetworkTransactionService networkTransactionService, BitSet spectrumConstraint) {
+        this.networkTransactionService = networkTransactionService;
+        this.spectrumConstraint = spectrumConstraint;
+    }
+
     @SuppressWarnings("fallthrough")
     @SuppressFBWarnings(
         value = "SF_SWITCH_FALLTHROUGH",
         justification = "intentional fallthrough")
     public PceResult checkPath(GraphPath<String, PceGraphEdge> path, Map<NodeId, PceNode> allPceNodes,
-        PceResult pceResult, PceConstraints pceHardConstraints, String serviceType) {
-
+            Map<LinkId, PceLink> allPceLinks, PceResult pceResult, PceConstraints pceHardConstraints,
+            String serviceType, PceConstraintMode mode) {
+        LOG.info("path = {}", path);
         // check if the path is empty
         if (path.getEdgeList().isEmpty()) {
             pceResult.setRC(ResponseCodes.RESPONSE_FAILED);
             return pceResult;
         }
-        int spectralWidthSlotNumber = GridConstant.SPECTRAL_WIDTH_SLOT_NUMBER_MAP
-            .getOrDefault(serviceType, GridConstant.NB_SLOTS_100G);
+        int spectralWidthSlotNumber =
+            GridConstant.SPECTRAL_WIDTH_SLOT_NUMBER_MAP.getOrDefault(serviceType, GridConstant.NB_SLOTS_100G);
         SpectrumAssignment spectrumAssignment = null;
         //variable to deal with 1GE (Nb=1) and 10GE (Nb=10) cases
         switch (serviceType) {
@@ -65,8 +90,8 @@ public class PostAlgoPathValidator {
             case StringConstants.SERVICE_TYPE_OTUC3:
             case StringConstants.SERVICE_TYPE_OTUC4:
             case StringConstants.SERVICE_TYPE_400GE:
-                spectralWidthSlotNumber = GridConstant.SPECTRAL_WIDTH_SLOT_NUMBER_MAP
-                    .getOrDefault(serviceType, GridConstant.NB_SLOTS_400G);
+                spectralWidthSlotNumber =
+                    GridConstant.SPECTRAL_WIDTH_SLOT_NUMBER_MAP.getOrDefault(serviceType, GridConstant.NB_SLOTS_400G);
             //fallthrough
             case StringConstants.SERVICE_TYPE_100GE_T:
             case StringConstants.SERVICE_TYPE_OTU4:
@@ -79,67 +104,77 @@ public class PostAlgoPathValidator {
                     return pceResult;
                 }
                 if (spectrumAssignment.getFlexGrid()) {
-                    LOG.info("Spectrum assignment flexgrid mode");
+                    LOG.debug("Spectrum assignment flexgrid mode");
                     pceResult.setResultWavelength(GridConstant.IRRELEVANT_WAVELENGTH_NUMBER);
                 } else {
-                    LOG.info("Spectrum assignment fixedgrid mode");
+                    LOG.debug("Spectrum assignment fixedgrid mode");
                     pceResult.setResultWavelength(
-                            GridUtils.getWaveLengthIndexFromSpectrumAssigment(spectrumAssignment.getBeginIndex()
-                                .toJava()));
+                        GridUtils.getWaveLengthIndexFromSpectrumAssigment(spectrumAssignment.getBeginIndex().toJava()));
                 }
                 pceResult.setMinFreq(GridUtils.getStartFrequencyFromIndex(spectrumAssignment.getBeginIndex().toJava()));
                 pceResult.setMaxFreq(GridUtils.getStopFrequencyFromIndex(spectrumAssignment.getStopIndex().toJava()));
-                LOG.info("In PostAlgoPathValidator: spectrum assignment found {} {}", spectrumAssignment, path);
+                LOG.debug("In PostAlgoPathValidator: spectrum assignment found {} {}", spectrumAssignment, path);
 
                 // Check the OSNR
-                if (!checkOSNR(path)) {
-                    pceResult.setRC(ResponseCodes.RESPONSE_FAILED);
-                    pceResult.setLocalCause(PceResult.LocalCause.OUT_OF_SPEC_OSNR);
-                    return pceResult;
+                CatalogUtils cu = new CatalogUtils(networkTransactionService);
+                if (cu.isCatalogFilled()) {
+                    double margin1 = checkOSNR(path, allPceNodes, allPceLinks, serviceType,
+                            StringConstants.SERVICE_DIRECTION_AZ, cu);
+                    double margin2 = checkOSNR(path, allPceNodes, allPceLinks, serviceType,
+                            StringConstants.SERVICE_DIRECTION_ZA, cu);
+                    if (margin1 < 0 || margin2 < 0 || margin1 == Double.NEGATIVE_INFINITY
+                            || margin2 == Double.NEGATIVE_INFINITY) {
+                        pceResult.setRC(ResponseCodes.RESPONSE_FAILED);
+                        pceResult.setLocalCause(PceResult.LocalCause.OUT_OF_SPEC_OSNR);
+                        return pceResult;
+                    }
+                    this.tpceCalculatedMargin = Math.min(margin1, margin2);
+                    LOG.info(
+                        "In PostAlgoPathValidator: Minimum margin estimated by tpce on AtoZ and ZtoA path is of  {} dB",
+                        this.tpceCalculatedMargin);
+                } else {
+                    this.tpceCalculatedMargin = 0.0;
+                    LOG.info("In PostAlgoPathValidator: Operational mode Catalog not filled, delegate OSNR calculation"
+                        + " to GNPy and margin set to 0");
                 }
-
                 // Check if MaxLatency is defined in the hard constraints
-                if ((pceHardConstraints.getMaxLatency() != -1)
-                        && (!checkLatency(pceHardConstraints.getMaxLatency(), path))) {
+                if (pceHardConstraints.getMaxLatency() != -1
+                        && !checkLatency(pceHardConstraints.getMaxLatency(), path)) {
                     pceResult.setRC(ResponseCodes.RESPONSE_FAILED);
                     pceResult.setLocalCause(PceResult.LocalCause.TOO_HIGH_LATENCY);
                     return pceResult;
                 }
-
                 // Check if nodes are included in the hard constraints
-                if (!checkInclude(path, pceHardConstraints)) {
+                if (!checkInclude(path, pceHardConstraints, mode)) {
                     pceResult.setRC(ResponseCodes.RESPONSE_FAILED);
                     pceResult.setLocalCause(PceResult.LocalCause.HD_NODE_INCLUDE);
                     return pceResult;
                 }
-
                 // TODO here other post algo validations can be added
                 // more data can be sent to PceGraph module via PceResult structure if required
-
                 pceResult.setRC(ResponseCodes.RESPONSE_OK);
                 pceResult.setLocalCause(PceResult.LocalCause.NONE);
-                break;
+                return pceResult;
             case StringConstants.SERVICE_TYPE_100GE_M:
             case StringConstants.SERVICE_TYPE_10GE:
             case StringConstants.SERVICE_TYPE_1GE:
-                Map<String, Integer> tribSlotNbMap = Map.of(
-                    StringConstants.SERVICE_TYPE_100GE_M, 20,
-                    StringConstants.SERVICE_TYPE_10GE, 8,
-                    StringConstants.SERVICE_TYPE_1GE, 1);
-                int tribSlotNb = tribSlotNbMap.get(serviceType);
+                int tribSlotNb = Map.of(
+                        StringConstants.SERVICE_TYPE_100GE_M, 20,
+                        StringConstants.SERVICE_TYPE_10GE, 8,
+                        StringConstants.SERVICE_TYPE_1GE, 1)
+                    .get(serviceType);
                 pceResult.setRC(ResponseCodes.RESPONSE_FAILED);
                 pceResult.setServiceType(serviceType);
                 Map<String, List<Uint16>> tribSlot = chooseTribSlot(path, allPceNodes, tribSlotNb);
                 Map<String, Uint16> tribPort = chooseTribPort(path, allPceNodes, tribSlot, tribSlotNb);
                 List<OpucnTribSlotDef> resultTribPortTribSlot = getMinMaxTpTs(tribPort, tribSlot);
-
                 if (resultTribPortTribSlot.get(0) != null && resultTribPortTribSlot.get(1) != null) {
                     pceResult.setResultTribPortTribSlot(resultTribPortTribSlot);
                     pceResult.setRC(ResponseCodes.RESPONSE_OK);
                     LOG.info("In PostAlgoPathValidator: found TribPort {} - tribSlot {} - tribSlotNb {}",
                         tribPort, tribSlot, tribSlotNb);
                 }
-                break;
+                return pceResult;
             case StringConstants.SERVICE_TYPE_ODU4:
             case StringConstants.SERVICE_TYPE_ODUC2:
             case StringConstants.SERVICE_TYPE_ODUC3:
@@ -148,20 +183,18 @@ public class PostAlgoPathValidator {
                 pceResult.setRC(ResponseCodes.RESPONSE_OK);
                 pceResult.setServiceType(serviceType);
                 LOG.info("In PostAlgoPathValidator: ODU4/ODUCn path found {}", path);
-                break;
+                return pceResult;
             default:
                 pceResult.setRC(ResponseCodes.RESPONSE_FAILED);
                 LOG.warn("In PostAlgoPathValidator checkPath: unsupported serviceType {} found {}",
                     serviceType, path);
-                break;
+                return pceResult;
         }
-        return pceResult;
     }
 
     // Check the latency
     private boolean checkLatency(Long maxLatency, GraphPath<String, PceGraphEdge> path) {
         double latency = 0;
-
         for (PceGraphEdge edge : path.getEdgeList()) {
             if (edge.link() == null || edge.link().getLatency() == null) {
                 LOG.warn("- In checkLatency: the link {} does not contain latency field",
@@ -175,74 +208,55 @@ public class PostAlgoPathValidator {
     }
 
     // Check the inclusion if it is defined in the hard constraints
-    private boolean checkInclude(GraphPath<String, PceGraphEdge> path, PceConstraints pceHardConstraintsInput) {
+    //TODO: remove this checkstyle false positive warning when the checkstyle bug will be fixed
+    @SuppressWarnings("MissingSwitchDefault")
+    private boolean checkInclude(GraphPath<String, PceGraphEdge> path, PceConstraints pceHardConstraintsInput,
+            PceConstraintMode mode) {
         List<ResourcePair> listToInclude = pceHardConstraintsInput.getListToInclude();
         if (listToInclude.isEmpty()) {
             return true;
         }
-
         List<PceGraphEdge> pathEdges = path.getEdgeList();
         LOG.debug(" in checkInclude vertex list: [{}]", path.getVertexList());
-
+        LOG.debug("listToInclude = {}", listToInclude);
         List<String> listOfElementsSubNode = new ArrayList<>();
         listOfElementsSubNode.add(pathEdges.get(0).link().getsourceNetworkSupNodeId());
-        listOfElementsSubNode.addAll(listOfElementsBuild(pathEdges, PceConstraints.ResourceType.NODE,
-            pceHardConstraintsInput));
-
+        listOfElementsSubNode.addAll(
+            listOfElementsBuild(pathEdges, PceConstraints.ResourceType.NODE, pceHardConstraintsInput));
         List<String> listOfElementsCLLI = new ArrayList<>();
         listOfElementsCLLI.add(pathEdges.get(0).link().getsourceCLLI());
-        listOfElementsCLLI.addAll(listOfElementsBuild(pathEdges, PceConstraints.ResourceType.CLLI,
-            pceHardConstraintsInput));
-
+        listOfElementsCLLI.addAll(
+            listOfElementsBuild(pathEdges, PceConstraints.ResourceType.CLLI, pceHardConstraintsInput));
         List<String> listOfElementsSRLG = new ArrayList<>();
         // first link is XPONDEROUTPUT, no SRLG for it
         listOfElementsSRLG.add("NONE");
-        listOfElementsSRLG.addAll(listOfElementsBuild(pathEdges, PceConstraints.ResourceType.SRLG,
-            pceHardConstraintsInput));
-
+        listOfElementsSRLG.addAll(
+            listOfElementsBuild(pathEdges, PceConstraints.ResourceType.SRLG, pceHardConstraintsInput));
         // validation: check each type for each element
-        for (ResourcePair next : listToInclude) {
-            int indx = -1;
-            switch (next.getType()) {
-                case NODE:
-                    if (listOfElementsSubNode.contains(next.getName())) {
-                        indx = listOfElementsSubNode.indexOf(next.getName());
-                    }
-                    break;
-                case SRLG:
-                    if (listOfElementsSRLG.contains(next.getName())) {
-                        indx = listOfElementsSRLG.indexOf(next.getName());
-                    }
-                    break;
-                case CLLI:
-                    if (listOfElementsCLLI.contains(next.getName())) {
-                        indx = listOfElementsCLLI.indexOf(next.getName());
-                    }
-                    break;
-                default:
-                    LOG.warn(" in checkInclude vertex list unsupported resource type: [{}]", next.getType());
-            }
-
-            if (indx < 0) {
-                LOG.debug(" in checkInclude stopped : {} ", next.getName());
-                return false;
-            }
-
-            LOG.debug(" in checkInclude next found {} in {}", next.getName(), path.getVertexList());
-
-            listOfElementsSubNode.subList(0, indx).clear();
-            listOfElementsCLLI.subList(0, indx).clear();
-            listOfElementsSRLG.subList(0, indx).clear();
+        LOG.debug("listOfElementsSubNode = {}", listOfElementsSubNode);
+        return switch (mode) {
+            case Loose -> listOfElementsSubNode
+                .containsAll(listToInclude.stream()
+                    .filter(rp -> PceConstraints.ResourceType.NODE.equals(rp.getType()))
+                    .map(ResourcePair::getName).collect(Collectors.toList()));
+            case Strict -> listOfElementsSubNode
+                .equals(listToInclude.stream()
+                    .filter(rp -> PceConstraints.ResourceType.NODE.equals(rp.getType()))
+                    .map(ResourcePair::getName).collect(Collectors.toList()));
         }
-
-        LOG.info(" in checkInclude passed : {} ", path.getVertexList());
-        return true;
+            && listOfElementsSRLG.containsAll(
+                listToInclude
+                    .stream().filter(rp -> PceConstraints.ResourceType.SRLG.equals(rp.getType()))
+                    .map(ResourcePair::getName).collect(Collectors.toList()))
+            && listOfElementsCLLI.containsAll(
+                listToInclude
+                    .stream().filter(rp -> PceConstraints.ResourceType.CLLI.equals(rp.getType()))
+                    .map(ResourcePair::getName).collect(Collectors.toList()));
     }
 
     private List<String> listOfElementsBuild(List<PceGraphEdge> pathEdges, PceConstraints.ResourceType type,
-        PceConstraints pceHardConstraints) {
-
-        List<String> listOfElements = new ArrayList<>();
+            PceConstraints pceHardConstraints) {
+        Set<String> listOfElements = new LinkedHashSet<>();
         for (PceGraphEdge link : pathEdges) {
             switch (type) {
                 case NODE:
@@ -278,37 +292,38 @@ public class PostAlgoPathValidator {
                     LOG.debug("listOfElementsBuild unsupported resource type");
             }
         }
-        return listOfElements;
+        return new ArrayList<>(listOfElements);
     }
 
     private Map<String, Uint16> chooseTribPort(GraphPath<String,
-        PceGraphEdge> path, Map<NodeId, PceNode> allPceNodes, Map<String, List<Uint16>> tribSlotMap, int nbSlot) {
-        LOG.info("In choosetribPort: edgeList = {} ", path.getEdgeList());
+            PceGraphEdge> path, Map<NodeId, PceNode> allPceNodes, Map<String, List<Uint16>> tribSlotMap, int nbSlot) {
+        LOG.debug("In choosetribPort: edgeList = {} ", path.getEdgeList());
         Map<String, Uint16> tribPortMap = new HashMap<>();
-
         for (PceGraphEdge edge : path.getEdgeList()) {
-            NodeId linkSrcNode = edge.link().getSourceId();
-            String linkSrcTp = edge.link().getSourceTP().getValue();
-            NodeId linkDestNode = edge.link().getDestId();
-            String linkDestTp = edge.link().getDestTP().getValue();
-            PceNode pceOtnNodeSrc = allPceNodes.get(linkSrcNode);
-            PceNode pceOtnNodeDest = allPceNodes.get(linkDestNode);
-            List<Uint16> srcTpnPool = pceOtnNodeSrc.getAvailableTribPorts().get(linkSrcTp);
-            List<Uint16> destTpnPool = pceOtnNodeDest.getAvailableTribPorts().get(linkDestTp);
+            List<Uint16> srcTpnPool =
+                allPceNodes
+                    .get(edge.link().getSourceId())
+                    .getAvailableTribPorts()
+                    .get(edge.link().getSourceTP().getValue());
+            List<Uint16> destTpnPool =
+                allPceNodes
+                    .get(edge.link().getDestId())
+                    .getAvailableTribPorts()
+                    .get(edge.link().getDestTP().getValue());
             List<Uint16> commonEdgeTpnPool = new ArrayList<>();
             for (Uint16 srcTpn : srcTpnPool) {
                 if (destTpnPool.contains(srcTpn)) {
                     commonEdgeTpnPool.add(srcTpn);
                 }
             }
-            Collections.sort(commonEdgeTpnPool);
-            if (!commonEdgeTpnPool.isEmpty()) {
-                Integer startTribSlot = tribSlotMap.values().stream().findFirst().get().get(0).toJava();
-                Integer tribPort = (int) Math.ceil((double)startTribSlot / nbSlot);
-                for (Uint16 commonTribPort : commonEdgeTpnPool) {
-                    if (tribPort.equals(commonTribPort.toJava())) {
-                        tribPortMap.put(edge.link().getLinkId().getValue(), commonTribPort);
-                    }
+            if (commonEdgeTpnPool.isEmpty()) {
+                continue;
+            }
+            Integer startTribSlot = tribSlotMap.values().stream().findFirst().orElseThrow().get(0).toJava();
+            Integer tribPort = (int) Math.ceil((double)startTribSlot / nbSlot);
+            for (Uint16 commonTribPort : commonEdgeTpnPool) {
+                if (tribPort.equals(commonTribPort.toJava())) {
+                    tribPortMap.put(edge.link().getLinkId().getValue(), commonTribPort);
                 }
             }
         }
@@ -317,19 +332,20 @@ public class PostAlgoPathValidator {
     }
 
     private Map<String, List<Uint16>> chooseTribSlot(GraphPath<String,
-        PceGraphEdge> path, Map<NodeId, PceNode> allPceNodes, int nbSlot) {
-        LOG.info("In choosetribSlot: edgeList = {} ", path.getEdgeList());
+            PceGraphEdge> path, Map<NodeId, PceNode> allPceNodes, int nbSlot) {
+        LOG.debug("In choosetribSlot: edgeList = {} ", path.getEdgeList());
         Map<String, List<Uint16>> tribSlotMap = new HashMap<>();
-
         for (PceGraphEdge edge : path.getEdgeList()) {
-            NodeId linkSrcNode = edge.link().getSourceId();
-            String linkSrcTp = edge.link().getSourceTP().getValue();
-            NodeId linkDestNode = edge.link().getDestId();
-            String linkDestTp = edge.link().getDestTP().getValue();
-            PceNode pceOtnNodeSrc = allPceNodes.get(linkSrcNode);
-            PceNode pceOtnNodeDest = allPceNodes.get(linkDestNode);
-            List<Uint16> srcTsPool = pceOtnNodeSrc.getAvailableTribSlots().get(linkSrcTp);
-            List<Uint16> destTsPool = pceOtnNodeDest.getAvailableTribSlots().get(linkDestTp);
+            List<Uint16> srcTsPool =
+                allPceNodes
+                    .get(edge.link().getSourceId())
+                    .getAvailableTribSlots()
+                    .get(edge.link().getSourceTP().getValue());
+            List<Uint16> destTsPool =
+                allPceNodes
+                    .get(edge.link().getDestId())
+                    .getAvailableTribSlots()
+                    .get(edge.link().getDestTP().getValue());
             List<Uint16> commonEdgeTsPoolList = new ArrayList<>();
             List<Uint16> tribSlotList = new ArrayList<>();
             for (Uint16 integer : srcTsPool) {
@@ -340,8 +356,7 @@ public class PostAlgoPathValidator {
             Collections.sort(commonEdgeTsPoolList);
             List<Uint16> commonGoodStartEdgeTsPoolList = new ArrayList<>();
             for (Uint16 startEdgeTsPool : commonEdgeTsPoolList) {
-                if (Integer.valueOf(1).equals(startEdgeTsPool.toJava() % nbSlot)
-                        || nbSlot == 1) {
+                if (Integer.valueOf(1).equals(startEdgeTsPool.toJava() % nbSlot) || nbSlot == 1) {
                     commonGoodStartEdgeTsPoolList.add(startEdgeTsPool);
                 }
             }
@@ -370,53 +385,609 @@ public class PostAlgoPathValidator {
 
     private List<OpucnTribSlotDef> getMinMaxTpTs(Map<String, Uint16> tribPort, Map<String, List<Uint16>> tribSlot) {
         String tribport = tribPort.values().toArray()[0].toString();
-        @SuppressWarnings("unchecked")
-        List<Uint16> tsList = (List<Uint16>) tribSlot.values().toArray()[0];
-        OpucnTribSlotDef minOpucnTs = OpucnTribSlotDef
-            .getDefaultInstance(String.join(".", tribport, tsList.get(0).toString()));
-        OpucnTribSlotDef maxOpucnTs = OpucnTribSlotDef
-            .getDefaultInstance(String.join(".", tribport, tsList.get(tsList.size() - 1).toString()));
-        List<OpucnTribSlotDef> minmaxTpTsList = new ArrayList<>();
-        minmaxTpTsList.add(minOpucnTs);
-        minmaxTpTsList.add(maxOpucnTs);
-        return minmaxTpTsList;
+        @SuppressWarnings("unchecked") List<Uint16> tsList = (List<Uint16>) tribSlot.values().toArray()[0];
+        return new ArrayList<>(List.of(
+            OpucnTribSlotDef.getDefaultInstance(String.join(".", tribport, tsList.get(0).toString())),
+            OpucnTribSlotDef.getDefaultInstance(String.join(".", tribport, tsList.get(tsList.size() - 1).toString()))));
     }
 
-    // Check the path OSNR
-    private boolean checkOSNR(GraphPath<String, PceGraphEdge> path) {
-        double linkOsnrDb;
-        double osnrDb = 0;
-        LOG.info("- In checkOSNR: OSNR of the transmitter = {} dB", TRX_OSNR);
-        LOG.info("- In checkOSNR: add-path incremental OSNR = {} dB", ADD_OSNR);
-        double inverseLocalOsnr = getInverseOsnrLinkLu(TRX_OSNR) + getInverseOsnrLinkLu(ADD_OSNR);
-        for (PceGraphEdge edge : path.getEdgeList()) {
-            if (edge.link().getlinkType() == OpenroadmLinkType.ROADMTOROADM) {
-                // link OSNR in dB
-                linkOsnrDb = edge.link().getosnr();
-                LOG.info("- In checkOSNR: OSNR of {} = {} dB", edge.link().getLinkId().getValue(), linkOsnrDb);
-                // 1 over the local OSNR, in linear units
-                inverseLocalOsnr += getInverseOsnrLinkLu(linkOsnrDb);
+    private double checkOSNR(GraphPath<String, PceGraphEdge> path, Map<NodeId, PceNode> allPceNodes,
+            Map<LinkId, PceLink> allPceLinks, String serviceType, String direction, CatalogUtils cu) {
+        switch (direction) {
+            case StringConstants.SERVICE_DIRECTION_AZ:
+                return checkOSNRaz(path, allPceNodes, allPceLinks, serviceType, cu);
+            case StringConstants.SERVICE_DIRECTION_ZA:
+                return checkOSNRza(path, allPceNodes, allPceLinks, serviceType, cu);
+            default:
+                LOG.error("PostAlgoPathValidator.CheckOSNR : unsupported direction {}", direction);
+                return 0.0;
+        }
+    }
+
+    /**
+     * Calculates the OSNR of a path, according to the direction (AtoZ/ZtoA), using the operational-modes Catalog.
+     *
+     * @param path                      the AtoZ path provided by the PCE.
+     * @param allPceNode                The map of chosen/relevant PceNodes build from topology pruning.
+     * @param allPceLinks               The map of PceLinks build corresponding to the whole topology.
+     * @param serviceType               The service Type used to extrapolate Operational mode when it is not provided.
+     * @param cu                        CatalogUtils instance.
+     * @return the calculated margin according to the Transponder performances and path impairments.
+     */
+    private double checkOSNRaz(GraphPath<String, PceGraphEdge> path, Map<NodeId, PceNode> allPceNodes,
+            Map<LinkId, PceLink> allPceLinks, String serviceType, CatalogUtils cu) {
+        Map<String, Double> signal = new HashMap<>(
+            Map.of(
+                "spacing", Double.valueOf(50.0),
+                "calcPdl2", Double.valueOf(0),
+                "calcCd", Double.valueOf(0),
+                "calcPmd2", Double.valueOf(0),
+                "calcOnsrLin", Double.valueOf(0.0001),
+                "pwrIn", Double.valueOf(-60.0),
+                "pwrOut", Double.valueOf(-60.0)));
+        double calcOnsrdB = 0;
+        double margin = 0;
+        boolean transponderPresent = false;
+        List<String> vertices = path.getVertexList();
+        List<PceGraphEdge> edges = path.getEdgeList();
+        // LOOP that scans the different Nodes/Links of the path and calculates
+        // associated degradations
+        // using CatalogUtils primitives to retrieve physical parameters and make a
+        // first level calculation
+        int bypassDegree = 0;
+        for (int pathElement = 0; pathElement < 2; pathElement++) {
+            bypassDegree = 0;
+            PceNode currentNode = allPceNodes.get(new NodeId(vertices.get(pathElement)));
+            PceNode nextNode = allPceNodes.get(new NodeId(vertices.get(pathElement + 1)));
+            LOG.debug("loop of check OSNR direction AZ, Path Element = {}", pathElement);
+            switch (currentNode.getORNodeType()) {
+                case XPONDER:
+                    LOG.debug("loop of check OSNR direction AZ: XPDR, Path Element = {}", pathElement);
+                    transponderPresent = true;
+                    calcXpdrOSNR(cu, signal,
+                        pathElement == 0
+                            // First transponder on the Path (TX side) / Last Xponder of the path (RX side)
+                            ? edges.get(pathElement).link().getSourceTP().getValue()
+                            : edges.get(pathElement - 1).link().getDestTP().getValue(),
+                        serviceType, currentNode, nextNode, vertices.get(pathElement), pathElement);
+                    break;
+                case SRG:
+                    LOG.debug("loop of check OSNR direction AZ: SRG, Path Element = {}", pathElement);
+                    // This is ADD case : First (optical-tunnel) or 2nd (Regular E2E service from
+                    // Xponder to Xponder) node element of the path is the ADD SRG.
+                    if (edges.get(pathElement).link().getlinkType() != OpenroadmLinkType.ADDLINK) {
+                        LOG.error("Error processing Node {} for which output link {} is not an ADDLINK Type",
+                            currentNode.getNodeId(), pathElement);
+                    }
+                    signal.put("pwrIn", Double.valueOf(0));
+                    calcAddContrib(cu, signal, currentNode, edges.get(pathElement + 1).link());
+                    LOG.debug("loop of check OSNR direction AZ: SRG, pathElement = {} link {} Pout = {}",
+                        pathElement, pathElement + 1, signal.get("pwrOut"));
+                    double calcOnsr = signal.get("calcOnsrLin").doubleValue();
+                    if (calcOnsr == Double.NEGATIVE_INFINITY || calcOnsr == Double.POSITIVE_INFINITY) {
+                        return -1.0;
+                    }
+                    // For the ADD, degradation brought by the node are calculated from the MW-WR spec.
+                    // The Degree is not considered. This means we must bypass the add-link (ADD)
+                    // and the next node (Degree) which are not considered in the impairments.
+                    pathElement++;
+                    bypassDegree = 1;
+                    break;
+                case DEGREE:
+                default:
+                    LOG.error("PostAlgoPathValidator.CheckOSNR : unsupported resource type in the path chain");
             }
         }
+        for (int pathElement = 2 + bypassDegree; pathElement < vertices.size() - 1; pathElement++) {
+            PceNode currentNode = allPceNodes.get(new NodeId(vertices.get(pathElement)));
+            PceNode nextNode = allPceNodes.get(new NodeId(vertices.get(pathElement + 1)));
+            LOG.debug("loop of check OSNR direction AZ: Path Element = {}", pathElement);
+            switch (currentNode.getORNodeType()) {
+                case SRG:
+                    LOG.debug("loop of check OSNR direction AZ: SRG, Path Element = {}", pathElement);
+                    // Other case is DROP, for which cnt is unchanged (.DROP)
+                    if (edges.get(pathElement - 1).link().getlinkType() != OpenroadmLinkType.DROPLINK) {
+                        LOG.error("Error processing Node {} for which input link {} is not a DROPLINK Type",
+                            currentNode.getNodeId(), pathElement - 1);
+                    }
+                    PceLink pceLink = edges.get(pathElement - 2).link();
+                    LOG.info("loop of check OSNR : SRG, pathElement = {} CD on preceeding link {} = {} ps",
+                        pathElement, pathElement - 2, pceLink.getcd());
+                    calcDropContrib(cu, signal, currentNode, pceLink);
+                    double calcOnsr = signal.get("calcOnsrLin").doubleValue();
+                    if (calcOnsr == Double.NEGATIVE_INFINITY || calcOnsr == Double.POSITIVE_INFINITY) {
+                        return -1.0;
+                    }
+                    // If SRG is not the first or the second element of the Path, it is the DROP
+                    // side.
+                    // After accumulated degradations are calculated, we also need to calculate
+                    // resulting OSNR in dB to pass it to the method that verifies end Xponder
+                    // performances are compatible with degradations experienced on the path
+                    try {
+                        calcOnsrdB = getOsnrDbfromOnsrLin(calcOnsr);
+                        LOG.info("checkOSNR loop, last SRG osnr is {} dB", calcOnsrdB);
+                        LOG.info("Loop pathElement = {}, DROP, calcOnsrdB= {}", pathElement, calcOnsrdB);
+                    } catch (ArithmeticException e) {
+                        LOG.debug("In checkOSNR: OSNR is equal to 0 and the number of links is: {}",
+                            path.getEdgeList().size());
+                        return -1.0;
+                    }
+                    break;
+                case DEGREE:
+                    if (nextNode.getORNodeType() != OpenroadmNodeType.DEGREE) {
+                        //This is the case of DROP, ROADM degree is not considered
+                        break;
+                    }
+                    LOG.info("loop of check OSNR direction AZ: DEGREE, Path Element = {}", pathElement);
+                    calcBypassContrib(cu, signal, currentNode, nextNode,
+                        edges.get(pathElement - 1).link(), edges.get(pathElement + 1).link());
+                    double calcOnsrLin = signal.get("calcOnsrLin").doubleValue();
+                    LOG.debug(
+                        "Loop pathElement= {}, DEGREE, calcOnsrdB= {}", pathElement, getOsnrDbfromOnsrLin(calcOnsrLin));
+                    if (calcOnsrLin == Double.NEGATIVE_INFINITY || calcOnsrLin == Double.POSITIVE_INFINITY) {
+                        return -1.0;
+                    }
+                    // increment pathElement so that in next step we will not point to Degree2 but
+                    // next node
+                    pathElement++;
+                    LOG.info("Accumulated degradations in the path including ROADM {} + {} are CD: {}; PMD2: "
+                        + "{}; Pdl2 : {}; ONSRdB : {}", currentNode.getNodeId(), nextNode.getNodeId(),
+                        signal.get("calcCd"), signal.get("calcPmd2"), signal.get("calcPdl2"),
+                        getOsnrDbfromOnsrLin(calcOnsrLin));
+                    break;
+                case XPONDER:
+                    LOG.debug("loop of check OSNR direction AZ: XPDR, Path Element = {}", pathElement);
+                    LOG.error("unsupported back to back transponder configuration");
+                    return -1.0;
+                default:
+                    LOG.error("PostAlgoPathValidator.CheckOSNR : unsupported resource type in the path chain");
+            }
+        }
+        PceNode currentNode = allPceNodes.get(new NodeId(vertices.get(vertices.size() - 1)));
+        LOG.debug("loop of check OSNR, Path Element = {}", vertices.size() - 1);
+        switch (currentNode.getORNodeType()) {
+            case XPONDER:
+                LOG.debug("loop of check OSNR direction AZ: XPDR, Path Element = {}", vertices.size() - 1);
+                transponderPresent = true;
+                // TSP is the last of the path
+                margin = getLastXpdrMargin(cu, signal, edges.get(vertices.size() - 2).link().getDestTP().getValue(),
+                    serviceType, currentNode, vertices.get(vertices.size() - 1), vertices.size() - 1);
+                break;
+            case SRG:
+                LOG.debug("loop of check OSNR direction AZ: SRG, Path Element = {}", vertices.size() - 1);
+                // Other case is DROP, for which cnt is unchanged (.DROP)
+                if (edges.get(vertices.size() - 2).link().getlinkType() != OpenroadmLinkType.DROPLINK) {
+                    LOG.error("Error processing Node {} for which input link {} is not a DROPLINK Type",
+                        currentNode.getNodeId(), vertices.size() - 2);
+                }
+                PceLink pceLink = edges.get(vertices.size() - 3).link();
+                LOG.info("loop of check OSNR : SRG, pathElement = {} CD on preceeding link {} = {} ps",
+                    vertices.size() - 1, vertices.size() - 3, pceLink.getcd());
+                calcDropContrib(cu, signal, currentNode, pceLink);
+                double calcOnsr = signal.get("calcOnsrLin").doubleValue();
+                //commented out to avoid spotbug DLS_DEAD_LOCAL_STORE pwrIn = impairments.get("pwrIn");
+                if (calcOnsr == Double.NEGATIVE_INFINITY || calcOnsr == Double.POSITIVE_INFINITY) {
+                    return -1.0;
+                }
+                // If SRG is not the first or the second element of the Path, it is the DROP
+                // side.
+                // After accumulated degradations are calculated, we also need to calculate
+                // resulting OSNR in dB to pass it to the method that verifies end Xponder
+                // performances are compatible with degradations experienced on the path
+                try {
+                    calcOnsrdB = getOsnrDbfromOnsrLin(calcOnsr);
+                    LOG.info("checkOSNR loop, last SRG osnr is {} dB", calcOnsrdB);
+                    LOG.info("Loop pathElement = {}, DROP, calcOnsrdB= {}", vertices.size() - 1, calcOnsrdB);
+                } catch (ArithmeticException e) {
+                    LOG.debug("In checkOSNR: OSNR is equal to 0 and the number of links is: {}",
+                        path.getEdgeList().size());
+                    return -1.0;
+                }
+                break;
+            case DEGREE:
+            default:
+                LOG.error("PostAlgoPathValidator.CheckOSNR : unsupported resource type in the path chain last element");
+        }
+        LOG.info("- In checkOSNR: accumulated CD = {} ps, PMD = {} ps, PDL = {} dB, and resulting OSNR calcOnsrdB = {} "
+            + "dB and ONSR dB exterapolated from calcosnrlin = {} including non linear contributions",
+            signal.get("calcCd"), Math.sqrt(signal.get("calcPmd2").doubleValue()),
+            Math.sqrt(signal.get("calcPdl2").doubleValue()), calcOnsrdB,
+            getOsnrDbfromOnsrLin(signal.get("calcOnsrLin").doubleValue()));
+        if (!transponderPresent) {
+            LOG.info("No transponder in the path, User shall check from CD, PMD, and OSNR values provided "
+                + "that optical tunnel degradations are compatible with external transponder performances");
+            return 0.0;
+        }
+        double delta = margin - SYS_MARGIN;
+        LOG.info("In checkOSNR: Transponder Operational mode results in a residual margin of {} dB, according "
+            + "to CD, PMD and DGD induced penalties and set System Margin of {} dB.",
+            delta, SYS_MARGIN);
+        String validationMessage = delta >= 0 ? "VALIDATED" : "INVALIDATED";
+        LOG.info("- In checkOSNR: A to Z Path from {} to {} {}",
+                vertices.get(0), vertices.get(vertices.size() - 1), validationMessage);
+        return delta;
+    }
+
+    /**
+     * Calculates the OSNR of a path, according to the direction (AtoZ/ZtoA), using the operational-modes Catalog.
+     *
+     * @param path                      the AtoZ path provided by the PCE.
+     * @param allPceNode                The map of chosen/relevant PceNodes build from topology pruning.
+     * @param allPceLinks               The map of PceLinks build corresponding to the whole topology.
+     * @param serviceType               The service Type used to extrapolate Operational mode when it is not provided.
+     * @param cu                        CatalogUtils instance.
+     * @return the calculated margin according to the Transponder performances and path impairments.
+     */
+    private double checkOSNRza(GraphPath<String, PceGraphEdge> path, Map<NodeId, PceNode> allPceNodes,
+            Map<LinkId, PceLink> allPceLinks, String serviceType, CatalogUtils cu) {
+        Map<String, Double> signal = new HashMap<>(
+            Map.of(
+                "spacing", Double.valueOf(50.0),
+                "calcPdl2", Double.valueOf(0),
+                "calcCd", Double.valueOf(0),
+                "calcPmd2", Double.valueOf(0),
+                "calcOnsrLin", Double.valueOf(0.0001),
+                "pwrIn", Double.valueOf(-60.0),
+                "pwrOut", Double.valueOf(-60.0)));
+        double calcOnsrdB = 0;
+        double margin = 0;
+        boolean transponderPresent = false;
+        List<String> vertices = path.getVertexList();
+        List<PceGraphEdge> edges = path.getEdgeList();
+        // LOOP that scans the different Nodes/Links of the path and calculates
+        // associated degradations
+        // using CatalogUtils primitives to retrieve physical parameters and make a
+        // first level calculation
+        int bypassDegree = 0;
+        for (int pathElement = vertices.size() - 1; pathElement > vertices.size() - 3; pathElement--) {
+            bypassDegree = 0;
+            PceNode currentNode = allPceNodes.get(new NodeId(vertices.get(pathElement)));
+            PceNode nextNode = allPceNodes.get(new NodeId(vertices.get(pathElement - 1)));
+            LOG.debug("loop of check OSNR direction ZA:  Path Element = {}", pathElement);
+            switch (currentNode.getORNodeType()) {
+                case XPONDER:
+                    LOG.debug("loop of check OSNR direction ZA: XPDR, Path Element = {}", pathElement);
+                    transponderPresent = true;
+                    calcXpdrOSNR(cu, signal,
+                        pathElement == vertices.size() - 1
+                            // First transponder on the Path (TX side) / Last Xponder of the path (RX side)
+                            ? getOppPceLink(pathElement - 1, edges, allPceLinks).getSourceTP().getValue()
+                            : getOppPceLink((pathElement), edges, allPceLinks).getDestTP().getValue(),
+                        serviceType, currentNode, nextNode, vertices.get(pathElement), pathElement);
+                    break;
+                case SRG:
+                    LOG.debug("loop of check OSNR direction ZA: SRG, Path Element = {}", pathElement);
+                    // This is ADD case : First (optical-tunnel) or 2nd (Regular E2E service from
+                    // Xponder to Xponder) node element of the path is the ADD SRG.
+                    if (getOppPceLink(pathElement - 1, edges, allPceLinks).getlinkType() != OpenroadmLinkType.ADDLINK) {
+                        LOG.error("Error processing Node {} for which output link {} is not an ADDLINK Type",
+                            currentNode.getNodeId(), pathElement - 1);
+                    }
+                    signal.put("pwrIn", Double.valueOf(0));
+                    calcAddContrib(cu, signal, currentNode, getOppPceLink(pathElement - 2, edges, allPceLinks));
+                    double calcOnsr = signal.get("calcOnsrLin").doubleValue();
+                    if (calcOnsr == Double.NEGATIVE_INFINITY || calcOnsr == Double.POSITIVE_INFINITY) {
+                        return -1.0;
+                    }
+                    // For the ADD, degradation brought by the node are calculated from the MW-WR spec.
+                    // The Degree is not considered. This means we must bypass the add-link (ADD)
+                    // and the next node (Degree) which are not considered in the impairments.
+                    pathElement--;
+                    bypassDegree = 1;
+                    break;
+                case DEGREE:
+                default:
+                    LOG.error("PostAlgoPathValidator.CheckOSNR : unsupported resource type in the path chain");
+            }
+        }
+        for (int pathElement = vertices.size() - 3 - bypassDegree; pathElement > 0; pathElement--) {
+            PceNode currentNode = allPceNodes.get(new NodeId(vertices.get(pathElement)));
+            PceNode nextNode = allPceNodes.get(new NodeId(vertices.get(pathElement - 1)));
+            LOG.debug("loop of check OSNR direction ZA: Path Element = {}", pathElement);
+            switch (currentNode.getORNodeType()) {
+                case SRG:
+                    LOG.debug("loop of check OSNR direction ZA: SRG, Path Element = {}", pathElement);
+                    if (getOppPceLink(pathElement, edges, allPceLinks).getlinkType() != OpenroadmLinkType.DROPLINK) {
+                        LOG.error("Error processing Node {} for which input link {} is not a DROPLINK Type",
+                            currentNode.getNodeId(), pathElement);
+                    }
+                    PceLink pceLink = getOppPceLink(pathElement + 1, edges, allPceLinks);
+                    LOG.info("loop of check OSNR direction ZA: SRG, path Element = {} CD on preceeding link {} = {} ps",
+                        pathElement, pathElement + 1, pceLink.getcd());
+                    calcDropContrib(cu, signal, currentNode, pceLink);
+                    double calcOnsr = signal.get("calcOnsrLin").doubleValue();
+                    if (calcOnsr == Double.NEGATIVE_INFINITY || calcOnsr == Double.POSITIVE_INFINITY) {
+                        return -1.0;
+                    }
+                    // If SRG is not the first or the second element of the Path, it is the DROP
+                    // side.
+                    // After accumulated degradations are calculated, we also need to calculate
+                    // resulting OSNR in dB to pass it to the method that verifies end Xponder
+                    // performances are compatible with degradations experienced on the path
+                    try {
+                        calcOnsrdB = getOsnrDbfromOnsrLin(calcOnsr);
+                        LOG.info("checkOSNR loop, last SRG osnr is {} dB", calcOnsrdB);
+                        LOG.info("Loop Path Element = {}, DROP, calcOnsrdB= {}", pathElement, calcOnsrdB);
+                    } catch (ArithmeticException e) {
+                        LOG.debug("In checkOSNR: OSNR is equal to 0 and the number of links is: {}",
+                            path.getEdgeList().size());
+                        return -1.0;
+                    }
+                    break;
+                case DEGREE:
+                    if (nextNode.getORNodeType() != OpenroadmNodeType.DEGREE) {
+                        //This is the case of DROP, ROADM degree is not considered
+                        break;
+                    }
+                    LOG.info("loop of check OSNR direction ZA: DEGREE, Path Element = {}", pathElement);
+                    calcBypassContrib(cu, signal, currentNode, nextNode,
+                        getOppPceLink(pathElement, edges, allPceLinks),
+                        getOppPceLink(pathElement - 2, edges, allPceLinks));
+                    double calcOnsrLin = signal.get("calcOnsrLin").doubleValue();
+                    LOG.debug("Loop Path Element = {}, DEGREE, calcOnsrdB= {}",
+                            pathElement, getOsnrDbfromOnsrLin(calcOnsrLin));
+                    if (calcOnsrLin == Double.NEGATIVE_INFINITY || calcOnsrLin == Double.POSITIVE_INFINITY) {
+                        return -1.0;
+                    }
+                    // increment pathElement so that in next step we will not point to Degree2 but
+                    // next node
+                    pathElement--;
+                    LOG.info("Accumulated degradations in the path including ROADM {} + {} are CD: {}; PMD2: "
+                        + "{}; Pdl2 : {}; ONSRdB : {}", currentNode.getNodeId(), nextNode.getNodeId(),
+                        signal.get("calcCd"), signal.get("calcPmd2"), signal.get("calcPdl2"),
+                        getOsnrDbfromOnsrLin(calcOnsrLin));
+                    break;
+                case XPONDER:
+                    LOG.debug("loop of check OSNR direction AZ: XPDR, Path Element = {}", pathElement);
+                    LOG.error("unsupported back to back transponder configuration");
+                    return -1.0;
+                default:
+                    LOG.error("PostAlgoPathValidator.CheckOSNR : unsupported resource type in the path chain");
+            }
+        }
+        PceNode currentNode = allPceNodes.get(new NodeId(vertices.get(0)));
+        LOG.debug("loop of check OSNR direction ZA: Path Element = 0");
+        switch (currentNode.getORNodeType()) {
+            case XPONDER:
+                LOG.debug("loop of check OSNR direction ZA: XPDR, Path Element = 0");
+                transponderPresent = true;
+                // TSP is the last of the path
+                margin = getLastXpdrMargin(cu, signal, getOppPceLink(0, edges, allPceLinks).getDestTP().getValue(),
+                    serviceType, currentNode, vertices.get(0), 0);
+                break;
+            case SRG:
+                LOG.debug("loop of check OSNR direction ZA: SRG, Path Element = 0");
+                if (getOppPceLink(0, edges, allPceLinks).getlinkType() != OpenroadmLinkType.DROPLINK) {
+                    LOG.error("Error processing Node {} for which input link 0 is not a DROPLINK Type",
+                        currentNode.getNodeId());
+                }
+                PceLink pceLink = getOppPceLink(1, edges, allPceLinks);
+                LOG.info("loop of check OSNR direction ZA: SRG, path Element = 0 CD on preceeding link 1 = {} ps",
+                    pceLink.getcd());
+                calcDropContrib(cu, signal, currentNode, pceLink);
+                double calcOnsr = signal.get("calcOnsrLin").doubleValue();
+                //commented out to avoid spotbug DLS_DEAD_LOCAL_STORE pwrIn = impairments.get("pwrIn");
+                if (calcOnsr == Double.NEGATIVE_INFINITY || calcOnsr == Double.POSITIVE_INFINITY) {
+                    return -1.0;
+                }
+                // If SRG is not the first or the second element of the Path, it is the DROP
+                // side.
+                // After accumulated degradations are calculated, we also need to calculate
+                // resulting OSNR in dB to pass it to the method that verifies end Xponder
+                // performances are compatible with degradations experienced on the path
+                try {
+                    calcOnsrdB = getOsnrDbfromOnsrLin(calcOnsr);
+                    LOG.info("checkOSNR loop, last SRG osnr is {} dB", calcOnsrdB);
+                    LOG.info("Loop Path Element = 0, DROP, calcOnsrdB= {}", calcOnsrdB);
+                } catch (ArithmeticException e) {
+                    LOG.debug("In checkOSNR: OSNR is equal to 0 and the number of links is: {}",
+                        path.getEdgeList().size());
+                    return -1.0;
+                }
+                break;
+            case DEGREE:
+            default:
+                LOG.error("PostAlgoPathValidator.CheckOSNR : unsupported resource type in the path chain last element");
+        }
+        LOG.info("- In checkOSNR: accumulated CD = {} ps, PMD = {} ps, PDL = {} dB, and resulting OSNR calcOnsrdB = {} "
+            + "dB and ONSR dB exterapolated from calcosnrlin = {} including non linear contributions",
+            signal.get("calcCd"), Math.sqrt(signal.get("calcPmd2").doubleValue()),
+            Math.sqrt(signal.get("calcPdl2").doubleValue()), calcOnsrdB,
+            getOsnrDbfromOnsrLin(signal.get("calcOnsrLin").doubleValue()));
+        if (!transponderPresent) {
+            LOG.info("No transponder in the path, User shall check from CD, PMD, and OSNR values provided "
+                + "that optical tunnel degradations are compatible with external transponder performances");
+            return 0.0;
+        }
+        double delta = margin - SYS_MARGIN;
+        LOG.info("In checkOSNR: Transponder Operational mode results in a residual margin of {} dB, according "
+            + "to CD, PMD and DGD induced penalties and set System Margin of {} dB.",
+            delta, SYS_MARGIN);
+        String validationMessage = delta >= 0 ? "VALIDATED" : "INVALIDATED";
+        LOG.info("- In checkOSNR: Z to A Path from {} to {} {}",
+                vertices.get(vertices.size() - 1), vertices.get(0), validationMessage);
+        return delta;
+    }
+
+    private String setOpMode(String opMode, String defaultMode) {
+        return
+            opMode == null || opMode.isEmpty() || opMode.contentEquals(StringConstants.UNKNOWN_MODE)
+                ? defaultMode
+                : opMode;
+    }
+
+    private PceLink getOppPceLink(Integer pathEltNber, List<PceGraphEdge> edges,
+            Map<LinkId, PceLink> allPceLinks) {
+        return allPceLinks.get(new LinkId(edges.get(pathEltNber).link().getOppositeLink()));
+    }
+
+    private String getXpdrOpMode(String nwTpId, String vertice, int pathElement, PceNode currentNode,
+            String serviceType, CatalogUtils cu) {
+        InstanceIdentifier<TerminationPoint1> nwTpIid =
+            InstanceIdentifiers.createNetworkTerminationPoint1IIDBuilder(vertice, nwTpId);
+        String opMode = cu.getPceOperationalModeFromServiceType(CatalogConstant.CatalogNodeType.TSP, serviceType);
         try {
-            osnrDb = getOsnrDb(1 / inverseLocalOsnr);
-        } catch (ArithmeticException e) {
-            LOG.debug("In checkOSNR: OSNR is equal to 0 and the number of links is: {}", path.getEdgeList().size());
-            return false;
+            if (networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, nwTpIid).get().isPresent()) {
+                // If the operational mode of the Xponder is not consistent nor declared in the topology (Network TP)
+                opMode = setOpMode(
+                    currentNode.getXponderOperationalMode(
+                        networkTransactionService
+                                .read(LogicalDatastoreType.CONFIGURATION, nwTpIid)
+                                .get().orElseThrow().getXpdrNetworkAttributes()),
+                    // Operational mode is found as an attribute of the network TP
+                    opMode);
+                    // Operational mode is retrieved from the service Type assuming it is supported
+                    // by the Xponder
+                LOG.debug(
+                    "Transponder {} corresponding to path Element {} in the path has {} operational mode",
+                    currentNode.getNodeId().getValue(), pathElement, opMode);
+                return opMode;
+            }
+        } catch (InterruptedException | ExecutionException e1) {
+            LOG.error("Issue accessing the XponderNetworkAttributes of {} for Transponder {}"
+                + " corresponding to path Element {} in the path ",
+                nwTpId, currentNode.getNodeId().getValue(), pathElement);
         }
-        LOG.info("In checkOSNR: OSNR of the path is {} dB", osnrDb);
-        return ((osnrDb + SYS_MARGIN) > MIN_OSNR_W100G);
+        LOG.info("Did not succeed finding network TP {} in Configuration Datastore. Retrieve"
+            + " default Operational Mode {} from serviceType {}", nwTpId, opMode, serviceType);
+        return opMode;
     }
 
-    private double getOsnrDb(double osnrLu) {
-        return (10 * Math.log10(osnrLu));
+    private double getLastXpdrMargin(
+            CatalogUtils cu, Map<String, Double> signal,
+            String nwTpId, String serviceType, PceNode currentNode, String vertice, int pathElement) {
+        LOG.debug("Loop Path Element = {}, Step5.1, XPDR, tries calculating Margin, just before call", pathElement);
+        // Check that accumulated degradations are compatible with TSP performances
+        // According to OpenROADM spec :
+        // margin = cu.getPceRxTspParameters(opMode, calcCd, Math.sqrt(calcPmd2), Math.sqrt(calcPdl2),
+        //              getOsnrDbfromOnsrLin(calcOnsrLin));
+        // Calculation modified for pdl according to calculation in Julia's Tool
+        double calcOnsrdB = getOsnrDbfromOnsrLin(signal.get("calcOnsrLin").doubleValue());
+        LOG.info("Loop Path Element = {}, XPDR, calcosnrdB= {}", pathElement, calcOnsrdB);
+        return cu.getPceRxTspParameters(
+            getXpdrOpMode(nwTpId, vertice, pathElement, currentNode, serviceType, cu),
+            signal.get("calcCd").doubleValue(),
+            Math.sqrt(signal.get("calcPmd2").doubleValue()),
+            Math.sqrt(signal.get("calcPdl2").doubleValue()),
+            calcOnsrdB);
+    }
+
+    private void calcXpdrOSNR(
+            CatalogUtils cu, Map<String, Double> signal, String nwTpId, String serviceType,
+            PceNode currentNode, PceNode nextNode, String vertice, int pathElement) {
+        // If the Xponder operational mode (setOpMode Arg1) is not consistent nor declared in the topology (Network TP)
+        // Operational mode is retrieved from the service Type assuming it is supported by the Xponder (setOpMode Arg2)
+        String opMode = getXpdrOpMode(nwTpId, vertice, pathElement, currentNode, serviceType, cu);
+        // If the operational mode of the ADD/DROP MUX is not consistent nor declared in the topology (Network TP)
+        // Operational mode is set by default to standard opMode for ADD SRGs
+        String adnMode = setOpMode(nextNode.getOperationalMode(), CatalogConstant.MWWRCORE);
+        double calcOnsrLin = cu.getPceTxTspParameters(opMode, adnMode);
+        LOG.debug(
+            "Transponder {} corresponding to path Element {} is connected to SRG which has {} operational mode",
+            currentNode.getNodeId().getValue(), pathElement, adnMode);
+        LOG.info("Transponder {} corresponding to path Element {} in the path has a TX OSNR of {} dB",
+            currentNode.getNodeId().getValue(), pathElement, getOsnrDbfromOnsrLin(calcOnsrLin));
+        // Return the Tx ONSR of the Xponder which results from IB and OOB OSNR contributions
+        // and the spacing associated with Xponder operational mode that is needed to calculate OSNR
+        signal.put("spacing", Double.valueOf(cu.getPceTxTspChannelSpacing(opMode)));
+        signal.put("calcOnsrLin", Double.valueOf(calcOnsrLin));
+    }
+
+    private void calcDropContrib(
+            CatalogUtils cu, Map<String, Double> signal, PceNode currentNode, PceLink pceLink) {
+        //calculation of the SRG contribution for Drop
+        calcLineDegradation(cu, signal, pceLink);
+        Map<String, Double> impairments = cu.getPceRoadmAmpParameters(
+            CatalogConstant.CatalogNodeType.DROP,
+            setOpMode(currentNode.getOperationalMode(), CatalogConstant.MWWRCORE),
+        // If the operational mode of the ADD/DROP MUX is not consistent or not declared in the topology (Network TP)
+        // Operational mode is set by default to standard opMode for ADD/DROP SRGs
+            signal.get("pwrIn").doubleValue(),
+            signal.get("calcCd").doubleValue(),
+            signal.get("calcPmd2").doubleValue(),
+            signal.get("calcPdl2").doubleValue(),
+            signal.get("calcOnsrLin").doubleValue(),
+            signal.get("spacing").doubleValue());
+        signal.putAll(
+            Map.of(
+                "calcCd", impairments.get("CD"),
+                "calcPmd2", impairments.get("DGD2"),
+                "calcPdl2", impairments.get("PDL2"),
+                "calcOnsrLin", impairments.get("ONSRLIN")));
+    }
+
+    private void calcAddContrib(
+            CatalogUtils cu, Map<String, Double> signal, PceNode currentNode, PceLink pceLink) {
+        //calculation of the SRG contribution for Add
+        String srgMode = setOpMode(currentNode.getOperationalMode(), CatalogConstant.MWWRCORE);
+        // If the operational mode of the ADD/DROP MUX is not consistent or is not declared in the topology (Network TP)
+        // Operational mode is set by default to standard opMode for ADD/DROP SRGs
+        CatalogNodeType cnt = CatalogConstant.CatalogNodeType.ADD;
+        double pwrOut = cu.getPceRoadmAmpOutputPower(
+                cnt, srgMode, pceLink.getspanLoss(), signal.get("spacing").doubleValue(), pceLink.getpowerCorrection());
+        //calculation of the SRG contribution either for Add and Drop
+        Map<String, Double> impairments = cu.getPceRoadmAmpParameters(cnt, srgMode, 0,
+            signal.get("calcCd").doubleValue(), signal.get("calcPmd2").doubleValue(),
+            signal.get("calcPdl2").doubleValue(),
+            signal.get("calcOnsrLin").doubleValue(), signal.get("spacing").doubleValue());
+        signal.putAll(
+            Map.of(
+                "calcCd", impairments.get("CD"),
+                "calcPmd2", impairments.get("DGD2"),
+                "calcPdl2", impairments.get("PDL2"),
+                "calcOnsrLin", impairments.get("ONSRLIN"),
+                "pwrOut", Double.valueOf(pwrOut)));
+    }
+
+    private void calcBypassContrib(CatalogUtils cu, Map<String, Double> signal,
+            PceNode currentNode, PceNode nextNode, PceLink pceLink0, PceLink pceLink1) {
+        // If the operational mode of the Degree is not consistent or declared in the topology
+        // Operational mode is set by default to standard opMode for Degree
+        String degree1Mode = setOpMode(currentNode.getOperationalMode(), CatalogConstant.MWMWCORE);
+        // Same for next node which is the second degree of a ROADM node
+        String degree2Mode = setOpMode(nextNode.getOperationalMode(), CatalogConstant.MWMWCORE);
+        // At that time OpenROADM provides only one spec for the ROADM nodes
+        if (!degree1Mode.equals(degree2Mode)) {
+            LOG.warn("Unsupported Hybrid ROADM configuration with Degree1 {} of {} operational mode and Degree2 "
+                + "{} of {} operational mode. Will by default use operational mode of Degree2",
+                currentNode.getNodeId(), degree1Mode, nextNode.getNodeId(), degree2Mode);
+        }
+        calcLineDegradation(cu, signal, pceLink0);
+        CatalogNodeType cnt = CatalogConstant.CatalogNodeType.EXPRESS;
+        double pwrOut = cu.getPceRoadmAmpOutputPower(cnt, degree2Mode, pceLink1.getspanLoss(),
+            signal.get("spacing").doubleValue(), pceLink1.getpowerCorrection());
+        // Adds to accumulated impairments the degradation associated with the Express
+        // path of ROADM : Degree1, express link, Degree2
+        Map<String, Double> impairments = cu.getPceRoadmAmpParameters(cnt, degree2Mode,
+            signal.get("pwrIn").doubleValue(), signal.get("calcCd").doubleValue(),
+            signal.get("calcPmd2").doubleValue(), signal.get("calcPdl2").doubleValue(),
+            signal.get("calcOnsrLin").doubleValue(), signal.get("spacing").doubleValue());
+        signal.putAll(
+            Map.of(
+                "calcCd", impairments.get("CD"),
+                "calcPmd2", impairments.get("DGD2"),
+                "calcPdl2", impairments.get("PDL2"),
+                "calcOnsrLin", impairments.get("ONSRLIN"),
+                "pwrOut", Double.valueOf(pwrOut)));
     }
+    //TODO these methods might be more indicated in a catalog utils refactoring
 
-    private double getInverseOsnrLinkLu(double linkOsnrDb) {
-        // 1 over the link OSNR, in linear units
-        double linkOsnrLu = Math.pow(10, (linkOsnrDb / 10.0));
-        LOG.debug("In retrieveosnr: the inverse of link osnr is {} (Linear Unit)", linkOsnrLu);
-        return (CONST_OSNR / linkOsnrLu);
+    private void calcLineDegradation(CatalogUtils cu, Map<String, Double> signal, PceLink pceLink) {
+        // Calculate degradation accumulated across incoming Link and add them to
+        // accumulated impairments
+        // This also includes Non Linear Contribution from the path
+        signal.putAll(Map.of(
+            "pwrIn", Double.valueOf(signal.get("pwrOut").doubleValue() - pceLink.getspanLoss()),
+            "calcCd", Double.valueOf(signal.get("calcCd").doubleValue() + pceLink.getcd()),
+            "calcPmd2", Double.valueOf(signal.get("calcPmd2").doubleValue() + pceLink.getpmd2()),
+            "calcOnsrLin", Double.valueOf(
+                signal.get("calcOnsrLin").doubleValue()
+                + cu.calculateNLonsrContribution(
+                    signal.get("pwrOut").doubleValue(), pceLink.getLength(), signal.get("spacing").doubleValue()))));
+    }
+
+    private double getOsnrDbfromOnsrLin(double osnrLu) {
+        return 10 * Math.log10(1 / osnrLu);
     }
 
     /**
@@ -435,34 +1006,54 @@ public class PostAlgoPathValidator {
         Arrays.fill(freqMap, (byte) GridConstant.AVAILABLE_SLOT_VALUE);
         BitSet result = BitSet.valueOf(freqMap);
         boolean isFlexGrid = true;
-        LOG.info("Processing path {} with length {}", path, path.getLength());
+        LOG.debug("Processing path {} with length {}", path, path.getLength());
         BitSet pceNodeFreqMap;
+        Set<PceNode> pceNodes = new LinkedHashSet<>();
+
         for (PceGraphEdge edge : path.getEdgeList()) {
-            LOG.info("Processing source {} ", edge.link().getSourceId());
-            if (allPceNodes.containsKey(edge.link().getSourceId())) {
-                PceNode pceNode = allPceNodes.get(edge.link().getSourceId());
-                LOG.info("Processing PCE node {}", pceNode);
-                if (StringConstants.OPENROADM_DEVICE_VERSION_1_2_1.equals(pceNode.getVersion())) {
-                    LOG.info("Node {}: version is {} and slot width granularity is {} -> fixed grid mode",
-                        pceNode.getNodeId(), pceNode.getVersion(), pceNode.getSlotWidthGranularity());
-                    isFlexGrid = false;
-                }
-                if ((pceNode.getSlotWidthGranularity().equals(GridConstant.SLOT_WIDTH_50))
-                    && (pceNode.getCentralFreqGranularity().equals(GridConstant.SLOT_WIDTH_50))) {
-                    LOG.info("Node {}: version is {} with slot width granularity  {} and central "
-                            + "frequency granularity is {} -> fixed grid mode",
-                        pceNode.getNodeId(), pceNode.getVersion(), pceNode.getSlotWidthGranularity(),
-                        pceNode.getCentralFreqGranularity());
-                    isFlexGrid = false;
-                }
-                pceNodeFreqMap = pceNode.getBitSetData();
-                LOG.debug("Pce node bitset {}", pceNodeFreqMap);
-                if (pceNodeFreqMap != null) {
-                    result.and(pceNodeFreqMap);
-                    LOG.debug("intermediate bitset {}", result);
-                }
+            NodeId srcId = edge.link().getSourceId();
+            NodeId dstId = edge.link().getDestId();
+            LOG.debug("Processing {} to {}", srcId.getValue(), dstId.getValue());
+            if (allPceNodes.containsKey(srcId)) {
+                pceNodes.add(allPceNodes.get(srcId));
+            }
+            if (allPceNodes.containsKey(dstId)) {
+                pceNodes.add(allPceNodes.get(dstId));
             }
         }
+
+        for (PceNode pceNode : pceNodes) {
+            LOG.debug("Processing PCE node {}", pceNode);
+            pceNodeFreqMap = pceNode.getBitSetData();
+            LOG.debug("Pce node bitset {}", pceNodeFreqMap);
+            if (pceNodeFreqMap != null) {
+                result.and(pceNodeFreqMap);
+                LOG.debug("intermediate bitset {}", result);
+            }
+            String pceNodeVersion = pceNode.getVersion();
+            BigDecimal sltWdthGran = pceNode.getSlotWidthGranularity();
+            if (StringConstants.OPENROADM_DEVICE_VERSION_1_2_1.equals(pceNodeVersion)) {
+                LOG.debug("Node {}: version is {} with slot width granularity {} - fixed grid mode",
+                    pceNode.getNodeId(), pceNodeVersion, sltWdthGran);
+                isFlexGrid = false;
+                continue;
+            }
+            if (!sltWdthGran.setScale(0, RoundingMode.CEILING).equals(GridConstant.SLOT_WIDTH_50)) {
+                continue;
+            }
+            BigDecimal ctralFreqGran = pceNode.getCentralFreqGranularity();
+            if (!ctralFreqGran.setScale(0, RoundingMode.CEILING).equals(GridConstant.SLOT_WIDTH_50)) {
+                continue;
+            }
+            LOG.debug(
+                "Node {}: version is {} with slot width and central frequency granularities {} {} - fixed grid mode",
+                pceNode.getNodeId(), pceNodeVersion, sltWdthGran, ctralFreqGran);
+            isFlexGrid = false;
+        }
+        if (spectrumConstraint != null) {
+            result.and(spectrumConstraint);
+        }
+
         LOG.debug("Bitset result {}", result);
         return computeBestSpectrumAssignment(result, spectralWidthSlotNumber, isFlexGrid);
     }
@@ -476,19 +1067,19 @@ public class PostAlgoPathValidator {
      * @return a spectrum assignment object which contains begin and stop index. If
      *         no spectrum assignment found, beginIndex = stopIndex = 0
      */
-    private SpectrumAssignment computeBestSpectrumAssignment(BitSet spectrumOccupation, int spectralWidthSlotNumber,
-            boolean isFlexGrid) {
+    private SpectrumAssignment computeBestSpectrumAssignment(
+            BitSet spectrumOccupation, int spectralWidthSlotNumber, boolean isFlexGrid) {
         SpectrumAssignmentBuilder spectrumAssignmentBldr = new SpectrumAssignmentBuilder()
             .setBeginIndex(Uint16.valueOf(0))
             .setStopIndex(Uint16.valueOf(0))
             .setFlexGrid(isFlexGrid);
         BitSet referenceBitSet = new BitSet(spectralWidthSlotNumber);
         referenceBitSet.set(0, spectralWidthSlotNumber);
-        int nbSteps = isFlexGrid ? spectralWidthSlotNumber : 1;
         //higher is the frequency, smallest is the wavelength number
         //in operational, the allocation is done through wavelength starting from the smallest
         //so we have to loop from the last element of the spectrum occupation
-        for (int i = spectrumOccupation.size(); i >= spectralWidthSlotNumber; i -= nbSteps) {
+        for (int i = spectrumOccupation.size(); i >= spectralWidthSlotNumber;
+                i -= isFlexGrid ? spectralWidthSlotNumber : 1) {
             if (spectrumOccupation.get(i - spectralWidthSlotNumber, i).equals(referenceBitSet)) {
                 spectrumAssignmentBldr.setBeginIndex(Uint16.valueOf(i - spectralWidthSlotNumber));
                 spectrumAssignmentBldr.setStopIndex(Uint16.valueOf(i - 1));
@@ -497,4 +1088,8 @@ public class PostAlgoPathValidator {
         }
         return spectrumAssignmentBldr.build();
     }
+
+    public Double getTpceCalculatedMargin() {
+        return tpceCalculatedMargin;
+    }
 }
diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/impl/CancelResourceReserveImpl.java b/pce/src/main/java/org/opendaylight/transportpce/pce/impl/CancelResourceReserveImpl.java
new file mode 100644 (file)
index 0000000..83040f0
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.pce.impl;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.ExecutionException;
+import org.opendaylight.transportpce.pce.service.PathComputationService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.CancelResourceReserve;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.CancelResourceReserveInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.CancelResourceReserveOutput;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class CancelResourceReserveImpl implements CancelResourceReserve {
+    private static final Logger LOG = LoggerFactory.getLogger(CancelResourceReserveImpl.class);
+    private PathComputationService pathComputationService;
+
+    public CancelResourceReserveImpl(final PathComputationService pathComputationService) {
+        this.pathComputationService = pathComputationService;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<CancelResourceReserveOutput>> invoke(CancelResourceReserveInput input) {
+        LOG.info("RPC cancelResourceReserve request received");
+        try {
+            return RpcResultBuilder
+                    .success(this.pathComputationService.cancelResourceReserve(input).get())
+                    .buildFuture();
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("RPC cancelResourceReserve failed !", e);
+        }
+        return RpcResultBuilder.<CancelResourceReserveOutput>failed()
+                .withError(ErrorType.RPC, "cancel-resource-reserve failed")
+                .buildFuture();
+    }
+
+}
diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/impl/PathComputationRequestImpl.java b/pce/src/main/java/org/opendaylight/transportpce/pce/impl/PathComputationRequestImpl.java
new file mode 100644 (file)
index 0000000..2f9089e
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.pce.impl;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.ExecutionException;
+import org.opendaylight.transportpce.pce.service.PathComputationService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequest;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutput;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class PathComputationRequestImpl implements PathComputationRequest {
+    private static final Logger LOG = LoggerFactory.getLogger(PathComputationRequestImpl.class);
+    private PathComputationService pathComputationService;
+
+    public PathComputationRequestImpl(final PathComputationService pathComputationService) {
+        this.pathComputationService = pathComputationService;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<PathComputationRequestOutput>> invoke(PathComputationRequestInput input) {
+        LOG.info("RPC path computation request received");
+        LOG.debug("input parameters are : input = {}", input);
+        try {
+            return RpcResultBuilder.success(pathComputationService.pathComputationRequest(input).get()).buildFuture();
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("RPC path computation request failed !", e);
+        }
+        return RpcResultBuilder.<PathComputationRequestOutput>failed()
+                .withError(ErrorType.RPC, "path-computation-request failed")
+                .buildFuture();
+    }
+
+}
diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/impl/PathComputationRerouteRequestImpl.java b/pce/src/main/java/org/opendaylight/transportpce/pce/impl/PathComputationRerouteRequestImpl.java
new file mode 100644 (file)
index 0000000..7b8db93
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.pce.impl;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.ExecutionException;
+import org.opendaylight.transportpce.pce.service.PathComputationService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRerouteRequest;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRerouteRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRerouteRequestOutput;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class PathComputationRerouteRequestImpl implements PathComputationRerouteRequest {
+    private static final Logger LOG = LoggerFactory.getLogger(PathComputationRerouteRequestImpl.class);
+    private PathComputationService pathComputationService;
+
+    public PathComputationRerouteRequestImpl(final PathComputationService pathComputationService) {
+        this.pathComputationService = pathComputationService;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<PathComputationRerouteRequestOutput>> invoke(
+                PathComputationRerouteRequestInput input) {
+        LOG.info("RPC path computation reroute request received");
+        LOG.debug("input parameters are : input = {}", input);
+        try {
+            return RpcResultBuilder
+                    .success(this.pathComputationService.pathComputationRerouteRequest(input).get())
+                    .buildFuture();
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("RPC path computation request failed !", e);
+        }
+        return RpcResultBuilder.<PathComputationRerouteRequestOutput>failed()
+                .withError(ErrorType.RPC, "path-computation-reroute-request failed")
+                .buildFuture();
+    }
+
+}
diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/impl/PceProvider.java b/pce/src/main/java/org/opendaylight/transportpce/pce/impl/PceProvider.java
deleted file mode 100644 (file)
index 3d67ba5..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright © 2017 AT&T, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.transportpce.pce.impl;
-
-import org.opendaylight.mdsal.binding.api.RpcProviderService;
-import org.opendaylight.transportpce.pce.service.PathComputationService;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.TransportpcePceService;
-import org.opendaylight.yangtools.concepts.ObjectRegistration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/*
- * Class to register
- * Pce Service & Notification.
- */
-public class PceProvider {
-
-    private static final Logger LOG = LoggerFactory.getLogger(PceProvider.class);
-
-    private final RpcProviderService rpcService;
-    private final PathComputationService pathComputationService;
-    private ObjectRegistration<PceServiceRPCImpl> rpcRegistration;
-
-    public PceProvider(RpcProviderService rpcProviderService, PathComputationService pathComputationService) {
-        this.rpcService = rpcProviderService;
-        this.pathComputationService = pathComputationService;
-    }
-
-    /*
-     * Method called when the blueprint container is created.
-     */
-    public void init() {
-        LOG.info("PceProvider Session Initiated");
-        final PceServiceRPCImpl consumer = new PceServiceRPCImpl(pathComputationService);
-        rpcRegistration = rpcService.registerRpcImplementation(TransportpcePceService.class, consumer);
-    }
-
-    /*
-     * Method called when the blueprint container is destroyed.
-     */
-    public void close() {
-        LOG.info("PceProvider Closed");
-        rpcRegistration.close();
-    }
-
-}
index b2205083cc0b0776e48e72bdbab8c66ab5957847..56143f4f7a6f548d273684510a01d8fcb2890684 100644 (file)
@@ -7,55 +7,41 @@
  */
 package org.opendaylight.transportpce.pce.impl;
 
-import com.google.common.util.concurrent.ListenableFuture;
-import java.util.concurrent.ExecutionException;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
 import org.opendaylight.transportpce.pce.service.PathComputationService;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.CancelResourceReserveInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.CancelResourceReserveOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.TransportpcePceService;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.opendaylight.yangtools.concepts.Registration;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * PceService implementation.
  */
-public class PceServiceRPCImpl implements TransportpcePceService {
-
+@Component(immediate = true)
+public class PceServiceRPCImpl {
     private static final Logger LOG = LoggerFactory.getLogger(PceServiceRPCImpl.class);
+    private Registration reg;
 
-    private final PathComputationService pathComputationService;
-
-    public PceServiceRPCImpl(PathComputationService pathComputationService) {
-        this.pathComputationService = pathComputationService;
+    @Activate
+    public PceServiceRPCImpl(@Reference RpcProviderService rpcProviderService,
+            @Reference PathComputationService pathComputationService) {
+        this.reg = rpcProviderService.registerRpcImplementations(
+                new CancelResourceReserveImpl(pathComputationService),
+                new PathComputationRequestImpl(pathComputationService),
+                new PathComputationRerouteRequestImpl(pathComputationService));
+        LOG.info("PceServiceRPCImpl instantiated");
     }
 
-    @Override
-    public ListenableFuture<RpcResult<CancelResourceReserveOutput>>
-            cancelResourceReserve(CancelResourceReserveInput input) {
-        LOG.info("RPC cancelResourceReserve request received");
-        CancelResourceReserveOutput output = null;
-        try {
-            output = this.pathComputationService.cancelResourceReserve(input).get();
-        } catch (InterruptedException | ExecutionException e) {
-            LOG.error("RPC cancelResourceReserve failed !", e);
-        }
-        return RpcResultBuilder.success(output).buildFuture();
+    @Deactivate
+    public void close() {
+        this.reg.close();
+        LOG.info("PceServiceRPCImpl Closed");
     }
 
-    @Override
-    public ListenableFuture<RpcResult<PathComputationRequestOutput>>
-            pathComputationRequest(PathComputationRequestInput input) {
-        LOG.info("RPC path computation request received");
-        PathComputationRequestOutput output = null;
-        try {
-            output = this.pathComputationService.pathComputationRequest(input).get();
-        } catch (InterruptedException | ExecutionException e) {
-            LOG.error("RPC path computation request failed !", e);
-        }
-        return RpcResultBuilder.success(output).buildFuture();
+    public Registration getRegisteredRpc() {
+        return reg;
     }
 }
index d56010c778deb13739ffb8fd3c21caec89783b8b..8382a9e2323df770e1099c13bb1a4c5db603cd95 100644 (file)
@@ -16,11 +16,11 @@ import java.util.SortedMap;
 import java.util.TreeMap;
 import org.opendaylight.transportpce.common.NetworkUtils;
 import org.opendaylight.transportpce.pce.constraints.PceConstraints;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.link.oms.attributes.Span;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.link.concatenation.LinkConcatenation;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.link.concatenation.LinkConcatenationKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.link.oms.attributes.Span;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.link.concatenation.LinkConcatenation;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.link.concatenation.LinkConcatenationKey;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNode;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
@@ -50,7 +50,7 @@ public final class MapUtils {
         for (Node node : allNodes) {
             if (excClliNodes.contains(node.getNodeId().getValue())) {
                 LOG.debug("mapDiversityConstraints setExcludeCLLI for node {}", node.getNodeId().getValue());
-                pceHardConstraints.setExcludeCLLI(Arrays.asList(getCLLI(node)));
+                pceHardConstraints.setExcludeCLLI(List.of(getCLLI(node)));
             }
 
             if (excNodes.contains(node.getNodeId().getValue())) {
@@ -103,8 +103,8 @@ public final class MapUtils {
     }
 
     public static List<Long> getSRLGfromLink(Link link) {
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1 linkC = link
-                .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1.class);
+        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1 linkC = link
+                .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1.class);
         if (linkC == null) {
             LOG.error(MAP_UTILS_NO_LINK_AUGMENTATION_AVAILABLE_MSG, link.getLinkId().getValue());
             return new ArrayList<>();
@@ -161,11 +161,11 @@ public final class MapUtils {
 
 
     public static Long getAvailableBandwidth(Link link) {
-        if (link.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+        if (link.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
             .Link1.class) != null
-            && link.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            && link.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                 .Link1.class).getAvailableBandwidth() != null) {
-            return link.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            return link.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                 .Link1.class).getAvailableBandwidth().toJava();
         } else {
             LOG.warn("MapUtils: no Available Bandwidth available for link {}", link.getLinkId());
@@ -174,11 +174,11 @@ public final class MapUtils {
     }
 
     public static Long getUsedBandwidth(Link link) {
-        if (link.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+        if (link.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
             .Link1.class) != null
-            && link.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            && link.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                 .Link1.class).getUsedBandwidth() != null) {
-            return link.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+            return link.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                 .Link1.class).getUsedBandwidth().toJava();
         } else {
             LOG.warn("MapUtils: no Available Bandwidth available for link {}", link.getLinkId());
@@ -206,9 +206,9 @@ public final class MapUtils {
     }
 
     public static Span getOmsAttributesSpan(Link link) {
-        org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Link1 link1 = null;
+        org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Link1 link1 = null;
         link1 =
-            link.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Link1.class);
+            link.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Link1.class);
 
         if (link1 == null) {
             LOG.error(MAP_UTILS_NO_LINK_AUGMENTATION_AVAILABLE_MSG, link.getLinkId().getValue());
@@ -222,11 +222,14 @@ public final class MapUtils {
     }
 
     public static LinkId extractOppositeLink(Link link) {
-        LinkId tmpoppositeLink = null;
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1 linkOpposite
-            = link.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1.class);
-        tmpoppositeLink = linkOpposite.getOppositeLink();
+        var linkOpposite
+            = link.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1.class);
+        if (linkOpposite == null) {
+            LOG.error("No opposite link augmentation for network link {}", link);
+            return null;
+        }
         LOG.debug("PceLink: reading oppositeLink.  {}", linkOpposite);
+        LinkId tmpoppositeLink = linkOpposite.getOppositeLink();
         if (tmpoppositeLink == null) {
             LOG.error("PceLink: Error reading oppositeLink. Link is ignored {}", link.getLinkId().getValue());
             return null;
@@ -234,5 +237,4 @@ public final class MapUtils {
         return tmpoppositeLink;
     }
 
-
 }
index 812486e675ea51903205cace90af81e143df4bac..0afc9bca8a196d40f9d2821c215f31b8ec8d6d54 100644 (file)
@@ -12,11 +12,9 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
@@ -31,18 +29,18 @@ import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.common.service.ServiceTypes;
 import org.opendaylight.transportpce.pce.PceComplianceCheck;
 import org.opendaylight.transportpce.pce.constraints.PceConstraints;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mc.capabilities.McCapabilities;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1;
-//import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Link1;
-//import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev200529.Node1;
+import org.opendaylight.transportpce.pce.networkanalyzer.port.Factory;
+import org.opendaylight.transportpce.pce.networkanalyzer.port.Preference;
+import org.opendaylight.transportpce.pce.networkanalyzer.port.PreferenceFactory;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.reroute.request.input.Endpoints;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mc.capabilities.McCapabilities;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
-//import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmLinkType;
-//import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
@@ -60,7 +58,7 @@ import org.slf4j.LoggerFactory;
 public class PceCalculation {
     /* Logging. */
     private static final Logger LOG = LoggerFactory.getLogger(PceCalculation.class);
-    private NetworkTransactionService networkTransactionService = null;
+    private NetworkTransactionService networkTransactionService;
 
     ///////////// data parsed from Input/////////////////
     private PathComputationRequestInput input;
@@ -76,7 +74,7 @@ public class PceCalculation {
     ///////////// Intermediate data/////////////////
     private List<PceLink> addLinks = new ArrayList<>();
     private List<PceLink> dropLinks = new ArrayList<>();
-    private HashSet<NodeId> azSrgs = new HashSet<>();
+    private List<NodeId> azSrgs = new ArrayList<>();
 
     private PceNode aendPceNode = null;
     private PceNode zendPceNode = null;
@@ -89,9 +87,11 @@ public class PceCalculation {
     // this List serves calculation of ZtoA path description
     // TODO maybe better solution is possible
     private Map<LinkId, PceLink> allPceLinks = new HashMap<>();
-    private Set<LinkId> linksToExclude = new HashSet<>();
+    private List<LinkId> linksToExclude = new ArrayList<>();
     private PceResult returnStructure;
     private PortMapping portMapping;
+    // Define the termination points whose reservation status is not taken into account during the pruning process
+    private Endpoints endpoints;
 
     private enum ConstraintTypes {
         NONE, HARD_EXCLUDE, HARD_INCLUDE, HARD_DIVERSITY, SOFT_EXCLUDE, SOFT_INCLUDE, SOFT_DIVERSITY;
@@ -100,21 +100,34 @@ public class PceCalculation {
     private MappingUtils mappingUtils;
 
     public PceCalculation(PathComputationRequestInput input, NetworkTransactionService networkTransactionService,
-            PceConstraints pceHardConstraints, PceConstraints pceSoftConstraints, PceResult rc,
-            PortMapping portMapping) {
+                          PceConstraints pceHardConstraints, PceConstraints pceSoftConstraints, PceResult rc,
+                          PortMapping portMapping) {
         this.input = input;
         this.networkTransactionService = networkTransactionService;
         this.returnStructure = rc;
+        this.pceHardConstraints = pceHardConstraints;
+        this.mappingUtils = new MappingUtilsImpl(networkTransactionService.getDataBroker());
+        this.portMapping = portMapping;
+        this.endpoints = null;
+        parseInput();
+    }
 
+    public PceCalculation(PathComputationRequestInput input, NetworkTransactionService networkTransactionService,
+                          PceConstraints pceHardConstraints, PceConstraints pceSoftConstraints, PceResult rc,
+                          PortMapping portMapping, Endpoints endpoints) {
+        this.input = input;
+        this.networkTransactionService = networkTransactionService;
+        this.returnStructure = rc;
         this.pceHardConstraints = pceHardConstraints;
         this.mappingUtils = new MappingUtilsImpl(networkTransactionService.getDataBroker());
         this.portMapping = portMapping;
+        this.endpoints = endpoints;
         parseInput();
     }
 
     public void retrievePceNetwork() {
 
-        LOG.info("In PceCalculation retrieveNetwork: ");
+        LOG.debug("In PceCalculation retrieveNetwork");
 
         if (!readMdSal()) {
             returnStructure.setRC(ResponseCodes.RESPONSE_FAILED);
@@ -129,7 +142,6 @@ public class PceCalculation {
         printNodesInfo(allPceNodes);
 
         returnStructure.setRC(ResponseCodes.RESPONSE_OK);
-        return;
     }
 
     private boolean parseInput() {
@@ -152,7 +164,7 @@ public class PceCalculation {
                     input.getServiceAEnd().getTxDirection().getPort().getPortName())
                 : null);
 
-        LOG.info("parseInput: A and Z :[{}] and [{}]", anodeId, znodeId);
+        LOG.debug("parseInput: A and Z :[{}] and [{}]", anodeId, znodeId);
 
         getAZnodeId();
 
@@ -204,7 +216,7 @@ public class PceCalculation {
             case StringConstants.SERVICE_TYPE_OTUC2:
             case StringConstants.SERVICE_TYPE_OTUC3:
             case StringConstants.SERVICE_TYPE_OTUC4:
-                LOG.info("readMdSal: network {}", NetworkUtils.OVERLAY_NETWORK_ID);
+                LOG.debug("readMdSal: network {}", NetworkUtils.OVERLAY_NETWORK_ID);
                 nwInstanceIdentifier = InstanceIdentifier.builder(Networks.class)
                     .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).build();
                 break;
@@ -216,7 +228,7 @@ public class PceCalculation {
             case StringConstants.SERVICE_TYPE_ODUC4:
             case StringConstants.SERVICE_TYPE_10GE:
             case StringConstants.SERVICE_TYPE_1GE:
-                LOG.info("readMdSal: network {}", NetworkUtils.OTN_NETWORK_ID);
+                LOG.debug("readMdSal: network {}", NetworkUtils.OTN_NETWORK_ID);
                 nwInstanceIdentifier = InstanceIdentifier.builder(Networks.class)
                     .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OTN_NETWORK_ID))).build();
                 break;
@@ -264,16 +276,12 @@ public class PceCalculation {
             Optional<Network> nwOptional =
                 networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, nwInstanceIdentifier).get();
             if (nwOptional.isPresent()) {
-                nw = nwOptional.get();
+                nw = nwOptional.orElseThrow();
                 LOG.debug("readMdSal: network nodes: nwOptional.isPresent = true {}", nw);
-                networkTransactionService.close();
             }
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("readMdSal: Error reading topology {}", nwInstanceIdentifier);
-            networkTransactionService.close();
             returnStructure.setRC(ResponseCodes.RESPONSE_FAILED);
-            throw new RuntimeException(
-                "readMdSal: Error reading from operational store, topology : " + nwInstanceIdentifier + " :" + e);
         }
         return nw;
     }
@@ -288,9 +296,11 @@ public class PceCalculation {
             case StringConstants.SERVICE_TYPE_OTUC2:
             case StringConstants.SERVICE_TYPE_OTUC3:
             case  StringConstants.SERVICE_TYPE_OTUC4:
+                Factory portPreferenceFactory = new PreferenceFactory();
+                Preference portPreference = portPreferenceFactory.portPreference(input);
                 // 100GE service and OTU4 service are handled at the openroadm-topology layer
                 for (Node node : allNodes) {
-                    validateNode(node);
+                    validateNode(node, portPreference);
                 }
 
                 LOG.debug("analyzeNw: allPceNodes size {}", allPceNodes.size());
@@ -386,7 +396,7 @@ public class PceCalculation {
     }
 
     private boolean validateLink(Link link) {
-        LOG.info("validateLink: link {} ", link);
+        LOG.debug("validateLink: link {} ", link);
 
         NodeId sourceId = link.getSource().getSourceNode();
         NodeId destId = link.getDestination().getDestNode();
@@ -434,8 +444,8 @@ public class PceCalculation {
         }
     }
 
-    private void validateNode(Node node) {
-        LOG.info("validateNode: node {} ", node);
+    private void validateNode(Node node, Preference portPreference) {
+        LOG.debug("validateNode: node {} ", node);
         // PceNode will be used in Graph algorithm
         Node1 node1 = node.augmentation(Node1.class);
         if (node1 == null) {
@@ -455,28 +465,31 @@ public class PceCalculation {
             deviceNodeId = node.getNodeId().getValue();
         }
 
-        LOG.info("Device node id {} for {}", deviceNodeId, node);
+        LOG.debug("Device node id {} for {}", deviceNodeId, node);
         PceOpticalNode pceNode = new PceOpticalNode(deviceNodeId, this.serviceType, portMapping, node, nodeType,
             mappingUtils.getOpenRoadmVersion(deviceNodeId), getSlotWidthGranularity(deviceNodeId, node.getNodeId()),
             getCentralFreqGranularity(deviceNodeId, node.getNodeId()));
+        if (endpoints != null) {
+            pceNode.setEndpoints(endpoints);
+        }
         pceNode.validateAZxponder(anodeId, znodeId, input.getServiceAEnd().getServiceFormat());
         pceNode.initFrequenciesBitSet();
 
         if (!pceNode.isValid()) {
-            LOG.warn(" validateNode: Node is ignored");
+            LOG.debug(" validateNode: Node {} is ignored", node.getNodeId().getValue());
             return;
         }
         if (validateNodeConstraints(pceNode).equals(ConstraintTypes.HARD_EXCLUDE)) {
             return;
         }
 
-        if (endPceNode(nodeType, pceNode.getNodeId(), pceNode)) {
+        if (endPceNode(nodeType, pceNode.getNodeId(), pceNode, portPreference)) {
             if (this.aendPceNode == null && isAZendPceNode(this.serviceFormatA, pceNode, anodeId, "A")) {
                 // Added to ensure A-node has a addlink in the topology
                 List<Link> links = this.allLinks.stream()
                     .filter(x -> x.getSource().getSourceNode().getValue().contains(pceNode.getNodeId().getValue()))
                     .collect(Collectors.toList());
-                if (links.size() > 0) {
+                if (!links.isEmpty()) {
                     this.aendPceNode = pceNode;
                 }
             }
@@ -485,7 +498,7 @@ public class PceCalculation {
                 List<Link> links = this.allLinks.stream()
                     .filter(x -> x.getDestination().getDestNode().getValue().contains(pceNode.getNodeId().getValue()))
                     .collect(Collectors.toList());
-                if (links.size() > 0) {
+                if (!links.isEmpty()) {
                     this.zendPceNode = pceNode;
                 }
             }
@@ -493,7 +506,6 @@ public class PceCalculation {
 
         allPceNodes.put(pceNode.getNodeId(), pceNode);
         LOG.debug("validateNode: node is saved {}", pceNode.getNodeId().getValue());
-        return;
     }
 
     @SuppressWarnings("fallthrough")
@@ -571,7 +583,6 @@ public class PceCalculation {
         }
         allPceNodes.put(pceOtnNode.getNodeId(), pceOtnNode);
         LOG.info("validateOtnNode: node {} is saved", node.getNodeId().getValue());
-        return;
     }
 
     private ConstraintTypes validateNodeConstraints(PceNode pcenode) {
@@ -579,11 +590,11 @@ public class PceCalculation {
             return ConstraintTypes.NONE;
         }
         if (pceHardConstraints.getExcludeSupNodes().contains(pcenode.getSupNetworkNodeId())) {
-            LOG.info("validateNodeConstraints: {}", pcenode.getNodeId().getValue());
+            LOG.debug("validateNodeConstraints: {}", pcenode.getNodeId().getValue());
             return ConstraintTypes.HARD_EXCLUDE;
         }
         if (pceHardConstraints.getExcludeCLLI().contains(pcenode.getSupClliNodeId())) {
-            LOG.info("validateNodeConstraints: {}", pcenode.getNodeId().getValue());
+            LOG.debug("validateNodeConstraints: {}", pcenode.getNodeId().getValue());
             return ConstraintTypes.HARD_EXCLUDE;
         }
         return ConstraintTypes.NONE;
@@ -602,7 +613,7 @@ public class PceCalculation {
         List<Long> constraints = new ArrayList<>(pceHardConstraints.getExcludeSRLG());
         constraints.retainAll(link.getsrlgList());
         if (!constraints.isEmpty()) {
-            LOG.info("validateLinkConstraints: {}", link.getLinkId().getValue());
+            LOG.debug("validateLinkConstraints: {}", link.getLinkId().getValue());
             return ConstraintTypes.HARD_EXCLUDE;
         }
 
@@ -619,17 +630,18 @@ public class PceCalculation {
         }
     }
 
-    private Boolean endPceNode(OpenroadmNodeType openroadmNodeType, NodeId nodeId, PceOpticalNode pceNode) {
+    private Boolean endPceNode(OpenroadmNodeType openroadmNodeType, NodeId nodeId, PceOpticalNode pceNode,
+                               Preference portPreference) {
         switch (openroadmNodeType) {
             case SRG:
-                pceNode.initSrgTps();
+                pceNode.initSrgTps(portPreference);
                 this.azSrgs.add(nodeId);
                 break;
             case XPONDER:
                 pceNode.initXndrTps(input.getServiceAEnd().getServiceFormat());
                 break;
             default:
-                LOG.warn("endPceNode: Node {} is not SRG or XPONDER !", nodeId);
+                LOG.debug("endPceNode: Node {} is not SRG or XPONDER !", nodeId);
                 return false;
         }
 
@@ -662,13 +674,13 @@ public class PceCalculation {
                     pcelink.getlinkType(), pcelink);
                 break;
             case ADDLINK:
-                pcelink.setClient(
+                pcelink.setClientA(
                     source.getRdmSrgClient(pcelink.getSourceTP().getValue(), StringConstants.SERVICE_DIRECTION_AZ));
                 addLinks.add(pcelink);
                 LOG.debug("validateLink: ADD-LINK saved  {}", pcelink);
                 break;
             case DROPLINK:
-                pcelink.setClient(
+                pcelink.setClientZ(
                     dest.getRdmSrgClient(pcelink.getDestTP().getValue(), StringConstants.SERVICE_DIRECTION_ZA));
                 dropLinks.add(pcelink);
                 LOG.debug("validateLink: DROP-LINK saved  {}", pcelink);
@@ -683,7 +695,7 @@ public class PceCalculation {
                     return false;
                 }
                 if (dest.getXpdrClient(pcelink.getDestTP().getValue()) != null) {
-                    pcelink.setClient(dest.getXpdrClient(pcelink.getDestTP().getValue()));
+                    pcelink.setClientZ(dest.getXpdrClient(pcelink.getDestTP().getValue()));
                 }
                 allPceLinks.put(linkId, pcelink);
                 source.addOutgoingLink(pcelink);
@@ -700,7 +712,7 @@ public class PceCalculation {
                     return false;
                 }
                 if (source.getXpdrClient(pcelink.getSourceTP().getValue()) != null) {
-                    pcelink.setClient(source.getXpdrClient(pcelink.getSourceTP().getValue()));
+                    pcelink.setClientA(source.getXpdrClient(pcelink.getSourceTP().getValue()));
                 }
                 allPceLinks.put(linkId, pcelink);
                 source.addOutgoingLink(pcelink);
@@ -731,14 +743,14 @@ public class PceCalculation {
         switch (pceOtnLink.getlinkType()) {
             case OTNLINK:
                 if (source.getXpdrClient(pceOtnLink.getSourceTP().getValue()) != null) {
-                    pceOtnLink.setClient(source.getXpdrClient(pceOtnLink.getSourceTP().getValue()));
+                    pceOtnLink.setClientA(source.getXpdrClient(pceOtnLink.getSourceTP().getValue()));
                 }
                 if (dest.getXpdrClient(pceOtnLink.getDestTP().getValue()) != null) {
-                    pceOtnLink.setClient(dest.getXpdrClient(pceOtnLink.getDestTP().getValue()));
+                    pceOtnLink.setClientZ(dest.getXpdrClient(pceOtnLink.getDestTP().getValue()));
                 }
                 allPceLinks.put(linkId, pceOtnLink);
                 source.addOutgoingLink(pceOtnLink);
-                LOG.info("validateLink: OTN-LINK added to allPceLinks {}", pceOtnLink);
+                LOG.debug("validateLink: OTN-LINK added to allPceLinks {}", pceOtnLink);
                 break;
             default:
                 LOG.warn("validateLink: link type is not supported {}", pceOtnLink);
@@ -772,7 +784,7 @@ public class PceCalculation {
 
     private static void printNodesInfo(Map<NodeId, PceNode> allPceNodes) {
         allPceNodes.forEach(((nodeId, pceNode) -> {
-            LOG.info("In printNodes in node {} : outgoing links {} ", pceNode.getNodeId().getValue(),
+            LOG.debug("In printNodes in node {} : outgoing links {} ", pceNode.getNodeId().getValue(),
                     pceNode.getOutgoingLinks());
         }));
     }
@@ -793,11 +805,11 @@ public class PceCalculation {
         for (McCapabilities mcCapabitility : mcCapabilities) {
             if (mcCapabitility.getMcNodeName().contains("XPDR")
                     && mcCapabitility.getSlotWidthGranularity() != null) {
-                return mcCapabitility.getSlotWidthGranularity().getValue();
+                return mcCapabitility.getSlotWidthGranularity().getValue().decimalValue();
             }
             if (mcCapabitility.getMcNodeName().contains(moduleName)
                     && mcCapabitility.getSlotWidthGranularity() != null) {
-                return mcCapabitility.getSlotWidthGranularity().getValue();
+                return mcCapabitility.getSlotWidthGranularity().getValue().decimalValue();
             }
         }
         return GridConstant.SLOT_WIDTH_50;
@@ -819,11 +831,11 @@ public class PceCalculation {
         for (McCapabilities mcCapabitility : mcCapabilities) {
             if (mcCapabitility.getMcNodeName().contains("XPDR")
                     && mcCapabitility.getCenterFreqGranularity() != null) {
-                return mcCapabitility.getCenterFreqGranularity().getValue();
+                return mcCapabitility.getCenterFreqGranularity().getValue().decimalValue();
             }
             if (mcCapabitility.getMcNodeName().contains(moduleName)
                     && mcCapabitility.getCenterFreqGranularity() != null) {
-                return mcCapabitility.getCenterFreqGranularity().getValue();
+                return mcCapabitility.getCenterFreqGranularity().getValue().decimalValue();
             }
         }
         return GridConstant.SLOT_WIDTH_50;
index 749f1955b956d6040913a67df87d4c03e2fe8ff3..dbec53d6fbdc5894ce7bbb2b39e9c0b56fd9df1a 100644 (file)
@@ -8,21 +8,23 @@
 
 package org.opendaylight.transportpce.pce.networkanalyzer;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.io.Serializable;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.OtnLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.span.attributes.LinkConcatenation1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.span.attributes.LinkConcatenation1.FiberType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.link.oms.attributes.Span;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.link.concatenation.LinkConcatenation;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.link.concatenation.LinkConcatenationKey;
-import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.OtnLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.span.attributes.LinkConcatenation1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.span.attributes.LinkConcatenation1.FiberType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.link.oms.attributes.Span;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.link.concatenation.LinkConcatenation;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.link.concatenation.LinkConcatenationKey;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
@@ -31,7 +33,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 @SuppressWarnings("serial")
-@edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+@SuppressFBWarnings(
     value = "SE_NO_SERIALVERSIONID",
     justification = "https://github.com/rzwitserloot/lombok/wiki/WHY-NOT:-serialVersionUID")
 public class PceLink implements Serializable {
@@ -47,7 +49,8 @@ public class PceLink implements Serializable {
 
     // this member is for XPONDER INPUT/OUTPUT links.
     // it keeps name of client corresponding to NETWORK TP
-    private String client = "";
+    private String clientA = "";
+    private String clientZ = "";
     private final LinkId linkId;
     private final OpenroadmLinkType linkType;
     private final NodeId sourceId;
@@ -65,17 +68,19 @@ public class PceLink implements Serializable {
     private final Long availableBandwidth;
     private final Long usedBandwidth;
     private final List<Long> srlgList;
-    private final double osnr;
+//    private final double osnr;
+    private final Double length;
+    private final Double cd;
+    private final Double pmd2;
+    private final Double spanLoss;
+    private final Double powerCorrection;
     private final transient Span omsAttributesSpan;
     //meter per ms
-    private static final double CELERITY = 2.99792458 * 1e5;
-    private static final double NOISE_MASK_A = 0.571429;
-    private static final double NOISE_MASK_B = 39.285714;
-    private static final double UPPER_BOUND_OSNR = 33;
-    private static final double LOWER_BOUND_OSNR = 0.1;
+    private static final double GLASSCELERITY = 2.99792458 * 1e5 / 1.5;
+    private static final double PMD_CONSTANT = 0.04;
 
     public PceLink(Link link, PceNode source, PceNode dest) {
-        LOG.info("PceLink: : PceLink start ");
+        LOG.debug("PceLink: : PceLink start ");
 
         this.linkId = link.getLinkId();
 
@@ -97,29 +102,45 @@ public class PceLink implements Serializable {
 
         this.adminStates = link.augmentation(Link1.class).getAdministrativeState();
         this.state = link.augmentation(Link1.class).getOperationalState();
-
-        if (this.linkType == OpenroadmLinkType.ROADMTOROADM) {
-            this.omsAttributesSpan = MapUtils.getOmsAttributesSpan(link);
-            this.srlgList = MapUtils.getSRLG(link);
-            this.latency = calcLatency(link);
-            this.osnr = calcSpanOSNR();
-            this.availableBandwidth = 0L;
-            this.usedBandwidth = 0L;
-        } else if (this.linkType == OpenroadmLinkType.OTNLINK) {
-            this.availableBandwidth = MapUtils.getAvailableBandwidth(link);
-            this.usedBandwidth = MapUtils.getUsedBandwidth(link);
-            this.srlgList = MapUtils.getSRLGfromLink(link);
-            this.osnr = 0.0;
-            this.latency = 0L;
-            this.omsAttributesSpan = null;
-        } else {
-            this.omsAttributesSpan = null;
-            this.srlgList = null;
-            this.latency = 0L;
-            //infinite OSNR in DB
-            this.osnr = 100L;
-            this.availableBandwidth = 0L;
-            this.usedBandwidth = 0L;
+        switch (this.linkType) {
+            case ROADMTOROADM:
+                this.omsAttributesSpan = MapUtils.getOmsAttributesSpan(link);
+                this.length = calcLength(link);
+                this.srlgList = MapUtils.getSRLG(link);
+                this.latency = calcLatency(link);
+                this.availableBandwidth = 0L;
+                this.usedBandwidth = 0L;
+                Map<String, Double> spanLossMap = calcSpanLoss(link);
+                this.spanLoss = spanLossMap.get("SpanLoss");
+                this.powerCorrection = spanLossMap.get("PoutCorrection");
+                Map<String, Double> cdAndPmdMap = calcCDandPMD(link);
+                this.cd = cdAndPmdMap.get("CD");
+                this.pmd2 = cdAndPmdMap.get("PMD2");
+                break;
+            case OTNLINK:
+                this.availableBandwidth = MapUtils.getAvailableBandwidth(link);
+                this.usedBandwidth = MapUtils.getUsedBandwidth(link);
+                this.srlgList = MapUtils.getSRLGfromLink(link);
+                this.latency = 0L;
+                this.length = 0.0;
+                this.omsAttributesSpan = null;
+                this.spanLoss = 0.0;
+                this.powerCorrection = 0.0;
+                this.cd = 0.0;
+                this.pmd2 = 0.0;
+                break;
+            default:
+                this.omsAttributesSpan = null;
+                this.srlgList = null;
+                this.latency = 0L;
+                this.length = 0.0;
+                this.availableBandwidth = 0L;
+                this.usedBandwidth = 0L;
+                this.spanLoss = 0.0;
+                this.powerCorrection = 0.0;
+                this.cd = 0.0;
+                this.pmd2 = 0.0;
+                break;
         }
         LOG.debug("PceLink: created PceLink  {}", linkId);
     }
@@ -134,83 +155,186 @@ public class PceLink implements Serializable {
         return tmpoppositeLink;
     }
 
-    //Compute the link latency : if the latency is not defined, the latency is computed from the omsAttributesSpan
+    //Compute the link latency : if the latency is not defined, the latency is computed from the length
     private Long calcLatency(Link link) {
-        Link1 link1 = link.augmentation(Link1.class);
-        if (link1.getLinkLatency() != null) {
-            return link1.getLinkLatency().toJava();
+        var augLinkLatency = link.augmentation(Link1.class).getLinkLatency();
+        if (augLinkLatency != null) {
+            return augLinkLatency.toJava();
         }
-        if (this.omsAttributesSpan == null) {
+        Double linkLength = calcLength(link);
+        if (linkLength == null) {
+            LOG.debug("In PceLink: cannot compute the latency for the link {}", link.getLinkId().getValue());
             return 1L;
         }
-        double tmp = 0;
-        Map<LinkConcatenationKey, LinkConcatenation> linkConcatenationMap = this.omsAttributesSpan
-                .nonnullLinkConcatenation();
+        LOG.debug("In PceLink: The latency of link {} is extrapolated from link length and == {}",
+            link.getLinkId(), linkLength / GLASSCELERITY);
+        return (long) Math.ceil(linkLength / GLASSCELERITY);
+    }
+
+    private Double calcLength(Link link) {
+        var augLinkLength = link.augmentation(Link1.class).getLinkLength();
+        if (augLinkLength != null) {
+            return augLinkLength.doubleValue();
+        }
+        if (this.omsAttributesSpan == null) {
+            LOG.debug("In PceLink: cannot compute the length for the link {}", link.getLinkId().getValue());
+            return null;
+        }
+        double linkLength = 0;
+        Map<LinkConcatenationKey, LinkConcatenation> linkConcatenationMap =
+            this.omsAttributesSpan.nonnullLinkConcatenation();
         for (Map.Entry<LinkConcatenationKey, LinkConcatenation> entry : linkConcatenationMap.entrySet()) {
-            // Length is expressed in meter and latency is expressed in ms according to OpenROADM MSA
+            // Length is expressed in meter according to OpenROADM MSA
             if (entry == null || entry.getValue() == null || entry.getValue().getSRLGLength() == null) {
-                LOG.debug("In PceLink: cannot compute the latency for the link {}", link.getLinkId().getValue());
-                return 1L;
+                LOG.debug("In PceLink: cannot compute the length for the link {}", link.getLinkId().getValue());
+                return null;
             }
-            tmp += entry.getValue().getSRLGLength().doubleValue() / CELERITY;
-            LOG.info("In PceLink: The latency of link {} == {}", link.getLinkId(), tmp);
+            linkLength += entry.getValue().getSRLGLength().doubleValue();
+            LOG.debug("In PceLink: The length of the link {} == {}", link.getLinkId(), linkLength / 1000.0);
         }
-        return (long) Math.ceil(tmp);
+        return linkLength / 1000.0;
+    }
+
+    //Calculate CD and PMD of the link from link length
+    private Map<String, Double> calcCDandPMDfromLength() {
+        return this.length == null
+            ? new HashMap<>()
+            : new HashMap<>(
+                Map.of(
+                    "CD", 16.5 * this.length,
+                    "PMD2", Math.pow(this.length * PMD_CONSTANT, 2)));
     }
 
-    //Compute the OSNR of a span
-    public double calcSpanOSNR() {
+    //Calculate CD and PMD of the link
+    private Map<String, Double> calcCDandPMD(Link link) {
+        double linkCd = 0.0;
+        double linkPmd2 = 0.0;
         if (this.omsAttributesSpan == null) {
-            return 0L;
+            LOG.debug("In PceLink {} no OMS present, assume G.652 fiber, calculation based on fiber length of {} km",
+                link.getLinkId(), this.length);
+            return calcCDandPMDfromLength();
+        }
+        Map<LinkConcatenationKey, LinkConcatenation> linkConcatenationMap =
+            this.omsAttributesSpan.nonnullLinkConcatenation();
+        for (Map.Entry<LinkConcatenationKey, LinkConcatenation> entry : linkConcatenationMap.entrySet()) {
+            // If the link-concatenation list is not populated or partially populated CD &
+            // PMD shall be derived from link-length (expressed in km in OR topology)
+            if (entry == null || entry.getValue() == null || entry.getValue().getSRLGLength() == null
+                    || entry.getValue().augmentation(LinkConcatenation1.class).getFiberType() == null) {
+                if (this.length > 0.0) {
+                    LOG.debug("In PceLink: no OMS present; cd and PMD for the link {} extrapolated from link length {}"
+                        + "assuming SMF fiber type", link.getLinkId().getValue(), this.length);
+                    return calcCDandPMDfromLength();
+                }
+                // If Link-length upper attributes not present or incorrectly populated, no way
+                // to calculate CD & PMD
+                LOG.error("In PceLink: no Link length declared and no OMS present for the link {}."
+                    + " No Way to compute CD and PMD", link.getLinkId().getValue());
+                return Map.of();
+            }
+            // SRLG length is expressed in OR topology in meter
+            var entryAug = entry.getValue().augmentation(LinkConcatenation1.class);
+            linkCd += entry.getValue().getSRLGLength().doubleValue() / 1000.0
+                * retrieveCdFromFiberType(entryAug.getFiberType());
+            if (entryAug.getPmd() == null
+                    || entryAug.getPmd().getValue().doubleValue() == 0.0
+                    || entryAug.getPmd().getValue().toString().isEmpty()) {
+                linkPmd2 += Math.pow(
+                    entry.getValue().getSRLGLength().doubleValue() / 1000.0
+                        * retrievePmdFromFiberType(entryAug.getFiberType()),
+                    2);
+            } else {
+                linkPmd2 += Math.pow(entryAug.getPmd().getValue().doubleValue(), 2);
+            }
+        }
+        LOG.debug("In PceLink: The CD and PMD2 of link {} are respectively {} ps and {} ps",
+            link.getLinkId(), linkCd, linkPmd2);
+        return Map.of("CD", linkCd, "PMD2", linkPmd2);
+    }
+
+    // compute default spanLoss and power correction from fiber length
+    // when no OMS attribute defined
+    private Map<String, Double> calcDefaultSpanLoss(Link link) {
+        var augLinkLength = link.augmentation(Link1.class).getLinkLength();
+        if (augLinkLength == null || augLinkLength.doubleValue() == 0) {
+            LOG.error("In PceLink, no link length present or length declared = 0,"
+                + " unable to calculate default span Loss ");
+            return new HashMap<>();
+        }
+        long linkLength = augLinkLength.longValue();
+        LOG.warn("In PceLink {}, assume G.652 fiber, calculation "
+                + "based on fiber length of {} km and typical loss of 0.25dB per Km ",
+            link.getLinkId(), linkLength);
+        return new HashMap<>(
+            Map.of(
+                "SpanLoss", linkLength * 0.25,
+                "PoutCorrection", retrievePower(FiberType.Smf)
+            ));
+    }
+
+    // Compute the attenuation of a span from OMS attribute
+    private Map<String, Double> calcSpanLoss(Link link) {
+        if (this.omsAttributesSpan == null) {
+            return calcDefaultSpanLoss(link);
         }
         Collection<LinkConcatenation> linkConcatenationList =
             this.omsAttributesSpan.nonnullLinkConcatenation().values();
         if (linkConcatenationList == null) {
             LOG.error("in PceLink : Null field in the OmsAttrubtesSpan");
-            return 0L;
+            return calcDefaultSpanLoss(link);
         }
         Iterator<LinkConcatenation> linkConcatenationiterator = linkConcatenationList.iterator();
         if (!linkConcatenationiterator.hasNext()) {
-            return 0L;
+            return calcDefaultSpanLoss(link);
         }
-        // power on the output of the previous ROADM (dBm)
-        double pout = retrievePower(linkConcatenationiterator.next().augmentation(LinkConcatenation1.class)
-            .getFiberType());
-        // span loss (dB)
-        double spanLoss = this.omsAttributesSpan.getSpanlossCurrent().getValue().doubleValue();
-        // power on the input of the current ROADM (dBm)
-        double pin = pout - spanLoss;
-        double spanOsnrDb = NOISE_MASK_A * pin + NOISE_MASK_B;
-        if (spanOsnrDb > UPPER_BOUND_OSNR) {
-            spanOsnrDb = UPPER_BOUND_OSNR;
-        } else if (spanOsnrDb < LOWER_BOUND_OSNR) {
-            spanOsnrDb = LOWER_BOUND_OSNR;
-        }
-        return spanOsnrDb;
+        // Reference of power to be launched at input of ROADM (dBm)
+        return new HashMap<>(Map.of(
+            "PoutCorrection", retrievePower(
+                linkConcatenationiterator.next().augmentation(LinkConcatenation1.class).getFiberType()) - 2.0,
+            "SpanLoss", this.omsAttributesSpan.getSpanlossCurrent().getValue().doubleValue()));
     }
 
     private double retrievePower(FiberType fiberType) {
-        double power;
         switch (fiberType) {
             case Smf:
-                power = 2;
-                break;
+                return 2;
             case Eleaf:
-                power = 1;
-                break;
+                return 1;
             case Truewavec:
-                power = -1;
-                break;
+                return -1;
             case Oleaf:
             case Dsf:
             case Truewave:
             case NzDsf:
             case Ull:
             default:
-                power = 0;
-                break;
+                return 0;
+        }
+    }
+
+    private double retrievePmdFromFiberType(FiberType fiberType) {
+        return fiberType.toString().equalsIgnoreCase("Dsf")
+            ? 0.2
+            : PMD_CONSTANT;
+    }
+
+    private double retrieveCdFromFiberType(FiberType fiberType) {
+        switch (fiberType) {
+            case Dsf:
+                return 0.0;
+            case Truewavec:
+                return 3.0;
+            case Eleaf:
+            case Oleaf:
+            case NzDsf:
+                return 4.3;
+            case Truewave:
+                return 4.4;
+            case Smf:
+            case Ull:
+            default:
+                return 16.5;
         }
-        return power;
     }
 
     public LinkId getOppositeLink() {
@@ -249,12 +373,24 @@ public class PceLink implements Serializable {
         return destId;
     }
 
-    public String getClient() {
-        return client;
+    public String getClientA() {
+        return clientA;
+    }
+
+    public Double getLength() {
+        return length;
+    }
+
+    public void setClientA(String client) {
+        this.clientA = client;
     }
 
-    public void setClient(String client) {
-        this.client = client;
+    public String getClientZ() {
+        return clientZ;
+    }
+
+    public void setClientZ(String client) {
+        this.clientZ = client;
     }
 
     // Double for transformer of JUNG graph
@@ -282,10 +418,6 @@ public class PceLink implements Serializable {
         return srlgList;
     }
 
-    public double getosnr() {
-        return osnr;
-    }
-
     public String getsourceCLLI() {
         return sourceCLLI;
     }
@@ -294,17 +426,40 @@ public class PceLink implements Serializable {
         return destCLLI;
     }
 
+    public Double getspanLoss() {
+        return spanLoss;
+    }
+
+    public Double getcd() {
+        return cd;
+    }
+
+    public Double getpmd2() {
+        return pmd2;
+    }
+
+    public Double getpowerCorrection() {
+        return powerCorrection;
+    }
+
     public boolean isValid() {
-        if ((this.linkId == null) || (this.linkType == null) || (this.oppositeLink == null)) {
+        if (this.linkId == null || this.linkType == null || this.oppositeLink == null) {
             isValid = false;
             LOG.error("PceLink: No Link type or opposite link is available. Link is ignored {}", linkId);
         }
         isValid = checkParams();
-        if ((this.omsAttributesSpan == null) && (this.linkType == OpenroadmLinkType.ROADMTOROADM)) {
-            isValid = false;
-            LOG.error("PceLink: Error reading Span for OMS link. Link is ignored {}", linkId);
+        if (this.linkType == OpenroadmLinkType.ROADMTOROADM && (this.length == null || this.length == 0.0)) {
+            if (this.omsAttributesSpan == null) {
+                isValid = false;
+                LOG.error("PceLink: Error reading Span for OMS link, and no available generic link information."
+                    + " Link is ignored {}", linkId);
+            } else if (this.omsAttributesSpan.getSpanlossCurrent() == null) {
+                isValid = false;
+                LOG.error("PceLink: Error reading Span for OMS link, and no available generic link information."
+                    + " Link is ignored {}", linkId);
+            }
         }
-        if ((this.srlgList != null) && (this.srlgList.isEmpty())) {
+        if (this.srlgList != null && this.srlgList.isEmpty()) {
             isValid = false;
             LOG.error("PceLink: Empty srlgList for OMS link. Link is ignored {}", linkId);
         }
@@ -318,9 +473,6 @@ public class PceLink implements Serializable {
             return false;
         }
 
-        OtnLinkType otnLinkType = link
-            .augmentation(org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.Link1.class)
-            .getOtnLinkType();
         if (this.availableBandwidth == 0L) {
             LOG.error("PceLink: No bandwidth available for OTN Link, link {}  is ignored ", linkId);
             return false;
@@ -342,7 +494,7 @@ public class PceLink implements Serializable {
                     return false;
                 }
                 neededBW = 300000L;
-                // hange otn-link-type
+                // change otn-link-type
                 neededType = OtnLinkType.OTUC3;
                 break;
             case "ODUC4":
@@ -387,35 +539,38 @@ public class PceLink implements Serializable {
                 LOG.error("PceLink: isOtnValid Link {} unsupported serviceType {} ", linkId, serviceType);
                 return false;
         }
-
-        if ((this.availableBandwidth >= neededBW)
-            && ((neededType == null) || (neededType.equals(otnLinkType)))) {
-            LOG.info("PceLink: Selected Link {} has available bandwidth and is eligible for {} creation ",
+        if (this.availableBandwidth >= neededBW
+                && (neededType == null
+                    || neededType.equals(
+                        link.augmentation(
+                                org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630
+                                    .Link1.class)
+                            .getOtnLinkType()))) {
+            LOG.debug("PceLink: Selected Link {} has available bandwidth and is eligible for {} creation ",
                 linkId, serviceType);
         }
-
         return checkParams();
     }
 
     private boolean checkParams() {
-        if ((this.linkId == null) || (this.linkType == null) || (this.oppositeLink == null)) {
+        if (this.linkId == null || this.linkType == null || this.oppositeLink == null) {
             LOG.error("PceLink: No Link type or opposite link is available. Link is ignored {}", linkId);
             return false;
         }
-        if ((this.adminStates == null) || (this.state == null)) {
+        if (this.adminStates == null || this.state == null) {
             LOG.error("PceLink: Link is not available. Link is ignored {}", linkId);
             return false;
         }
-        if ((this.sourceId == null) || (this.destId == null) || (this.sourceTP == null) || (this.destTP == null)) {
+        if (this.sourceId == null || this.destId == null || this.sourceTP == null || this.destTP == null) {
             LOG.error("PceLink: No Link source or destination is available. Link is ignored {}", linkId);
             return false;
         }
-        if ((this.sourceNetworkSupNodeId.equals("")) || (this.destNetworkSupNodeId.equals(""))) {
+        if (this.sourceNetworkSupNodeId.equals("") || this.destNetworkSupNodeId.equals("")) {
             LOG.error("PceLink: No Link source SuppNodeID or destination SuppNodeID is available. Link is ignored {}",
                 linkId);
             return false;
         }
-        if ((this.sourceCLLI.equals("")) || (this.destCLLI.equals(""))) {
+        if (this.sourceCLLI.equals("") || this.destCLLI.equals("")) {
             LOG.error("PceLink: No Link source CLLI or destination CLLI is available. Link is ignored {}", linkId);
             return false;
         }
index aa0e3306ba9c65ac35db4cdbe8a19ce3c1e784a6..7d3b483bfc7ab50f1d93818da62ab7651bbdb79f 100644 (file)
@@ -14,6 +14,8 @@ import java.util.List;
 import java.util.Map;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrNetworkAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.opendaylight.yangtools.yang.common.Uint16;
 
@@ -40,6 +42,12 @@ public interface PceNode {
 
     NodeId getNodeId();
 
+    OpenroadmNodeType getORNodeType();
+
+    String getOperationalMode();
+
+    String getXponderOperationalMode(XpdrNetworkAttributes tp);
+
     Map<String, List<Uint16>> getAvailableTribPorts();
 
     Map<String, List<Uint16>> getAvailableTribSlots();
@@ -58,13 +66,13 @@ public interface PceNode {
 
     /**
      * For optical node the slot width granularity from mc capabilities.
-     * @return BigDecimal.
+     * @return Decimal64.
      */
     BigDecimal getSlotWidthGranularity();
 
     /**
      * For optical node the central-frequency granularity from mc capabilities.
-     * @return BigDecimal.
+     * @return Decimal64.
      */
     BigDecimal getCentralFreqGranularity();
 }
index 2c94225b9598d0f2ffa6da7984a8a877242999b7..611263d68a3f43e490abc0af1ab034a9146faa65 100644 (file)
@@ -17,22 +17,28 @@ import java.util.List;
 import java.util.Map;
 import java.util.Optional;
 import java.util.TreeMap;
+import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.transportpce.common.fixedflex.GridConstant;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.pce.SortPortsByName;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1;
+import org.opendaylight.transportpce.pce.networkanalyzer.port.Preference;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.reroute.request.input.Endpoints;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.available.freq.map.AvailFreqMapsKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOCH;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOCHOTU4ODU4;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOtsiOtsigroup;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.SupportedIfCapability;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrNetworkAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.available.freq.map.AvailFreqMapsKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOCH;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOCHOTU4ODU4;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOtsiOtsigroup;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.SupportedIfCapability;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev230526.xpdr.mode.attributes.supported.operational.modes.OperationalMode;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev230526.xpdr.mode.attributes.supported.operational.modes.OperationalModeKey;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
 import org.opendaylight.yangtools.yang.common.Uint16;
@@ -63,10 +69,11 @@ public class PceOpticalNode implements PceNode {
     private String version;
     private BigDecimal slotWidthGranularity;
     private BigDecimal centralFreqGranularity;
+    private Endpoints endpoints;
 
     public PceOpticalNode(String deviceNodeId, String serviceType, PortMapping portMapping, Node node,
         OpenroadmNodeType nodeType, String version, BigDecimal slotWidthGranularity,
-        BigDecimal centralFreqGranularity) {
+                          BigDecimal centralFreqGranularity) {
 
         if (deviceNodeId != null
                 && serviceType != null
@@ -86,22 +93,23 @@ public class PceOpticalNode implements PceNode {
             this.slotWidthGranularity = slotWidthGranularity;
             this.centralFreqGranularity = centralFreqGranularity;
             this.adminStates = node.augmentation(org.opendaylight.yang.gen.v1.http
-                    .org.openroadm.common.network.rev211210.Node1.class).getAdministrativeState();
+                    .org.openroadm.common.network.rev230526.Node1.class).getAdministrativeState();
             this.state = node.augmentation(org.opendaylight.yang.gen.v1.http
-                .org.openroadm.common.network.rev211210.Node1.class).getOperationalState();
+                .org.openroadm.common.network.rev230526.Node1.class).getOperationalState();
         } else {
-            LOG.error("PceNode: one of parameters is not populated : nodeId, node type, slot width granularity");
+            LOG.error("PceNode {} : one of parameters is not populated : nodeId, node type, slot width granularity",
+                deviceNodeId);
             this.valid = false;
         }
     }
 
-    public void initSrgTps() {
+    public void initSrgTps(Preference portPreference) {
         this.availableSrgPp.clear();
         this.availableSrgCp.clear();
         if (!isValid()) {
             return;
         }
-        LOG.info("initSrgTpList: getting SRG tps from ROADM node {}", this.nodeId);
+        LOG.debug("initSrgTpList: getting SRG tps from ROADM node {}", this.nodeId);
         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 nodeTp =
                 this.node.augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
                     .ietf.network.topology.rev180226.Node1.class);
@@ -115,30 +123,34 @@ public class PceOpticalNode implements PceNode {
         for (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
             .node.TerminationPoint tp : allTps) {
             TerminationPoint1 cntp1 = tp.augmentation(TerminationPoint1.class);
-            org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1 nttp1 = tp
-                .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210
+            org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1 nttp1 = tp
+                .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526
                         .TerminationPoint1.class);
             OpenroadmTpType type = cntp1.getTpType();
-            LOG.info("type = {} for tp {}", type.getName(), tp);
+            LOG.debug("type = {} for tp {}", type.getName(), tp);
 
             switch (type) {
                 case SRGTXRXCP:
                 case SRGRXCP:
                 case SRGTXCP:
                     if (State.InService.equals(cntp1.getOperationalState())) {
-                        LOG.info("initSrgTpList: adding SRG-CP tp = {} ", tp.getTpId().getValue());
+                        LOG.debug("initSrgTpList: adding SRG-CP tp = {} ", tp.getTpId().getValue());
                         this.availableSrgCp.put(tp.getTpId().getValue(), cntp1.getTpType());
                     }
                     break;
                 case SRGRXPP:
                 case SRGTXPP:
                 case SRGTXRXPP:
-                    LOG.info("initSrgTpList: SRG-PP tp = {} found", tp.getTpId().getValue());
+                    LOG.debug("initSrgTpList: SRG-PP tp = {} found", tp.getTpId().getValue());
+                    if (!portPreference.isPreferredPort(nodeId.getValue(), tp.getTpId().getValue())) {
+                        LOG.warn("initSrgTpList: SRG-PP tp = {} is rejected by the client", tp.getTpId().getValue());
+                        break;
+                    }
                     if (isTerminationPointAvailable(nttp1)) {
-                        LOG.info("initSrgTpList: adding SRG-PP tp '{}'", tp.getTpId().getValue());
+                        LOG.debug("initSrgTpList: adding SRG-PP tp '{}'", tp.getTpId().getValue());
                         this.availableSrgPp.put(tp.getTpId().getValue(), cntp1.getTpType());
                         if (State.InService.equals(cntp1.getOperationalState())) {
-                            LOG.info("initSrgTpList: adding SRG-PP tp '{}'", tp.getTpId().getValue());
+                            LOG.debug("initSrgTpList: adding SRG-PP tp '{}'", tp.getTpId().getValue());
                             this.availableSrgPp.put(tp.getTpId().getValue(), cntp1.getTpType());
                         }
                     } else {
@@ -154,12 +166,12 @@ public class PceOpticalNode implements PceNode {
             this.valid = false;
             return;
         }
-        LOG.info("initSrgTpList: availableSrgPp size = {} && availableSrgCp size = {} in {}",
+        LOG.debug("initSrgTpList: availableSrgPp size = {} && availableSrgCp size = {} in {}",
             this.availableSrgPp.size(), this.availableSrgCp.size(), this);
     }
 
     private boolean isTerminationPointAvailable(
-            org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1 nttp1) {
+            org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1 nttp1) {
         byte[] availableByteArray = new byte[GridConstant.NB_OCTECTS];
         Arrays.fill(availableByteArray, (byte) GridConstant.AVAILABLE_SLOT_VALUE);
         return nttp1 == null || nttp1.getPpAttributes() == null
@@ -179,19 +191,15 @@ public class PceOpticalNode implements PceNode {
         }
         switch (this.serviceType) {
             case "400GE":
-                for (Class<? extends SupportedIfCapability> ifCap : mapping.getSupportedInterfaceCapability()) {
-                    if (ifCap.equals(IfOtsiOtsigroup.class)) {
+                for (SupportedIfCapability ifCap : mapping.getSupportedInterfaceCapability()) {
+                    if (ifCap.equals(IfOtsiOtsigroup.VALUE)) {
                         return true;
                     }
                 }
                 return false;
             case "100GE":
-                if (mapping.getSupportedInterfaceCapability().contains(IfOCH.class)
-                        || mapping.getSupportedInterfaceCapability().contains(IfOCHOTU4ODU4.class)) {
-                    return true;
-                } else {
-                    return false;
-                }
+                return mapping.getSupportedInterfaceCapability().contains(IfOCH.VALUE)
+                        || mapping.getSupportedInterfaceCapability().contains(IfOCHOTU4ODU4.VALUE);
             default:
                 return true;
         }
@@ -202,8 +210,8 @@ public class PceOpticalNode implements PceNode {
             return;
         }
         Node1 node1 = this.node.augmentation(Node1.class);
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1 node11 =
-                this.node.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1
+        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1 node11 =
+                this.node.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1
                         .class);
         switch (this.nodeType) {
             case SRG :
@@ -242,7 +250,6 @@ public class PceOpticalNode implements PceNode {
                 if (!State.InService.equals(node11.getOperationalState())) {
                     this.valid = false;
                     LOG.error("initWLlist: XPDR node {} is OOS/degraded", this);
-                    return;
                 }
                 break;
             default:
@@ -252,26 +259,29 @@ public class PceOpticalNode implements PceNode {
     }
 
     public void initXndrTps(ServiceFormat serviceFormat) {
-        LOG.info("PceNod: initXndrTps for node : {}", this.nodeId);
+        LOG.debug("PceNod: initXndrTps for node : {}", this.nodeId);
         if (!isValid()) {
             return;
         }
+        this.valid = false;
         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 nodeTp =
                 this.node.augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
                     .ietf.network.topology.rev180226.Node1.class);
         List<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
             .node.TerminationPoint> allTps = new ArrayList<>(nodeTp.nonnullTerminationPoint().values());
         if (allTps.isEmpty()) {
-            this.valid = false;
             LOG.error("initXndrTps: XPONDER TerminationPoint list is empty for node {}", this);
             return;
         }
-        this.valid = false;
         for (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
-            .node.TerminationPoint tp : allTps) {
+                .node.TerminationPoint tp : allTps) {
             TerminationPoint1 cntp1 = tp.augmentation(TerminationPoint1.class);
+            if (cntp1 == null) {
+                LOG.error("initXndrTps: {} - {} has no tp type", this.nodeId, tp.getTpId().toString());
+                continue;
+            }
             if (cntp1.getTpType() != OpenroadmTpType.XPONDERNETWORK) {
-                LOG.warn("initXndrTps: {} is not an Xponder network port", cntp1.getTpType().getName());
+                LOG.debug("initXndrTps: {} is not an Xponder network port", cntp1.getTpType().getName());
                 continue;
             }
             if (!isTpWithGoodCapabilities(tp)) {
@@ -280,31 +290,31 @@ public class PceOpticalNode implements PceNode {
             }
             if (!State.InService.equals(cntp1.getOperationalState())) {
                 LOG.warn("initXndrTps: XPONDER tp = {} is OOS/degraded", tp.getTpId().getValue());
-                this.valid = false;
                 continue;
             }
-            org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1 nttp1 = tp
-                .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210
-                .TerminationPoint1.class);
-            if (nttp1 != null && nttp1.getXpdrNetworkAttributes().getWavelength() != null) {
-                this.usedXpndrNWTps.add(tp.getTpId().getValue());
-                LOG.info("initXndrTps: XPONDER tp = {} is used", tp.getTpId().getValue());
-            } else {
-                this.valid = true;
+            if (endpoints == null
+                    || (!endpoints.getAEndTp().equals(tp.getTpId().getValue())
+                        && !endpoints.getZEndTp().equals(tp.getTpId().getValue()))) {
+                org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1 nttp1 =
+                        tp.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526
+                                .TerminationPoint1.class);
+                if (nttp1 != null && nttp1.getXpdrNetworkAttributes().getWavelength() != null) {
+                    this.usedXpndrNWTps.add(tp.getTpId().getValue());
+                    LOG.debug("initXndrTps: XPONDER tp = {} is used", tp.getTpId().getValue());
+                    continue;
+                }
             }
             // find Client of this network TP
-            String client;
-            org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1 tpceTp1 =
-                    tp.augmentation(org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123
-                            .TerminationPoint1.class);
-            if (tpceTp1 != null) {
-                client = tpceTp1.getAssociatedConnectionMapPort();
+            if (cntp1.getAssociatedConnectionMapTp() != null) {
+                String client = cntp1.getAssociatedConnectionMapTp().iterator().next().getValue();
                 if (client != null) {
                     this.clientPerNwTp.put(tp.getTpId().getValue(), client);
                     this.valid = true;
                 } else {
                     LOG.error("Service Format {} not managed yet", serviceFormat.getName());
                 }
+            } else {
+                this.valid = true;
             }
         }
         if (!isValid()) {
@@ -314,7 +324,7 @@ public class PceOpticalNode implements PceNode {
 
     @Override
     public String getRdmSrgClient(String tp, String direction) {
-        LOG.info("getRdmSrgClient: Getting PP client for tp '{}' on node : {}", tp, this.nodeId);
+        LOG.debug("getRdmSrgClient: Getting PP client for tp '{}' on node : {}", tp, this.nodeId);
         OpenroadmTpType srgType = null;
         OpenroadmTpType cpType = this.availableSrgCp.get(tp);
         if (cpType == null) {
@@ -323,7 +333,7 @@ public class PceOpticalNode implements PceNode {
         }
         switch (cpType) {
             case SRGTXRXCP:
-                LOG.info("getRdmSrgClient: Getting BI Directional PP port ...");
+                LOG.debug("getRdmSrgClient: Getting BI Directional PP port ...");
                 // Take the first-element in the available PP key set
                 if (availableSrgPp.entrySet().iterator().next().getKey()
                         // and check if the port is bidirectional
@@ -336,43 +346,90 @@ public class PceOpticalNode implements PceNode {
                 }
                 break;
             case SRGTXCP:
-                LOG.info("getRdmSrgClient: Getting UNI Rx PP port ...");
+                LOG.debug("getRdmSrgClient: Getting UNI Rx PP port ...");
                 srgType = OpenroadmTpType.SRGRXPP;
                 break;
             case SRGRXCP:
-                LOG.info("getRdmSrgClient: Getting UNI Tx PP port ...");
+                LOG.debug("getRdmSrgClient: Getting UNI Tx PP port ...");
                 srgType = OpenroadmTpType.SRGTXPP;
                 break;
             default:
                 break;
         }
-        LOG.info("getRdmSrgClient:  Getting client PP for CP '{}'", tp);
-        if (!this.availableSrgPp.isEmpty()) {
-            Optional<String> client = null;
-            final OpenroadmTpType openType = srgType;
-            client = this.availableSrgPp.entrySet()
-                    .stream().filter(pp -> pp.getValue().getName().equals(openType.getName()))
-                    .map(Map.Entry::getKey)
-                    .sorted(new SortPortsByName())
-                    .findFirst();
-            if (!client.isPresent()) {
-                LOG.error("getRdmSrgClient: ROADM {} doesn't have PP Client for CP {}", this, tp);
-                return null;
-            }
-            LOG.info("getRdmSrgClient: client PP {} for CP {} found !", client, tp);
-            return client.get();
-        } else {
+        LOG.debug("getRdmSrgClient:  Getting client PP for CP '{}'", tp);
+        if (this.availableSrgPp.isEmpty()) {
             LOG.error("getRdmSrgClient: SRG TerminationPoint PP list is not available for node {}", this);
             return null;
         }
+        final OpenroadmTpType openType = srgType;
+        Optional<String> client = this.availableSrgPp.entrySet()
+                .stream().filter(pp -> pp.getValue().getName().equals(openType.getName()))
+                .map(Map.Entry::getKey).min(new SortPortsByName());
+        if (client.isEmpty()) {
+            LOG.error("getRdmSrgClient: ROADM {} doesn't have PP Client for CP {}", this, tp);
+            return null;
+        }
+        LOG.debug("getRdmSrgClient: client PP {} for CP {} found !", client, tp);
+        return client.orElseThrow();
+    }
+
+    @Override
+    public String getOperationalMode() {
+        Node1 node1 = this.node.augmentation(Node1.class);
+        if (node1 == null) {
+            LOG.warn("No openroadm node available for node {}", node);
+            return "";
+        }
+        switch (this.nodeType) {
+            case SRG :
+                if (node1.getSrgAttributes().getSupportedOperationalModes() == null
+                        || node1.getSrgAttributes().getSupportedOperationalModes().stream().findFirst().isEmpty()) {
+                    LOG.debug("getOperationalMode: SRG has no operational mode declared");
+                    return StringConstants.UNKNOWN_MODE;
+                } else {
+                    LOG.debug("getOperationalMode: SRG has operational mode declared {}",
+                        node1.getSrgAttributes().getSupportedOperationalModes().stream().findFirst().toString());
+                    return node1.getSrgAttributes().getSupportedOperationalModes().stream().findFirst().toString();
+                }
+            case DEGREE :
+                if (node1.getDegreeAttributes().getSupportedOperationalModes() == null
+                        || node1.getDegreeAttributes().getSupportedOperationalModes().stream().findFirst().isEmpty()) {
+                    LOG.debug("getOperationalMode: DEGREE has no operational mode declared");
+                    return StringConstants.UNKNOWN_MODE;
+                } else {
+                    LOG.debug("getOperationalMode: DEGREE has operational mode declared {}",
+                        node1.getDegreeAttributes().getSupportedOperationalModes().stream().findFirst().toString());
+                    return node1.getDegreeAttributes().getSupportedOperationalModes().stream().findFirst().toString();
+                }
+            default:
+                LOG.debug("getOperationalMode: Did not succeed retrieving Operational Mode for the node");
+                return "";
+        }
     }
 
+    @Override
+    public String getXponderOperationalMode(XpdrNetworkAttributes tp) {
+        if (tp.getSupportedOperationalModes() == null) {
+            LOG.warn("getOperationalMode: NetworkPort {} has no operational mode declared compatible with service type",
+                tp);
+            return StringConstants.UNKNOWN_MODE;
+        }
+        for (Map.Entry<OperationalModeKey, OperationalMode> mode : tp.getSupportedOperationalModes()
+                .getOperationalMode().entrySet()) {
+            if (mode.getKey().toString().contains(StringConstants.SERVICE_TYPE_RATE
+                    .get(this.serviceType).toCanonicalString())) {
+                LOG.info("getOperationalMode: NetworkPort {}  has {} operational mode declared", tp,
+                    mode.getKey().toString());
+                return mode.getKey().toString();
+            }
+        }
+        LOG.warn("getOperationalMode: NetworkPort {}  has no operational mode declared compatible with service type",
+            tp);
+        return StringConstants.UNKNOWN_MODE;
+    }
 
     public void validateAZxponder(String anodeId, String znodeId, ServiceFormat serviceFormat) {
-        if (!isValid()) {
-            return;
-        }
-        if (this.nodeType != OpenroadmNodeType.XPONDER) {
+        if (!isValid() || this.nodeType != OpenroadmNodeType.XPONDER) {
             return;
         }
         // Detect A and Z
@@ -381,7 +438,8 @@ public class PceOpticalNode implements PceNode {
             initXndrTps(serviceFormat);
             return;
         }
-        LOG.debug("validateAZxponder: XPONDER is ignored == {}", nodeId.getValue());
+        LOG.debug("validateAZxponder: XPONDER == {} is ignored, supported by {} for aNodeId {} ", nodeId.getValue(),
+            this.getSupNetworkNodeId(), anodeId);
         valid = false;
     }
 
@@ -392,9 +450,9 @@ public class PceOpticalNode implements PceNode {
 
     public boolean isValid() {
         if (node == null || nodeId == null || nodeType == null || this.getSupNetworkNodeId() == null
-            || this.getSupClliNodeId() == null || adminStates == null || state == null) {
-            LOG.error("PceNode: one of parameters is not populated : nodeId, node type, supporting nodeId, "
-                    + "admin state, operational state");
+                || this.getSupClliNodeId() == null || adminStates == null || state == null) {
+            LOG.error("PceNode {},   nodeId {}  NodeType {} : one of parameters is not populated : nodeId, node type,"
+                + " supporting nodeId, admin state, operational state", deviceNodeId, nodeId, nodeType);
             valid = false;
         }
         return valid;
@@ -455,6 +513,11 @@ public class PceOpticalNode implements PceNode {
         return null;
     }
 
+    @Override
+    public OpenroadmNodeType getORNodeType() {
+        return this.nodeType;
+    }
+
     @Override
     public Map<String, List<Uint16>> getAvailableTribSlots() {
         return null;
@@ -500,4 +563,8 @@ public class PceOpticalNode implements PceNode {
         return centralFreqGranularity;
     }
 
+    public void setEndpoints(Endpoints endpoints) {
+        this.endpoints = endpoints;
+    }
+
 }
index b4f2d16fe85bb7190da8aa0a599ecfd5e6784a62..4d632f8222f973ef48d87989accd4cb6c00f8428 100644 (file)
@@ -8,6 +8,7 @@
 
 package org.opendaylight.transportpce.pce.networkanalyzer;
 
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.BitSet;
@@ -20,23 +21,24 @@ import java.util.stream.Collectors;
 import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.OduSwitchingPools;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODTU4TsAllocated;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODTUCnTs;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.Node1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.TerminationPoint1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.termination.point.XpdrTpPortConnectionAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If100GEODU4;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If10GEODU2e;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If1GEODU0;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOCHOTU4ODU4;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOtsiOtsigroup;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.SupportedIfCapability;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev211210.xpdr.otn.tp.attributes.OdtuTpnPool;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrNetworkAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.OduSwitchingPools;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODTU4TsAllocated;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODTUCnTs;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.Node1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.networks.network.node.termination.point.XpdrTpPortConnectionAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If100GEODU4;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If10GEODU2e;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If1GEODU0;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOCHOTU4ODU4;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOtsiOtsigroup;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.SupportedIfCapability;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev230526.xpdr.otn.tp.attributes.OdtuTpnPool;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
@@ -61,11 +63,11 @@ public class PceOtnNode implements PceNode {
         OpenroadmNodeType.MUXPDR,
         OpenroadmNodeType.SWITCH,
         OpenroadmNodeType.TPDR);
-    private static final Map<String, Class<? extends SupportedIfCapability>> SERVICE_TYPE_ETH_CLASS_MAP = Map.of(
-        StringConstants.SERVICE_TYPE_1GE, If1GEODU0.class,
-        StringConstants.SERVICE_TYPE_10GE, If10GEODU2e.class,
-        StringConstants.SERVICE_TYPE_100GE_M, If100GEODU4.class,
-        StringConstants.SERVICE_TYPE_100GE_S, If100GEODU4.class);
+    private static final Map<String, SupportedIfCapability> SERVICE_TYPE_ETH_CLASS_MAP = Map.of(
+        StringConstants.SERVICE_TYPE_1GE, If1GEODU0.VALUE,
+        StringConstants.SERVICE_TYPE_10GE, If10GEODU2e.VALUE,
+        StringConstants.SERVICE_TYPE_100GE_M, If100GEODU4.VALUE,
+        StringConstants.SERVICE_TYPE_100GE_S, If100GEODU4.VALUE);
     private static final Map<String, Integer> SERVICE_TYPE_ETH_TS_NB_MAP = Map.of(
         StringConstants.SERVICE_TYPE_1GE, 1,
         StringConstants.SERVICE_TYPE_10GE, 10,
@@ -103,13 +105,10 @@ public class PceOtnNode implements PceNode {
     private Map<String, String> clientPerNwTp = new HashMap<>();
     private String clientPort;
 
-    public PceOtnNode(
-            Node node,
-            OpenroadmNodeType nodeType,
-            NodeId nodeId,
-            String pceNodeType,
-            String serviceType,
-            String clientPort) {
+    @SuppressFBWarnings(value = "MC_OVERRIDABLE_METHOD_CALL_IN_CONSTRUCTOR",
+        justification = "need to initialise available tribport and tribslt")
+    public PceOtnNode(Node node, OpenroadmNodeType nodeType, NodeId nodeId, String pceNodeType, String serviceType,
+                      String clientPort) {
         this.node = node;
         this.nodeId = nodeId;
         this.nodeType = nodeType;
@@ -123,10 +122,10 @@ public class PceOtnNode implements PceNode {
         this.availableXpdrClientTps = new ArrayList<>();
         this.usableXpdrClientTps = new ArrayList<>();
         this.adminStates = node
-            .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1.class)
+            .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class)
             .getAdministrativeState();
         this.state = node
-            .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1.class)
+            .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class)
             .getOperationalState();
         this.tpAvailableTribPort.clear();
         checkAvailableTribPort();
@@ -148,7 +147,7 @@ public class PceOtnNode implements PceNode {
     }
 
     public void initXndrTps(String mode) {
-        LOG.info("PceOtnNode: initXndrTps for node {}", this.nodeId.getValue());
+        LOG.debug("PceOtnNode: initXndrTps for node {}", this.nodeId.getValue());
         this.availableXponderTp.clear();
         this.modeType = mode;
         List<TerminationPoint> allTps =
@@ -164,10 +163,10 @@ public class PceOtnNode implements PceNode {
             return;
         }
         for (TerminationPoint tp : allTps) {
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
                     .TerminationPoint1 ocnTp1
                 = tp.augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
                         .TerminationPoint1.class);
             if (ocnTp1 == null) {
                 LOG.warn("null ocn TP {}", tp);
@@ -182,7 +181,7 @@ public class PceOtnNode implements PceNode {
                 case XPONDERNETWORK:
                     String notCreatedServiceType = xpdrNetTpCreation(ontTp1);
                     if (notCreatedServiceType == null) {
-                        LOG.info("TP {} of XPONDER {} is validated",
+                        LOG.debug("TP {} of XPONDER {} is validated",
                             tp.getTpId().getValue(),
                             node.getNodeId().getValue());
                         this.availableXpdrNWTps.add(tp.getTpId());
@@ -198,7 +197,7 @@ public class PceOtnNode implements PceNode {
                         continue;
                     }
                     if (checkClientTp(ontTp1)) {
-                        LOG.info("TP {} of XPONDER {} is validated",
+                        LOG.debug("TP {} of XPONDER {} is validated",
                             tp.getTpId(),
                             node.getNodeId().getValue());
                         this.availableXpdrClientTps.add(tp.getTpId());
@@ -256,11 +255,8 @@ public class PceOtnNode implements PceNode {
         }
         List<NonBlockingList> nblList = new ArrayList<>(
                 node1.getSwitchingPools().nonnullOduSwitchingPools()
-                        .values().stream().findFirst().get()
+                        .values().stream().findFirst().orElseThrow()
                                 .getNonBlockingList().values());
-        if (nblList == null) {
-            return false;
-        }
         netwTps.sort(Comparator.comparing(TpId::getValue));
 
         switch (modeType) {
@@ -321,9 +317,9 @@ public class PceOtnNode implements PceNode {
     private boolean checkTpForOdtuTermination(TerminationPoint1 ontTp1) {
         for (SupportedInterfaceCapability sic :
                 ontTp1.getTpSupportedInterfaces().getSupportedInterfaceCapability().values()) {
-            LOG.info("in checkTpForOduTermination - sic = {}", sic.getIfCapType());
-            if ((sic.getIfCapType().equals(IfOCHOTU4ODU4.class)
-                    || sic.getIfCapType().equals(IfOtsiOtsigroup.class))
+            LOG.debug("in checkTpForOduTermination - sic = {}", sic.getIfCapType());
+            if ((sic.getIfCapType().equals(IfOCHOTU4ODU4.VALUE)
+                    || sic.getIfCapType().equals(IfOtsiOtsigroup.VALUE))
                     && (ontTp1.getXpdrTpPortConnectionAttributes() == null
                         || ontTp1.getXpdrTpPortConnectionAttributes().getTsPool() == null)) {
                 return true;
@@ -340,12 +336,12 @@ public class PceOtnNode implements PceNode {
                 || portConAttr.getOdtuTpnPool() == null) {
             return false;
         }
-        return checkFirstOdtuTpn(portConAttr.getOdtuTpnPool().values().stream().findFirst().get());
+        return checkFirstOdtuTpn(portConAttr.getOdtuTpnPool().values().stream().findFirst().orElseThrow());
     }
 
     private boolean checkFirstOdtuTpn(OdtuTpnPool otPool) {
-        return (otPool.getOdtuType().getSimpleName().equals(ODTU4TsAllocated.class.getSimpleName())
-                || otPool.getOdtuType().getSimpleName().equals(ODTUCnTs.class.getSimpleName()))
+        return (otPool.getOdtuType().equals(ODTU4TsAllocated.VALUE))
+                || otPool.getOdtuType().equals(ODTUCnTs.VALUE)
             && !otPool.getTpnPool().isEmpty();
     }
 
@@ -354,8 +350,7 @@ public class PceOtnNode implements PceNode {
                 ontTp1.getTpSupportedInterfaces().getSupportedInterfaceCapability().values()) {
             LOG.debug("in checkTpForOduTermination - sic = {}", sic.getIfCapType());
             // we could also check the administrative status of the tp
-            if (SERVICE_TYPE_ETH_CLASS_MAP.get(otnServiceType).getSimpleName()
-                    .equals(sic.getIfCapType().getSimpleName())) {
+            if (SERVICE_TYPE_ETH_CLASS_MAP.get(otnServiceType).equals(sic.getIfCapType())) {
                 return true;
             }
         }
@@ -372,7 +367,7 @@ public class PceOtnNode implements PceNode {
         } else if (OpenroadmNodeType.SWITCH.equals(this.nodeType)) {
             initXndrTps(INTERMEDIATE_MODETYPE);
         } else {
-            LOG.info("validateAZxponder: XPONDER is ignored == {}", nodeId.getValue());
+            LOG.warn("validateAZxponder: XPONDER is ignored == {}", nodeId.getValue());
             valid = false;
         }
     }
@@ -411,7 +406,7 @@ public class PceOtnNode implements PceNode {
         // Validate switch for use as an intermediate XPONDER on the path
         initXndrTps(INTERMEDIATE_MODETYPE);
         if (this.valid) {
-            LOG.info("validateIntermediateSwitch: Switch usable for transit == {}", nodeId.getValue());
+            LOG.debug("validateIntermediateSwitch: Switch usable for transit == {}", nodeId.getValue());
         } else {
             LOG.debug("validateIntermediateSwitch: Switch unusable for transit == {}", nodeId.getValue());
         }
@@ -425,7 +420,7 @@ public class PceOtnNode implements PceNode {
                 .getTerminationPoint().values().stream()
                 .filter(type -> type
                     .augmentation(
-                        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
                             .TerminationPoint1.class)
                     .getTpType()
                     .equals(OpenroadmTpType.XPONDERNETWORK))
@@ -433,9 +428,9 @@ public class PceOtnNode implements PceNode {
             XpdrTpPortConnectionAttributes portConAttr =
                 tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes();
             if (portConAttr != null && portConAttr.getOdtuTpnPool() != null) {
-                OdtuTpnPool otPool = portConAttr.getOdtuTpnPool().values().stream().findFirst().get();
+                OdtuTpnPool otPool = portConAttr.getOdtuTpnPool().values().stream().findFirst().orElseThrow();
                 if (checkFirstOdtuTpn(otPool)) {
-                    tpAvailableTribPort.put(tp.getTpId().getValue(), otPool.getTpnPool());
+                    tpAvailableTribPort.put(tp.getTpId().getValue(), new ArrayList<>(otPool.getTpnPool()));
                 }
             }
         }
@@ -449,7 +444,7 @@ public class PceOtnNode implements PceNode {
             .getTerminationPoint().values().stream()
             .filter(type -> type
                 .augmentation(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
                         .TerminationPoint1.class)
                 .getTpType().equals(OpenroadmTpType.XPONDERNETWORK))
             .collect(Collectors.toList())
@@ -457,7 +452,7 @@ public class PceOtnNode implements PceNode {
             XpdrTpPortConnectionAttributes portConAttr =
                 tp.augmentation(TerminationPoint1.class).getXpdrTpPortConnectionAttributes();
             if (portConAttr != null && portConAttr.getTsPool() != null) {
-                tpAvailableTribSlot.put(tp.getTpId().getValue(), portConAttr.getTsPool());
+                tpAvailableTribSlot.put(tp.getTpId().getValue(), new ArrayList<>(portConAttr.getTsPool()));
             }
         }
     }
@@ -572,6 +567,21 @@ public class PceOtnNode implements PceNode {
         return null;
     }
 
+    @Override
+    public String getXponderOperationalMode(XpdrNetworkAttributes tp) {
+        return null;
+    }
+
+    @Override
+    public String getOperationalMode() {
+        return null;
+    }
+
+    @Override
+    public OpenroadmNodeType getORNodeType() {
+        return this.nodeType;
+    }
+
     /*
     * (non-Javadoc)
     *
index f4d8b3bbfc3ad06c2ffe11206fc9c01996b61e24..3cf83f0b2a37c7cbf55ba43b7ab62c6ba78fedb4 100644 (file)
@@ -12,10 +12,10 @@ import java.math.BigDecimal;
 import java.util.List;
 import org.opendaylight.transportpce.common.ResponseCodes;
 import org.opendaylight.transportpce.common.fixedflex.GridConstant;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev181130.OpucnTribSlotDef;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OpucnTribSlotDef;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirection;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirection;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirection;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirection;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/port/ClientPreference.java b/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/port/ClientPreference.java
new file mode 100644 (file)
index 0000000..d3749c3
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.pce.networkanalyzer.port;
+
+import java.util.Map;
+import java.util.Set;
+
+public class ClientPreference implements Preference {
+
+    Map<String, Set<String>> nodePortPreference;
+
+    public ClientPreference(Map<String, Set<String>> nodePortPreference) {
+        this.nodePortPreference = nodePortPreference;
+    }
+
+    @Override
+    public boolean isPreferredPort(String node, String portName) {
+
+        //If there is no preferred port registered for the node, it means
+        //the client has no preference regarding the node.
+        //Therefore, we'll treat the node as it was preferred to
+        //prevent it from NOT being used.
+        return !nodePortPreference.containsKey(node) || nodePortPreference.get(node).contains(portName);
+
+    }
+
+}
diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/port/Factory.java b/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/port/Factory.java
new file mode 100644 (file)
index 0000000..82da45d
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.pce.networkanalyzer.port;
+
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInput;
+
+public interface Factory {
+
+    /**
+     * Extracting preferred ports from pathComputationRequestInput.
+     *
+     * <p>
+     * This is the recommended method of determining if a node/port combination
+     * is preferred by the client.
+     *
+     * <p>
+     * Pseudocode example:
+     * <pre>
+     *     Factory.portPreference(PCRI).preferredPort("ROADM-B-SRG1", "SRG1-PP1-TXRX");
+     * </pre>
+     *
+     * @return Client port preference
+     */
+    Preference portPreference(PathComputationRequestInput pathComputationRequestInput);
+
+}
diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/port/NoPreference.java b/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/port/NoPreference.java
new file mode 100644 (file)
index 0000000..5b96ca0
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.pce.networkanalyzer.port;
+
+/**
+ * This class represents a state where the client has no port preference.
+ * In essence, all ports on all nodes will therefore be treated as 'preferred'
+ * when queried.
+ *
+ * <p>
+ * Usage of this class is of sorts the 'backwards compatible' approach. Meaning,
+ * intended to offer a path for the application to behave as it did
+ * prior to implementing client port preference.
+ */
+public class NoPreference implements Preference {
+    @Override
+    public boolean isPreferredPort(String node, String portName) {
+        return true;
+    }
+}
diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/port/Preference.java b/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/port/Preference.java
new file mode 100644 (file)
index 0000000..3d1acb8
--- /dev/null
@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.pce.networkanalyzer.port;
+
+public interface Preference {
+
+    /**
+     * Return true if the portName is among the ports preferred by the client.
+     */
+    boolean isPreferredPort(String node, String portName);
+
+}
diff --git a/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/port/PreferenceFactory.java b/pce/src/main/java/org/opendaylight/transportpce/pce/networkanalyzer/port/PreferenceFactory.java
new file mode 100644 (file)
index 0000000..1d62e18
--- /dev/null
@@ -0,0 +1,144 @@
+/*
+ * Copyright (c) 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.pce.networkanalyzer.port;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.request.input.ServiceAEnd;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.request.input.ServiceZEnd;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.port.Port;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.RxDirection;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.TxDirection;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class PreferenceFactory implements Factory {
+
+    private static final Logger LOG = LoggerFactory.getLogger(PreferenceFactory.class);
+
+    private String portNamePattern;
+
+    public PreferenceFactory() {
+        this.portNamePattern = "(?i)SRG\\d+-PP\\d+-(TXRX|TX|RX)";
+    }
+
+    @Override
+    public Preference portPreference(PathComputationRequestInput pathComputationRequestInput) {
+
+        Map<String, Set<String>> map = nodePortMap(pathComputationRequestInput);
+
+        if (map.isEmpty()) {
+            LOG.debug("No port preference found in path computation request.");
+            return new NoPreference();
+        }
+
+        LOG.debug("Port preference in path computation request: {}." , map);
+        return new ClientPreference(map);
+    }
+
+    /**
+     * Create a key value mapper from PCRI where key is the node and the value is
+     * a unique list of port names.
+     *
+     * @return Client port preference map
+     */
+    Map<String, Set<String>> nodePortMap(PathComputationRequestInput pathComputationRequestInput) {
+
+        Map<String, Set<String>> mapper = new HashMap<>();
+
+        ServiceAEnd serviceAEnd = pathComputationRequestInput.getServiceAEnd();
+        if (serviceAEnd != null) {
+
+            RxDirection rxAzDirection = serviceAEnd.getRxDirection();
+            if (rxAzDirection != null) {
+
+                Port rxAZport = rxAzDirection.getPort();
+                if (rxAZport != null) {
+                    add(rxAZport.getPortDeviceName(), rxAZport.getPortName(), mapper);
+                }
+            }
+
+            TxDirection txAzDirection = serviceAEnd.getTxDirection();
+            if (txAzDirection != null) {
+
+                Port txAZport = txAzDirection.getPort();
+                if (txAZport != null) {
+                    add(txAZport.getPortDeviceName(), txAZport.getPortName(), mapper);
+                }
+            }
+        }
+
+        ServiceZEnd serviceZEnd = pathComputationRequestInput.getServiceZEnd();
+        if (serviceZEnd != null) {
+
+            RxDirection rxZaDirection = serviceZEnd.getRxDirection();
+            if (rxZaDirection != null) {
+
+                Port rxZAport = rxZaDirection.getPort();
+                if (rxZAport != null) {
+                    add(rxZAport.getPortDeviceName(), rxZAport.getPortName(), mapper);
+                }
+            }
+
+            TxDirection txZaDirection = serviceZEnd.getTxDirection();
+            if (txZaDirection != null) {
+
+                Port txZAport = txZaDirection.getPort();
+                if (txZAport != null) {
+                    add(txZAport.getPortDeviceName(), txZAport.getPortName(), mapper);
+                }
+            }
+        }
+
+        return mapper;
+    }
+
+    /**
+     * Add node/port name to key value map. Mutable method, modifies the argument nodePortMap.
+     */
+    boolean add(String node, String port, Map<String, Set<String>> nodePortMap) {
+
+        if (node == null || port == null) {
+            return false;
+        }
+
+        String nodeTrimmed = node.trim();
+        String portTrimmed = port.trim();
+
+        if (nodeTrimmed.isEmpty() || portTrimmed.isEmpty()) {
+            return false;
+        }
+
+        if (!portTrimmed.matches(portNamePattern)) {
+            LOG.warn("Preferred port name '{}' on node {} doesn't match pattern '{}'",
+                portTrimmed,
+                nodeTrimmed,
+                portNamePattern
+            );
+        }
+
+        if (nodePortMap.containsKey(nodeTrimmed)) {
+            boolean added = nodePortMap.get(nodeTrimmed).add(portTrimmed);
+            if (added) {
+                LOG.debug("Preferred port '{}' for node '{}' registered.", portTrimmed, nodeTrimmed);
+            } else {
+                LOG.debug("Failed registering port '{}' for node '{}'.", portTrimmed, nodeTrimmed);
+            }
+            return added;
+        }
+
+        nodePortMap.put(nodeTrimmed, new HashSet<>(Arrays.asList(portTrimmed)));
+
+        return true;
+    }
+}
index 7a6a9133ea1bb1048aa044b86433204497ffc0ce..0de1fbf2d3cebce0ec797bc8879b9ead142d6ad3 100644 (file)
@@ -8,10 +8,12 @@
 package org.opendaylight.transportpce.pce.service;
 
 import com.google.common.util.concurrent.ListenableFuture;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.CancelResourceReserveInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.CancelResourceReserveOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.CancelResourceReserveInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.CancelResourceReserveOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRerouteRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRerouteRequestOutput;
 
 /**
  * Path Computation Service.
@@ -34,4 +36,13 @@ public interface PathComputationService {
      */
     ListenableFuture<PathComputationRequestOutput> pathComputationRequest(PathComputationRequestInput input);
 
+    /**
+     * Requests a path computation in order to reroute a service.
+     *
+     * @param input PathComputationRerouteRequestInput data
+     * @return output PathComputationRerouteRequestOutput data
+     */
+    ListenableFuture<PathComputationRerouteRequestOutput> pathComputationRerouteRequest(
+            PathComputationRerouteRequestInput input);
+
 }
index aa598c73160be1438d207c56a28317d1a6bc0308..523ad31f9b8101b7a6a74e438364fb7093245fb2 100644 (file)
@@ -24,33 +24,44 @@ import org.opendaylight.transportpce.pce.PceComplianceCheckResult;
 import org.opendaylight.transportpce.pce.PceSendingPceRPCs;
 import org.opendaylight.transportpce.pce.gnpy.GnpyResult;
 import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumer;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.result.Response;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.CancelResourceReserveInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.CancelResourceReserveOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.CancelResourceReserveOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.ServicePathRpcResult;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.ServicePathRpcResultBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.gnpy.GnpyResponse;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.gnpy.GnpyResponseBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.gnpy.gnpy.response.response.type.NoPathCaseBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.gnpy.gnpy.response.response.type.PathCaseBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.path.performance.PathPropertiesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.path.performance.path.properties.PathMetric;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.path.performance.path.properties.PathMetricBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.service.path.rpc.result.PathDescription;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.service.path.rpc.result.PathDescriptionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommonBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirection;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirection;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.result.Response;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.CancelResourceReserveInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.CancelResourceReserveOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.CancelResourceReserveOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRerouteRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRerouteRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRerouteRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.ServicePathRpcResult;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.ServicePathRpcResultBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.gnpy.GnpyResponse;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.gnpy.GnpyResponseBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.gnpy.gnpy.response.response.type.NoPathCaseBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.gnpy.gnpy.response.response.type.PathCaseBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.request.input.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.request.input.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.performance.PathPropertiesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.performance.path.properties.PathMetric;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.performance.path.properties.PathMetricBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.service.path.rpc.result.PathDescription;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.service.path.rpc.result.PathDescriptionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommonBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirection;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirection;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.RpcStatusEx;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.ServicePathNotificationTypes;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.response.parameters.sp.ResponseParametersBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.handler.header.ServiceHandlerHeaderBuilder;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@Component(immediate = true)
 public class PathComputationServiceImpl implements PathComputationService {
 
     private static final Logger LOG = LoggerFactory.getLogger(PathComputationServiceImpl.class);
@@ -61,22 +72,17 @@ public class PathComputationServiceImpl implements PathComputationService {
     private final GnpyConsumer gnpyConsumer;
     private PortMapping portMapping;
 
-    public PathComputationServiceImpl(NetworkTransactionService networkTransactionService,
-                                      NotificationPublishService notificationPublishService,
-                                      GnpyConsumer gnpyConsumer, PortMapping portMapping) {
+    @Activate
+    public PathComputationServiceImpl(@Reference NetworkTransactionService networkTransactionService,
+            @Reference NotificationPublishService notificationPublishService,
+            @Reference GnpyConsumer gnpyConsumer,
+            @Reference PortMapping portMapping) {
         this.notificationPublishService = notificationPublishService;
         this.networkTransactionService = networkTransactionService;
         this.executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(5));
         this.gnpyConsumer = gnpyConsumer;
         this.portMapping = portMapping;
-    }
-
-    public void init() {
-        LOG.info("init ...");
-    }
-
-    public void close() {
-        LOG.info("close.");
+        LOG.info("PathComputationServiceImpl instantiated");
     }
 
     @SuppressFBWarnings(
@@ -145,7 +151,7 @@ public class PathComputationServiceImpl implements PathComputationService {
 
     @Override
     public ListenableFuture<PathComputationRequestOutput> pathComputationRequest(PathComputationRequestInput input) {
-        LOG.info("pathComputationRequest");
+        LOG.debug("input parameters are : input = {}", input.toString());
         return executor.submit(new Callable<PathComputationRequestOutput>() {
 
             @Override
@@ -222,8 +228,7 @@ public class PathComputationServiceImpl implements PathComputationService {
                 }
                 // Path calculator returned Success
                 PathDescription pathDescription =
-                    new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118
-                            .service.path.rpc.result.PathDescriptionBuilder()
+                    new PathDescriptionBuilder()
                         .setAToZDirection(path.getAToZDirection())
                         .setZToADirection(path.getZToADirection())
                         .build();
@@ -254,7 +259,7 @@ public class PathComputationServiceImpl implements PathComputationService {
                 AToZDirection atoz = pathDescription.getAToZDirection();
                 if ((atoz != null) && (atoz.getAToZ() != null)) {
                     LOG.debug("Impl AtoZ Notification: [{}] elements in description", atoz.getAToZ().size());
-                    for (org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705
+                    for (org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501
                             .path.description.atoz.direction.AToZKey key : atoz.getAToZ().keySet()) {
                         LOG.debug("Impl AtoZ Notification: [{}] {}", key, atoz.getAToZ().get(key));
                     }
@@ -262,7 +267,7 @@ public class PathComputationServiceImpl implements PathComputationService {
                 ZToADirection ztoa = pathDescription.getZToADirection();
                 if ((ztoa != null) && (ztoa.getZToA() != null)) {
                     LOG.debug("Impl ZtoA Notification: [{}] elements in description", ztoa.getZToA().size());
-                    for (org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705
+                    for (org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501
                             .path.description.ztoa.direction.ZToAKey key : ztoa.getZToA().keySet()) {
                         LOG.debug("Impl ZtoA Notification: [{}] {}", key, ztoa.getZToA().get(key));
                     }
@@ -272,6 +277,52 @@ public class PathComputationServiceImpl implements PathComputationService {
         });
     }
 
+    @Override
+    public ListenableFuture<PathComputationRerouteRequestOutput> pathComputationRerouteRequest(
+            PathComputationRerouteRequestInput input) {
+        return executor.submit(() -> {
+            PathComputationRerouteRequestOutputBuilder output = new PathComputationRerouteRequestOutputBuilder();
+            ConfigurationResponseCommonBuilder configurationResponseCommon = new ConfigurationResponseCommonBuilder()
+                    .setRequestId("none");
+            PceComplianceCheckResult check = PceComplianceCheck.check(input);
+            if (!check.hasPassed()) {
+                LOG.error("Path not calculated, path computation reroute request not compliant : {}",
+                        check.getMessage());
+                configurationResponseCommon
+                        .setAckFinalIndicator("Yes")
+                        .setResponseCode("Path not calculated")
+                        .setResponseMessage(check.getMessage());
+                return output
+                        .setConfigurationResponseCommon(configurationResponseCommon.build())
+                        .build();
+            }
+            PathComputationRequestInput pathComputationInput = new PathComputationRequestInputBuilder()
+                    .setServiceName("no_name")
+                    .setServiceHandlerHeader(new ServiceHandlerHeaderBuilder().setRequestId("none").build())
+                    .setServiceAEnd(new ServiceAEndBuilder(input.getServiceAEnd()).build())
+                    .setServiceZEnd(new ServiceZEndBuilder(input.getServiceZEnd()).build())
+                    .setHardConstraints(input.getHardConstraints())
+                    .setPceRoutingMetric(input.getPceRoutingMetric())
+                    .setResourceReserve(false)
+                    .setSoftConstraints(input.getSoftConstraints())
+                    .setRoutingMetric(input.getRoutingMetric())
+                    .build();
+            PceSendingPceRPCs sendingPCE = new PceSendingPceRPCs(pathComputationInput, networkTransactionService,
+                    gnpyConsumer, portMapping, input.getEndpoints());
+            sendingPCE.pathComputation();
+            String message = sendingPCE.getMessage();
+            String responseCode = sendingPCE.getResponseCode();
+            LOG.info("PCE response: {} {}", message, responseCode);
+            return output.setConfigurationResponseCommon(
+                    configurationResponseCommon
+                            .setAckFinalIndicator("Yes")
+                            .setResponseCode(responseCode)
+                            .setResponseMessage(message)
+                            .build())
+                    .build();
+        });
+    }
+
     public GnpyResponse generateGnpyResponse(Response responseGnpy, String pathDir) {
         if (responseGnpy == null) {
             return new GnpyResponseBuilder()
@@ -281,11 +332,11 @@ public class PathComputationServiceImpl implements PathComputationService {
                 .build();
         }
         if (responseGnpy.getResponseType()
-                instanceof org.opendaylight.yang.gen.v1.gnpy.path.rev220221.result.response.response.type.NoPathCase) {
+                instanceof org.opendaylight.yang.gen.v1.gnpy.path.rev220615.result.response.response.type.NoPathCase) {
             LOG.info("GNPy : path is not feasible");
-            org.opendaylight.yang.gen.v1.gnpy.path.rev220221.result.response.response.type.NoPathCase
+            org.opendaylight.yang.gen.v1.gnpy.path.rev220615.result.response.response.type.NoPathCase
                     noPathGnpy =
-                (org.opendaylight.yang.gen.v1.gnpy.path.rev220221.result.response.response.type.NoPathCase)
+                (org.opendaylight.yang.gen.v1.gnpy.path.rev220615.result.response.response.type.NoPathCase)
                     responseGnpy.getResponseType();
             return new GnpyResponseBuilder()
                 .setPathDir(pathDir)
@@ -297,17 +348,17 @@ public class PathComputationServiceImpl implements PathComputationService {
                 .build();
         }
         if (responseGnpy.getResponseType()
-                instanceof org.opendaylight.yang.gen.v1.gnpy.path.rev220221.result.response.response.type.PathCase) {
+                instanceof org.opendaylight.yang.gen.v1.gnpy.path.rev220615.result.response.response.type.PathCase) {
             LOG.info("GNPy : path is feasible");
-            org.opendaylight.yang.gen.v1.gnpy.path.rev220221.result.response.response.type.PathCase
+            org.opendaylight.yang.gen.v1.gnpy.path.rev220615.result.response.response.type.PathCase
                     pathCase =
-                (org.opendaylight.yang.gen.v1.gnpy.path.rev220221.result.response.response.type.PathCase)
+                (org.opendaylight.yang.gen.v1.gnpy.path.rev220615.result.response.response.type.PathCase)
                     responseGnpy.getResponseType();
-            List<org.opendaylight.yang.gen.v1.gnpy.path.rev220221.generic.path.properties.path.properties.PathMetric>
+            List<org.opendaylight.yang.gen.v1.gnpy.path.rev220615.generic.path.properties.path.properties.PathMetric>
                     pathMetricList =
                 new ArrayList<>(pathCase.getPathProperties().getPathMetric().values());
             List<PathMetric> gnpyPathMetricList = new ArrayList<>();
-            for (org.opendaylight.yang.gen.v1.gnpy.path.rev220221.generic.path.properties.path.properties.PathMetric
+            for (org.opendaylight.yang.gen.v1.gnpy.path.rev220615.generic.path.properties.path.properties.PathMetric
                     pathMetricGnpy : pathMetricList) {
                 gnpyPathMetricList.add(
                     new PathMetricBuilder()
diff --git a/pce/src/main/resources/OSGI-INF/blueprint/pce-blueprint.xml b/pce/src/main/resources/OSGI-INF/blueprint/pce-blueprint.xml
deleted file mode 100755 (executable)
index 1716b4a..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- vi: set et smarttab sw=4 tabstop=4: -->
-<!--
-Copyright © 2017 Orange and others. All rights reserved.
-
-This program and the accompanying materials are made available under the
-terms of the Eclipse Public License v1.0 which accompanies this distribution,
-and is available at http://www.eclipse.org/legal/epl-v10.html
-
-Author: Martial Coulibaly <martial.coulibaly@gfi.com> on behalf of Orange
--->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
-  xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
-  xmlns:cm="http://aries.apache.org/blueprint/xmlns/blueprint-cm/v1.1.0"
-  odl:use-default-for-reference-types="true">
-    <cm:property-placeholder persistent-id="org.opendaylight.transportpce.pce" update-strategy="reload">
-        <cm:default-properties>
-            <cm:property name="url" value="http://127.0.0.1:8008" />
-            <cm:property name="username" value="gnpy" />
-            <cm:property name="password" value="gnpy" />
-        </cm:default-properties>
-    </cm:property-placeholder>
-
-  <reference id="networkTransactionImpl" interface="org.opendaylight.transportpce.common.network.NetworkTransactionService" />
-  <reference id="bindingDOMCodecServices" interface="org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices" />
-  <reference id="dataBroker" interface="org.opendaylight.mdsal.binding.api.DataBroker"/>
-  <reference id="rpcService" interface="org.opendaylight.mdsal.binding.api.RpcProviderService"/>
-  <reference id="notificationPublishService" interface="org.opendaylight.mdsal.binding.api.NotificationPublishService"/>
-  <reference id="portMapping" interface="org.opendaylight.transportpce.common.mapping.PortMapping"/>
-
-  <bean id="pceServiceImpl"
-        class="org.opendaylight.transportpce.pce.service.PathComputationServiceImpl"
-        init-method="init" destroy-method="close">
-    <argument ref="networkTransactionImpl"/>
-    <argument ref="notificationPublishService" />
-    <argument ref="gnpyConsumer" />
-    <argument ref="portMapping" />
-  </bean>
-
-  <bean id="gnpyConsumer"
-        class="org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumerImpl">
-     <argument value="${url}"/>
-     <argument value="${username}"/>
-     <argument value="${password}"/>
-     <argument ref="bindingDOMCodecServices" />
-  </bean>
-
-  <bean id="provider"
-        class="org.opendaylight.transportpce.pce.impl.PceProvider"
-        init-method="init" destroy-method="close">
-    <argument ref="rpcService" />
-    <argument ref="pceServiceImpl" />
-  </bean>
-
-  <service ref="pceServiceImpl"
-        interface="org.opendaylight.transportpce.pce.service.PathComputationService"/>
-
-</blueprint>
index 622ee130de7b703da9b906eeff03c0314ebeb2d6..8e20a9d9d2558d3197cc1680c258a5342536e2db 100644 (file)
@@ -7,16 +7,18 @@
  */
 package org.opendaylight.transportpce.pce;
 
-import org.junit.Assert;
-import org.junit.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import org.junit.jupiter.api.Test;
 
 public class PceComplianceCheckResultTest {
 
     PceComplianceCheckResult pceComplianceCheckResult = new PceComplianceCheckResult(false, "message");
 
     @Test
-    public void checkGetter() {
-        Assert.assertEquals(false, pceComplianceCheckResult.hasPassed());
-        Assert.assertNotNull(pceComplianceCheckResult.getMessage());
+    void checkGetter() {
+        assertEquals(false, pceComplianceCheckResult.hasPassed());
+        assertNotNull(pceComplianceCheckResult.getMessage());
     }
 }
index a64d4c9be46d12b6a705cbdd9ff6c608a0cf6946..8b86f09ccd1b477865890d0766f367c3eed22a15 100644 (file)
@@ -8,35 +8,27 @@
 
 package org.opendaylight.transportpce.pce;
 
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.junit.jupiter.api.Test;
 import org.opendaylight.transportpce.pce.utils.PceTestData;
 import org.opendaylight.transportpce.test.AbstractTest;
 
 public class PceComplianceCheckTest extends AbstractTest {
 
-
-    @Before
-    public void setup() {
-
-    }
-
     @Test
-    public void testCheckFalse() {
-        Assert.assertFalse(
-                PceComplianceCheck.check(PceTestData.getEmptyPCERequest()).hasPassed());
+    void testCheckFalse() {
+        assertFalse(PceComplianceCheck.check(PceTestData.getEmptyPCERequest()).hasPassed());
     }
 
     @Test
-    public void testCheckTrue() {
-        Assert.assertTrue(
-                PceComplianceCheck.check(PceTestData.getEmptyPCERequestServiceNameWithRequestId()).hasPassed());
+    void testCheckTrue() {
+        assertTrue(PceComplianceCheck.check(PceTestData.getEmptyPCERequestServiceNameWithRequestId()).hasPassed());
     }
 
     @Test
-    public void testCheckFalseWihtoutRequestID() {
-        Assert.assertFalse(
-                PceComplianceCheck.check(PceTestData.getEmptyPCERequestServiceNameWithOutRequestId()).hasPassed());
+    void testCheckFalseWihtoutRequestID() {
+        assertFalse(PceComplianceCheck.check(PceTestData.getEmptyPCERequestServiceNameWithOutRequestId()).hasPassed());
     }
 }
index 469b3c255cf2d707d9adaddbe9a37fc89baf8a6f..4399afda1da3930a672d3f1415044424c2498b9f 100644 (file)
@@ -8,18 +8,19 @@
 
 package org.opendaylight.transportpce.pce;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.transportpce.common.fixedflex.GridConstant;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
-import org.opendaylight.transportpce.common.network.RequestProcessor;
 import org.opendaylight.transportpce.pce.constraints.PceConstraints;
 import org.opendaylight.transportpce.pce.constraints.PceConstraintsCalc;
 import org.opendaylight.transportpce.pce.networkanalyzer.MapUtils;
@@ -29,7 +30,7 @@ import org.opendaylight.transportpce.pce.networkanalyzer.PceResult;
 import org.opendaylight.transportpce.pce.utils.NodeUtils;
 import org.opendaylight.transportpce.pce.utils.PceTestData;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeBuilder;
@@ -48,55 +49,55 @@ public class PcePathDescriptionTests extends AbstractTest {
     @Mock
     private PortMapping portMapping;
 
-    @Before
+    @BeforeEach
     public void setUp() {
         MockitoAnnotations.openMocks(this);
         // Build Link
-        link = NodeUtils.createRoadmToRoadm("OpenROADM-3-2-DEG1",
-                "OpenROADM-3-1-DEG1",
-                "DEG1-TTP-TX", "DEG1-TTP-RX").build();
+        link = NodeUtils
+            .createRoadmToRoadm("OpenROADM-3-2-DEG1", "OpenROADM-3-1-DEG1", "DEG1-TTP-TX", "DEG1-TTP-RX")
+            .build();
 
         //  Link link=genereateLinkBuilder();
 
         NodeBuilder node1Builder = NodeUtils.getNodeBuilder(NodeUtils.geSupportingNodes());
         node = node1Builder.setNodeId(new NodeId("test")).build();
         PceOpticalNode pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
-                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50,
+                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50,
                 GridConstant.SLOT_WIDTH_50);
         PceOpticalNode pceOpticalNode2 = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
-                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50,
+                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50,
                 GridConstant.SLOT_WIDTH_50);
 
         pceLink = new PceLink(link, pceOpticalNode, pceOpticalNode2);
-        pceLink.setClient("XPONDER-CLIENT");
+        pceLink.setClientA("XPONDER-CLIENT");
 
         pceResult = new PceResult();
         pceResult.setRC("200");
         pceResult.setRate(Long.valueOf(1));
         pceResult.setServiceType(StringConstants.SERVICE_TYPE_100GE_T);
-        Map<LinkId, PceLink> map = Map.of(new LinkId("OpenROADM-3-1-DEG1-to-OpenROADM-3-2-DEG1"), pceLink);
-        pcePathDescription = new PcePathDescription(List.of(pceLink),
-                map, pceResult);
+        pceResult.setMaxFreq(new BigDecimal("195.900"));
+        pceResult.setMinFreq(new BigDecimal("191.101"));
+        Map<LinkId, PceLink> map = Map.of(
+            new LinkId("OpenROADM-3-2-DEG1-DEG1-TTP-TXtoOpenROADM-3-1-DEG1-DEG1-TTP-RX"), pceLink,
+            new LinkId("OpenROADM-3-1-DEG1-DEG1-TTP-RXtoOpenROADM-3-2-DEG1-DEG1-TTP-TX"), pceLink);
+        pcePathDescription = new PcePathDescription(List.of(pceLink), map, pceResult);
     }
 
-    // TODO fix opposite link
-    @Test(expected = Exception.class)
-    public void buildDescriptionsTest() {
-
+    @Test
+    void buildDescriptionsTest() {
         pcePathDescription.buildDescriptions();
-        Assert.assertEquals(pcePathDescription.getReturnStructure().getMessage(), "No path available by PCE");
+        assertEquals(pcePathDescription.getReturnStructure().getMessage(), "Path is calculated by PCE");
     }
 
     @Test
-    public void mapUtil() {
+    void mapUtil() {
         PceConstraints pceConstraintsCalc = new PceConstraintsCalc(
-                    PceTestData.getPCERequest(),
-                    new NetworkTransactionImpl(new RequestProcessor(getDataBroker())))
-                .getPceHardConstraints();
+            PceTestData.getPCERequest(), new NetworkTransactionImpl(getDataBroker())).getPceHardConstraints();
         MapUtils.mapDiversityConstraints(List.of(node), List.of(link), pceConstraintsCalc);
         MapUtils.getSupLink(link);
         MapUtils.getAllSupNode(node);
         MapUtils.getSRLGfromLink(link);
     }
-
 }
index 047341ac4fa20c1c6b4bc7c84aefa56b119a6f3f..bcc21d6f370f1c48f835bc26acc199c05c1ae80c 100644 (file)
@@ -7,37 +7,38 @@
  */
 package org.opendaylight.transportpce.pce;
 
-
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.lenient;
 import static org.mockito.Mockito.when;
 
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import java.util.concurrent.ExecutionException;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
-import org.opendaylight.transportpce.common.network.RequestProcessor;
 import org.opendaylight.transportpce.pce.gnpy.JerseyServer;
 import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumer;
 import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumerImpl;
 import org.opendaylight.transportpce.pce.utils.PceTestData;
-import org.opendaylight.transportpce.pce.utils.PceTestUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfo;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfoBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfo;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfoBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes;
 
-@RunWith(MockitoJUnitRunner.class)
+
+@ExtendWith(MockitoExtension.class)
 public class PceSendingPceRPCsTest extends AbstractTest {
 
     private PceSendingPceRPCs pceSendingPceRPCs;
@@ -52,61 +53,59 @@ public class PceSendingPceRPCsTest extends AbstractTest {
     private PortMapping portMapping;
 
 
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp() throws InterruptedException, ExecutionException {
         this.dataBroker = getNewDataBroker();
-        networkTransaction = new NetworkTransactionImpl(new RequestProcessor(this.dataBroker));
-        PceTestUtils.writeNetworkInDataStore(this.dataBroker);
-        gnpyConsumer = new GnpyConsumerImpl("http://localhost:9998",
-                "mylogin", "mypassword", getDataStoreContextUtil().getBindingDOMCodecServices());
-        pceSendingPceRPCs = new PceSendingPceRPCs(PceTestData.getPCE_test1_request_54(),
-                        networkTransaction, gnpyConsumer, portMapping);
-        mapping = new MappingBuilder().setLogicalConnectionPoint("logicalConnectionPoint").setPortQual("xpdr-client")
+        networkTransaction = new NetworkTransactionImpl(this.dataBroker);
+        gnpyConsumer = new GnpyConsumerImpl(
+            "http://localhost:9998", "mylogin", "mypassword", getDataStoreContextUtil().getBindingDOMCodecServices());
+        pceSendingPceRPCs = new PceSendingPceRPCs(
+            PceTestData.getPCE_test1_request_54(), networkTransaction, gnpyConsumer, portMapping);
+        mapping = new MappingBuilder()
+            .setLogicalConnectionPoint("logicalConnectionPoint")
+            .setPortQual("xpdr-client")
             .build();
         NodeInfo info = new NodeInfoBuilder().setNodeType(NodeTypes.Xpdr).build();
         Nodes node = new NodesBuilder().withKey(new NodesKey("node")).setNodeId("node").setNodeInfo(info).build();
-        when(portMapping.getMapping(anyString(), anyString())).thenReturn(mapping);
-        when(portMapping.getNode(anyString())).thenReturn(node);
+        lenient().when(portMapping.getMapping(anyString(), anyString())).thenReturn(mapping);
+        lenient().when(portMapping.getNode(anyString())).thenReturn(node);
     }
 
     @Test
-    public void cancelResourceReserve() {
+    void cancelResourceReserve() {
         pceSendingPceRPCs.cancelResourceReserve();
-        Assert.assertTrue("Success should equal to true", pceSendingPceRPCs.getSuccess());
+        assertTrue(pceSendingPceRPCs.getSuccess(), "Success should equal to true");
     }
 
     @Test
-    public void pathComputationTest() throws Exception {
+    void pathComputationTest() throws Exception {
         jerseyServer.setUp();
-        pceSendingPceRPCs =
-                new PceSendingPceRPCs(PceTestData.getGnpyPCERequest("XPONDER-1", "XPONDER-2"),
-                        networkTransaction, gnpyConsumer, portMapping);
+        pceSendingPceRPCs = new PceSendingPceRPCs(PceTestData.getGnpyPCERequest("XPONDER-1", "XPONDER-2"),
+                networkTransaction, gnpyConsumer, portMapping);
         when(portMapping.getMapping(anyString(), anyString())).thenReturn(mapping);
         pceSendingPceRPCs.pathComputation();
-        Assert.assertTrue(gnpyConsumer.isAvailable());
+        assertTrue(gnpyConsumer.isAvailable());
         jerseyServer.tearDown();
-
     }
 
     @Test
-    public void checkMessage() {
-        Assert.assertNull(pceSendingPceRPCs.getMessage());
+    void checkMessage() {
+        assertNull(pceSendingPceRPCs.getMessage());
     }
 
+
     @Test
-    public void responseCodeTest() {
-        Assert.assertNull(pceSendingPceRPCs.getResponseCode());
+    void responseCodeTest() {
+        assertNull(pceSendingPceRPCs.getResponseCode());
     }
 
     @Test
-    public void gnpyAtoZ() {
-        Assert.assertNull(pceSendingPceRPCs.getGnpyAtoZ());
+    void gnpyAtoZ() {
+        assertNull(pceSendingPceRPCs.getGnpyAtoZ());
     }
 
     @Test
-    public void getGnpyZtoA() {
-        Assert.assertNull(pceSendingPceRPCs.getGnpyZtoA());
+    void getGnpyZtoA() {
+        assertNull(pceSendingPceRPCs.getGnpyZtoA());
     }
-
-
 }
index 1c1470ebf61f4d2499c2afcabf262b8e3afb45a0..fa3b10a3054ce2f129142dba860edaf8413c5702 100644 (file)
@@ -7,27 +7,26 @@
  */
 package org.opendaylight.transportpce.pce;
 
-import org.junit.Assert;
-import org.junit.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
 
 public class SortPortsByNameTest {
 
     private SortPortsByName sortPortsByName = new SortPortsByName();
 
     @Test
-    public void compareTest() {
-        Assert.assertEquals(12, sortPortsByName.compare("value22", "valu10"));
+    void compareTest() {
+        assertEquals(12, sortPortsByName.compare("value22", "valu10"));
     }
 
     @Test
-    public void compareWithoutNUM() {
-        Assert.assertEquals(0, sortPortsByName.compare("value", "value"));
+    void compareWithoutNUM() {
+        assertEquals(0, sortPortsByName.compare("value", "value"));
     }
 
     @Test
-    public void compareLessThan() {
-        Assert.assertEquals(-11, sortPortsByName.compare("value1", "value12"));
+    void compareLessThan() {
+        assertEquals(-11, sortPortsByName.compare("value1", "value12"));
     }
-
-
-}
+}
\ No newline at end of file
diff --git a/pce/src/test/java/org/opendaylight/transportpce/pce/constraints/OperatorConstraintsTest.java b/pce/src/test/java/org/opendaylight/transportpce/pce/constraints/OperatorConstraintsTest.java
new file mode 100644 (file)
index 0000000..4fbab35
--- /dev/null
@@ -0,0 +1,105 @@
+/*
+ * Copyright © 2024 Orange Labs, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.pce.constraints;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.nio.charset.StandardCharsets;
+import java.util.BitSet;
+import java.util.concurrent.ExecutionException;
+import org.eclipse.jdt.annotation.NonNull;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.transportpce.common.fixedflex.GridConstant;
+import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
+import org.opendaylight.transportpce.pce.graph.PceGraphTest;
+import org.opendaylight.transportpce.pce.utils.PceTestUtils;
+import org.opendaylight.transportpce.test.AbstractTest;
+import org.opendaylight.transportpce.test.converter.DataObjectConverter;
+import org.opendaylight.transportpce.test.converter.JSONDataObjectConverter;
+//import org.opendaylight.yang.gen.v1.http.org.openroadm.controller.customization.rev230526.controller.parameters
+//.SpectrumFilling;
+//import org.opendaylight.yang.gen.v1.http.org.openroadm.controller.customization.rev230526.controller.parameters
+//.spectrum.filling.SpectrumFillingRules;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ControllerBehaviourSettings;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+@ExtendWith(MockitoExtension.class)
+public class OperatorConstraintsTest extends AbstractTest {
+
+    private static final Logger LOG = LoggerFactory.getLogger(PceGraphTest.class);
+    private NetworkTransactionImpl networkTransaction;
+    private static final String SPEC_FILLING_FILE = "src/test/resources/spectrum-filling-rule1.json";
+//    private static SpectrumFillingRules sfRule;
+    private static ControllerBehaviourSettings cbSettings;
+    private OperatorConstraints opConstraints;
+    @Mock
+    private BindingDOMCodecServices bindingDOMCodecServices;
+    private DataBroker dataBroker;
+
+    @BeforeEach
+    void setUp() throws InterruptedException, ExecutionException {
+        this.dataBroker = getNewDataBroker();
+        networkTransaction = new NetworkTransactionImpl(this.dataBroker);
+        opConstraints = new OperatorConstraints(networkTransaction);
+        PceTestUtils.writeNetworkInDataStore(this.dataBroker);
+        DataObjectConverter dataObjectConverter = JSONDataObjectConverter
+            .createWithDataStoreUtil(getDataStoreContextUtil());
+        // The Spectrum filling rules associated with CustomerProfileLamda1 is populated from a file in the Data Store
+        try (Reader reader = new FileReader(SPEC_FILLING_FILE, StandardCharsets.UTF_8)) {
+            NormalizedNode normalizedNode = dataObjectConverter.transformIntoNormalizedNode(reader).orElseThrow();
+            cbSettings = (ControllerBehaviourSettings) getDataStoreContextUtil()
+                .getBindingDOMCodecServices()
+                .fromNormalizedNode(
+                    YangInstanceIdentifier.of(ControllerBehaviourSettings.QNAME), normalizedNode)
+                .getValue();
+            InstanceIdentifier<ControllerBehaviourSettings> sfIID =
+                InstanceIdentifier
+                    .builder(ControllerBehaviourSettings.class)
+//                    .child(SpectrumFilling.class)
+//                    .child(SpectrumFillingRules.class)
+                    .build();
+            @NonNull
+            WriteTransaction newWriteOnlyTransaction = dataBroker.newWriteOnlyTransaction();
+            newWriteOnlyTransaction.put(LogicalDatastoreType.CONFIGURATION, sfIID, cbSettings);
+            newWriteOnlyTransaction.commit().get();
+        } catch (IOException e) {
+            LOG.error("Cannot load Spectrum-Filling-Rules in Service DS ", e);
+            fail("Cannot load Spectrum-Filling-Rules");
+        }
+    }
+
+
+    @Test
+    void checkSpecttrumFilling() {
+        BitSet referenceBitSet = new BitSet(GridConstant.EFFECTIVE_BITS);
+        referenceBitSet.set(0, GridConstant.EFFECTIVE_BITS, false);
+        referenceBitSet.set(0, 8, true);
+        assertEquals(referenceBitSet, opConstraints.getBitMapConstraint("CustomerProfileLamda1"));
+        referenceBitSet.set(8, GridConstant.EFFECTIVE_BITS, true);
+        referenceBitSet.set(0, 8, false);
+        assertEquals(referenceBitSet, opConstraints.getBitMapConstraint("otherCustomer"));
+    }
+
+}
index 543996d77f2773a440947e4aed47efe018f2c6ea..ac07c4eddc0caddcf3805c265515554975d5a522 100644 (file)
@@ -8,12 +8,15 @@
 
 package org.opendaylight.transportpce.pce.constraints;
 
-import org.junit.Before;
-import org.junit.Test;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.util.NoSuchElementException;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
-import org.opendaylight.transportpce.common.network.RequestProcessor;
 import org.opendaylight.transportpce.pce.utils.PceTestData;
 import org.opendaylight.transportpce.pce.utils.PceTestUtils;
 import org.opendaylight.transportpce.pce.utils.TransactionUtils;
@@ -24,54 +27,57 @@ public class PceConstraintsCalcTest extends AbstractTest {
     private DataBroker dataBroker = getDataBroker();
 
     //TODO: review this test class. May be miss few assert.
-    @Before
-    public void setup() throws Exception {
+    @BeforeEach
+    void setup() throws Exception {
         // networkTransactionService = Mockito.mock(NetworkTransactionService.class);
         PceTestUtils.writeNetworkIntoDataStore(dataBroker, getDataStoreContextUtil(),
                 TransactionUtils.getNetworkForSpanLoss());
-        networkTransactionService = new NetworkTransactionImpl(new RequestProcessor(dataBroker));
+        networkTransactionService = new NetworkTransactionImpl(dataBroker);
     }
 
     @Test
-    public void testNoHardOrSoftConstrainsExists() {
+    void testNoHardOrSoftConstrainsExists() {
         PceTestData.getPCE_test2_request_54().getSoftConstraints();
         new PceConstraintsCalc(PceTestData.getEmptyPCERequest(), networkTransactionService);
     }
 
     @Test()
-    public void testHardConstrainsExists() {
+    void testHardConstrainsExists() {
         new PceConstraintsCalc(
             PceTestData.getPCE_simpletopology_test1_requestSetHardAndSoftConstrains(),
             networkTransactionService);
     }
 
     @Test()
-    public void testHardConstrainsExists1() {
+    void testHardConstrainsExists1() {
         new PceConstraintsCalc(
             PceTestData.getPathComputationRequestInputWithCoRoutingOrGeneral(),
             networkTransactionService);
     }
 
     @Test
-    public void testSoftConstrainsExists() {
+    void testSoftConstrainsExists() {
         new PceConstraintsCalc(PceTestData.getPCERequest(), networkTransactionService);
     }
 
-    @Test(expected = Exception.class)
-    public void testHardConstrainsExists2() {
-        new PceConstraintsCalc(
-            PceTestData.build_diversity_from_request(PceTestData.getPCERequest()),
-            networkTransactionService);
+    //TODO: See if this test is relevant.
+    @Test
+    void testHardConstrainsExists2() {
+        Exception exception = assertThrows(NoSuchElementException.class, () -> {
+            new PceConstraintsCalc(
+                    PceTestData.build_diversity_from_request(PceTestData.getPCERequest()),
+                    networkTransactionService);
+        });
+        assertTrue(exception.getMessage().contains("No value present"));
     }
 
     @Test()
-    public void testHardConstrainsExists3() {
+    void testHardConstrainsExists3() {
         new PceConstraintsCalc(PceTestData.getEmptyPCERequestServiceNameWithRequestId(), networkTransactionService);
     }
 
     @Test()
-    public void testHardConstrainsExists4() {
+    void testHardConstrainsExists4() {
         new PceConstraintsCalc(PceTestData.getPCE_test2_request_54(), networkTransactionService);
     }
-
 }
index d6b3bc94dd5e2917b6bf465037851c5324f91215..f2c7719bb016854d69abcad1747e20dd339c23e5 100644 (file)
 
 package org.opendaylight.transportpce.pce.constraints;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import java.util.ArrayList;
 import java.util.List;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.transportpce.pce.networkanalyzer.PceOpticalNode;
 import org.opendaylight.transportpce.test.AbstractTest;
 
 public class PceConstraintsTest extends AbstractTest {
     private static PceConstraints pceConstraints = new PceConstraints();
 
-    @Before
-    public void setup() {
+    @BeforeEach
+    void setup() {
         pceConstraints = new PceConstraints();
     }
 
     @Test
-    public void setAndGetMaxLatencyTest() {
-        Assert.assertEquals(-1, pceConstraints.getMaxLatency().intValue());
+    void setAndGetMaxLatencyTest() {
+        assertEquals(-1, pceConstraints.getMaxLatency().intValue());
         pceConstraints.setMaxLatency(-2L);
-        Assert.assertEquals(-2, pceConstraints.getMaxLatency().intValue());
+        assertEquals(-2, pceConstraints.getMaxLatency().intValue());
     }
 
     @Test
-    public void setAndGetExcludeSupNodesTest() {
-        Assert.assertEquals(0, pceConstraints.getExcludeSupNodes().size());
+    void setAndGetExcludeSupNodesTest() {
+        assertEquals(0, pceConstraints.getExcludeSupNodes().size());
         List<String> nodes = new ArrayList<>();
         nodes.add("test");
         pceConstraints.setExcludeSupNodes(nodes);
-        Assert.assertEquals(1, pceConstraints.getExcludeSupNodes().size());
+        assertEquals(1, pceConstraints.getExcludeSupNodes().size());
     }
 
     @Test
-    public void setAndGetExcludeSRLGTest() {
-        Assert.assertEquals(0, pceConstraints.getExcludeSRLG().size());
+    void setAndGetExcludeSRLGTest() {
+        assertEquals(0, pceConstraints.getExcludeSRLG().size());
         List<Long> nodes = new ArrayList<>();
         nodes.add(1L);
         pceConstraints.setExcludeSRLG(nodes);
-        Assert.assertEquals(1, pceConstraints.getExcludeSRLG().size());
+        assertEquals(1, pceConstraints.getExcludeSRLG().size());
     }
 
     @Test
-    public void setAndGetExcludeCLLITest() {
-        Assert.assertEquals(0, pceConstraints.getExcludeCLLI().size());
+    void setAndGetExcludeCLLITest() {
+        assertEquals(0, pceConstraints.getExcludeCLLI().size());
         List<String> nodes = new ArrayList<>();
         nodes.add("test");
         pceConstraints.setExcludeCLLI(nodes);
-        Assert.assertEquals(1, pceConstraints.getExcludeCLLI().size());
+        assertEquals(1, pceConstraints.getExcludeCLLI().size());
     }
 
     @Test
-    public void setAndGetExcludeClliNodesTest() {
-        Assert.assertEquals(0, pceConstraints.getExcludeClliNodes().size());
+    void setAndGetExcludeClliNodesTest() {
+        assertEquals(0, pceConstraints.getExcludeClliNodes().size());
         List<String> nodes = new ArrayList<>();
         nodes.add("test");
         pceConstraints.setExcludeClliNodes(nodes);
-        Assert.assertEquals(1, pceConstraints.getExcludeClliNodes().size());
+        assertEquals(1, pceConstraints.getExcludeClliNodes().size());
     }
 
     @Test
-    public void setAndGetExcludeSrlgLinksTest() {
-        Assert.assertEquals(0, pceConstraints.getExcludeSrlgLinks().size());
+    void setAndGetExcludeSrlgLinksTest() {
+        assertEquals(0, pceConstraints.getExcludeSrlgLinks().size());
         List<String> nodes = new ArrayList<>();
         nodes.add("test");
         pceConstraints.setExcludeSrlgLinks(nodes);
-        Assert.assertEquals(1, pceConstraints.getExcludeSrlgLinks().size());
+        assertEquals(1, pceConstraints.getExcludeSrlgLinks().size());
     }
 
     @Test
-    public void setAndGetExcludeNodesTest() {
-        Assert.assertEquals(0, pceConstraints.getExcludeNodes().size());
+    void setAndGetExcludeNodesTest() {
+        assertEquals(0, pceConstraints.getExcludeNodes().size());
         List<String> nodes = new ArrayList<>();
         nodes.add("test");
         pceConstraints.setExcludeNodes(nodes);
-        Assert.assertEquals(1, pceConstraints.getExcludeNodes().size());
+        assertEquals(1, pceConstraints.getExcludeNodes().size());
     }
 
     @Test
-    public void setAndGetIncludeNodesTest() {
-        Assert.assertEquals(0, pceConstraints.getIncludeNodes().size());
+    void setAndGetIncludeNodesTest() {
+        assertEquals(0, pceConstraints.getIncludeNodes().size());
         List<String> nodes = new ArrayList<>();
         nodes.add("test");
         pceConstraints.setIncludeNodes(nodes);
-        Assert.assertEquals(1, pceConstraints.getIncludeNodes().size());
+        assertEquals(1, pceConstraints.getIncludeNodes().size());
     }
 
     @Test
-    public void getTypeAndNameOfResourcePairTest() {
+    void getTypeAndNameOfResourcePairTest() {
         PceConstraints.ResourcePair resourcePair = new PceConstraints
                 .ResourcePair(PceConstraints.ResourceType.CLLI, "test");
-        Assert.assertEquals(resourcePair.getType(), PceConstraints.ResourceType.CLLI);
-        Assert.assertEquals("test", resourcePair.getName());
-
+        assertEquals(resourcePair.getType(), PceConstraints.ResourceType.CLLI);
+        assertEquals("test", resourcePair.getName());
     }
 
 
     @Test
-    public void getIncludePceNodesTest() {
-        Assert.assertTrue(pceConstraints.getIncludePceNodes().size() == 0);
+    void getIncludePceNodesTest() {
+        assertTrue(pceConstraints.getIncludePceNodes().size() == 0);
         pceConstraints.setIncludePceNode(new PceOpticalNode(null, null, null, null, null, null, null, null));
-        Assert.assertTrue(pceConstraints.getIncludePceNodes().size() == 1);
-
+        assertTrue(pceConstraints.getIncludePceNodes().size() == 1);
     }
 
     @Test
-    public void getListToIncludeTest() {
-        Assert.assertTrue(pceConstraints.getListToInclude().size() == 0);
+    void getListToIncludeTest() {
+        assertTrue(pceConstraints.getListToInclude().size() == 0);
         PceConstraints.ResourcePair resourcePair = new PceConstraints
                 .ResourcePair(PceConstraints.ResourceType.SRLG, "test");
         pceConstraints.setListToInclude(resourcePair);
-        Assert.assertTrue(pceConstraints.getListToInclude().size() == 1);
-        Assert.assertTrue(pceConstraints.getSRLGnames().size() == 1);
-
+        assertTrue(pceConstraints.getListToInclude().size() == 1);
+        assertTrue(pceConstraints.getSRLGnames().size() == 1);
     }
-
 }
-
-
index 4c94f0628456aa486b3e4b4cb914949c365f93c4..3a52ac2249c637b44b562597477e6c67f273efaf 100644 (file)
@@ -7,9 +7,11 @@
  */
 package org.opendaylight.transportpce.pce.gnpy;
 
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
+
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import com.google.gson.stream.JsonReader;
 import java.io.FileNotFoundException;
@@ -23,16 +25,13 @@ import java.util.concurrent.ExecutionException;
 import org.glassfish.grizzly.http.server.HttpServer;
 import org.glassfish.jersey.grizzly2.httpserver.GrizzlyHttpServerFactory;
 import org.glassfish.jersey.server.ResourceConfig;
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.NetworkUtils;
 import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
-import org.opendaylight.transportpce.common.network.RequestProcessor;
 import org.opendaylight.transportpce.pce.constraints.PceConstraints;
 import org.opendaylight.transportpce.pce.constraints.PceConstraintsCalc;
 import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyConsumer;
@@ -41,24 +40,23 @@ import org.opendaylight.transportpce.pce.gnpy.consumer.GnpyStub;
 import org.opendaylight.transportpce.pce.utils.JsonUtil;
 import org.opendaylight.transportpce.pce.utils.PceTestData;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZ;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZKey;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToA;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToABuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToAKey;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.Resource;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.ResourceBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.TerminationPoint;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.TerminationPointBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZ;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToA;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToABuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToAKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.Resource;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.ResourceBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.TerminationPoint;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.TerminationPointBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -72,7 +70,7 @@ public class GnpyUtilitiesImplTest extends AbstractTest {
     private GnpyConsumer gnpyConsumer;
 
     public GnpyUtilitiesImplTest() throws IOException {
-        networkTransaction = new NetworkTransactionImpl(new RequestProcessor(getDataBroker()));
+        networkTransaction = new NetworkTransactionImpl(getDataBroker());
         JsonReader networkReader = null;
         JsonReader topoReader = null;
 
@@ -82,15 +80,13 @@ public class GnpyUtilitiesImplTest extends AbstractTest {
                     StandardCharsets.UTF_8);
 
             networkReader = new JsonReader(gnpyNetwork);
-            Networks networks = (Networks) JsonUtil.getInstance().getDataObjectFromJson(networkReader,
-                    QName.create("urn:ietf:params:xml:ns:yang:ietf-network", "2018-02-26", "networks"));
+            Networks networks = (Networks) JsonUtil.getInstance().getDataObjectFromJson(networkReader, Networks.QNAME);
             saveOpenRoadmNetwork(networks.getNetwork().values().iterator().next(), NetworkUtils.UNDERLAY_NETWORK_ID);
             // load openroadm-topology
             Reader gnpyTopo = new FileReader("src/test/resources/gnpy/gnpy_topology.json",
                     StandardCharsets.UTF_8);
             topoReader = new JsonReader(gnpyTopo);
-            networks = (Networks) JsonUtil.getInstance().getDataObjectFromJson(topoReader,
-                    QName.create("urn:ietf:params:xml:ns:yang:ietf-network", "2018-02-26", "networks"));
+            networks = (Networks) JsonUtil.getInstance().getDataObjectFromJson(topoReader, Networks.QNAME);
             saveOpenRoadmNetwork(networks.getNetwork().values().iterator().next(), NetworkUtils.OVERLAY_NETWORK_ID);
         } catch (FileNotFoundException | InterruptedException | ExecutionException e) {
             LOG.error("Cannot init test ", e);
@@ -111,21 +107,21 @@ public class GnpyUtilitiesImplTest extends AbstractTest {
 
     }
 
-    @Before
-    public void initConsumer() {
+    @BeforeEach
+    void initConsumer() {
         gnpyConsumer = new GnpyConsumerImpl("http://localhost:9998", "mylogin", "mypassword",
                 getDataStoreContextUtil().getBindingDOMCodecServices());
     }
 
-    @BeforeClass
-    public static void init() {
+    @BeforeAll
+    static void init() {
         // here we cannot use JerseyTest as we already extends AbstractTest
         final ResourceConfig rc = new ResourceConfig(GnpyStub.class);
         httpServer = GrizzlyHttpServerFactory.createHttpServer(URI.create("http://localhost:9998"), rc);
     }
 
-    @AfterClass
-    public static void tearDown() {
+    @AfterAll
+    static void tearDown() {
         httpServer.shutdownNow();
     }
 
@@ -133,35 +129,31 @@ public class GnpyUtilitiesImplTest extends AbstractTest {
             throws InterruptedException, ExecutionException {
         InstanceIdentifier<Network> nwInstanceIdentifier = InstanceIdentifier.builder(Networks.class)
                 .child(Network.class, new NetworkKey(new NetworkId(networkId))).build();
-        WriteTransaction dataWriteTransaction = getDataBroker().newWriteOnlyTransaction();
-        dataWriteTransaction.put(LogicalDatastoreType.CONFIGURATION, nwInstanceIdentifier, network);
-        dataWriteTransaction.commit().get();
+        networkTransaction.put(LogicalDatastoreType.CONFIGURATION, nwInstanceIdentifier, network);
+        networkTransaction.commit().get();
     }
 
     @Test
-    public void askNewPathFromGnpyNullResultTest() throws Exception {
+    void askNewPathFromGnpyNullResultTest() throws Exception {
         gnpyUtilitiesImpl = new GnpyUtilitiesImpl(networkTransaction,
                 PceTestData.getGnpyPCERequest("XPONDER-1", "XPONDER-2"),
                 gnpyConsumer);
-        assertNull("No hard constraints should be available", gnpyUtilitiesImpl.askNewPathFromGnpy(null));
-
+        assertNull(gnpyUtilitiesImpl.askNewPathFromGnpy(null), "No hard constraints should be available");
     }
 
     @Test
-    public void askNewPathFromGnpyTest() throws Exception {
+    void askNewPathFromGnpyTest() throws Exception {
         gnpyUtilitiesImpl = new GnpyUtilitiesImpl(networkTransaction,
                 PceTestData.getGnpyPCERequest("XPONDER-3", "XPONDER-4"),
                 gnpyConsumer);
         PceConstraintsCalc constraints = new PceConstraintsCalc(PceTestData.getPCE_simpletopology_test1_request(),
                 networkTransaction);
         PceConstraints pceHardConstraints = constraints.getPceHardConstraints();
-        assertNotNull("Hard constraints should be available", gnpyUtilitiesImpl.askNewPathFromGnpy(pceHardConstraints));
-
-
+        assertNotNull(gnpyUtilitiesImpl.askNewPathFromGnpy(pceHardConstraints), "Hard constraints should be available");
     }
 
     @Test
-    public void verifyComputationByGnpyTest() throws Exception {
+    void verifyComputationByGnpyTest() throws Exception {
         // build AtoZ
         AToZDirectionBuilder atoZDirectionBldr = buildAtZ();
         // build ZtoA
@@ -176,7 +168,7 @@ public class GnpyUtilitiesImplTest extends AbstractTest {
         boolean result = gnpyUtilitiesImpl.verifyComputationByGnpy(atoZDirectionBldr.build(),
                 ztoADirectionBldr.build(),
                 pceHardConstraints);
-        Assert.assertFalse("Gnpy Computation should be false",result);
+        assertFalse(result, "Gnpy Computation should be false");
     }
 
     private AToZDirectionBuilder buildAtZ() {
@@ -186,12 +178,10 @@ public class GnpyUtilitiesImplTest extends AbstractTest {
                 .build();
         Resource clientResource = new ResourceBuilder().setResource(stp).build();
         AToZ firstResource = new AToZBuilder().setId("tpName").withKey(clientKey).setResource(clientResource).build();
-
         return new AToZDirectionBuilder()
                 .setRate(Uint32.valueOf(100))
                 .setAToZ(Map.of(firstResource.key(),firstResource))
                 .setAToZWavelengthNumber(Uint32.valueOf(0));
-
     }
 
     private ZToADirectionBuilder buildZtoA() {
@@ -205,6 +195,5 @@ public class GnpyUtilitiesImplTest extends AbstractTest {
                 .setRate(Uint32.valueOf(100))
                 .setZToA(Map.of(firstResource.key(),firstResource))
                 .setZToAWavelengthNumber(Uint32.valueOf(0));
-
     }
 }
index c8fae69daab85751568e4a4a8c88e455a72e3ce2..95ba0fa7d1c9adf7fe3bafd89dd4625314cdaede 100644 (file)
@@ -7,8 +7,9 @@
  */
 package org.opendaylight.transportpce.pce.gnpy.consumer;
 
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.IOException;
 import java.nio.file.Files;
@@ -16,11 +17,11 @@ import java.nio.file.Paths;
 import javax.ws.rs.core.Application;
 import org.glassfish.jersey.server.ResourceConfig;
 import org.glassfish.jersey.test.JerseyTest;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.transportpce.common.converter.JsonStringConverter;
 import org.opendaylight.transportpce.test.AbstractTest;
 import org.opendaylight.yang.gen.v1.gnpy.gnpy.api.rev220221.Request;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.Result;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.Result;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
@@ -39,16 +40,16 @@ public class GnpyConsumerTest extends JerseyTest {
     }
 
     @Test
-    public void isAvailableTest() {
+    void isAvailableTest() {
         GnpyConsumer gnpyConsumer = new GnpyConsumerImpl("http://localhost:9998",
                 "mylogin",
                 "mypassword",
                 AbstractTest.getDataStoreContextUtil().getBindingDOMCodecServices());
-        assertTrue("Gnpy should be available", gnpyConsumer.isAvailable());
+        assertTrue(gnpyConsumer.isAvailable(), "Gnpy should be available");
     }
 
     @Test
-    public void computePathsTest() throws IOException {
+    void computePathsTest() throws IOException {
         GnpyConsumer gnpyConsumer = new GnpyConsumerImpl("http://localhost:9998",
                 "mylogin",
                 "mypassword",
@@ -61,6 +62,6 @@ public class GnpyConsumerTest extends JerseyTest {
                         JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02);
         Result result = gnpyConsumer.computePaths(request);
         LOG.info("Response received {}", result);
-        assertNotNull("Result should not be null", result);
+        assertNotNull(result, "Result should not be null");
     }
 }
index aa6e86065225bd283cc524629848c0ed5db4f704..c7dfe59a58acae99fe060b2b1c87083240607a4c 100644 (file)
@@ -24,7 +24,7 @@ import javax.ws.rs.core.Response;
 import org.opendaylight.transportpce.common.converter.JsonStringConverter;
 import org.opendaylight.transportpce.test.AbstractTest;
 import org.opendaylight.yang.gen.v1.gnpy.gnpy.api.rev220221.Request;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.service.PathRequest;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.service.PathRequest;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
index 1eee3899c08dee5d875c4b931e1409dd2eed41cc..e6d9aa7e8f8afe1cde78b992311c0373fe8e36e9 100644 (file)
@@ -8,9 +8,10 @@
 
 package org.opendaylight.transportpce.pce.graph;
 
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.opendaylight.transportpce.common.StringConstants;
@@ -19,7 +20,7 @@ import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.pce.networkanalyzer.PceLink;
 import org.opendaylight.transportpce.pce.networkanalyzer.PceOpticalNode;
 import org.opendaylight.transportpce.pce.utils.NodeUtils;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
 
@@ -35,33 +36,27 @@ public class PceGraphEdgeTest {
     private PortMapping portMapping;
 
 
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp() {
         MockitoAnnotations.openMocks(this);
         // Build Link
-        link = NodeUtils.createRoadmToRoadm("OpenROADM-3-2-DEG1",
-                "OpenROADM-3-1-DEG1",
-                "DEG1-TTP-TX", "DEG1-TTP-RX").build();
-
-        //  Link link=genereateLinkBuilder();
+        link = NodeUtils.createRoadmToRoadm("OpenROADM-3-2-DEG1", "OpenROADM-3-1-DEG1", "DEG1-TTP-TX", "DEG1-TTP-RX")
+                .build();
         node =  NodeUtils.getNodeBuilder(NodeUtils.geSupportingNodes()).build();
-
         PceOpticalNode pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
                 OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
                 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         PceOpticalNode pceOpticalNode2 = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
                 OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
                 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
-
         pceLink = new PceLink(link, pceOpticalNode, pceOpticalNode2);
-        pceLink.setClient("XPONDER-CLIENT");
+        pceLink.setClientA("XPONDER-CLIENT");
 
         pceGraphEdge = new PceGraphEdge(pceLink);
     }
 
     @Test
-    public void getLink() {
-        Assert.assertEquals(pceGraphEdge.link().getLinkId(),
-                pceLink.getLinkId());
+    void getLink() {
+        assertEquals(pceGraphEdge.link().getLinkId(), pceLink.getLinkId());
     }
 }
index 8cde922ed16a8b3a8ccc6ed43bdd567d5c703f61..d85efa20c81a25fc668a1960331c71a0b90382f7 100644 (file)
 
 package org.opendaylight.transportpce.pce.graph;
 
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.gson.stream.JsonReader;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.nio.charset.StandardCharsets;
 import java.util.Map;
 import java.util.Optional;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mock;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import org.eclipse.jdt.annotation.NonNull;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.mockito.MockitoAnnotations;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.MountPoint;
+import org.opendaylight.mdsal.binding.api.MountPointService;
+import org.opendaylight.mdsal.binding.api.WriteTransaction;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.transportpce.common.NetworkUtils;
 import org.opendaylight.transportpce.common.StringConstants;
-import org.opendaylight.transportpce.common.fixedflex.GridConstant;
+import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
+import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
+import org.opendaylight.transportpce.common.mapping.PortMappingImpl;
+import org.opendaylight.transportpce.common.mapping.PortMappingVersion121;
+import org.opendaylight.transportpce.common.mapping.PortMappingVersion221;
+import org.opendaylight.transportpce.common.mapping.PortMappingVersion710;
+import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.pce.constraints.PceConstraints;
+import org.opendaylight.transportpce.pce.networkanalyzer.PceCalculation;
 import org.opendaylight.transportpce.pce.networkanalyzer.PceLink;
 import org.opendaylight.transportpce.pce.networkanalyzer.PceNode;
-import org.opendaylight.transportpce.pce.networkanalyzer.PceOpticalNode;
 import org.opendaylight.transportpce.pce.networkanalyzer.PceOtnNode;
 import org.opendaylight.transportpce.pce.networkanalyzer.PceResult;
+import org.opendaylight.transportpce.pce.utils.JsonUtil;
 import org.opendaylight.transportpce.pce.utils.NodeUtils;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev190531.ServiceFormat;
+import org.opendaylight.transportpce.test.AbstractTest;
+import org.opendaylight.transportpce.test.converter.DataObjectConverter;
+import org.opendaylight.transportpce.test.converter.JSONDataObjectConverter;
+import org.opendaylight.transportpce.test.stub.MountPointServiceStub;
+import org.opendaylight.transportpce.test.stub.MountPointStub;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PceConstraintMode;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.request.input.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.request.input.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.port.PortBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev230526.OpenroadmVersionType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.rev230526.Node1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrNetworkAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.CoRoutingBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co.routing.ServiceIdentifierListBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.HardConstraintsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.SoftConstraintsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.OperationalModeCatalog;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.PceMetric;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.RxDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.TxDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.handler.header.ServiceHandlerHeaderBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNode;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.node.SupportingNodeKey;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Uint32;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
-public class PceGraphTest {
-
-    private Link link = null;
+public class PceGraphTest extends AbstractTest {
+    private static final Logger LOG = LoggerFactory.getLogger(PceGraphTest.class);
+    private Link link1 = null;
     private Node node = null;
-    private PceLink pceLink = null;
+    private PceLink pceLink1 = null;
     private PceGraph pceGraph = null;
     private PceConstraints pceHardConstraints = null;
     private PceResult rc = null;
-    private PceOpticalNode pceOpticalNode = null;
-    private PceOpticalNode pceOpticalNode2 = null;
     private Map<NodeId, PceNode> allPceNodes = null;
-    private String deviceNodeId = "device node";
-    private String serviceType = "100GE";
-    @Mock
+    private Map<LinkId, PceLink> allPceLinks = null;
+    private static final String CATALOG_FILE = "src/test/resources/apidocCatalog12_0-OptSpecV5_1.json";
+    private static final String MAPPING_FILE = "src/test/resources/topologyData/portMapping2.json";
+    private static OperationalModeCatalog omCatalog;
+    private static org.opendaylight.yang.gen.v1.http.org.opendaylight
+            .transportpce.portmapping.rev231221.Network networkNode;
+    private DataBroker dataBroker;
+    private MountPoint mountPoint;
+    private MountPointService mountPointService;
+    private DeviceTransactionManager deviceTransactionManager;
+    private PortMappingVersion710 portMappingVersion710;
+    private PortMappingVersion221 portMappingVersion22;
+    private PortMappingVersion121 portMappingVersion121;
     private PortMapping portMapping;
+    private NetworkTransactionService netTransServ;
 
-    @Before
-    public void setUp() {
-        MockitoAnnotations.openMocks(this);
-        // Build Link
-        link = NodeUtils.createRoadmToRoadm("OpenROADM-3-2-DEG1",
-                "OpenROADM-3-1-DEG1",
-                "DEG1-TTP-TX", "DEG1-TTP-RX").build();
-
-        NodeId nodeId = new NodeId("OpenROADM-3-2-DEG1");
-        node = NodeUtils.getNodeBuilder(NodeUtils.geSupportingNodes())
-                .setNodeId(nodeId).withKey(new NodeKey(nodeId))
-                .build();
-        pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
-                OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
-                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
-        NodeId nodeId2 = new NodeId("OpenROADM-3-1-DEG1");
-        Node node2 = NodeUtils.getNodeBuilder(NodeUtils.geSupportingNodes())
-                .setNodeId(nodeId2).withKey(new NodeKey(nodeId2)).build();
-        pceOpticalNode2 = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node2,
-                OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
-                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
-        pceLink = new PceLink(link, pceOpticalNode, pceOpticalNode2);
-        pceLink.setClient("XPONDER-CLIENT");
-
-        pceLink.getDestId();
-        pceOpticalNode.addOutgoingLink(pceLink);
+    // Test of integration for PceGraph
+
+    @BeforeEach
+    void setUp() throws InterruptedException, ExecutionException {
+        // PortMapping is instantiated to create the mapping of the different nodes in the topology
+        this.dataBroker =  getNewDataBroker();
+        this.mountPoint = new MountPointStub(dataBroker);
+        this.mountPointService = new MountPointServiceStub(mountPoint);
+        this.deviceTransactionManager = new DeviceTransactionManagerImpl(mountPointService, 3000);
+        this.portMappingVersion22 = new PortMappingVersion221(dataBroker, deviceTransactionManager);
+        this.portMappingVersion121 = new PortMappingVersion121(dataBroker, deviceTransactionManager);
+        this.portMappingVersion710 = new PortMappingVersion710(dataBroker, deviceTransactionManager);
+        this.portMapping = new PortMappingImpl(dataBroker, this.portMappingVersion710,
+            this.portMappingVersion22, this.portMappingVersion121);
+        //  The catalog of operational mode needs to be loaded so that Ctalog primitives (CatlogUtils)
+        // can retrieve physical parameters of the nodes of the path
+        DataObjectConverter dataObjectConverter = JSONDataObjectConverter
+            .createWithDataStoreUtil(getDataStoreContextUtil());
+        try (Reader reader = new FileReader(CATALOG_FILE, StandardCharsets.UTF_8)) {
+            NormalizedNode normalizedNode = dataObjectConverter
+                .transformIntoNormalizedNode(reader)
+                .orElseThrow();
+            omCatalog = (OperationalModeCatalog) getDataStoreContextUtil()
+                .getBindingDOMCodecServices()
+                .fromNormalizedNode(
+                    YangInstanceIdentifier.of(OperationalModeCatalog.QNAME), normalizedNode)
+                .getValue();
+            @NonNull
+            WriteTransaction newWriteOnlyTransaction = dataBroker.newWriteOnlyTransaction();
+            newWriteOnlyTransaction
+                .put(LogicalDatastoreType.CONFIGURATION,
+                    InstanceIdentifier.create(OperationalModeCatalog.class),
+                    omCatalog);
+            newWriteOnlyTransaction.commit().get();
+        } catch (IOException e) {
+            LOG.error("Cannot load OpenROADM part of Operational Mode Catalog ", e);
+            fail("Cannot load openROADM operational modes ");
+        }
+        // The mapping corresponding to the topology is directly populated from a file in the Dta Store
+        try (Reader reader = new FileReader(MAPPING_FILE, StandardCharsets.UTF_8)) {
+            NormalizedNode normalizedNode = dataObjectConverter.transformIntoNormalizedNode(reader).orElseThrow();
+            networkNode = (org.opendaylight.yang.gen.v1.http.org.opendaylight
+                    .transportpce.portmapping.rev231221.Network) getDataStoreContextUtil()
+                .getBindingDOMCodecServices()
+                .fromNormalizedNode(
+                    YangInstanceIdentifier.of(org.opendaylight.yang.gen.v1.http.org.opendaylight
+                        .transportpce.portmapping.rev231221.Network.QNAME), normalizedNode)
+                .getValue();
+            @NonNull
+            WriteTransaction newWriteOnlyTransaction = dataBroker.newWriteOnlyTransaction();
+            newWriteOnlyTransaction
+                .put(LogicalDatastoreType.CONFIGURATION,
+                    InstanceIdentifier.create(org.opendaylight.yang.gen.v1.http.org.opendaylight
+                        .transportpce.portmapping.rev231221.Network.class),
+                    networkNode);
+            newWriteOnlyTransaction.commit().get();
+        } catch (IOException e) {
+            LOG.error("Cannot load OpenROADM part of Operational Mode Catalog ", e);
+            fail("Cannot load openROADM operational modes ");
+        }
 
+        MockitoAnnotations.openMocks(this);
+        // The topology (openROADM-Network and openROADM-topology layers) is loaded from a file
+        JsonReader networkReader = null;
+        JsonReader topoReader = null;
+        try {
+            // load openroadm-network
+            Reader gnpyNetwork = new FileReader("src/test/resources/gnpy/gnpy_network.json", StandardCharsets.UTF_8);
+            networkReader = new JsonReader(gnpyNetwork);
+            Networks networks = (Networks) JsonUtil.getInstance().getDataObjectFromJson(networkReader, Networks.QNAME);
+            saveOpenRoadmNetwork(networks.getNetwork().values().iterator().next(), NetworkUtils.UNDERLAY_NETWORK_ID);
+            // load openroadm-topology
+            Reader gnpyTopo = new FileReader("src/test/resources/topologyData/or-base-topology.json",
+                    StandardCharsets.UTF_8);
+            topoReader = new JsonReader(gnpyTopo);
+            networks = (Networks) JsonUtil.getInstance().getDataObjectFromJson(topoReader, Networks.QNAME);
+            saveOpenRoadmNetwork(networks.getNetwork().values().iterator().next(), NetworkUtils.OVERLAY_NETWORK_ID);
+        } catch (IOException | InterruptedException | ExecutionException e) {
+            LOG.error("Cannot init test ", e);
+            fail("Cannot init test ");
+        } finally {
+            try {
+                if (networkReader != null) {
+                    networkReader.close();
+                }
+                if (topoReader != null) {
+                    topoReader.close();
+                }
+            } catch (IOException e) {
+                LOG.warn("Cannot close reader ", e);
+            }
+        }
         // init PceHardContraints
         pceHardConstraints = new PceConstraints();
-        // pceHardConstraints.setp
-        allPceNodes = Map.of(nodeId, pceOpticalNode, nodeId2, pceOpticalNode2);
-        rc = new PceResult();
-        pceGraph = new PceGraph(pceOpticalNode, pceOpticalNode2, allPceNodes,
-                pceHardConstraints,
-                null, rc,
-                StringConstants.SERVICE_TYPE_ODU4);
+        this.rc = new PceResult();
+        this.netTransServ = new NetworkTransactionImpl(dataBroker);
+        LOG.info("The value of the mapping is {}", portMapping);
     }
 
+//                       TOPOLOGY ON WHICH TEST ARE BASED
+//           _____                      _____                       _____
+//          |     | 20dB, 100km,PMD 2  |     | 20dB,100km, PMD 2   |     |
+//          |  1  |____________________|  2  |_____________________|  5  |
+//          |     |                    |     |                     |     |
+//          |_____|                    |_____|                     |_____|
+//              |___________      10km    |   20dB,100km,PMD32    /   |  100 km
+//                          |      5dB    |   _________|_________/    |  25 dB
+//                          |     PMD32 __|__/                      __|__PMD 2.0
+//        28dB, 100km,PMD 0 |          |     | 25dB,100km, PMD 2   |     |
+//                          |__________|  3  |_____________________|  4  |
+//                                     |     |                     |     |
+//                                     |_____|                     |_____|
+//
     @Test
-    public void clacPath() {
+    void clacPath100GE() {
+        PceCalculation pceCalc = new PceCalculation(getPCE1Request(Uint32.valueOf(100), ServiceFormat.Ethernet,
+            "XPONDER-1", "Node1", "Client-1", "XPONDER-3", "Node3", "Client-1"),
+            netTransServ, pceHardConstraints, null, rc, portMapping);
+        pceCalc.retrievePceNetwork();
+        pceGraph = new PceGraph(pceCalc.getaendPceNode(), pceCalc.getzendPceNode(),
+            pceCalc.getAllPceNodes(), pceCalc.getAllPceLinks(), pceHardConstraints,
+            rc, StringConstants.SERVICE_TYPE_100GE_T, netTransServ, PceConstraintMode.Loose, null);
+        assertEquals(pceGraph.calcPath(), true);
+        assertEquals(Optional.ofNullable(pceGraph.getmargin()), Optional.ofNullable(3.0919881995992924));
+    }
 
-        Assert.assertEquals(pceGraph.calcPath(), true);
+    @Test
+    void clacPathOTUC2() {
+        PceCalculation pceCalc = new PceCalculation(getPCE1Request(Uint32.valueOf(200), ServiceFormat.Ethernet,
+            "XPONDER-1", "Node1", "XPDR-NW1-TX", "XPONDER-4", "Node4", "XPDR-NW1-RX"),
+            netTransServ, pceHardConstraints, null, rc, portMapping);
+        pceCalc.retrievePceNetwork();
+        pceGraph = new PceGraph(pceCalc.getaendPceNode(), pceCalc.getzendPceNode(),
+            pceCalc.getAllPceNodes(), pceCalc.getAllPceLinks(), pceHardConstraints,
+            rc, StringConstants.SERVICE_TYPE_OTUC2, netTransServ, PceConstraintMode.Loose, null);
+        assertEquals(pceGraph.calcPath(), true);
+        assertEquals(Optional.ofNullable(pceGraph.getmargin()), Optional.ofNullable(1.1559963686478447));
     }
 
     @Test
-    public void clacPathPropagationDelay() {
-        pceHardConstraints.setPceMetrics(PceMetric.PropagationDelay);
-        pceGraph.setConstrains(pceHardConstraints, null);
+    void clacPathOTUC3() {
+        PceCalculation pceCalc = new PceCalculation(getPCE1Request(Uint32.valueOf(300), ServiceFormat.Ethernet,
+            "XPONDER-1", "Node1", "XPDR-NW1-TX", "XPONDER-3", "Node3", "XPDR-NW1-RX"),
+            netTransServ, pceHardConstraints, null, rc, portMapping);
+        pceCalc.retrievePceNetwork();
+        pceGraph = new PceGraph(pceCalc.getaendPceNode(), pceCalc.getzendPceNode(),
+            pceCalc.getAllPceNodes(), pceCalc.getAllPceLinks(), pceHardConstraints,
+            rc, StringConstants.SERVICE_TYPE_OTUC3, netTransServ, PceConstraintMode.Loose, null);
+        assertEquals(pceGraph.calcPath(), true);
+        assertEquals(Optional.ofNullable(pceGraph.getmargin()), Optional.ofNullable(0.3351048800367167));
+    }
+
+    @Test
+    void clacUnfeasiblePath400GE() {
+        PceCalculation pceCalc = new PceCalculation(getPCE1Request(Uint32.valueOf(400), ServiceFormat.Ethernet,
+            "XPONDER-1", "Node1", "Client-1", "XPONDER-3", "Node3", "Client-1"),
+            netTransServ, pceHardConstraints, null, rc, portMapping);
+        pceCalc.retrievePceNetwork();
+        pceGraph = new PceGraph(pceCalc.getaendPceNode(), pceCalc.getzendPceNode(),
+            pceCalc.getAllPceNodes(), pceCalc.getAllPceLinks(), pceHardConstraints,
+            rc, StringConstants.SERVICE_TYPE_400GE, netTransServ, PceConstraintMode.Loose, null);
+        assertEquals(pceGraph.calcPath(), false);
+        assertEquals(Optional.ofNullable(pceGraph.getmargin()), Optional.ofNullable(0.0));
+    }
+
+    @Test
+    void clacPath400GE() {
+        PceCalculation pceCalc = new PceCalculation(getPCE1Request(Uint32.valueOf(400), ServiceFormat.Ethernet,
+            "XPONDER-1", "Node1", "Client-1", "XPONDER-5", "Node5", "Client-1"),
+            netTransServ, pceHardConstraints, null, rc, portMapping);
+        pceCalc.retrievePceNetwork();
+        pceGraph = new PceGraph(pceCalc.getaendPceNode(), pceCalc.getzendPceNode(),
+            pceCalc.getAllPceNodes(), pceCalc.getAllPceLinks(), pceHardConstraints,
+            rc, StringConstants.SERVICE_TYPE_400GE, netTransServ, PceConstraintMode.Loose, null);
+        assertEquals(pceGraph.calcPath(), true);
+        assertEquals(Optional.ofNullable(pceGraph.getmargin()), Optional.ofNullable(1.4432381874659086));
+    }
+
+    @Test
+    void clacPathOTUC4() {
+        PceCalculation pceCalc = new PceCalculation(getPCE1Request(Uint32.valueOf(400), ServiceFormat.Ethernet,
+            "XPONDER-1", "Node1", "XPDR-NW1-TX", "XPONDER-5", "Node5", "XPDR-NW1-RX"),
+            netTransServ, pceHardConstraints, null, rc, portMapping);
+        pceCalc.retrievePceNetwork();
+        pceGraph = new PceGraph(pceCalc.getaendPceNode(), pceCalc.getzendPceNode(),
+            pceCalc.getAllPceNodes(), pceCalc.getAllPceLinks(), pceHardConstraints,
+            rc, StringConstants.SERVICE_TYPE_OTUC4, netTransServ, PceConstraintMode.Loose, null);
+        assertEquals(pceGraph.calcPath(), true);
+        assertEquals(Optional.ofNullable(pceGraph.getmargin()), Optional.ofNullable(1.4432381874659086));
+    }
 
-        Assert.assertEquals(pceGraph.calcPath(), true);
-        Assert.assertEquals(Optional.ofNullable(pceGraph.getPathAtoZ().get(0).getLatency()),
-                Optional.ofNullable(30.0));
-        Assert.assertEquals(pceGraph.getReturnStructure().getRate(), -1);
+    @Test
+    void clacOpticalTunnelOTUC4() {
+        PceCalculation pceCalc = new PceCalculation(getPCE1Request(Uint32.valueOf(400), ServiceFormat.OC,
+            "OpenROADM-1", "Node1", "DEG1-PP-TX", "OpenROADM-5", "Node5", "DEG3-PP-TX"),
+            netTransServ, pceHardConstraints, null, rc, portMapping);
+        pceCalc.retrievePceNetwork();
+        pceGraph = new PceGraph(pceCalc.getaendPceNode(), pceCalc.getzendPceNode(),
+            pceCalc.getAllPceNodes(), pceCalc.getAllPceLinks(), pceHardConstraints,
+            rc, StringConstants.SERVICE_TYPE_OTUC4, netTransServ, PceConstraintMode.Loose, null);
+        assertEquals(pceGraph.calcPath(), true);
+        assertEquals(Optional.ofNullable(pceGraph.getmargin()), Optional.ofNullable(0.0));
+    }
+
+    @Test
+    void clacPath100GEnoPort() {
+        PceCalculation pceCalc = new PceCalculation(getPCE2Request(Uint32.valueOf(100), ServiceFormat.Ethernet,
+            "XPONDER-1", "Node1", "Client-1", "XPONDER-3", "Node3", "Client-1"),
+            netTransServ, pceHardConstraints, null, rc, portMapping);
+        pceCalc.retrievePceNetwork();
+        pceGraph = new PceGraph(pceCalc.getaendPceNode(), pceCalc.getzendPceNode(),
+            pceCalc.getAllPceNodes(), pceCalc.getAllPceLinks(), pceHardConstraints,
+            rc, StringConstants.SERVICE_TYPE_100GE_T, netTransServ, PceConstraintMode.Loose, null);
+        assertEquals(pceGraph.calcPath(), true);
+        assertEquals(Optional.ofNullable(pceGraph.getmargin()), Optional.ofNullable(3.0919881995992924));
     }
 
     @Test
-    public void clacPath100GE() {
-        pceGraph = new PceGraph(pceOpticalNode, pceOpticalNode2, allPceNodes,
-                pceHardConstraints,
-                null, rc,
-                StringConstants.SERVICE_TYPE_100GE_T);
+    void clacPathPropagationDelay() {
+        PceCalculation pceCalc = new PceCalculation(getPCE1Request(Uint32.valueOf(100), ServiceFormat.Ethernet,
+            "XPONDER-1", "Node1", "Client-1", "XPONDER-3", "Node3", "Client-1"),
+            netTransServ, pceHardConstraints, null, rc, portMapping);
+        pceCalc.retrievePceNetwork();
+        pceHardConstraints.setPceMetrics(PceMetric.PropagationDelay);
+        pceGraph = new PceGraph(pceCalc.getaendPceNode(), pceCalc.getzendPceNode(),
+            pceCalc.getAllPceNodes(), pceCalc.getAllPceLinks(), pceHardConstraints,
+            rc, StringConstants.SERVICE_TYPE_100GE_T, netTransServ, PceConstraintMode.Loose, null);
+        pceGraph.setConstrains(pceHardConstraints);
 
-        Assert.assertEquals(pceGraph.calcPath(), false);
+        assertEquals(pceGraph.calcPath(), true);
+        assertEquals(Optional.ofNullable(pceGraph.getPathAtoZ().get(2).getLatency()),
+            Optional.ofNullable(1.0));
+        assertEquals(pceGraph.getReturnStructure().getRate(), 100);
     }
 
-    @Test(expected = Exception.class)
-    public void clacPath10GE2() {
-        pceGraph = getOtnPceGraph(StringConstants.SERVICE_TYPE_10GE);
-        Assert.assertEquals(pceGraph.calcPath(), false);
+    //FIXME: Review this test. Getting NPE is never normal!
+    @Test
+    void clacPath10GE2() {
+        assertThrows(NullPointerException.class, () -> {
+            getOtnPceGraph(StringConstants.SERVICE_TYPE_10GE);
+        });
+//        assertEquals(pceGraph.calcPath(), false);
     }
 
-    @Test(expected = Exception.class)
-    public void clacPath1GE() {
-        pceGraph = getOtnPceGraph(StringConstants.SERVICE_TYPE_1GE);
-        Assert.assertEquals(pceGraph.calcPath(), false);
+    //FIXME: Review this test. Getting NPE is never normal!
+    @Test
+    void clacPath1GE() {
+        assertThrows(NullPointerException.class, () -> {
+            getOtnPceGraph(StringConstants.SERVICE_TYPE_1GE);
+        });
+//        assertEquals(pceGraph.calcPath(), false);
     }
 
     private PceGraph getOtnPceGraph(String type) {
         // Build Link
-        link = NodeUtils.createRoadmToRoadm("optical",
-                "optical2",
-                "DEG1-TTP-TX", "DEG1-TTP-RX").build();
-
+        link1 = NodeUtils.createRoadmToRoadm("optical", "optical2", "DEG1-TTP-TX", "DEG1-TTP-RX").build();
 
         node = NodeUtils.getOTNNodeBuilder(NodeUtils.geSupportingNodes(), OpenroadmTpType.XPONDERNETWORK).build();
 
-        PceOtnNode  pceOtnNode = new PceOtnNode(node, OpenroadmNodeType.MUXPDR,
-                new NodeId("optical"), ServiceFormat.OTU.getName(), "serviceType", null);
+        PceOtnNode pceOtnNode = new PceOtnNode(node, OpenroadmNodeType.MUXPDR,
+            new NodeId("optical"), ServiceFormat.OTU.getName(), "serviceType", null);
         pceOtnNode.validateXponder("optical", "sl");
         pceOtnNode.validateXponder("not optical", "sl");
         pceOtnNode.initXndrTps("AZ");
         pceOtnNode.checkAvailableTribPort();
         pceOtnNode.checkAvailableTribSlot();
 
-
         PceOtnNode pceOtnNode2 = new PceOtnNode(node, OpenroadmNodeType.MUXPDR,
-                new NodeId("optical2"), ServiceFormat.OTU.getName(), "serviceType", null);
+            new NodeId("optical2"), ServiceFormat.OTU.getName(), "serviceType", null);
         pceOtnNode2.validateXponder("optical", "sl");
         pceOtnNode2.validateXponder("not optical", "sl");
         pceOtnNode2.initXndrTps("AZ");
@@ -154,24 +404,214 @@ public class PceGraphTest {
         pceOtnNode2.checkAvailableTribPort();
         pceOtnNode2.checkAvailableTribSlot();
 
-        pceLink = new PceLink(link, pceOtnNode, pceOtnNode2);
-        pceLink.setClient("XPONDER-CLIENT");
+        pceLink1 = new PceLink(link1, pceOtnNode, pceOtnNode2);
+        pceLink1.setClientA("XPONDER-CLIENT");
 
-        pceLink.getDestId();
-        pceOtnNode.addOutgoingLink(pceLink);
+        pceLink1.getDestId();
+        pceOtnNode.addOutgoingLink(pceLink1);
 
         // init PceHardContraints
         pceHardConstraints = new PceConstraints();
         // pceHardConstraints.setp
-        allPceNodes = Map.of(new NodeId("optical"), pceOtnNode,
-                new NodeId("optical2"), pceOtnNode2);
-        rc = new PceResult();
-        PceGraph otnPceGraph = new PceGraph(pceOtnNode, pceOtnNode2, allPceNodes,
-                pceHardConstraints,
-                null, rc,
-                type);
+        allPceNodes = Map.of(
+            new NodeId("optical"), pceOtnNode,
+            new NodeId("optical2"), pceOtnNode2);
+        return new PceGraph(pceOtnNode, pceOtnNode2, allPceNodes, allPceLinks, pceHardConstraints,
+                new PceResult(), type, null, PceConstraintMode.Loose, null);
+    }
 
-        return otnPceGraph;
+    private void saveOpenRoadmNetwork(Network network, String networkId)
+            throws InterruptedException, ExecutionException {
+        InstanceIdentifier<Network> nwInstanceIdentifier = InstanceIdentifier.builder(Networks.class)
+            .child(Network.class, new NetworkKey(new NetworkId(networkId))).build();
+        WriteTransaction dataWriteTransaction = dataBroker.newWriteOnlyTransaction();
+        dataWriteTransaction.put(LogicalDatastoreType.CONFIGURATION, nwInstanceIdentifier, network);
+        dataWriteTransaction.commit().get();
     }
-}
 
+    public static Node createNetworkNode(String nodeId, OpenroadmNodeType nodeType) {
+        SupportingNode supportingNode = new SupportingNodeBuilder()
+            .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))
+            .setNodeRef(new NodeId("node1"))
+            .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.CLLI_NETWORK_ID),
+                new NodeId("node1")))
+            .build();
+        return new NodeBuilder()
+            .setNodeId(new NodeId(nodeId))
+            .withKey(new NodeKey(new NodeId(nodeId)))
+            .setSupportingNode(ImmutableMap.of(supportingNode.key(), supportingNode))
+            .addAugmentation(
+                new Node1Builder().setOpenroadmVersion(OpenroadmVersionType._221).build())
+            .addAugmentation(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1Builder()
+                    .setNodeType(nodeType).build())
+            .build();
+    }
+
+    public static TerminationPoint createNetworkTp(String nodeId, String tpId) {
+        var nwTpId = new TpId(tpId);
+        return new TerminationPointBuilder()
+            .setTpId(nwTpId)
+            .withKey(new TerminationPointKey(nwTpId))
+            .addAugmentation(new TerminationPoint1Builder()
+                .setXpdrNetworkAttributes(new XpdrNetworkAttributesBuilder().setState(State.InService).build())
+                .build())
+            .build();
+    }
+
+    public static Node createTopologyNode(String nodeId, OpenroadmNodeType nodeType) {
+        SupportingNode supportingNode = new SupportingNodeBuilder()
+            .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))
+            .setNodeRef(new NodeId("node1"))
+            .withKey(new SupportingNodeKey(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID),
+                new NodeId("node1")))
+            .build();
+        return new NodeBuilder()
+            .setNodeId(new NodeId(nodeId))
+            .withKey(new NodeKey(new NodeId(nodeId)))
+            .setSupportingNode(ImmutableMap.of(supportingNode.key(), supportingNode))
+            .addAugmentation(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1Builder()
+                    .setXpdrAttributes(null).build())
+            .addAugmentation(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1Builder()
+                    .setNodeType(nodeType).build())
+            .build();
+    }
+
+    public static PathComputationRequestInput getPCE1Request(Uint32 rate, ServiceFormat serviceFormat, String aaNodeId,
+            String aaClliId, String aaPortName, String zzNodeId, String zzClliId, String zzPortName) {
+        return new PathComputationRequestInputBuilder()
+            .setServiceName("service1")
+            .setResourceReserve(true)
+            .setPceRoutingMetric(PceMetric.HopCount)
+            .setServiceHandlerHeader(new ServiceHandlerHeaderBuilder()
+                .setRequestId("request1")
+                .build())
+            .setServiceAEnd(new ServiceAEndBuilder()
+                .setServiceFormat(serviceFormat)
+                .setServiceRate(Uint32.valueOf(100))
+                .setClli(aaClliId)
+                .setNodeId(aaNodeId)
+                .setTxDirection(new TxDirectionBuilder()
+                    .setPort(new PortBuilder()
+                        .setPortDeviceName(aaNodeId)
+                        .setPortType("fixed")
+                        .setPortName(aaPortName)
+                        .setPortRack("Some port-rack")
+                        .setPortShelf("Some port-shelf")
+                        .setPortSlot("Some port-slot")
+                        .setPortSubSlot("Some port-sub-slot")
+                        .build())
+                    .build())
+                .setRxDirection(new RxDirectionBuilder()
+                    .setPort(new PortBuilder()
+                        .setPortDeviceName(aaNodeId)
+                        .setPortType("fixed")
+                        .setPortName(aaPortName)
+                        .setPortRack("Some port-rack")
+                        .setPortShelf("Some port-shelf")
+                        .setPortSlot("Some port-slot")
+                        .setPortSubSlot("Some port-sub-slot")
+                        .build())
+                    .build())
+                .build())
+            .setServiceZEnd(new ServiceZEndBuilder()
+                .setServiceFormat(serviceFormat)
+                .setServiceRate(Uint32.valueOf(0))
+                .setClli(zzClliId)
+                .setNodeId(zzNodeId)
+                .setTxDirection(new TxDirectionBuilder()
+                    .setPort(new PortBuilder()
+                        .setPortDeviceName(zzNodeId)
+                        .setPortType("fixed")
+                        .setPortName(zzPortName)
+                        .setPortRack("Some port-rack")
+                        .setPortShelf("Some port-shelf")
+                        .setPortSlot("Some port-slot")
+                        .setPortSubSlot("Some port-sub-slot")
+                        .build())
+                    .build())
+                .setRxDirection(new RxDirectionBuilder()
+                    .setPort(new PortBuilder()
+                        .setPortDeviceName(zzNodeId)
+                        .setPortType("fixed")
+                        .setPortName(zzPortName)
+                        .setPortRack("Some port-rack")
+                        .setPortShelf("Some port-shelf")
+                        .setPortSlot("Some port-slot")
+                        .setPortSubSlot("Some port-sub-slot")
+                        .build())
+                    .build())
+                .build())
+            .setHardConstraints(new HardConstraintsBuilder()
+                .setCustomerCode(Set.of("Some customer-code"))
+                .setCoRouting(new CoRoutingBuilder()
+                    .setServiceIdentifierList(Map.of(
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209
+                                .constraints.co.routing.ServiceIdentifierListKey("Some existing-service"),
+                        new ServiceIdentifierListBuilder().setServiceIdentifier("Some existing-service").build()))
+                    .build())
+                .build())
+            .setSoftConstraints(new SoftConstraintsBuilder()
+                .setCustomerCode(Set.of("Some customer-code"))
+                .setCoRouting(new CoRoutingBuilder()
+                    .setServiceIdentifierList(Map.of(
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209
+                                .constraints.co.routing.ServiceIdentifierListKey("Some existing-service"),
+                        new ServiceIdentifierListBuilder().setServiceIdentifier("Some existing-service").build()))
+                    .build())
+                .build())
+            .build();
+    }
+
+    public static PathComputationRequestInput getPCE2Request(Uint32 rate, ServiceFormat serviceFormat, String aaNodeId,
+            String aaClliId, String aaPortName, String zzNodeId, String zzClliId, String zzPortName) {
+        return new PathComputationRequestInputBuilder()
+            .setServiceName("service1")
+            .setResourceReserve(true)
+            .setPceRoutingMetric(PceMetric.HopCount)
+            .setServiceHandlerHeader(new ServiceHandlerHeaderBuilder()
+                .setRequestId("request1")
+                .build())
+            .setServiceAEnd(new ServiceAEndBuilder()
+                .setServiceFormat(serviceFormat)
+                .setServiceRate(Uint32.valueOf(100))
+                .setClli(aaClliId)
+                .setNodeId(aaNodeId)
+                .setTxDirection(new TxDirectionBuilder()
+                  .build())
+                .setRxDirection(new RxDirectionBuilder()
+                    .build())
+                .build())
+            .setServiceZEnd(new ServiceZEndBuilder()
+                .setServiceFormat(serviceFormat)
+                .setServiceRate(Uint32.valueOf(0))
+                .setClli(zzClliId)
+                .setNodeId(zzNodeId)
+                .setTxDirection(new TxDirectionBuilder()
+                    .build())
+                .setRxDirection(new RxDirectionBuilder()
+                    .build())
+                .build())
+            .setHardConstraints(new HardConstraintsBuilder()
+                .setCustomerCode(Set.of("Some customer-code"))
+                .setCoRouting(new CoRoutingBuilder()
+                    .setServiceIdentifierList(Map.of(
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209
+                                .constraints.co.routing.ServiceIdentifierListKey("Some existing-service"),
+                        new ServiceIdentifierListBuilder().setServiceIdentifier("Some existing-service").build()))
+                    .build())
+                .build())
+            .setSoftConstraints(new SoftConstraintsBuilder()
+                .setCustomerCode(Set.of("Some customer-code"))
+                .setCoRouting(new CoRoutingBuilder()
+                    .setServiceIdentifierList(Map.of(
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209
+                                .constraints.co.routing.ServiceIdentifierListKey("Some existing-service"),
+                        new ServiceIdentifierListBuilder().setServiceIdentifier("Some existing-service").build()))
+                    .build())
+                .build())
+                    .build();
+    }
+}
diff --git a/pce/src/test/java/org/opendaylight/transportpce/pce/impl/PceProviderTest.java b/pce/src/test/java/org/opendaylight/transportpce/pce/impl/PceProviderTest.java
deleted file mode 100644 (file)
index 1ecb23f..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright © 2020 Orange Labs, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.transportpce.pce.impl;
-
-import static org.mockito.ArgumentMatchers.eq;
-
-import org.eclipse.jdt.annotation.NonNull;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mockito;
-import org.opendaylight.mdsal.binding.api.NotificationPublishService;
-import org.opendaylight.mdsal.binding.api.RpcProviderService;
-import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
-import org.opendaylight.transportpce.common.network.RequestProcessor;
-import org.opendaylight.transportpce.pce.service.PathComputationService;
-import org.opendaylight.transportpce.pce.service.PathComputationServiceImpl;
-import org.opendaylight.transportpce.pce.utils.NotificationPublishServiceMock;
-import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.TransportpcePceService;
-import org.opendaylight.yangtools.concepts.ObjectRegistration;
-
-public class PceProviderTest extends AbstractTest {
-
-    private RpcProviderService rpcService;
-    private PathComputationService pathComputationService;
-    private NotificationPublishService notificationPublishService;
-    private NetworkTransactionImpl networkTransaction;
-    private RequestProcessor requestProcessor;
-    private ObjectRegistration<TransportpcePceService> rpcRegistration;
-    private PceProvider pceProvider;
-
-    @Before
-    public void setUp() {
-        rpcService = Mockito.mock(RpcProviderService.class);
-        notificationPublishService = new NotificationPublishServiceMock();
-        requestProcessor = Mockito.mock(RequestProcessor.class);
-        networkTransaction = new NetworkTransactionImpl(requestProcessor);
-        pathComputationService = new PathComputationServiceImpl(networkTransaction, notificationPublishService,
-                null, null);
-        pceProvider = new PceProvider(rpcService, pathComputationService);
-    }
-
-    @Test
-    public void testInit() {
-        this.rpcRegistration = new ObjectRegistration<TransportpcePceService>() {
-            @NonNull
-            @Override
-            public TransportpcePceService getInstance() {
-                return new PceServiceRPCImpl(pathComputationService);
-            }
-
-            @Override
-            public void close() {
-
-            }
-        };
-        Mockito
-                .when(rpcService
-                        .registerRpcImplementation(eq(TransportpcePceService.class), Mockito.any()))
-                .thenReturn(rpcRegistration);
-        pceProvider.init();
-        pceProvider.close();
-    }
-
-}
index f97d0d5a8efaffd2be10dd34ff98528f045d6bae..549a708cbbf83f6f9b95d1c54b809f595ed4c275 100644 (file)
@@ -8,16 +8,22 @@
 
 package org.opendaylight.transportpce.pce.impl;
 
-import static org.junit.Assert.assertNotNull;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
 
 import java.util.concurrent.ExecutionException;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
-import org.opendaylight.transportpce.common.network.RequestProcessor;
 import org.opendaylight.transportpce.pce.service.PathComputationService;
 import org.opendaylight.transportpce.pce.service.PathComputationServiceImpl;
 import org.opendaylight.transportpce.pce.utils.NotificationPublishServiceMock;
@@ -25,44 +31,60 @@ import org.opendaylight.transportpce.pce.utils.PceTestData;
 import org.opendaylight.transportpce.pce.utils.PceTestUtils;
 import org.opendaylight.transportpce.pce.utils.TransactionUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.CancelResourceReserveInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.CancelResourceReserveInputBuilder;
 
 
+@ExtendWith(MockitoExtension.class)
 public class PceServiceRPCImplTest extends AbstractTest {
 
     private PathComputationService pathComputationService;
     private NotificationPublishService notificationPublishService;
     private NetworkTransactionImpl networkTransaction;
-    private PceServiceRPCImpl pceServiceRPC;
     @Mock
     private PortMapping portMapping;
+    @Mock
+    private RpcProviderService rpcProviderService;
 
-    @Before
-    public void setUp() throws ExecutionException, InterruptedException {
+
+    @BeforeEach
+    void setUp() throws ExecutionException, InterruptedException {
         PceTestUtils.writeNetworkIntoDataStore(getDataBroker(), getDataStoreContextUtil(),
                 TransactionUtils.getNetworkForSpanLoss());
         notificationPublishService = new NotificationPublishServiceMock();
-        networkTransaction =  new NetworkTransactionImpl(new RequestProcessor(getDataBroker()));
+        networkTransaction =  new NetworkTransactionImpl(getDataBroker());
         pathComputationService = new PathComputationServiceImpl(networkTransaction, notificationPublishService,
                 null, portMapping);
-        pceServiceRPC = new PceServiceRPCImpl(pathComputationService);
+    }
 
+    @Test
+    void testRpcRegistration() {
+        new PceServiceRPCImpl(rpcProviderService, pathComputationService);
+        verify(rpcProviderService, times(1)).registerRpcImplementations(
+                any(CancelResourceReserveImpl.class), any(PathComputationRequestImpl.class),
+                any(PathComputationRerouteRequestImpl.class));
+    }
+
+    @Test
+    void testCancelResourceReserve() {
+        assertNotNull(new CancelResourceReserveImpl(pathComputationService)
+                .invoke(new CancelResourceReserveInputBuilder().build()));
     }
 
     @Test
-    public void testCancelResourceReserve() {
-        CancelResourceReserveInputBuilder cancelResourceReserveInput = new CancelResourceReserveInputBuilder();
-        assertNotNull(pceServiceRPC.cancelResourceReserve(cancelResourceReserveInput.build()));
+    void testPathComputationRequest() {
+        assertNotNull(new PathComputationRequestImpl(pathComputationService)
+                .invoke(PceTestData.getPCERequest()));
     }
 
     @Test
-    public void testPathComputationRequest() {
-        assertNotNull(pceServiceRPC.pathComputationRequest(PceTestData.getPCERequest()));
+    void testPathComputationRerouteRequest() {
+        assertNotNull(new PathComputationRerouteRequestImpl(pathComputationService)
+                .invoke(PceTestData.getPCERerouteRequest()));
     }
 
     @Test
-    public void testPathComputationRequestCoRoutingOrGeneral2() {
-        assertNotNull(pceServiceRPC.pathComputationRequest(
-                PceTestData.getPathComputationRequestInputWithCoRoutingOrGeneral2()));
+    void testPathComputationRequestCoRoutingOrGeneral2() {
+        assertNotNull(new PathComputationRequestImpl(pathComputationService)
+                .invoke(PceTestData.getPathComputationRequestInputWithCoRoutingOrGeneral2()));
     }
 }
index cc255b3c8421b6bc3f6ce770d2623e4c77cfc0ae..c0efabcc335acedb64fc3ddcc6540d7fcf7176bd 100644 (file)
@@ -7,37 +7,38 @@
  */
 package org.opendaylight.transportpce.pce.networkanalyzer;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.lenient;
 import static org.mockito.Mockito.when;
 
 import java.util.concurrent.ExecutionException;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
-import org.opendaylight.transportpce.common.network.RequestProcessor;
 import org.opendaylight.transportpce.pce.constraints.PceConstraintsCalc;
 import org.opendaylight.transportpce.pce.utils.PceTestData;
 import org.opendaylight.transportpce.pce.utils.PceTestUtils;
 import org.opendaylight.transportpce.pce.utils.TransactionUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfo;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfoBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfo;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfoBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes;
-//import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes;
 
-@RunWith(MockitoJUnitRunner.StrictStubs.class)
+@ExtendWith(MockitoExtension.class)
 public class PceCalculationTest extends AbstractTest {
 
     private PceCalculation pceCalculation;
@@ -48,71 +49,67 @@ public class PceCalculationTest extends AbstractTest {
     @Mock
     private PortMapping portMapping;
 
-    // setup object
-    @Before
-    public void setUp() throws ExecutionException, InterruptedException {
+    @BeforeEach
+    void setUp() throws ExecutionException, InterruptedException {
         pceResult.setRC("200");
         PceTestUtils.writeNetworkIntoDataStore(getDataBroker(), getDataStoreContextUtil(),
                 TransactionUtils.getNetworkForSpanLoss());
         pceConstraintsCalc = new PceConstraintsCalc(PceTestData.getPCERequest(),
-                new NetworkTransactionImpl(new RequestProcessor(getDataBroker())));
+                new NetworkTransactionImpl(getDataBroker()));
         mapping = new MappingBuilder().setLogicalConnectionPoint("logicalConnectionPoint").setPortQual("xpdr-client")
             .build();
         NodeInfo info = new NodeInfoBuilder().setNodeType(NodeTypes.Xpdr).build();
         Nodes node = new NodesBuilder().withKey(new NodesKey("node")).setNodeId("node").setNodeInfo(info).build();
-        when(portMapping.getMapping(anyString(), anyString())).thenReturn(mapping);
+        lenient().when(portMapping.getMapping(anyString(), anyString())).thenReturn(mapping);
         when(portMapping.getNode(anyString())).thenReturn(node);
     }
 
     @Test
-    public void testPceCalculationValues() {
+    void testPceCalculationValues() {
         pceCalculation = new PceCalculation(
             PceTestData.getPCERequest(),
-            new NetworkTransactionImpl(new RequestProcessor(getDataBroker())),
+            new NetworkTransactionImpl(getDataBroker()),
             pceConstraintsCalc.getPceHardConstraints(),
             pceConstraintsCalc.getPceSoftConstraints(),
             pceResult,
             portMapping);
         pceCalculation.retrievePceNetwork();
-        Assert.assertEquals(StringConstants.SERVICE_TYPE_100GE_T, pceCalculation.getServiceType());
-        Assert.assertNotNull(pceCalculation.getReturnStructure());
-
-        Assert.assertNull(pceCalculation.getaendPceNode());
-        Assert.assertNull(pceCalculation.getzendPceNode());
+        assertEquals(StringConstants.SERVICE_TYPE_100GE_T, pceCalculation.getServiceType());
+        assertNotNull(pceCalculation.getReturnStructure());
+        assertNull(pceCalculation.getaendPceNode());
+        assertNull(pceCalculation.getzendPceNode());
     }
 
     @Test
-    public void testPceCalculationValues2() {
+    void testPceCalculationValues2() {
         pceCalculation = new PceCalculation(
                 PceTestData.getPathComputationRequestInputWithCoRoutingOrGeneral(),
-                new NetworkTransactionImpl(new RequestProcessor(getDataBroker())),
+                new NetworkTransactionImpl(getDataBroker()),
                 pceConstraintsCalc.getPceHardConstraints(),
                 pceConstraintsCalc.getPceSoftConstraints(),
                 pceResult, portMapping);
         pceCalculation.retrievePceNetwork();
-        Assert.assertEquals(StringConstants.SERVICE_TYPE_100GE_T, pceCalculation.getServiceType());
-        Assert.assertNotNull(pceCalculation.getReturnStructure());
-
-        Assert.assertNull(pceCalculation.getaendPceNode());
-        Assert.assertNull(pceCalculation.getzendPceNode());
+        assertEquals(StringConstants.SERVICE_TYPE_100GE_T, pceCalculation.getServiceType());
+        assertNotNull(pceCalculation.getReturnStructure());
+        assertNull(pceCalculation.getaendPceNode());
+        assertNull(pceCalculation.getzendPceNode());
     }
 
     @Test
-    public void testPceCalculationValues42() {
+    void testPceCalculationValues42() {
         PathComputationRequestInput input = PceTestData.getPathComputationRequestInputWithCoRoutingOrGeneral2();
         pceConstraintsCalc = new PceConstraintsCalc(input,
-                new NetworkTransactionImpl(new RequestProcessor(getDataBroker())));
+                new NetworkTransactionImpl(getDataBroker()));
         pceCalculation = new PceCalculation(
                 PceTestData.getPCE_test3_request_54(),
-                new NetworkTransactionImpl(new RequestProcessor(getDataBroker())),
+                new NetworkTransactionImpl(getDataBroker()),
                 pceConstraintsCalc.getPceHardConstraints(),
                 pceConstraintsCalc.getPceSoftConstraints(),
                 pceResult, portMapping);
         pceCalculation.retrievePceNetwork();
-        Assert.assertEquals(StringConstants.SERVICE_TYPE_100GE_T, pceCalculation.getServiceType());
-        Assert.assertNotNull(pceCalculation.getReturnStructure());
-
-        Assert.assertNull(pceCalculation.getaendPceNode());
-        Assert.assertNull(pceCalculation.getzendPceNode());
+        assertEquals(StringConstants.SERVICE_TYPE_100GE_T, pceCalculation.getServiceType());
+        assertNotNull(pceCalculation.getReturnStructure());
+        assertNull(pceCalculation.getaendPceNode());
+        assertNull(pceCalculation.getzendPceNode());
     }
 }
index db285a0480e91c2bca7d9d876ce6bf864101e412..90e53324b2f4bdabf52dc5e4bd7108823d550ea0 100644 (file)
@@ -8,12 +8,17 @@
 
 package org.opendaylight.transportpce.pce.networkanalyzer;
 
-import java.math.BigDecimal;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import java.math.RoundingMode;
 import java.util.HashMap;
 import java.util.Map;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.opendaylight.transportpce.common.NetworkUtils;
@@ -21,21 +26,22 @@ import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.transportpce.common.fixedflex.GridConstant;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.test.AbstractTest;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.link.types.rev191129.FiberPmd;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.link.types.rev191129.RatioDB;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1Builder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.span.attributes.LinkConcatenation1.FiberType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.span.attributes.LinkConcatenation1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.link.OMSAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.link.oms.attributes.SpanBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.link.concatenation.LinkConcatenation;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.link.concatenation.LinkConcatenationBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.link.concatenation.LinkConcatenationKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.span.attributes.LinkConcatenation1.FiberType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.span.attributes.LinkConcatenation1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.link.OMSAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.link.oms.attributes.SpanBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.link.concatenation.LinkConcatenation;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.link.concatenation.LinkConcatenationBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.link.concatenation.LinkConcatenationKey;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
@@ -55,234 +61,290 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.top
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.Uint32;
 
-
 public class PceLinkTest extends AbstractTest {
 
     private static final String LINK_ID_FORMAT = "%1$s-%2$sto%3$s-%4$s";
     private PceLink pceLink = null;
     private String deviceNodeId = "device node";
+    private String deviceNodeId2 = "device node 2";
     private String serviceType = "100GE";
     @Mock
     private PortMapping portMapping;
 
-    @Before
-    public void setup() {
+    @BeforeEach
+    void setup() {
         MockitoAnnotations.openMocks(this);
     }
 
     @Test
-    public void testBuildPceLinkRoadmToRoadm() {
-        Link link = createRoadmToRoadm("srcNode",
-                "destNode",
-                "srcTp", "destTp").build();
-        NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes());
-        Node node = node1Builder.setNodeId(new NodeId("test")).build();
-        PceOpticalNode pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
-                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
-                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
-        pceLink = new PceLink(link, pceOpticalNode, pceOpticalNode);
+    void testBuildPceLinkRoadmToRoadm() {
+        Node node = getNodeBuilder(geSupportingNodes()).setNodeId(new NodeId("test")).build();
+        pceLink = new PceLink(
+            createRoadmToRoadm("srcNode", "destNode", "srcTp", "destTp").build(),
+            new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
+                OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50),
+            new PceOpticalNode(deviceNodeId2, serviceType, portMapping, node,
+                OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50));
     }
 
     @Test
-    public void testBuildPceLinkRoadmToRoadmWithoutLinkLatency() {
-        Link link = createRoadmToRoadmWithoutLinkLatency("srcNode",
-                "destNode",
-                "srcTp", "destTp").build();
+    void testBuildPceLinkRoadmToRoadmWithoutPMD() {
+        Link link = createRoadmToRoadmWithoutPMD("srcNode", "destNode", "srcTp", "destTp").build();
+        Node node = getNodeBuilder(geSupportingNodes()).setNodeId(new NodeId("test")).build();
+        pceLink = new PceLink(
+            link,
+            new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
+                OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50),
+            new PceOpticalNode(deviceNodeId2, serviceType, portMapping, node,
+                OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50));
+        assertNotNull(MapUtils.getOmsAttributesSpan(link));
+        assertEquals(1, pceLink.getsrlgList().size());
+        assertEquals(20.0, pceLink.getspanLoss(), 0.005, "Checking length loss");
+        assertEquals(825.0, pceLink.getcd(), 0.005, "Checking length loss");
+        assertEquals(4.0, pceLink.getpmd2(), 0.005, "Checking PMDvalue of link");
+    }
 
-        NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes());
-        Node node = node1Builder.setNodeId(new NodeId("test")).build();
-        PceOpticalNode pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
-                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
-                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
-        pceLink = new PceLink(link, pceOpticalNode, pceOpticalNode);
+    @Test
+    void testBuildPceLinkRoadmToRoadmWithoutLinkLatency() {
+        Node node = getNodeBuilder(geSupportingNodes()).setNodeId(new NodeId("test")).build();
+        pceLink = new PceLink(
+            createRoadmToRoadmWithoutLinkLatency("srcNode", "destNode", "srcTp", "destTp").build(),
+            new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
+                OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50),
+            new PceOpticalNode(deviceNodeId2, serviceType, portMapping, node,
+                OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50));
     }
 
     @Test
-    public void testBuildPceLinkOTN() {
-        Link link = createOTNLink("srcNode",
-                "destNode",
-                "srcTp", "destTp").build();
+    void testBuildPceLinkOTN() {
+        // TODO: Modify with OTN node not PceOpticalNode
+        Node node = getNodeBuilder(geSupportingNodes()).setNodeId(new NodeId("test")).build();
+        pceLink = new PceLink(
+            createOTNLink("srcNode", "destNode", "srcTp", "destTp").build(),
+            new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
+                OpenroadmNodeType.SWITCH, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50),
+            new PceOpticalNode(deviceNodeId2, serviceType, portMapping, node,
+                OpenroadmNodeType.SWITCH, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50));
+    }
 
-        NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes());
-        Node node = node1Builder.setNodeId(new NodeId("test")).build();
-        PceOpticalNode pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
+    @Test
+    void testBuildPceLinkExponder() {
+        Node node = getNodeBuilder(geSupportingNodes()).setNodeId(new NodeId("test")).build();
+        pceLink = new PceLink(
+            createXponderLink("srcNode", "destNode", "srcTp", "destTp").build(),
+            new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
+                OpenroadmNodeType.XPONDER, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50),
+            new PceOpticalNode(deviceNodeId2, serviceType, portMapping, node,
                 OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
-                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
-        pceLink = new PceLink(link, pceOpticalNode, pceOpticalNode);
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50));
     }
 
     @Test
-    public void testBuildPceLinkExponder() {
-        Link link = createXponderLink("srcNode",
-                "destNode",
-                "srcTp", "destTp").build();
-
-        NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes());
-        Node node = node1Builder.setNodeId(new NodeId("test")).build();
-        PceOpticalNode pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
-                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
-                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
-        pceLink = new PceLink(link, pceOpticalNode, pceOpticalNode);
+    void testCalcSpanOSNR() {
+        Link link = createRoadmToRoadm("srcNode", "destNode", "srcTp", "destTp").build();
+        Node node = getNodeBuilder(geSupportingNodes()).setNodeId(new NodeId("test")).build();
+        pceLink = new PceLink(
+            link,
+            new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
+                OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50),
+            new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
+                OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50));
+        assertNotNull(MapUtils.getOmsAttributesSpan(link));
+        // assertNotNull(pceLink.getosnr());
+        assertEquals(1, pceLink.getsrlgList().size());
+        assertEquals(0.25, pceLink.getpmd2(), 0.005, "Checking PMDvalue of link");
+        assertEquals(825, pceLink.getcd(), 0.005, "Checking CDvalue of link");
+        // assertTrue(7.857119000000001 == pceLink.getosnr());
+        assertNull(pceLink.getOppositeLink());
+        assertNull(pceLink.getOppositeLink());
+        assertNotNull(pceLink.getDestTP());
+        assertNotNull(pceLink.getlinkType());
+        assertNotNull(pceLink.getLinkId());
+        assertNotNull(pceLink.getSourceId());
+        assertNotNull(pceLink.getDestId());
+        pceLink.setClientA("specific_client");
+        assertTrue(pceLink.getClientA().equals("specific_client"));
+        assertNotNull(pceLink.getClientA());
+        assertNotNull(pceLink.getLatency());
+        assertNotNull(pceLink.getAvailableBandwidth());
+        assertNotNull(pceLink.getUsedBandwidth());
+        assertNotNull(pceLink.getsourceNetworkSupNodeId());
+        assertNotNull(pceLink.getdestNetworkSupNodeId());
+        assertNotNull(pceLink.getSourceTP());
+        assertNotNull(pceLink.getsourceCLLI());
+        assertNotNull(pceLink.getdestCLLI());
+        assertTrue(pceLink.toString().equals("PceLink type=" + pceLink.getlinkType()
+            + " ID=" + pceLink.getLinkId().getValue() + " latency=" + pceLink.getLatency().intValue()));
     }
 
     @Test
-    public void testCalcSpanOSNR() {
-        Link link = createRoadmToRoadm("srcNode",
-                "destNode",
-                "srcTp", "destTp").build();
+    void testWrongSpanLoss() {
+        Link link = createInvalidRoadmToRoadm("srcNode", "destNode", "srcTp", "destTp").build();
+        Node node = getNodeBuilder(geSupportingNodes()).setNodeId(new NodeId("test")).build();
+        pceLink = new PceLink(
+            link,
+            new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
+                OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50),
+            new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
+                OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50));
+        assertNull(MapUtils.getOmsAttributesSpan(link));
+        assertNull(pceLink.getpmd2());
+        assertNull(pceLink.getpowerCorrection());
+        assertNull(pceLink.getcd());
+    }
 
-        NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes());
-        Node node = node1Builder.setNodeId(new NodeId("test")).build();
-        PceOpticalNode pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
-                OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
-                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
-        pceLink = new PceLink(link, pceOpticalNode, pceOpticalNode);
-        Assert.assertNotNull(MapUtils.getOmsAttributesSpan(link));
-        Assert.assertNotNull(pceLink.calcSpanOSNR());
-        Assert.assertEquals(1, pceLink.getsrlgList().size());
-        Assert.assertTrue(7.857119000000001 == pceLink.calcSpanOSNR());
-        Assert.assertNull(pceLink.getOppositeLink());
-        Assert.assertNull(pceLink.getOppositeLink());
-        Assert.assertNotNull(pceLink.getDestTP());
-        Assert.assertNotNull(pceLink.getlinkType());
-        Assert.assertNotNull(pceLink.getLinkId());
-        Assert.assertNotNull(pceLink.getSourceId());
-        Assert.assertNotNull(pceLink.getDestId());
-        pceLink.setClient("specific_client");
-        Assert.assertTrue(pceLink.getClient().equals("specific_client"));
-        Assert.assertNotNull(pceLink.getClient());
-        Assert.assertNotNull(pceLink.getLatency());
-        Assert.assertNotNull(pceLink.getAvailableBandwidth());
-        Assert.assertNotNull(pceLink.getUsedBandwidth());
-        Assert.assertNotNull(pceLink.getsourceNetworkSupNodeId());
-        Assert.assertNotNull(pceLink.getdestNetworkSupNodeId());
-        Assert.assertNotNull(pceLink.getosnr());
-        Assert.assertNotNull(pceLink.getSourceTP());
-        Assert.assertNotNull(pceLink.getsourceCLLI());
-        Assert.assertNotNull(pceLink.getdestCLLI());
-        Assert.assertTrue(pceLink.toString().equals("PceLink type=" + pceLink.getlinkType()
-                + " ID=" + pceLink.getLinkId().getValue() + " latency=" + pceLink.getLatency().intValue()));
+    @Test
+    void testExtrapolatedPMD() {
+        Link link = createRoadmToRoadmWithoutPMD("srcNode", "destNode", "srcTp", "destTp").build();
+        Node node = getNodeBuilder(geSupportingNodes()).setNodeId(new NodeId("test")).build();
+        pceLink = new PceLink(
+            link,
+            new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
+                OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50),
+            new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
+                OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
+                GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50));
+        assertNotNull(MapUtils.getOmsAttributesSpan(link));
+        assertEquals(1, pceLink.getsrlgList().size());
+        assertEquals(4.0, pceLink.getpmd2(), 0.005, "Checking PMDvalue of link");
     }
 
     private static LinkBuilder createOTNLink(String srcNode, String destNode, String srcTp, String destTp) {
-        Link1Builder link1Builder = new Link1Builder()
+        return createLinkBuilder(false, false, 10000.0, srcNode, destNode, srcTp, destTp,
+            new Link1Builder()
                 .setLinkType(OpenroadmLinkType.OTNLINK)
                 .setOperationalState(State.InService)
-                .setAdministrativeState(AdminStates.InService);
-        //create source link
-        return createLinkBuilder(srcNode, destNode, srcTp, destTp, link1Builder);
+                .setAdministrativeState(AdminStates.InService));
     }
 
     private static LinkBuilder createXponderLink(String srcNode, String destNode, String srcTp, String destTp) {
-        Link1Builder link1Builder = new Link1Builder()
+        // create source link
+        return createLinkBuilder(false, false, 10.0, srcNode, destNode, srcTp, destTp,
+            new Link1Builder()
                 .setLinkType(OpenroadmLinkType.XPONDERINPUT)
                 .setAdministrativeState(AdminStates.InService)
-                .setOperationalState(State.InService);
-        //create source link
-        return createLinkBuilder(srcNode, destNode, srcTp, destTp, link1Builder);
+                .setOperationalState(State.InService));
     }
 
-    private static LinkBuilder createLinkBuilder(
+    private static LinkBuilder createLinkBuilder(boolean pmdpresent, boolean omspresent, double length,
             String srcNode, String destNode, String srcTp, String destTp, Link1Builder link1Builder) {
-        SourceBuilder ietfSrcLinkBldr =
-                new SourceBuilder().setSourceNode(new NodeId(srcNode)).setSourceTp(new TpId(srcTp));
-        //create destination link
-        DestinationBuilder ietfDestLinkBldr =
-                new DestinationBuilder().setDestNode(new NodeId(destNode))
-                        .setDestTp(new TpId(destTp));
         LinkId linkId = new LinkId(String.format(LINK_ID_FORMAT, srcNode, srcTp, destNode, destTp));
-
-        //For setting up attributes for openRoadm augment
-        LinkConcatenation linkConcatenation = new LinkConcatenationBuilder()
+        LinkBuilder linkBuilder = new LinkBuilder()
+            .setSource(
+                new SourceBuilder().setSourceNode(new NodeId(srcNode)).setSourceTp(new TpId(srcTp)).build())
+            .setDestination(
+                new DestinationBuilder().setDestNode(new NodeId(destNode)).setDestTp(new TpId(destTp)).build())
+            .setLinkId(linkId)
+            .withKey(new LinkKey(linkId))
+            .addAugmentation(link1Builder.build());
+        if (omspresent) {
+            LinkConcatenation linkConcatenation = new LinkConcatenationBuilder()
                 .withKey(new LinkConcatenationKey(Uint32.valueOf(1)))
-                .setSRLGLength(BigDecimal.valueOf(20))
-                .addAugmentation(new LinkConcatenation1Builder()
-                    .setFiberType(FiberType.Dsf)
-                    .build())
+                .setSRLGLength(Decimal64.valueOf(length, RoundingMode.FLOOR))
+                .addAugmentation(
+                    pmdpresent
+                        ? new LinkConcatenation1Builder().setFiberType(FiberType.Smf)
+                                .setPmd(FiberPmd.getDefaultInstance("0.500")).build()
+                        : new LinkConcatenation1Builder().setFiberType(FiberType.Smf).build())
                 .build();
-        OMSAttributesBuilder omsAttributesBuilder =
-                new OMSAttributesBuilder()
-                        .setSpan(new SpanBuilder()
-                                .setSpanlossCurrent(new RatioDB(new BigDecimal("55")))
-                                .setLinkConcatenation(Map.of(linkConcatenation.key(),
-                                        linkConcatenation
-                                )).build());
-
-
-        LinkBuilder linkBuilder = new LinkBuilder()
-                .setSource(ietfSrcLinkBldr.build())
-                .setDestination(ietfDestLinkBldr.build())
-                .setLinkId(linkId)
-                .withKey(new LinkKey(linkId));
-
-        linkBuilder.addAugmentation(link1Builder.build());
-
-        org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Link1Builder linkBuilderNetworkLink
-                = new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Link1Builder()
-                .setOMSAttributes(omsAttributesBuilder
-                        .build());
-
-        linkBuilder.addAugmentation(linkBuilderNetworkLink.build());
+            linkBuilder.addAugmentation(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Link1Builder()
+                    .setOMSAttributes(
+                        new OMSAttributesBuilder()
+                            .setSpan(new SpanBuilder()
+                            // .setSpanlossCurrent(new RatioDB(Decimal64.valueOf("55")))
+                            .setSpanlossCurrent(new RatioDB(Decimal64.valueOf("20")))
+                            .setLinkConcatenation(Map.of(linkConcatenation.key(), linkConcatenation))
+                            .build())
+                        .build())
+                    .build());
+        }
         return linkBuilder;
     }
 
     private static LinkBuilder createRoadmToRoadm(String srcNode, String destNode, String srcTp, String destTp) {
-        Link1Builder link1Builder = new Link1Builder()
+        return createLinkBuilder(true, true, 50000.0, srcNode, destNode, srcTp, destTp, new Link1Builder()
+                .setLinkLatency(Uint32.valueOf(100))
+                .setAdministrativeState(AdminStates.InService)
+                .setOperationalState(State.InService)
+                .setLinkType(OpenroadmLinkType.ROADMTOROADM)
+                .setLinkLength(Decimal64.valueOf(50.0, RoundingMode.FLOOR)));
+    }
+
+    private static LinkBuilder createRoadmToRoadmWithoutPMD(String srcNode, String destNode, String srcTp,
+            String destTp) {
+        return createLinkBuilder(false, true, 50000.0, srcNode, destNode, srcTp, destTp, new Link1Builder()
                 .setLinkLatency(Uint32.valueOf(100))
                 .setAdministrativeState(AdminStates.InService)
                 .setOperationalState(State.InService)
-                .setLinkType(OpenroadmLinkType.ROADMTOROADM);
-        return createLinkBuilder(srcNode, destNode, srcTp, destTp, link1Builder);
+                .setLinkType(OpenroadmLinkType.ROADMTOROADM)
+                .setLinkLength(Decimal64.valueOf(50.0, RoundingMode.FLOOR)));
+    }
+
+    private static LinkBuilder createInvalidRoadmToRoadm(String srcNode, String destNode,
+            String srcTp, String destTp) {
+        return createLinkBuilder(false, false, 0.0, srcNode, destNode, srcTp, destTp, new Link1Builder()
+                .setLinkLatency(Uint32.valueOf(100))
+                .setAdministrativeState(AdminStates.InService)
+                .setOperationalState(State.InService)
+                .setLinkType(OpenroadmLinkType.ROADMTOROADM));
     }
 
     private static LinkBuilder createRoadmToRoadmWithoutLinkLatency(
             String srcNode, String destNode, String srcTp, String destTp) {
-        Link1Builder link1Builder = new Link1Builder()
-                .setLinkType(OpenroadmLinkType.ROADMTOROADM);
-        return createLinkBuilder(srcNode, destNode, srcTp, destTp, link1Builder);
+        return createLinkBuilder(true, true, 50000.0, srcNode, destNode, srcTp, destTp, new Link1Builder()
+                .setLinkType(OpenroadmLinkType.ROADMTOROADM));
     }
 
-    private Map<SupportingNodeKey,SupportingNode> geSupportingNodes() {
-        Map<SupportingNodeKey,SupportingNode> supportingNodes1 = new HashMap<>();
+    private Map<SupportingNodeKey, SupportingNode> geSupportingNodes() {
         SupportingNode supportingNode1 = new SupportingNodeBuilder()
-                .setNodeRef(new NodeId("node 1"))
-                .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))
-                .build();
-        supportingNodes1
-                .put(supportingNode1.key(),supportingNode1);
-
+            .setNodeRef(new NodeId("node 1"))
+            .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))
+            .build();
         SupportingNode supportingNode2 = new SupportingNodeBuilder()
-                .setNodeRef(new NodeId("node 2"))
-                .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))
-                .build();
-        supportingNodes1
-                .put(supportingNode2.key(),supportingNode2);
-        return supportingNodes1;
+            .setNodeRef(new NodeId("node 2"))
+            .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))
+            .build();
+        return new HashMap<>(Map.of(
+                supportingNode1.key(), supportingNode1,
+                supportingNode2.key(), supportingNode2));
     }
 
-    private NodeBuilder getNodeBuilder(Map<SupportingNodeKey,SupportingNode> supportingNodes1) {
-        //update tp of nodes
-        TerminationPointBuilder xpdrTpBldr = new TerminationPointBuilder()
-                .withKey(new TerminationPointKey(new TpId("xpdr")));
-        TerminationPoint1Builder tp1Bldr = new TerminationPoint1Builder();
-
-        tp1Bldr.setTpType(OpenroadmTpType.XPONDERNETWORK).setAdministrativeState(AdminStates.InService)
-                .setOperationalState(State.InService);
-        xpdrTpBldr.addAugmentation(tp1Bldr.build());
-        TerminationPoint xpdr = xpdrTpBldr.build();
-        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 node1 =
-            new Node1Builder().setTerminationPoint(Map.of(xpdr.key(),xpdr)).build();
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1 node11 =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
-                .setOperationalState(State.InService).setAdministrativeState(AdminStates.InService).build();
+    private NodeBuilder getNodeBuilder(Map<SupportingNodeKey, SupportingNode> supportingNodes1) {
+        // update tp of nodes
+        TerminationPoint xpdr = new TerminationPointBuilder()
+            .withKey(new TerminationPointKey(new TpId("xpdr")))
+            .addAugmentation(
+                new TerminationPoint1Builder()
+                    .setTpType(OpenroadmTpType.XPONDERNETWORK)
+                    .setAdministrativeState(AdminStates.InService)
+                    .setOperationalState(State.InService)
+                    .build())
+            .build();
         return new NodeBuilder()
-                .setNodeId(new NodeId("node 1"))
-                .withKey(new NodeKey(new NodeId("node 1")))
-                .addAugmentation(node1)
-                .addAugmentation(node11)
-                .setSupportingNode(supportingNodes1);
+            .setNodeId(new NodeId("node 1"))
+            .withKey(new NodeKey(new NodeId("node 1")))
+            .addAugmentation(new Node1Builder().setTerminationPoint(Map.of(xpdr.key(), xpdr)).build())
+            .addAugmentation(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1Builder()
+                    .setOperationalState(State.InService).setAdministrativeState(AdminStates.InService).build())
+            .setSupportingNode(supportingNodes1);
     }
-
-}
+}
\ No newline at end of file
index e8ef6085fcb3fdf49d154f85474c6b15a4b470dc..876dcd9d8dbcd1d5e381ed2e3dd01aeca055118a 100644 (file)
@@ -8,14 +8,17 @@
 
 package org.opendaylight.transportpce.pce.networkanalyzer;
 
-import java.math.BigDecimal;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import java.util.Arrays;
 import java.util.BitSet;
 import java.util.HashMap;
 import java.util.Map;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.opendaylight.transportpce.common.NetworkUtils;
@@ -23,30 +26,32 @@ import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.transportpce.common.fixedflex.GridConstant;
 import org.opendaylight.transportpce.common.fixedflex.GridUtils;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
+import org.opendaylight.transportpce.pce.networkanalyzer.port.NoPreference;
+import org.opendaylight.transportpce.pce.networkanalyzer.port.Preference;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev211210.FrequencyGHz;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev211210.FrequencyTHz;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev230526.FrequencyGHz;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev230526.FrequencyTHz;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.DegreeAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.DegreeAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.SrgAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.SrgAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.CpAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.CtpAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.PpAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.RxTtpAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.TxTtpAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.XpdrClientAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.XpdrNetworkAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.XpdrPortAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.available.freq.map.AvailFreqMaps;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.available.freq.map.AvailFreqMapsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.available.freq.map.AvailFreqMapsKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.DegreeAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.DegreeAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.SrgAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.SrgAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.CpAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.CtpAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.PpAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.RxTtpAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.TxTtpAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrClientAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrNetworkAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrPortAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.available.freq.map.AvailFreqMaps;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.available.freq.map.AvailFreqMapsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.available.freq.map.AvailFreqMapsKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
@@ -60,6 +65,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.top
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.Uint16;
 
 public class PceOpticalNodeTest extends AbstractTest {
@@ -72,9 +78,10 @@ public class PceOpticalNodeTest extends AbstractTest {
     private String serviceType = "100GE";
     @Mock
     private PortMapping portMapping;
+    private final Preference portPreference = new NoPreference();
 
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp() {
         NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes(), OpenroadmTpType.SRGTXRXPP);
         node = node1Builder.setNodeId(new NodeId("test")).build();
         availableBitSet.set(0,8);
@@ -82,143 +89,144 @@ public class PceOpticalNodeTest extends AbstractTest {
     }
 
     @Test
-    public void isValidTest() {
+    void isValidTest() {
         OpenroadmNodeType nodeType = OpenroadmNodeType.ROADM;
         pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node, nodeType,
-            StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
-        Assert.assertTrue(pceOpticalNode.isValid());
+            StringConstants.OPENROADM_DEVICE_VERSION_2_2_1, GridConstant.SLOT_WIDTH_50,
+                GridConstant.SLOT_WIDTH_50);
+        assertTrue(pceOpticalNode.isValid());
     }
 
     @Test
-    public void testInitSrgTps() {
+    void testInitSrgTps() {
 
         pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
                 OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
                 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
-        pceOpticalNode.initSrgTps();
+        pceOpticalNode.initSrgTps(portPreference);
         pceOpticalNode.initXndrTps(ServiceFormat.OMS);
         pceOpticalNode.initFrequenciesBitSet();
-        Assert.assertFalse(pceOpticalNode.isValid());
-        Assert.assertNull(pceOpticalNode.getBitSetData());
-        Assert.assertTrue(pceOpticalNode.checkTP("testTP"));
-        Assert.assertNull(pceOpticalNode.getAvailableTribPorts());
-        Assert.assertNull(pceOpticalNode.getAvailableTribPorts());
-        Assert.assertNull(pceOpticalNode.getXpdrClient("test"));
+        assertFalse(pceOpticalNode.isValid());
+        assertNull(pceOpticalNode.getBitSetData());
+        assertTrue(pceOpticalNode.checkTP("testTP"));
+        assertNull(pceOpticalNode.getAvailableTribPorts());
+        assertNull(pceOpticalNode.getAvailableTribPorts());
+        assertNull(pceOpticalNode.getXpdrClient("test"));
     }
 
     @Test
-    public void testInitXndrTpSrgTypes() {
+    void testInitXndrTpSrgTypes() {
         NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes(), OpenroadmTpType.XPONDERNETWORK);
         Node specificNode = node1Builder.build();
         pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, specificNode,
                 OpenroadmNodeType.SRG, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
                 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         pceOpticalNode.initFrequenciesBitSet();
-        Assert.assertTrue(pceOpticalNode.isValid());
-        Assert.assertEquals(availableBitSet, pceOpticalNode.getBitSetData().get(88,96));
-        Assert.assertTrue(pceOpticalNode.checkTP("testTP"));
+        assertTrue(pceOpticalNode.isValid());
+        assertEquals(availableBitSet, pceOpticalNode.getBitSetData().get(88,96));
+        assertTrue(pceOpticalNode.checkTP("testTP"));
     }
 
     @Test
-    public void testInitXndrTpDegTypes() {
+    void testInitXndrTpDegTypes() {
         pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
                 OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
                 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         pceOpticalNode.initFrequenciesBitSet();
-        Assert.assertTrue(pceOpticalNode.isValid());
-        Assert.assertEquals(usedBitSet,pceOpticalNode.getBitSetData().get(88,96));
-        Assert.assertTrue(pceOpticalNode.checkTP("testTP"));
+        assertTrue(pceOpticalNode.isValid());
+        assertEquals(usedBitSet,pceOpticalNode.getBitSetData().get(88,96));
+        assertTrue(pceOpticalNode.checkTP("testTP"));
     }
 
     @Test
-    public void testInitXndrTpXpondrTypes() {
+    void testInitXndrTpXpondrTypes() {
         pceOpticalNode = new PceOpticalNode(deviceNodeId, serviceType, portMapping, node,
                 OpenroadmNodeType.XPONDER, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
                 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         pceOpticalNode.initFrequenciesBitSet();
-        Assert.assertTrue(pceOpticalNode.isValid());
-        Assert.assertEquals(availableBitSet, pceOpticalNode.getBitSetData().get(88,96));
-        Assert.assertTrue(pceOpticalNode.checkTP("testTP"));
+        assertTrue(pceOpticalNode.isValid());
+        assertEquals(availableBitSet, pceOpticalNode.getBitSetData().get(88,96));
+        assertTrue(pceOpticalNode.checkTP("testTP"));
     }
 
     @Test
-    public void testinitFrequenciesBitSet() {
+    void testinitFrequenciesBitSet() {
         pceOpticalNode = new PceOpticalNode(null, null, null, node,
                 OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
                 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
         pceOpticalNode.initXndrTps(ServiceFormat.OMS);
         pceOpticalNode.initFrequenciesBitSet();
-        Assert.assertFalse(pceOpticalNode.isValid());
-        Assert.assertNull(pceOpticalNode.getBitSetData());
-        Assert.assertTrue(pceOpticalNode.checkTP("testTP"));
+        assertFalse(pceOpticalNode.isValid());
+        assertNull(pceOpticalNode.getBitSetData());
+        assertTrue(pceOpticalNode.checkTP("testTP"));
     }
 
     @Test
-    public void testGetRdmSrgClient() {
+    void testGetRdmSrgClient() {
         pceOpticalNode = new PceOpticalNode(null, null, null, node,
                 OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
                 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
-        pceOpticalNode.initSrgTps();
-        Assert.assertNull(pceOpticalNode.getRdmSrgClient("7", StringConstants.SERVICE_DIRECTION_AZ));
-        Assert.assertFalse(pceOpticalNode.isValid());
-        Assert.assertNull(pceOpticalNode.getBitSetData());
-        Assert.assertTrue(pceOpticalNode.checkTP("testTP"));
+        pceOpticalNode.initSrgTps(portPreference);
+        assertNull(pceOpticalNode.getRdmSrgClient("7", StringConstants.SERVICE_DIRECTION_AZ));
+        assertFalse(pceOpticalNode.isValid());
+        assertNull(pceOpticalNode.getBitSetData());
+        assertTrue(pceOpticalNode.checkTP("testTP"));
     }
 
     @Test
-    public void testGetRdmSrgClientEmpty() {
+    void testGetRdmSrgClientEmpty() {
         NodeBuilder node1Builder = getNodeBuilderEmpty(geSupportingNodes(), OpenroadmTpType.SRGTXRXPP);
         Node specificNode = node1Builder.setNodeId(new NodeId("test")).build();
         pceOpticalNode = new PceOpticalNode(null, null, null, specificNode,
                 OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
                 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
-        pceOpticalNode.initSrgTps();
+        pceOpticalNode.initSrgTps(portPreference);
         pceOpticalNode.initFrequenciesBitSet();
         pceOpticalNode.initXndrTps(ServiceFormat.OMS);
-        Assert.assertNull(pceOpticalNode.getRdmSrgClient("7" ,StringConstants.SERVICE_DIRECTION_AZ));
-        Assert.assertFalse(pceOpticalNode.isValid());
-        Assert.assertNull(pceOpticalNode.getBitSetData());
-        Assert.assertTrue(pceOpticalNode.checkTP("testTP"));
+        assertNull(pceOpticalNode.getRdmSrgClient("7" ,StringConstants.SERVICE_DIRECTION_AZ));
+        assertFalse(pceOpticalNode.isValid());
+        assertNull(pceOpticalNode.getBitSetData());
+        assertTrue(pceOpticalNode.checkTP("testTP"));
     }
 
     @Test
-    public void testGetRdmSrgClientDeg() {
+    void testGetRdmSrgClientDeg() {
         pceOpticalNode = new PceOpticalNode(null, null, null, node,
                 OpenroadmNodeType.DEGREE, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
                 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
-        pceOpticalNode.initSrgTps();
-        Assert.assertNull(pceOpticalNode.getRdmSrgClient("7" ,StringConstants.SERVICE_DIRECTION_AZ));
-        Assert.assertFalse(pceOpticalNode.isValid());
-        Assert.assertNull(pceOpticalNode.getBitSetData());
-        Assert.assertTrue(pceOpticalNode.checkTP("testTP"));
+        pceOpticalNode.initSrgTps(portPreference);
+        assertNull(pceOpticalNode.getRdmSrgClient("7" ,StringConstants.SERVICE_DIRECTION_AZ));
+        assertFalse(pceOpticalNode.isValid());
+        assertNull(pceOpticalNode.getBitSetData());
+        assertTrue(pceOpticalNode.checkTP("testTP"));
     }
 
     @Test
-    public void testGetRdmSrgClientsrgtxcp() {
+    void testGetRdmSrgClientsrgtxcp() {
         NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes(), OpenroadmTpType.SRGTXCP);
         Node specificNode = node1Builder.build();
         pceOpticalNode = new PceOpticalNode(null, null, null, specificNode,
                 OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
                 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
-        pceOpticalNode.initSrgTps();
-        Assert.assertFalse(pceOpticalNode.isValid());
-        Assert.assertNull(pceOpticalNode.getBitSetData());
-        Assert.assertTrue(pceOpticalNode.checkTP("testTP"));
-        Assert.assertNull(pceOpticalNode.getRdmSrgClient("5", StringConstants.SERVICE_DIRECTION_AZ));
+        pceOpticalNode.initSrgTps(portPreference);
+        assertFalse(pceOpticalNode.isValid());
+        assertNull(pceOpticalNode.getBitSetData());
+        assertTrue(pceOpticalNode.checkTP("testTP"));
+        assertNull(pceOpticalNode.getRdmSrgClient("5", StringConstants.SERVICE_DIRECTION_AZ));
     }
 
     @Test
-    public void testGetRdmSrgClientDegreerxtpp() {
+    void testGetRdmSrgClientDegreerxtpp() {
         NodeBuilder node1Builder = getNodeBuilder(geSupportingNodes(), OpenroadmTpType.DEGREERXTTP);
         node = node1Builder.build();
         pceOpticalNode = new PceOpticalNode(null, null, null, node,
                 OpenroadmNodeType.ROADM, StringConstants.OPENROADM_DEVICE_VERSION_2_2_1,
                 GridConstant.SLOT_WIDTH_50, GridConstant.SLOT_WIDTH_50);
-        pceOpticalNode.initSrgTps();
-        Assert.assertNull(pceOpticalNode.getRdmSrgClient("2" ,StringConstants.SERVICE_DIRECTION_AZ));
-        Assert.assertFalse(pceOpticalNode.isValid());
-        Assert.assertNull(pceOpticalNode.getBitSetData());
-        Assert.assertTrue(pceOpticalNode.checkTP("testTP"));
+        pceOpticalNode.initSrgTps(portPreference);
+        assertNull(pceOpticalNode.getRdmSrgClient("2" ,StringConstants.SERVICE_DIRECTION_AZ));
+        assertFalse(pceOpticalNode.isValid());
+        assertNull(pceOpticalNode.getBitSetData());
+        assertTrue(pceOpticalNode.checkTP("testTP"));
     }
 
     private Map<SupportingNodeKey,SupportingNode> geSupportingNodes() {
@@ -246,16 +254,14 @@ public class PceOpticalNodeTest extends AbstractTest {
         TerminationPointBuilder xpdrTpBldr = getTerminationPointBuilder();
         xpdrTpBldr.addAugmentation(tp1Bldr.build());
         xpdrTpBldr.addAugmentation(createAnotherTerminationPoint().build());
-        org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1 node1 = getNode1();
+        org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1 node1 = getNode1();
         TerminationPoint xpdr = xpdrTpBldr.build();
         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 node1Rev180226 =
                 new Node1Builder()
                         .setTerminationPoint(Map.of(xpdr.key(),xpdr))
                         .build();
-        Node1 node11 = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
+        Node1 node11 = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1Builder()
                 .setAdministrativeState(AdminStates.InService).setOperationalState(State.InService).build();
-
-
         return new NodeBuilder()
                 .setNodeId(new NodeId("node_test"))
                 .withKey(new NodeKey(new NodeId("node 1")))
@@ -273,16 +279,14 @@ public class PceOpticalNodeTest extends AbstractTest {
         xpdrTpBldr.addAugmentation(tp1Bldr.build());
         xpdrTpBldr.addAugmentation(createAnotherTerminationPoint().build());
 
-        org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1 node1 = getNode1Empty();
+        org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1 node1 = getNode1Empty();
         TerminationPoint xpdr = xpdrTpBldr.build();
         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 node1Rev180226 =
                 new Node1Builder()
                         .setTerminationPoint(Map.of(xpdr.key(),xpdr))
                         .build();
-        Node1 node11 = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
+        Node1 node11 = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1Builder()
                 .setAdministrativeState(AdminStates.InService).setOperationalState(State.InService).build();
-
-
         return new NodeBuilder()
                 .setNodeId(new NodeId("node_test"))
                 .withKey(new NodeKey(new NodeId("node 1")))
@@ -293,16 +297,16 @@ public class PceOpticalNodeTest extends AbstractTest {
     }
 
     private org.opendaylight
-            .yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1 getNode1() {
-        return new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1Builder()
+            .yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1 getNode1() {
+        return new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1Builder()
                 .setSrgAttributes(getSrgAttributes())
                 .setDegreeAttributes(getDegAttributes())
                 .build();
     }
 
     private org.opendaylight
-            .yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1 getNode1Empty() {
-        return new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1Builder()
+            .yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1 getNode1Empty() {
+        return new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1Builder()
                 .setSrgAttributes(getEmptySrgAttributes())
                 .setDegreeAttributes(getEmptyDegAttributes())
                 .build();
@@ -314,8 +318,9 @@ public class PceOpticalNodeTest extends AbstractTest {
         byteArray[7] = (byte) GridConstant.AVAILABLE_SLOT_VALUE;
         Map<AvailFreqMapsKey, AvailFreqMaps> waveMap = new HashMap<>();
         AvailFreqMaps availFreqMaps = new AvailFreqMapsBuilder().setMapName(GridConstant.C_BAND)
-                .setFreqMapGranularity(new FrequencyGHz(BigDecimal.valueOf(GridConstant.GRANULARITY)))
-                .setStartEdgeFreq(new FrequencyTHz(BigDecimal.valueOf(GridConstant.START_EDGE_FREQUENCY)))
+                .setFreqMapGranularity(new FrequencyGHz(Decimal64.valueOf(String.valueOf(GridConstant.GRANULARITY))))
+                .setStartEdgeFreq(
+                    new FrequencyTHz(Decimal64.valueOf(String.valueOf(GridConstant.START_EDGE_FREQUENCY))))
                 .setEffectiveBits(Uint16.valueOf(GridConstant.EFFECTIVE_BITS))
                 .setFreqMap(byteArray)
                 .build();
@@ -344,16 +349,15 @@ public class PceOpticalNodeTest extends AbstractTest {
     }
 
     private TerminationPoint1Builder getTerminationPoint1Builder(OpenroadmTpType openroadmTpType) {
-
         return new TerminationPoint1Builder().setTpType(openroadmTpType).setOperationalState(State.InService)
                 .setAdministrativeState(AdminStates.InService);
 
     }
 
     private org.opendaylight.yang.gen
-            .v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1Builder createAnotherTerminationPoint() {
+            .v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1Builder createAnotherTerminationPoint() {
         return new org.opendaylight
-                .yang.gen.v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1Builder()
+                .yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1Builder()
                 .setCtpAttributes((new CtpAttributesBuilder()).build())
                 .setCpAttributes((new CpAttributesBuilder()).build())
                 .setTxTtpAttributes((new TxTtpAttributesBuilder()).setUsedWavelengths(Map.of()).build())
@@ -364,5 +368,4 @@ public class PceOpticalNodeTest extends AbstractTest {
                 .setXpdrNetworkAttributes(new XpdrNetworkAttributesBuilder()
                         .setTailEquipmentId("destNode" + "--" + "destTp").build());
     }
-
 }
index 26643761159c77628453ba5f6bb61c5dbef9050f..0288656d4ce2c3e420ccdf7ccdee3a7abd4b0c79 100644 (file)
@@ -8,44 +8,47 @@
 
 package org.opendaylight.transportpce.pce.networkanalyzer;
 
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import java.util.HashMap;
 import java.util.Map;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.transportpce.common.NetworkUtils;
 import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.transportpce.common.fixedflex.GridUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1Builder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.DegreeAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.DegreeAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.SrgAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.SrgAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.CpAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.CtpAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.PpAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.RxTtpAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.TxTtpAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.XpdrClientAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.XpdrNetworkAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.XpdrPortAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.termination.point.TpSupportedInterfaces;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.termination.point.TpSupportedInterfacesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.termination.point.XpdrTpPortConnectionAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If100GEODU4;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If10GEODU2e;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If1GEODU0;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOCHOTU4ODU4;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev190531.ServiceFormat;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.DegreeAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.DegreeAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.SrgAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.SrgAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.CpAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.CtpAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.PpAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.RxTtpAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.TxTtpAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrClientAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrNetworkAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrPortAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.networks.network.node.termination.point.TpSupportedInterfaces;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.networks.network.node.termination.point.TpSupportedInterfacesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.networks.network.node.termination.point.XpdrTpPortConnectionAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If100GEODU4;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If10GEODU2e;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If1GEODU0;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOCHOTU4ODU4;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
@@ -65,58 +68,58 @@ public class PceOtnNodeTest extends AbstractTest {
     private PceOtnNode pceOtnNode;
     private Node node;
 
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp() {
         node = getNodeBuilder(geSupportingNodes(), OpenroadmTpType.XPONDERNETWORK).build();
     }
 
     @Test
-    public void testInitXndrTpsODU4() {
+    void testInitXndrTpsODU4() {
         pceOtnNode = new PceOtnNode(node, OpenroadmNodeType.MUXPDR,
                 new NodeId("optical"), ServiceFormat.OMS.getName(), StringConstants.SERVICE_TYPE_ODU4, null);
         pceOtnNode.initXndrTps("AZ");
         pceOtnNode.checkAvailableTribPort();
         pceOtnNode.checkAvailableTribSlot();
-        Assert.assertTrue("valid otn service type " , pceOtnNode.isValid());
-        Assert.assertNotNull("tpAvailableTribPort isn't null !" , pceOtnNode.getAvailableTribPorts());
+        assertTrue(pceOtnNode.isValid(), "valid otn service type ");
+        assertNotNull(pceOtnNode.getAvailableTribPorts(), "tpAvailableTribPort isn't null !");
     }
 
     @Test
-    public void testInitXndrTps10GE() {
+    void testInitXndrTps10GE() {
         pceOtnNode = new PceOtnNode(node, OpenroadmNodeType.MUXPDR,
                 new NodeId("optical"), ServiceFormat.OMS.getName(), StringConstants.SERVICE_TYPE_10GE, null);
         pceOtnNode.initXndrTps("mode");
         pceOtnNode.checkAvailableTribPort();
         pceOtnNode.checkAvailableTribSlot();
-        Assert.assertFalse("not valid otn service type" , pceOtnNode.isValid());
+        assertFalse(pceOtnNode.isValid(), "not valid otn service type");
     }
 
     @Test
-    public void testInitXndrTps10GXponderClient1() {
+    void testInitXndrTps10GXponderClient1() {
         node = getNodeBuilder(geSupportingNodes(), OpenroadmTpType.XPONDERCLIENT).build();
         pceOtnNode = new PceOtnNode(node, OpenroadmNodeType.ROADM,
                 new NodeId("optical"), ServiceFormat.OMS.getName(), StringConstants.SERVICE_TYPE_10GE, null);
         pceOtnNode.initXndrTps("mode");
         pceOtnNode.checkAvailableTribPort();
         pceOtnNode.checkAvailableTribSlot();
-        Assert.assertFalse("not valid otn service type", pceOtnNode.isValid());
-        Assert.assertTrue("this.nodeType isn'tOpenroadmNodeType.TPDR" ,
-                pceOtnNode.validateSwitchingPoolBandwidth(null,null,1L));
+        assertFalse(pceOtnNode.isValid(), "not valid otn service type");
+        assertTrue(pceOtnNode.validateSwitchingPoolBandwidth(null, null, 1L),
+            "this.nodeType isn'tOpenroadmNodeType.TPDR");
     }
 
     @Test
-    public void testInitXndrTps1GXponderClient() {
+    void testInitXndrTps1GXponderClient() {
         node = getNodeBuilder(geSupportingNodes(), OpenroadmTpType.XPONDERCLIENT).build();
         pceOtnNode = new PceOtnNode(node, OpenroadmNodeType.MUXPDR,
                 new NodeId("optical"), ServiceFormat.OMS.getName(), StringConstants.SERVICE_TYPE_1GE, null);
         pceOtnNode.initXndrTps("mode");
         pceOtnNode.checkAvailableTribPort();
         pceOtnNode.checkAvailableTribSlot();
-        Assert.assertFalse("not valid otn service type" , pceOtnNode.isValid());
+        assertFalse(pceOtnNode.isValid(), "not valid otn service type");
     }
 
     @Test
-    public void testInitXndrTps10GXponderClient() {
+    void testInitXndrTps10GXponderClient() {
         pceOtnNode = new PceOtnNode(node, OpenroadmNodeType.MUXPDR,
                 new NodeId("optical"), ServiceFormat.OMS.getName(), StringConstants.SERVICE_TYPE_10GE, null);
         pceOtnNode.validateXponder("optical", "sl");
@@ -124,8 +127,8 @@ public class PceOtnNodeTest extends AbstractTest {
         pceOtnNode.initXndrTps("AZ");
         pceOtnNode.checkAvailableTribPort();
         pceOtnNode.checkAvailableTribSlot();
-        Assert.assertFalse("not valid otn service type" , pceOtnNode.isValid());
-        Assert.assertFalse("checkTp returns false by default " , pceOtnNode.checkTP("tp"));
+        assertFalse(pceOtnNode.isValid(), "not valid otn service type");
+        assertFalse(pceOtnNode.checkTP("tp"), "checkTp returns false by default");
     }
 
     private Map<SupportingNodeKey, SupportingNode> geSupportingNodes() {
@@ -156,7 +159,7 @@ public class PceOtnNodeTest extends AbstractTest {
         xpdrTpBldr.addAugmentation(createAnother2TerminationPoint(openroadmTpType).build());
         xpdrTpBldr.addAugmentation(createAnotherTerminationPoint(openroadmTpType).build());
 
-        org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1 node1 = getNode1();
+        org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1 node1 = getNode1();
         TerminationPoint xpdr = xpdrTpBldr.build();
         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 node1Rev180226 =
                 new Node1Builder()
@@ -169,9 +172,8 @@ public class PceOtnNodeTest extends AbstractTest {
                         .Node1Builder()
                         .setTerminationPoint(Map.of(xpdr.key(),xpdr))
                         .build();
-        Node1 node11 = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
+        Node1 node11 = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1Builder()
                 .setOperationalState(State.InService).setAdministrativeState(AdminStates.InService).build();
-
         return new NodeBuilder()
                 .setNodeId(new NodeId("node_test"))
                 .withKey(new NodeKey(new NodeId("node 1")))
@@ -182,9 +184,8 @@ public class PceOtnNodeTest extends AbstractTest {
                 .setSupportingNode(supportingNodes1);
     }
 
-    private org.opendaylight
-            .yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1 getNode1() {
-        return new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1Builder()
+    private org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1 getNode1() {
+        return new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1Builder()
                 .setSrgAttributes(getSrgAttributes())
                 .setDegreeAttributes(getDegAttributes())
                 .build();
@@ -214,12 +215,10 @@ public class PceOtnNodeTest extends AbstractTest {
 
     }
 
-    private org.opendaylight.yang.gen
-            .v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1Builder createAnotherTerminationPoint(
-            OpenroadmTpType openroadmTpType
-    ) {
+    private org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1Builder
+            createAnotherTerminationPoint(OpenroadmTpType openroadmTpType) {
         return new org.opendaylight
-                .yang.gen.v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1Builder()
+                .yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1Builder()
                 .setCtpAttributes((new CtpAttributesBuilder()).build())
                 .setCpAttributes((new CpAttributesBuilder()).build())
                 .setTxTtpAttributes((new TxTtpAttributesBuilder()).setUsedWavelengths(Map.of()).build())
@@ -231,21 +230,21 @@ public class PceOtnNodeTest extends AbstractTest {
                         .setTailEquipmentId("destNode" + "--" + "destTp").build());
     }
 
-    private org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+    private org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
             .TerminationPoint1Builder createOTNTerminationPoint(OpenroadmTpType openroadmTpType) {
 
         SupportedInterfaceCapability supIfCapa = new SupportedInterfaceCapabilityBuilder()
-                .setIfCapType(IfOCHOTU4ODU4.class)
+                .setIfCapType(IfOCHOTU4ODU4.VALUE)
                 .build();
 
         SupportedInterfaceCapability supIfCapa1 = new SupportedInterfaceCapabilityBuilder()
-                .setIfCapType(If100GEODU4.class)
+                .setIfCapType(If100GEODU4.VALUE)
                 .build();
         SupportedInterfaceCapability supIfCapa2 = new SupportedInterfaceCapabilityBuilder()
-                .setIfCapType(If10GEODU2e.class)
+                .setIfCapType(If10GEODU2e.VALUE)
                 .build();
         SupportedInterfaceCapability supIfCapa3 = new SupportedInterfaceCapabilityBuilder()
-                .setIfCapType(If1GEODU0.class)
+                .setIfCapType(If1GEODU0.VALUE)
                 .build();
 
         Map<SupportedInterfaceCapabilityKey,SupportedInterfaceCapability> supIfCapaList = new HashMap<>();
@@ -260,17 +259,16 @@ public class PceOtnNodeTest extends AbstractTest {
 
         XpdrTpPortConnectionAttributesBuilder xtpcaBldr = new XpdrTpPortConnectionAttributesBuilder();
 
-        return new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+        return new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                 .TerminationPoint1Builder()
-                .setTpSupportedInterfaces(tpSupIf)
-                .setXpdrTpPortConnectionAttributes(xtpcaBldr.build());
+            .setTpSupportedInterfaces(tpSupIf)
+            .setXpdrTpPortConnectionAttributes(xtpcaBldr.build());
     }
 
-    private org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
-            .TerminationPoint1Builder createAnother2TerminationPoint(OpenroadmTpType openroadmTpType) {
-        return new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
-                .TerminationPoint1Builder()
-                .setTpType(openroadmTpType).setOperationalState(State.InService)
-                .setAdministrativeState(AdminStates.InService);
+    private org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1Builder
+            createAnother2TerminationPoint(OpenroadmTpType openroadmTpType) {
+        return new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1Builder()
+            .setTpType(openroadmTpType).setOperationalState(State.InService)
+            .setAdministrativeState(AdminStates.InService);
     }
 }
index a058340dfce8f27c809505a0ca4542cb13f102be..68ecb5d8b1b0e5dbb77da35991ef815abbaf06f6 100644 (file)
@@ -7,59 +7,60 @@
  */
 package org.opendaylight.transportpce.pce.networkanalyzer;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
 import java.util.ArrayList;
 import java.util.List;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev181130.OpucnTribSlotDef;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OpucnTribSlotDef;
 
 public class PceResultTest extends AbstractTest {
 
     private PceResult pceResult = null;
 
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp() {
         pceResult = new PceResult();
     }
 
     @Test
-    public void serviceTypeTest() {
+    void serviceTypeTest() {
         String serviceType = "some-service";
         pceResult.setServiceType(serviceType);
-        Assert.assertEquals(pceResult.getServiceType(), serviceType);
+        assertEquals(pceResult.getServiceType(), serviceType);
     }
 
     @Test
-    public void setResultTribSlotNbTest() {
+    void setResultTribSlotNbTest() {
         OpucnTribSlotDef minOpucnTs = new OpucnTribSlotDef("1.1");
         OpucnTribSlotDef maxOpucnTs = new OpucnTribSlotDef("1.20");
         List<OpucnTribSlotDef> minmaxTpTsList = new ArrayList<>();
         minmaxTpTsList.add(minOpucnTs);
         minmaxTpTsList.add(maxOpucnTs);
         pceResult.setResultTribPortTribSlot(minmaxTpTsList);
-        Assert.assertEquals(pceResult.getResultTribPortTribSlot().get(0), new OpucnTribSlotDef("1.1"));
-        Assert.assertEquals(pceResult.getResultTribPortTribSlot().get(1), new OpucnTribSlotDef("1.20"));
+        assertEquals(pceResult.getResultTribPortTribSlot().get(0), new OpucnTribSlotDef("1.1"));
+        assertEquals(pceResult.getResultTribPortTribSlot().get(1), new OpucnTribSlotDef("1.20"));
     }
 
     @Test
-    public void calcMessageTest() {
+    void calcMessageTest() {
         pceResult.setCalcMessage("some-message");
         pceResult.setRC("200");
-        Assert.assertEquals(pceResult.getMessage(), "Path is calculated by PCE");
+        assertEquals(pceResult.getMessage(), "Path is calculated by PCE");
     }
 
     @Test
-    public void waveLengthTest() {
-        Assert.assertEquals(0, pceResult.getResultWavelength());
+    void waveLengthTest() {
+        assertEquals(0, pceResult.getResultWavelength());
         pceResult.setResultWavelength(12);
-        Assert.assertEquals(12, pceResult.getResultWavelength());
+        assertEquals(12, pceResult.getResultWavelength());
     }
 
     @Test
-    public void localCause() {
+    void localCause() {
         pceResult.setLocalCause(PceResult.LocalCause.INT_PROBLEM);
-        Assert.assertEquals(pceResult.getLocalCause(), PceResult.LocalCause.INT_PROBLEM);
+        assertEquals(pceResult.getLocalCause(), PceResult.LocalCause.INT_PROBLEM);
     }
 }
diff --git a/pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/port/ClientPreferenceTest.java b/pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/port/ClientPreferenceTest.java
new file mode 100644 (file)
index 0000000..2466221
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Copyright © 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.pce.networkanalyzer.port;
+
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+class ClientPreferenceTest {
+
+    @Test
+    void preferredPort_returnTrue() {
+
+        Map<String, Set<String>> nodePortPreference = new HashMap<>();
+        nodePortPreference.put("ROADM-B-SRG1", Set.of("SRG1-PP1-TXRX"));
+
+        Preference clientPreference = new ClientPreference(nodePortPreference);
+
+        Assertions.assertTrue(clientPreference.isPreferredPort("ROADM-B-SRG1", "SRG1-PP1-TXRX"));
+    }
+
+    /**
+     * The client prefer to use SRG1-PP1-TXRX on ROADM-B-SRG1.
+     * Therefore, preferredPort returns false on SRG1-PP2-TXRX.
+     */
+    @Test
+    void nonPreferredPort_returnFalse() {
+
+        Map<String, Set<String>> nodePortPreference = new HashMap<>();
+        nodePortPreference.put("ROADM-B-SRG1", Set.of("SRG1-PP1-TXRX"));
+
+        Preference clientPreference = new ClientPreference(nodePortPreference);
+
+        Assertions.assertFalse(clientPreference.isPreferredPort("ROADM-B-SRG1", "SRG1-PP2-TXRX"));
+    }
+
+    /**
+     * In this scenario ROADM-A-SRG1 is missing from the client preferred list.
+     * We treat this as the client has no opinion on what port
+     * to use on ROADM-A-SRG1. Meaning, as far as the client goes, all
+     * ports on ROADM-A-SRG1 are fine.
+     */
+    @Test
+    void nodeMissingInPreferredList_returnTrue() {
+
+        Map<String, Set<String>> nodePortPreference = new HashMap<>();
+        nodePortPreference.put("ROADM-B-SRG1", Set.of("SRG1-PP1-TXRX"));
+
+        Preference clientPreference = new ClientPreference(nodePortPreference);
+
+        Assertions.assertTrue(clientPreference.isPreferredPort("ROADM-A-SRG1", "SRG1-PP2-TXRX"));
+
+    }
+}
\ No newline at end of file
diff --git a/pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/port/PreferenceFactoryTest.java b/pce/src/test/java/org/opendaylight/transportpce/pce/networkanalyzer/port/PreferenceFactoryTest.java
new file mode 100644 (file)
index 0000000..818bbf6
--- /dev/null
@@ -0,0 +1,312 @@
+/*
+ * Copyright (c) 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.pce.networkanalyzer.port;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.request.input.ServiceAEnd;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.request.input.ServiceZEnd;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.port.PortBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.RxDirection;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.TxDirection;
+
+class PreferenceFactoryTest {
+
+    @Test
+    void emptyPathComputationRequest_returnEmptyHashmap() {
+
+        PathComputationRequestInput pathComputationRequestInput = Mockito.mock(PathComputationRequestInput.class);
+        PreferenceFactory portPreferenceFactory = new PreferenceFactory();
+
+        Map<String, Set<String>> expected = new HashMap<>();
+        Assertions.assertEquals(expected, portPreferenceFactory.nodePortMap(pathComputationRequestInput));
+
+    }
+
+    @Test
+    void pathComputationRequestServiceAEndRxDirectionWithoutDeviceAndPort_returnEmptyHashmap() {
+
+        PathComputationRequestInput pathComputationRequestInput = Mockito.mock(PathComputationRequestInput.class);
+        ServiceAEnd serviceAEnd = Mockito.mock(ServiceAEnd.class);
+        RxDirection rxDirection = Mockito.mock(RxDirection.class);
+
+        Mockito.when(rxDirection.getPort()).thenReturn(new PortBuilder().build());
+        Mockito.when(serviceAEnd.getRxDirection()).thenReturn(rxDirection);
+        Mockito.when(pathComputationRequestInput.getServiceAEnd()).thenReturn(serviceAEnd);
+
+        PreferenceFactory portPreferenceFactory = new PreferenceFactory();
+
+        Map<String, Set<String>> expected = new HashMap<>();
+        Assertions.assertEquals(expected, portPreferenceFactory.nodePortMap(pathComputationRequestInput));
+
+    }
+
+    @Test
+    void pathComputationRequestServiceAEndRxDirectionWithoutPort_returnEmptyHashmap() {
+
+        PathComputationRequestInput pathComputationRequestInput = Mockito.mock(PathComputationRequestInput.class);
+        ServiceAEnd serviceAEnd = Mockito.mock(ServiceAEnd.class);
+        RxDirection rxDirection = Mockito.mock(RxDirection.class);
+
+        Mockito.when(rxDirection.getPort()).thenReturn(
+            new PortBuilder()
+                .setPortDeviceName("ROADM-B-SRG1")
+                .build()
+        );
+        Mockito.when(serviceAEnd.getRxDirection()).thenReturn(rxDirection);
+        Mockito.when(pathComputationRequestInput.getServiceAEnd()).thenReturn(serviceAEnd);
+
+        PreferenceFactory portPreferenceFactory = new PreferenceFactory();
+
+        Map<String, Set<String>> expected = new HashMap<>();
+        Assertions.assertEquals(expected, portPreferenceFactory.nodePortMap(pathComputationRequestInput));
+
+    }
+
+    @Test
+    void pathComputationRequestServiceAEndRxDirectionTxRx_returnHashmap() {
+
+        PathComputationRequestInput pathComputationRequestInput = Mockito.mock(PathComputationRequestInput.class);
+        ServiceAEnd serviceAEnd = Mockito.mock(ServiceAEnd.class);
+        RxDirection rxDirection = Mockito.mock(RxDirection.class);
+
+        Mockito.when(rxDirection.getPort()).thenReturn(
+            new PortBuilder()
+                .setPortDeviceName("ROADM-B-SRG1")
+                .setPortName("SRG1-PP1-TXRX")
+                .build()
+        );
+        Mockito.when(serviceAEnd.getRxDirection()).thenReturn(rxDirection);
+        Mockito.when(pathComputationRequestInput.getServiceAEnd()).thenReturn(serviceAEnd);
+
+        Map<String, Set<String>> expected = new HashMap<>();
+        expected.put("ROADM-B-SRG1", Set.of("SRG1-PP1-TXRX"));
+        PreferenceFactory portPreferenceFactory = new PreferenceFactory();
+
+        Assertions.assertEquals(expected, portPreferenceFactory.nodePortMap(pathComputationRequestInput));
+
+    }
+
+    @Test
+    void pathComputationRequestServiceAEndRxDirectionTx_returnHashmap() {
+
+        PathComputationRequestInput pathComputationRequestInput = Mockito.mock(PathComputationRequestInput.class);
+        ServiceAEnd serviceAEnd = Mockito.mock(ServiceAEnd.class);
+        RxDirection rxDirection = Mockito.mock(RxDirection.class);
+
+        Mockito.when(rxDirection.getPort()).thenReturn(
+            new PortBuilder()
+                .setPortDeviceName("ROADM-B-SRG1")
+                .setPortName("SRG1-PP1-TX")
+                .build()
+        );
+        Mockito.when(serviceAEnd.getRxDirection()).thenReturn(rxDirection);
+        Mockito.when(pathComputationRequestInput.getServiceAEnd()).thenReturn(serviceAEnd);
+
+        Map<String, Set<String>> expected = new HashMap<>();
+        expected.put("ROADM-B-SRG1", Set.of("SRG1-PP1-TX"));
+        PreferenceFactory portPreferenceFactory = new PreferenceFactory();
+
+        Assertions.assertEquals(expected, portPreferenceFactory.nodePortMap(pathComputationRequestInput));
+
+    }
+
+    @Test
+    void pathComputationRequestServiceAEndRxDirectionRx_returnHashmap() {
+
+        PathComputationRequestInput pathComputationRequestInput = Mockito.mock(PathComputationRequestInput.class);
+        ServiceAEnd serviceAEnd = Mockito.mock(ServiceAEnd.class);
+        TxDirection txDirection = Mockito.mock(TxDirection.class);
+
+        Mockito.when(txDirection.getPort()).thenReturn(
+            new PortBuilder()
+                .setPortDeviceName("ROADM-B-SRG1")
+                .setPortName("SRG1-PP1-RX")
+                .build()
+        );
+        Mockito.when(serviceAEnd.getTxDirection()).thenReturn(txDirection);
+        Mockito.when(pathComputationRequestInput.getServiceAEnd()).thenReturn(serviceAEnd);
+
+        Map<String, Set<String>> expected = new HashMap<>();
+        expected.put("ROADM-B-SRG1", Set.of("SRG1-PP1-RX"));
+        PreferenceFactory portPreferenceFactory = new PreferenceFactory();
+
+        Assertions.assertEquals(expected, portPreferenceFactory.nodePortMap(pathComputationRequestInput));
+
+    }
+
+    @Test
+    void pathComputationRequestServiceZEndRx_returnHashmap() {
+
+        PathComputationRequestInput pathComputationRequestInput = Mockito.mock(PathComputationRequestInput.class);
+        ServiceZEnd serviceZEnd = Mockito.mock(ServiceZEnd.class);
+        RxDirection rxDirection = Mockito.mock(RxDirection.class);
+
+        Mockito.when(rxDirection.getPort()).thenReturn(
+            new PortBuilder()
+                .setPortDeviceName("ROADM-B-SRG1")
+                .setPortName("SRG1-PP1-TXRX")
+                .build()
+        );
+        Mockito.when(serviceZEnd.getRxDirection()).thenReturn(rxDirection);
+        Mockito.when(pathComputationRequestInput.getServiceZEnd()).thenReturn(serviceZEnd);
+
+        Map<String, Set<String>> expected = new HashMap<>();
+        expected.put("ROADM-B-SRG1", Set.of("SRG1-PP1-TXRX"));
+        PreferenceFactory portPreferenceFactory = new PreferenceFactory();
+
+        Assertions.assertEquals(expected, portPreferenceFactory.nodePortMap(pathComputationRequestInput));
+
+    }
+
+    @Test
+    void pathComputationRequestServiceZEndTxDirectionTxRx_returnHashmap() {
+
+        PathComputationRequestInput pathComputationRequestInput = Mockito.mock(PathComputationRequestInput.class);
+        ServiceZEnd serviceZEnd = Mockito.mock(ServiceZEnd.class);
+        TxDirection txDirection = Mockito.mock(TxDirection.class);
+
+        Mockito.when(txDirection.getPort()).thenReturn(
+            new PortBuilder()
+                .setPortDeviceName("ROADM-B-SRG1")
+                .setPortName("SRG1-PP1-TXRX")
+                .build()
+        );
+        Mockito.when(serviceZEnd.getTxDirection()).thenReturn(txDirection);
+        Mockito.when(pathComputationRequestInput.getServiceZEnd()).thenReturn(serviceZEnd);
+
+        Map<String, Set<String>> expected = new HashMap<>();
+        expected.put("ROADM-B-SRG1", Set.of("SRG1-PP1-TXRX"));
+        PreferenceFactory portPreferenceFactory = new PreferenceFactory();
+
+        Assertions.assertEquals(expected, portPreferenceFactory.nodePortMap(pathComputationRequestInput));
+
+    }
+
+    @Test
+    void pathComputationRequestServiceZEndTxDirectionTx_returnHashmap() {
+
+        PathComputationRequestInput pathComputationRequestInput = Mockito.mock(PathComputationRequestInput.class);
+        ServiceZEnd serviceZEnd = Mockito.mock(ServiceZEnd.class);
+        TxDirection txDirection = Mockito.mock(TxDirection.class);
+
+        Mockito.when(txDirection.getPort()).thenReturn(
+            new PortBuilder()
+                .setPortDeviceName("ROADM-B-SRG1")
+                .setPortName("SRG1-PP1-TX")
+                .build()
+        );
+        Mockito.when(serviceZEnd.getTxDirection()).thenReturn(txDirection);
+        Mockito.when(pathComputationRequestInput.getServiceZEnd()).thenReturn(serviceZEnd);
+
+        Map<String, Set<String>> expected = new HashMap<>();
+        expected.put("ROADM-B-SRG1", Set.of("SRG1-PP1-TX"));
+        PreferenceFactory portPreferenceFactory = new PreferenceFactory();
+
+        Assertions.assertEquals(expected, portPreferenceFactory.nodePortMap(pathComputationRequestInput));
+
+    }
+
+    @Test
+    void pathComputationRequestServiceZEndTxDirectionRx_returnHashmap() {
+
+        PathComputationRequestInput pathComputationRequestInput = Mockito.mock(PathComputationRequestInput.class);
+        ServiceZEnd serviceZEnd = Mockito.mock(ServiceZEnd.class);
+        TxDirection txDirection = Mockito.mock(TxDirection.class);
+
+        Mockito.when(txDirection.getPort()).thenReturn(
+            new PortBuilder()
+                .setPortDeviceName("ROADM-B-SRG1")
+                .setPortName("SRG1-PP1-RX")
+                .build()
+        );
+        Mockito.when(serviceZEnd.getTxDirection()).thenReturn(txDirection);
+        Mockito.when(pathComputationRequestInput.getServiceZEnd()).thenReturn(serviceZEnd);
+
+        Map<String, Set<String>> expected = new HashMap<>();
+        expected.put("ROADM-B-SRG1", Set.of("SRG1-PP1-RX"));
+        PreferenceFactory portPreferenceFactory = new PreferenceFactory();
+
+        Assertions.assertEquals(expected, portPreferenceFactory.nodePortMap(pathComputationRequestInput));
+
+    }
+
+    @Test
+    void pathEmptyComputationRequestServiceZEndTx_returnHashmap() {
+
+        PathComputationRequestInput pathComputationRequestInput = Mockito.mock(PathComputationRequestInput.class);
+        ServiceZEnd serviceZEnd = Mockito.mock(ServiceZEnd.class);
+        TxDirection txDirection = Mockito.mock(TxDirection.class);
+
+        Mockito.when(txDirection.getPort()).thenReturn(
+            new PortBuilder()
+                .setPortDeviceName("ROADM-B-SRG1")
+                .setPortName(" ")
+                .build()
+        );
+        Mockito.when(serviceZEnd.getTxDirection()).thenReturn(txDirection);
+        Mockito.when(pathComputationRequestInput.getServiceZEnd()).thenReturn(serviceZEnd);
+
+        Map<String, Set<String>> expected = new HashMap<>();
+
+        PreferenceFactory portPreferenceFactory = new PreferenceFactory();
+        Assertions.assertEquals(expected, portPreferenceFactory.nodePortMap(pathComputationRequestInput));
+
+    }
+
+    @Test
+    void pathUnexpectedPortName_returnHashmap() {
+
+        PathComputationRequestInput pathComputationRequestInput = Mockito.mock(PathComputationRequestInput.class);
+        ServiceZEnd serviceZEnd = Mockito.mock(ServiceZEnd.class);
+        TxDirection txDirection = Mockito.mock(TxDirection.class);
+
+        Mockito.when(txDirection.getPort()).thenReturn(
+            new PortBuilder()
+                .setPortDeviceName("ROADM-B-SRG1")
+                .setPortName("FUBAR")
+                .build()
+        );
+        Mockito.when(serviceZEnd.getTxDirection()).thenReturn(txDirection);
+        Mockito.when(pathComputationRequestInput.getServiceZEnd()).thenReturn(serviceZEnd);
+
+        Map<String, Set<String>> expected = new HashMap<>();
+        expected.put("ROADM-B-SRG1", Set.of("FUBAR"));
+
+        PreferenceFactory portPreferenceFactory = new PreferenceFactory();
+        Assertions.assertEquals(expected, portPreferenceFactory.nodePortMap(pathComputationRequestInput));
+
+    }
+
+    @Test
+    void addingMultiplePort() {
+
+        PreferenceFactory portPreferenceFactory = new PreferenceFactory();
+        Map<String, Set<String>> mapper = new HashMap<>();
+
+        //New ports
+        Assertions.assertTrue(portPreferenceFactory.add("ROADM-B-SRG1", "SRG1-PP1-TXRX", mapper));
+        Assertions.assertTrue(portPreferenceFactory.add("ROADM-B-SRG1", "SRG1-PP2-TXRX", mapper));
+        Assertions.assertTrue(portPreferenceFactory.add("ROADM-B-SRG1", "SRG1-PP3-RX", mapper));
+        Assertions.assertTrue(portPreferenceFactory.add("ROADM-B-SRG1", "SRG1-PP3-TX", mapper));
+
+        //This port already exists, should return false.
+        Assertions.assertFalse(portPreferenceFactory.add("ROADM-B-SRG1", "SRG1-PP2-TXRX", mapper));
+
+        Assertions.assertEquals(
+            Set.of("SRG1-PP1-TXRX", "SRG1-PP2-TXRX", "SRG1-PP3-RX", "SRG1-PP3-TX"),
+            mapper.get("ROADM-B-SRG1")
+        );
+    }
+}
\ No newline at end of file
index 4d5f0df891b793b0c892609e4ecfaee977970352..4408d094ed0e3ff4f726888a2ba29f067a1e55b6 100644 (file)
@@ -7,79 +7,74 @@
  */
 package org.opendaylight.transportpce.pce.service;
 
-import java.math.BigDecimal;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
 import java.util.Map;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.mockito.Mockito;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.pce.utils.PceTestData;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.PathBandwidth;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.generic.path.properties.PathPropertiesBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.generic.path.properties.path.properties.PathMetric;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.generic.path.properties.path.properties.PathMetricBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.no.path.info.NoPathBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.result.Response;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.result.ResponseBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.result.ResponseKey;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.result.response.response.type.NoPathCaseBuilder;
-import org.opendaylight.yang.gen.v1.gnpy.path.rev220221.result.response.response.type.PathCaseBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.PathBandwidth;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.generic.path.properties.PathPropertiesBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.generic.path.properties.path.properties.PathMetric;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.generic.path.properties.path.properties.PathMetricBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.no.path.info.NoPathBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.result.Response;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.result.ResponseBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.result.ResponseKey;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.result.response.response.type.NoPathCaseBuilder;
+import org.opendaylight.yang.gen.v1.gnpy.path.rev220615.result.response.response.type.PathCaseBuilder;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 
 public class PathComputationServiceImplTest extends AbstractTest {
 
     private PathComputationServiceImpl pathComputationServiceImpl;
     private static NetworkTransactionService networkTransactionService = null;
 
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp() {
         networkTransactionService = Mockito.mock(NetworkTransactionService.class);
         pathComputationServiceImpl = new PathComputationServiceImpl(
                 networkTransactionService,
                 this.getNotificationPublishService(), null, null);
-        pathComputationServiceImpl.init();
     }
 
     @Test
-    public void pathComputationRequestTest() {
+    void pathComputationRequestTest() {
         pathComputationServiceImpl.generateGnpyResponse(null,"path");
-        Assert.assertNotNull(
-                pathComputationServiceImpl.pathComputationRequest(PceTestData.getPCE_simpletopology_test1_request()));
-
+        assertNotNull(
+            pathComputationServiceImpl.pathComputationRequest(PceTestData.getPCE_simpletopology_test1_request()));
     }
 
     @Test
-    public void testPathComputationRequestNoPath() {
+    void testPathComputationRequestNoPath() {
         Response response = new ResponseBuilder()
                 .withKey(new ResponseKey("responseId")).setResponseType(new NoPathCaseBuilder()
                 .setNoPath(new NoPathBuilder().setNoPath("no path").build()).build()).build();
 
         pathComputationServiceImpl.generateGnpyResponse(response,"path");
-        Assert.assertNotNull(
-                pathComputationServiceImpl.pathComputationRequest(PceTestData.getPCE_test3_request_54()));
-
+        assertNotNull(pathComputationServiceImpl.pathComputationRequest(PceTestData.getPCE_test3_request_54()));
     }
 
     @Test
-    public void testPathComputationRequestPathCase() {
+    void testPathComputationRequestPathCase() {
         PathMetric pathMetric = new PathMetricBuilder()
-                .setAccumulativeValue(new BigDecimal(21))
-                .setMetricType(PathBandwidth.class).build();
+                .setAccumulativeValue(Decimal64.valueOf("21"))
+                .setMetricType(PathBandwidth.VALUE).build();
         Response response = new ResponseBuilder()
                 .withKey(new ResponseKey("responseId")).setResponseType(new PathCaseBuilder()
                 .setPathProperties(new PathPropertiesBuilder().setPathMetric(Map.of(pathMetric.key(),pathMetric))
                 .build()).build()).build();
 
         pathComputationServiceImpl.generateGnpyResponse(response,"path");
-        Assert.assertNotNull(
-                pathComputationServiceImpl.pathComputationRequest(PceTestData.getPCE_test3_request_54()));
-
+        assertNotNull(pathComputationServiceImpl.pathComputationRequest(PceTestData.getPCE_test3_request_54()));
     }
 
-    @After
-    public void destroy() {
-        pathComputationServiceImpl.close();
+    @Test
+    void pathComputationRerouteRequestTest() {
+        pathComputationServiceImpl.generateGnpyResponse(null,"path");
+        assertNotNull(pathComputationServiceImpl.pathComputationRerouteRequest(PceTestData.getPCEReroute()));
     }
 }
index be299d89bf3b1545cf23731424fcfc589f888606..d516646f413b56869dac33a3049e3a480489d872 100644 (file)
@@ -11,12 +11,14 @@ import com.google.gson.stream.JsonReader;
 import java.io.IOException;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map.Entry;
 import java.util.ServiceLoader;
 import org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext;
 import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
 import org.opendaylight.mdsal.binding.runtime.api.BindingRuntimeContext;
 import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers;
 import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.YangModelBindingProvider;
 import org.opendaylight.yangtools.yang.binding.YangModuleInfo;
 import org.opendaylight.yangtools.yang.common.QName;
@@ -25,7 +27,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStre
 import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
 import org.opendaylight.yangtools.yang.data.codec.gson.JsonParserStream;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
-import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
+import org.opendaylight.yangtools.yang.data.impl.schema.NormalizationResultHolder;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -58,17 +60,15 @@ public final class JsonUtil {
     }
 
     public DataObject getDataObjectFromJson(JsonReader reader, QName pathQname) {
-        NormalizedNodeResult result = new NormalizedNodeResult();
-        try (NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
+        NormalizationResultHolder resultHolder = new NormalizationResultHolder();
+        try (NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(resultHolder);
                 JsonParserStream jsonParser = JsonParserStream.create(streamWriter,
                     JSONCodecFactorySupplier.RFC7951.getShared(schemaCtx));) {
             jsonParser.parse(reader);
             YangInstanceIdentifier yangId = YangInstanceIdentifier.of(pathQname);
-            if (bindingDOMCodecServices.fromNormalizedNode(yangId, result.getResult()) != null) {
-                return bindingDOMCodecServices.fromNormalizedNode(yangId, result.getResult()).getValue();
-            } else {
-                return null;
-            }
+            Entry<InstanceIdentifier<?>, DataObject> entry =
+                bindingDOMCodecServices.fromNormalizedNode(yangId, resultHolder.getResult().data());
+            return entry == null ? null : entry.getValue();
         } catch (IOException | IllegalArgumentException e) {
             LOG.error("Cannot deserialize JSON ", e);
             return null;
index 74fd2d54f198f9651fb2f4860d552ad556a8d42c..de5ecb61889a0d346d47d31576ee566bac1ff907 100644 (file)
@@ -8,43 +8,47 @@
 
 package org.opendaylight.transportpce.pce.utils;
 
+import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import org.opendaylight.transportpce.common.NetworkUtils;
 import org.opendaylight.transportpce.common.fixedflex.GridUtils;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.link.types.rev191129.RatioDB;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1Builder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.link.OMSAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.link.oms.attributes.SpanBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.DegreeAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.DegreeAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.SrgAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.SrgAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.CpAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.CtpAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.PpAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.RxTtpAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.TxTtpAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.XpdrClientAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.XpdrNetworkAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.termination.point.XpdrPortAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.termination.point.TpSupportedInterfaces;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.termination.point.TpSupportedInterfacesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.networks.network.node.termination.point.XpdrTpPortConnectionAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If100GEODU4;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If10GEODU2e;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If1GEODU0;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOCHOTU4ODU4;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.span.attributes.LinkConcatenation1.FiberType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.span.attributes.LinkConcatenation1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.link.OMSAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.link.oms.attributes.SpanBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.DegreeAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.DegreeAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.SrgAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.SrgAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.CpAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.CtpAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.PpAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.RxTtpAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.TxTtpAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrClientAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrNetworkAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrPortAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.link.concatenation.LinkConcatenation;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.link.concatenation.LinkConcatenationBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.link.concatenation.LinkConcatenationKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.networks.network.node.termination.point.TpSupportedInterfacesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.networks.network.node.termination.point.XpdrTpPortConnectionAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If100GEODU4;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If10GEODU2e;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If1GEODU0;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOCHOTU4ODU4;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.NodeBuilder;
@@ -55,7 +59,6 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.LinkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkKey;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.link.DestinationBuilder;
@@ -63,184 +66,299 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.top
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey;
-import org.opendaylight.yangtools.yang.binding.Augmentation;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.Uint32;
 
 public final class NodeUtils {
 
     private static final String LINK_ID_FORMAT = "%1$s-%2$sto%3$s-%4$s";
 
-    public static LinkBuilder createLinkBuilder(
+    public static LinkBuilder createLinkBuilder(boolean omsPresent,
             String srcNode, String destNode, String srcTp, String destTp, Link1Builder link1Builder) {
-        SourceBuilder ietfSrcLinkBldr =
-                new SourceBuilder().setSourceNode(new NodeId(srcNode)).setSourceTp(new TpId(srcTp));
-        //create destination link
-        DestinationBuilder ietfDestLinkBldr =
-                new DestinationBuilder().setDestNode(new NodeId(destNode)).setDestTp(new TpId(destTp));
         LinkId linkId = new LinkId(String.format(LINK_ID_FORMAT, srcNode, srcTp, destNode, destTp));
-
-        LinkId oppositeLinkId = new LinkId("OpenROADM-3-2-DEG1-to-OpenROADM-3-1-DEG1");
-        // Augementation
-        Augmentation<Link> aug11 = new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210
-                .Link1Builder()
-                .setAmplified(true)
-                .setOMSAttributes(new OMSAttributesBuilder()
-                        .setSpan(new SpanBuilder().build())
+        var oppLink1 = link1Builder
+            .setOppositeLink(new LinkId(String.format(LINK_ID_FORMAT, destNode, destTp, srcNode, srcTp)))
+            .build();
+        LinkBuilder linkBldr =
+            new LinkBuilder()
+                .setSource(
+                    new SourceBuilder().setSourceNode(new NodeId(srcNode)).setSourceTp(new TpId(srcTp)).build())
+                .setDestination(
+                    new DestinationBuilder().setDestNode(new NodeId(destNode)).setDestTp(new TpId(destTp)).build())
+                .setLinkId(linkId);
+        if (!omsPresent) {
+            return linkBldr
+                .withKey(new LinkKey(linkId))
+                .addAugmentation(oppLink1);
+        }
+        LinkConcatenation linkConcatenation = new LinkConcatenationBuilder()
+            .withKey(new LinkConcatenationKey(Uint32.valueOf(1)))
+            .setSRLGLength(Decimal64.valueOf(50000, RoundingMode.FLOOR))
+            .addAugmentation(new LinkConcatenation1Builder().setFiberType(FiberType.Smf).build())
+            .build();
+        return linkBldr
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Link1Builder()
+                        .setAmplified(false)
+                        .setOMSAttributes(
+                            new OMSAttributesBuilder()
+                                .setSpan(
+                                    new SpanBuilder()
+                                        .setSpanlossCurrent(new RatioDB(Decimal64.valueOf("20")))
+                                        .setLinkConcatenation(Map.of(linkConcatenation.key(), linkConcatenation))
+                                        .build())
+                                .build())
                         .build())
-                .build();
-        return new LinkBuilder()
-                .setSource(ietfSrcLinkBldr.build())
-                .setDestination(ietfDestLinkBldr.build())
-                .setLinkId(linkId)
-                .addAugmentation(aug11)
                 .withKey(new LinkKey(linkId))
-                .addAugmentation(link1Builder.setOppositeLink(oppositeLinkId).build());
+                .addAugmentation(oppLink1);
     }
 
     public static LinkBuilder createRoadmToRoadm(String srcNode, String destNode, String srcTp, String destTp) {
-        Link1Builder link1Builder = new Link1Builder()
-                .setLinkLatency(Uint32.valueOf(30))
+        return createLinkBuilder(true, srcNode, destNode, srcTp, destTp,
+            new Link1Builder()
+                .setLinkLatency(Uint32.valueOf(2))
+                .setLinkLength(Decimal64.valueOf("50.0"))
                 .setLinkType(OpenroadmLinkType.ROADMTOROADM)
                 .setAdministrativeState(AdminStates.InService)
-                .setOperationalState(State.InService);
-        return createLinkBuilder(srcNode, destNode, srcTp, destTp, link1Builder);
+                .setOperationalState(State.InService));
+    }
+
+    public static LinkBuilder createAdd(String srcNode, String destNode, String srcTp, String destTp) {
+        return createLinkBuilder(false, srcNode, destNode, srcTp, destTp,
+            new Link1Builder()
+               .setLinkLatency(Uint32.valueOf(0))
+               .setLinkLength(Decimal64.valueOf("0.01"))
+               .setLinkType(OpenroadmLinkType.ADDLINK)
+               .setAdministrativeState(AdminStates.InService)
+               .setOperationalState(State.InService));
+    }
+
+    public static LinkBuilder createDrop(String srcNode, String destNode, String srcTp, String destTp) {
+        return createLinkBuilder(false, srcNode, destNode, srcTp, destTp,
+            new Link1Builder()
+                .setLinkLatency(Uint32.valueOf(0))
+                .setLinkLength(Decimal64.valueOf("0.01"))
+                .setLinkType(OpenroadmLinkType.DROPLINK)
+                .setAdministrativeState(AdminStates.InService)
+                .setOperationalState(State.InService));
+    }
+
+    public static LinkBuilder createXpdrToSrg(String srcNode, String destNode, String srcTp, String destTp) {
+        return createLinkBuilder(false, srcNode, destNode, srcTp, destTp,
+            new Link1Builder()
+                .setLinkLatency(Uint32.valueOf(0))
+                .setLinkLength(Decimal64.valueOf("0.01"))
+                .setLinkType(OpenroadmLinkType.XPONDEROUTPUT)
+                .setAdministrativeState(AdminStates.InService)
+                .setOperationalState(State.InService));
+    }
 
+    public static LinkBuilder createSrgToXpdr(String srcNode, String destNode, String srcTp, String destTp) {
+        return createLinkBuilder(false, srcNode, destNode, srcTp, destTp,
+            new Link1Builder()
+                .setLinkLatency(Uint32.valueOf(0))
+                .setLinkLength(Decimal64.valueOf("0.01"))
+                .setLinkType(OpenroadmLinkType.XPONDERINPUT)
+                .setAdministrativeState(AdminStates.InService)
+                .setOperationalState(State.InService));
     }
 
     public static Map<SupportingNodeKey, SupportingNode> geSupportingNodes() {
-        Map<SupportingNodeKey, SupportingNode> supportingNodes1 = new HashMap<>();
         SupportingNode supportingNode1 = new SupportingNodeBuilder()
                 .setNodeRef(new NodeId("node 1"))
                 .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))
                 .build();
-        supportingNodes1
-                .put(supportingNode1.key(),supportingNode1);
-
         SupportingNode supportingNode2 = new SupportingNodeBuilder()
                 .setNodeRef(new NodeId("node 2"))
                 .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))
                 .build();
-        supportingNodes1
-                .put(supportingNode2.key(),supportingNode2);
-        return supportingNodes1;
+        return new HashMap<>(
+            Map.of(
+                supportingNode1.key(),supportingNode1,
+                supportingNode2.key(),supportingNode2
+            ));
     }
 
     public static NodeBuilder getNodeBuilder(Map<SupportingNodeKey,SupportingNode> supportingNodes1) {
-
-
         //update tp of nodes
-        TerminationPointBuilder xpdrTpBldr = new TerminationPointBuilder()
-                .withKey(new TerminationPointKey(new TpId("xpdr")));
-        TerminationPoint1Builder tp1Bldr = new TerminationPoint1Builder();
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder tp11Bldr =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder()
-                .setAdministrativeState(AdminStates.InService)
-                .setOperationalState(State.InService);
-
-        tp1Bldr.setTpType(OpenroadmTpType.XPONDERNETWORK);
-        xpdrTpBldr.addAugmentation(tp1Bldr.build());
-        xpdrTpBldr.addAugmentation(tp11Bldr.build());
-        TerminationPoint xpdr = xpdrTpBldr.build();
-        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 node1 =
-            new Node1Builder().setTerminationPoint(Map.of(xpdr.key(),xpdr)).build();
-        Node1 node11 = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder()
-            .setAdministrativeState(AdminStates.InService)
-            .setOperationalState(State.InService).build();
+        TerminationPoint xpdrNw =
+            new TerminationPointBuilder()
+                .withKey(new TerminationPointKey(new TpId("xpdrNWTXRX")))
+                .addAugmentation(
+                    new TerminationPoint1Builder()
+                        .setTpType(OpenroadmTpType.XPONDERNETWORK)
+                        .build())
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
+                            .TerminationPoint1Builder()
+                        .setAdministrativeState(AdminStates.InService)
+                        .setOperationalState(State.InService)
+                        .build())
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526
+                            .TerminationPoint1Builder()
+                        .setXpdrNetworkAttributes(
+                            new XpdrNetworkAttributesBuilder()
+                                .setState(State.InService)
+                                .build())
+                        .build())
+                .build();
+        TerminationPoint xpdrClient =
+            new TerminationPointBuilder()
+                .withKey(new TerminationPointKey(new TpId("xpdrClientTXRX")))
+                .addAugmentation(
+                    new TerminationPoint1Builder()
+                        .setTpType(OpenroadmTpType.XPONDERCLIENT)
+                        .build())
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
+                            .TerminationPoint1Builder()
+                        .setAdministrativeState(AdminStates.InService)
+                        .setOperationalState(State.InService)
+                        .build())
+                .build();
         return new NodeBuilder()
-                .setNodeId(new NodeId("node 1"))
-                .withKey(new NodeKey(new NodeId("node 1")))
-                .addAugmentation(node1)
-                .addAugmentation(node11)
+                .setNodeId(new NodeId("XPDR1"))
+                .withKey(new NodeKey(new NodeId("XPDR1")))
+                .addAugmentation(
+                    new Node1Builder()
+                        .setTerminationPoint(Map.of(xpdrNw.key(),xpdrNw, xpdrClient.key(), xpdrClient))
+                        .build())
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1Builder()
+                        .setAdministrativeState(AdminStates.InService)
+                        .setOperationalState(State.InService)
+                        .build())
                 .setSupportingNode(supportingNodes1);
     }
 
+    public static NodeBuilder getDegNodeBuilder(Map<SupportingNodeKey, SupportingNode> supportingNodes, String nodeId) {
+        // update tp of nodes
+        TerminationPoint degTTP = new TerminationPointBuilder()
+            .withKey(new TerminationPointKey(new TpId("DEG1-TTP-TXRX")))
+            .addAugmentation(
+                new TerminationPoint1Builder()
+                    .setTpType(OpenroadmTpType.DEGREETXRXTTP)
+                    .setAdministrativeState(AdminStates.InService)
+                    .setOperationalState(State.InService)
+                    .build())
+            .build();
+        TerminationPoint degCTP = new TerminationPointBuilder()
+            .withKey(new TerminationPointKey(new TpId("DEG1-CTP-TXRX")))
+            .addAugmentation(
+                new TerminationPoint1Builder()
+                    .setTpType(OpenroadmTpType.DEGREETXRXCTP)
+                    .setAdministrativeState(AdminStates.InService)
+                    .setOperationalState(State.InService)
+                    .build())
+            .build();
+        return new NodeBuilder()
+            .setNodeId(new NodeId(nodeId))
+            .withKey(new NodeKey(new NodeId(nodeId)))
+            .addAugmentation(
+                new Node1Builder()
+                    .setTerminationPoint(Map.of(degTTP.key(), degTTP, degCTP.key(), degCTP))
+                .build())
+            .addAugmentation(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1Builder()
+                    .setOperationalState(State.InService).setAdministrativeState(AdminStates.InService).build())
+            .setSupportingNode(supportingNodes);
+    }
+
+    public static NodeBuilder getSrgNodeBuilder(Map<SupportingNodeKey, SupportingNode> supportingNodes, String nodeId) {
+        // update tp of nodes
+        TerminationPoint srgPP = new TerminationPointBuilder()
+            .withKey(new TerminationPointKey(new TpId("SRG1-PP-TXRX")))
+            .addAugmentation(
+                new TerminationPoint1Builder()
+                    .setTpType(OpenroadmTpType.SRGTXRXPP)
+                    .setAdministrativeState(AdminStates.InService)
+                    .setOperationalState(State.InService)
+                    .build())
+            .build();
+        TerminationPoint srgCP = new TerminationPointBuilder()
+            .withKey(new TerminationPointKey(new TpId("SRG1-CP-TXRX")))
+            .addAugmentation(
+                new TerminationPoint1Builder()
+                    .setTpType(OpenroadmTpType.SRGTXRXCP)
+                    .setAdministrativeState(AdminStates.InService)
+                    .setOperationalState(State.InService)
+                    .build())
+            .build();
+        return new NodeBuilder()
+            .setNodeId(new NodeId(nodeId))
+            .withKey(new NodeKey(new NodeId(nodeId)))
+            .addAugmentation(
+                new Node1Builder()
+                    .setTerminationPoint(Map.of(srgPP.key(), srgPP, srgCP.key(), srgCP)).build())
+            .addAugmentation(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1Builder()
+                    .setOperationalState(State.InService).setAdministrativeState(AdminStates.InService).build())
+            .setSupportingNode(supportingNodes);
+    }
 
     // OTN network node
     public static List<SupportingNode> getOTNSupportingNodes() {
-        List<SupportingNode> supportingNodes1 = new ArrayList<>();
-        supportingNodes1
-                .add(new SupportingNodeBuilder()
-                        .setNodeRef(new NodeId("node 1"))
-                        .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))
-                        .build());
-
-        supportingNodes1
-                .add(new SupportingNodeBuilder()
+        return new ArrayList<>(
+            List.of(
+                new SupportingNodeBuilder()
+                    .setNodeRef(new NodeId("node 1"))
+                    .setNetworkRef(new NetworkId(NetworkUtils.CLLI_NETWORK_ID))
+                    .build(),
+                new SupportingNodeBuilder()
                         .setNodeRef(new NodeId("node 2"))
                         .setNetworkRef(new NetworkId(NetworkUtils.UNDERLAY_NETWORK_ID))
-                        .build());
-        return supportingNodes1;
+                        .build()));
     }
 
     public static NodeBuilder getOTNNodeBuilder(Map<SupportingNodeKey,SupportingNode> supportingNodes1,
-                                                OpenroadmTpType openroadmTpType) {
-
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder
-                tp1Bldr = getTerminationPoint1Builder(openroadmTpType);
-        TerminationPointBuilder xpdrTpBldr = getTerminationPointBuilder(openroadmTpType);
-        xpdrTpBldr
-                .addAugmentation(tp1Bldr.build());
-
-        xpdrTpBldr.addAugmentation(createAnother2TerminationPoint(openroadmTpType).build());
-        xpdrTpBldr.addAugmentation(createAnotherTerminationPoint(openroadmTpType).build());
-
-        org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1 node1 = getNode1();
-        TerminationPoint xpdr = xpdrTpBldr.build();
-        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 node1Rev180226 =
-                new Node1Builder()
-                        .setTerminationPoint(Map.of(xpdr.key(),xpdr))
-                        .build();
-
-
-        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 nodeIetf =
-                new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
-                        .Node1Builder()
-                        .setTerminationPoint(Map.of(xpdr.key(),xpdr))
-                        .build();
-
+            OpenroadmTpType openroadmTpType) {
+        TerminationPoint xpdr = getTerminationPointBuilder(openroadmTpType)
+                .addAugmentation(getTerminationPoint1Builder(openroadmTpType).build())
+                .addAugmentation(createAnother2TerminationPoint(openroadmTpType).build())
+                .addAugmentation(createAnotherTerminationPoint(openroadmTpType).build())
+                .build();
         return new NodeBuilder()
                 .setNodeId(new NodeId("node_test"))
                 .withKey(new NodeKey(new NodeId("node 1")))
-                .addAugmentation(node1Rev180226)
-                .addAugmentation(node1)
-                .addAugmentation(nodeIetf)
+                .addAugmentation(new Node1Builder().setTerminationPoint(Map.of(xpdr.key(),xpdr)).build())
+                .addAugmentation(getNode1())
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                        .Node1Builder()
+                        .setTerminationPoint(Map.of(xpdr.key(),xpdr))
+                        .build())
                 .setSupportingNode(supportingNodes1);
     }
 
     public static NodeBuilder getOTNNodeBuilderEmpty(Map<SupportingNodeKey,SupportingNode> supportingNodes1,
-                                                     OpenroadmTpType openroadmTpType) {
-
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder tp1Bldr =
-                getTerminationPoint1Builder(openroadmTpType);
-        TerminationPointBuilder xpdrTpBldr = getTerminationPointBuilder(openroadmTpType);
-        xpdrTpBldr.addAugmentation(tp1Bldr.build());
-        xpdrTpBldr.addAugmentation(createAnotherTerminationPoint(openroadmTpType).build());
-
-        org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1 node1 = getNode1Empty();
-        TerminationPoint xpdr = xpdrTpBldr.build();
-        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 node1Rev180226 =
-                new Node1Builder()
-                        .setTerminationPoint(Map.of(xpdr.key(),xpdr))
-                        .build();
+            OpenroadmTpType openroadmTpType) {
+        TerminationPoint xpdr = getTerminationPointBuilder(openroadmTpType)
+            .addAugmentation(getTerminationPoint1Builder(openroadmTpType).build())
+            .addAugmentation(createAnotherTerminationPoint(openroadmTpType).build())
+            .build();
         return new NodeBuilder()
                 .setNodeId(new NodeId("node_test"))
                 .withKey(new NodeKey(new NodeId("node 1")))
-                .addAugmentation(node1Rev180226)
-                .addAugmentation(node1)
+                .addAugmentation(
+                    new Node1Builder()
+                        .setTerminationPoint(Map.of(xpdr.key(),xpdr))
+                        .build())
+                .addAugmentation(getNode1Empty())
                 .setSupportingNode(supportingNodes1);
     }
 
-    private static org.opendaylight
-            .yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1 getNode1() {
-        return new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1Builder()
+    private static org.opendaylight.yang.gen.v1.http
+            .org.openroadm.network.topology.rev230526.Node1 getNode1() {
+        return new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1Builder()
                 .setSrgAttributes(getSrgAttributes())
                 .setDegreeAttributes(getDegAttributes())
                 .build();
     }
 
-    private static org.opendaylight
-            .yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1 getNode1Empty() {
-        return new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1Builder()
+    private static org.opendaylight.yang.gen.v1.http
+            .org.openroadm.network.topology.rev230526.Node1 getNode1Empty() {
+        return new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1Builder()
                 .setSrgAttributes(getEmptySrgAttributes())
                 .setDegreeAttributes(getEmptyDegAttributes())
                 .build();
@@ -272,20 +390,19 @@ public final class NodeUtils {
                 .addAugmentation(createOTNTerminationPoint(openroadmTpType).build());
     }
 
-    private static org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder
-        getTerminationPoint1Builder(OpenroadmTpType openroadmTpType) {
-
-        return new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder()
+    private static org.opendaylight.yang.gen.v1.http
+            .org.openroadm.common.network.rev230526.TerminationPoint1Builder getTerminationPoint1Builder(
+                OpenroadmTpType openroadmTpType) {
+        return new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1Builder()
                 .setTpType(openroadmTpType);
 
     }
 
-    private static org.opendaylight.yang.gen
-            .v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1Builder createAnotherTerminationPoint(
-            OpenroadmTpType openroadmTpType
-    ) {
+    private static org.opendaylight.yang.gen.v1.http
+            .org.openroadm.network.topology.rev230526.TerminationPoint1Builder createAnotherTerminationPoint(
+                OpenroadmTpType openroadmTpType) {
         return new org.opendaylight
-                .yang.gen.v1.http.org.openroadm.network.topology.rev211210.TerminationPoint1Builder()
+                .yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1Builder()
                 .setCtpAttributes((new CtpAttributesBuilder()).build())
                 .setCpAttributes((new CpAttributesBuilder()).build())
                 .setTxTtpAttributes((new TxTtpAttributesBuilder()).setUsedWavelengths(Map.of()).build())
@@ -297,44 +414,40 @@ public final class NodeUtils {
                         .setTailEquipmentId("destNode" + "--" + "destTp").build());
     }
 
-    private static org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+    private static org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
             .TerminationPoint1Builder createOTNTerminationPoint(OpenroadmTpType openroadmTpType) {
-
         SupportedInterfaceCapability supIfCapa = new SupportedInterfaceCapabilityBuilder()
-                .setIfCapType(IfOCHOTU4ODU4.class)
+                .setIfCapType(IfOCHOTU4ODU4.VALUE)
                 .build();
-
         SupportedInterfaceCapability supIfCapa1 = new SupportedInterfaceCapabilityBuilder()
-                .setIfCapType(If100GEODU4.class)
+                .setIfCapType(If100GEODU4.VALUE)
                 .build();
         SupportedInterfaceCapability supIfCapa2 = new SupportedInterfaceCapabilityBuilder()
-                .setIfCapType(If10GEODU2e.class)
+                .setIfCapType(If10GEODU2e.VALUE)
                 .build();
         SupportedInterfaceCapability supIfCapa3 = new SupportedInterfaceCapabilityBuilder()
-                .setIfCapType(If1GEODU0.class)
-                .build();
-
-        Map<SupportedInterfaceCapabilityKey,SupportedInterfaceCapability> supIfCapaList = new HashMap<>();
-        supIfCapaList.put(supIfCapa.key(),supIfCapa);
-        supIfCapaList.put(supIfCapa1.key(),supIfCapa1);
-        supIfCapaList.put(supIfCapa2.key(),supIfCapa2);
-        supIfCapaList.put(supIfCapa3.key(),supIfCapa3);
-
-        TpSupportedInterfaces tpSupIf = new TpSupportedInterfacesBuilder()
-                .setSupportedInterfaceCapability(supIfCapaList)
+                .setIfCapType(If1GEODU0.VALUE)
                 .build();
-
-        XpdrTpPortConnectionAttributesBuilder xtpcaBldr = new XpdrTpPortConnectionAttributesBuilder();
-
-        return new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210
+        return new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526
                 .TerminationPoint1Builder()
-                .setTpSupportedInterfaces(tpSupIf)
-                .setXpdrTpPortConnectionAttributes(xtpcaBldr.build());
+                .setTpSupportedInterfaces(
+                    new TpSupportedInterfacesBuilder()
+                        .setSupportedInterfaceCapability(
+                            new HashMap<>(
+                                Map.of(
+                                    supIfCapa.key(),supIfCapa,
+                                    supIfCapa1.key(),supIfCapa1,
+                                    supIfCapa2.key(),supIfCapa2,
+                                    supIfCapa3.key(),supIfCapa3))
+                         )
+                        .build()
+                )
+                .setXpdrTpPortConnectionAttributes(new XpdrTpPortConnectionAttributesBuilder().build());
     }
 
-    private static org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
+    private static org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
             .TerminationPoint1Builder createAnother2TerminationPoint(OpenroadmTpType openroadmTpType) {
-        return new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210
+        return new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
                 .TerminationPoint1Builder()
                 .setOperationalState(State.InService)
                 .setAdministrativeState(AdminStates.InService)
index cc4237a7892b975963d0ba76d7acdbc109eb2822..b958f3b8897409a8a2861de5df1e6cc4abd4aad3 100644 (file)
@@ -19,19 +19,19 @@ public class NotificationPublishServiceMock implements NotificationPublishServic
     private static final Logger LOG = LoggerFactory.getLogger(NotificationPublishServiceMock.class);
 
     @Override
-    public void putNotification(Notification notification) throws InterruptedException {
+    public void putNotification(Notification<?> notification) throws InterruptedException {
         LOG.info("putNotification");
     }
 
     @Override
-    public ListenableFuture<?> offerNotification(Notification notification) {
+    public ListenableFuture<?> offerNotification(Notification<?> notification) {
         LOG.info("offerNotification");
         throw new UnsupportedOperationException("offerNotification is not implemented");
     }
 
     @Override
-    public ListenableFuture<?> offerNotification(Notification notification, int timeout, TimeUnit unit)
-        throws InterruptedException {
+    public ListenableFuture<?> offerNotification(Notification<?> notification, int timeout, TimeUnit unit)
+            throws InterruptedException {
         LOG.info("offerNotification");
         throw new UnsupportedOperationException("offerNotification is not implemented");
     }
index 5008ca2c49c656ea379ebb6b3fc8b8dcd0be5e55..c394a928ae2618faa05fab8a118b816a7a23deb7 100644 (file)
@@ -7,39 +7,42 @@
  */
 package org.opendaylight.transportpce.pce.utils;
 
-import java.math.BigDecimal;
-import java.util.Arrays;
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import org.opendaylight.transportpce.common.ResponseCodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.path.computation.request.input.ServiceAEndBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.path.computation.request.input.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRerouteRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRerouteRequestInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.request.input.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.request.input.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.reroute.request.input.EndpointsBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ConnectionType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommon;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommonBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.sdnc.request.header.SdncRequestHeaderBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.RxDirectionKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.TxDirectionKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.port.PortBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.CoRoutingBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.DiversityBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.ExcludeBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.IncludeBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.LatencyBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co.routing.ServiceIdentifierListBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.diversity.existing.service.constraints.ServiceIdentifierListKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.HardConstraintsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.SoftConstraintsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.service.applicability.g.ServiceApplicabilityBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ConnectionType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommon;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommonBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.sdnc.request.header.SdncRequestHeaderBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.RxDirectionKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.TxDirectionKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.port.PortBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.CoRoutingBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.DiversityBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.ExcludeBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.IncludeBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.LatencyBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co.routing.ServiceIdentifierListBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.diversity.existing.service.constraints.ServiceIdentifierListKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.HardConstraintsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.SoftConstraintsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.service.applicability.g.ServiceApplicabilityBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirectionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.PceMetric;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.response.parameters.sp.ResponseParametersBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.response.parameters.sp.response.parameters.PathDescription;
@@ -47,6 +50,7 @@ import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.RxDirectionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.TxDirectionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.handler.header.ServiceHandlerHeaderBuilder;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.opendaylight.yangtools.yang.common.Uint8;
 
@@ -146,20 +150,20 @@ public final class PceTestData {
                     .build())
                 .build())
             .setHardConstraints(new HardConstraintsBuilder()
-                .setCustomerCode(Arrays.asList("Some customer-code"))
+                .setCustomerCode(Set.of("Some customer-code"))
                 .setCoRouting(new CoRoutingBuilder()
                     .setServiceIdentifierList(Map.of(
-                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co
-                                .routing.ServiceIdentifierListKey("Some existing-service"),
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209
+                                .constraints.co.routing.ServiceIdentifierListKey("Some existing-service"),
                         new ServiceIdentifierListBuilder().setServiceIdentifier("Some existing-service").build()))
                     .build())
                 .build())
             .setSoftConstraints(new SoftConstraintsBuilder()
-                .setCustomerCode(Arrays.asList("Some customer-code"))
+                .setCustomerCode(Set.of("Some customer-code"))
                 .setCoRouting(new CoRoutingBuilder()
                     .setServiceIdentifierList(Map.of(
-                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co
-                                .routing.ServiceIdentifierListKey("Some existing-service"),
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209
+                                .constraints.co.routing.ServiceIdentifierListKey("Some existing-service"),
                         new ServiceIdentifierListBuilder().setServiceIdentifier("Some existing-service").build()))
                     .build())
                 .build())
@@ -231,20 +235,20 @@ public final class PceTestData {
                     .build())
                 .build())
             .setHardConstraints(new HardConstraintsBuilder()
-                .setCustomerCode(Arrays.asList("Some customer-code"))
+                .setCustomerCode(Set.of("Some customer-code"))
                 .setCoRouting(new CoRoutingBuilder()
                     .setServiceIdentifierList(Map.of(
-                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co
-                                .routing.ServiceIdentifierListKey("Some existing-service"),
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209
+                                .constraints.co.routing.ServiceIdentifierListKey("Some existing-service"),
                         new ServiceIdentifierListBuilder().setServiceIdentifier("Some existing-service").build()))
                     .build())
                 .build())
             .setSoftConstraints(new SoftConstraintsBuilder()
-                .setCustomerCode(Arrays.asList("Some customer-code"))
+                .setCustomerCode(Set.of("Some customer-code"))
                 .setCoRouting(new CoRoutingBuilder()
                     .setServiceIdentifierList(Map.of(
-                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co
-                                .routing.ServiceIdentifierListKey("Some existing-service"),
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209
+                                .constraints.co.routing.ServiceIdentifierListKey("Some existing-service"),
                         new ServiceIdentifierListBuilder().setServiceIdentifier("Some existing-service").build()))
                     .build())
                 .build())
@@ -316,26 +320,115 @@ public final class PceTestData {
                     .build())
                 .build())
             .setHardConstraints(new HardConstraintsBuilder()
-                .setCustomerCode(Arrays.asList("Some customer-code"))
+                .setCustomerCode(Set.of("Some customer-code"))
                 .setCoRouting(new CoRoutingBuilder()
                     .setServiceIdentifierList(Map.of(
-                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co
-                                .routing.ServiceIdentifierListKey("Some existing-service"),
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209
+                                .constraints.co.routing.ServiceIdentifierListKey("Some existing-service"),
                         new ServiceIdentifierListBuilder().setServiceIdentifier("Some existing-service").build()))
                     .build())
                 .build())
             .setSoftConstraints(new SoftConstraintsBuilder()
-                .setCustomerCode(Arrays.asList("Some customer-code"))
+                .setCustomerCode(Set.of("Some customer-code"))
                 .setCoRouting(new CoRoutingBuilder()
                     .setServiceIdentifierList(Map.of(
-                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co
-                                .routing.ServiceIdentifierListKey("Some existing-service"),
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209
+                                .constraints.co.routing.ServiceIdentifierListKey("Some existing-service"),
                         new ServiceIdentifierListBuilder().setServiceIdentifier("Some existing-service").build()))
                     .build())
                 .build())
             .build();
     }
 
+    public static PathComputationRerouteRequestInput getPCERerouteRequest() {
+        return new PathComputationRerouteRequestInputBuilder()
+                .setPceRoutingMetric(PceMetric.HopCount)
+                .setServiceHandlerHeader(new ServiceHandlerHeaderBuilder()
+                        .setRequestId("request1")
+                        .build())
+                .setServiceAEnd(new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205
+                        .path.computation.reroute.request.input.ServiceAEndBuilder()
+                    .setServiceFormat(ServiceFormat.Ethernet)
+                    .setServiceRate(Uint32.valueOf(100))
+                    .setClli("clli11")
+                    .setNodeId("XPONDER-2-2")
+                    .setTxDirection(new TxDirectionBuilder()
+                            .setPort(new PortBuilder()
+                                    .setPortDeviceName("Some port-device-name")
+                                    .setPortType("Some port-type")
+                                    .setPortName("Some port-name")
+                                    .setPortRack("Some port-rack")
+                                    .setPortShelf("Some port-shelf")
+                                    .setPortSlot("Some port-slot")
+                                    .setPortSubSlot("Some port-sub-slot")
+                                    .build())
+                            .build())
+                    .setRxDirection(new RxDirectionBuilder()
+                            .setPort(new PortBuilder()
+                                    .setPortDeviceName("Some port-device-name")
+                                    .setPortType("Some port-type")
+                                    .setPortName("Some port-name")
+                                    .setPortRack("Some port-rack")
+                                    .setPortShelf("Some port-shelf")
+                                    .setPortSlot("Some port-slot")
+                                    .setPortSubSlot("Some port-sub-slot")
+                                    .build())
+                            .build())
+                    .build())
+                .setServiceZEnd(new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205
+                        .path.computation.reroute.request.input.ServiceZEndBuilder()
+                    .setServiceFormat(ServiceFormat.Ethernet)
+                    .setServiceRate(Uint32.valueOf(0))
+                    .setClli("Some clli11")
+                    .setNodeId("XPONDER-1-2")
+                    .setTxDirection(new TxDirectionBuilder()
+                            .setPort(new PortBuilder()
+                                    .setPortDeviceName("Some port-device-name")
+                                    .setPortType("Some port-type")
+                                    .setPortName("Some port-name")
+                                    .setPortRack("Some port-rack")
+                                    .setPortShelf("Some port-shelf")
+                                    .setPortSlot("Some port-slot")
+                                    .setPortSubSlot("Some port-sub-slot")
+                                    .build())
+                            .build())
+                    .setRxDirection(new RxDirectionBuilder()
+                            .setPort(new PortBuilder()
+                                    .setPortDeviceName("Some port-device-name")
+                                    .setPortType("Some port-type")
+                                    .setPortName("Some port-name")
+                                    .setPortRack("Some port-rack")
+                                    .setPortShelf("Some port-shelf")
+                                    .setPortSlot("Some port-slot")
+                                    .setPortSubSlot("Some port-sub-slot")
+                                    .build())
+                            .build())
+                    .build())
+                .setHardConstraints(new HardConstraintsBuilder()
+                    .setCustomerCode(Set.of("Some customer-code"))
+                    .setCoRouting(new CoRoutingBuilder()
+                        .setServiceIdentifierList(Map.of(
+                                new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209
+                                        .constraints.co.routing.ServiceIdentifierListKey("test"),
+                                new ServiceIdentifierListBuilder().setServiceIdentifier("test").build()))
+                        .build())
+                    .build())
+                .setSoftConstraints(new SoftConstraintsBuilder()
+                    .setCustomerCode(Set.of("Some customer-code"))
+                    .setCoRouting(new CoRoutingBuilder()
+                        .setServiceIdentifierList(Map.of(
+                                new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209
+                                        .constraints.co.routing.ServiceIdentifierListKey("test"),
+                                new ServiceIdentifierListBuilder().setServiceIdentifier("test").build()))
+                        .build())
+                    .build())
+                .setEndpoints(new EndpointsBuilder()
+                    .setAEndTp("AendTP")
+                    .setZEndTp("ZendTP")
+                    .build())
+                .build();
+    }
+
     public static PathComputationRequestOutput getFailedPCEResultYes() {
         return new PathComputationRequestOutputBuilder()
             .setConfigurationResponseCommon(
@@ -460,13 +553,13 @@ public final class PceTestData {
                 .build())
             .setHardConstraints(new HardConstraintsBuilder()
                 .setExclude(new ExcludeBuilder()
-                    .setNodeId(Arrays.asList(new NodeIdType("OpenROADM-2-2")))
+                    .setNodeId(List.of(new NodeIdType("OpenROADM-2-2")))
                     .build())
                 .setInclude(new IncludeBuilder()
-                    .setNodeId(Arrays.asList(new NodeIdType("XPONDER-1-2")))
+                    .setNodeId(List.of(new NodeIdType("XPONDER-1-2")))
                     .build())
                 .setLatency(new LatencyBuilder()
-                    .setMaxLatency(BigDecimal.valueOf(3223))
+                    .setMaxLatency(Decimal64.valueOf("3223"))
                     .build())
                 .build())
             .build();
@@ -486,6 +579,38 @@ public final class PceTestData {
             .build();
     }
 
+    public static PathComputationRerouteRequestInput getPCEReroute() {
+        return new PathComputationRerouteRequestInputBuilder()
+                .setServiceHandlerHeader(new ServiceHandlerHeaderBuilder()
+                        .setRequestId("request 1")
+                        .build())
+                .setPceRoutingMetric(PceMetric.HopCount)
+                .setServiceAEnd(new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205
+                        .path.computation.reroute.request.input.ServiceAEndBuilder()
+                        .setServiceRate(Uint32.valueOf(100))
+                        .setServiceFormat(ServiceFormat.Ethernet)
+                        .setNodeId("XPONDER-1-2")
+                        .build())
+                .setServiceZEnd(new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205
+                        .path.computation.reroute.request.input.ServiceZEndBuilder()
+                        .setServiceRate(Uint32.valueOf(0))
+                        .setServiceFormat(ServiceFormat.Ethernet)
+                        .setNodeId("XPONDER-3-2")
+                        .build())
+                .setHardConstraints(new HardConstraintsBuilder()
+                        .setExclude(new ExcludeBuilder()
+                                .setNodeId(List.of(
+                                        new NodeIdType("OpenROADM-2-1"),
+                                        new NodeIdType("OpenROADM-2-2")))
+                                .build())
+                        .build())
+                .setEndpoints(new EndpointsBuilder()
+                        .setAEndTp("AendTP")
+                        .setZEndTp("ZendTP")
+                        .build())
+                .build();
+    }
+
     /**
      * Generate Data for Test 2 request 5-4.
      * <code>{
@@ -533,7 +658,7 @@ public final class PceTestData {
                 .build())
             .setHardConstraints(new HardConstraintsBuilder()
                 .setExclude(new ExcludeBuilder()
-                    .setNodeId(Arrays.asList(
+                    .setNodeId(List.of(
                         new NodeIdType("OpenROADM-2-1"),
                         new NodeIdType("OpenROADM-2-2")))
                     .build())
@@ -670,14 +795,14 @@ public final class PceTestData {
                 .build())
             .setHardConstraints(new HardConstraintsBuilder()
                 .setLatency(new LatencyBuilder()
-                    .setMaxLatency(BigDecimal.valueOf(3223))
+                    .setMaxLatency(Decimal64.valueOf("3223"))
                     .build())
                 .setDiversity(new DiversityBuilder()
                     .setServiceIdentifierList(Map.of(
                         new ServiceIdentifierListKey(base.getServiceName()),
-                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.diversity
-                                .existing.service.constraints.ServiceIdentifierListBuilder()
-                            .setServiceIndentifier(base.getServiceName())
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209
+                                .diversity.existing.service.constraints.ServiceIdentifierListBuilder()
+                            .setServiceIdentifier(base.getServiceName())
                             .setServiceApplicability(new ServiceApplicabilityBuilder()
                                 .setNode(true)
                                 .build())
@@ -694,40 +819,40 @@ public final class PceTestData {
             .setCustomer("Customer")
             .setServiceName("service 1")
             .setServiceAEnd(
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input
-                        .ServiceAEndBuilder()
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                        .service.create.input.ServiceAEndBuilder()
                     .setClli("clli")
                     .setServiceRate(Uint32.valueOf(0))
                     .setNodeId(new NodeIdType("XPONDER-1-2"))
                     .setTxDirection(Map.of(
                         new TxDirectionKey(Uint8.ZERO),
-                        new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service
-                                .endpoint.TxDirectionBuilder()
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
+                                .service.endpoint.TxDirectionBuilder()
                             .setPort(new PortBuilder().build())
                             .build()))
                     .setRxDirection(Map.of(
                         new RxDirectionKey(Uint8.ZERO),
-                        new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service
-                                .endpoint.RxDirectionBuilder()
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
+                                .service.endpoint.RxDirectionBuilder()
                             .setPort(new PortBuilder().build())
                             .build()))
                     .build())
             .setServiceZEnd(
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input
-                        .ServiceZEndBuilder()
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                        .service.create.input.ServiceZEndBuilder()
                     .setClli("clli")
                     .setServiceRate(Uint32.valueOf(0))
                     .setNodeId(new NodeIdType("XPONDER-3-2"))
                     .setTxDirection(Map.of(
                         new TxDirectionKey(Uint8.ZERO),
-                        new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service
-                                .endpoint.TxDirectionBuilder()
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
+                                .service.endpoint.TxDirectionBuilder()
                             .setPort(new PortBuilder().build())
                             .build()))
                     .setRxDirection(Map.of(
                         new RxDirectionKey(Uint8.ZERO),
-                        new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service
-                                .endpoint.RxDirectionBuilder()
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
+                                .service.endpoint.RxDirectionBuilder()
                             .setPort(new PortBuilder().build())
                             .build()))
                     .build())
@@ -801,20 +926,20 @@ public final class PceTestData {
                     .build())
                 .build())
             .setHardConstraints(new HardConstraintsBuilder()
-                .setCustomerCode(Arrays.asList("Some customer-code"))
+                .setCustomerCode(Set.of("Some customer-code"))
                 .setCoRouting(new CoRoutingBuilder()
                     .setServiceIdentifierList(Map.of(
-                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co
-                                .routing.ServiceIdentifierListKey("Some existing-service"),
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209
+                                .constraints.co.routing.ServiceIdentifierListKey("Some existing-service"),
                         new ServiceIdentifierListBuilder().setServiceIdentifier("Some existing-service").build()))
                     .build())
                 .build())
             .setSoftConstraints(new SoftConstraintsBuilder()
-                .setCustomerCode(Arrays.asList("Some customer-code"))
+                .setCustomerCode(Set.of("Some customer-code"))
                 .setCoRouting(new CoRoutingBuilder()
                     .setServiceIdentifierList(Map.of(
-                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co
-                                .routing.ServiceIdentifierListKey("Some existing-service"),
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209
+                                .constraints.co.routing.ServiceIdentifierListKey("Some existing-service"),
                         new ServiceIdentifierListBuilder().setServiceIdentifier("Some existing-service").build()))
                     .build())
                 .build())
index 2aa39589056af16c26b4fb5a6f0a21227033b5aa..d0e9afa23dfa25b98c9d8add8b536951c29bb7f9 100644 (file)
@@ -19,7 +19,6 @@ import java.util.Map;
 import java.util.Optional;
 import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
-import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
 import org.junit.Assert;
 import org.opendaylight.mdsal.binding.api.DataBroker;
@@ -29,17 +28,16 @@ import org.opendaylight.transportpce.common.NetworkUtils;
 import org.opendaylight.transportpce.test.DataStoreContext;
 import org.opendaylight.transportpce.test.converter.DataObjectConverter;
 import org.opendaylight.transportpce.test.converter.XMLDataObjectConverter;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZ;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZKey;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.Node;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZ;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.Node;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
 import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
@@ -64,14 +62,15 @@ public final class PceTestUtils {
         Optional<NormalizedNode> normalizedNode
                 = dataObjectConverter.transformIntoNormalizedNode(resourceAsStream);
         DataContainerChild next
-                = ((ContainerNode) normalizedNode.get()).body().iterator().next();
+                = ((ContainerNode) normalizedNode.orElseThrow()).body().iterator().next();
         MapEntryNode mapNode = ((MapNode) next).body().iterator().next();
         Optional<DataObject> dataObject = dataObjectConverter.getDataObject(mapNode, Network.QNAME);
         InstanceIdentifier<Network> nwInstanceIdentifier = InstanceIdentifier.builder(Networks.class)
                 .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
                 .build();
         WriteTransaction dataWriteTransaction = dataBroker.newWriteOnlyTransaction();
-        dataWriteTransaction.put(LogicalDatastoreType.CONFIGURATION, nwInstanceIdentifier, (Network) dataObject.get());
+        dataWriteTransaction.put(LogicalDatastoreType.CONFIGURATION, nwInstanceIdentifier,
+                (Network) dataObject.orElseThrow());
         dataWriteTransaction.commit().get();
     }
 
@@ -88,13 +87,10 @@ public final class PceTestUtils {
                 JsonReader topoReader = new JsonReader(gnpyTopo);
         ) {
 
-            Networks networks = (Networks) JsonUtil.getInstance().getDataObjectFromJson(networkReader,
-                    QName.create("urn:ietf:params:xml:ns:yang:ietf-network", "2018-02-26", "networks"));
-            @NonNull
+            Networks networks = (Networks) JsonUtil.getInstance().getDataObjectFromJson(networkReader, Networks.QNAME);
             List<Network> networkMap = new ArrayList<>(networks.nonnullNetwork().values());
             saveOpenRoadmNetwork(networkMap.get(0), NetworkUtils.UNDERLAY_NETWORK_ID, dataBroker);
-            networks = (Networks) JsonUtil.getInstance().getDataObjectFromJson(topoReader,
-                    QName.create("urn:ietf:params:xml:ns:yang:ietf-network", "2018-02-26", "networks"));
+            networks = (Networks) JsonUtil.getInstance().getDataObjectFromJson(topoReader,  Networks.QNAME);
             saveOpenRoadmNetwork(networkMap.get(0), NetworkUtils.UNDERLAY_NETWORK_ID, dataBroker);
         } catch (IOException | ExecutionException | InterruptedException e) {
             LOG.error("Cannot init test ", e);
index 5aa40816bfe52ba93322d7763d333ffaebf4349e..70268b633648ca3db20dc7cb25ceb9f1cbc1bee9 100644 (file)
@@ -9,7 +9,6 @@
 
 package org.opendaylight.transportpce.pce.utils;
 
-import java.math.BigDecimal;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
@@ -18,33 +17,34 @@ import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.fixedflex.GridUtils;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.link.types.rev191129.FiberPmd;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.link.types.rev191129.RatioDB;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp.Interface;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp.InterfaceKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.OrgOpenroadmDevice;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.AmplifiedLink;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.AmplifiedLinkKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.amplified.link.SectionElementBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.span.attributes.LinkConcatenation1.FiberType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.span.attributes.LinkConcatenation1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Link1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.link.OMSAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.link.oms.attributes.AmplifiedLinkBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.link.oms.attributes.SpanBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.DegreeAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.DegreeAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.SrgAttributes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.networks.network.node.SrgAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.link.concatenation.LinkConcatenation;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.link.concatenation.LinkConcatenationBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.link.concatenation.LinkConcatenationKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link.attributes.AmplifiedLink;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link.attributes.AmplifiedLinkKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link.attributes.amplified.link.SectionElementBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.span.attributes.LinkConcatenation1.FiberType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.span.attributes.LinkConcatenation1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Link1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.link.OMSAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.link.oms.attributes.AmplifiedLinkBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.link.oms.attributes.SpanBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.DegreeAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.DegreeAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.SrgAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.SrgAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.link.concatenation.LinkConcatenation;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.link.concatenation.LinkConcatenationBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.link.concatenation.LinkConcatenationKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev181019.CurrentPmList;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev181019.CurrentPmListBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.rev181019.current.pm.group.CurrentPm;
@@ -77,6 +77,7 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.
 import org.opendaylight.yangtools.yang.binding.Augmentation;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.Uint16;
 import org.opendaylight.yangtools.yang.common.Uint32;
 
@@ -104,18 +105,18 @@ public final class TransactionUtils {
         LinkConcatenation linkConcatenation = new LinkConcatenationBuilder()
             .addAugmentation(new LinkConcatenation1Builder()
                 .setFiberType(FiberType.Truewave)
-                .setPmd(new FiberPmd(BigDecimal.ONE))
+                .setPmd(new FiberPmd(Decimal64.valueOf("1")))
                 .build())
             .setSRLGId(Uint32.valueOf(1))
-            .setSRLGLength(BigDecimal.valueOf(1))
+            .setSRLGLength(Decimal64.valueOf("1"))
             .build();
         LinkConcatenation linkConcatenation2 = new LinkConcatenationBuilder()
             .addAugmentation(new LinkConcatenation1Builder()
                 .setFiberType(FiberType.Truewave)
-                .setPmd(new FiberPmd(BigDecimal.ONE))
+                .setPmd(new FiberPmd(Decimal64.valueOf("1")))
                 .build())
             .setSRLGId(Uint32.valueOf(1))
-            .setSRLGLength(BigDecimal.valueOf(1))
+            .setSRLGLength(Decimal64.valueOf("1"))
             .build();
         linkConcentationValues.put(linkConcatenation.key(),linkConcatenation);
         linkConcentationValues.put(linkConcatenation2.key(),linkConcatenation2);
@@ -142,49 +143,43 @@ public final class TransactionUtils {
         ietfNodeList.put(ietfNodeA.key(),ietfNodeA);
         ietfNodeList.put(ietfNodeC.key(),ietfNodeC);
 
-        Map<AmplifiedLinkKey,AmplifiedLink>
-                amplifiedLinkValues = new HashMap<>();
-        org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.AmplifiedLink al =
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes
-                        .AmplifiedLinkBuilder().setSectionElement(new SectionElementBuilder()
-                        .setSectionElement(new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210
-                                .amplified.link.attributes.amplified.link.section.element.section.element
-                                .SpanBuilder()
-                                .setSpan(
-                                        new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified
-                                                .link.attributes.amplified.link.section.element.section
-                                                .element.span.SpanBuilder()
-                                                .setAdministrativeState(AdminStates.InService)
-                                                .setAutoSpanloss(true)
-                                                .setEngineeredSpanloss(new RatioDB(BigDecimal.ONE))
-                                                .setLinkConcatenation(linkConcentationValues)
-                                                .setSpanlossBase(new RatioDB(BigDecimal.ONE))
-                                                .setSpanlossCurrent(new RatioDB(BigDecimal.ONE))
-                                                .build())
-                                .build())
+        Map<AmplifiedLinkKey,AmplifiedLink> amplifiedLinkValues = new HashMap<>();
+        var al = new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link.attributes
+                .AmplifiedLinkBuilder()
+            .setSectionElement(new SectionElementBuilder()
+                .setSectionElement(new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link
+                        .attributes.amplified.link.section.element.section.element.SpanBuilder()
+                    .setSpan(new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link
+                            .attributes.amplified.link.section.element.section.element.span.SpanBuilder()
+                        .setAdministrativeState(AdminStates.InService)
+                        .setAutoSpanloss(true)
+                        .setEngineeredSpanloss(new RatioDB(Decimal64.valueOf("1")))
+                        .setLinkConcatenation(linkConcentationValues)
+                        .setSpanlossBase(new RatioDB(Decimal64.valueOf("1")))
+                        .setSpanlossCurrent(new RatioDB(Decimal64.valueOf("1")))
                         .build())
-                        .setSectionEltNumber(Uint16.valueOf(1)).build();
-        org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes.AmplifiedLink al2 =
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link.attributes
-                        .AmplifiedLinkBuilder().setSectionElement(new SectionElementBuilder()
-                        .setSectionElement(
-                                new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210.amplified.link
-                                        .attributes.amplified.link.section.element.section.element.SpanBuilder()
-                                        .setSpan(
-                                                new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev211210
-                                                        .amplified.link
-                                                        .attributes.amplified.link.section.element.section.element.span
-                                                        .SpanBuilder()
-                                                        .setAdministrativeState(AdminStates.InService)
-                                                        .setAutoSpanloss(true)
-                                                        .setEngineeredSpanloss(new RatioDB(BigDecimal.ONE))
-                                                        .setLinkConcatenation(linkConcentationValues)
-                                                        .setSpanlossBase(new RatioDB(BigDecimal.ONE))
-                                                        .setSpanlossCurrent(new RatioDB(BigDecimal.ONE))
-                                                        .build())
-                                        .build())
+                    .build())
+                .build())
+            .setSectionEltNumber(Uint16.valueOf(1))
+            .build();
+        var al2 = new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link.attributes
+                .AmplifiedLinkBuilder()
+            .setSectionElement(new SectionElementBuilder()
+                .setSectionElement(new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link
+                        .attributes.amplified.link.section.element.section.element.SpanBuilder()
+                    .setSpan(new org.opendaylight.yang.gen.v1.http.org.openroadm.link.rev230526.amplified.link
+                            .attributes.amplified.link.section.element.section.element.span.SpanBuilder()
+                        .setAdministrativeState(AdminStates.InService)
+                        .setAutoSpanloss(true)
+                        .setEngineeredSpanloss(new RatioDB(Decimal64.valueOf("1")))
+                        .setLinkConcatenation(linkConcentationValues)
+                        .setSpanlossBase(new RatioDB(Decimal64.valueOf("1")))
+                        .setSpanlossCurrent(new RatioDB(Decimal64.valueOf("1")))
                         .build())
-                        .setSectionEltNumber(Uint16.valueOf(1)).build();
+                    .build())
+                .build())
+            .setSectionEltNumber(Uint16.valueOf(1))
+            .build();
         amplifiedLinkValues.put(al.key(),al);
         amplifiedLinkValues.put(al2.key(),al2);
         Augmentation<Link> aug11 = new Link1Builder()
@@ -194,20 +189,22 @@ public final class TransactionUtils {
                         .setSpan(new SpanBuilder().build())
                         .build())
                 .build();
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1 aug12 =
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder()
-                        .setOppositeLink(new LinkId("link 1"))
-                        .setLinkType(OpenroadmLinkType.ROADMTOROADM).build();
+        var aug12 = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1Builder()
+            .setOppositeLink(new LinkId("link 1"))
+            .setLinkType(OpenroadmLinkType.ROADMTOROADM)
+            .build();
         Augmentation<Link> aug21 = new Link1Builder()
-                .setAmplified(true)
-                .setOMSAttributes(new OMSAttributesBuilder()
-                        .setAmplifiedLink(new AmplifiedLinkBuilder().setAmplifiedLink(amplifiedLinkValues).build())
-                        .setSpan(new SpanBuilder().build())
-                        .build())
-                .build();
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1 aug22 =
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder()
-                        .setLinkType(OpenroadmLinkType.ROADMTOROADM).build();
+            .setAmplified(true)
+            .setOMSAttributes(new OMSAttributesBuilder()
+                .setAmplifiedLink(new AmplifiedLinkBuilder()
+                    .setAmplifiedLink(amplifiedLinkValues)
+                    .build())
+                .setSpan(new SpanBuilder().build())
+                .build())
+            .build();
+        var aug22 = new org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1Builder()
+            .setLinkType(OpenroadmLinkType.ROADMTOROADM)
+            .build();
         // create the roadm-to-roadm link to be measured
         Link roadm2roadmLink = new LinkBuilder().setLinkId(new LinkId("ROADM-A1-to-ROADM-C1"))
                 .setSource(new SourceBuilder().setSourceNode(ietfNodeA.getNodeId())
@@ -248,7 +245,7 @@ public final class TransactionUtils {
     public static Optional<CurrentPmList> getCurrentPmListA() {
         Measurement measurementA = new MeasurementBuilder()
                 .setGranularity(org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev171215.PmGranularity._15min)
-                .setPmParameterValue(new PmDataType(new BigDecimal("-3.5")))
+                .setPmParameterValue(new PmDataType(Decimal64.valueOf("-3.5")))
                 .setValidity(Validity.Complete)
                 .build();
         CurrentPm cpA = new CurrentPmBuilder()
@@ -256,8 +253,10 @@ public final class TransactionUtils {
                         .OpticalPowerOutput)
                 .setMeasurement(Map.of(measurementA.key(),measurementA))
                 .build();
-        InstanceIdentifier<Interface> interfaceIIDA = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(Interface.class, new InterfaceKey("OTS-DEG2-TTP-TXRX"));
+        InstanceIdentifier<Interface> interfaceIIDA = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Interface.class, new InterfaceKey("OTS-DEG2-TTP-TXRX"))
+            .build();
         CurrentPmEntry currentPmEntryA = new CurrentPmEntryBuilder()
                 .setCurrentPm(Map.of(cpA.key(),cpA))
                 .setPmResourceInstance(interfaceIIDA)
@@ -274,7 +273,7 @@ public final class TransactionUtils {
     public static Optional<CurrentPmList> getCurrentPmListC() {
         Measurement measurementC = new MeasurementBuilder()
                 .setGranularity(org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev171215.PmGranularity._15min)
-                .setPmParameterValue(new PmDataType(new BigDecimal("-18.1")))
+                .setPmParameterValue(new PmDataType(Decimal64.valueOf("-18.1")))
                 .setValidity(Validity.Complete)
                 .build();
         Map<MeasurementKey,Measurement> measurementListC = new HashMap<>();
@@ -284,8 +283,10 @@ public final class TransactionUtils {
                         .OpticalPowerInput)
                 .setMeasurement(measurementListC)
                 .build();
-        InstanceIdentifier<Interface> interfaceIIDC = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                .child(Interface.class, new InterfaceKey("OTS-DEG1-TTP-TXRX"));
+        InstanceIdentifier<Interface> interfaceIIDC = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(Interface.class, new InterfaceKey("OTS-DEG1-TTP-TXRX"))
+            .build();
         CurrentPmEntry currentPmEntryC = new CurrentPmEntryBuilder()
                 .setCurrentPm(Map.of(cpC.key(),cpC))
                 .setPmResourceInstance(interfaceIIDC)
@@ -299,9 +300,8 @@ public final class TransactionUtils {
                 .setCurrentPmEntry(Map.of(currentPmEntryC.key(),currentPmEntryC)).build());
     }
 
-    private static org.opendaylight
-            .yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1 getNode1() {
-        return new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev211210.Node1Builder()
+    private static org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1 getNode1() {
+        return new org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.Node1Builder()
                 .setSrgAttributes(getSrgAttributes())
                 .setDegreeAttributes(getDegAttributes())
                 .build();
diff --git a/pce/src/test/resources/apidocCatalog12_0-OptSpecV5_1.json b/pce/src/test/resources/apidocCatalog12_0-OptSpecV5_1.json
new file mode 100644 (file)
index 0000000..830322c
--- /dev/null
@@ -0,0 +1,735 @@
+{
+    "operational-mode-catalog": {
+        "openroadm-operational-modes": {
+            "grid-parameters": {
+                "min-central-frequency": "191.32500000",
+                "max-central-frequency": "196.12500000",
+                "central-frequency-granularity": "12.50000",
+                "min-spacing": "37.50000"
+            },
+            "xponders-pluggables": {
+                "xponder-pluggable-openroadm-operational-mode": [
+                    {
+                        "openroadm-operational-mode-id": "OR-W-100G-SC",
+                        "baud-rate": "28.0",
+                        "line-rate": "111.8",
+                        "modulation-format": "dp-qpsk",
+                        "min-TX-osnr": "33.000",
+                        "TX-OOB-osnr": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-OOB-osnr-multi-channel-value": "31.000",
+                            "min-OOB-osnr-single-channel-value": "43.000"
+                        },
+                        "output-power-range": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-output-power": "-5.000",
+                            "max-output-power": "0.000"
+                        },
+                        "min-RX-osnr-tolerance": "17.000",
+                        "min-input-power-at-RX-osnr": "-22.000",
+                        "max-input-power": "1.000",
+                        "channel-width": "40.00000",
+                        "fec-type": "org-openroadm-common-types:scfec",
+                        "penalties": [
+                            {
+                                "parameter-and-unit": "CD-ps/nm",
+                                "up-to-boundary": "18000",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "6",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "PMD-ps",
+                                "up-to-boundary": "30",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-22",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "cross-talk-total-power-dB",
+                                "up-to-boundary": "15",
+                                "penalty-value": "0.200"
+                            },
+                            {
+                                "parameter-and-unit": "colorless-drop-adjacent-channel-crosstalk-GHz",
+                                "up-to-boundary": "4",
+                                "penalty-value": "0.200"
+                            }
+                        ]
+                    },
+                    {
+                        "openroadm-operational-mode-id": "OR-W-100G-oFEC-31.6Gbd",
+                        "baud-rate": "31.6",
+                        "line-rate": "126.3",
+                        "modulation-format": "dp-qpsk",
+                        "min-TX-osnr": "37.000",
+                        "TX-OOB-osnr": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-OOB-osnr-multi-channel-value": "36.000"
+                        },
+                        "output-power-range": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-output-power": "-5.000",
+                            "max-output-power": "0.000"
+                        },
+                        "min-RX-osnr-tolerance": "12.000",
+                        "min-input-power-at-RX-osnr": "-18.000",
+                        "max-input-power": "1.000",
+                        "channel-width": "37.88400",
+                        "fec-type": "org-openroadm-common-types:ofec",
+                        "min-roll-off": "0.05",
+                        "max-roll-off": "0.20",
+                        "penalties": [
+                            {
+                                "parameter-and-unit": "CD-ps/nm",
+                                "up-to-boundary": "4000",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "CD-ps/nm",
+                                "up-to-boundary": "48000",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "1",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "2",
+                                "penalty-value": "1.000"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "4",
+                                "penalty-value": "2.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "6",
+                                "penalty-value": "4.000"
+                            },
+                            {
+                                "parameter-and-unit": "PMD-ps",
+                                "up-to-boundary": "10",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "PMD-ps",
+                                "up-to-boundary": "30",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-18",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-20",
+                                "penalty-value": "1.000"
+                            },
+                            {
+                                "parameter-and-unit": "cross-talk-total-power-dB",
+                                "up-to-boundary": "15",
+                                "penalty-value": "0.200"
+                            },
+                            {
+                                "parameter-and-unit": "colorless-drop-adjacent-channel-crosstalk-GHz",
+                                "up-to-boundary": "4",
+                                "penalty-value": "0.200"
+                            }
+                        ]
+                    },
+                    {
+                        "openroadm-operational-mode-id": "OR-W-200G-oFEC-31.6Gbd",
+                        "baud-rate": "31.6",
+                        "line-rate": "252.6",
+                        "modulation-format": "dp-qam16",
+                        "min-TX-osnr": "37.000",
+                        "TX-OOB-osnr": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-OOB-osnr-multi-channel-value": "36.000"
+                        },
+                        "output-power-range": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-output-power": "-5.000",
+                            "max-output-power": "0.000"
+                        },
+                        "min-RX-osnr-tolerance": "20.500",
+                        "min-input-power-at-RX-osnr": "-16.000",
+                        "max-input-power": "1.000",
+                        "channel-width": "37.88400",
+                        "fec-type": "org-openroadm-common-types:ofec",
+                        "min-roll-off": "0.05",
+                        "max-roll-off": "0.20",
+                        "penalties": [
+                            {
+                                "parameter-and-unit": "CD-ps/nm",
+                                "up-to-boundary": "4000",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "CD-ps/nm",
+                                "up-to-boundary": "24000",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "1",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "2",
+                                "penalty-value": "1.000"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "4",
+                                "penalty-value": "2.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "6",
+                                "penalty-value": "4.000"
+                            },
+                            {
+                                "parameter-and-unit": "PMD-ps",
+                                "up-to-boundary": "10",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "PMD-ps",
+                                "up-to-boundary": "30",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-16",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-18",
+                                "penalty-value": "1.000"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-20",
+                                "penalty-value": "2.000"
+                            },
+                            {
+                                "parameter-and-unit": "cross-talk-total-power-dB",
+                                "up-to-boundary": "15",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "colorless-drop-adjacent-channel-crosstalk-GHz",
+                                "up-to-boundary": "4",
+                                "penalty-value": "0.500"
+                            }
+                        ]
+                    },
+                    {
+                        "openroadm-operational-mode-id": "OR-W-200G-oFEC-63.1Gbd",
+                        "baud-rate": "63.1",
+                        "line-rate": "252.6",
+                        "modulation-format": "dp-qpsk",
+                        "min-TX-osnr": "37.000",
+                        "TX-OOB-osnr": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-OOB-osnr-multi-channel-value": "36.000"
+                        },
+                        "output-power-range": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-output-power": "-5.000",
+                            "max-output-power": "0.000"
+                        },
+                        "min-RX-osnr-tolerance": "17.000",
+                        "min-input-power-at-RX-osnr": "-18.000",
+                        "max-input-power": "1.000",
+                        "channel-width": "75.72000",
+                        "fec-type": "org-openroadm-common-types:ofec",
+                        "min-roll-off": "0.05",
+                        "max-roll-off": "0.20",
+                        "penalties": [
+                            {
+                                "parameter-and-unit": "CD-ps/nm",
+                                "up-to-boundary": "4000",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "CD-ps/nm",
+                                "up-to-boundary": "24000",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "1",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "2",
+                                "penalty-value": "1.000"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "4",
+                                "penalty-value": "2.500"
+                            },
+                            {
+                                "parameter-and-unit": "PMD-ps",
+                                "up-to-boundary": "10",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "PMD-ps",
+                                "up-to-boundary": "25",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-18",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-20",
+                                "penalty-value": "1.000"
+                            },
+                            {
+                                "parameter-and-unit": "cross-talk-total-power-dB",
+                                "up-to-boundary": "15",
+                                "penalty-value": "0.300"
+                            },
+                            {
+                                "parameter-and-unit": "colorless-drop-adjacent-channel-crosstalk-GHz",
+                                "up-to-boundary": "4",
+                                "penalty-value": "0.500"
+                            }
+                        ]
+                    },
+                    {
+                        "openroadm-operational-mode-id": "OR-W-300G-oFEC-63.1Gbd",
+                        "baud-rate": "63.1",
+                        "line-rate": "378.8",
+                        "modulation-format": "dp-qam8",
+                        "min-TX-osnr": "37.000",
+                        "TX-OOB-osnr": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-OOB-osnr-multi-channel-value": "36.000"
+                        },
+                        "output-power-range": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-output-power": "-5.000",
+                            "max-output-power": "0.000"
+                        },
+                        "min-RX-osnr-tolerance": "21.000",
+                        "min-input-power-at-RX-osnr": "-16.000",
+                        "max-input-power": "1.000",
+                        "channel-width": "75.72000",
+                        "fec-type": "org-openroadm-common-types:ofec",
+                        "min-roll-off": "0.05",
+                        "max-roll-off": "0.20",
+                        "penalties": [
+                            {
+                                "parameter-and-unit": "CD-ps/nm",
+                                "up-to-boundary": "4000",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "CD-ps/nm",
+                                "up-to-boundary": "18000",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "1.00",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "2.00",
+                                "penalty-value": "1.000"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "4.00",
+                                "penalty-value": "2.500"
+                            },
+                            {
+                                "parameter-and-unit": "PMD-ps",
+                                "up-to-boundary": "10.00",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "PMD-ps",
+                                "up-to-boundary": "25.00",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-16.00",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-18.00",
+                                "penalty-value": "1.000"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-20.00",
+                                "penalty-value": "2.000"
+                            },
+                            {
+                                "parameter-and-unit": "cross-talk-total-power-dB",
+                                "up-to-boundary": "15.00",
+                                "penalty-value": "0.300"
+                            },
+                            {
+                                "parameter-and-unit": "colorless-drop-adjacent-channel-crosstalk-GHz",
+                                "up-to-boundary": "4.0",
+                                "penalty-value": "0.500"
+                            }
+                        ]
+                    },
+                    {
+                        "openroadm-operational-mode-id": "OR-W-400G-oFEC-63.1Gbd",
+                        "baud-rate": "63.1",
+                        "line-rate": "505.1",
+                        "modulation-format": "dp-qam16",
+                        "min-TX-osnr": "37.000",
+                        "TX-OOB-osnr": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-OOB-osnr-multi-channel-value": "36.000"
+                        },
+                        "output-power-range": {
+                            "WR-openroadm-operational-mode-id": "MW-WR-core",
+                            "min-output-power": "-5.000",
+                            "max-output-power": "0.000"
+                        },
+                        "min-RX-osnr-tolerance": "24.000",
+                        "min-input-power-at-RX-osnr": "-14.000",
+                        "max-input-power": "1.000",
+                        "channel-width": "75.72000",
+                        "fec-type": "org-openroadm-common-types:ofec",
+                        "min-roll-off": "0.05",
+                        "max-roll-off": "0.20",
+                        "penalties": [
+                            {
+                                "parameter-and-unit": "CD-ps/nm",
+                                "up-to-boundary": "4000",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "CD-ps/nm",
+                                "up-to-boundary": "12000",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "1.00",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "2.00",
+                                "penalty-value": "1.000"
+                            },
+                            {
+                                "parameter-and-unit": "PDL-dB",
+                                "up-to-boundary": "4.00",
+                                "penalty-value": "2.500"
+                            },
+                            {
+                                "parameter-and-unit": "PMD-ps",
+                                "up-to-boundary": "10.00",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "PMD-ps",
+                                "up-to-boundary": "20.00",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-14",
+                                "penalty-value": "0.000"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-16.00",
+                                "penalty-value": "1.000"
+                            },
+                            {
+                                "parameter-and-unit": "power-dBm",
+                                "up-to-boundary": "-18.00",
+                                "penalty-value": "2.000"
+                            },
+                            {
+                                "parameter-and-unit": "cross-talk-total-power-dB",
+                                "up-to-boundary": "13.00",
+                                "penalty-value": "0.300"
+                            },
+                            {
+                                "parameter-and-unit": "cross-talk-total-power-dB",
+                                "up-to-boundary": "15.00",
+                                "penalty-value": "0.500"
+                            },
+                            {
+                                "parameter-and-unit": "colorless-drop-adjacent-channel-crosstalk-GHz",
+                                "up-to-boundary": "4.10",
+                                "penalty-value": "0.500"
+                            }
+                        ]
+                    }
+                ]
+            },
+            "roadms": {
+                "Express": {
+                    "openroadm-operational-mode": {
+                        "openroadm-operational-mode-id": "MW-MW-core",
+                        "per-channel-Pin-min": "-21.000",
+                        "per-channel-Pin-max": "-9.000",
+                        "max-introduced-pdl": "1.500",
+                        "max-introduced-dgd": "3.00",
+                        "max-introduced-cd": "25.00",
+                        "osnr-polynomial-fit": {
+                            "A": "-0.00059520",
+                            "B": "-0.06250000",
+                            "C": "-1.07100000",
+                            "D": "27.99000000"
+                        },
+                        "mask-power-vs-pin": [
+                            {
+                                "lower-boundary": "0",
+                                "upper-boundary": "6",
+                                "C": "1.00000000",
+                                "D": "-9.00000000",
+                                "fiber-type": "smf"
+                            },
+                            {
+                                "lower-boundary": "6",
+                                "upper-boundary": "8",
+                                "C": "-0.00000000",
+                                "D": "-3.00000000",
+                                "fiber-type": "smf"
+                            },
+                            {
+                                "lower-boundary": "8",
+                                "upper-boundary": "23",
+                                "C": "0.33333334",
+                                "D": "-5.66666667",
+                                "fiber-type": "smf"
+                            },
+                            {
+                                "lower-boundary": "23",
+                                "upper-boundary": "27",
+                                "C": "0.00000000",
+                                "D": "2.00000000",
+                                "fiber-type": "smf"
+                            }
+                        ]
+                    }
+                },
+                "Add": {
+                    "add-openroadm-operational-mode": {
+                        "openroadm-operational-mode-id": "MW-WR-core",
+                        "incremental-osnr": "33.000",
+                        "per-channel-Pin-min": "-6.000",
+                        "per-channel-Pin-max": "3.000",
+                        "max-introduced-pdl": "1.500",
+                        "max-introduced-dgd": "3.00",
+                        "max-introduced-cd": "25.00",
+                        "mask-power-vs-pin": [
+                            {
+                                "lower-boundary": "0",
+                                "upper-boundary": "6",
+                                "C": "1.00000000",
+                                "D": "-9.00000000",
+                                "fiber-type": "smf"
+                            },
+                            {
+                                "lower-boundary": "6",
+                                "upper-boundary": "8",
+                                "C": "-0.00000000",
+                                "D": "-3.00000000",
+                                "fiber-type": "smf"
+                            },
+                            {
+                                "lower-boundary": "8",
+                                "upper-boundary": "23",
+                                "C": "0.33333334",
+                                "D": "-5.66666667",
+                                "fiber-type": "smf"
+                            },
+                            {
+                                "lower-boundary": "23",
+                                "upper-boundary": "27",
+                                "C": "0.00000000",
+                                "D": "2.00000000",
+                                "fiber-type": "smf"
+                            }
+                        ]
+                    }
+                },
+                "Drop": {
+                    "openroadm-operational-mode": {
+                        "openroadm-operational-mode-id": "MW-WR-core",
+                        "per-channel-Pin-min": "-25.000",
+                        "per-channel-Pin-max": "-9.000",
+                        "max-introduced-pdl": "1.500",
+                        "max-introduced-dgd": "3.00",
+                        "max-introduced-cd": "25.00",
+                        "osnr-polynomial-fit": {
+                            "A": "-0.00059520",
+                            "B": "-0.06250000",
+                            "C": "-1.07100000",
+                            "D": "27.99000000"
+                        },
+                        "per-channel-Pout-min": "-22.000",
+                        "per-channel-Pout-max": "1.000"
+                    }
+                }
+            },
+            "amplifiers": {
+                "Amplifier": {
+                    "openroadm-operational-mode": [
+                        {
+                            "openroadm-operational-mode-id": "MWi-standard",
+                            "per-channel-Pin-min": "-31.000",
+                            "per-channel-Pin-max": "-9.000",
+                            "max-introduced-pdl": "0.70",
+                            "max-introduced-dgd": "3.00",
+                            "max-introduced-cd": "0.00",
+                            "osnr-polynomial-fit": {
+                                "A": "-0.00059520",
+                                "B": "-0.06250000",
+                                "C": "-1.07100000",
+                                "D": "28.99000000"
+                            },
+                            "mask-power-vs-pin": [
+                                {
+                                    "lower-boundary": "0",
+                                    "upper-boundary": "6",
+                                    "C": "1.00000000",
+                                    "D": "-9.00000000",
+                                    "fiber-type": "smf"
+                                },
+                                {
+                                    "lower-boundary": "6",
+                                    "upper-boundary": "8",
+                                    "C": "-0.00000000",
+                                    "D": "-3.00000000",
+                                    "fiber-type": "smf"
+                                },
+                                {
+                                    "lower-boundary": "8",
+                                    "upper-boundary": "23",
+                                    "C": "0.33333334",
+                                    "D": "-5.66666667",
+                                    "fiber-type": "smf"
+                                },
+                                {
+                                    "lower-boundary": "23",
+                                    "upper-boundary": "31",
+                                    "C": "0.00000000",
+                                    "D": "2.00000000",
+                                    "fiber-type": "smf"
+                                }
+                            ],
+                            "min-gain": "0.000",
+                            "max-gain": "27.000",
+                            "max-extended-gain": "31.000",
+                             "mask-gain-ripple-vs-tilt": [
+                                {
+                                    "lower-boundary": "-4",
+                                    "upper-boundary": "-1",
+                                    "C": "-0.50",
+                                    "D": "1.00"
+                                },
+                                {
+                                    "lower-boundary": "-1",
+                                    "upper-boundary": "0",
+                                    "C": "0.50",
+                                    "D": "2.00"
+                                }
+                            ]
+                        },
+                        {
+                            "openroadm-operational-mode-id": "MWi-low-noise",
+                            "per-channel-Pin-min": "-31.000",
+                            "per-channel-Pin-max": "-9.000",
+                            "max-introduced-pdl": "0.700",
+                            "max-introduced-dgd": "3.00",
+                            "max-introduced-cd": "0.00",
+                            "osnr-polynomial-fit": {
+                                "A": "-0.00081040",
+                                "B": "-0.06221000",
+                                "C": "-0.58890000",
+                                "D": "37.62000000"
+                            },
+                            "mask-power-vs-pin": [
+                                {
+                                    "lower-boundary": "0",
+                                    "upper-boundary": "6",
+                                    "C": "1.00000000",
+                                    "D": "-9.00000000",
+                                    "fiber-type": "smf"
+                                },
+                                {
+                                    "lower-boundary": "6",
+                                    "upper-boundary": "8",
+                                    "C": "-0.00000000",
+                                    "D": "-3.00000000",
+                                    "fiber-type": "smf"
+                                },
+                                {
+                                    "lower-boundary": "8",
+                                    "upper-boundary": "23",
+                                    "C": "0.33333334",
+                                    "D": "-5.66666667",
+                                    "fiber-type": "smf"
+                                },
+                                {
+                                    "lower-boundary": "23",
+                                    "upper-boundary": "31",
+                                    "C": "0.00000000",
+                                    "D": "2.00000000",
+                                    "fiber-type": "smf"
+                                }
+                            ],
+                            "min-gain": "0.000",
+                            "max-gain": "27.000",
+                            "max-extended-gain": "31.000",
+                             "mask-gain-ripple-vs-tilt": [
+                                {
+                                    "lower-boundary": "-4",
+                                    "upper-boundary": "-1",
+                                    "C": "-0.50",
+                                    "D": "1.00"
+                                },
+                                {
+                                    "lower-boundary": "-1",
+                                    "upper-boundary": "0",
+                                    "C": "0.50",
+                                    "D": "2.00"
+                                }
+                            ]
+                        }
+                    ]
+                }
+            }
+        }
+    }
+}
\ No newline at end of file
index 25916095a738e6eb04179822e9c8cc05e98c7135..64a6ebdef917ef0ad7c432ea925a9fd40972fec2 100644 (file)
           },
           "params": {
             "length": 100,
-            "loss_coef": 0.11999999999999999555910790149937383830547332763671875,
+            "loss_coef": 0.12,
             "length_units": "gnpy-network-topology:km",
             "att_in": 0,
             "con_in": 0,
           },
           "params": {
             "length": 140,
-            "loss_coef": 0.2127659574468085124099303584443987347185611724853515625,
+            "loss_coef": 0.21,
             "length_units": "gnpy-network-topology:km",
             "att_in": 0,
             "con_in": 0,
           },
           "params": {
             "length": 100,
-            "loss_coef": 0.11999999999999999555910790149937383830547332763671875,
+            "loss_coef": 0.12,
             "length_units": "gnpy-network-topology:km",
             "att_in": 0,
             "con_in": 0,
           },
           "params": {
             "length": 140,
-            "loss_coef": 0.2127659574468085124099303584443987347185611724853515625,
+            "loss_coef": 0.21,
             "length_units": "gnpy-network-topology:km",
             "att_in": 0,
             "con_in": 0,
                 }
               ],
               "spacing": 50000000000,
-              "path_bandwidth": 100
+              "path_bandwidth": 1000000000.0
             }
           }
         }
       ]
     }
   }
-}
\ No newline at end of file
+}
index 21983b2de9124736a28eb1550c243f7a5aad5de4..f490424dbf40feabb9648a3a0c5498124470491f 100644 (file)
@@ -29,7 +29,7 @@
                             },
                             {
                                 "metric-type": "path_bandwidth",
-                                "accumulative-value": 100
+                                "accumulative-value": 1000000000.0
                             }
                         ],
                         "path-route-objects": [
             }
         ]
     }
-}
\ No newline at end of file
+}
index 0a4c853a9a4d81f5bd1aa536e2425b1a8a104d2b..1c9564608c0d22a3036d02525d5a5b43d2dd2e35 100644 (file)
                         },
                         {
                             "metric-type": "reference_power",
-                            "accumulative-value": 0.0015848931924611136
+                            "accumulative-value": 0.001584
                         },
                         {
                             "metric-type": "path_bandwidth",
-                            "accumulative-value": 100
+                            "accumulative-value": 1000000000.0
                         }
                     ],
                     "path-route-objects": [
             }
         ]
     }
-}
\ No newline at end of file
+}
index 9f902b809424a178b62aa0d7b90b8f8fa91d260c..da07adf49466a356eca54c6dda0364471f310bef 100644 (file)
                     "ietf-network-topology:termination-point": [
                         {
                             "tp-id": "XPDR-NW1-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW5-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-5",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW4-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-4",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW2-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-2",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW1-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW3-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-3",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW2-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-2",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW5-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-5",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW3-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-3",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW4-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-4",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                     "ietf-network-topology:termination-point": [
                         {
                             "tp-id": "XPDR-NW1-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW5-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-5",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW4-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-4",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW2-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-2",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW1-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW3-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-3",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW2-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-2",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW5-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-5",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW3-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-3",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW4-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-4",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                     "ietf-network-topology:termination-point": [
                         {
                             "tp-id": "XPDR-NW1-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW5-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-5",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW4-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-4",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW2-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-2",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW1-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW3-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-3",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW2-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-2",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW5-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-5",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW3-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-3",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW4-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-4",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                     "ietf-network-topology:termination-point": [
                         {
                             "tp-id": "XPDR-NW1-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW5-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-5",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW4-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-4",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW2-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-2",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW1-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW3-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-3",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW2-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-2",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW5-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-5",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW3-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-3",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW4-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-4",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                     "ietf-network-topology:termination-point": [
                         {
                             "tp-id": "XPDR-NW1-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW5-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-5",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW4-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-4",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW2-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-2",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW1-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW3-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-3",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW2-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-2",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW5-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-5",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW3-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-3",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
                             "tp-id": "XPDR-NW4-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-4",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                         },
                         {
diff --git a/pce/src/test/resources/spectrum-filling-rule1.json b/pce/src/test/resources/spectrum-filling-rule1.json
new file mode 100644 (file)
index 0000000..dfb0c83
--- /dev/null
@@ -0,0 +1,38 @@
+{
+    "controller-behaviour-settings": {
+        "spectrum-filling": {
+          "spectrum-filling-rules": [
+            {
+              "rule-id": 1,
+              "priority": 1,
+              "RMSA-policy": "maximize-capacity",
+              "spectrum-range-of-appliance": {
+                "dedicated-signal-bandwidth-multiple": 50,
+                "spectrum-portion-id": 0,
+                "start-edge-frequency": 191.325,
+                "stop-edge-frequency": 191.375,
+                "dedicated-customer": [
+                  "CustomerProfileLamda1"
+                ],
+                "non-authorized-customer": [
+                  "All-other"
+                ]
+              }
+            },
+            {
+              "rule-id": 2,
+              "priority": 1,
+              "RMSA-policy": "maximize-capacity",
+              "spectrum-range-of-appliance": {
+                "spectrum-portion-id": 1,
+                "start-edge-frequency": 191.375,
+                "stop-edge-frequency": 196.125,
+                "non-authorized-customer": [
+                  "CustomerProfileLamda1"
+                ]
+              }
+            }
+          ]
+        }
+    }
+}
diff --git a/pce/src/test/resources/topologyData/or-base-topology.json b/pce/src/test/resources/topologyData/or-base-topology.json
new file mode 100644 (file)
index 0000000..0dbcc99
--- /dev/null
@@ -0,0 +1,2733 @@
+{
+    "ietf-network:networks": {
+        "network": {
+            "network-id": "openroadm-topology",
+            "ietf-network-topology:link": [
+                {
+                    "link-id": "XPONDER-1XPDR-NW1-TX-toOpenROADM-1-SRG1-SRG1-PP1-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "XPONDER-1",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT",
+                    "destination": {
+                        "dest-node": "OpenROADM-1-SRG1",
+                        "dest-tp": "SRG1-PP1-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-SRG1-SRG1-PP1-TX-to-XPONDER-1XPDR-NW1-RX"
+                },
+                {
+                    "link-id": "XPONDER-2XPDR-NW1-TX-toOpenROADM-2-SRG1-SRG1-PP1-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "XPONDER-2",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT",
+                    "destination": {
+                        "dest-node": "OpenROADM-2-SRG1",
+                        "dest-tp": "SRG1-PP1-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-SRG1-SRG1-PP1-TX-to-XPONDER-2XPDR-NW1-RX"
+                },
+                {
+                    "link-id": "XPONDER-3XPDR-NW1-TX-toOpenROADM-3-SRG1-SRG1-PP1-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "XPONDER-3",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT",
+                    "destination": {
+                        "dest-node": "OpenROADM-3-SRG1",
+                        "dest-tp": "SRG1-PP1-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-SRG1-SRG1-PP1-TX-to-XPONDER-3XPDR-NW1-RX"
+                },
+                {
+                    "link-id": "XPONDER-4XPDR-NW1-TX-toOpenROADM-4-SRG1-SRG1-PP1-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "XPONDER-4",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT",
+                    "destination": {
+                        "dest-node": "OpenROADM-4-SRG1",
+                        "dest-tp": "SRG1-PP1-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-SRG1-SRG1-PP1-TX-to-XPONDER-4XPDR-NW1-RX"
+                },
+                {
+                    "link-id": "XPONDER-5XPDR-NW1-TX-toOpenROADM-5-SRG1-SRG1-PP1-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "XPONDER-5",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT",
+                    "destination": {
+                        "dest-node": "OpenROADM-5-SRG1",
+                        "dest-tp": "SRG1-PP1-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-SRG1-SRG1-PP1-TX-to-XPONDER-5XPDR-NW1-RX"
+                },
+                {
+                    "link-id": "OpenROADM-1-SRG1-SRG1-PP1-TX-to-XPONDER-1XPDR-NW1-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-1-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT",
+                    "destination": {
+                        "dest-node": "XPONDER-1",
+                        "dest-tp": "XPDR-NW1-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1XPDR-NW1-TX-toOpenROADM-1-SRG1-SRG1-PP1-RX"
+                },
+                {
+                    "link-id": "OpenROADM-2-SRG1-SRG1-PP1-TX-to-XPONDER-2XPDR-NW1-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-2-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT",
+                    "destination": {
+                        "dest-node": "XPONDER-2",
+                        "dest-tp": "XPDR-NW1-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2XPDR-NW1-TX-toOpenROADM-2-SRG1-SRG1-PP1-RX"
+                },
+                {
+                    "link-id": "OpenROADM-3-SRG1-SRG1-PP1-TX-to-XPONDER-3XPDR-NW1-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT",
+                    "destination": {
+                        "dest-node": "XPONDER-3",
+                        "dest-tp": "XPDR-NW1-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3XPDR-NW1-TX-toOpenROADM-3-SRG1-SRG1-PP1-RX"
+                },
+                {
+                    "link-id": "OpenROADM-4-SRG1-SRG1-PP1-TX-to-XPONDER-4XPDR-NW1-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-4-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT",
+                    "destination": {
+                        "dest-node": "XPONDER-4",
+                        "dest-tp": "XPDR-NW1-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4XPDR-NW1-TX-toOpenROADM-4-SRG1-SRG1-PP1-RX"
+                },
+                {
+                    "link-id": "OpenROADM-5-SRG1-SRG1-PP1-TX-to-XPONDER-5XPDR-NW1-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-5-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT",
+                    "destination": {
+                        "dest-node": "XPONDER-5",
+                        "dest-tp": "XPDR-NW1-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5XPDR-NW1-TX-toOpenROADM-5-SRG1-SRG1-PP1-RX"
+                },
+                {
+                    "link-id": "OpenROADM-1-SRG1-SRG1-CP-TXtoOpenROADM-1-DEG1-DEG1-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-1-DEG1",
+                        "dest-tp": "DEG1-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-SRG1-SRG1-CP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-1-SRG1-SRG1-CP-TXtoOpenROADM-1-DEG2-DEG2-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-1-DEG2",
+                        "dest-tp": "DEG2-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-SRG1-SRG1-CP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-2-SRG1-SRG1-CP-TXtoOpenROADM-2-DEG1-DEG1-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-2-DEG1",
+                        "dest-tp": "DEG1-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-SRG1-SRG1-CP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-2-SRG1-SRG1-CP-TXtoOpenROADM-2-DEG2-DEG2-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-2-DEG2",
+                        "dest-tp": "DEG2-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-SRG1-SRG1-CP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-2-SRG1-SRG1-CP-TXtoOpenROADM-2-DEG3-DEG3-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-2-DEG3",
+                        "dest-tp": "DEG3-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-SRG1-SRG1-CP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-3-SRG1-SRG1-CP-TXtoOpenROADM-3-DEG1-DEG1-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-3-DEG1",
+                        "dest-tp": "DEG1-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-DEG1-DEG1-CTP-TXtoOpenROADM-3-SRG1-SRG1-CP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-3-SRG1-SRG1-CP-TXtoOpenROADM-3-DEG2-DEG2-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-3-DEG2",
+                        "dest-tp": "DEG2-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-DEG2-DEG2-CTP-TXtoOpenROADM-3-SRG1-SRG1-CP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-3-SRG1-SRG1-CP-TXtoOpenROADM-3-DEG3-DEG3-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-3-DEG3",
+                        "dest-tp": "DEG3-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-DEG3-DEG3-CTP-TXtoOpenROADM-3-SRG1-SRG1-CP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-3-SRG1-SRG1-CP-TXtoOpenROADM-3-DEG4-DEG4-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-3-DEG4",
+                        "dest-tp": "DEG4-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-DEG4-DEG4-CTP-TXtoOpenROADM-3-SRG1-SRG1-CP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-4-SRG1-SRG1-CP-TXtoOpenROADM-4-DEG1-DEG1-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-4-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-4-DEG1",
+                        "dest-tp": "DEG1-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-DEG1-DEG1-CTP-TXtoOpenROADM-4-SRG1-SRG1-CP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-4-SRG1-SRG1-CP-TXtoOpenROADM-4-DEG2-DEG2-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-4-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-4-DEG2",
+                        "dest-tp": "DEG2-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-DEG2-DEG2-CTP-TXtoOpenROADM-4-SRG1-SRG1-CP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-5-SRG1-SRG1-CP-TXtoOpenROADM-5-DEG1-DEG1-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-5-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-5-DEG1",
+                        "dest-tp": "DEG1-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-DEG1-DEG1-CTP-TXtoOpenROADM-5-SRG1-SRG1-CP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-5-SRG1-SRG1-CP-TXtoOpenROADM-5-DEG2-DEG2-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-5-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-5-DEG2",
+                        "dest-tp": "DEG2-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-DEG2-DEG2-CTP-TXtoOpenROADM-5-SRG1-SRG1-CP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-5-SRG1-SRG1-CP-TXtoOpenROADM-5-DEG3-DEG3-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-5-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-5-DEG3",
+                        "dest-tp": "DEG3-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-DEG3-DEG3-CTP-TXtoOpenROADM-5-SRG1-SRG1-CP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-SRG1-SRG1-CP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-1-SRG1",
+                        "dest-tp": "SRG1-CP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-SRG1-SRG1-CP-TXtoOpenROADM-1-DEG1-DEG1-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-SRG1-SRG1-CP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-1-SRG1",
+                        "dest-tp": "SRG1-CP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-SRG1-SRG1-CP-TXtoOpenROADM-1-DEG2-DEG2-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-SRG1-SRG1-CP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-2-SRG1",
+                        "dest-tp": "SRG1-CP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-SRG1-SRG1-CP-TXtoOpenROADM-2-DEG1-DEG1-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-SRG1-SRG1-CP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-2-SRG1",
+                        "dest-tp": "SRG1-CP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-SRG1-SRG1-CP-TXtoOpenROADM-2-DEG2-DEG2-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-SRG1-SRG1-CP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-2-SRG1",
+                        "dest-tp": "SRG1-CP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-SRG1-SRG1-CP-TXtoOpenROADM-2-DEG3-DEG3-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-3-DEG1-DEG1-CTP-TXtoOpenROADM-3-SRG1-SRG1-CP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-3-SRG1",
+                        "dest-tp": "SRG1-CP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-SRG1-SRG1-CP-TXtoOpenROADM-3-DEG1-DEG1-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-3-DEG2-DEG2-CTP-TXtoOpenROADM-3-SRG1-SRG1-CP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-3-SRG1",
+                        "dest-tp": "SRG1-CP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-SRG1-SRG1-CP-TXtoOpenROADM-3-DEG2-DEG2-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-3-DEG3-DEG3-CTP-TXtoOpenROADM-3-SRG1-SRG1-CP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-3-SRG1",
+                        "dest-tp": "SRG1-CP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-SRG1-SRG1-CP-TXtoOpenROADM-3-DEG3-DEG3-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-3-DEG4-DEG4-CTP-TXtoOpenROADM-3-SRG1-SRG1-CP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-DEG4",
+                        "source-tp": "DEG4-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-3-SRG1",
+                        "dest-tp": "SRG1-CP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-SRG1-SRG1-CP-TXtoOpenROADM-3-DEG4-DEG4-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-4-DEG1-DEG1-CTP-TXtoOpenROADM-4-SRG1-SRG1-CP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-4-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-4-SRG1",
+                        "dest-tp": "SRG1-CP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-SRG1-SRG1-CP-TXtoOpenROADM-4-DEG1-DEG1-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-4-DEG2-DEG2-CTP-TXtoOpenROADM-4-SRG1-SRG1-CP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-4-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-4-SRG1",
+                        "dest-tp": "SRG1-CP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-SRG1-SRG1-CP-TXtoOpenROADM-4-DEG2-DEG2-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-5-DEG1-DEG1-CTP-TXtoOpenROADM-5-SRG1-SRG1-CP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-5-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-5-SRG1",
+                        "dest-tp": "SRG1-CP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-SRG1-SRG1-CP-TXtoOpenROADM-5-DEG1-DEG1-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-5-DEG2-DEG2-CTP-TXtoOpenROADM-5-SRG1-SRG1-CP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-5-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-5-SRG1",
+                        "dest-tp": "SRG1-CP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-SRG1-SRG1-CP-TXtoOpenROADM-5-DEG2-DEG2-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-5-DEG3-DEG3-CTP-TXtoOpenROADM-5-SRG1-SRG1-CP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-5-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-5-SRG1",
+                        "dest-tp": "SRG1-CP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-SRG1-SRG1-CP-TXtoOpenROADM-5-DEG3-DEG3-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-1-DEG1-to-OpenROADM-2-DEG1",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-1-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "spanloss-base": 20.0,
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "SRLG-length": 100000,
+                                    "pmd": 2.0,
+                                    "fiber-type": "smf"
+                                }
+                            ],
+                            "spanloss-current": 20.0,
+                            "engineered-spanloss": 20.0,
+                            "auto-spanloss": true
+                        }
+                    },
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-common-network:clfi": "fiber12",
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "destination": {
+                        "dest-node": "OpenROADM-2-DEG1",
+                        "dest-tp": "DEG1-TTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-DEG1-to-OpenROADM-1-DEG1"
+                },
+                {
+                    "link-id": "OpenROADM-1-DEG2-to-OpenROADM-3-DEG1",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-1-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "spanloss-base": 28.0,
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "SRLG-length": 100000,
+                                    "pmd": 0.0,
+                                    "fiber-type": "smf"
+                                }
+                            ],
+                            "spanloss-current": 28.0,
+                            "engineered-spanloss": 28.0,
+                            "auto-spanloss": true
+                        }
+                    },
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-common-network:clfi": "fiber13",
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "destination": {
+                        "dest-node": "OpenROADM-3-DEG1",
+                        "dest-tp": "DEG1-TTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-DEG1-to-OpenROADM-1-DEG2"
+                },
+                {
+                    "link-id": "OpenROADM-2-DEG1-to-OpenROADM-1-DEG1",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-2-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "spanloss-base": 20.0,
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "SRLG-length": 100000,
+                                    "pmd": 2.0,
+                                    "fiber-type": "smf"
+                                }
+                            ],
+                            "spanloss-current": 20.0,
+                            "engineered-spanloss": 20.0,
+                            "auto-spanloss": true
+                        }
+                    },
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-common-network:clfi": "fiber21",
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "destination": {
+                        "dest-node": "OpenROADM-1-DEG1",
+                        "dest-tp": "DEG1-TTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-DEG1-to-OpenROADM-2-DEG1"
+                },
+                {
+                    "link-id": "OpenROADM-2-DEG2-to-OpenROADM-3-DEG2",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-2-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "spanloss-base": 5.0,
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "SRLG-length": 10000,
+                                    "pmd": 32.0,
+                                    "fiber-type": "smf"
+                                }
+                            ],
+                            "spanloss-current": 5.0,
+                            "engineered-spanloss": 5.0,
+                            "auto-spanloss": true
+                        }
+                    },
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-common-network:clfi": "fiber23",
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "destination": {
+                        "dest-node": "OpenROADM-3-DEG2",
+                        "dest-tp": "DEG2-TTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-DEG2-to-OpenROADM-2-DEG2"
+                },
+                {
+                    "link-id": "OpenROADM-2-DEG3-to-OpenROADM-5-DEG3",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-2-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "spanloss-base": 20.0,
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "SRLG-length": 100000,
+                                    "pmd": 2.0,
+                                    "fiber-type": "smf"
+                                }
+                            ],
+                            "spanloss-current": 20.0,
+                            "engineered-spanloss": 20.0,
+                            "auto-spanloss": true
+                        }
+                    },
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-common-network:clfi": "fiber25",
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "destination": {
+                        "dest-node": "OpenROADM-5-DEG3",
+                        "dest-tp": "DEG3-TTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-DEG3-to-OpenROADM-2-DEG3"
+                },
+                {
+                    "link-id": "OpenROADM-3-DEG1-to-OpenROADM-1-DEG2",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "spanloss-base": 28.0,
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "SRLG-length": 100000,
+                                    "pmd": 0.0,
+                                    "fiber-type": "smf"
+                                }
+                            ],
+                            "spanloss-current": 28.0,
+                            "engineered-spanloss": 28.0,
+                            "auto-spanloss": true
+                        }
+                    },
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-common-network:clfi": "fiber31",
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "destination": {
+                        "dest-node": "OpenROADM-1-DEG2",
+                        "dest-tp": "DEG2-TTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-DEG2-to-OpenROADM-3-DEG1"
+                },
+                {
+                    "link-id": "OpenROADM-3-DEG2-to-OpenROADM-2-DEG2",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "spanloss-base": 5.0,
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "SRLG-length": 10000,
+                                    "pmd": 30.0,
+                                    "fiber-type": "smf"
+                                }
+                            ],
+                            "spanloss-current": 5.0,
+                            "engineered-spanloss": 5.0,
+                            "auto-spanloss": true
+                        }
+                    },
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-common-network:clfi": "fiber32",
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "destination": {
+                        "dest-node": "OpenROADM-2-DEG2",
+                        "dest-tp": "DEG2-TTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-DEG2-to-OpenROADM-3-DEG2"
+                },
+                {
+                    "link-id": "OpenROADM-3-DEG3-to-OpenROADM-5-DEG2",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "spanloss-base": 25.0,
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "SRLG-length": 100000,
+                                    "pmd": 32.0,
+                                    "fiber-type": "smf"
+                                }
+                            ],
+                            "spanloss-current": 25.0,
+                            "engineered-spanloss": 25.0,
+                            "auto-spanloss": true
+                        }
+                    },
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-common-network:clfi": "fiber35",
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "destination": {
+                        "dest-node": "OpenROADM-5-DEG2",
+                        "dest-tp": "DEG2-TTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-DEG2-to-OpenROADM-3-DEG3"
+                },
+                {
+                    "link-id": "OpenROADM-3-DEG4-to-OpenROADM-4-DEG2",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-DEG4",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "spanloss-base": 25.0,
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "SRLG-length": 100000,
+                                    "pmd": 2.0,
+                                    "fiber-type": "smf"
+                                }
+                            ],
+                            "spanloss-current": 25.0,
+                            "engineered-spanloss": 25.0,
+                            "auto-spanloss": true
+                        }
+                    },
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-common-network:clfi": "fiber34",
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "destination": {
+                        "dest-node": "OpenROADM-4-DEG2",
+                        "dest-tp": "DEG2-TTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-DEG2-to-OpenROADM-3-DEG4"
+                },
+                {
+                    "link-id": "OpenROADM-4-DEG1-to-OpenROADM-5-DEG1",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-4-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "spanloss-base": 25.0,
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "SRLG-length": 100000,
+                                    "pmd": 2.0,
+                                    "fiber-type": "smf"
+                                }
+                            ],
+                            "spanloss-current": 25.0,
+                            "engineered-spanloss": 25.0,
+                            "auto-spanloss": true
+                        }
+                    },
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-common-network:clfi": "fiber45",
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "destination": {
+                        "dest-node": "OpenROADM-5-DEG1",
+                        "dest-tp": "DEG1-TTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-DEG1-to-OpenROADM-4-DEG1"
+                },
+                {
+                    "link-id": "OpenROADM-4-DEG2-to-OpenROADM-3-DEG4",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-4-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "spanloss-base": 25.0,
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "SRLG-length": 100000,
+                                    "pmd": 2.0,
+                                    "fiber-type": "smf"
+                                }
+                            ],
+                            "spanloss-current": 25.0,
+                            "engineered-spanloss": 25.0,
+                            "auto-spanloss": true
+                        }
+                    },
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-common-network:clfi": "fiber43",
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "destination": {
+                        "dest-node": "OpenROADM-3-DEG4",
+                        "dest-tp": "DEG4-TTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-DEG4-to-OpenROADM-4-DEG2"
+                },
+                {
+                    "link-id": "OpenROADM-5-DEG1-to-OpenROADM-4-DEG1",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-5-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "spanloss-base": 25.0,
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "SRLG-length": 100000,
+                                    "pmd": 2.0,
+                                    "fiber-type": "smf"
+                                }
+                            ],
+                            "spanloss-current": 25.0,
+                            "engineered-spanloss": 25.0,
+                            "auto-spanloss": true
+                        }
+                    },
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-common-network:clfi": "fiber54",
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "destination": {
+                        "dest-node": "OpenROADM-4-DEG1",
+                        "dest-tp": "DEG1-TTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-DEG1-to-OpenROADM-5-DEG1"
+                },
+                {
+                    "link-id": "OpenROADM-5-DEG2-to-OpenROADM-3-DEG3",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-5-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "spanloss-base": 25.0,
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "SRLG-length": 100000,
+                                    "pmd": 0.5,
+                                    "fiber-type": "smf"
+                                }
+                            ],
+                            "spanloss-current": 25.0,
+                            "engineered-spanloss": 25.0,
+                            "auto-spanloss": true
+                        }
+                    },
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-common-network:clfi": "fiber53",
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "destination": {
+                        "dest-node": "OpenROADM-3-DEG3",
+                        "dest-tp": "DEG3-TTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-DEG3-to-OpenROADM-5-DEG2"
+                },
+                {
+                    "link-id": "OpenROADM-5-DEG3-to-OpenROADM-2-DEG3",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-5-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "spanloss-base": 20.0,
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "SRLG-length": 100000,
+                                    "pmd": 2.0,
+                                    "fiber-type": "smf"
+                                }
+                            ],
+                            "spanloss-current": 20.0,
+                            "engineered-spanloss": 20.0,
+                            "auto-spanloss": true
+                        }
+                    },
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-common-network:clfi": "fiber52",
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "destination": {
+                        "dest-node": "OpenROADM-2-DEG3",
+                        "dest-tp": "DEG3-TTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-DEG3-to-OpenROADM-5-DEG3"
+                },
+                {
+                    "link-id": "OpenROADM-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-DEG2-DEG2-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-1-DEG2",
+                        "dest-tp": "DEG2-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-DEG1-DEG1-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-DEG1-DEG1-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-1-DEG1",
+                        "dest-tp": "DEG1-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-DEG2-DEG2-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-DEG2-DEG2-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-2-DEG2",
+                        "dest-tp": "DEG2-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-DEG1-DEG1-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-DEG3-DEG3-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-2-DEG3",
+                        "dest-tp": "DEG3-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-DEG1-DEG1-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-DEG1-DEG1-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-2-DEG1",
+                        "dest-tp": "DEG1-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-DEG2-DEG2-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-DEG3-DEG3-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-2-DEG3",
+                        "dest-tp": "DEG3-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-DEG2-DEG2-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-DEG1-DEG1-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-2-DEG1",
+                        "dest-tp": "DEG1-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-DEG3-DEG3-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-DEG2-DEG2-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-2-DEG2",
+                        "dest-tp": "DEG2-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-DEG3-DEG3-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-3-DEG1-DEG1-CTP-TXtoOpenROADM-3-DEG2-DEG2-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-3-DEG2",
+                        "dest-tp": "DEG2-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-DEG2-DEG2-CTP-TXtoOpenROADM-3-DEG1-DEG1-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-3-DEG1-DEG1-CTP-TXtoOpenROADM-3-DEG3-DEG3-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-3-DEG3",
+                        "dest-tp": "DEG3-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-DEG3-DEG3-CTP-TXtoOpenROADM-3-DEG1-DEG1-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-3-DEG1-DEG1-CTP-TXtoOpenROADM-3-DEG4-DEG4-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-3-DEG4",
+                        "dest-tp": "DEG4-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-DEG4-DEG4-CTP-TXtoOpenROADM-3-DEG1-DEG1-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-3-DEG2-DEG2-CTP-TXtoOpenROADM-3-DEG1-DEG1-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-3-DEG1",
+                        "dest-tp": "DEG1-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-DEG1-DEG1-CTP-TXtoOpenROADM-3-DEG2-DEG2-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-3-DEG2-DEG2-CTP-TXtoOpenROADM-3-DEG3-DEG3-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-3-DEG3",
+                        "dest-tp": "DEG3-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-DEG3-DEG3-CTP-TXtoOpenROADM-3-DEG2-DEG2-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-3-DEG2-DEG2-CTP-TXtoOpenROADM-3-DEG4-DEG4-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-3-DEG4",
+                        "dest-tp": "DEG4-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-DEG4-DEG4-CTP-TXtoOpenROADM-3-DEG2-DEG2-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-3-DEG3-DEG3-CTP-TXtoOpenROADM-3-DEG1-DEG1-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-3-DEG1",
+                        "dest-tp": "DEG1-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-DEG1-DEG1-CTP-TXtoOpenROADM-3-DEG3-DEG3-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-3-DEG3-DEG3-CTP-TXtoOpenROADM-3-DEG2-DEG2-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-3-DEG2",
+                        "dest-tp": "DEG2-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-DEG2-DEG2-CTP-TXtoOpenROADM-3-DEG3-DEG3-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-3-DEG3-DEG3-CTP-TXtoOpenROADM-3-DEG4-DEG4-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-3-DEG4",
+                        "dest-tp": "DEG4-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-DEG4-DEG4-CTP-TXtoOpenROADM-3-DEG3-DEG3-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-3-DEG4-DEG4-CTP-TXtoOpenROADM-3-DEG1-DEG1-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-DEG4",
+                        "source-tp": "DEG4-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-3-DEG1",
+                        "dest-tp": "DEG1-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-DEG1-DEG1-CTP-TXtoOpenROADM-3-DEG4-DEG4-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-3-DEG4-DEG4-CTP-TXtoOpenROADM-3-DEG2-DEG2-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-DEG4",
+                        "source-tp": "DEG4-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-3-DEG2",
+                        "dest-tp": "DEG2-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-DEG2-DEG2-CTP-TXtoOpenROADM-3-DEG4-DEG4-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-3-DEG4-DEG4-CTP-TXtoOpenROADM-3-DEG3-DEG3-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-3-DEG4",
+                        "source-tp": "DEG4-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-3-DEG3",
+                        "dest-tp": "DEG3-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-DEG3-DEG3-CTP-TXtoOpenROADM-3-DEG4-DEG4-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-4-DEG1-DEG1-CTP-TXtoOpenROADM-4-DEG2-DEG2-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-4-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-4-DEG2",
+                        "dest-tp": "DEG2-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-DEG2-DEG2-CTP-TXtoOpenROADM-4-DEG1-DEG1-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-4-DEG2-DEG2-CTP-TXtoOpenROADM-4-DEG1-DEG1-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-4-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-4-DEG1",
+                        "dest-tp": "DEG1-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-DEG1-DEG1-CTP-TXtoOpenROADM-4-DEG2-DEG2-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-5-DEG1-DEG1-CTP-TXtoOpenROADM-5-DEG2-DEG2-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-5-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-5-DEG2",
+                        "dest-tp": "DEG2-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-DEG2-DEG2-CTP-TXtoOpenROADM-5-DEG1-DEG1-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-5-DEG1-DEG1-CTP-TXtoOpenROADM-5-DEG3-DEG3-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-5-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-5-DEG3",
+                        "dest-tp": "DEG3-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-DEG3-DEG3-CTP-TXtoOpenROADM-5-DEG1-DEG1-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-5-DEG2-DEG2-CTP-TXtoOpenROADM-5-DEG1-DEG1-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-5-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-5-DEG1",
+                        "dest-tp": "DEG1-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-DEG1-DEG1-CTP-TXtoOpenROADM-5-DEG2-DEG2-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-5-DEG2-DEG2-CTP-TXtoOpenROADM-5-DEG3-DEG3-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-5-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-5-DEG3",
+                        "dest-tp": "DEG3-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-DEG3-DEG3-CTP-TXtoOpenROADM-5-DEG2-DEG2-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-5-DEG3-DEG3-CTP-TXtoOpenROADM-5-DEG1-DEG1-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-5-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-5-DEG1",
+                        "dest-tp": "DEG1-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-DEG1-DEG1-CTP-TXtoOpenROADM-5-DEG3-DEG3-CTP-RX"
+                },
+                {
+                    "link-id": "OpenROADM-5-DEG3-DEG3-CTP-TXtoOpenROADM-5-DEG2-DEG2-CTP-RX",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "source": {
+                        "source-node": "OpenROADM-5-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "destination": {
+                        "dest-node": "OpenROADM-5-DEG2",
+                        "dest-tp": "DEG2-CTP-RX"
+                    },
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-DEG2-DEG2-CTP-TXtoOpenROADM-5-DEG3-DEG3-CTP-RX"
+                }
+            ],
+            "node": [
+                {
+                    "node-id": "OpenROADM-1-SRG1",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": 191.325,
+                                "freq-map-granularity": 6.25,
+                                "effective-bits": 8,
+                                "freq-map": "AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node1"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "OpenROADM-1-DEG1",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 1,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": 191.325,
+                                "freq-map-granularity": 6.25,
+                                "effective-bits": 8,
+                                "freq-map":"AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node1"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "OpenROADM-1-DEG2",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 2,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": 191.325,
+                                "freq-map-granularity": 6.25,
+                                "effective-bits": 8,
+                                "freq-map": "AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node1"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "OpenROADM-2-SRG1",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": 191.325,
+                                "freq-map-granularity": 6.25,
+                                "effective-bits": 8,
+                                "freq-map": "AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node2"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "OpenROADM-2-DEG1",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 1,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": 191.325,
+                                "freq-map-granularity": 6.25,
+                                "effective-bits": 8,
+                                "freq-map":"AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node2"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "OpenROADM-2-DEG2",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 2,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": 191.325,
+                                "freq-map-granularity": 6.25,
+                                "effective-bits": 8,
+                                "freq-map": "AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node2"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "OpenROADM-2-DEG3",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": 191.325,
+                                "freq-map-granularity": 6.25,
+                                "effective-bits": 8,
+                                "freq-map":"AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node2"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "OpenROADM-3-SRG1",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": 191.325,
+                                "freq-map-granularity": 6.25,
+                                "effective-bits": 8,
+                                "freq-map":"AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node3"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "OpenROADM-3-DEG1",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 1,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": 191.325,
+                                "freq-map-granularity": 6.25,
+                                "effective-bits": 8,
+                                "freq-map": "AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node3"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "OpenROADM-3-DEG2",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 2,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": 191.325,
+                                "freq-map-granularity": 6.25,
+                                "effective-bits": 8,
+                                "freq-map":"AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node3"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "OpenROADM-3-DEG3",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 3,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": 191.325,
+                                "freq-map-granularity": 6.25,
+                                "effective-bits": 8,
+                                "freq-map": "AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node3"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "OpenROADM-3-DEG4",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG4-TTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP"
+                        },
+                        {
+                            "tp-id": "DEG4-CTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG4-CTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG4-TTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 4,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": 191.325,
+                                "freq-map-granularity": 6.25,
+                                "effective-bits": 8,
+                                "freq-map": "AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node3"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "OpenROADM-4-SRG1",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": 191.325,
+                                "freq-map-granularity": 6.25,
+                                "effective-bits": 8,
+                                "freq-map": "AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node4"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "OpenROADM-4-DEG1",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 1,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": 191.325,
+                                "freq-map-granularity": 6.25,
+                                "effective-bits": 8,
+                                "freq-map": "AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node4"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "OpenROADM-4-DEG2",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 2,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": 191.325,
+                                "freq-map-granularity": 6.25,
+                                "effective-bits": 8,
+                                "freq-map": "AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node4"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "OpenROADM-5-SRG1",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": 191.325,
+                                "freq-map-granularity": 6.25,
+                                "effective-bits": 8,
+                                "freq-map": "AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node5"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "OpenROADM-5-DEG1",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 1,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": 191.325,
+                                "freq-map-granularity": 6.25,
+                                "effective-bits": 8,
+                                "freq-map": "AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node5"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "OpenROADM-5-DEG2",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 2,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": 191.325,
+                                "freq-map-granularity": 6.25,
+                                "effective-bits": 8,
+                                "freq-map": "AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node5"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "OpenROADM-5-DEG3",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 3,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": 191.325,
+                                "freq-map-granularity": 6.25,
+                                "effective-bits": 8,
+                                "freq-map": "AP////8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node5"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "XPONDER-1",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        },
+                        {
+                            "tp-id": "Client-1",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node1"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "XPONDER-2",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        },
+                        {
+                            "tp-id": "Client-1",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node2"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "XPONDER-3",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        },
+                        {
+                            "tp-id": "Client-1",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node3"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "XPONDER-4",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        },
+                        {
+                            "tp-id": "Client-1",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-4"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node4"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "XPONDER-5",
+                    "operational-state": "inService",
+                    "administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
+                        },
+                        {
+                            "tp-id": "Client-1",
+                            "operational-state": "inService",
+                            "administrative-state": "inService",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-5"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "Node5"
+                        }
+                    ]
+                }
+            ]
+        }
+    }
+}
\ No newline at end of file
diff --git a/pce/src/test/resources/topologyData/portMapping2.json b/pce/src/test/resources/topologyData/portMapping2.json
new file mode 100644 (file)
index 0000000..6209d07
--- /dev/null
@@ -0,0 +1,1228 @@
+{
+    "network": {
+        "nodes": [
+            {
+                "node-id": "XPONDER-1",
+                "mapping": [
+                    {
+                        "logical-connection-point": "XPDR-NW1-RX",
+                        "port-qual": "xpdr-network",
+                        "port-direction": "rx",
+                        "supporting-port": "1",
+                        "connection-map-lcp": "Client-1",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "XPDR-NW1-TX",
+                        "port-qual": "xpdr-network",
+                        "port-direction": "tx",
+                        "supporting-port": "1",
+                        "connection-map-lcp": "Client-1",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "Client-1",
+                        "port-qual": "xpdr-client",
+                        "port-direction": "bidirectional",
+                        "supporting-port": "C1",
+                        "connection-map-lcp": "XPDR1-NW1-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-100GE"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-CLIENT"
+                    }
+                ],
+                "node-info": {
+                    "node-clli": "Node1",
+                    "openroadm-version": "2.2.1",
+                    "node-model": "model2",
+                    "node-type": "xpdr",
+                    "node-vendor": "vendorA",
+                    "node-ip-address": "1.2.3.4"
+                }
+            },
+            {
+                "node-id": "XPONDER-2",
+                "mapping": [
+                    {
+                        "logical-connection-point": "XPDR-NW1-RX",
+                        "port-qual": "xpdr-network",
+                        "port-direction": "rx",
+                        "supporting-port": "1",
+                        "connection-map-lcp": "Client-1",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "XPDR-NW1-TX",
+                        "port-qual": "xpdr-network",
+                        "port-direction": "tx",
+                        "supporting-port": "1",
+                        "connection-map-lcp": "Cleint-1",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "Client-1",
+                        "port-qual": "xpdr-client",
+                        "port-direction": "bidirectional",
+                        "supporting-port": "C1",
+                        "connection-map-lcp": "XPDR1-NW1-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-100GE"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-CLIENT"
+                    }
+                ],
+                "node-info": {
+                    "node-clli": "Node2",
+                    "openroadm-version": "2.2.1",
+                    "node-model": "model2",
+                    "node-type": "xpdr",
+                    "node-vendor": "vendorA",
+                    "node-ip-address": "1.2.3.5"
+                }
+           },
+           {
+                "node-id": "XPONDER-3",
+                "mapping": [
+                    {
+                        "logical-connection-point": "XPDR-NW1-RX",
+                        "port-qual": "xpdr-network",
+                        "port-direction": "rx",
+                        "supporting-port": "1",
+                        "connection-map-lcp": "Client-1",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "XPDR-NW1-TX",
+                        "port-qual": "xpdr-network",
+                        "port-direction": "tx",
+                        "supporting-port": "1",
+                        "connection-map-lcp": "Client-1",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "Client-1",
+                        "port-qual": "xpdr-client",
+                        "port-direction": "bidirectional",
+                        "supporting-port": "C1",
+                        "connection-map-lcp": "XPDR1-NW1-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-100GE"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-CLIENT"
+                    }
+                ],
+                "node-info": {
+                    "node-clli": "Node3",
+                    "openroadm-version": "2.2.1",
+                    "node-model": "model2",
+                    "node-type": "xpdr",
+                    "node-vendor": "vendorA",
+                    "node-ip-address": "1.2.3.6"
+                }
+            },
+            {
+                "node-id": "XPONDER-4",
+                "mapping": [
+                    {
+                        "logical-connection-point": "XPDR-NW1-RX",
+                        "port-qual": "xpdr-network",
+                        "port-direction": "rx",
+                        "supporting-port": "1",
+                        "connection-map-lcp": "Client-1",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "XPDR-NW1-TX",
+                        "port-qual": "xpdr-network",
+                        "port-direction": "tx",
+                        "supporting-port": "1",
+                        "connection-map-lcp": "Cleint-1",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "Client-1",
+                        "port-qual": "xpdr-client",
+                        "port-direction": "bidirectional",
+                        "supporting-port": "C1",
+                        "connection-map-lcp": "XPDR1-NW1-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-100GE"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-CLIENT"
+                    }
+                ],
+                "node-info": {
+                    "node-clli": "Node4",
+                    "openroadm-version": "2.2.1",
+                    "node-model": "model2",
+                    "node-type": "xpdr",
+                    "node-vendor": "vendorA",
+                    "node-ip-address": "1.2.3.7"
+                }
+           },
+           {
+                "node-id": "XPONDER-5",
+                "mapping": [
+                    {
+                        "logical-connection-point": "XPDR-NW1-RX",
+                        "port-qual": "xpdr-network",
+                        "port-direction": "rx",
+                        "supporting-port": "1",
+                        "connection-map-lcp": "Client-1",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "XPDR-NW1-TX",
+                        "port-qual": "xpdr-network",
+                        "port-direction": "tx",
+                        "supporting-port": "1",
+                        "connection-map-lcp": "Cleint-1",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "Client-1",
+                        "port-qual": "xpdr-client",
+                        "port-direction": "bidirectional",
+                        "supporting-port": "C1",
+                        "connection-map-lcp": "XPDR1-NW1-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-100GE"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-CLIENT"
+                    }
+                ],
+                "node-info": {
+                    "node-clli": "Node5",
+                    "openroadm-version": "2.2.1",
+                    "node-model": "model2",
+                    "node-type": "xpdr",
+                    "node-vendor": "vendorA",
+                    "node-ip-address": "1.2.3.8"
+                }
+           },
+           {
+                "node-id": "OpenROADM-1",
+                "mapping": [
+                    {
+                        "logical-connection-point": "DEG1-CTP-TX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "tx",
+                        "supporting-port": "1",
+                        "connection-map-lcp": "DEG1-TTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG1-CTP-RX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "rx",
+                        "supporting-port": "1",
+                        "connection-map-lcp": "DEG1-TTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG1-TTP-TX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "tx",
+                        "supporting-port": "C1",
+                        "connection-map-lcp": "DEG1-CTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "DEG1-TTP-RX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "rx",
+                        "supporting-port": "C1",
+                        "connection-map-lcp": "DEG1-CTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "DEG2-CTP-TX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "tx",
+                        "supporting-port": "2",
+                        "connection-map-lcp": "DEG2-TTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "2/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG2-CTP-RX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "rx",
+                        "supporting-port": "2",
+                        "connection-map-lcp": "DEG2-TTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "2/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG2-TTP-TX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "tx",
+                        "supporting-port": "C2",
+                        "connection-map-lcp": "DEG2-CTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "2/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "DEG2-TTP-RX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "rx",
+                        "supporting-port": "C2",
+                        "connection-map-lcp": "DEG2-CTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "2/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "SRG1-CP-TX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "tx",
+                        "supporting-port": "SC1",
+                        "connection-map-lcp": "SRG1-PP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "5/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "SRG1-CP-RX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "rx",
+                        "supporting-port": "SC1",
+                        "connection-map-lcp": "SRG1-PP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "5/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "SRG1-PP-TX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "tx",
+                        "supporting-port": "PP1",
+                        "connection-map-lcp": "SRG1-CP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "5/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "SRG1-PP-RX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "rx",
+                        "supporting-port": "PP1",
+                        "connection-map-lcp": "SRG1-CP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "5/0/1-PLUG-CLIENT"
+                    }
+                ],
+                "node-info": {
+                    "node-clli": "Node1",
+                    "openroadm-version": "2.2.1",
+                    "node-model": "model2",
+                    "node-type": "rdm",
+                    "node-vendor": "vendorA",
+                    "node-ip-address": "1.2.3.9"
+                }
+            },
+            {
+                "node-id": "OpenROADM-2",
+                "mapping": [
+                    {
+                        "logical-connection-point": "DEG1-CTP-TX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "tx",
+                        "supporting-port": "1",
+                        "connection-map-lcp": "DEG1-TTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG1-CTP-RX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "rx",
+                        "supporting-port": "1",
+                        "connection-map-lcp": "DEG1-TTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG1-TTP-TX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "tx",
+                        "supporting-port": "C1",
+                        "connection-map-lcp": "DEG1-CTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "DEG1-TTP-RX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "rx",
+                        "supporting-port": "C1",
+                        "connection-map-lcp": "DEG1-CTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "DEG2-CTP-TX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "tx",
+                        "supporting-port": "2",
+                        "connection-map-lcp": "DEG2-TTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "2/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG2-CTP-RX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "rx",
+                        "supporting-port": "2",
+                        "connection-map-lcp": "DEG2-TTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "2/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG2-TTP-TX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "tx",
+                        "supporting-port": "C2",
+                        "connection-map-lcp": "DEG2-CTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "2/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "DEG2-TTP-RX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "rx",
+                        "supporting-port": "C2",
+                        "connection-map-lcp": "DEG2-CTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "2/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "DEG3-CTP-TX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "tx",
+                        "supporting-port": "3",
+                        "connection-map-lcp": "DEG3-TTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "3/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG3-CTP-RX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "rx",
+                        "supporting-port": "3",
+                        "connection-map-lcp": "DEG3-TTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "3/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG3-TTP-TX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "tx",
+                        "supporting-port": "C3",
+                        "connection-map-lcp": "DEG3-CTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "3/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "DEG3-TTP-RX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "rx",
+                        "supporting-port": "C3",
+                        "connection-map-lcp": "DEG3-CTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "3/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "SRG1-CP-TX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "tx",
+                        "supporting-port": "SC1",
+                        "connection-map-lcp": "SRG1-PP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "5/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "SRG1-CP-RX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "rx",
+                        "supporting-port": "SC1",
+                        "connection-map-lcp": "SRG1-PP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "5/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "SRG1-PP-TX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "tx",
+                        "supporting-port": "PP1",
+                        "connection-map-lcp": "SRG1-CP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "5/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "SRG1-PP-RX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "rx",
+                        "supporting-port": "PP1",
+                        "connection-map-lcp": "SRG1-CP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "5/0/1-PLUG-CLIENT"
+                    }
+                ],
+                "node-info": {
+                    "node-clli": "Node2",
+                    "openroadm-version": "2.2.1",
+                    "node-model": "model2",
+                    "node-type": "rdm",
+                    "node-vendor": "vendorA",
+                    "node-ip-address": "1.2.3.10"
+                }
+            },
+            {
+                "node-id": "OpenROADM-3",
+                "mapping": [
+                    {
+                        "logical-connection-point": "DEG1-CTP-TX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "tx",
+                        "supporting-port": "1",
+                        "connection-map-lcp": "DEG1-TTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG1-CTP-RX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "rx",
+                        "supporting-port": "1",
+                        "connection-map-lcp": "DEG1-TTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG1-TTP-TX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "tx",
+                        "supporting-port": "C1",
+                        "connection-map-lcp": "DEG1-CTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "DEG1-TTP-RX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "rx",
+                        "supporting-port": "C1",
+                        "connection-map-lcp": "DEG1-CTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "DEG2-CTP-TX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "tx",
+                        "supporting-port": "2",
+                        "connection-map-lcp": "DEG2-TTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "2/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG2-CTP-RX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "rx",
+                        "supporting-port": "2",
+                        "connection-map-lcp": "DEG2-TTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "2/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG2-TTP-TX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "tx",
+                        "supporting-port": "C2",
+                        "connection-map-lcp": "DEG2-CTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "2/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "DEG2-TTP-RX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "rx",
+                        "supporting-port": "C2",
+                        "connection-map-lcp": "DEG2-CTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "2/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "DEG3-CTP-TX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "tx",
+                        "supporting-port": "3",
+                        "connection-map-lcp": "DEG3-TTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "3/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG3-CTP-RX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "rx",
+                        "supporting-port": "3",
+                        "connection-map-lcp": "DEG3-TTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "3/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG3-TTP-TX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "tx",
+                        "supporting-port": "C3",
+                        "connection-map-lcp": "DEG3-CTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "3/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "DEG3-TTP-RX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "rx",
+                        "supporting-port": "C3",
+                        "connection-map-lcp": "DEG3-CTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "3/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "DEG4-CTP-TX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "tx",
+                        "supporting-port": "4",
+                        "connection-map-lcp": "DEG4-TTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "4/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG4-CTP-RX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "rx",
+                        "supporting-port": "4",
+                        "connection-map-lcp": "DEG4-TTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "4/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG4-TTP-TX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "tx",
+                        "supporting-port": "C4",
+                        "connection-map-lcp": "DEG4-CTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "4/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "DEG4-TTP-RX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "rx",
+                        "supporting-port": "C4",
+                        "connection-map-lcp": "DEG4-CTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "4/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "SRG1-CP-TX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "tx",
+                        "supporting-port": "SC1",
+                        "connection-map-lcp": "SRG1-PP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "5/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "SRG1-CP-RX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "rx",
+                        "supporting-port": "SC1",
+                        "connection-map-lcp": "SRG1-PP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "5/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "SRG1-PP-TX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "tx",
+                        "supporting-port": "PP1",
+                        "connection-map-lcp": "SRG1-CP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "5/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "SRG1-PP-RX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "rx",
+                        "supporting-port": "PP1",
+                        "connection-map-lcp": "SRG1-CP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "5/0/1-PLUG-CLIENT"
+                    }
+                ],
+                "node-info": {
+                    "node-clli": "Node3",
+                    "openroadm-version": "2.2.1",
+                    "node-model": "model2",
+                    "node-type": "rdm",
+                    "node-vendor": "vendorA",
+                    "node-ip-address": "1.2.3.11"
+                }
+            },
+            {
+                "node-id": "OpenROADM-4",
+                "mapping": [
+                    {
+                        "logical-connection-point": "DEG1-CTP-TX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "tx",
+                        "supporting-port": "1",
+                        "connection-map-lcp": "DEG1-TTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG1-CTP-RX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "rx",
+                        "supporting-port": "1",
+                        "connection-map-lcp": "DEG1-TTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG1-TTP-TX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "tx",
+                        "supporting-port": "C1",
+                        "connection-map-lcp": "DEG1-CTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "DEG1-TTP-RX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "rx",
+                        "supporting-port": "C1",
+                        "connection-map-lcp": "DEG1-CTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "DEG2-CTP-TX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "tx",
+                        "supporting-port": "2",
+                        "connection-map-lcp": "DEG2-TTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "2/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG2-CTP-RX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "rx",
+                        "supporting-port": "2",
+                        "connection-map-lcp": "DEG2-TTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "2/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG2-TTP-TX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "tx",
+                        "supporting-port": "C2",
+                        "connection-map-lcp": "DEG2-CTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "2/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "DEG2-TTP-RX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "rx",
+                        "supporting-port": "C2",
+                        "connection-map-lcp": "DEG2-CTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "2/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "SRG1-CP-TX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "tx",
+                        "supporting-port": "SC1",
+                        "connection-map-lcp": "SRG1-PP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "5/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "SRG1-CP-RX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "rx",
+                        "supporting-port": "SC1",
+                        "connection-map-lcp": "SRG1-PP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "5/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "SRG1-PP-TX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "tx",
+                        "supporting-port": "PP1",
+                        "connection-map-lcp": "SRG1-CP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "5/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "SRG1-PP-RX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "rx",
+                        "supporting-port": "PP1",
+                        "connection-map-lcp": "SRG1-CP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "5/0/1-PLUG-CLIENT"
+                    }
+                ],
+                "node-info": {
+                    "node-clli": "Node4",
+                    "openroadm-version": "2.2.1",
+                    "node-model": "model2",
+                    "node-type": "rdm",
+                    "node-vendor": "vendorA",
+                    "node-ip-address": "1.2.3.12"
+                }
+            },
+            {
+                "node-id": "OpenROADM-5",
+                "mapping": [
+                    {
+                        "logical-connection-point": "DEG1-CTP-TX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "tx",
+                        "supporting-port": "1",
+                        "connection-map-lcp": "DEG1-TTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG1-CTP-RX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "rx",
+                        "supporting-port": "1",
+                        "connection-map-lcp": "DEG1-TTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG1-TTP-TX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "tx",
+                        "supporting-port": "C1",
+                        "connection-map-lcp": "DEG1-CTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "DEG1-TTP-RX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "rx",
+                        "supporting-port": "C1",
+                        "connection-map-lcp": "DEG1-CTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "1/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "DEG2-CTP-TX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "tx",
+                        "supporting-port": "2",
+                        "connection-map-lcp": "DEG2-TTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "2/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG2-CTP-RX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "rx",
+                        "supporting-port": "2",
+                        "connection-map-lcp": "DEG2-TTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "2/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG2-TTP-TX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "tx",
+                        "supporting-port": "C2",
+                        "connection-map-lcp": "DEG2-CTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "2/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "DEG2-TTP-RX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "rx",
+                        "supporting-port": "C2",
+                        "connection-map-lcp": "DEG2-CTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "2/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "DEG3-CTP-TX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "tx",
+                        "supporting-port": "3",
+                        "connection-map-lcp": "DEG3-TTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "3/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG3-CTP-RX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "rx",
+                        "supporting-port": "3",
+                        "connection-map-lcp": "DEG3-TTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "3/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "DEG3-TTP-TX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "tx",
+                        "supporting-port": "C3",
+                        "connection-map-lcp": "DEG3-CTP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "3/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "DEG3-TTP-RX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "rx",
+                        "supporting-port": "C3",
+                        "connection-map-lcp": "DEG3-CTP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "3/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "SRG1-CP-TX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "tx",
+                        "supporting-port": "SC1",
+                        "connection-map-lcp": "SRG1-PP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRL",
+                        "supporting-circuit-pack-name": "5/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "SRG1-CP-RX",
+                        "port-qual": "roadm-internal",
+                        "port-direction": "rx",
+                        "supporting-port": "SC1",
+                        "connection-map-lcp": "SRG1-PP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AMkDwQ7xTmRI",
+                        "supporting-circuit-pack-name": "5/0/1-PLUG-NET"
+                    },
+                    {
+                        "logical-connection-point": "SRG1-PP-TX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "tx",
+                        "supporting-port": "PP1",
+                        "connection-map-lcp": "SRG1-CP-RX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "5/0/1-PLUG-CLIENT"
+                    },
+                    {
+                        "logical-connection-point": "SRG1-PP-RX",
+                        "port-qual": "roadm-external",
+                        "port-direction": "rx",
+                        "supporting-port": "PP1",
+                        "connection-map-lcp": "SRG1-CP-TX",
+                        "supported-interface-capability": [
+                            "org-openroadm-port-types:if-OCH"
+                        ],
+                        "lcp-hash-val": "AJUUr6I5fALj",
+                        "supporting-circuit-pack-name": "5/0/1-PLUG-CLIENT"
+                    }
+                ],
+                "node-info": {
+                    "node-clli": "Node5",
+                    "openroadm-version": "2.2.1",
+                    "node-model": "model2",
+                    "node-type": "rdm",
+                    "node-vendor": "vendorA",
+                    "node-ip-address": "1.2.3.13"
+                }
+            }
+        ]
+    }
+}
diff --git a/pom.xml b/pom.xml
index 4891b6f8844b25bf36e37a8e20654881b8bc70eb..aa058cf327762131791d50207dbb34d136676836 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -11,14 +11,14 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
 
   <parent>
     <groupId>org.opendaylight.odlparent</groupId>
-    <artifactId>odlparent</artifactId>
-    <version>9.0.13</version>
+    <artifactId>odlparent-lite</artifactId>
+    <version>13.0.11</version>
     <relativePath/>
   </parent>
 
   <groupId>org.opendaylight.transportpce</groupId>
   <artifactId>transportpce-aggregator</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
+  <version>10.0.0-SNAPSHOT</version>
   <name>transportpce</name>
   <packaging>pom</packaging>
 
@@ -30,8 +30,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
   </scm>
 
   <modules>
-    <module>ordmodels</module>
-    <module>tapimodels</module>
+    <module>artifacts</module>
     <module>api</module>
     <module>common</module>
     <module>test-common</module>
@@ -74,7 +73,6 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
       </plugin>
     </plugins>
   </build>
-
 </project>
 
 
index b1b0f0e85b328223739ad9a9fe32da99de00a147..4ce1a4b3a1d93a9a1cb8b099f58cdedb9c0d6050 100644 (file)
@@ -13,35 +13,63 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>8.0.11</version>
+    <version>13.0.1</version>
     <relativePath/>
   </parent>
 
   <groupId>org.opendaylight.transportpce</groupId>
   <artifactId>transportpce-renderer</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
+  <version>10.0.0-SNAPSHOT</version>
   <packaging>bundle</packaging>
 
+  <properties>
+    <transportpce.models.version>20.0.0-SNAPSHOT</transportpce.models.version>
+  </properties>
+
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.opendaylight.transportpce.models</groupId>
+        <artifactId>transportpce-models-artifacts</artifactId>
+        <version>${transportpce.models.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
   <dependencies>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-common</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-1.2.1</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-device</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-2.2.1</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-network</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-7.1.0</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-service</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-13.1.0</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-device-1.2.1</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-device-2.2.1</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-device-7.1.0</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-service-13.1.0</artifactId>
     </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
@@ -58,6 +86,11 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <artifactId>transportpce-networkmodel</artifactId>
       <version>${project.version}</version>
     </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>transportpce-olm</artifactId>
+      <version>${project.version}</version>
+    </dependency>
     <dependency>
       <groupId>org.opendaylight.yangtools</groupId>
       <artifactId>concepts</artifactId>
@@ -82,6 +115,14 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <groupId>com.google.guava</groupId>
       <artifactId>guava</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.service.component.annotations</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>com.github.spotbugs</groupId>
+      <artifactId>spotbugs-annotations</artifactId>
+    </dependency>
 
     <!-- Testing Dependencies -->
     <dependency>
index 47947151b9478bb285ce440c0f524c160dcac259..ca26148b327e1a92d277662666f77b11cb52cf79 100644 (file)
@@ -8,12 +8,14 @@
 package org.opendaylight.transportpce.renderer;
 
 import com.google.common.util.concurrent.ListenableFuture;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.math.BigDecimal;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
+import java.util.Set;
 import java.util.TreeMap;
 import java.util.stream.Collectors;
 import org.opendaylight.transportpce.common.NodeIdPair;
@@ -37,24 +39,25 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestOutput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommon;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommonBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommon;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommonBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.FrequencyGHz;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.FrequencyTHz;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.ModulationFormat;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev181130.OpucnTribSlotDef;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteInput;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.PathDescription;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirection;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirection;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZ;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToA;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.Resource;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.Link;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.TerminationPoint;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.optical.renderer.nodes.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.optical.renderer.nodes.NodesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.optical.renderer.nodes.NodesKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OpucnTribSlotDef;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteInput;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.PathDescription;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirection;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirection;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZ;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToA;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.Resource;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.Link;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.TerminationPoint;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.optical.renderer.nodes.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.optical.renderer.nodes.NodesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.optical.renderer.nodes.NodesKey;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 import org.opendaylight.yangtools.yang.common.Uint32;
@@ -89,8 +92,10 @@ public final class ModelMappingUtils {
                         .getHigherSpectralIndexFromFrequency(atoZDirection.getAToZMaxFrequency().getValue())));
             }
             // Set the MC-width for the OLM
-            olmSetupBldr.setMcWidth(new FrequencyGHz(atoZDirection.getAToZMaxFrequency().getValue()
-                .subtract(atoZDirection.getAToZMinFrequency().getValue()).multiply(new BigDecimal(1000))));
+            olmSetupBldr.setMcWidth(new FrequencyGHz(Decimal64.valueOf(
+                    atoZDirection.getAToZMaxFrequency().getValue().decimalValue()
+                    .subtract(atoZDirection.getAToZMinFrequency().getValue().decimalValue())
+                    .multiply(new BigDecimal(1000)))));
         }
         return olmSetupBldr.build();
     }
@@ -134,9 +139,10 @@ public final class ModelMappingUtils {
             .setServiceName(serviceName)
             .setOperation(operation)
             .setNodes(nodeLists.getRendererNodeList())
-            .setNmcWidth(new FrequencyGHz(GridConstant.WIDTH_40))
-            .setMcWidth(new FrequencyGHz(pathDescription.getAToZDirection().getAToZMaxFrequency().getValue()
-                       .subtract(pathDescription.getAToZDirection().getAToZMinFrequency().getValue())));
+            .setNmcWidth(new FrequencyGHz(Decimal64.valueOf(GridConstant.WIDTH_40)))
+            .setMcWidth(new FrequencyGHz(Decimal64.valueOf(
+                    pathDescription.getAToZDirection().getAToZMaxFrequency().getValue().decimalValue()
+                    .subtract(pathDescription.getAToZDirection().getAToZMinFrequency().getValue().decimalValue()))));
         if (atoZDirection.getAToZWavelengthNumber() != null) {
             servicePathInputBuilder
                 .setWaveNumber(atoZDirection.getAToZWavelengthNumber());
@@ -158,20 +164,20 @@ public final class ModelMappingUtils {
                             .getHigherSpectralIndexFromFrequency(atoZDirection.getAToZMaxFrequency().getValue())));
         }
         if (atoZDirection.getAToZMinFrequency() != null && atoZDirection.getAToZMaxFrequency() != null) {
-            servicePathInputBuilder.setCenterFreq(
-                    GridUtils.getCentralFrequencyWithPrecision(atoZDirection.getAToZMinFrequency().getValue(),
-                            atoZDirection.getAToZMaxFrequency().getValue(), scale));
+            servicePathInputBuilder.setCenterFreq(GridUtils.getCentralFrequencyWithPrecision(
+                    atoZDirection.getAToZMinFrequency().getValue().decimalValue(),
+                    atoZDirection.getAToZMaxFrequency().getValue().decimalValue(),
+                    scale));
         }
         if (atoZDirection.getRate() != null && atoZDirection.getModulationFormat() != null) {
-            Optional<ModulationFormat> optionalModulationFormat = ModulationFormat
-                    .forName(atoZDirection.getModulationFormat());
-            if (optionalModulationFormat.isPresent()
+            ModulationFormat modulationFormat = ModulationFormat.forName(atoZDirection.getModulationFormat());
+            if (modulationFormat != null
                     && GridConstant.FREQUENCY_WIDTH_TABLE
-                    .contains(atoZDirection.getRate(), optionalModulationFormat.get())) {
+                    .contains(atoZDirection.getRate(), modulationFormat)) {
                 servicePathInputBuilder
                     .setNmcWidth(FrequencyGHz
                         .getDefaultInstance(GridConstant.FREQUENCY_WIDTH_TABLE.get(atoZDirection.getRate(),
-                        optionalModulationFormat.get())));
+                        modulationFormat)));
             }
         }
         servicePathInputBuilder.setModulationFormat(atoZDirection.getModulationFormat())
@@ -190,9 +196,10 @@ public final class ModelMappingUtils {
             .setOperation(operation)
             .setServiceName(serviceName)
             .setNodes(nodeLists.getRendererNodeList())
-            .setNmcWidth(new FrequencyGHz(GridConstant.WIDTH_40))
-            .setMcWidth(new FrequencyGHz(pathDescription.getAToZDirection().getAToZMaxFrequency().getValue()
-                        .subtract(pathDescription.getAToZDirection().getAToZMinFrequency().getValue())));
+            .setNmcWidth(new FrequencyGHz(Decimal64.valueOf(GridConstant.WIDTH_40)))
+            .setMcWidth(new FrequencyGHz(Decimal64.valueOf(
+                    pathDescription.getAToZDirection().getAToZMaxFrequency().getValue().decimalValue()
+                    .subtract(pathDescription.getAToZDirection().getAToZMinFrequency().getValue().decimalValue()))));
         if (ztoADirection.getZToAWavelengthNumber() != null) {
             servicePathInputBuilder
                 .setWaveNumber(ztoADirection.getZToAWavelengthNumber());
@@ -214,19 +221,19 @@ public final class ModelMappingUtils {
                             .getHigherSpectralIndexFromFrequency(ztoADirection.getZToAMaxFrequency().getValue())));
         }
         if (ztoADirection.getZToAMinFrequency() != null && ztoADirection.getZToAMaxFrequency() != null) {
-            servicePathInputBuilder.setCenterFreq(
-                    GridUtils.getCentralFrequencyWithPrecision(ztoADirection.getZToAMinFrequency().getValue(),
-                            ztoADirection.getZToAMaxFrequency().getValue(), scale));
+            servicePathInputBuilder.setCenterFreq(GridUtils.getCentralFrequencyWithPrecision(
+                    ztoADirection.getZToAMinFrequency().getValue().decimalValue(),
+                    ztoADirection.getZToAMaxFrequency().getValue().decimalValue(),
+                    scale));
         }
         if (ztoADirection.getRate() != null && ztoADirection.getModulationFormat() != null) {
-            Optional<ModulationFormat> optionalModulationFormat = ModulationFormat
-                    .forName(ztoADirection.getModulationFormat());
-            if (optionalModulationFormat.isPresent()
+            ModulationFormat modulationFormat = ModulationFormat.forName(ztoADirection.getModulationFormat());
+            if (modulationFormat != null
                     && GridConstant.FREQUENCY_WIDTH_TABLE
-                    .contains(ztoADirection.getRate(), optionalModulationFormat.get())) {
+                    .contains(ztoADirection.getRate(), modulationFormat)) {
                 servicePathInputBuilder.setNmcWidth(FrequencyGHz
                         .getDefaultInstance(GridConstant.FREQUENCY_WIDTH_TABLE.get(ztoADirection.getRate(),
-                                optionalModulationFormat.get())));
+                                modulationFormat)));
             }
         }
         servicePathInputBuilder.setModulationFormat(ztoADirection.getModulationFormat())
@@ -239,7 +246,7 @@ public final class ModelMappingUtils {
     public static OtnServicePathInput rendererCreateOtnServiceInput(String serviceName, Action operation,
         String serviceFormat, Uint32 serviceRate, PathDescription pathDescription, boolean asideToZside) {
         // If atoZ is set true use A-to-Z direction otherwise use Z-to-A
-        List<org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.otn.renderer.nodes.Nodes> nodes =
+        List<org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.otn.renderer.nodes.Nodes> nodes =
             new ArrayList<>();
         NodeLists nodeLists =
             (asideToZside)
@@ -247,8 +254,8 @@ public final class ModelMappingUtils {
             : getNodesListZtoA(pathDescription.getZToADirection().nonnullZToA().values().iterator());
         LOG.info("These are node-lists {}, {}", nodeLists.getRendererNodeList(), nodeLists.getOlmNodeList());
         for (Nodes node: nodeLists.getRendererNodeList()) {
-            org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.otn.renderer.nodes.NodesBuilder nb
-                = new org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.otn.renderer.nodes
+            org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.otn.renderer.nodes.NodesBuilder nb
+                = new org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.otn.renderer.nodes
                     .NodesBuilder().setNodeId(node.getNodeId()).setNetworkTp(node.getDestTp());
             if (node.getSrcTp() != null && node.getSrcTp().contains("NETWORK")) {
                 nb.setNetwork2Tp(node.getSrcTp());
@@ -276,10 +283,13 @@ public final class ModelMappingUtils {
                 .setTribPortNumber(tribPort)
                 .setTribSlot(minTribSlot);
         }
-        if (serviceRate.intValue() == 100) {
-            List<OpucnTribSlotDef> opucnTribSlotDefList = new ArrayList<>();
-            opucnTribSlotDefList.add(pathDescription.getAToZDirection().getMinTribSlot());
-            opucnTribSlotDefList.add(pathDescription.getAToZDirection().getMaxTribSlot());
+        if (serviceRate.intValue() == 100 && pathDescription.getAToZDirection().getMinTribSlot() != null
+                && pathDescription.getAToZDirection().getMaxTribSlot() != null) {
+            Set<OpucnTribSlotDef> opucnTribSlotDefList = new HashSet<>();
+            opucnTribSlotDefList.add(
+                new OpucnTribSlotDef(pathDescription.getAToZDirection().getMinTribSlot().getValue()));
+            opucnTribSlotDefList.add(
+                new OpucnTribSlotDef(pathDescription.getAToZDirection().getMaxTribSlot().getValue()));
             otnServicePathInputBuilder.setOpucnTribSlots(opucnTribSlotDefList);
         }
         return otnServicePathInputBuilder.build();
@@ -291,8 +301,8 @@ public final class ModelMappingUtils {
         return new ServicePathInputBuilder().setServiceName(serviceName).build();
     }
 
-    public static List<String> getLinksFromServicePathDescription(PathDescription pathDescription) {
-        List<String> linkidList = new ArrayList<>();
+    public static Set<String> getLinksFromServicePathDescription(PathDescription pathDescription) {
+        Set<String> linkidList = new HashSet<>();
         pathDescription.getAToZDirection().getAToZ().values().stream()
             .filter(lk -> "Link".equals(lk.getResource().getResource().implementedInterface().getSimpleName()))
             .forEach(rsc -> {
@@ -381,7 +391,7 @@ public final class ModelMappingUtils {
         }
     }
 
-    @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+    @SuppressFBWarnings(
         value = {"NP_LOAD_OF_KNOWN_NULL_VALUE","RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE"},
         justification = "loop when value is not always null - "
                 + "TODO: check if something exists in Java lib")
index 5fb0bd8f9f0cc4fb63b4d6416cfc0906cd72cebf..b53ad567e3caf84ebb87a383993e701ea70913ed 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.transportpce.renderer;
 
 import java.util.List;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.optical.renderer.nodes.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.optical.renderer.nodes.Nodes;
 
 public class NodeLists {
 
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/RendererProvider.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/RendererProvider.java
deleted file mode 100644 (file)
index 3bfacdc..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright © 2017 AT&T and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.transportpce.renderer;
-
-import org.opendaylight.mdsal.binding.api.RpcProviderService;
-import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations;
-import org.opendaylight.transportpce.renderer.rpcs.DeviceRendererRPCImpl;
-import org.opendaylight.transportpce.renderer.rpcs.TransportPCEServicePathRPCImpl;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.TransportpceDeviceRendererService;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.TransportpceRendererService;
-import org.opendaylight.yangtools.concepts.ObjectRegistration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class RendererProvider {
-
-    private static final Logger LOG = LoggerFactory.getLogger(RendererProvider.class);
-    private final RpcProviderService rpcProviderService;
-    private DeviceRendererRPCImpl deviceRendererRPCImpl;
-    private ObjectRegistration<DeviceRendererRPCImpl> deviceRendererRegistration;
-    private ObjectRegistration<TransportpceRendererService> tpceServiceRegistry;
-    private RendererServiceOperations rendererServiceOperations;
-
-    public RendererProvider(RpcProviderService rpcProviderService, DeviceRendererRPCImpl deviceRendererRPCImpl,
-            RendererServiceOperations rendererServiceOperations) {
-        this.rpcProviderService = rpcProviderService;
-        this.deviceRendererRPCImpl = deviceRendererRPCImpl;
-        this.rendererServiceOperations = rendererServiceOperations;
-    }
-
-    /**
-     * Method called when the blueprint container is created.
-     */
-    public void init() {
-        LOG.info("RendererProvider Session Initiated");
-        TransportPCEServicePathRPCImpl transportPCEServicePathRPCImpl =
-            new TransportPCEServicePathRPCImpl(this.rendererServiceOperations);
-        this.deviceRendererRegistration = this.rpcProviderService
-                .registerRpcImplementation(TransportpceDeviceRendererService.class, deviceRendererRPCImpl);
-        this.tpceServiceRegistry = this.rpcProviderService
-                .registerRpcImplementation(TransportpceRendererService.class, transportPCEServicePathRPCImpl);
-    }
-
-    /**
-     * Method called when the blueprint container is destroyed.
-     */
-    public void close() {
-        LOG.info("RendererProvider Closed");
-        if (this.deviceRendererRegistration != null) {
-            this.deviceRendererRegistration.close();
-        }
-        if (this.tpceServiceRegistry != null) {
-            this.tpceServiceRegistry.close();
-        }
-    }
-
-}
index 9a54b87d0b7cb76fb06796631b1ab4acf3af454f..3a47fa03c5df6391b6ed2e618e9507760aea57d0 100644 (file)
@@ -8,7 +8,6 @@
 
 package org.opendaylight.transportpce.renderer.openroadminterface;
 
-import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
@@ -21,8 +20,9 @@ import org.opendaylight.transportpce.common.fixedflex.SpectrumInformation;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.PowerDBm;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.InterfaceBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.InterfaceKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.OrgOpenroadmDevice;
@@ -40,6 +40,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev161014.Opti
 import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev161014.OtnOdu;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev161014.OtnOtu;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev161014.OchAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev161014.OchAttributes.ModulationFormat;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev161014.R100G;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev161014.och.container.OchBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014.OtsAttributes;
@@ -52,14 +53,13 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev161
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev161014.OtuAttributes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev161014.otu.container.OtuBuilder;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 
 public class OpenRoadmInterface121 {
-    private static final String MAPPING_MSG_ERROR =
-            "Unable to get mapping from PortMapping for node % and logical connection port %s";
     private final PortMapping portMapping;
     private final OpenRoadmInterfaces openRoadmInterfaces;
     private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmInterface121.class);
@@ -73,34 +73,32 @@ public class OpenRoadmInterface121 {
             throws OpenRoadmInterfaceException {
         Mapping portMap = this.portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
-            throw new OpenRoadmInterfaceException(String.format(MAPPING_MSG_ERROR, nodeId, logicalConnPoint));
+            throw new OpenRoadmInterfaceException(
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
-
-        // Ethernet interface specific data
-        EthernetBuilder ethIfBuilder = new EthernetBuilder()
-                .setAutoNegotiation(EthAttributes.AutoNegotiation.Enabled)
-                .setDuplex(EthAttributes.Duplex.Full)
-                .setFec(EthAttributes.Fec.Off)
-                .setSpeed(Uint32.valueOf(100000))
-                .setMtu(Uint32.valueOf(9000));
-
-        InterfaceBuilder ethInterfaceBldr = createGenericInterfaceBuilder(portMap, EthernetCsmacd.class,
-                                                                          logicalConnPoint + "-ETHERNET");
-
-        // Create Interface1 type object required for adding as augmentation
-        Interface1Builder ethIf1Builder = new Interface1Builder();
-        ethInterfaceBldr.addAugmentation(ethIf1Builder.setEthernet(ethIfBuilder.build()).build());
-
+        InterfaceBuilder ethInterfaceBldr =
+            createGenericInterfaceBuilder(portMap, EthernetCsmacd.VALUE, logicalConnPoint + "-ETHERNET")
+                .addAugmentation(
+                    // Create Interface1 type object required for adding as augmentation
+                    new Interface1Builder()
+                        .setEthernet(
+                            // Ethernet interface specific data
+                            new EthernetBuilder()
+                                .setAutoNegotiation(EthAttributes.AutoNegotiation.Enabled)
+                                .setDuplex(EthAttributes.Duplex.Full)
+                                .setFec(EthAttributes.Fec.Off)
+                                .setSpeed(Uint32.valueOf(100000))
+                                .setMtu(Uint32.valueOf(9000))
+                                .build())
+                        .build());
         // Post interface on the device
         this.openRoadmInterfaces.postInterface(nodeId, ethInterfaceBldr);
-
         // Post the equipment-state change on the device circuit-pack
         this.openRoadmInterfaces.postEquipmentState(nodeId, portMap.getSupportingCircuitPackName(), true);
-
         return ethInterfaceBldr.getName();
     }
 
-    private InterfaceBuilder createGenericInterfaceBuilder(Mapping portMap, Class<? extends InterfaceType> type,
+    private InterfaceBuilder createGenericInterfaceBuilder(Mapping portMap, InterfaceType type,
                                                            String key) {
         return new InterfaceBuilder()
                 .setDescription("  TBD   ")
@@ -127,24 +125,22 @@ public class OpenRoadmInterface121 {
             throws OpenRoadmInterfaceException {
         Mapping portMap = this.portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
-            throw new OpenRoadmInterfaceException(String.format(MAPPING_MSG_ERROR, nodeId, logicalConnPoint));
+            throw new OpenRoadmInterfaceException(
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
         // Create generic interface
-        InterfaceBuilder otuInterfaceBldr = createGenericInterfaceBuilder(portMap, OtnOtu.class, logicalConnPoint
-                + "-OTU");
-        otuInterfaceBldr.setSupportingInterface(supportOchInterface);
-
-        // OTU interface specific data
-        OtuBuilder otuIfBuilder = new OtuBuilder()
-                .setFec(OtuAttributes.Fec.Scfec)
-                .setRate(OTU4.class);
-
-        // Create Interface1 type object required for adding as augmentation
-        // TODO look at imports of different versions of class
-        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev161014.Interface1Builder otuIf1Builder =
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev161014.Interface1Builder();
-        otuInterfaceBldr.addAugmentation(otuIf1Builder.setOtu(otuIfBuilder.build()).build());
-
+        InterfaceBuilder otuInterfaceBldr =
+            createGenericInterfaceBuilder(portMap, OtnOtu.VALUE, logicalConnPoint + "-OTU")
+                .setSupportingInterface(supportOchInterface)
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev161014.Interface1Builder()
+                        .setOtu(
+                            // OTU interface specific data
+                            new OtuBuilder()
+                                .setFec(OtuAttributes.Fec.Scfec)
+                                .setRate(OTU4.VALUE)
+                                .build())
+                        .build());
         // Post interface on the device
         this.openRoadmInterfaces.postInterface(nodeId, otuInterfaceBldr);
         this.portMapping.updateMapping(nodeId, portMap);
@@ -165,30 +161,30 @@ public class OpenRoadmInterface121 {
             throws OpenRoadmInterfaceException {
         Mapping portMap = this.portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
-            throw new OpenRoadmInterfaceException(String.format(MAPPING_MSG_ERROR, nodeId, logicalConnPoint));
+            throw new OpenRoadmInterfaceException(
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
-        InterfaceBuilder oduInterfaceBldr = createGenericInterfaceBuilder(portMap, OtnOdu.class, logicalConnPoint
-                + "-ODU");
+        InterfaceBuilder oduInterfaceBldr =
+            createGenericInterfaceBuilder(portMap, OtnOdu.VALUE, logicalConnPoint + "-ODU");
         if (portMap.getSupportingOtu4() != null) {
             oduInterfaceBldr.setSupportingInterface(portMap.getSupportingOtu4());
         }
-
-        // ODU interface specific data
-        // Set Opu attributes
-        OpuBuilder opuBldr = new OpuBuilder()
-                .setPayloadType("07")
-                .setExpPayloadType("07");
-        OduBuilder oduIfBuilder = new OduBuilder()
-                .setRate(ODU4.class)
-                .setMonitoringMode(OduAttributes.MonitoringMode.Terminated)
-                .setOpu(opuBldr.build());
-
-        // Create Interface1 type object required for adding as augmentation
-        // TODO look at imports of different versions of class
-        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev161014.Interface1Builder oduIf1Builder =
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev161014.Interface1Builder();
-        oduInterfaceBldr.addAugmentation(oduIf1Builder.setOdu(oduIfBuilder.build()).build());
-
+        oduInterfaceBldr.addAugmentation(
+            // Create Interface1 type object required for adding as augmentation
+            new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev161014.Interface1Builder()
+                .setOdu(
+                    // ODU interface specific data
+                    new OduBuilder()
+                        .setRate(ODU4.VALUE)
+                        .setMonitoringMode(OduAttributes.MonitoringMode.Terminated)
+                        .setOpu(
+                            // Set Opu attributes
+                            new OpuBuilder()
+                                .setPayloadType("07")
+                                .setExpPayloadType("07")
+                                .build())
+                        .build())
+                .build());
         // Post interface on the device
         this.openRoadmInterfaces.postInterface(nodeId, oduInterfaceBldr);
         return oduInterfaceBldr.getName();
@@ -207,72 +203,65 @@ public class OpenRoadmInterface121 {
 
     public List<String> createOpenRoadmOchInterfaces(String nodeId, String logicalConnPoint,
             SpectrumInformation spectrumInformation)
-        throws OpenRoadmInterfaceException {
+            throws OpenRoadmInterfaceException {
         Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
-            throw new OpenRoadmInterfaceException(String.format(
-                "Unable to get mapping from PortMapping for node %s and logical connection port %s",
-                    nodeId, logicalConnPoint));
+            throw new OpenRoadmInterfaceException(
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
         // Create generic interface
-        InterfaceBuilder ochInterfaceBldr = createGenericInterfaceBuilder(portMap, OpticalChannel.class,
+        InterfaceBuilder ochInterfaceBldr =
+            createGenericInterfaceBuilder(
+                portMap, OpticalChannel.VALUE,
                 spectrumInformation.getIdentifierFromParams(logicalConnPoint));
-
-        // OCH interface specific data
-        OchBuilder ocIfBuilder = new OchBuilder().setWavelengthNumber(spectrumInformation.getWaveLength());
-
         // Add supporting OMS interface
         if (portMap.getSupportingOms() != null) {
             ochInterfaceBldr.setSupportingInterface(portMap.getSupportingOms());
         }
-        // Create Interface1 type object required for adding as augmentation
-        // TODO look at imports of different versions of class
-        org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev161014.Interface1Builder
-                ochIf1Builder = new org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces
-                .rev161014.Interface1Builder();
-        ochInterfaceBldr.addAugmentation(ochIf1Builder.setOch(ocIfBuilder.build()).build());
-
-        List<String> interfacesCreated = new ArrayList<>();
+        ochInterfaceBldr.addAugmentation(
+            // Create Interface1 type object required for adding as augmentation
+            new org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev161014.Interface1Builder()
+                .setOch(
+                    // OCH interface specific data
+                    new OchBuilder().setWavelengthNumber(spectrumInformation.getWaveLength()).build())
+                .build());
         // Post interface on the device
         openRoadmInterfaces.postInterface(nodeId, ochInterfaceBldr);
-        interfacesCreated.add(ochInterfaceBldr.getName());
-        return interfacesCreated;
+        return new ArrayList<String>(List.of(ochInterfaceBldr.getName()));
     }
 
     public String createOpenRoadmOchInterface(String nodeId, String logicalConnPoint,
             SpectrumInformation spectrumInformation) throws OpenRoadmInterfaceException {
         Mapping portMap = this.portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
-            throw new OpenRoadmInterfaceException(String.format(
-                "Unable to get mapping from PortMapping for node %s and logical connection port %s",
-                    nodeId, logicalConnPoint));
+            throw new OpenRoadmInterfaceException(
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
-        OchAttributes.ModulationFormat modulationFormat = OchAttributes.ModulationFormat.DpQpsk;
-        Optional<OchAttributes.ModulationFormat> optionalModulationFormat = OchAttributes.ModulationFormat
-                .forName(spectrumInformation.getModulationFormat());
-        if (optionalModulationFormat.isPresent()) {
-            modulationFormat =  optionalModulationFormat.get();
+        ModulationFormat modulationFormat =
+            OchAttributes.ModulationFormat.forName(spectrumInformation.getModulationFormat());
+        if (modulationFormat == null) {
+            modulationFormat = OchAttributes.ModulationFormat.DpQpsk;
         }
-        // OCH interface specific data
-        OchBuilder ocIfBuilder = new OchBuilder()
-                .setWavelengthNumber(spectrumInformation.getWaveLength())
-                .setModulationFormat(modulationFormat)
-                .setRate(R100G.class)
-                .setTransmitPower(new PowerDBm(new BigDecimal("-5")));
-
-        // Create Interface1 type object required for adding as augmentation
-        // TODO look at imports of different versions of class
-        org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev161014
-                .Interface1Builder ochIf1Builder = new org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel
-                .interfaces.rev161014.Interface1Builder();
         // Create generic interface
-        InterfaceBuilder ochInterfaceBldr = createGenericInterfaceBuilder(portMap, OpticalChannel.class,
-                spectrumInformation.getIdentifierFromParams(logicalConnPoint));
-        ochInterfaceBldr.addAugmentation(ochIf1Builder.setOch(ocIfBuilder.build()).build());
-
+        InterfaceBuilder ochInterfaceBldr =
+            createGenericInterfaceBuilder(
+                    portMap, OpticalChannel.VALUE,
+                    spectrumInformation.getIdentifierFromParams(logicalConnPoint))
+                .addAugmentation(
+                    // Create Interface1 type object required for adding as augmentation
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev161014
+                            .Interface1Builder()
+                        .setOch(
+                            // OCH interface specific data
+                            new OchBuilder()
+                                .setWavelengthNumber(spectrumInformation.getWaveLength())
+                                .setModulationFormat(modulationFormat)
+                                .setRate(R100G.VALUE)
+                                .setTransmitPower(new PowerDBm(Decimal64.valueOf("-5")))
+                                .build())
+                        .build());
         // Post interface on the device
         this.openRoadmInterfaces.postInterface(nodeId, ochInterfaceBldr);
-
         // Post the equipment-state change on the device circuit-pack if xpdr node
         if (portMap.getLogicalConnectionPoint().contains(StringConstants.NETWORK_TOKEN)) {
             this.openRoadmInterfaces.postEquipmentState(nodeId, portMap.getSupportingCircuitPackName(), true);
@@ -285,64 +274,66 @@ public class OpenRoadmInterface121 {
     }
 
     public String createOpenRoadmOmsInterface(String nodeId, Mapping mapping) throws OpenRoadmInterfaceException {
-        if (mapping.getSupportingOms() == null) {
-            // Create generic interface
-            InterfaceBuilder omsInterfaceBldr = createGenericInterfaceBuilder(mapping, OpenROADMOpticalMultiplex.class,
-                "OMS-" + mapping.getLogicalConnectionPoint());
-            if (mapping.getSupportingOts() != null) {
-                omsInterfaceBldr.setSupportingInterface(mapping.getSupportingOts());
-            } else {
-                LOG.error("Unable to get ots interface from mapping {} - {}", nodeId,
-                          mapping.getLogicalConnectionPoint());
-                return null;
-            }
-            this.openRoadmInterfaces.postInterface(nodeId, omsInterfaceBldr);
-            this.portMapping.updateMapping(nodeId, mapping);
-            return omsInterfaceBldr.build().getName();
-        } else {
+        if (mapping.getSupportingOms() != null) {
             return mapping.getSupportingOms();
         }
+        if (mapping.getSupportingOts() == null) {
+            LOG.error("Unable to get ots interface from mapping {} - {}", nodeId, mapping.getLogicalConnectionPoint());
+            return null;
+        }
+        // Create generic interface
+        InterfaceBuilder omsInterfaceBldr =
+            createGenericInterfaceBuilder(
+                     mapping, OpenROADMOpticalMultiplex.VALUE,
+                    "OMS-" + mapping.getLogicalConnectionPoint())
+                .setSupportingInterface(mapping.getSupportingOts());
+        this.openRoadmInterfaces.postInterface(nodeId, omsInterfaceBldr);
+        this.portMapping.updateMapping(nodeId, mapping);
+        return omsInterfaceBldr.build().getName();
     }
 
     public String createOpenRoadmOtsInterface(String nodeId, Mapping mapping) throws OpenRoadmInterfaceException {
-        if (mapping.getSupportingOts() == null) {
-            // Create generic interface
-            InterfaceBuilder otsInterfaceBldr = createGenericInterfaceBuilder(mapping, OpticalTransport.class, "OTS-"
-                    + mapping.getLogicalConnectionPoint());
-            // OTS interface augmentation specific data
-            OtsBuilder otsIfBuilder = new OtsBuilder();
-            otsIfBuilder.setFiberType(OtsAttributes.FiberType.Smf);
-
-            // Create Interface1 type object required for adding as
-            // augmentation
-            org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014
-                    .Interface1Builder otsIf1Builder = new org.opendaylight.yang.gen.v1.http.org.openroadm
-                    .optical.transport.interfaces.rev161014.Interface1Builder();
-            otsInterfaceBldr.addAugmentation(otsIf1Builder.setOts(otsIfBuilder.build()).build());
-            this.openRoadmInterfaces.postInterface(nodeId, otsInterfaceBldr);
-            this.portMapping.updateMapping(nodeId, mapping);
-            return otsInterfaceBldr.build().getName();
-        } else {
+        if (mapping.getSupportingOts() != null) {
             return mapping.getSupportingOts();
         }
+        // Create generic interface
+        InterfaceBuilder otsInterfaceBldr =
+            createGenericInterfaceBuilder(mapping, OpticalTransport.VALUE, "OTS-" + mapping.getLogicalConnectionPoint())
+                .addAugmentation(
+                    // Create Interface1 type object required for adding as
+                    // augmentation
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014
+                            .Interface1Builder()
+                        .setOts(
+                            // OTS interface augmentation specific data
+                            new OtsBuilder().setFiberType(OtsAttributes.FiberType.Smf).build())
+                        .build());
+        this.openRoadmInterfaces.postInterface(nodeId, otsInterfaceBldr);
+        this.portMapping.updateMapping(nodeId, mapping);
+        return otsInterfaceBldr.build().getName();
     }
 
     public boolean isUsedByXc(String nodeId, String interfaceName, String xc,
-        DeviceTransactionManager deviceTransactionManager) {
-        InstanceIdentifier<RoadmConnections> xciid = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-            .child(RoadmConnections.class, new RoadmConnectionsKey(xc));
+            DeviceTransactionManager deviceTransactionManager) {
         LOG.info("reading xc {} in node {}", xc, nodeId);
-        Optional<RoadmConnections> crossconnection = deviceTransactionManager.getDataFromDevice(nodeId,
-            LogicalDatastoreType.CONFIGURATION, xciid, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-        if (crossconnection.isPresent()) {
-            RoadmConnections rc = crossconnection.get();
-            LOG.info("xd {} found", xc);
-            if (rc.getSource().getSrcIf().equals(interfaceName)
-                || rc.getDestination().getDstIf().equals(interfaceName)) {
-                return true;
-            }
-        } else {
+        Optional<RoadmConnections> crossconnection = deviceTransactionManager.getDataFromDevice(
+            nodeId,
+            LogicalDatastoreType.CONFIGURATION,
+            InstanceIdentifier
+                .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                .child(RoadmConnections.class, new RoadmConnectionsKey(xc))
+                .build(),
+            Timeouts.DEVICE_READ_TIMEOUT,
+            Timeouts.DEVICE_READ_TIMEOUT_UNIT);
+        if (crossconnection.isEmpty()) {
             LOG.info("xd {} not found !", xc);
+            return false;
+        }
+        RoadmConnections rc = crossconnection.orElseThrow();
+        LOG.info("xd {} found", xc);
+        if (rc.getSource().getSrcIf().equals(interfaceName)
+                || rc.getDestination().getDstIf().equals(interfaceName)) {
+            return true;
         }
         return false;
     }
index 42cc02c86d13024748816ec450e4de420a06609f..64375e0a9d54b69cdb45eaee708edd25cdcb2fd7 100644 (file)
@@ -8,7 +8,6 @@
 
 package org.opendaylight.transportpce.renderer.openroadminterface;
 
-import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
@@ -23,12 +22,13 @@ import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfa
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.az.api.info.AEndApiInfo;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.az.api.info.ZEndApiInfo;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.FrequencyGHz;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.FrequencyTHz;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.ModulationFormat;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.PowerDBm;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.R100G;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp.InterfaceBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp.InterfaceKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.OrgOpenroadmDevice;
@@ -62,6 +62,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev17121
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev171215.OTU4;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev171215.OduFunctionIdentity;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev171215.PayloadTypeDef;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.Interface1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.OduAttributes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.OduAttributes.MonitoringMode;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.odu.container.OduBuilder;
@@ -70,14 +71,13 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev181019.OtuAttributes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev181019.otu.container.OtuBuilder;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 
 public class OpenRoadmInterface221 {
-    private static final String MAPPING_ERROR_EXCEPTION_MESSAGE =
-            "Unable to get mapping from PortMapping for node % and logical connection port %s";
     private final PortMapping portMapping;
     private final OpenRoadmInterfaces openRoadmInterfaces;
     private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmInterface221.class);
@@ -89,27 +89,26 @@ public class OpenRoadmInterface221 {
     }
 
     public String createOpenRoadmEthInterface(String nodeId, String logicalConnPoint)
-        throws OpenRoadmInterfaceException {
+            throws OpenRoadmInterfaceException {
         Mapping mapping = portMapping.getMapping(nodeId, logicalConnPoint);
         if (mapping == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
-
-        // Ethernet interface specific data
-        EthernetBuilder ethIfBuilder = new EthernetBuilder()
-            .setFec(EthAttributes.Fec.Off)
-            .setSpeed(Uint32.valueOf(100000));
-
-        InterfaceBuilder ethInterfaceBldr = createGenericInterfaceBuilder(mapping, EthernetCsmacd.class,
-            logicalConnPoint + "-ETHERNET");
-        // Create Interface1 type object required for adding as augmentation
-        Interface1Builder ethIf1Builder = new Interface1Builder();
-        ethInterfaceBldr.addAugmentation(ethIf1Builder.setEthernet(ethIfBuilder.build()).build());
-
         // Post interface on the device
+        InterfaceBuilder ethInterfaceBldr =
+            createGenericInterfaceBuilder(mapping, EthernetCsmacd.VALUE, logicalConnPoint + "-ETHERNET")
+                .addAugmentation(
+                    // Create Interface1 type object required for adding as augmentation
+                    new Interface1Builder()
+                        .setEthernet(
+                            // Ethernet interface specific data
+                            new EthernetBuilder()
+                                .setFec(EthAttributes.Fec.Off)
+                                .setSpeed(Uint32.valueOf(100000))
+                                .build())
+                        .build());
         openRoadmInterfaces.postInterface(nodeId, ethInterfaceBldr);
-
         // Post the equipment-state change on the device circuit-pack
         openRoadmInterfaces.postEquipmentState(nodeId, mapping.getSupportingCircuitPackName(), true);
         this.portMapping.updateMapping(nodeId, mapping);
@@ -117,133 +116,124 @@ public class OpenRoadmInterface221 {
     }
 
     public List<String> createFlexOCH(String nodeId, String logicalConnPoint, SpectrumInformation spectrumInformation)
-        throws OpenRoadmInterfaceException {
+            throws OpenRoadmInterfaceException {
         Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
-
         List<String> interfacesCreated = new ArrayList<>();
         String mcInterfaceCreated = "";
         if (logicalConnPoint.contains("DEG")) {
             mcInterfaceCreated = createMCInterface(nodeId, logicalConnPoint, spectrumInformation);
             interfacesCreated.add(mcInterfaceCreated);
         }
-        String nmcInterfaceCreated = createNMCInterface(nodeId, logicalConnPoint, spectrumInformation,
-                mcInterfaceCreated);
-        interfacesCreated.add(nmcInterfaceCreated);
+        interfacesCreated.add(createNMCInterface(nodeId, logicalConnPoint, spectrumInformation, mcInterfaceCreated));
         return interfacesCreated;
     }
 
     public String createMCInterface(String nodeId, String logicalConnPoint,
-        SpectrumInformation spectrumInformation)
-        throws OpenRoadmInterfaceException {
+            SpectrumInformation spectrumInformation)
+            throws OpenRoadmInterfaceException {
         Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
-        // TODO : Check this method
         LOG.info("MC interface Freq Start {} and Freq End {} and center-Freq {}",
                 spectrumInformation.getMinFrequency(), spectrumInformation.getMaxFrequency(),
                 spectrumInformation.getCenterFrequency());
-        InterfaceBuilder mcInterfaceBldr = createGenericInterfaceBuilder(portMap,
-            MediaChannelTrailTerminationPoint.class,
-            spectrumInformation.getIdentifierFromParams(logicalConnPoint, "mc"))
-                .setSupportingInterface(portMap.getSupportingOms());
-
-        McTtpBuilder mcTtpBuilder = new McTtpBuilder()
-            .setMinFreq(new FrequencyTHz(spectrumInformation.getMinFrequency()))
-            .setMaxFreq(new FrequencyTHz(spectrumInformation.getMaxFrequency()));
-
-        // Create Interface1 type object required for adding as augmentation
-        org.opendaylight.yang.gen.v1.http.org.openroadm.media.channel.interfaces.rev181019.Interface1Builder
-            interface1Builder =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.media.channel.interfaces.rev181019.Interface1Builder()
-                .setMcTtp(mcTtpBuilder.build());
-
-        mcInterfaceBldr.addAugmentation(interface1Builder.build());
-
+        InterfaceBuilder mcInterfaceBldr =
+            createGenericInterfaceBuilder(
+                    portMap,
+                    MediaChannelTrailTerminationPoint.VALUE,
+                    spectrumInformation.getIdentifierFromParams(logicalConnPoint, "mc"))
+                .setSupportingInterface(portMap.getSupportingOms())
+                .addAugmentation(
+                    // Create Interface1 type object required for adding as augmentation
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.media.channel.interfaces.rev181019
+                            .Interface1Builder()
+                        .setMcTtp(
+                            new McTtpBuilder()
+                                .setMinFreq(new FrequencyTHz(Decimal64.valueOf(spectrumInformation.getMinFrequency())))
+                                .setMaxFreq(new FrequencyTHz(Decimal64.valueOf(spectrumInformation.getMaxFrequency())))
+                                .build())
+                        .build());
         // Post interface on the device
         openRoadmInterfaces.postInterface(nodeId, mcInterfaceBldr);
         return mcInterfaceBldr.getName();
     }
 
     public String createNMCInterface(String nodeId, String logicalConnPoint,
-        SpectrumInformation spectrumInformation, String mcName)
-        throws OpenRoadmInterfaceException {
-        LOG.info("This is the central frequency {}", spectrumInformation.getCenterFrequency());
-        LOG.info("This is the nmc width {}", spectrumInformation.getWidth());
-        // TODO : Check this method
+            SpectrumInformation spectrumInformation, String mcName)
+            throws OpenRoadmInterfaceException {
+        LOG.info("The central frequency is {} and the nmc width is {}",
+            spectrumInformation.getCenterFrequency(), spectrumInformation.getWidth());
         Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
-        //TODO : Check this method
-        String nmcName = spectrumInformation.getIdentifierFromParams(logicalConnPoint, "nmc");
-        InterfaceBuilder nmcInterfaceBldr = createGenericInterfaceBuilder(portMap,
-            NetworkMediaChannelConnectionTerminationPoint.class, nmcName);
+        InterfaceBuilder nmcInterfaceBldr =
+            createGenericInterfaceBuilder(
+                portMap, NetworkMediaChannelConnectionTerminationPoint.VALUE,
+                spectrumInformation.getIdentifierFromParams(logicalConnPoint, "nmc"));
         if (logicalConnPoint.contains("DEG")) {
             nmcInterfaceBldr.setSupportingInterface(mcName);
         }
-
-        NmcCtpBuilder nmcCtpIfBuilder = new NmcCtpBuilder()
-                .setFrequency(new FrequencyTHz(spectrumInformation.getCenterFrequency()))
-                .setWidth(new FrequencyGHz(spectrumInformation.getWidth()));
-
         // Create Interface1 type object required for adding as augmentation
-        org.opendaylight.yang.gen.v1.http.org.openroadm.network.media.channel.interfaces.rev181019.Interface1Builder
-            nmcCtpI1fBuilder =
+        nmcInterfaceBldr.addAugmentation(
             new org.opendaylight.yang.gen.v1.http.org.openroadm.network.media.channel.interfaces.rev181019
-                 .Interface1Builder().setNmcCtp(nmcCtpIfBuilder.build());
-        nmcInterfaceBldr.addAugmentation(nmcCtpI1fBuilder.build());
+                     .Interface1Builder()
+                .setNmcCtp(
+                    new NmcCtpBuilder()
+                        .setFrequency(new FrequencyTHz(Decimal64.valueOf(spectrumInformation.getCenterFrequency())))
+                        .setWidth(new FrequencyGHz(Decimal64.valueOf(spectrumInformation.getWidth())))
+                        .build())
+                .build());
         // Post interface on the device
         openRoadmInterfaces.postInterface(nodeId, nmcInterfaceBldr);
         return nmcInterfaceBldr.getName();
     }
 
     public String createOpenRoadmOchInterface(String nodeId, String logicalConnPoint,
-        SpectrumInformation spectrumInformation)
-        throws OpenRoadmInterfaceException {
-        // TODO : Check this method
-        ModulationFormat modulationFormat = ModulationFormat.DpQpsk;
-        Optional<ModulationFormat> optionalModulationFormat = ModulationFormat
-                .forName(spectrumInformation.getModulationFormat());
-        if (optionalModulationFormat.isPresent()) {
-            modulationFormat =  optionalModulationFormat.get();
+            SpectrumInformation spectrumInformation)
+            throws OpenRoadmInterfaceException {
+        ModulationFormat modulationFormat = ModulationFormat.forName(spectrumInformation.getModulationFormat());
+        if (modulationFormat == null) {
+            modulationFormat = ModulationFormat.DpQpsk;
         }
-        // OCH interface specific data
-        OchBuilder ocIfBuilder = new OchBuilder()
-            .setFrequency(new FrequencyTHz(spectrumInformation.getCenterFrequency()))
-            .setRate(R100G.class)
-            .setTransmitPower(new PowerDBm(new BigDecimal("-5")))
-            .setModulationFormat(modulationFormat);
         Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
             throw new OpenRoadmInterfaceException(
-                String.format("Unable to get mapping from PortMapping for node %s and logical connection port %s",
-                    nodeId, logicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
         // Create generic interface
-        InterfaceBuilder ochInterfaceBldr = createGenericInterfaceBuilder(portMap, OpticalChannel.class,
-            spectrumInformation.getIdentifierFromParams(logicalConnPoint));
-        // Create Interface1 type object required for adding as augmentation
-        // TODO look at imports of different versions of class
-        org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev181019.Interface1Builder
-            ochIf1Builder = new org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev181019
-            .Interface1Builder();
-        ochInterfaceBldr.addAugmentation(ochIf1Builder.setOch(ocIfBuilder.build()).build());
-
+        InterfaceBuilder ochInterfaceBldr =
+            createGenericInterfaceBuilder(
+                    portMap,
+                    OpticalChannel.VALUE,
+                    spectrumInformation.getIdentifierFromParams(logicalConnPoint))
+                .addAugmentation(
+                    // Create Interface1 type object required for adding as augmentation
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev181019
+                            .Interface1Builder()
+                        .setOch(
+                            // OCH interface specific data
+                            new OchBuilder()
+                                .setFrequency(
+                                    new FrequencyTHz(Decimal64.valueOf(spectrumInformation.getCenterFrequency())))
+                                .setRate(R100G.VALUE)
+                                .setTransmitPower(new PowerDBm(Decimal64.valueOf("-5")))
+                                .setModulationFormat(modulationFormat)
+                                .build())
+                        .build());
         // Post interface on the device
         openRoadmInterfaces.postInterface(nodeId, ochInterfaceBldr);
-
         // Post the equipment-state change on the device circuit-pack if xpdr node
         if (portMap.getLogicalConnectionPoint().contains(StringConstants.NETWORK_TOKEN)) {
             this.openRoadmInterfaces.postEquipmentState(nodeId, portMap.getSupportingCircuitPackName(), true);
         }
-
         return ochInterfaceBldr.getName();
     }
 
@@ -252,40 +242,47 @@ public class OpenRoadmInterface221 {
         Mapping mapping = portMapping.getMapping(nodeId, logicalConnPoint);
         if (mapping == null) {
             throw new OpenRoadmInterfaceException(
-                    String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
-
-        InterfaceBuilder oduInterfaceBldr = createGenericInterfaceBuilder(mapping, OtnOdu.class,
-            logicalConnPoint + "-ODU4");
+        InterfaceBuilder oduInterfaceBldr =
+            createGenericInterfaceBuilder(mapping, OtnOdu.VALUE, logicalConnPoint + "-ODU4");
         if (mapping.getSupportingOtu4() != null) {
             oduInterfaceBldr.setSupportingInterface(mapping.getSupportingOtu4());
         }
         if (mapping.getSupportingEthernet() != null) {
             oduInterfaceBldr.setSupportingInterface(mapping.getSupportingEthernet());
         }
-        // ODU interface specific data
-        Class<? extends OduFunctionIdentity> oduFunction;
-        MonitoringMode monitoringMode;
-        Opu opu = null;
         if (isCTP) {
-            oduFunction = ODUCTP.class;
-            monitoringMode = MonitoringMode.Monitored;
-        } else {
-            // For TPDR it can be both CTP and TTP
-            if (mapping.getXponderType() == XpdrNodeTypes.Tpdr) {
-                oduFunction = ODUTTPCTP.class;
-                // For switch-ponder we still use TTP
-            } else {
-                oduFunction = ODUTTP.class;
-            }
-            monitoringMode = MonitoringMode.Terminated;
-            opu = new OpuBuilder()
-                .setPayloadType(PayloadTypeDef.getDefaultInstance(payloadType))
-                .setExpPayloadType(PayloadTypeDef.getDefaultInstance(payloadType))
-                .build();
+            // Create Interface1 type object required for adding as augmentation
+            oduInterfaceBldr.addAugmentation(
+                    createOdu4HOInterface1(ODUCTP.VALUE, MonitoringMode.Monitored, null, apiInfoA, apiInfoZ));
+            // Post interface on the device
+            openRoadmInterfaces.postInterface(nodeId, oduInterfaceBldr);
+            return oduInterfaceBldr.getName();
         }
+        // Create Interface1 type object required for adding as augmentation
+        oduInterfaceBldr.addAugmentation(
+                createOdu4HOInterface1(
+                        // For TPDR it can be both CTP and TTP - For switch-ponder we still use TTP
+                        mapping.getXpdrType() == XpdrNodeTypes.Tpdr ? ODUTTPCTP.VALUE : ODUTTP.VALUE,
+                        MonitoringMode.Terminated,
+                        new OpuBuilder()
+                                .setPayloadType(PayloadTypeDef.getDefaultInstance(payloadType))
+                                .setExpPayloadType(PayloadTypeDef.getDefaultInstance(payloadType))
+                                .build(),
+                        apiInfoA, apiInfoZ));
+        // Post interface on the device
+        openRoadmInterfaces.postInterface(nodeId, oduInterfaceBldr);
+        LOG.info("{}-{} updating mapping with interface {}", nodeId, logicalConnPoint, oduInterfaceBldr.getName());
+        this.portMapping.updateMapping(nodeId, mapping);
+        return oduInterfaceBldr.getName();
+    }
+
+    private Interface1 createOdu4HOInterface1(
+            OduFunctionIdentity oduFunction, MonitoringMode monitoringMode, Opu opu,
+            AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ) {
         OduBuilder oduIfBuilder = new OduBuilder()
-                .setRate(ODU4.class)
+                .setRate(ODU4.VALUE)
                 .setOduFunction(oduFunction)
                 .setMonitoringMode(monitoringMode)
                 .setOpu(opu);
@@ -301,93 +298,80 @@ public class OpenRoadmInterface221 {
                 .setExpectedSapi(apiInfoZ.getExpectedSapi())
                 .setExpectedDapi(apiInfoZ.getExpectedDapi());
         }
-        // Create Interface1 type object required for adding as augmentation
-        // TODO look at imports of different versions of class
-        oduInterfaceBldr.addAugmentation(
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.Interface1Builder()
-                .setOdu(oduIfBuilder.build())
-                .build());
-
-        // Post interface on the device
-        openRoadmInterfaces.postInterface(nodeId, oduInterfaceBldr);
-        if (!isCTP) {
-            LOG.info("{}-{} updating mapping with interface {}", nodeId, logicalConnPoint, oduInterfaceBldr.getName());
-            this.portMapping.updateMapping(nodeId, mapping);
-        }
-        return oduInterfaceBldr.getName();
+        return new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.Interface1Builder()
+                    .setOdu(oduIfBuilder.build())
+                    .build();
     }
 
+
+
     public String createOpenRoadmOdu4Interface(String nodeId, String logicalConnPoint, String supportingOtuInterface)
-        throws OpenRoadmInterfaceException {
+            throws OpenRoadmInterfaceException {
         Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE,
-                    nodeId, logicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
-        InterfaceBuilder oduInterfaceBldr = createGenericInterfaceBuilder(portMap, OtnOdu.class,
-            logicalConnPoint + "-ODU");
-        oduInterfaceBldr.setSupportingInterface(supportingOtuInterface);
-
-        // ODU interface specific data
-        // Set Opu attributes
-        OpuBuilder opuBldr = new OpuBuilder()
-                .setPayloadType(PayloadTypeDef.getDefaultInstance("07"))
-                .setExpPayloadType(PayloadTypeDef.getDefaultInstance("07"));
-        OduBuilder oduIfBuilder = new OduBuilder()
-                .setRate(ODU4.class)
-                .setMonitoringMode(OduAttributes.MonitoringMode.Terminated)
-                .setOpu(opuBldr.build());
-
-        // Create Interface1 type object required for adding as augmentation
-        // TODO look at imports of different versions of class
-        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.Interface1Builder oduIf1Builder =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.Interface1Builder();
-        oduInterfaceBldr.addAugmentation(oduIf1Builder.setOdu(oduIfBuilder.build()).build());
-
+        InterfaceBuilder oduInterfaceBldr =
+            createGenericInterfaceBuilder(portMap, OtnOdu.VALUE, logicalConnPoint + "-ODU")
+                .setSupportingInterface(supportingOtuInterface)
+                .addAugmentation(
+                    // Create Interface1 type object required for adding as augmentation
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.Interface1Builder()
+                        .setOdu(
+                            // ODU interface specific data
+                            new OduBuilder()
+                                .setRate(ODU4.VALUE)
+                                .setMonitoringMode(OduAttributes.MonitoringMode.Terminated)
+                                .setOpu(
+                                    new OpuBuilder()
+                                        .setPayloadType(PayloadTypeDef.getDefaultInstance("07"))
+                                        .setExpPayloadType(PayloadTypeDef.getDefaultInstance("07"))
+                                        .build())
+                                .build())
+                        .build());
         // Post interface on the device
         openRoadmInterfaces.postInterface(nodeId, oduInterfaceBldr);
         return oduInterfaceBldr.getName();
     }
 
     public String createOpenRoadmOdu4Interface(String anodeId, String alogicalConnPoint, String supportingOtuInterface,
-        String znodeId, String zlogicalConnPoint)
-        throws OpenRoadmInterfaceException {
+            String znodeId, String zlogicalConnPoint)
+            throws OpenRoadmInterfaceException {
         Mapping portMapA = portMapping.getMapping(anodeId, alogicalConnPoint);
         Mapping portMapZ = portMapping.getMapping(znodeId, zlogicalConnPoint);
         if (portMapA == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, anodeId, alogicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(anodeId, alogicalConnPoint));
         }
         if (portMapZ == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, znodeId, zlogicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(znodeId, zlogicalConnPoint));
         }
-        InterfaceBuilder oduInterfaceBldr = createGenericInterfaceBuilder(portMapA, OtnOdu.class,
-            alogicalConnPoint + "-ODU");
-        oduInterfaceBldr.setSupportingInterface(supportingOtuInterface);
-
-        // ODU interface specific data
-        // Set Opu attributes
-        OpuBuilder opuBldr = new OpuBuilder()
-            .setPayloadType(PayloadTypeDef.getDefaultInstance("07"))
-            .setExpPayloadType(PayloadTypeDef.getDefaultInstance("07"));
-        OduBuilder oduIfBuilder = new OduBuilder()
-            .setRate(ODU4.class)
-            .setMonitoringMode(OduAttributes.MonitoringMode.Terminated)
-            .setOpu(opuBldr.build())
-            .setTxSapi(portMapA.getLcpHashVal())
-            .setTxDapi(portMapZ.getLcpHashVal())
-            // Setting the expected Dapi and Sapi values
-            .setExpectedDapi(portMapA.getLcpHashVal())
-            .setExpectedSapi(portMapZ.getLcpHashVal());
-
-        // Create Interface1 type object required for adding as augmentation
-        // TODO look at imports of different versions of class
-        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.Interface1Builder oduIf1Builder =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.Interface1Builder();
-        oduInterfaceBldr.addAugmentation(oduIf1Builder.setOdu(oduIfBuilder.build()).build());
-
+        InterfaceBuilder oduInterfaceBldr =
+            createGenericInterfaceBuilder(portMapA, OtnOdu.VALUE, alogicalConnPoint + "-ODU")
+                .setSupportingInterface(supportingOtuInterface)
+                .addAugmentation(
+                    // Create Interface1 type object required for adding as augmentation
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.Interface1Builder()
+                        .setOdu(
+                            new OduBuilder()
+                                .setRate(ODU4.VALUE)
+                                .setMonitoringMode(OduAttributes.MonitoringMode.Terminated)
+                                .setOpu(
+                                    // ODU interface specific data
+                                    // Set Opu attributes
+                                    new OpuBuilder()
+                                        .setPayloadType(PayloadTypeDef.getDefaultInstance("07"))
+                                        .setExpPayloadType(PayloadTypeDef.getDefaultInstance("07"))
+                                        .build())
+                                .setTxSapi(portMapA.getLcpHashVal())
+                                .setTxDapi(portMapZ.getLcpHashVal())
+                                // Setting the expected Dapi and Sapi values
+                                .setExpectedDapi(portMapA.getLcpHashVal())
+                                .setExpectedSapi(portMapZ.getLcpHashVal())
+                                .build())
+                        .build());
         // Post interface on the device
         openRoadmInterfaces.postInterface(anodeId, oduInterfaceBldr);
         return oduInterfaceBldr.getName();
@@ -395,20 +379,15 @@ public class OpenRoadmInterface221 {
 
     public String createOpenRoadmOtu4Interface(String nodeId, String logicalConnPoint, String supportOchInterface,
             AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ) throws OpenRoadmInterfaceException {
-
         Mapping mapping = this.portMapping.getMapping(nodeId, logicalConnPoint);
         if (mapping == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
-        InterfaceBuilder otuInterfaceBldr = createGenericInterfaceBuilder(mapping, OtnOtu.class,
-            logicalConnPoint + "-OTU");
-        otuInterfaceBldr.setSupportingInterface(supportOchInterface);
-
         // OTU interface specific data
         OtuBuilder otuIfBuilder = new OtuBuilder()
             .setFec(OtuAttributes.Fec.Scfec)
-            .setRate(OTU4.class);
+            .setRate(OTU4.VALUE);
         if (apiInfoA != null) {
             otuIfBuilder.setTxSapi(apiInfoA.getSapi())
                 .setTxDapi(apiInfoA.getDapi())
@@ -421,13 +400,14 @@ public class OpenRoadmInterface221 {
                 .setExpectedSapi(apiInfoZ.getExpectedSapi())
                 .setExpectedDapi(apiInfoZ.getExpectedDapi());
         }
-
-        // Create Interface1 type object required for adding as augmentation
-        // TODO look at imports of different versions of class
-        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev181019.Interface1Builder otuIf1Builder =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev181019.Interface1Builder();
-        otuInterfaceBldr.addAugmentation(otuIf1Builder.setOtu(otuIfBuilder.build()).build());
-
+        InterfaceBuilder otuInterfaceBldr =
+            createGenericInterfaceBuilder(mapping, OtnOtu.VALUE, logicalConnPoint + "-OTU")
+                .setSupportingInterface(supportOchInterface)
+                .addAugmentation(
+                    // Create Interface1 type object required for adding as augmentation
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev181019.Interface1Builder()
+                        .setOtu(otuIfBuilder.build())
+                        .build());
         // Post interface on the device
         openRoadmInterfaces.postInterface(nodeId, otuInterfaceBldr);
         this.portMapping.updateMapping(nodeId, mapping);
@@ -438,8 +418,7 @@ public class OpenRoadmInterface221 {
         return String.join(GridConstant.NAME_PARAMETERS_SEPARATOR,logicalConnectionPoint, spectralSlotName);
     }
 
-    private InterfaceBuilder createGenericInterfaceBuilder(Mapping portMap, Class<? extends InterfaceType> type,
-        String key) {
+    private InterfaceBuilder createGenericInterfaceBuilder(Mapping portMap, InterfaceType type, String key) {
         return new InterfaceBuilder()
                 .setDescription("  TBD   ")
                 .setCircuitId("   TBD    ")
@@ -452,90 +431,88 @@ public class OpenRoadmInterface221 {
     }
 
     public String createOpenRoadmOmsInterface(String nodeId, Mapping mapping) throws OpenRoadmInterfaceException {
-        if (mapping.getSupportingOms() == null) {
-            // Create generic interface
-            InterfaceBuilder omsInterfaceBldr = createGenericInterfaceBuilder(mapping, OpenROADMOpticalMultiplex.class,
-                "OMS-" + mapping.getLogicalConnectionPoint());
-            if (mapping.getSupportingOts() != null) {
-                omsInterfaceBldr.setSupportingInterface(mapping.getSupportingOts());
-            } else {
-                LOG.error("Unable to get ots interface from mapping {} - {}", nodeId,
-                    mapping.getLogicalConnectionPoint());
-                return null;
-            }
-            this.openRoadmInterfaces.postInterface(nodeId, omsInterfaceBldr);
-            this.portMapping.updateMapping(nodeId, mapping);
-            return omsInterfaceBldr.build().getName();
-        } else {
+        if (mapping.getSupportingOms() != null) {
             return mapping.getSupportingOms();
         }
+        // Create generic interface
+        if (mapping.getSupportingOts() == null) {
+            LOG.error("Unable to get ots interface from mapping {} - {}", nodeId, mapping.getLogicalConnectionPoint());
+            return null;
+        }
+        InterfaceBuilder omsInterfaceBldr =
+            createGenericInterfaceBuilder(
+                    mapping, OpenROADMOpticalMultiplex.VALUE, "OMS-" + mapping.getLogicalConnectionPoint())
+                .setSupportingInterface(mapping.getSupportingOts());
+        this.openRoadmInterfaces.postInterface(nodeId, omsInterfaceBldr);
+        this.portMapping.updateMapping(nodeId, mapping);
+        return omsInterfaceBldr.build().getName();
     }
 
     public String createOpenRoadmOtsInterface(String nodeId, Mapping mapping) throws OpenRoadmInterfaceException {
-        if (mapping.getSupportingOts() == null) {
-            // Create generic interface
-            InterfaceBuilder otsInterfaceBldr = createGenericInterfaceBuilder(mapping, OpticalTransport.class, "OTS-"
-                + mapping.getLogicalConnectionPoint());
-            // OTS interface augmentation specific data
-            OtsBuilder otsIfBuilder = new OtsBuilder();
-            otsIfBuilder.setFiberType(OtsAttributes.FiberType.Smf);
-
-            // Create Interface1 type object required for adding as
-            // augmentation
-            org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev181019.Interface1Builder
-                otsIf1Builder = new org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces
-                .rev181019.Interface1Builder();
-            otsInterfaceBldr.addAugmentation(otsIf1Builder.setOts(otsIfBuilder.build()).build());
-            this.openRoadmInterfaces.postInterface(nodeId, otsInterfaceBldr);
-            this.portMapping.updateMapping(nodeId, mapping);
-            return otsInterfaceBldr.build().getName();
-        } else {
+        if (mapping.getSupportingOts() != null) {
             return mapping.getSupportingOts();
         }
+        // Create generic interface
+        InterfaceBuilder otsInterfaceBldr =
+            createGenericInterfaceBuilder(mapping, OpticalTransport.VALUE, "OTS-" + mapping.getLogicalConnectionPoint())
+                .addAugmentation(
+                    // Create Interface1 type object required for adding as augmentation
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev181019
+                            .Interface1Builder()
+                        // OTS interface augmentation specific data
+                        .setOts(new OtsBuilder().setFiberType(OtsAttributes.FiberType.Smf).build())
+                        .build());
+        this.openRoadmInterfaces.postInterface(nodeId, otsInterfaceBldr);
+        this.portMapping.updateMapping(nodeId, mapping);
+        return otsInterfaceBldr.build().getName();
     }
 
     public boolean isUsedByXc(String nodeId, String interfaceName, String xc,
         DeviceTransactionManager deviceTransactionManager) {
-        InstanceIdentifier<RoadmConnections> xciid = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-            .child(RoadmConnections.class, new RoadmConnectionsKey(xc));
+        InstanceIdentifier<RoadmConnections> xciid = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(RoadmConnections.class, new RoadmConnectionsKey(xc))
+            .build();
         LOG.info("reading xc {} in node {}", xc, nodeId);
         Optional<RoadmConnections> crossconnection = deviceTransactionManager.getDataFromDevice(nodeId,
             LogicalDatastoreType.CONFIGURATION, xciid, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-        if (crossconnection.isPresent()) {
-            RoadmConnections rc = crossconnection.get();
-            LOG.info("xd {} found", xc);
-            String supportedinter = null;
-            if (!interfaceName.contains("nmc")) {
-                supportedinter = interfaceName.replace("mc", "nmc");
-            }
-            if (rc.getSource().getSrcIf().equals(interfaceName)
+        if (crossconnection.isEmpty()) {
+            LOG.info("xd {} not found !", xc);
+            return false;
+        }
+        RoadmConnections rc = crossconnection.orElseThrow();
+        LOG.info("xd {} found", xc);
+        String supportedinter =
+            interfaceName.contains("nmc")
+                ? null
+                : interfaceName.replace("mc", "nmc");
+        if (rc.getSource().getSrcIf().equals(interfaceName)
                 || rc.getDestination().getDstIf().equals(interfaceName)
                 || rc.getSource().getSrcIf().equals(supportedinter)
                 || rc.getDestination().getDstIf().equals(supportedinter)) {
-                return true;
-            }
-        } else {
-            LOG.info("xd {} not found !", xc);
+            return true;
         }
         return false;
     }
 
     public boolean isUsedByOtnXc(String nodeId, String interfaceName, String xc,
-        DeviceTransactionManager deviceTransactionManager) {
-        InstanceIdentifier<OduConnection> xciid = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-            .child(OduConnection.class, new OduConnectionKey(xc));
+            DeviceTransactionManager deviceTransactionManager) {
+        InstanceIdentifier<OduConnection> xciid = InstanceIdentifier
+            .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+            .child(OduConnection.class, new OduConnectionKey(xc))
+            .build();
         LOG.info("reading xc {} in node {}", xc, nodeId);
         Optional<OduConnection> oduConnectionOpt = deviceTransactionManager.getDataFromDevice(nodeId,
             LogicalDatastoreType.CONFIGURATION, xciid, Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-        if (oduConnectionOpt.isPresent()) {
-            OduConnection oduXc = oduConnectionOpt.get();
-            LOG.info("xc {} found", xc);
-            if (oduXc.getSource().getSrcIf().equals(interfaceName)
-                || oduXc.getDestination().getDstIf().equals(interfaceName)) {
-                return true;
-            }
-        } else {
+        if (oduConnectionOpt.isEmpty()) {
             LOG.info("xc {} not found !", xc);
+            return false;
+        }
+        OduConnection oduXc = oduConnectionOpt.orElseThrow();
+        LOG.info("xc {} found", xc);
+        if (oduXc.getSource().getSrcIf().equals(interfaceName)
+                || oduXc.getDestination().getDstIf().equals(interfaceName)) {
+            return true;
         }
         return false;
     }
@@ -545,30 +522,29 @@ public class OpenRoadmInterface221 {
         Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
             throw new OpenRoadmInterfaceException(
-                    String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
-        InterfaceBuilder oduInterfaceBldr = createGenericInterfaceBuilder(portMap, OtnOdu.class,
-                logicalConnPoint + "-ODU4");
-        oduInterfaceBldr.setSupportingInterface(supportingOtuInterface);
-
-        // ODU interface specific data
-        OduBuilder oduIfBuilder = new OduBuilder()
-                .setRate(ODU4.class)
-                .setMonitoringMode(OduAttributes.MonitoringMode.Terminated);
-
-        // Set Opu attributes
-        OpuBuilder opuBldr = new OpuBuilder()
-                .setPayloadType(PayloadTypeDef.getDefaultInstance("21"))
-                .setExpPayloadType(PayloadTypeDef.getDefaultInstance("21"));
-        oduIfBuilder.setOduFunction(ODUTTP.class)
-                .setOpu(opuBldr.build());
-
-        // Create Interface1 type object required for adding as augmentation
-        // TODO look at imports of different versions of class
-        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.Interface1Builder oduIf1Builder =
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.Interface1Builder();
-        oduInterfaceBldr.addAugmentation(oduIf1Builder.setOdu(oduIfBuilder.build()).build());
-
+        InterfaceBuilder oduInterfaceBldr =
+            createGenericInterfaceBuilder(portMap, OtnOdu.VALUE, logicalConnPoint + "-ODU4")
+                .setSupportingInterface(supportingOtuInterface)
+                .addAugmentation(
+                // Create Interface1 type object required for adding as augmentation
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.Interface1Builder()
+                        .setOdu(
+                        // ODU interface specific data
+                            new OduBuilder()
+                                .setRate(ODU4.VALUE)
+                                .setMonitoringMode(OduAttributes.MonitoringMode.Terminated)
+                                .setOduFunction(ODUTTP.VALUE)
+                                .setOpu(
+                                    // Set Opu attributes
+                                    new OpuBuilder()
+                                        .setPayloadType(PayloadTypeDef.getDefaultInstance("21"))
+                                        .setExpPayloadType(PayloadTypeDef.getDefaultInstance("21"))
+                                        .build()
+                                )
+                                .build())
+                        .build());
         // Post interface on the device
         openRoadmInterfaces.postInterface(nodeId, oduInterfaceBldr);
         this.portMapping.updateMapping(nodeId, portMap);
@@ -576,45 +552,43 @@ public class OpenRoadmInterface221 {
     }
 
     public String createOpenRoadmOtnOdu4Interface(String anodeId, String alogicalConnPoint,
-        String asupportingOtuInterface, String znodeId, String zlogicalConnPoint)
-        throws OpenRoadmInterfaceException {
+            String asupportingOtuInterface, String znodeId, String zlogicalConnPoint)
+            throws OpenRoadmInterfaceException {
         Mapping portMapA = portMapping.getMapping(anodeId, alogicalConnPoint);
         if (portMapA == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, anodeId, alogicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(anodeId, alogicalConnPoint));
         }
         Mapping portMapZ = portMapping.getMapping(znodeId, zlogicalConnPoint);
         if (portMapZ == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, znodeId, zlogicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(znodeId, zlogicalConnPoint));
         }
-        InterfaceBuilder oduInterfaceBldr = createGenericInterfaceBuilder(portMapA, OtnOdu.class,
-            alogicalConnPoint + "-ODU4");
-        oduInterfaceBldr.setSupportingInterface(asupportingOtuInterface);
-
-        // ODU interface specific data
-        OduBuilder oduIfBuilder = new OduBuilder()
-            .setRate(ODU4.class)
-            .setMonitoringMode(OduAttributes.MonitoringMode.Terminated)
-            .setTxSapi(portMapA.getLcpHashVal())
-            .setTxDapi(portMapZ.getLcpHashVal())
-            .setExpectedSapi(portMapZ.getLcpHashVal())
-            .setExpectedDapi(portMapA.getLcpHashVal());
-
-
-        // Set Opu attributes
-        OpuBuilder opuBldr = new OpuBuilder()
-            .setPayloadType(PayloadTypeDef.getDefaultInstance("21"))
-            .setExpPayloadType(PayloadTypeDef.getDefaultInstance("21"));
-        oduIfBuilder.setOduFunction(ODUTTP.class)
-            .setOpu(opuBldr.build());
-
-        // Create Interface1 type object required for adding as augmentation
-        // TODO look at imports of different versions of class
-        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.Interface1Builder oduIf1Builder =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019.Interface1Builder();
-        oduInterfaceBldr.addAugmentation(oduIf1Builder.setOdu(oduIfBuilder.build()).build());
-
+        InterfaceBuilder oduInterfaceBldr =
+            createGenericInterfaceBuilder(portMapA, OtnOdu.VALUE, alogicalConnPoint + "-ODU4")
+                .setSupportingInterface(asupportingOtuInterface)
+                .addAugmentation(
+                    // Create Interface1 type object required for adding as augmentation
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev181019
+                            .Interface1Builder()
+                        .setOdu(
+                        // ODU interface specific data
+                            new OduBuilder()
+                                .setRate(ODU4.VALUE)
+                                .setMonitoringMode(OduAttributes.MonitoringMode.Terminated)
+                                .setTxSapi(portMapA.getLcpHashVal())
+                                .setTxDapi(portMapZ.getLcpHashVal())
+                                .setExpectedSapi(portMapZ.getLcpHashVal())
+                                .setExpectedDapi(portMapA.getLcpHashVal())
+                                .setOduFunction(ODUTTP.VALUE)
+                                .setOpu(
+                                    // Set Opu attributes
+                                    new OpuBuilder()
+                                        .setPayloadType(PayloadTypeDef.getDefaultInstance("21"))
+                                        .setExpPayloadType(PayloadTypeDef.getDefaultInstance("21"))
+                                        .build())
+                                .build())
+                        .build());
         // Post interface on the device
         openRoadmInterfaces.postInterface(anodeId, oduInterfaceBldr);
         this.portMapping.updateMapping(anodeId, portMapA);
index 57622990aebe8396cded20d0ceca5dd5991b59ab..029eb4d45723b1023fac683448d96f06533ff61d 100644 (file)
@@ -8,11 +8,12 @@
 
 package org.opendaylight.transportpce.renderer.openroadminterface;
 
-import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashSet;
 import java.util.List;
-import java.util.Optional;
+import java.util.Map;
+import java.util.Set;
 import java.util.stream.IntStream;
 import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.transportpce.common.fixedflex.GridConstant;
@@ -22,11 +23,12 @@ import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfa
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.az.api.info.AEndApiInfo;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.az.api.info.ZEndApiInfo;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.attributes.rev200327.TrailTraceOther.TimDetectMode;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.attributes.rev200327.parent.odu.allocation.ParentOduAllocationBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.attributes.rev200327.parent.odu.allocation.parent.odu.allocation.trib.slots.choice.OpucnBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.link.types.rev191129.PowerDBm;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.Foic14;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.Foic24;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.Foic28;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.Foic36;
@@ -35,14 +37,17 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.ty
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.ModulationFormat;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.ProvisionModeType;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.R100G;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.R100GOtsi;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.R200GOtsi;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.R300GOtsi;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev200529.R400GOtsi;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev200529.Ofec;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev200529.Off;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev200529.Rsfec;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev200529.Scfec;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.interfaces.grp.InterfaceBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.interfaces.grp.InterfaceKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.XpdrNodeTypes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.ethernet.interfaces.rev200529.Interface1Builder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.ethernet.interfaces.rev200529.ethernet.container.EthernetBuilder;
@@ -57,6 +62,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interface
 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.tributary.signal.interfaces.rev200529.otsi.attributes.FlexoBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.tributary.signal.interfaces.rev200529.otsi.container.OtsiBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODU4;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODUCTP;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODUCn;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODUTTP;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODUTTPCTP;
@@ -71,9 +77,10 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.opu.OpuBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev200529.otu.container.OtuBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otsi.group.interfaces.rev200529.otsi.group.container.OtsiGroupBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If100GE;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOCHOTU4ODU4;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOtsiOtsigroup;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.If100GE;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOCHOTU4ODU4;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.IfOtsiOtsigroup;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.Uint16;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.opendaylight.yangtools.yang.common.Uint8;
@@ -81,14 +88,12 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class OpenRoadmInterface710 {
-    private static final String MAPPING_ERROR_EXCEPTION_MESSAGE =
-        "Unable to get mapping from PortMapping for node % and logical connection port %s";
     private static final String MODULATION_FMT_EXCEPTION_MESSAGE =
         "Unable to get the modulation format";
     private static final String RATE_EXCEPTION_MESSAGE =
         "Unable to get the rate";
     private static final String ODUC = "-ODUC";
-    private static final List<String> SUPPORTED_ODUCN_RATES = List.of("2", "3", "4");
+    private static final List<String> SUPPORTED_ODUCN_RATES = List.of("1", "2", "3", "4");
     private final PortMapping portMapping;
     private final OpenRoadmInterfaces openRoadmInterfaces;
     private static final Logger LOG = LoggerFactory.getLogger(OpenRoadmInterface710.class);
@@ -103,175 +108,161 @@ public class OpenRoadmInterface710 {
         Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint));
-        }
-        // Ethernet interface specific data
-        EthernetBuilder ethIfBuilder = new EthernetBuilder()
-            .setFec(Rsfec.class)
-            // Default set to 400G
-            .setSpeed(Uint32.valueOf(400000));
-        // We have to differentiate if-100GE vs if-400GE
-        if (portMap.getSupportedInterfaceCapability().contains(If100GE.class)) {
-            ethIfBuilder.setSpeed(Uint32.valueOf(100000));
-
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
-        InterfaceBuilder ethInterfaceBldr = createGenericInterfaceBuilder(portMap, EthernetCsmacd.class,
-            logicalConnPoint + "-ETHERNET");
-
-        // Create Interface1 type object required for adding as augmentation
-        Interface1Builder ethIf1Builder = new Interface1Builder();
-        ethInterfaceBldr.addAugmentation(ethIf1Builder.setEthernet(ethIfBuilder.build()).build());
-
+        InterfaceBuilder ethInterfaceBldr =
+            createGenericInterfaceBuilder(portMap, EthernetCsmacd.VALUE, logicalConnPoint + "-ETHERNET")
+                .addAugmentation(
+                    // Create Interface1 type object required for adding as augmentation
+                    new Interface1Builder()
+                        .setEthernet(
+                            // Ethernet interface specific data
+                            // We have to differentiate if-100GE vs if-400GE
+                            // Default set to 400G
+                            portMap.getSupportedInterfaceCapability().contains(If100GE.VALUE)
+                                // There could be different client pluggables on either side QSFP28-LR4 or QSFP28-FR4
+                                // LR4-requires FEC to off, while FR4 can accept even when FEC is off
+                                ? new EthernetBuilder().setFec(Off.VALUE).setSpeed(Uint32.valueOf(100000)).build()
+                                : new EthernetBuilder().setFec(Rsfec.VALUE).setSpeed(Uint32.valueOf(400000)).build())
+                        .build());
         // Post interface on the device
         openRoadmInterfaces.postInterface(nodeId, ethInterfaceBldr);
-
         // Post the equipment-state change on the device circuit-pack
         openRoadmInterfaces.postEquipmentState(nodeId, portMap.getSupportingCircuitPackName(), true);
-
         return ethInterfaceBldr.getName();
     }
 
     public String createOpenRoadmOchInterface(String nodeId, String logicalConnPoint,
-        SpectrumInformation spectrumInformation)
-        throws OpenRoadmInterfaceException {
-
-        ModulationFormat   modulationFormat = ModulationFormat.DpQpsk;
-        Optional<ModulationFormat> optionalModulationFormat = ModulationFormat
-            .forName(spectrumInformation.getModulationFormat());
-        if (optionalModulationFormat.isPresent()) {
-            modulationFormat =  optionalModulationFormat.get();
-        }
-        // OCH interface specific data
-        OchBuilder ocIfBuilder = new OchBuilder()
-            .setFrequency(new FrequencyTHz(spectrumInformation.getCenterFrequency()))
-            .setRate(R100G.class)
-            .setTransmitPower(new PowerDBm(new BigDecimal("-5")))
-            .setModulationFormat(modulationFormat);
+            SpectrumInformation spectrumInformation)
+            throws OpenRoadmInterfaceException {
+        ModulationFormat modulationFormat = ModulationFormat.forName(spectrumInformation.getModulationFormat());
+        if (modulationFormat == null) {
+            modulationFormat =  ModulationFormat.DpQpsk;
+        }
         Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
             throw new OpenRoadmInterfaceException(
-                String.format("Unable to get mapping from PortMapping for node %s and logical connection port %s",
-                    nodeId, logicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
         // Create generic interface
-        InterfaceBuilder
-            ochInterfaceBldr = createGenericInterfaceBuilder(portMap, OpticalChannel.class,
-            spectrumInformation.getIdentifierFromParams(logicalConnPoint));
-        // Create Interface1 type object required for adding as augmentation
-        // TODO look at imports of different versions of class
-        org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev200529.Interface1Builder
-            ochIf1Builder = new org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev200529
-            .Interface1Builder();
-        ochInterfaceBldr.addAugmentation(ochIf1Builder.setOch(ocIfBuilder.build()).build());
-
+        InterfaceBuilder ochInterfaceBldr =
+            createGenericInterfaceBuilder(
+                    portMap, OpticalChannel.VALUE,
+                    spectrumInformation.getIdentifierFromParams(logicalConnPoint))
+                .addAugmentation(
+                // Create Interface1 type object required for adding as augmentation
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.optical.channel.interfaces.rev200529
+                            .Interface1Builder()
+                        .setOch(
+                            // OCH interface specific data
+                            new OchBuilder()
+                                .setFrequency(
+                                    new FrequencyTHz(Decimal64.valueOf(spectrumInformation.getCenterFrequency())))
+                                .setRate(R100G.VALUE)
+                                .setTransmitPower(new PowerDBm(Decimal64.valueOf("-5")))
+                                .setModulationFormat(modulationFormat)
+                                .build())
+                        .build());
         // Post interface on the device
         openRoadmInterfaces.postInterface(nodeId, ochInterfaceBldr);
-
         // Post the equipment-state change on the device circuit-pack if xpdr node
         if (portMap.getLogicalConnectionPoint().contains(StringConstants.NETWORK_TOKEN)) {
             this.openRoadmInterfaces.postEquipmentState(nodeId, portMap.getSupportingCircuitPackName(), true);
         }
-
         return ochInterfaceBldr.getName();
     }
 
     public String createOpenRoadmOtsiInterface(String nodeId, String logicalConnPoint,
             SpectrumInformation spectrumInformation)
             throws OpenRoadmInterfaceException {
-
-        ModulationFormat modulationFormat;
-        Optional<ModulationFormat> optionalModulationFormat = ModulationFormat
-            .forName(spectrumInformation.getModulationFormat());
-        if (optionalModulationFormat.isPresent()) {
-            modulationFormat =  optionalModulationFormat.get();
-        } else {
-            throw new OpenRoadmInterfaceException(
-                String.format(MODULATION_FMT_EXCEPTION_MESSAGE));
+        ModulationFormat modulationFormat = ModulationFormat.forName(spectrumInformation.getModulationFormat());
+        if (modulationFormat == null) {
+            throw new OpenRoadmInterfaceException(MODULATION_FMT_EXCEPTION_MESSAGE);
         }
-
         // OTSI interface specific data
-        OtsiBuilder  otsiBuilder = new OtsiBuilder()
-            .setFrequency(new FrequencyTHz(spectrumInformation.getCenterFrequency()))
-            .setTransmitPower(new PowerDBm(new BigDecimal("-5")))
+        OtsiBuilder otsiBuilder = new OtsiBuilder()
+            .setFrequency(new FrequencyTHz(Decimal64.valueOf(spectrumInformation.getCenterFrequency())))
+            .setTransmitPower(new PowerDBm(Decimal64.valueOf("-5")))
             .setProvisionMode(ProvisionModeType.Explicit)
-            .setFec(Ofec.class)
+            .setFec(Ofec.VALUE)
             .setModulationFormat(modulationFormat);
-
-        // Set the Flexo values
-        FlexoBuilder flexoBuilder = new FlexoBuilder();
-        boolean rateNotFound = false;
         // Use the rate to switch rather than modulation format
         int serviceRate = getServiceRate(modulationFormat, spectrumInformation);
         switch (serviceRate) {
+            case 100:
+                LOG.info("Given modulation format and spectral width 50GHz {} and thus rate is 100G",
+                    modulationFormat);
+                // TODO check if FOIC and Gbaud logs could not be rationalized
+                LOG.info("FOIC is 1.4 for 31.6 Gbaud and rate is 100");
+                otsiBuilder
+                    .setOtsiRate(R100GOtsi.VALUE)
+                    .setFlexo(new FlexoBuilder()
+                        .setFoicType(Foic14.VALUE)
+                        .setIid(new ArrayList<>(Arrays.asList(Uint8.valueOf(1))))
+                        .build());
+                break;
             case 200:
                 LOG.info("Given modulation format is {} and thus rate is 200G", modulationFormat);
+                FlexoBuilder flexoBuilder = new FlexoBuilder()
+                    .setIid(new ArrayList<>(List.of(Uint8.valueOf(1), Uint8.valueOf(2))));
                 if (modulationFormat == ModulationFormat.DpQam16) {
                     LOG.info("FOIC is 2.8 for 31.6 Gbaud and rate is 200");
                     // FOIC rate is different
-                    flexoBuilder.setFoicType(Foic28.class)
-                        .setIid(new ArrayList<>(Arrays.asList(Uint8.valueOf(1), Uint8.valueOf(2),
-                            Uint8.valueOf(3), Uint8.valueOf(4))));
+                    flexoBuilder.setFoicType(Foic28.VALUE);
                 } else {
                     // default is dp-qpsk for 200G under 63.1 GBaud
-                    flexoBuilder.setFoicType(Foic24.class)
-                        .setIid(new ArrayList<>(Arrays.asList(Uint8.valueOf(1), Uint8.valueOf(2))));
+                    flexoBuilder.setFoicType(Foic24.VALUE);
                 }
-                otsiBuilder.setOtsiRate(R200GOtsi.class)
+                otsiBuilder
+                    .setOtsiRate(R200GOtsi.VALUE)
                     .setFlexo(flexoBuilder.build());
                 break;
             case 300:
                 LOG.info("Given modulation format is {} and thus rate is 300G", modulationFormat);
-                flexoBuilder.setFoicType(Foic36.class)
-                    .setIid(new ArrayList<>(Arrays.asList(Uint8.valueOf(1), Uint8.valueOf(2),
-                        Uint8.valueOf(3))));
-                otsiBuilder.setOtsiRate(R300GOtsi.class)
-                    .setFlexo(flexoBuilder.build());
+                otsiBuilder.setOtsiRate(R300GOtsi.VALUE)
+                    .setFlexo(new FlexoBuilder()
+                        .setFoicType(Foic36.VALUE)
+                        .setIid(new ArrayList<>(List.of(Uint8.valueOf(1), Uint8.valueOf(2), Uint8.valueOf(3))))
+                        .build());
                 break;
             case 400:
                 // Default baud-rate is 63.1 Gbaud
                 LOG.info("Given modulation format is {} and thus rate is 400G", modulationFormat);
-                flexoBuilder.setFoicType(Foic48.class)
-                    .setIid(new ArrayList<>(Arrays.asList(Uint8.valueOf(1), Uint8.valueOf(2),
-                        Uint8.valueOf(3), Uint8.valueOf(4))));
-                otsiBuilder.setModulationFormat(modulationFormat)
-                    .setOtsiRate(R400GOtsi.class)
-                    .setFlexo(flexoBuilder.build());
+                otsiBuilder
+                    .setModulationFormat(modulationFormat)
+                    .setOtsiRate(R400GOtsi.VALUE)
+                    .setFlexo(new FlexoBuilder()
+                        .setFoicType(Foic48.VALUE)
+                        .setIid(new ArrayList<>(
+                            List.of(Uint8.valueOf(1), Uint8.valueOf(2), Uint8.valueOf(3), Uint8.valueOf(4))))
+                        .build());
                 break;
             default:
                 LOG.error("Rate {} is unsupported", serviceRate);
-                rateNotFound = true;
-                break;
+                throw new OpenRoadmInterfaceException(RATE_EXCEPTION_MESSAGE);
         }
-
-        if (rateNotFound) {
-            throw new OpenRoadmInterfaceException(
-                String.format(RATE_EXCEPTION_MESSAGE));
-        }
-
         Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
         // Create generic interface
-        InterfaceBuilder otsiInterfaceBldr = createGenericInterfaceBuilder(portMap, Otsi.class,
-            spectrumInformation.getIdentifierFromParams(logicalConnPoint));
-        // Create Interface1 type object required for adding as augmentation
-        org.opendaylight.yang.gen.v1.http
-            .org.openroadm.optical.channel.tributary.signal.interfaces.rev200529.Interface1Builder otsiIf1Builder =
-            new org.opendaylight.yang.gen.v1.http
-                .org.openroadm.optical.channel.tributary.signal.interfaces.rev200529.Interface1Builder();
-
-        otsiInterfaceBldr.addAugmentation(otsiIf1Builder.setOtsi(otsiBuilder.build()).build());
-
+        InterfaceBuilder otsiInterfaceBldr =
+            createGenericInterfaceBuilder(
+                    portMap, Otsi.VALUE,
+                    spectrumInformation.getIdentifierFromParams(logicalConnPoint))
+                .addAugmentation(
+                    // Create Interface1 type object required for adding as augmentation
+                    new org.opendaylight.yang.gen.v1.http
+                            .org.openroadm.optical.channel.tributary.signal.interfaces.rev200529.Interface1Builder()
+                        .setOtsi(otsiBuilder.build())
+                        .build());
         // Post interface on the device
         openRoadmInterfaces.postInterface(nodeId, otsiInterfaceBldr);
-
         // Post the equipment-state change on the device circuit-pack if xpdr node
         if (portMap.getLogicalConnectionPoint().contains(StringConstants.NETWORK_TOKEN)) {
             this.openRoadmInterfaces.postEquipmentState(nodeId, portMap.getSupportingCircuitPackName(), true);
         }
-
         return otsiInterfaceBldr.getName();
     }
 
@@ -283,115 +274,88 @@ public class OpenRoadmInterface710 {
         Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE,
-                    nodeId, logicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
         // Check the modulation format
-        ModulationFormat modulationFormat;
-        Optional<ModulationFormat> optionalModulationFormat = ModulationFormat
-            .forName(spectrumInformation.getModulationFormat());
-        if (optionalModulationFormat.isPresent()) {
-            modulationFormat =  optionalModulationFormat.get();
-        } else {
-            throw new OpenRoadmInterfaceException(
-                String.format(MODULATION_FMT_EXCEPTION_MESSAGE));
+        ModulationFormat modulationFormat = ModulationFormat.forName(spectrumInformation.getModulationFormat());
+        if (modulationFormat == null) {
+            throw new OpenRoadmInterfaceException(MODULATION_FMT_EXCEPTION_MESSAGE);
         }
         int serviceRate = getServiceRate(modulationFormat, spectrumInformation);
         // Create an OTSI group object
-        OtsiGroupBuilder otsiGroupBuilder = new OtsiGroupBuilder()
-            .setGroupId(Uint32.valueOf(1));
-        boolean rateNotFound = false;
+        OtsiGroupBuilder otsiGroupBuilder = new OtsiGroupBuilder().setGroupId(Uint32.valueOf(1));
         switch (serviceRate) {
+            case 100:
+                otsiGroupBuilder.setGroupRate(R100GOtsi.VALUE);
+                break;
             case 200:
-                otsiGroupBuilder.setGroupRate(R200GOtsi.class);
+                otsiGroupBuilder.setGroupRate(R200GOtsi.VALUE);
                 break;
             case 300:
-                otsiGroupBuilder.setGroupRate(R300GOtsi.class);
+                otsiGroupBuilder.setGroupRate(R300GOtsi.VALUE);
                 break;
             case 400:
-                otsiGroupBuilder.setGroupRate(R400GOtsi.class);
+                otsiGroupBuilder.setGroupRate(R400GOtsi.VALUE);
                 break;
             default:
                 LOG.error("Rate {} is not supported", serviceRate);
-                rateNotFound = true;
-                break;
-        }
-        if (rateNotFound) {
-            throw new OpenRoadmInterfaceException(
-                String.format(RATE_EXCEPTION_MESSAGE));
+                throw new OpenRoadmInterfaceException(RATE_EXCEPTION_MESSAGE);
         }
-
         // Create generic interface
-        InterfaceBuilder otsiGroupInterfaceBldr = createGenericInterfaceBuilder(portMap, OtsiGroup.class,
-            logicalConnPoint + String.join("-", "", "OTSIGROUP", serviceRate + "G"));
-
-        // Create a list
-        List<String> listSupportingOtsiInterface = new ArrayList<>();
-        listSupportingOtsiInterface.add(supportingOtsiInterface);
-        otsiGroupInterfaceBldr.setSupportingInterfaceList(listSupportingOtsiInterface);
-
-        org.opendaylight.yang.gen.v1.http.org.openroadm.otsi.group.interfaces.rev200529.Interface1Builder
-            otsiGroupIf1Builder =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.otsi.group.interfaces.rev200529.Interface1Builder();
-        otsiGroupInterfaceBldr.addAugmentation(otsiGroupIf1Builder.setOtsiGroup(otsiGroupBuilder.build()).build());
-
+        InterfaceBuilder otsiGroupInterfaceBldr =
+            createGenericInterfaceBuilder(
+                    portMap, OtsiGroup.VALUE,
+                    logicalConnPoint + String.join("-", "", "OTSIGROUP", serviceRate + "G"))
+                .setSupportingInterfaceList(new HashSet<>(Set.of(supportingOtsiInterface)))
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.otsi.group.interfaces.rev200529
+                            .Interface1Builder()
+                        .setOtsiGroup(otsiGroupBuilder.build())
+                        .build());
         // Post interface on the device
         openRoadmInterfaces.postInterface(nodeId, otsiGroupInterfaceBldr);
-
         // Post the equipment-state change on the device circuit-pack if xpdr node
         if (portMap.getLogicalConnectionPoint().contains(StringConstants.NETWORK_TOKEN)) {
             this.openRoadmInterfaces.postEquipmentState(nodeId, portMap.getSupportingCircuitPackName(), true);
         }
-
         return otsiGroupInterfaceBldr.getName();
     }
 
     public String createOpenRoadmOchOtsiOtsigroupInterface(String nodeId, String logicalConnPoint,
-        SpectrumInformation spectrumInformation)
-        throws OpenRoadmInterfaceException {
+            SpectrumInformation spectrumInformation)
+            throws OpenRoadmInterfaceException {
         Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
-        String interfaceOchOtsiOtsigroup = null;
-        if (portMap.getSupportedInterfaceCapability().contains(IfOCHOTU4ODU4.class)) {
+        if (portMap.getSupportedInterfaceCapability().contains(IfOCHOTU4ODU4.VALUE)) {
             // create OCH interface
-            interfaceOchOtsiOtsigroup = createOpenRoadmOchInterface(nodeId, logicalConnPoint, spectrumInformation);
-        } else if (portMap.getSupportedInterfaceCapability().contains(IfOtsiOtsigroup.class)) {
+            return createOpenRoadmOchInterface(nodeId, logicalConnPoint, spectrumInformation);
+        }
+        if (portMap.getSupportedInterfaceCapability().contains(IfOtsiOtsigroup.VALUE)) {
             // Create OTSi and OTSi-group and concat the names of the interface
             String interfaceOtsiName = createOpenRoadmOtsiInterface(nodeId, logicalConnPoint, spectrumInformation);
-            // Concat the two names for this interface
-            interfaceOchOtsiOtsigroup = interfaceOtsiName
-                + "#" + createOpenRoadmOtsiGroupInterface(nodeId, logicalConnPoint, interfaceOtsiName,
-                spectrumInformation);
+            // And Concat the two names for this interface
+            return interfaceOtsiName + "#"
+                + createOpenRoadmOtsiGroupInterface(nodeId, logicalConnPoint, interfaceOtsiName, spectrumInformation);
         }
-
-        return interfaceOchOtsiOtsigroup;
+        return null;
     }
 
     public String createOpenRoadmOtu4Interface(String nodeId, String logicalConnPoint, String supportOchInterface,
-        AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ) throws OpenRoadmInterfaceException {
-
+            AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ) throws OpenRoadmInterfaceException {
         Mapping mapping = this.portMapping.getMapping(nodeId, logicalConnPoint);
         if (mapping == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint));
-        }
-        InterfaceBuilder
-            otuInterfaceBldr = createGenericInterfaceBuilder(mapping, OtnOtu.class,
-            logicalConnPoint + "-OTU4");
-        // Supporting interface list
-        List<String> listSupportingOChInterface = new ArrayList<>();
-        listSupportingOChInterface.add(supportOchInterface);
-        otuInterfaceBldr.setSupportingInterfaceList(listSupportingOChInterface);
-
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
+        }
         // OTU interface specific data
         org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev200529.otu.container.OtuBuilder
-            otuIfBuilder = new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu
-            .interfaces.rev200529.otu.container.OtuBuilder()
-            .setFec(Scfec.class)
-            .setRate(OTU4.class);
+                otuIfBuilder =
+            new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev200529.otu.container.OtuBuilder()
+                .setFec(Scfec.VALUE)
+                .setRate(OTU4.VALUE);
         if (apiInfoA != null) {
             otuIfBuilder.setTxSapi(apiInfoA.getSapi())
                 .setTxDapi(apiInfoA.getDapi())
@@ -404,13 +368,14 @@ public class OpenRoadmInterface710 {
                 .setExpectedSapi(apiInfoZ.getExpectedSapi())
                 .setExpectedDapi(apiInfoZ.getExpectedDapi());
         }
-
-        // Create Interface1 type object required for adding as augmentation
-        // TODO look at imports of different versions of class
-        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev200529.Interface1Builder otuIf1Builder =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev200529.Interface1Builder();
-        otuInterfaceBldr.addAugmentation(otuIf1Builder.setOtu(otuIfBuilder.build()).build());
-
+        InterfaceBuilder otuInterfaceBldr =
+            createGenericInterfaceBuilder(mapping, OtnOtu.VALUE, logicalConnPoint + "-OTU4")
+                .setSupportingInterfaceList(new HashSet<>(Set.of(supportOchInterface)))
+                .addAugmentation(
+                    // Create Interface1 type object required for adding as augmentation
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev200529.Interface1Builder()
+                        .setOtu(otuIfBuilder.build())
+                        .build());
         // Post interface on the device
         openRoadmInterfaces.postInterface(nodeId, otuInterfaceBldr);
         this.portMapping.updateMapping(nodeId, mapping);
@@ -424,17 +389,15 @@ public class OpenRoadmInterface710 {
         Mapping mapping = portMapping.getMapping(nodeId, logicalConnPoint);
         if (mapping == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE,
-                    nodeId, logicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
         // Create an OTUCn object
         OtuBuilder otuBuilder = new OtuBuilder()
-            .setRate(OTUCn.class)
+            .setRate(OTUCn.VALUE)
             .setTimActEnabled(false)
             .setTimDetectMode(TimDetectMode.Disabled)
             .setDegmIntervals(Uint8.valueOf(2))
             .setDegthrPercentage(Uint16.valueOf(100));
-
         if (apiInfoA != null) {
             otuBuilder.setTxSapi(apiInfoA.getSapi())
                 .setTxDapi(apiInfoA.getDapi())
@@ -449,10 +412,12 @@ public class OpenRoadmInterface710 {
         }
         // Set the OTUCn rate for various rates
         String rate = supportingOtsiGroupInterface.substring(supportingOtsiGroupInterface.lastIndexOf('-') + 1);
-
         String otucnrate = null;
-        boolean rateNotFound = false;
         switch (rate) {
+            case "100G":
+                otuBuilder.setOtucnNRate(Uint16.valueOf(1));
+                otucnrate = "1";
+                break;
             case "200G":
                 otuBuilder.setOtucnNRate(Uint16.valueOf(2));
                 otucnrate = "2";
@@ -467,27 +432,15 @@ public class OpenRoadmInterface710 {
                 break;
             default:
                 LOG.error("Rate {} is not supported", rate);
-                rateNotFound = true;
-                break;
+                throw new OpenRoadmInterfaceException(RATE_EXCEPTION_MESSAGE);
         }
-        if (rateNotFound) {
-            throw new OpenRoadmInterfaceException(
-                String.format(RATE_EXCEPTION_MESSAGE));
-        }
-
-        InterfaceBuilder otuInterfaceBuilder = createGenericInterfaceBuilder(mapping, OtnOtu.class,
-            logicalConnPoint + "-OTUC" + otucnrate);
-
-        // Create a list
-        List<String> listSupportingOtsiGroupInterface = new ArrayList<>();
-        listSupportingOtsiGroupInterface.add(supportingOtsiGroupInterface);
-
-        otuInterfaceBuilder.setSupportingInterfaceList(listSupportingOtsiGroupInterface);
-        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev200529.Interface1Builder otuIf1Builder =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev200529.Interface1Builder();
-
-        otuInterfaceBuilder.addAugmentation(otuIf1Builder.setOtu(otuBuilder.build()).build());
-
+        InterfaceBuilder otuInterfaceBuilder =
+            createGenericInterfaceBuilder(mapping, OtnOtu.VALUE, logicalConnPoint + "-OTUC" + otucnrate)
+                .setSupportingInterfaceList(new HashSet<>(Set.of(supportingOtsiGroupInterface)))
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.otu.interfaces.rev200529.Interface1Builder()
+                        .setOtu(otuBuilder.build())
+                        .build());
         // Post interface on the device
         openRoadmInterfaces.postInterface(nodeId, otuInterfaceBuilder);
         // Post the equipment-state change on the device circuit-pack if xpdr node
@@ -499,57 +452,49 @@ public class OpenRoadmInterface710 {
     }
 
     public String createOpenRoadmOtu4OtucnInterface(String nodeId, String logicalConnPoint,
-        String supportingInterface, AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ)
-        throws OpenRoadmInterfaceException {
+            String supportingInterface, AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ)
+            throws OpenRoadmInterfaceException {
         Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
         // Depending on OCH-OTU4-ODU4 interface or OTSi-OTSi-group, supporting interface should
         // reflect that
-        String interfaceOtu4Otucn = null;
-        if (portMap.getSupportedInterfaceCapability().contains(IfOCHOTU4ODU4.class)) {
+        if (portMap.getSupportedInterfaceCapability().contains(IfOCHOTU4ODU4.VALUE)) {
             // create OTU4 interface
-            interfaceOtu4Otucn = createOpenRoadmOtu4Interface(nodeId, logicalConnPoint, supportingInterface,
-                apiInfoA, apiInfoZ);
-        } else if (portMap.getSupportedInterfaceCapability().contains(IfOtsiOtsigroup.class)) {
+            return createOpenRoadmOtu4Interface(nodeId, logicalConnPoint, supportingInterface, apiInfoA, apiInfoZ);
+        }
+        if (portMap.getSupportedInterfaceCapability().contains(IfOtsiOtsigroup.VALUE)) {
             // Create OTUCn
-            interfaceOtu4Otucn = createOpenRoadmOtucnInterface(nodeId, logicalConnPoint, supportingInterface,
-                apiInfoA, apiInfoZ);
+            return createOpenRoadmOtucnInterface(nodeId, logicalConnPoint, supportingInterface, apiInfoA, apiInfoZ);
         }
-
-        return interfaceOtu4Otucn;
+        return null;
     }
 
     public String createOpenRoadmOdu4Interface(String nodeId, String logicalConnPoint,
-        AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ) throws OpenRoadmInterfaceException {
-
+            AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ) throws OpenRoadmInterfaceException {
         Mapping mapping = portMapping.getMapping(nodeId, logicalConnPoint);
         if (mapping == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
-        InterfaceBuilder oduInterfaceBldr = createGenericInterfaceBuilder(mapping, OtnOdu.class,
-            logicalConnPoint + "-ODU4");
-        List<String> listSupportingOtu4Interface = new ArrayList<>();
+        InterfaceBuilder oduInterfaceBldr =
+            createGenericInterfaceBuilder(mapping, OtnOdu.VALUE, logicalConnPoint + "-ODU4");
         if (mapping.getSupportingOtu4() != null) {
-            listSupportingOtu4Interface.add(mapping.getSupportingOtu4());
-            oduInterfaceBldr.setSupportingInterfaceList(listSupportingOtu4Interface);
+            oduInterfaceBldr.setSupportingInterfaceList(new HashSet<>(Set.of(mapping.getSupportingOtu4())));
         }
-
-        // OPU payload
-        OpuBuilder opuBuilder = new OpuBuilder()
-            .setExpPayloadType(PayloadTypeDef.getDefaultInstance("07"))
-            .setPayloadType(PayloadTypeDef.getDefaultInstance("07"));
-
         // Create an ODU4 object
         OduBuilder oduBuilder = new OduBuilder()
-            .setRate(ODU4.class)
-            .setOduFunction(ODUTTP.class)
+            .setRate(ODU4.VALUE)
+            .setOduFunction(ODUTTP.VALUE)
             .setMonitoringMode(MonitoringMode.Terminated)
-            .setOpu(opuBuilder.build());
-
+            .setOpu(
+                // OPU payload
+                new OpuBuilder()
+                    .setExpPayloadType(PayloadTypeDef.getDefaultInstance("07"))
+                    .setPayloadType(PayloadTypeDef.getDefaultInstance("07"))
+                    .build());
         if (apiInfoA != null) {
             oduBuilder.setTxSapi(apiInfoA.getSapi())
                 .setTxDapi(apiInfoA.getDapi())
@@ -562,383 +507,389 @@ public class OpenRoadmInterface710 {
                 .setExpectedSapi(apiInfoZ.getExpectedSapi())
                 .setExpectedDapi(apiInfoZ.getExpectedDapi());
         }
-        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder oduIf1Builder =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder();
-
-        oduInterfaceBldr.addAugmentation(oduIf1Builder.setOdu(oduBuilder.build()).build());
-
+        oduInterfaceBldr
+            .addAugmentation(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder()
+                    .setOdu(oduBuilder.build())
+                .build());
         // Post interface on the device
         openRoadmInterfaces.postInterface(nodeId, oduInterfaceBldr);
         // Since this is not a CTP, we can update the port-mapping
         LOG.info("{}-{} updating mapping with interface {}", nodeId, logicalConnPoint, oduInterfaceBldr.getName());
         this.portMapping.updateMapping(nodeId, mapping);
-
         return oduInterfaceBldr.getName();
     }
 
 
     public String createOpenRoadmOducnInterface(String nodeId, String logicalConnPoint)
             throws OpenRoadmInterfaceException {
-        Mapping mapping = portMapping.getMapping(nodeId, logicalConnPoint);
-        if (mapping == null) {
+        Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
+        if (portMap == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE,
-                    nodeId, logicalConnPoint));
-        }
-        // Create ODUcn object
-        // Start with OPU object
-        // OPU payload
-        OpuBuilder opuBuilder = new OpuBuilder()
-            .setExpPayloadType(PayloadTypeDef.getDefaultInstance("22"))
-            .setPayloadType(PayloadTypeDef.getDefaultInstance("22"));
-
-        // Create an ODUCn object
-        OduBuilder oduBuilder = new OduBuilder()
-            .setRate(ODUCn.class)
-            .setOduFunction(ODUTTP.class)
-            .setMonitoringMode(MonitoringMode.Terminated)
-            .setTimActEnabled(false)
-            .setTimDetectMode(TimDetectMode.Disabled)
-            .setDegmIntervals(Uint8.valueOf(2))
-            .setDegthrPercentage(Uint16.valueOf(100))
-            .setOducnNRate(Uint16.valueOf(4))
-            .setOpu(opuBuilder.build());
-
-        // Create a list
-        String supportingOtucn;
-        List<String> listSupportingOtucnInterface = new ArrayList<>();
-        if (mapping.getSupportingOtucn() != null) {
-            listSupportingOtucnInterface.add(mapping.getSupportingOtucn());
-            supportingOtucn = mapping.getSupportingOtucn();
-        } else {
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
+        }
+        // Used to find if the port is regen-type
+        if (portMap.getXpdrType() == null) {
             throw new OpenRoadmInterfaceException(
-                String.format("Missing supporting OTUCn interface on port-mapping"));
+                    OpenRoadmInterfaceException.mapping_xpdrtype_err(nodeId, logicalConnPoint));
         }
-
+        if (portMap.getSupportingOtucn() == null) {
+            throw new OpenRoadmInterfaceException("Missing supporting OTUCn interface on port-mapping");
+        }
+        String supportingOtucn = portMap.getSupportingOtucn();
         // Set the ODUCn rate from OTUCn interface naming convention
         String oducnrate = supportingOtucn.substring(supportingOtucn.length() - 1);
         // check if the oducnrate is a valid value and if it is invalid, then throw error
         if (!SUPPORTED_ODUCN_RATES.contains(oducnrate)) {
-            throw new OpenRoadmInterfaceException(
-                String.format(RATE_EXCEPTION_MESSAGE));
+            throw new OpenRoadmInterfaceException(RATE_EXCEPTION_MESSAGE);
         }
+        // set the common parameters
+        OduBuilder oduBuilder = new OduBuilder()
+                                    .setRate(ODUCn.VALUE)
+                                    .setOducnNRate(Uint16.valueOf(oducnrate));
 
-        oduBuilder.setOducnNRate(Uint16.valueOf(oducnrate));
-
-        InterfaceBuilder oduInterfaceBuilder = createGenericInterfaceBuilder(mapping, OtnOdu.class,
-            logicalConnPoint + "-ODUC" + oducnrate);
-
-        oduInterfaceBuilder.setSupportingInterfaceList(listSupportingOtucnInterface);
-        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder oduIf1Builder =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder();
-
-        oduInterfaceBuilder.addAugmentation(oduIf1Builder.setOdu(oduBuilder.build()).build());
+        if (portMap.getXpdrType() == XpdrNodeTypes.Regen) {
+            LOG.info("Regen mode only supports not-terminated or monitored");
+            oduBuilder.setMonitoringMode(MonitoringMode.NotTerminated)
+                    .setOduFunction(ODUCTP.VALUE);
+        } else {
+            // if it is other than regen mode
+            oduBuilder.setMonitoringMode(MonitoringMode.Terminated)
+                    .setTimActEnabled(false)
+                    .setOduFunction(ODUTTP.VALUE)
+                    .setTimDetectMode(TimDetectMode.Disabled)
+                    .setDegmIntervals(Uint8.valueOf(2))
+                    .setDegthrPercentage(Uint16.valueOf(100))
+                    .setOducnNRate(Uint16.valueOf(oducnrate))
+                    .setOpu(
+                            // OPU payload
+                            new OpuBuilder()
+                                    .setExpPayloadType(PayloadTypeDef.getDefaultInstance("22"))
+                                    .setPayloadType(PayloadTypeDef.getDefaultInstance("22"))
+                                    .build());
+        }
 
+        InterfaceBuilder oduInterfaceBuilder =
+            createGenericInterfaceBuilder(portMap, OtnOdu.VALUE, logicalConnPoint + "-ODUC" + oducnrate)
+                .setSupportingInterfaceList(new HashSet<>(Set.of(supportingOtucn)))
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder()
+                        .setOdu(oduBuilder.build())
+                            .build());
         // Post interface on the device
         openRoadmInterfaces.postInterface(nodeId, oduInterfaceBuilder);
-
         // Post the equipment-state change on the device circuit-pack if xpdr node
-        if (mapping.getLogicalConnectionPoint().contains(StringConstants.NETWORK_TOKEN)) {
-            this.openRoadmInterfaces.postEquipmentState(nodeId, mapping.getSupportingCircuitPackName(), true);
+        if (portMap.getLogicalConnectionPoint().contains(StringConstants.NETWORK_TOKEN)) {
+            this.openRoadmInterfaces.postEquipmentState(nodeId, portMap.getSupportingCircuitPackName(), true);
         }
-
         return oduInterfaceBuilder.getName();
     }
 
     // Overloaded methods should be together
     // With SAPI and DAPI information
     public String createOpenRoadmOducnInterface(String anodeId, String alogicalConnPoint,
-        String supportingOtucn, String znodeId, String zlogicalConnPoint)
-        throws OpenRoadmInterfaceException {
+            String supportingOtucn, String znodeId, String zlogicalConnPoint)
+            throws OpenRoadmInterfaceException {
+        // Set the ODUCn rate from OTUCn interface naming convention
+        String oducnrate = supportingOtucn.substring(supportingOtucn.length() - 1);
+        // check if the oducnrate is a valid value and if it is invalid, then throw error
+        if (!SUPPORTED_ODUCN_RATES.contains(oducnrate)) {
+            throw new OpenRoadmInterfaceException(RATE_EXCEPTION_MESSAGE);
+        }
         Mapping portMapA = portMapping.getMapping(anodeId, alogicalConnPoint);
-        Mapping portMapZ = portMapping.getMapping(znodeId, zlogicalConnPoint);
         if (portMapA == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE,
-                    anodeId, alogicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(anodeId, alogicalConnPoint));
+        }
+        if (portMapA.getXpdrType() == null) {
+            throw new OpenRoadmInterfaceException(
+                    OpenRoadmInterfaceException.mapping_xpdrtype_err(anodeId, alogicalConnPoint));
         }
         // On the Zside
+        Mapping portMapZ = portMapping.getMapping(znodeId, zlogicalConnPoint);
         if (portMapZ == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE,
-                    znodeId, zlogicalConnPoint));
-
+                OpenRoadmInterfaceException.mapping_msg_err(znodeId, zlogicalConnPoint));
         }
-        // Create ODUcn object
-        // Start with OPU object
-        // OPU payload
-        OpuBuilder opuBuilder = new OpuBuilder()
-            .setExpPayloadType(PayloadTypeDef.getDefaultInstance("22"))
-            .setPayloadType(PayloadTypeDef.getDefaultInstance("22"));
-
-        // Create an ODUC4 object
+        // set the common parameters
         OduBuilder oduBuilder = new OduBuilder()
-            .setRate(ODUCn.class)
-            .setOduFunction(ODUTTP.class)
-            .setMonitoringMode(MonitoringMode.Terminated)
-            .setTimActEnabled(false)
-            .setTimDetectMode(TimDetectMode.Disabled)
-            .setDegmIntervals(Uint8.valueOf(2))
-            .setDegthrPercentage(Uint16.valueOf(100))
-            .setOpu(opuBuilder.build())
-            .setTxSapi(portMapA.getLcpHashVal())
-            .setTxDapi(portMapZ.getLcpHashVal())
-            .setExpectedSapi(portMapZ.getLcpHashVal())
-            .setExpectedDapi(portMapZ.getLcpHashVal());
-
-        // Set the ODUCn rate from OTUCn interface naming convention
-        String oducnrate = supportingOtucn.substring(supportingOtucn.length() - 1);
-
-        // check if the oducnrate is a valid value and if it is invalid, then throw error
-        if (!SUPPORTED_ODUCN_RATES.contains(oducnrate)) {
-            throw new OpenRoadmInterfaceException(
-                String.format(RATE_EXCEPTION_MESSAGE));
+                .setRate(ODUCn.VALUE)
+                .setOducnNRate(Uint16.valueOf(oducnrate));
+
+        if (portMapA.getXpdrType() == XpdrNodeTypes.Regen) {
+            LOG.info("Regen mode only supports not-terminated or monitored");
+            oduBuilder.setMonitoringMode(MonitoringMode.NotTerminated)
+                    // For regen-mode ODU-function is set to CTP
+                    .setOduFunction(ODUCTP.VALUE);
+        } else {
+            // if it is other than regen mode
+            oduBuilder.setMonitoringMode(MonitoringMode.Terminated)
+                    .setTimActEnabled(false)
+                    .setOduFunction(ODUTTP.VALUE)
+                    .setTimDetectMode(TimDetectMode.Disabled)
+                    .setDegmIntervals(Uint8.valueOf(2))
+                    .setDegthrPercentage(Uint16.valueOf(100))
+                    .setOducnNRate(Uint16.valueOf(oducnrate))
+                    .setOpu(
+                            // OPU payload
+                            new OpuBuilder()
+                                    .setExpPayloadType(PayloadTypeDef.getDefaultInstance("22"))
+                                    .setPayloadType(PayloadTypeDef.getDefaultInstance("22"))
+                                    .build())
+                    .setTxSapi(portMapA.getLcpHashVal())
+                    .setTxDapi(portMapZ.getLcpHashVal())
+                    .setExpectedSapi(portMapZ.getLcpHashVal())
+                    .setExpectedDapi(portMapZ.getLcpHashVal());
         }
 
-        oduBuilder.setOducnNRate(Uint16.valueOf(oducnrate));
-
-        InterfaceBuilder oduInterfaceBuilder = createGenericInterfaceBuilder(portMapA, OtnOdu.class,
-            alogicalConnPoint + ODUC + oducnrate);
-
-        // Create a list
-        List<String> listSupportingOtucnInterface = new ArrayList<>();
-        listSupportingOtucnInterface.add(supportingOtucn);
-
-        oduInterfaceBuilder.setSupportingInterfaceList(listSupportingOtucnInterface);
-        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder oduIf1Builder =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder();
-
-        oduInterfaceBuilder.addAugmentation(oduIf1Builder.setOdu(oduBuilder.build()).build());
-
+        InterfaceBuilder oduInterfaceBuilder =
+            createGenericInterfaceBuilder(portMapA, OtnOdu.VALUE, alogicalConnPoint + ODUC + oducnrate)
+                .setSupportingInterfaceList(new HashSet<>(Set.of(supportingOtucn)))
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder()
+                        .setOdu(oduBuilder.build())
+                        .build());
         // Post interface on the device
         openRoadmInterfaces.postInterface(anodeId, oduInterfaceBuilder);
-
         // Post the equipment-state change on the device circuit-pack if xpdr node
         if (portMapA.getLogicalConnectionPoint().contains(StringConstants.NETWORK_TOKEN)) {
             this.openRoadmInterfaces.postEquipmentState(anodeId, portMapA.getSupportingCircuitPackName(), true);
         }
-
         return oduInterfaceBuilder.getName();
     }
 
 
     // This is only for transponder
     public String createOpenRoadmOduflexInterface(String nodeId, String logicalConnPoint,
-        String supportingOducn)
-        throws OpenRoadmInterfaceException {
+            String supportingOducn)
+            throws OpenRoadmInterfaceException {
         Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE,
-                    nodeId, logicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
-        // OPU payload
-        OpuBuilder opuBuilder = new OpuBuilder()
-            .setExpPayloadType(PayloadTypeDef.getDefaultInstance("32"))
-            .setPayloadType(PayloadTypeDef.getDefaultInstance("32"));
-
         // Parent Odu-allocation
         // Set the trib-slot array
-        List<OpucnTribSlotDef> tribslots = new ArrayList<>();
-        IntStream.range(1, 5).forEach(a -> IntStream.range(1, 21).forEach(b -> tribslots.add(
-            OpucnTribSlotDef.getDefaultInstance(a + "." + b))));
-
-        ParentOduAllocationBuilder parentOduAllocationBuilder = new ParentOduAllocationBuilder()
-            .setTribPortNumber(Uint16.valueOf(1))
-            .setTribSlotsChoice(new OpucnBuilder().setOpucnTribSlots(tribslots).build());
-
+        Set<OpucnTribSlotDef> tribslots = new HashSet<>();
+        // Here the int stream is based on rate
+        // Get the rate, which can be 1, 2, 3 or 4 4=400G, 1=100G
+        String rate = supportingOducn.substring(supportingOducn.length() - 1);
+        IntStream.range(1, Integer.parseInt(rate) + 1)
+            .forEach(a -> IntStream.range(1, 21)
+                .forEach(b -> tribslots.add(OpucnTribSlotDef.getDefaultInstance(a + "." + b))));
         // Create an ODUFlex object
         OduBuilder oduBuilder = new OduBuilder()
-            .setRate(ODUflexCbr.class)
-            .setOduflexCbrService(ODUflexCbr400G.class)
-            .setOduFunction(ODUTTPCTP.class)
+            .setOduFunction(ODUTTPCTP.VALUE)
             .setMonitoringMode(MonitoringMode.Terminated)
             .setTimActEnabled(false)
             .setTimDetectMode(TimDetectMode.Disabled)
             .setDegmIntervals(Uint8.valueOf(2))
             .setDegthrPercentage(Uint16.valueOf(100))
-            .setOpu(opuBuilder.build())
-            .setParentOduAllocation(parentOduAllocationBuilder.build());
-
-        InterfaceBuilder oduflexInterfaceBuilder = createGenericInterfaceBuilder(portMap, OtnOdu.class,
-            logicalConnPoint + "-ODUFLEX");
-
-        List<String> listSupportingOtucnInterface = new ArrayList<>();
-        listSupportingOtucnInterface.add(supportingOducn);
-
-        oduflexInterfaceBuilder.setSupportingInterfaceList(listSupportingOtucnInterface);
-
-
-        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder
-            oduflexIf1Builder =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder();
-
-        oduflexInterfaceBuilder.addAugmentation(oduflexIf1Builder.setOdu(oduBuilder.build()).build());
-
+            .setParentOduAllocation(
+                new ParentOduAllocationBuilder()
+                    .setTribPortNumber(Uint16.valueOf(1))
+                    .setTribSlotsChoice(new OpucnBuilder().setOpucnTribSlots(tribslots).build())
+                    .build());
+        // Build the OPU container to the ODU builder
+        switch (rate) {
+            case "1":
+                oduBuilder
+                    .setRate(ODU4.VALUE)
+                    .setOpu(
+                        new OpuBuilder()
+                            .setExpPayloadType(PayloadTypeDef.getDefaultInstance("07"))
+                            .setPayloadType(PayloadTypeDef.getDefaultInstance("07"))
+                            .build());
+                logicalConnPoint += "-ODU4";
+                break;
+            case "4":
+                oduBuilder
+                    .setRate(ODUflexCbr.VALUE)
+                    .setOduflexCbrService(ODUflexCbr400G.VALUE)
+                    .setOpu(
+                        new OpuBuilder()
+                            .setExpPayloadType(PayloadTypeDef.getDefaultInstance("32"))
+                            .setPayloadType(PayloadTypeDef.getDefaultInstance("32"))
+                            .build());
+                logicalConnPoint += "-ODUFLEX";
+                break;
+            default:
+                oduBuilder.setOpu(new OpuBuilder().build());
+                break;
+        }
+        InterfaceBuilder oduflexInterfaceBuilder =
+            createGenericInterfaceBuilder(portMap, OtnOdu.VALUE, logicalConnPoint)
+                .setSupportingInterfaceList(new HashSet<>(Set.of(supportingOducn)))
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder()
+                        .setOdu(oduBuilder.build())
+                        .build());
         // Post interface on the device
         openRoadmInterfaces.postInterface(nodeId, oduflexInterfaceBuilder);
-
         // Post the equipment-state change on the device circuit-pack if xpdr node
         if (portMap.getLogicalConnectionPoint().contains(StringConstants.NETWORK_TOKEN)) {
             this.openRoadmInterfaces.postEquipmentState(nodeId, portMap.getSupportingCircuitPackName(), true);
         }
-
         return oduflexInterfaceBuilder.getName();
     }
 
     // Overloaded methods should be together
     // This is only for transponder; with SAPI/DAPI information
     public String createOpenRoadmOduflexInterface(String anodeId, String alogicalConnPoint,
-        String supportingOducn, String znodeId, String zlogicalConnPoint)
-        throws OpenRoadmInterfaceException {
+            String supportingOducn, String znodeId, String zlogicalConnPoint)
+            throws OpenRoadmInterfaceException {
         Mapping portMapA = portMapping.getMapping(anodeId, alogicalConnPoint);
-        Mapping portMapZ = portMapping.getMapping(znodeId, zlogicalConnPoint);
         if (portMapA == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE,
-                    anodeId, alogicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(anodeId, alogicalConnPoint));
         }
         // On the Zside
+        Mapping portMapZ = portMapping.getMapping(znodeId, zlogicalConnPoint);
         if (portMapZ == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE,
-                    znodeId, zlogicalConnPoint));
-
+                OpenRoadmInterfaceException.mapping_msg_err(znodeId, zlogicalConnPoint));
         }
-        // OPU payload
-        OpuBuilder opuBuilder = new OpuBuilder()
-            .setExpPayloadType(PayloadTypeDef.getDefaultInstance("32"))
-            .setPayloadType(PayloadTypeDef.getDefaultInstance("32"));
-
         // Parent Odu-allocation
         // Set the trib-slot array
-        List<OpucnTribSlotDef> tribslots = new ArrayList<>();
-        IntStream.range(1, 5).forEach(a -> IntStream.range(1, 21).forEach(b -> tribslots.add(
-            OpucnTribSlotDef.getDefaultInstance(a + "." + b))));
-
-        ParentOduAllocationBuilder parentOduAllocationBuilder = new ParentOduAllocationBuilder()
-            .setTribPortNumber(Uint16.valueOf(1))
-            .setTribSlotsChoice(new OpucnBuilder().setOpucnTribSlots(tribslots).build());
-
+        Set<OpucnTribSlotDef> tribslots = new HashSet<>();
+        // Here the int stream is based on rate
+        // Get the rate, which can be 1, 2, 3 or 4 4=400G, 1=100G
+        String rate = supportingOducn.substring(supportingOducn.lastIndexOf('-') + 1);
+        IntStream.range(1, Integer.parseInt(rate) + 1)
+            .forEach(a -> IntStream.range(1, 21)
+                .forEach(b -> tribslots.add(OpucnTribSlotDef.getDefaultInstance(a + "." + b))));
         // Create an ODUFlex object
         OduBuilder oduBuilder = new OduBuilder()
-            .setRate(ODUflexCbr.class)
-            .setOduflexCbrService(ODUflexCbr400G.class)
-            .setOduFunction(ODUTTPCTP.class)
+            .setOduFunction(ODUTTPCTP.VALUE)
             .setMonitoringMode(MonitoringMode.Terminated)
             .setTimActEnabled(false)
             .setTimDetectMode(TimDetectMode.Disabled)
             .setDegmIntervals(Uint8.valueOf(2))
             .setDegthrPercentage(Uint16.valueOf(100))
-            .setTxSapi(portMapA.getLcpHashVal())
-            .setTxDapi(portMapZ.getLcpHashVal())
-            .setExpectedSapi(portMapZ.getLcpHashVal())
-            .setExpectedDapi(portMapA.getLcpHashVal())
-            .setOpu(opuBuilder.build())
-            .setParentOduAllocation(parentOduAllocationBuilder.build());
-
-        InterfaceBuilder oduflexInterfaceBuilder = createGenericInterfaceBuilder(portMapA, OtnOdu.class,
-            alogicalConnPoint + "-ODUFLEX");
-
-        List<String> listSupportingOtucnInterface = new ArrayList<>();
-        listSupportingOtucnInterface.add(supportingOducn);
-
-        oduflexInterfaceBuilder.setSupportingInterfaceList(listSupportingOtucnInterface);
-
-
-        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder
-            oduflexIf1Builder =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder();
-
-        oduflexInterfaceBuilder.addAugmentation(oduflexIf1Builder.setOdu(oduBuilder.build()).build());
-
-        // Post interface on the device
-        openRoadmInterfaces.postInterface(anodeId, oduflexInterfaceBuilder);
-
+            // TODO the following line seemed to come a bit early
+            // so it is now commented out and the code was aligned with previous method
+            //.setOpu(opuBuilder.build())
+            .setParentOduAllocation(
+                new ParentOduAllocationBuilder()
+                    .setTribPortNumber(Uint16.valueOf(1))
+                    .setTribSlotsChoice(new OpucnBuilder().setOpucnTribSlots(tribslots).build())
+                    .build());
+        switch (rate) {
+            case "1":
+                oduBuilder
+                    .setRate(ODU4.VALUE)
+                    .setOpu(
+                        new OpuBuilder()
+                            .setExpPayloadType(PayloadTypeDef.getDefaultInstance("07"))
+                            .setPayloadType(PayloadTypeDef.getDefaultInstance("07"))
+                            .build());
+                alogicalConnPoint += "-ODU4";
+                break;
+            case "4":
+                oduBuilder
+                    .setRate(ODUflexCbr.VALUE)
+                    .setOduflexCbrService(ODUflexCbr400G.VALUE)
+                    .setOpu(
+                        new OpuBuilder()
+                            .setExpPayloadType(PayloadTypeDef.getDefaultInstance("32"))
+                            .setPayloadType(PayloadTypeDef.getDefaultInstance("32"))
+                            .build());
+                alogicalConnPoint += "-ODUFLEX";
+                break;
+            default:
+                oduBuilder.setOpu(new OpuBuilder().build());
+                break;
+        }
+        InterfaceBuilder oduflexInterfaceBuilder =
+            createGenericInterfaceBuilder(portMapA, OtnOdu.VALUE, alogicalConnPoint)
+                .setSupportingInterfaceList(new HashSet<>(Set.of(supportingOducn)))
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder()
+                        .setOdu(oduBuilder.build())
+                        .build());
         // Post the equipment-state change on the device circuit-pack if xpdr node
         if (portMapA.getLogicalConnectionPoint().contains(StringConstants.NETWORK_TOKEN)) {
             this.openRoadmInterfaces.postEquipmentState(anodeId, portMapA.getSupportingCircuitPackName(), true);
         }
-
         return oduflexInterfaceBuilder.getName();
     }
 
     public String createOpenRoadmOdu4OducnOduflex(String nodeId, String logicalConnPoint,
-        AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ) throws OpenRoadmInterfaceException {
-
+            AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ) throws OpenRoadmInterfaceException {
         Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
         }
         // Depending on OTU4 or OTUCn, supporting interface should
         // reflect that
         String interfaceOdu4OducnOduflex = null;
-        if (portMap.getSupportedInterfaceCapability().contains(IfOCHOTU4ODU4.class)) {
+        // Depending on OTU4 or OTUCn, supporting interface should reflect that
+        if (portMap.getSupportedInterfaceCapability().contains(IfOCHOTU4ODU4.VALUE)) {
             // create OTU4 interface
-            interfaceOdu4OducnOduflex = createOpenRoadmOdu4Interface(nodeId, logicalConnPoint, apiInfoA, apiInfoZ);
-        } else if (portMap.getSupportedInterfaceCapability().contains(IfOtsiOtsigroup.class)) {
+            return createOpenRoadmOdu4Interface(nodeId, logicalConnPoint, apiInfoA, apiInfoZ);
+        }
+        if (portMap.getSupportedInterfaceCapability().contains(IfOtsiOtsigroup.VALUE)) {
             // Create ODUCn and ODUFlex interface.
             String interfaceOducn = createOpenRoadmOducnInterface(nodeId, logicalConnPoint);
-            // Here we concat the two interfaces
-            interfaceOdu4OducnOduflex = interfaceOducn + "#"
+            return interfaceOducn + "#"
                 + createOpenRoadmOduflexInterface(nodeId, logicalConnPoint, interfaceOducn);
         }
-
-        return interfaceOdu4OducnOduflex;
+        return null;
     }
 
     public String createOpenRoadmOtnOducnInterface(String nodeId, String logicalConnPoint,
-        String supportingOtucn)
-        throws OpenRoadmInterfaceException {
+            String supportingOtucn)
+            throws OpenRoadmInterfaceException {
         Mapping portMap = portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE,
-                    nodeId, logicalConnPoint));
-        }
-        // Create ODUcn object
-        // Start with OPU object
-        // OPU payload
-        OpuBuilder opuBuilder = new OpuBuilder()
-            .setExpPayloadType(PayloadTypeDef.getDefaultInstance("22"))
-            .setPayloadType(PayloadTypeDef.getDefaultInstance("22"));
-
-        // Create an ODUC4 object
-        OduBuilder oduBuilder = new OduBuilder()
-            .setRate(ODUCn.class)
-            .setOduFunction(ODUTTP.class)
-            .setMonitoringMode(MonitoringMode.Terminated)
-            .setTimActEnabled(false)
-            .setTimDetectMode(TimDetectMode.Disabled)
-            .setDegmIntervals(Uint8.valueOf(2))
-            .setDegthrPercentage(Uint16.valueOf(100))
-            .setOpu(opuBuilder.build());
-
+                OpenRoadmInterfaceException.mapping_msg_err(nodeId, logicalConnPoint));
+        }
+        // Used to find if the port is regen-type
+        if (portMap.getXpdrType() == null) {
+            throw new OpenRoadmInterfaceException(
+                    OpenRoadmInterfaceException.mapping_xpdrtype_err(nodeId, logicalConnPoint));
+        }
         // Set the ODUCn rate from OTUCn interface naming convention
         String oducnrate = supportingOtucn.substring(supportingOtucn.length() - 1);
-
         // check if the oducnrate is a valid value and if it is invalid, then throw error
         if (!SUPPORTED_ODUCN_RATES.contains(oducnrate)) {
-            throw new OpenRoadmInterfaceException(
-                String.format(RATE_EXCEPTION_MESSAGE));
+            throw new OpenRoadmInterfaceException(RATE_EXCEPTION_MESSAGE);
         }
+        // set the common parameters
+        OduBuilder oduBuilder = new OduBuilder()
+                .setRate(ODUCn.VALUE)
+                .setOducnNRate(Uint16.valueOf(oducnrate));
 
-        oduBuilder.setOducnNRate(Uint16.valueOf(oducnrate));
-
-        InterfaceBuilder oduInterfaceBuilder = createGenericInterfaceBuilder(portMap, OtnOdu.class,
-            logicalConnPoint + ODUC + oducnrate);
-
-        // Create a list
-        List<String> listSupportingOtucnInterface = new ArrayList<>();
-        listSupportingOtucnInterface.add(supportingOtucn);
-
-        oduInterfaceBuilder.setSupportingInterfaceList(listSupportingOtucnInterface);
-        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder oduIf1Builder =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder();
-
-        oduInterfaceBuilder.addAugmentation(oduIf1Builder.setOdu(oduBuilder.build()).build());
+        if (portMap.getXpdrType() == XpdrNodeTypes.Regen) {
+            LOG.info("Regen mode only supports not-terminated or monitored");
+            oduBuilder.setMonitoringMode(MonitoringMode.NotTerminated)
+                    .setOduFunction(ODUCTP.VALUE);
+        } else {
+            // if it is other than regen mode
+            oduBuilder.setMonitoringMode(MonitoringMode.Terminated)
+                    .setTimActEnabled(false)
+                    .setOduFunction(ODUTTP.VALUE)
+                    .setTimDetectMode(TimDetectMode.Disabled)
+                    .setDegmIntervals(Uint8.valueOf(2))
+                    .setDegthrPercentage(Uint16.valueOf(100))
+                    .setOducnNRate(Uint16.valueOf(oducnrate))
+                    .setOpu(
+                            // OPU payload
+                            new OpuBuilder()
+                                    .setExpPayloadType(PayloadTypeDef.getDefaultInstance("22"))
+                                    .setPayloadType(PayloadTypeDef.getDefaultInstance("22"))
+                                    .build());
+        }
 
+        InterfaceBuilder oduInterfaceBuilder =
+            createGenericInterfaceBuilder(portMap, OtnOdu.VALUE, logicalConnPoint + ODUC + oducnrate)
+                .setSupportingInterfaceList(new HashSet<>(Set.of(supportingOtucn)))
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder()
+                        .setOdu(oduBuilder.build())
+                        .build());
         // Post interface on the device
         openRoadmInterfaces.postInterface(nodeId, oduInterfaceBuilder);
         // Post the equipment-state change on the device circuit-pack if xpdr node
@@ -953,68 +904,68 @@ public class OpenRoadmInterface710 {
 
     // With SAPI and DAPI information
     public String createOpenRoadmOtnOducnInterface(String anodeId, String alogicalConnPoint,
-        String supportingOtucn, String znodeId, String zlogicalConnPoint)
-        throws OpenRoadmInterfaceException {
+            String supportingOtucn, String znodeId, String zlogicalConnPoint)
+            throws OpenRoadmInterfaceException {
         Mapping portMapA = portMapping.getMapping(anodeId, alogicalConnPoint);
-        Mapping portMapZ = portMapping.getMapping(znodeId, zlogicalConnPoint);
         if (portMapA == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE,
-                    anodeId, alogicalConnPoint));
+                OpenRoadmInterfaceException.mapping_msg_err(anodeId, alogicalConnPoint));
+        }
+        if (portMapA.getXpdrType() == null) {
+            throw new OpenRoadmInterfaceException(
+                    OpenRoadmInterfaceException.mapping_xpdrtype_err(anodeId, alogicalConnPoint));
         }
         // On the Zside
+        Mapping portMapZ = portMapping.getMapping(znodeId, zlogicalConnPoint);
         if (portMapZ == null) {
             throw new OpenRoadmInterfaceException(
-                String.format(MAPPING_ERROR_EXCEPTION_MESSAGE,
-                    znodeId, zlogicalConnPoint));
-
+                OpenRoadmInterfaceException.mapping_msg_err(znodeId, zlogicalConnPoint));
         }
-        // Create ODUcn object
-        // Start with OPU object
-        // OPU payload
-        OpuBuilder opuBuilder = new OpuBuilder()
-            .setExpPayloadType(PayloadTypeDef.getDefaultInstance("22"))
-            .setPayloadType(PayloadTypeDef.getDefaultInstance("22"));
-
-        // Create an ODUCn object
-        OduBuilder oduBuilder = new OduBuilder()
-            .setRate(ODUCn.class)
-            .setOduFunction(ODUTTP.class)
-            .setMonitoringMode(MonitoringMode.Terminated)
-            .setTimActEnabled(false)
-            .setTimDetectMode(TimDetectMode.Disabled)
-            .setDegmIntervals(Uint8.valueOf(2))
-            .setDegthrPercentage(Uint16.valueOf(100))
-            .setOpu(opuBuilder.build())
-            .setTxSapi(portMapA.getLcpHashVal())
-            .setTxDapi(portMapZ.getLcpHashVal())
-            .setExpectedSapi(portMapZ.getLcpHashVal())
-            .setExpectedDapi(portMapZ.getLcpHashVal());
-
         // Set the ODUCn rate from OTUCn interface naming convention
         String oducnrate = supportingOtucn.substring(supportingOtucn.length() - 1);
-
         // check if the oducnrate is a valid value and if it is invalid, then throw error
         if (!SUPPORTED_ODUCN_RATES.contains(oducnrate)) {
-            throw new OpenRoadmInterfaceException(
-                String.format(RATE_EXCEPTION_MESSAGE));
+            throw new OpenRoadmInterfaceException(RATE_EXCEPTION_MESSAGE);
         }
 
-        oduBuilder.setOducnNRate(Uint16.valueOf(oducnrate));
-
-        InterfaceBuilder oduInterfaceBuilder = createGenericInterfaceBuilder(portMapA, OtnOdu.class,
-            alogicalConnPoint + ODUC + oducnrate);
-
-        // Create a list
-        List<String> listSupportingOtucnInterface = new ArrayList<>();
-        listSupportingOtucnInterface.add(supportingOtucn);
-
-        oduInterfaceBuilder.setSupportingInterfaceList(listSupportingOtucnInterface);
-        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder oduIf1Builder =
-            new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder();
-
-        oduInterfaceBuilder.addAugmentation(oduIf1Builder.setOdu(oduBuilder.build()).build());
+        // set the common parameters
+        OduBuilder oduBuilder = new OduBuilder()
+                .setRate(ODUCn.VALUE)
+                .setOducnNRate(Uint16.valueOf(oducnrate));
+
+        if (portMapA.getXpdrType() == XpdrNodeTypes.Regen) {
+            LOG.info("Regen mode only supports not-terminated or monitored");
+            oduBuilder.setMonitoringMode(MonitoringMode.NotTerminated)
+                    // For regen-mode ODU-function is set to CTP
+                    .setOduFunction(ODUCTP.VALUE);
+        } else {
+            // if it is other than regen mode
+            oduBuilder.setMonitoringMode(MonitoringMode.Terminated)
+                    .setTimActEnabled(false)
+                    .setOduFunction(ODUTTP.VALUE)
+                    .setTimDetectMode(TimDetectMode.Disabled)
+                    .setDegmIntervals(Uint8.valueOf(2))
+                    .setDegthrPercentage(Uint16.valueOf(100))
+                    .setOducnNRate(Uint16.valueOf(oducnrate))
+                    .setOpu(
+                            // OPU payload
+                            new OpuBuilder()
+                                    .setExpPayloadType(PayloadTypeDef.getDefaultInstance("22"))
+                                    .setPayloadType(PayloadTypeDef.getDefaultInstance("22"))
+                                    .build())
+                    .setTxSapi(portMapA.getLcpHashVal())
+                    .setTxDapi(portMapZ.getLcpHashVal())
+                    .setExpectedSapi(portMapZ.getLcpHashVal())
+                    .setExpectedDapi(portMapZ.getLcpHashVal());
+        }
 
+        InterfaceBuilder oduInterfaceBuilder =
+            createGenericInterfaceBuilder(portMapA, OtnOdu.VALUE, alogicalConnPoint + ODUC + oducnrate)
+                .setSupportingInterfaceList(new HashSet<>(Set.of(supportingOtucn)))
+                .addAugmentation(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.Interface1Builder()
+                        .setOdu(oduBuilder.build())
+                        .build());
         // Post interface on the device
         openRoadmInterfaces.postInterface(anodeId, oduInterfaceBuilder);
         // Post the equipment-state change on the device circuit-pack if xpdr node
@@ -1031,8 +982,7 @@ public class OpenRoadmInterface710 {
         return String.join(GridConstant.NAME_PARAMETERS_SEPARATOR, logicalConnectionPoint, spectralSlotName);
     }
 
-    private InterfaceBuilder createGenericInterfaceBuilder(Mapping portMap, Class<? extends InterfaceType> type,
-            String key) {
+    private InterfaceBuilder createGenericInterfaceBuilder(Mapping portMap, InterfaceType type, String key) {
         return new org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev200529.interfaces.grp.InterfaceBuilder()
             .setDescription("  TBD   ")
             .setCircuitId("   TBD    ")
@@ -1044,39 +994,37 @@ public class OpenRoadmInterface710 {
             .withKey(new InterfaceKey(key));
     }
 
-    @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
-        value = "UPM_UNCALLED_PRIVATE_METHOD",
-        justification = "call in call() method")
     private int getServiceRate(ModulationFormat modulationFormat, SpectrumInformation spectrumInformation) {
-
         switch (modulationFormat) {
             case DpQpsk:
-                LOG.info("Given modulation format is {} and thus rate is 200G", modulationFormat);
-                return 200;
-            case DpQam8:
-                LOG.info("Given modulation format is {} and thus rate is 300G", modulationFormat);
-                return 300;
             case DpQam16:
-                // DpQam16 is possible for both 31.6 or 63.1 GBaud, for which spectral width is different
+                // DpQpsk and DpQam16 are possible for both 31.6 or 63.1 GBaud, for which spectral width is different
                 // Here take the difference of highest and lowest spectral numbers and determine the width
-                LOG.info("The width with guard band {}", (spectrumInformation.getHigherSpectralSlotNumber()
-                    - spectrumInformation.getLowerSpectralSlotNumber() + 1) * GridConstant.GRANULARITY);
-                if ((spectrumInformation.getHigherSpectralSlotNumber()
-                    - spectrumInformation.getLowerSpectralSlotNumber() + 1) * GridConstant.GRANULARITY == 50.0) {
-                    // Based on roll-of-factor of 0.5, 50 - 12.5 = 37.5GHz translates to 31.6 GBaud
+                double spectralWidth = (spectrumInformation.getHigherSpectralSlotNumber()
+                    - spectrumInformation.getLowerSpectralSlotNumber() + 1) * GridConstant.GRANULARITY;
+                LOG.info("The width with guard band {}", spectralWidth);
+                if (spectralWidth == 50.0) {
                     LOG.info("The baud-rate is 31.6 GBaud");
-                    LOG.info("Given modulation format {} with 31.6 Gbaud rate is 200G", modulationFormat);
-                    return 200;
-                } else {
-                    // Based on roll-of-factor of 0.5, 87.5 - 12.5 = 75GHz translates to 63.1 GBaud
-                    LOG.info("The baud-rate is 63.1 GBaud");
-                    return 400;
+                    return Map.of(
+                            ModulationFormat.DpQpsk , 100,
+                            ModulationFormat.DpQam16 , 200)
+                        .get(modulationFormat);
+                    // Based on roll-of-factor of 0.2, 50 - 12.5 = 37.5GHz translates to 31.6 GBaud
                 }
+                LOG.info("The baud-rate is 63.1 GBaud");
+                Map<ModulationFormat, Integer> rateMap = Map.of(
+                        ModulationFormat.DpQpsk , 200,
+                        ModulationFormat.DpQam16 , 400);
+                // Based on roll-of-factor of 0.2, 87.5 - 12.5 = 75GHz translates to 63.1 GBaud
+                int rate = rateMap.get(modulationFormat);
+                LOG.info("Given modulation format {} rate is {}", modulationFormat, rate);
+                return rate;
+            case DpQam8:
+                LOG.info("Given modulation format DpQam8 rate is 300");
+                return 300;
             default:
-                LOG.error("Modulation format is required to select the rate");
-                break;
+                LOG.error(RATE_EXCEPTION_MESSAGE + " for modulation format {}", modulationFormat);
+                return 0;
         }
-        return 0;
     }
-
 }
index 6707d032add9600cfd89ba3ae006b3b95574a7b5..a53d0be1759a5bcc201e46059e2b5a5842da7941 100644 (file)
@@ -14,11 +14,13 @@ import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.common.fixedflex.GridConstant;
 import org.opendaylight.transportpce.common.fixedflex.SpectrumInformation;
 import org.opendaylight.transportpce.common.mapping.MappingUtils;
+import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
+import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.az.api.info.AEndApiInfo;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.az.api.info.ZEndApiInfo;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.OpucnTribSlotDef;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OpucnTribSlotDef;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -36,15 +38,14 @@ public class OpenRoadmInterfaceFactory {
     private final OpenRoadmOtnInterface221 openRoadmOtnInterface221;
     private final OpenRoadmOtnInterface710 openRoadmOtnInterface710;
 
-    public OpenRoadmInterfaceFactory(MappingUtils mappingUtils, OpenRoadmInterface121 openRoadmInterface121,
-            OpenRoadmInterface221 openRoadmInterface221, OpenRoadmInterface710 openRoadmInterface710,
-            OpenRoadmOtnInterface221 openRoadmOTNInterface221, OpenRoadmOtnInterface710 openRoadmOtnInterface710) {
+    public OpenRoadmInterfaceFactory(MappingUtils mappingUtils, PortMapping portMapping,
+            OpenRoadmInterfaces openRoadmInterfaces) {
         this.mappingUtils = mappingUtils;
-        this.openRoadmInterface121 = openRoadmInterface121;
-        this.openRoadmInterface221 = openRoadmInterface221;
-        this.openRoadmInterface710 = openRoadmInterface710;
-        this.openRoadmOtnInterface221 = openRoadmOTNInterface221;
-        this.openRoadmOtnInterface710 = openRoadmOtnInterface710;
+        this.openRoadmInterface121 = new OpenRoadmInterface121(portMapping, openRoadmInterfaces);
+        this.openRoadmInterface221 = new OpenRoadmInterface221(portMapping, openRoadmInterfaces);
+        this.openRoadmInterface710 = new OpenRoadmInterface710(portMapping, openRoadmInterfaces);
+        this.openRoadmOtnInterface221 = new OpenRoadmOtnInterface221(portMapping, openRoadmInterfaces);
+        this.openRoadmOtnInterface710 = new OpenRoadmOtnInterface710(portMapping, openRoadmInterfaces);
     }
 
     public String createOpenRoadmEthInterface(String nodeId, String logicalConnPoint)
@@ -135,6 +136,17 @@ public class OpenRoadmInterfaceFactory {
         }
     }
 
+    public String createOpenRoadmOducn(String nodeId, String logicalConnPoint)
+            throws OpenRoadmInterfaceException {
+
+        switch (mappingUtils.getOpenRoadmVersion(nodeId)) {
+            case StringConstants.OPENROADM_DEVICE_VERSION_7_1:
+                return openRoadmInterface710.createOpenRoadmOducnInterface(nodeId, logicalConnPoint);
+            default:
+                return null;
+        }
+    }
+
     /**
      * This methods creates an OTU interface on the given termination point.
      *
@@ -273,14 +285,14 @@ public class OpenRoadmInterfaceFactory {
                 LOG.error(OTN_FUNTIONS_ARE_NOT_SUPPORTED_BY_OPENROADM_MODELS_1_2_1_MSG);
                 return null;
             case StringConstants.OPENROADM_DEVICE_VERSION_2_2_1:
-                return openRoadmOtnInterface221.createOpenRoadmOdu0Interface(nodeId, logicalConnPoint,
+                return openRoadmOtnInterface221.createOpenRoadmOdu0Interface(nodeId, logicalConnPoint, servicename,
                     isCTP, tribPortNumber, tribSlotIndex, apiInfoA, apiInfoZ, payLoadType);
             default:
                 return null;
         }
     }
 
-    public String createOpenRoadmOdu2Interface(String nodeId, String logicalConnPoint,
+    public String createOpenRoadmOdu2Interface(String nodeId, String logicalConnPoint, String servicename,
             boolean isCTP, int tribPortNumber, int tribSlotIndex, AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ,
             String payLoadType)
             throws OpenRoadmInterfaceException {
@@ -289,14 +301,14 @@ public class OpenRoadmInterfaceFactory {
                 LOG.error(OTN_FUNTIONS_ARE_NOT_SUPPORTED_BY_OPENROADM_MODELS_1_2_1_MSG);
                 return null;
             case StringConstants.OPENROADM_DEVICE_VERSION_2_2_1:
-                return openRoadmOtnInterface221.createOpenRoadmOdu2Interface(nodeId, logicalConnPoint,
+                return openRoadmOtnInterface221.createOpenRoadmOdu2Interface(nodeId, logicalConnPoint,  servicename,
                     isCTP, tribPortNumber, tribSlotIndex, apiInfoA, apiInfoZ, payLoadType);
             default:
                 return null;
         }
     }
 
-    public String createOpenRoadmOdu2eInterface(String nodeId, String logicalConnPoint,
+    public String createOpenRoadmOdu2eInterface(String nodeId, String logicalConnPoint, String servicename,
             boolean isCTP, int tribPortNumber, int tribSlotIndex, AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ,
             String payLoadType)
             throws OpenRoadmInterfaceException {
@@ -306,16 +318,16 @@ public class OpenRoadmInterfaceFactory {
                 LOG.error(OTN_FUNTIONS_ARE_NOT_SUPPORTED_BY_OPENROADM_MODELS_1_2_1_MSG);
                 return null;
             case StringConstants.OPENROADM_DEVICE_VERSION_2_2_1:
-                return openRoadmOtnInterface221.createOpenRoadmOdu2eInterface(nodeId, logicalConnPoint,
+                return openRoadmOtnInterface221.createOpenRoadmOdu2eInterface(nodeId, logicalConnPoint, servicename,
                     isCTP, tribPortNumber, tribSlotIndex, apiInfoA, apiInfoZ, payLoadType);
             default:
                 return null;
         }
     }
 
-    public String createOpenRoadmOtnOdu4LoInterface(String nodeId, String logicalConnPoint,
-        String serviceName, String payLoad, boolean isNetworkPort,
-        OpucnTribSlotDef minTribSlotNumber, OpucnTribSlotDef maxTribSlotNumber)
+    public String createOpenRoadmOtnOdu4LoInterface(String nodeId, String logicalConnPoint, String serviceName,
+            String payLoad, boolean isNetworkPort, OpucnTribSlotDef minTribSlotNumber,
+            OpucnTribSlotDef maxTribSlotNumber)
         throws OpenRoadmInterfaceException {
 
         switch (mappingUtils.getOpenRoadmVersion(nodeId)) {
@@ -326,7 +338,7 @@ public class OpenRoadmInterfaceFactory {
                 LOG.error(OTN_FUNTIONS_ARE_NOT_SUPPORTED_BY_OPENROADM_MODELS_2_2_1_MSG);
                 return null;
             case StringConstants.OPENROADM_DEVICE_VERSION_7_1:
-                return openRoadmOtnInterface710.createOpenRoadmOdu4Interface(nodeId, logicalConnPoint,
+                return openRoadmOtnInterface710.createOpenRoadmOdu4Interface(nodeId, logicalConnPoint, serviceName,
                     payLoad, isNetworkPort, minTribSlotNumber, maxTribSlotNumber);
             default:
                 return null;
index 6f91279c350263b722d33acad10ab0ab9c979bbf..ab8380b4d616470fc140f4841b8fb9980b0e4fa9 100644 (file)
@@ -7,15 +7,15 @@
  */
 package org.opendaylight.transportpce.renderer.openroadminterface;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashSet;
+import java.util.Set;
 import java.util.stream.IntStream;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.az.api.info.AEndApiInfo;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.az.api.info.ZEndApiInfo;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp.InterfaceBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.interfaces.grp.InterfaceKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev171215.AdminStates;
@@ -68,8 +68,7 @@ public class OpenRoadmOtnInterface221 {
         // Ethernet interface specific data
         EthernetBuilder ethIfBuilder = new EthernetBuilder()
                 .setSpeed(Uint32.valueOf(1000));
-        InterfaceBuilder ethInterfaceBldr = createGenericInterfaceBuilder(
-                portMap, EthernetCsmacd.class,
+        InterfaceBuilder ethInterfaceBldr = createGenericInterfaceBuilder(portMap, EthernetCsmacd.VALUE,
                 logicalConnPoint + "-ETHERNET1G");
         // Create Interface1 type object required for adding as augmentation
         Interface1Builder ethIf1Builder = new Interface1Builder();
@@ -92,8 +91,7 @@ public class OpenRoadmOtnInterface221 {
                 nodeId, logicalConnPoint));
     }
 
-    private InterfaceBuilder createGenericInterfaceBuilder(Mapping portMap,
-            Class<? extends InterfaceType> type, String key) {
+    private InterfaceBuilder createGenericInterfaceBuilder(Mapping portMap, InterfaceType type, String key) {
         return new InterfaceBuilder()
                 // .setDescription(" TBD ")
                 // .setCircuitId(" TBD ")
@@ -118,7 +116,7 @@ public class OpenRoadmOtnInterface221 {
                 .setSpeed(Uint32.valueOf(10000));
         // Create Interface1 type object required for adding as augmentation
         Interface1Builder ethIf1Builder = new Interface1Builder();
-        InterfaceBuilder ethInterfaceBldr = createGenericInterfaceBuilder(portMap, EthernetCsmacd.class,
+        InterfaceBuilder ethInterfaceBldr = createGenericInterfaceBuilder(portMap, EthernetCsmacd.VALUE,
                 logicalConnPoint + "-ETHERNET10G").addAugmentation(ethIf1Builder.setEthernet(ethIfBuilder.build())
                         .build());
         // Post interface on the device
@@ -132,7 +130,7 @@ public class OpenRoadmOtnInterface221 {
         return ethernetInterfaceName;
     }
 
-    public String createOpenRoadmOdu2eInterface(String nodeId, String logicalConnPoint,
+    public String createOpenRoadmOdu2eInterface(String nodeId, String logicalConnPoint, String serviceName,
             boolean isCTP, int tribPortNumber, int tribSlotIndex, AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ,
             String payloadType) throws OpenRoadmInterfaceException {
 
@@ -141,8 +139,8 @@ public class OpenRoadmOtnInterface221 {
             throw new OpenRoadmInterfaceException(
                 String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint));
         }
-        InterfaceBuilder oduInterfaceBldr = createGenericInterfaceBuilder(mapping, OtnOdu.class,
-            logicalConnPoint + "-ODU2e");
+        InterfaceBuilder oduInterfaceBldr = createGenericInterfaceBuilder(mapping, OtnOdu.VALUE,
+            logicalConnPoint + "-ODU2e" + ":" + serviceName);
         if (mapping.getSupportingOdu4() != null) {
             oduInterfaceBldr.setSupportingInterface(mapping.getSupportingOdu4());
         }
@@ -150,14 +148,14 @@ public class OpenRoadmOtnInterface221 {
             oduInterfaceBldr.setSupportingInterface(mapping.getSupportingEthernet());
         }
 
-        Class<? extends OduFunctionIdentity> oduFunction;
+        OduFunctionIdentity oduFunction;
         MonitoringMode monitoringMode;
         Opu opu = null;
         ParentOduAllocation parentOduAllocation = null;
         if (isCTP) {
-            oduFunction = ODUCTP.class;
+            oduFunction = ODUCTP.VALUE;
             monitoringMode = MonitoringMode.Monitored;
-            List<Uint16> tribSlots = new ArrayList<>();
+            Set<Uint16> tribSlots = new HashSet<>();
             Uint16 newIdx = Uint16.valueOf(tribSlotIndex);
             tribSlots.add(newIdx);
             IntStream.range(tribSlotIndex, tribSlotIndex + 8)
@@ -167,7 +165,7 @@ public class OpenRoadmOtnInterface221 {
                     .setTribSlots(tribSlots)
                     .build();
         } else {
-            oduFunction = ODUTTPCTP.class;
+            oduFunction = ODUTTPCTP.VALUE;
             monitoringMode = MonitoringMode.Terminated;
             opu = new OpuBuilder()
                 .setPayloadType(PayloadTypeDef.getDefaultInstance(payloadType))
@@ -175,7 +173,7 @@ public class OpenRoadmOtnInterface221 {
                 .build();
         }
         OduBuilder oduIfBuilder = new OduBuilder()
-            .setRate(ODU2e.class)
+            .setRate(ODU2e.VALUE)
             .setOduFunction(oduFunction)
             .setMonitoringMode(monitoringMode)
             .setOpu(opu)
@@ -208,8 +206,8 @@ public class OpenRoadmOtnInterface221 {
         return oduInterfaceBldr.getName();
     }
 
-    public String createOpenRoadmOdu0Interface(String nodeId, String logicalConnPoint,
-            boolean isCTP, int tribPortNumber, int tribSlotIndex, AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ,
+    public String createOpenRoadmOdu0Interface(String nodeId, String logicalConnPoint, String servicename,
+        boolean isCTP, int tribPortNumber, int tribSlotIndex, AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ,
             String payloadType) throws OpenRoadmInterfaceException {
 
         Mapping mapping = this.portMapping.getMapping(nodeId, logicalConnPoint);
@@ -217,8 +215,8 @@ public class OpenRoadmOtnInterface221 {
             throw new OpenRoadmInterfaceException(
                 String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint));
         }
-        InterfaceBuilder oduInterfaceBldr = createGenericInterfaceBuilder(mapping, OtnOdu.class,
-            logicalConnPoint + "-ODU0");
+        InterfaceBuilder oduInterfaceBldr = createGenericInterfaceBuilder(mapping, OtnOdu.VALUE,
+            logicalConnPoint + "-ODU0" + ":" + servicename);
         if (mapping.getSupportingOdu4() != null) {
             oduInterfaceBldr.setSupportingInterface(mapping.getSupportingOdu4());
         }
@@ -226,14 +224,14 @@ public class OpenRoadmOtnInterface221 {
             oduInterfaceBldr.setSupportingInterface(mapping.getSupportingEthernet());
         }
 
-        Class<? extends OduFunctionIdentity> oduFunction;
+        OduFunctionIdentity oduFunction;
         MonitoringMode monitoringMode;
         Opu opu = null;
         ParentOduAllocation parentOduAllocation = null;
         if (isCTP) {
-            oduFunction = ODUCTP.class;
+            oduFunction = ODUCTP.VALUE;
             monitoringMode = MonitoringMode.Monitored;
-            List<Uint16> tribSlots = new ArrayList<>();
+            Set<Uint16> tribSlots = new HashSet<>();
             Uint16 newIdx = Uint16.valueOf(tribSlotIndex);
             tribSlots.add(newIdx);
             IntStream.range(tribSlotIndex, tribSlotIndex + 8)
@@ -243,7 +241,7 @@ public class OpenRoadmOtnInterface221 {
                     .setTribSlots(tribSlots)
                     .build();
         } else {
-            oduFunction = ODUTTPCTP.class;
+            oduFunction = ODUTTPCTP.VALUE;
             monitoringMode = MonitoringMode.Terminated;
             opu = new OpuBuilder()
                 .setPayloadType(PayloadTypeDef.getDefaultInstance(payloadType))
@@ -251,7 +249,7 @@ public class OpenRoadmOtnInterface221 {
                 .build();
         }
         OduBuilder oduIfBuilder = new OduBuilder()
-            .setRate(ODU0.class)
+            .setRate(ODU0.VALUE)
             .setOduFunction(oduFunction)
             .setMonitoringMode(monitoringMode)
             .setOpu(opu)
@@ -285,16 +283,16 @@ public class OpenRoadmOtnInterface221 {
     }
 
     public String createOpenRoadmOdu2Interface(String nodeId, String logicalConnPoint,
-            boolean isCTP, int tribPortNumber, int tribSlotIndex, AEndApiInfo apiInfoA, ZEndApiInfo apiInfoZ,
-            String payloadType) throws OpenRoadmInterfaceException {
+            String servicename, boolean isCTP, int tribPortNumber, int tribSlotIndex, AEndApiInfo apiInfoA,
+            ZEndApiInfo apiInfoZ, String payloadType) throws OpenRoadmInterfaceException {
 
         Mapping mapping = this.portMapping.getMapping(nodeId, logicalConnPoint);
         if (mapping == null) {
             throw new OpenRoadmInterfaceException(
                 String.format(MAPPING_ERROR_EXCEPTION_MESSAGE, nodeId, logicalConnPoint));
         }
-        InterfaceBuilder oduInterfaceBldr = createGenericInterfaceBuilder(mapping, OtnOdu.class,
-            logicalConnPoint + "-ODU2");
+        InterfaceBuilder oduInterfaceBldr = createGenericInterfaceBuilder(mapping, OtnOdu.VALUE,
+            logicalConnPoint + "-ODU2" + ":" + servicename);
         if (mapping.getSupportingOdu4() != null) {
             oduInterfaceBldr.setSupportingInterface(mapping.getSupportingOdu4());
         }
@@ -302,14 +300,14 @@ public class OpenRoadmOtnInterface221 {
             oduInterfaceBldr.setSupportingInterface(mapping.getSupportingEthernet());
         }
 
-        Class<? extends OduFunctionIdentity> oduFunction;
+        OduFunctionIdentity oduFunction;
         MonitoringMode monitoringMode;
         Opu opu = null;
         ParentOduAllocation parentOduAllocation = null;
         if (isCTP) {
-            oduFunction = ODUCTP.class;
+            oduFunction = ODUCTP.VALUE;
             monitoringMode = MonitoringMode.Monitored;
-            List<Uint16> tribSlots = new ArrayList<>();
+            Set<Uint16> tribSlots = new HashSet<>();
             Uint16 newIdx = Uint16.valueOf(tribSlotIndex);
             tribSlots.add(newIdx);
             IntStream.range(tribSlotIndex, tribSlotIndex + 8)
@@ -319,7 +317,7 @@ public class OpenRoadmOtnInterface221 {
                     .setTribSlots(tribSlots)
                     .build();
         } else {
-            oduFunction = ODUTTPCTP.class;
+            oduFunction = ODUTTPCTP.VALUE;
             monitoringMode = MonitoringMode.Terminated;
             opu = new OpuBuilder()
                 .setPayloadType(PayloadTypeDef.getDefaultInstance(payloadType))
@@ -327,7 +325,7 @@ public class OpenRoadmOtnInterface221 {
                 .build();
         }
         OduBuilder oduIfBuilder = new OduBuilder()
-            .setRate(ODU2.class)
+            .setRate(ODU2.VALUE)
             .setOduFunction(oduFunction)
             .setMonitoringMode(monitoringMode)
             .setOpu(opu)
index 5cabe461b7bb835ecdbe689000b35df4d751b640..5a8a0946f90f5f8bb520a2ba3b965a485ccd6b9d 100644 (file)
@@ -7,13 +7,13 @@
  */
 package org.opendaylight.transportpce.renderer.openroadminterface;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashSet;
+import java.util.Set;
 import java.util.stream.IntStream;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.attributes.rev200327.parent.odu.allocation.ParentOduAllocationBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.attributes.rev200327.parent.odu.allocation.parent.odu.allocation.trib.slots.choice.OpucnBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev200529.Off;
@@ -28,8 +28,8 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.interfaces.rev191129.OtnO
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODU4;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODUCTP;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.ODUTTPCTP;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.OpucnTribSlotDef;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.PayloadTypeDef;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OpucnTribSlotDef;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.OduAttributes.MonitoringMode;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.odu.container.OduBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.odu.interfaces.rev200529.opu.OpuBuilder;
@@ -60,10 +60,9 @@ public class OpenRoadmOtnInterface710 {
 
         // Ethernet interface specific data
         EthernetBuilder ethIfBuilder = new EthernetBuilder()
-            .setFec(Off.class)
+            .setFec(Off.VALUE)
             .setSpeed(Uint32.valueOf(100000));
-        InterfaceBuilder ethInterfaceBldr = createGenericInterfaceBuilder(
-            portMap, EthernetCsmacd.class,
+        InterfaceBuilder ethInterfaceBldr = createGenericInterfaceBuilder(portMap, EthernetCsmacd.VALUE,
             logicalConnPoint + "-ETHERNET-100G");
         // Create Interface1 type object required for adding as augmentation
         Interface1Builder ethIf1Builder = new Interface1Builder();
@@ -87,14 +86,14 @@ public class OpenRoadmOtnInterface710 {
             nodeId, logicalConnPoint));
     }
 
-    public String createOpenRoadmOdu4Interface(String nodeId, String logicalConnPoint,
+    public String createOpenRoadmOdu4Interface(String nodeId, String logicalConnPoint, String serviceName,
         String payLoad, boolean isNetworkPort, OpucnTribSlotDef minTribSlotNumber, OpucnTribSlotDef maxTribSlotNumber)
         throws OpenRoadmInterfaceException {
         Mapping portMap = this.portMapping.getMapping(nodeId, logicalConnPoint);
         if (portMap == null) {
             throwException(nodeId, logicalConnPoint);
         }
-        List<String> supportingInterfaceList = new ArrayList<>();
+        Set<String> supportingInterfaceList = new HashSet<>();
         String supportingInterface = null;
         if (isNetworkPort) {
             supportingInterface = portMap.getSupportingOducn();
@@ -113,31 +112,33 @@ public class OpenRoadmOtnInterface710 {
         supportingInterfaceList.add(supportingInterface);
 
         InterfaceBuilder oduIfBuilder = createGenericInterfaceBuilder(
-            portMap, OtnOdu.class, logicalConnPoint + "-ODU4")
+            portMap, OtnOdu.VALUE, logicalConnPoint + "-ODU4" + ":" + serviceName)
             .setSupportingInterfaceList(supportingInterfaceList);
         // Agument ODU4 specific interface data
-        OduBuilder oduBuilder = new OduBuilder().setRate(ODU4.class)
-            .setOduFunction(ODUTTPCTP.class)
+        OduBuilder oduBuilder = new OduBuilder().setRate(ODU4.VALUE)
+            .setOduFunction(ODUTTPCTP.VALUE)
             .setMonitoringMode(MonitoringMode.Terminated);
         LOG.debug("Inside the ODU4 creation {} {} {}", isNetworkPort, minTribSlotNumber.getValue(),
             maxTribSlotNumber.getValue());
         // If it is a network port we have fill the required trib-slots and trib-ports
         if (isNetworkPort) {
-            List<OpucnTribSlotDef> opucnTribSlotDefList = new ArrayList<>();
+            Set<org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.OpucnTribSlotDef>
+                opucnTribSlotDefList = new HashSet<>();
             // Escape characters are used to here to take the literal dot
             Uint16 tribPortNumber = Uint16.valueOf(minTribSlotNumber.getValue().split("\\.")[0]);
             Uint16 startTribSlot = Uint16.valueOf(minTribSlotNumber.getValue().split("\\.")[1]);
             Uint16 endTribSlot = Uint16.valueOf(maxTribSlotNumber.getValue().split("\\.")[1]);
 
             IntStream.range(startTribSlot.intValue(), endTribSlot.intValue() + 1)
-                .forEach(
-                    nbr -> opucnTribSlotDefList.add(OpucnTribSlotDef.getDefaultInstance(tribPortNumber + "." + nbr))
+                .forEach(nbr -> opucnTribSlotDefList.add(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.OpucnTribSlotDef
+                    .getDefaultInstance(tribPortNumber + "." + nbr))
                 );
             ParentOduAllocationBuilder parentOduAllocationBuilder = new ParentOduAllocationBuilder()
                 .setTribPortNumber(tribPortNumber)
                 .setTribSlotsChoice(new OpucnBuilder().setOpucnTribSlots(opucnTribSlotDefList).build());
             // reset the ODU function as ODUCTP and the monitoring moode
-            oduBuilder.setOduFunction(ODUCTP.class)
+            oduBuilder.setOduFunction(ODUCTP.VALUE)
                 .setMonitoringMode(MonitoringMode.NotTerminated)
                 .setParentOduAllocation(parentOduAllocationBuilder.build());
         }
@@ -160,8 +161,7 @@ public class OpenRoadmOtnInterface710 {
         return oduIfBuilder.getName();
     }
 
-    private InterfaceBuilder createGenericInterfaceBuilder(Mapping portMap,
-        Class<? extends InterfaceType> type, String key) {
+    private InterfaceBuilder createGenericInterfaceBuilder(Mapping portMap, InterfaceType type, String key) {
         return new InterfaceBuilder()
             // .setDescription(" TBD ")
             // .setCircuitId(" TBD ")
index a242147bdcdfffe2e4cb4d15a8fa7addc3e097d6..049247b45dc17f8e0d8a541c92a26f5de9a6c88d 100644 (file)
@@ -10,6 +10,7 @@ package org.opendaylight.transportpce.renderer.provisiondevice;
 
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
 import org.opendaylight.transportpce.renderer.provisiondevice.servicepath.ServicePathDirection;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.history.History;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.CreateOtsOmsInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.CreateOtsOmsOutput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.RendererRollbackInput;
@@ -44,6 +45,35 @@ public interface DeviceRendererService {
      */
     ServicePathOutput setupServicePath(ServicePathInput input, ServicePathDirection direction);
 
+    /**
+     * This method set's wavelength path based on following steps.
+     *
+     * <p>
+     * For each node:
+     * 1. Create Och interface on source termination point.
+     * 2. Create Och interface on destination termination point.
+     * 3. Create cross connect between source and destination tps created in step 1
+     *    and 2.
+     *
+     * Naming convention used for OCH interfaces name : tp-wavenumber Naming
+     * convention used for cross connect name : src-dest-wavenumber
+     * </p>
+     *
+     * @param input
+     *            Input parameter from the service-path yang model
+     * @param direction
+     *            Service Path direction
+     * @param transactionHistory
+     *            Object tracking created interface(s) and connection(s).
+     *
+     * @return Result list of all nodes if request successful otherwise specific
+     *         reason of failure.
+     */
+    ServicePathOutput setupServicePath(
+            ServicePathInput input,
+            ServicePathDirection direction,
+            History transactionHistory);
+
     /**
      * This method removes wavelength path based on following steps.
      *
@@ -72,6 +102,14 @@ public interface DeviceRendererService {
      */
     RendererRollbackOutput rendererRollback(RendererRollbackInput input);
 
+    /**
+     * Rollback created interfaces and cross connects specified by transaction history.
+     *
+     * @param transactionHistory The transaction history in need of rollback.
+     * @return Success flag and nodes which failed to rollback
+     */
+    RendererRollbackOutput rendererRollback(History transactionHistory);
+
     /**
      * This method creates the basis of ots and oms interfaces on a specific ROADM degree.
      *
index 22548873271e42420fe60604781e0d5677c313ad..a38b848b414f1888ada468153a571145659cb762 100644 (file)
@@ -9,9 +9,11 @@ package org.opendaylight.transportpce.renderer.provisiondevice;
 
 import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.FluentFuture;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -40,12 +42,22 @@ import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.common.fixedflex.GridConstant;
 import org.opendaylight.transportpce.common.fixedflex.GridUtils;
 import org.opendaylight.transportpce.common.fixedflex.SpectrumInformation;
+import org.opendaylight.transportpce.common.mapping.MappingUtils;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces;
 import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterfaceFactory;
 import org.opendaylight.transportpce.renderer.provisiondevice.servicepath.ServiceListTopology;
 import org.opendaylight.transportpce.renderer.provisiondevice.servicepath.ServicePathDirection;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.Connection;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.DeviceInterface;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.delete.DeleteService;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.delete.DeleteSubscriber;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.delete.FailedRollbackResult;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.delete.Result;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.delete.Subscriber;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.history.History;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.history.NonStickHistoryMemory;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.alarmsuppression.rev171102.ServiceNodelist;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.alarmsuppression.rev171102.service.nodelist.NodelistBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.alarmsuppression.rev171102.service.nodelist.NodelistKey;
@@ -63,24 +75,27 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.re
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.renderer.rollback.output.FailedToRollback;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.renderer.rollback.output.FailedToRollbackBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.renderer.rollback.output.FailedToRollbackKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.OpenroadmNodeVersion;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.Topology;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceList;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.ServicesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.ServicesKey;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.link.tp.LinkTp;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.link.tp.LinkTpBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.node.interfaces.NodeInterface;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.node.interfaces.NodeInterfaceBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.node.interfaces.NodeInterfaceKey;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.optical.renderer.nodes.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.OpenroadmNodeVersion;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.Topology;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceList;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.ServicesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.ServicesKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.link.tp.LinkTp;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.link.tp.LinkTpBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.node.interfaces.NodeInterface;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.node.interfaces.NodeInterfaceBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.node.interfaces.NodeInterfaceKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.optical.renderer.nodes.Nodes;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-
+@Component
 public class DeviceRendererServiceImpl implements DeviceRendererService {
     private static final String IS_NOT_MOUNTED_ON_THE_CONTROLLER = " is not mounted on the controller";
     private static final Logger LOG = LoggerFactory.getLogger(DeviceRendererServiceImpl.class);
@@ -92,15 +107,24 @@ public class DeviceRendererServiceImpl implements DeviceRendererService {
     private final CrossConnect crossConnect;
     private final PortMapping portMapping;
 
-    public DeviceRendererServiceImpl(DataBroker dataBroker, DeviceTransactionManager deviceTransactionManager,
-            OpenRoadmInterfaceFactory openRoadmInterfaceFactory, OpenRoadmInterfaces openRoadmInterfaces,
-            CrossConnect crossConnect, PortMapping portMapping) {
+    @Activate
+    public DeviceRendererServiceImpl(@Reference DataBroker dataBroker,
+            @Reference DeviceTransactionManager deviceTransactionManager,
+            @Reference OpenRoadmInterfaces openRoadmInterfaces,
+            @Reference CrossConnect crossConnect,
+            @Reference MappingUtils mappingUtils,
+            @Reference PortMapping portMapping) {
         this.dataBroker = dataBroker;
         this.deviceTransactionManager = deviceTransactionManager;
-        this.openRoadmInterfaceFactory = openRoadmInterfaceFactory;
         this.openRoadmInterfaces = openRoadmInterfaces;
         this.crossConnect = crossConnect;
         this.portMapping = portMapping;
+        this.openRoadmInterfaceFactory = new OpenRoadmInterfaceFactory(mappingUtils, portMapping, openRoadmInterfaces);
+    }
+
+    @Override
+    public ServicePathOutput setupServicePath(ServicePathInput input, ServicePathDirection direction) {
+        return setupServicePath(input, direction, new NonStickHistoryMemory());
     }
 
     @SuppressWarnings("rawtypes")
@@ -108,7 +132,11 @@ public class DeviceRendererServiceImpl implements DeviceRendererService {
     // Raw types use are discouraged since they lack type safety.
     // Resulting Problems are observed at run time and not at compile time
     @Override
-    public ServicePathOutput setupServicePath(ServicePathInput input, ServicePathDirection direction) {
+    public ServicePathOutput setupServicePath(
+            ServicePathInput input,
+            ServicePathDirection direction,
+            History transactionHistory
+    ) {
         LOG.info("setup service path for input {} and direction {}", input, direction);
         List<Nodes> nodes = new ArrayList<>();
         if (input.getNodes() != null) {
@@ -137,11 +165,11 @@ public class DeviceRendererServiceImpl implements DeviceRendererService {
             if (input.getZEndApiInfo() != null && input.getZEndApiInfo().getNodeId().contains(nodeId)) {
                 apiInfoZ = input.getZEndApiInfo();
             }
-            List<String> createdEthInterfaces = new ArrayList<>();
-            List<String> createdOtuInterfaces = new ArrayList<>();
-            List<String> createdOduInterfaces = new ArrayList<>();
-            List<String> createdOchInterfaces = new ArrayList<>();
-            List<String> createdConnections = new ArrayList<>();
+            Set<String> createdEthInterfaces = new HashSet<>();
+            Set<String> createdOtuInterfaces = new HashSet<>();
+            Set<String> createdOduInterfaces = new HashSet<>();
+            Set<String> createdOchInterfaces = new HashSet<>();
+            Set<String> createdConnections = new HashSet<>();
             int crossConnectFlag = 0;
             try {
                 // if the node is currently mounted then proceed
@@ -154,31 +182,57 @@ public class DeviceRendererServiceImpl implements DeviceRendererService {
                         crossConnectFlag++;
                         String supportingOchInterface = this.openRoadmInterfaceFactory.createOpenRoadmOchInterface(
                                 nodeId, destTp, spectrumInformation);
+                        transactionHistory.add(new DeviceInterface(nodeId, supportingOchInterface));
+
                         // Split the string based on # pass the last element as the supported Interface
                         // This is needed for 7.1 device models with B100G, we have OTSI, OTSI-group combined as OCH
                         String[] listOfSuppOchInf = supportingOchInterface.split("#");
-                        createdOchInterfaces = Arrays.asList(listOfSuppOchInf);
+                        List<String> createdOchInf = Arrays.asList(listOfSuppOchInf);
+                        transactionHistory.addInterfaces(nodeId, listOfSuppOchInf);
+
+                        createdOchInterfaces.addAll(createdOchInf);
+                        LOG.info("DEST all otsi interfaces {}", createdOchInterfaces);
                         // Taking the last element
-                        supportingOchInterface = createdOchInterfaces.get(createdOchInterfaces.size() - 1);
-                        String supportingOtuInterface = this.openRoadmInterfaceFactory.createOpenRoadmOtu4Interface(
-                                nodeId, destTp, supportingOchInterface, apiInfoA, apiInfoZ);
+                        supportingOchInterface = listOfSuppOchInf[createdOchInf.size() - 1];
+                        String supportingOtuInterface = this.openRoadmInterfaceFactory
+                                .createOpenRoadmOtu4Interface(nodeId, destTp, supportingOchInterface, apiInfoA,
+                                        apiInfoZ);
                         createdOtuInterfaces.add(supportingOtuInterface);
+                        transactionHistory.add(new DeviceInterface(nodeId, supportingOtuInterface));
+
+                        LOG.info("all dest otu interfaces {}", createdOtuInterfaces);
                         if (srcTp == null) {
                             otnLinkTps.add(new LinkTpBuilder().setNodeId(nodeId).setTpId(destTp).build());
+                        } else if (srcTp.contains(StringConstants.NETWORK_TOKEN)) {
+                            // If src and dest tp contains the network token, then it is regenerator
+                            LOG.info("Create the ODUCn for regen on the dest-tp");
+                            // Here we first create ODUCn interface for the Regen
+                            String openRoadmOducn = this.openRoadmInterfaceFactory
+                                    .createOpenRoadmOducn(nodeId, destTp);
+                            createdOduInterfaces.add(openRoadmOducn);
+                            transactionHistory.addInterfaces(nodeId, openRoadmOducn);
+
+                            LOG.info("all dest odu interfaces {}", createdOduInterfaces);
                         } else {
                             // This is needed for 7.1 device models for 400GE, since we have ODUC4 and ODUflex
                             // are combined
-                            createdOduInterfaces = Arrays.asList(this.openRoadmInterfaceFactory
-                                .createOpenRoadmOdu4HOInterface(
-                                    nodeId, destTp, false, apiInfoA, apiInfoZ, PT_07).split("#"));
+                            String[] oduInterfaces = this.openRoadmInterfaceFactory
+                                    .createOpenRoadmOdu4HOInterface(
+                                            nodeId, destTp, false, apiInfoA, apiInfoZ, PT_07).split("#");
+                            createdOduInterfaces.addAll(Arrays.asList(oduInterfaces));
+                            transactionHistory.addInterfaces(nodeId, oduInterfaces);
+
                         }
                     }
                     if ((srcTp != null) && srcTp.contains(StringConstants.CLIENT_TOKEN)) {
                         LOG.info("Adding supporting EThernet interface for node {}, src tp {}", nodeId, srcTp);
                         crossConnectFlag++;
                         // create OpenRoadm Xponder Client Interfaces
-                        createdEthInterfaces.add(this.openRoadmInterfaceFactory.createOpenRoadmEthInterface(
-                                nodeId, srcTp));
+                        String openRoadmEthInterface = this.openRoadmInterfaceFactory.createOpenRoadmEthInterface(
+                                nodeId, srcTp);
+                        createdEthInterfaces.add(openRoadmEthInterface);
+                        transactionHistory.add(new DeviceInterface(nodeId, openRoadmEthInterface));
+
                     }
                     if ((srcTp != null) && srcTp.contains(StringConstants.NETWORK_TOKEN)) {
                         LOG.info("Adding supporting OCH interface for node {}, src tp {}, spectrumInformation {}",
@@ -187,37 +241,68 @@ public class DeviceRendererServiceImpl implements DeviceRendererService {
                         // create OpenRoadm Xponder Line Interfaces
                         String supportingOchInterface = this.openRoadmInterfaceFactory.createOpenRoadmOchInterface(
                                 nodeId, srcTp, spectrumInformation);
-                        createdOchInterfaces.add(supportingOchInterface);
+                        transactionHistory.add(new DeviceInterface(nodeId, supportingOchInterface));
+
+                        // createdOchInterfaces.add(supportingOchInterface);
+                        // Split the string based on # pass the last element as the supported Interface
+                        // This is needed for 7.1 device models with B100G, we have OTSI, OTSI-group combined as OCH
+                        String[] listOfSuppOchInf = supportingOchInterface.split("#");
+                        transactionHistory.addInterfaces(nodeId, listOfSuppOchInf);
+
+                        List<String> tmpCreatedOchInterfaces = Arrays.asList(listOfSuppOchInf);
+                        createdOchInterfaces.addAll(tmpCreatedOchInterfaces);
+                        // Taking the last element
+                        supportingOchInterface = tmpCreatedOchInterfaces.get(tmpCreatedOchInterfaces.size() - 1);
                         String supportingOtuInterface = this.openRoadmInterfaceFactory.createOpenRoadmOtu4Interface(
                                 nodeId, srcTp, supportingOchInterface, apiInfoA, apiInfoZ);
                         createdOtuInterfaces.add(supportingOtuInterface);
+                        transactionHistory.add(new DeviceInterface(nodeId, supportingOtuInterface));
+
                         if (destTp == null) {
                             otnLinkTps.add(new LinkTpBuilder().setNodeId(nodeId).setTpId(srcTp).build());
+                        } else if (destTp.contains(StringConstants.NETWORK_TOKEN)) {
+                            // If the src and dest tp have network-token, then it is a regen
+                            LOG.info("Create the regen-interfaces on the src-tp");
+                            // Here we first create ODUCn interface for the Regen
+                            String openRoadmOducn = this.openRoadmInterfaceFactory.createOpenRoadmOducn(nodeId,
+                                    srcTp);
+                            createdOduInterfaces.add(openRoadmOducn);
+                            transactionHistory.add(new DeviceInterface(nodeId, openRoadmOducn));
+
+                            LOG.info("all src odu interfaces {}", createdOduInterfaces);
                         } else {
-                            createdOduInterfaces.add(this.openRoadmInterfaceFactory.createOpenRoadmOdu4HOInterface(
-                                    nodeId, srcTp, false, apiInfoA, apiInfoZ, PT_07));
+                            String openRoadmOdu4HOInterface = this.openRoadmInterfaceFactory
+                                    .createOpenRoadmOdu4HOInterface(nodeId, srcTp, false, apiInfoA, apiInfoZ, PT_07);
+                            createdOduInterfaces.add(openRoadmOdu4HOInterface);
+                            transactionHistory.add(new DeviceInterface(nodeId, openRoadmOdu4HOInterface));
                         }
                     }
                     if ((destTp != null) && destTp.contains(StringConstants.CLIENT_TOKEN)) {
                         LOG.info("Adding supporting EThernet interface for node {}, dest tp {}", nodeId, destTp);
                         crossConnectFlag++;
                         // create OpenRoadm Xponder Client Interfaces
-                        createdEthInterfaces.add(this.openRoadmInterfaceFactory.createOpenRoadmEthInterface(
-                                nodeId, destTp));
+                        String openRoadmEthInterface = this.openRoadmInterfaceFactory.createOpenRoadmEthInterface(
+                                nodeId, destTp);
+                        createdEthInterfaces.add(openRoadmEthInterface);
+                        transactionHistory.add(new DeviceInterface(nodeId, openRoadmEthInterface));
                     }
                     if ((srcTp != null) && (srcTp.contains(StringConstants.TTP_TOKEN)
                             || srcTp.contains(StringConstants.PP_TOKEN))) {
                         LOG.info("Adding supporting OCH interface for node {}, src tp {}, spectrumInformation {}",
                                 nodeId, srcTp, spectrumInformation);
-                        createdOchInterfaces.addAll(this.openRoadmInterfaceFactory.createOpenRoadmOchInterfaces(
-                                nodeId, srcTp, spectrumInformation));
+                        List<String> openRoadmOchInterfaces = this.openRoadmInterfaceFactory
+                                .createOpenRoadmOchInterfaces(nodeId, srcTp, spectrumInformation);
+                        createdOchInterfaces.addAll(openRoadmOchInterfaces);
+                        transactionHistory.addInterfaces(nodeId, openRoadmOchInterfaces);
                     }
                     if ((destTp != null) && (destTp.contains(StringConstants.TTP_TOKEN)
                             || destTp.contains(StringConstants.PP_TOKEN))) {
                         LOG.info("Adding supporting OCH interface for node {}, dest tp {}, spectrumInformation {}",
                                 nodeId, destTp, spectrumInformation);
-                        createdOchInterfaces.addAll(this.openRoadmInterfaceFactory.createOpenRoadmOchInterfaces(
-                                nodeId, destTp, spectrumInformation));
+                        List<String> openRoadmOchInterfaces = this.openRoadmInterfaceFactory
+                                .createOpenRoadmOchInterfaces(nodeId, destTp, spectrumInformation);
+                        createdOchInterfaces.addAll(openRoadmOchInterfaces);
+                        transactionHistory.addInterfaces(nodeId, openRoadmOchInterfaces);
                     }
                     if (crossConnectFlag < 1) {
                         LOG.info("Creating cross connect between source {} and destination {} for node {}", srcTp,
@@ -226,7 +311,9 @@ public class DeviceRendererServiceImpl implements DeviceRendererService {
                                 this.crossConnect.postCrossConnect(nodeId, srcTp, destTp, spectrumInformation);
                         if (connectionNameOpt.isPresent()) {
                             nodesProvisioned.add(nodeId);
-                            createdConnections.add(connectionNameOpt.get());
+                            String connectionName = connectionNameOpt.orElseThrow();
+                            createdConnections.add(connectionName);
+                            transactionHistory.add(new Connection(nodeId, connectionName, false));
                         } else {
                             processErrorMessage("Unable to post Roadm-connection for node " + nodeId, forkJoinPool,
                                     results);
@@ -269,7 +356,7 @@ public class DeviceRendererServiceImpl implements DeviceRendererService {
             LOG.warn("Failed to write topologies for service {}.", input.getServiceName(), e);
         }
         if (!alarmSuppressionNodeRemoval(input.getServiceName())) {
-            LOG.error("Alarm suppresion node removal failed!!!!");
+            LOG.error("Alarm suppression node removal failed!!!!");
         }
         return new ServicePathOutputBuilder()
                 .setNodeInterface(nodeInterfaces)
@@ -399,11 +486,11 @@ public class DeviceRendererServiceImpl implements DeviceRendererService {
                 ? Map.of(
                     // We don't need ODUC2, ODUC3 here, since they are handled in OTN service-path
                     // This has to be in an order of deletion
-                    "ODU",  List.of("ODU4", "ODUFLEX", "ODUC4"),
+                    "ODU",  List.of("ODU4", "ODUFLEX", "ODUC4", "ODUC1"),
                     // Add intermediate OTUCn rates (OTUC2, OTUC3)
                     // OTU4 is used in 100G service on 7.1 model
-                    "other", List.of("OTU4", "OTUC2", "OTUC3", "OTUC4",
-                    "OTSIGROUP-400G", "OTSIGROUP-300G",  "OTSIGROUP-200G",
+                    "other", List.of("OTU4", "OTUC1", "OTUC2", "OTUC3", "OTUC4",
+                    "OTSIGROUP-400G", "OTSIGROUP-300G",  "OTSIGROUP-200G", "OTSIGROUP-100G",
                     spectralSlotName))
                 : Map.of(
                     "ODU", List.of("ODU", "ODU4"),
@@ -413,57 +500,57 @@ public class DeviceRendererServiceImpl implements DeviceRendererService {
         // common GridConstant that states NAME_PARAMETERS_SEPARATOR = "-"
 
         if (destTp.contains(StringConstants.NETWORK_TOKEN)) {
-            try {
-                for (String suffix : suffixListMap.get("ODU")) {
-                    if (this.openRoadmInterfaces.getInterface(
-                            nodeId, String.join(GridConstant.NAME_PARAMETERS_SEPARATOR, destTp, suffix)).isPresent()) {
-                        interfacesToDelete.add(String.join(GridConstant.NAME_PARAMETERS_SEPARATOR, destTp, suffix));
-                    }
-                }
-            }
-            catch (OpenRoadmInterfaceException e) {
-                LOG.error("impossible to get one of the interfaces {}",
-                    destTp + GridConstant.NAME_PARAMETERS_SEPARATOR + String.join(
-                        " or " + destTp + GridConstant.NAME_PARAMETERS_SEPARATOR,
-                        suffixListMap.get("ODU")),
-                    e);
-            }
-            try {
-                for (String suffix : suffixListMap.get("other")) {
-                    if (this.openRoadmInterfaces.getInterface(
-                        nodeId, String.join(GridConstant.NAME_PARAMETERS_SEPARATOR, destTp, suffix)).isPresent()) {
-                        LOG.info("Deleting the interface {}",
-                            String.join(GridConstant.NAME_PARAMETERS_SEPARATOR, destTp, suffix));
-                        interfacesToDelete.add(String.join(GridConstant.NAME_PARAMETERS_SEPARATOR, destTp, suffix));
-                    }
-                }
-            }
-            catch (OpenRoadmInterfaceException e) {
-                LOG.error("impossible to get one of the interfaces {}",
-                    destTp + GridConstant.NAME_PARAMETERS_SEPARATOR + String.join(
-                        " or " + destTp + GridConstant.NAME_PARAMETERS_SEPARATOR,
-                        suffixListMap.get("ODU")),
-                    e);
-            }
+            interfacesToDelete.addAll(inf2Del(destTp, suffixListMap, nodeId));
         }
         if (srcTp.contains(StringConstants.NETWORK_TOKEN)) {
-            interfacesToDelete.add(
-                    String.join(GridConstant.NAME_PARAMETERS_SEPARATOR, srcTp, suffixListMap.get("ODU").get(0)));
-            for (String suffix : suffixListMap.get("other")) {
-                interfacesToDelete.add(String.join(GridConstant.NAME_PARAMETERS_SEPARATOR, srcTp, suffix));
-            }
+            // For a regen case, the srcTp can also contain the network-token
+            interfacesToDelete.addAll(inf2Del(srcTp, suffixListMap, nodeId));
         }
-
         if (srcTp.contains(StringConstants.CLIENT_TOKEN)) {
             interfacesToDelete.add(String.join(GridConstant.NAME_PARAMETERS_SEPARATOR, srcTp, "ETHERNET"));
         }
         if (destTp.contains(StringConstants.CLIENT_TOKEN)) {
-
             interfacesToDelete.add(String.join(GridConstant.NAME_PARAMETERS_SEPARATOR, destTp, "ETHERNET"));
         }
         return interfacesToDelete;
     }
 
+    private List<String> inf2Del(String termPoint, Map<String, List<String>> suffixListMap, String nodeId) {
+        List<String> inf2Del = new LinkedList<>();
+        try {
+            for (String suffix : suffixListMap.get("ODU")) {
+                if (this.openRoadmInterfaces.getInterface(
+                        nodeId, String.join(GridConstant.NAME_PARAMETERS_SEPARATOR, termPoint, suffix)).isPresent()) {
+                    inf2Del.add(String.join(GridConstant.NAME_PARAMETERS_SEPARATOR, termPoint, suffix));
+                }
+            }
+        }
+        catch (OpenRoadmInterfaceException e) {
+            LOG.error("impossible to get one of the interfaces {}",
+                    termPoint + GridConstant.NAME_PARAMETERS_SEPARATOR + String.join(
+                            " or " + termPoint + GridConstant.NAME_PARAMETERS_SEPARATOR,
+                            suffixListMap.get("ODU")),
+                    e);
+        }
+        try {
+            for (String suffix : suffixListMap.get("other")) {
+                if (this.openRoadmInterfaces.getInterface(
+                        nodeId, String.join(GridConstant.NAME_PARAMETERS_SEPARATOR, termPoint, suffix)).isPresent()) {
+                    LOG.info("Deleting the interface {}",
+                            String.join(GridConstant.NAME_PARAMETERS_SEPARATOR, termPoint, suffix));
+                    inf2Del.add(String.join(GridConstant.NAME_PARAMETERS_SEPARATOR, termPoint, suffix));
+                }
+            }
+        }
+        catch (OpenRoadmInterfaceException e) {
+            LOG.error("impossible to get one of the interfaces {}",
+                    termPoint + GridConstant.NAME_PARAMETERS_SEPARATOR + String.join(
+                            " or " + termPoint + GridConstant.NAME_PARAMETERS_SEPARATOR,
+                            suffixListMap.get("ODU")),
+                    e);
+        }
+        return inf2Del;
+    }
 
 
     @Override
@@ -471,7 +558,7 @@ public class DeviceRendererServiceImpl implements DeviceRendererService {
         boolean success = true;
         Map<FailedToRollbackKey,FailedToRollback> failedToRollbackList = new HashMap<>();
         for (NodeInterface nodeInterfaces : input.nonnullNodeInterface().values()) {
-            List<String> failedInterfaces = new ArrayList<>();
+            Set<String> failedInterfaces = new HashSet<>();
             String nodeId = nodeInterfaces.getNodeId();
             for (String connectionId : nodeInterfaces.getConnectionId()) {
                 List<String> listInter = this.crossConnect.deleteCrossConnect(nodeId, connectionId, false);
@@ -523,6 +610,26 @@ public class DeviceRendererServiceImpl implements DeviceRendererService {
                 .build();
     }
 
+    @Override
+    public RendererRollbackOutput rendererRollback(History transactionHistory) {
+        LOG.info("Rolling back...");
+
+        Result rollbackResult = new FailedRollbackResult();
+        Subscriber deleteSubscriber = new DeleteSubscriber(rollbackResult);
+
+        transactionHistory.rollback(
+                new DeleteService(
+                        crossConnect,
+                        openRoadmInterfaces,
+                        deleteSubscriber
+                )
+        );
+
+        LOG.info("Rollback done!");
+
+        return rollbackResult.renderRollbackOutput();
+    }
+
     private boolean alarmSuppressionNodeRegistration(ServicePathInput input) {
         Map<org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.alarmsuppression.rev171102.service
                 .nodelist.nodelist.NodesKey,
@@ -597,7 +704,7 @@ public class DeviceRendererServiceImpl implements DeviceRendererService {
         }
         if (services.isPresent()) {
             LOG.info("service {} already exists", name);
-            servicesBuilder = new ServicesBuilder(services.get()).setTopology(topo);
+            servicesBuilder = new ServicesBuilder(services.orElseThrow()).setTopology(topo);
             WriteTransaction writeTx = this.dataBroker.newWriteOnlyTransaction();
             writeTx.merge(LogicalDatastoreType.OPERATIONAL, iid, servicesBuilder.build());
             writeTx.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS);
@@ -606,7 +713,7 @@ public class DeviceRendererServiceImpl implements DeviceRendererService {
         }
     }
 
-    @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+    @SuppressFBWarnings(
         value = "SLF4J_FORMAT_SHOULD_BE_CONST",
         justification = "Log messages content needs to be formatted before"
             + "since they are used in the returned object")
index 1384a7b1fbb8d1710cd6a5f70079bc556f0848ac..38869e9afe8b8efc27892229fbf9ec0093be746f 100644 (file)
@@ -10,9 +10,9 @@ package org.opendaylight.transportpce.renderer.provisiondevice;
 import java.util.Collections;
 import java.util.List;
 import org.opendaylight.transportpce.common.OperationResult;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.link.tp.LinkTp;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.node.interfaces.NodeInterface;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.optical.renderer.nodes.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.link.tp.LinkTp;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.node.interfaces.NodeInterface;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.optical.renderer.nodes.Nodes;
 
 public final class DeviceRenderingResult extends OperationResult {
 
index 7e7bbd9550dcb1ca367f8fb2bdfee3b137fe2efb..345c7807ebf2089ce57fb423dcfaf13b3bcc3249 100644 (file)
@@ -10,10 +10,12 @@ package org.opendaylight.transportpce.renderer.provisiondevice;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.Set;
 import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ExecutionException;
@@ -23,26 +25,31 @@ import java.util.concurrent.atomic.AtomicBoolean;
 import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
+import org.opendaylight.transportpce.common.mapping.MappingUtils;
+import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces;
-import org.opendaylight.transportpce.networkmodel.service.NetworkModelService;
 import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterfaceFactory;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.OtnServicePathInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.OtnServicePathOutput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.OtnServicePathOutputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.az.api.info.AEndApiInfo;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.az.api.info.ZEndApiInfo;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev200327.OpucnTribSlotDef;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.link.tp.LinkTp;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.link.tp.LinkTpBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.node.interfaces.NodeInterface;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.node.interfaces.NodeInterfaceBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.node.interfaces.NodeInterfaceKey;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.otn.renderer.nodes.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OpucnTribSlotDef;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.link.tp.LinkTp;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.link.tp.LinkTpBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.node.interfaces.NodeInterface;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.node.interfaces.NodeInterfaceBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.node.interfaces.NodeInterfaceKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.otn.renderer.nodes.Nodes;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 
+@Component
 public class OtnDeviceRendererServiceImpl implements OtnDeviceRendererService {
     private static final Logger LOG = LoggerFactory.getLogger(OtnDeviceRendererServiceImpl.class);
     private static final String PT_03 = "03";
@@ -51,17 +58,17 @@ public class OtnDeviceRendererServiceImpl implements OtnDeviceRendererService {
     private final CrossConnect crossConnect;
     private final OpenRoadmInterfaces openRoadmInterfaces;
     private final DeviceTransactionManager deviceTransactionManager;
-    private final NetworkModelService networkModelService;
 
-    public OtnDeviceRendererServiceImpl(OpenRoadmInterfaceFactory openRoadmInterfaceFactory, CrossConnect crossConnect,
-                                        OpenRoadmInterfaces openRoadmInterfaces,
-                                        DeviceTransactionManager deviceTransactionManager,
-                                        NetworkModelService networkModelService) {
-        this.openRoadmInterfaceFactory = openRoadmInterfaceFactory;
+    @Activate
+    public OtnDeviceRendererServiceImpl(@Reference CrossConnect crossConnect,
+            @Reference OpenRoadmInterfaces openRoadmInterfaces,
+            @Reference DeviceTransactionManager deviceTransactionManager,
+            @Reference MappingUtils mappingUtils,
+            @Reference PortMapping portMapping) {
         this.crossConnect = crossConnect;
         this.openRoadmInterfaces = openRoadmInterfaces;
         this.deviceTransactionManager = deviceTransactionManager;
-        this.networkModelService = networkModelService;
+        this.openRoadmInterfaceFactory = new OpenRoadmInterfaceFactory(mappingUtils, portMapping, openRoadmInterfaces);
     }
 
 //TODO Align log messages and returned results messages
@@ -329,8 +336,8 @@ public class OtnDeviceRendererServiceImpl implements OtnDeviceRendererService {
                 apiInfoZ = input.getZEndApiInfo();
             }
             // check if the node is mounted or not?
-            List<String> createdEthInterfaces = new ArrayList<>();
-            List<String> createdOduInterfaces = new ArrayList<>();
+            Set<String> createdEthInterfaces = new HashSet<>();
+            Set<String> createdOduInterfaces = new HashSet<>();
             switch (input.getServiceRate().intValue()) {
                 case 1:
                     LOG.info("Input service is 1G");
@@ -366,15 +373,15 @@ public class OtnDeviceRendererServiceImpl implements OtnDeviceRendererService {
                         createdEthInterfaces.add(openRoadmInterfaceFactory.createOpenRoadmEth10GInterface(
                             node.getNodeId(), node.getClientTp()));
                         createdOduInterfaces.add(
-                            // suppporting interface?, payload ?
+                            // supporting interface?, payload ?
                             openRoadmInterfaceFactory.createOpenRoadmOdu2eInterface(node.getNodeId(),
-                                node.getClientTp(),  false, input.getTribPortNumber(),
+                                node.getClientTp(),  input.getServiceName(), false, input.getTribPortNumber(),
                                 input.getTribSlot(), apiInfoA, apiInfoZ, PT_03));
                     }
                     createdOduInterfaces.add(
                         // supporting interface? payload ?
                         openRoadmInterfaceFactory.createOpenRoadmOdu2eInterface(node.getNodeId(), node.getNetworkTp(),
-                             true, input.getTribPortNumber(), input.getTribSlot(), null,
+                             input.getServiceName(), true, input.getTribPortNumber(), input.getTribSlot(), null,
                             null, null));
                     linkTpList.add(
                         new LinkTpBuilder().setNodeId(node.getNodeId()).setTpId(node.getNetworkTp()).build());
@@ -382,7 +389,7 @@ public class OtnDeviceRendererServiceImpl implements OtnDeviceRendererService {
                         createdOduInterfaces.add(
                             // supporting interface? payload ?
                             openRoadmInterfaceFactory.createOpenRoadmOdu2eInterface(node.getNodeId(),
-                                node.getNetwork2Tp(), true, input.getTribPortNumber(),
+                                node.getNetwork2Tp(), input.getServiceName(),true, input.getTribPortNumber(),
                                 input.getTribSlot(), null, null, null));
                         linkTpList.add(
                             new LinkTpBuilder().setNodeId(node.getNodeId()).setTpId(node.getNetworkTp()).build());
@@ -392,10 +399,10 @@ public class OtnDeviceRendererServiceImpl implements OtnDeviceRendererService {
                     LOG.info("Input service is 100G");
                     // Take the first and last value in the list of OpucnTribSlot (assuming SH would provide
                     // min and max value only, size two)
-                    OpucnTribSlotDef minOpucnTs = OpucnTribSlotDef.getDefaultInstance(
-                        input.getOpucnTribSlots().get(0).getValue());
-                    OpucnTribSlotDef maxOpucnTs = OpucnTribSlotDef.getDefaultInstance(
-                        input.getOpucnTribSlots().get(1).getValue());
+                    OpucnTribSlotDef minOpucnTs = input.getOpucnTribSlots().stream()
+                        .min((ts1, ts2) -> ts1.getValue().compareTo(ts2.getValue())).orElseThrow();
+                    OpucnTribSlotDef maxOpucnTs = input.getOpucnTribSlots().stream()
+                        .max((ts1, ts2) -> ts1.getValue().compareTo(ts2.getValue())).orElseThrow();
                     if (node.getClientTp() != null) {
                         createdEthInterfaces.add(openRoadmInterfaceFactory.createOpenRoadmEth100GInterface(
                             node.getNodeId(), node.getClientTp()));
@@ -429,10 +436,10 @@ public class OtnDeviceRendererServiceImpl implements OtnDeviceRendererService {
             }
 
             // implement cross connect
-            List<String> createdConnections = new ArrayList<>();
+            Set<String> createdConnections = new HashSet<>();
             if (!createdOduInterfaces.isEmpty()) {
-                Optional<String> connectionNameOpt = postCrossConnect(createdOduInterfaces, node);
-                createdConnections.add(connectionNameOpt.get());
+                Optional<String> connectionNameOpt = postCrossConnect(new ArrayList<>(createdOduInterfaces), node);
+                createdConnections.add(connectionNameOpt.orElseThrow());
                 LOG.info("Created cross connects");
             }
             nodeInterfaces.add(new NodeInterfaceBuilder()
@@ -457,8 +464,8 @@ public class OtnDeviceRendererServiceImpl implements OtnDeviceRendererService {
                 apiInfoZ = input.getZEndApiInfo();
             }
             // check if the node is mounted or not?
-            List<String> createdEthInterfaces = new ArrayList<>();
-            List<String> createdOduInterfaces = new ArrayList<>();
+            Set<String> createdEthInterfaces = new HashSet<>();
+            Set<String> createdOduInterfaces = new HashSet<>();
             switch (input.getServiceRate().intValue()) {
                 case 100:
                     LOG.info("Input service is 100G");
@@ -493,10 +500,10 @@ public class OtnDeviceRendererServiceImpl implements OtnDeviceRendererService {
             }
 
             // implement cross connect
-            List<String> createdConnections = new ArrayList<>();
+            Set<String> createdConnections = new HashSet<>();
             if (createdOduInterfaces.size() == 2) {
-                Optional<String> connectionNameOpt = postCrossConnect(createdOduInterfaces, node);
-                createdConnections.add(connectionNameOpt.get());
+                Optional<String> connectionNameOpt = postCrossConnect(new ArrayList<>(createdOduInterfaces), node);
+                createdConnections.add(connectionNameOpt.orElseThrow());
                 LOG.info("Created cross connects");
             }
             nodeInterfaces.add(new NodeInterfaceBuilder()
@@ -552,7 +559,7 @@ public class OtnDeviceRendererServiceImpl implements OtnDeviceRendererService {
             nodeInterfaces.add(new NodeInterfaceBuilder()
                     .withKey(new NodeInterfaceKey(node.getNodeId()))
                     .setNodeId(node.getNodeId())
-                    .setOduInterfaceId(List.of(
+                    .setOduInterfaceId(Set.of(
                         // though this is odu, actually it has ODUCn interfaces
                         openRoadmInterfaceFactory.createOpenRoadmOtnOducnInterface(node.getNodeId(),
                             node.getNetworkTp(), supportingOtuInterface, tgtNode.getNodeId(), tgtNode.getNetworkTp())))
index 9da2e9d1b4e388fc507cd9717ecb9aff611448bf..4f07706a4ce8d1ce797b938c4f6f7dd5e016daf4 100644 (file)
@@ -11,8 +11,8 @@ package org.opendaylight.transportpce.renderer.provisiondevice;
 import java.util.Collections;
 import java.util.List;
 import org.opendaylight.transportpce.common.OperationResult;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.link.tp.LinkTp;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.node.interfaces.NodeInterface;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.link.tp.LinkTp;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.node.interfaces.NodeInterface;
 
 public final class OtnDeviceRenderingResult extends OperationResult {
     private final List<NodeInterface> renderedNodeInterfaces;
index e71e4fce63743f4532a59f28697ba830b641ef52..1cd8a9bca7456995f8370f04fc5bc557f474b3ac 100644 (file)
@@ -12,11 +12,12 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteOutput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
 
 public interface RendererServiceOperations {
 
-    ListenableFuture<ServiceImplementationRequestOutput> serviceImplementation(ServiceImplementationRequestInput input);
+    ListenableFuture<ServiceImplementationRequestOutput> serviceImplementation(ServiceImplementationRequestInput input,
+                                                                               boolean isTempService);
 
     ListenableFuture<ServiceDeleteOutput> serviceDelete(ServiceDeleteInput input, Services service);
 }
index 6a854453c27ad4393cee864e1fca4328e801b57c..c9993e2292802ccde8268bca219ea3106a889ca4 100644 (file)
@@ -11,10 +11,12 @@ import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.common.util.concurrent.MoreExecutors;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.Set;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executors;
@@ -22,7 +24,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.stream.Collectors;
 import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.mdsal.binding.api.RpcService;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.ResponseCodes;
 import org.opendaylight.transportpce.common.StringConstants;
@@ -31,24 +33,29 @@ import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.service.ServiceTypes;
 import org.opendaylight.transportpce.renderer.ModelMappingUtils;
 import org.opendaylight.transportpce.renderer.ServicePathInputData;
+import org.opendaylight.transportpce.renderer.provisiondevice.notification.Notification;
 import org.opendaylight.transportpce.renderer.provisiondevice.servicepath.ServicePathDirection;
 import org.opendaylight.transportpce.renderer.provisiondevice.tasks.DeviceRenderingRollbackTask;
 import org.opendaylight.transportpce.renderer.provisiondevice.tasks.DeviceRenderingTask;
+import org.opendaylight.transportpce.renderer.provisiondevice.tasks.NetworkDeviceRenderingRollbackTask;
 import org.opendaylight.transportpce.renderer.provisiondevice.tasks.OlmPowerSetupRollbackTask;
 import org.opendaylight.transportpce.renderer.provisiondevice.tasks.OlmPowerSetupTask;
+import org.opendaylight.transportpce.renderer.provisiondevice.tasks.OlmPowerTurnDownTask;
 import org.opendaylight.transportpce.renderer.provisiondevice.tasks.OtnDeviceRenderingTask;
 import org.opendaylight.transportpce.renderer.provisiondevice.tasks.RollbackProcessor;
+import org.opendaylight.transportpce.renderer.provisiondevice.tasks.RollbackResultMessage;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.history.History;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.history.TransactionHistory;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.Action;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.OtnServicePathInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.OtnLinkType;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPm;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmInputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetup;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.TransportpceOlmService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndown;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.get.pm.output.Measurements;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.RendererRpcResultSp;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.RendererRpcResultSpBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteOutput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestInput;
@@ -58,27 +65,29 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.renderer.rpc.result.sp.Link;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.renderer.rpc.result.sp.LinkBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.PmGranularity;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev161014.ResourceTypeEnum;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.PathDescription;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.PathDescription;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.RpcStatusEx;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.ServicePathNotificationTypes;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.ServicePathList;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePaths;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePathsKey;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.link.tp.LinkTp;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.olm.get.pm.input.ResourceIdentifierBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.optical.renderer.nodes.Nodes;
-import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.OtnLinkType;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.PmGranularity;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.link.tp.LinkTp;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.olm.get.pm.input.ResourceIdentifierBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.optical.renderer.nodes.Nodes;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.Notification;
 import org.opendaylight.yangtools.yang.common.Uint32;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 
+@Component(immediate = true)
 public class RendererServiceOperationsImpl implements RendererServiceOperations {
 
     private static final Logger LOG = LoggerFactory.getLogger(RendererServiceOperationsImpl.class);
@@ -88,36 +97,42 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
             "OLM power setup was not successful! Rendering and OLM will be rolled back.";
     private static final String RENDERING_DEVICES_A_Z_MSG = "Rendering devices A-Z";
     private static final String RENDERING_DEVICES_Z_A_MSG = "Rendering device Z-A";
-    private static final String TURNING_DOWN_POWER_ON_A_TO_Z_PATH_MSG = "Turning down power on A-to-Z path";
-    private static final String FAILED = "Failed";
+    private static final String ATOZPATH = "A-to-Z";
+    private static final String ZTOAPATH = "Z-to-A";
     private static final String OPERATION_FAILED = "Operation Failed";
     private static final String OPERATION_SUCCESSFUL = "Operation Successful";
     private static final int NUMBER_OF_THREADS = 4;
 
     private final DeviceRendererService deviceRenderer;
     private final OtnDeviceRendererService otnDeviceRenderer;
-    private final TransportpceOlmService olmService;
     private final DataBroker dataBroker;
-    private final NotificationPublishService notificationPublishService;
+    private final Notification notification;
     private final PortMapping portMapping;
+    private final RpcService rpcService;
     private ListeningExecutorService executor;
 
-    public RendererServiceOperationsImpl(DeviceRendererService deviceRenderer,
-            OtnDeviceRendererService otnDeviceRenderer, TransportpceOlmService olmService,
-            DataBroker dataBroker, NotificationPublishService notificationPublishService, PortMapping portMapping) {
+    @Activate
+    public RendererServiceOperationsImpl(@Reference DeviceRendererService deviceRenderer,
+            @Reference OtnDeviceRendererService otnDeviceRenderer,
+            @Reference DataBroker dataBroker,
+            @Reference Notification notification,
+            @Reference PortMapping portMapping,
+            @Reference RpcService rpcService) {
         this.deviceRenderer = deviceRenderer;
         this.otnDeviceRenderer = otnDeviceRenderer;
-        this.olmService = olmService;
         this.dataBroker = dataBroker;
-        this.notificationPublishService = notificationPublishService;
+        this.notification = notification;
         this.portMapping = portMapping;
+        this.rpcService = rpcService;
         this.executor = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(NUMBER_OF_THREADS));
+        LOG.debug("RendererServiceOperationsImpl instantiated");
     }
 
     @Override
     public ListenableFuture<ServiceImplementationRequestOutput>
-            serviceImplementation(ServiceImplementationRequestInput input) {
+            serviceImplementation(ServiceImplementationRequestInput input, boolean isTempService) {
         LOG.info("Calling service impl request {}", input.getServiceName());
+        LOG.debug("Check if it is temp-service {}", isTempService);
         return executor.submit(new Callable<ServiceImplementationRequestOutput>() {
 
             @Override
@@ -129,7 +144,7 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
                     "Service compliant, submitting service implementation Request ...");
                 Uint32 serviceRate = getServiceRate(input);
                 LOG.info("Using {}G rate", serviceRate);
-                org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316
+                org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221
                         .network.Nodes mappingNode =
                     portMapping.isNodeExist(input.getServiceAEnd().getNodeId())
                         ? portMapping.getNode(input.getServiceAEnd().getNodeId())
@@ -153,7 +168,8 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
                     case StringConstants.SERVICE_TYPE_OTUC2:
                     case StringConstants.SERVICE_TYPE_OTUC3:
                     case StringConstants.SERVICE_TYPE_OTUC4:
-                        if (!manageServicePathCreation(input, serviceType)) {
+                        LOG.debug("Check temp service {}", isTempService);
+                        if (!manageServicePathCreation(input, serviceType, isTempService)) {
                             return ModelMappingUtils
                                 .createServiceImplResponse(ResponseCodes.RESPONSE_FAILED, OPERATION_FAILED);
                         }
@@ -210,21 +226,21 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
                     return ModelMappingUtils
                         .createServiceDeleteResponse(ResponseCodes.RESPONSE_FAILED, OPERATION_FAILED);
                 }
-                PathDescription pathDescription = pathDescriptionOpt.get();
+                PathDescription pathDescription = pathDescriptionOpt.orElseThrow();
                 String serviceType =
                     ServiceTypes.getServiceType(
                         service.getServiceAEnd().getServiceFormat().getName(),
                         service.getServiceAEnd().getServiceRate(),
                         service.getServiceAEnd().getTxDirection() == null
-                                || service.getServiceAEnd().getTxDirection().values().stream().findFirst().get()
+                                || service.getServiceAEnd().getTxDirection().values().stream().findFirst().orElseThrow()
                                     .getPort() == null
-                                || service.getServiceAEnd().getTxDirection().values().stream().findFirst().get()
+                                || service.getServiceAEnd().getTxDirection().values().stream().findFirst().orElseThrow()
                                     .getPort().getPortName() == null
                             ? null
                             : portMapping.getMapping(
                                     service.getServiceAEnd().getNodeId().getValue(),
-                                    service.getServiceAEnd().getTxDirection().values().stream().findFirst().get()
-                                        .getPort().getPortName()));
+                                    service.getServiceAEnd().getTxDirection().values().stream().findFirst()
+                                        .orElseThrow().getPort().getPortName()));
                 switch (serviceType) {
                     case StringConstants.SERVICE_TYPE_100GE_T:
                     case StringConstants.SERVICE_TYPE_400GE:
@@ -261,7 +277,7 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
         });
     }
 
-    @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+    @SuppressFBWarnings(
         value = "UPM_UNCALLED_PRIVATE_METHOD",
         justification = "call in call() method")
     private Uint32 getServiceRate(ServiceImplementationRequestInput input) {
@@ -293,8 +309,8 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
         }
         String serviceName =
             ServiceFormat.OTU.getName().equals(input.getServiceAEnd().getServiceFormat().getName())
-                ? input.getServiceAEnd().getOtuServiceRate().getSimpleName()
-                : input.getServiceAEnd().getOduServiceRate().getSimpleName();
+                ? input.getServiceAEnd().getOtuServiceRate().toString().split("\\{")[0]
+                : input.getServiceAEnd().getOduServiceRate().toString().split("\\{")[0];
         if (!formatRateMap.get(input.getServiceAEnd().getServiceFormat()).containsKey(serviceName)) {
             LOG.warn("Unable to get service-rate for service {} - unsupported service name {}",
                 input.getServiceName(), serviceName);
@@ -305,20 +321,7 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
             .get(serviceName);
     }
 
-    @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
-            value = "UPM_UNCALLED_PRIVATE_METHOD",
-            justification = "call in call() method")
-    private ServicePowerTurndownOutput olmPowerTurndown(ServicePathInputData servicePathInputData)
-            throws InterruptedException, ExecutionException, TimeoutException {
-        LOG.debug(TURNING_DOWN_POWER_ON_A_TO_Z_PATH_MSG);
-        return this.olmService
-            .servicePowerTurndown(
-                new ServicePowerTurndownInputBuilder(servicePathInputData.getServicePathInput()).build())
-            .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS)
-            .getResult();
-    }
-
-    @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+    @SuppressFBWarnings(
             value = "UPM_UNCALLED_PRIVATE_METHOD",
             justification = "call in call() method")
     private Optional<org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118
@@ -341,7 +344,7 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
         }
     }
 
-    @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+    @SuppressFBWarnings(
             value = "UPM_UNCALLED_PRIVATE_METHOD",
             justification = "call in call() method")
     private List<DeviceRenderingResult> deviceRendering(
@@ -357,9 +360,12 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
             servicePathDataAtoZ.getServicePathInput().getServiceName(),
             RpcStatusEx.Pending,
             RENDERING_DEVICES_A_Z_MSG);
+
+        History transactionHistory = new TransactionHistory();
         ListenableFuture<DeviceRenderingResult> atozrenderingFuture =
             this.executor.submit(
-                new DeviceRenderingTask(this.deviceRenderer, servicePathDataAtoZ, ServicePathDirection.A_TO_Z));
+                new DeviceRenderingTask(this.deviceRenderer, servicePathDataAtoZ, ServicePathDirection.A_TO_Z,
+                        transactionHistory));
 
         LOG.info(RENDERING_DEVICES_Z_A_MSG);
         sendNotifications(
@@ -369,7 +375,8 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
             RENDERING_DEVICES_Z_A_MSG);
         ListenableFuture<DeviceRenderingResult> ztoarenderingFuture =
             this.executor.submit(
-                new DeviceRenderingTask(this.deviceRenderer, servicePathDataZtoA, ServicePathDirection.Z_TO_A));
+                new DeviceRenderingTask(this.deviceRenderer, servicePathDataZtoA, ServicePathDirection.Z_TO_A,
+                        transactionHistory));
 
         ListenableFuture<List<DeviceRenderingResult>> renderingCombinedFuture =
             Futures.allAsList(atozrenderingFuture, ztoarenderingFuture);
@@ -390,20 +397,19 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
         }
 
         rollbackProcessor.addTask(
-            new DeviceRenderingRollbackTask(
-                "AtoZDeviceTask",
-                ! renderingResults.get(0).isSuccess(),
-                renderingResults.get(0).getRenderedNodeInterfaces(),
-                this.deviceRenderer));
-        rollbackProcessor.addTask(
-                new DeviceRenderingRollbackTask("ZtoADeviceTask",
-                ! renderingResults.get(1).isSuccess(),
-                renderingResults.get(1).getRenderedNodeInterfaces(),
-                this.deviceRenderer));
+            new NetworkDeviceRenderingRollbackTask(
+                "RollbackTransactionHistoryTask",
+                transactionHistory,
+                ! (renderingResults.get(0).isSuccess() && renderingResults.get(1).isSuccess()),
+                deviceRenderer,
+                new RollbackResultMessage()
+            )
+        );
+
         return renderingResults;
     }
 
-    @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+    @SuppressFBWarnings(
         value = "UPM_UNCALLED_PRIVATE_METHOD",
         justification = "call in call() method")
     private List<OtnDeviceRenderingResult> otnDeviceRendering(
@@ -461,37 +467,43 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
         return otnRenderingResults;
     }
 
-    @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+    @SuppressFBWarnings(
             value = "UPM_UNCALLED_PRIVATE_METHOD",
             justification = "call in call() method")
     private void olmPowerSetup(
             RollbackProcessor rollbackProcessor,
             ServicePowerSetupInput powerSetupInputAtoZ,
-            ServicePowerSetupInput powerSetupInputZtoA) {
+            ServicePowerSetupInput powerSetupInputZtoA, boolean isTempService) {
 
         //TODO olmPowerSetupFutureAtoZ & olmPowerSetupFutureZtoA & olmFutures used only once
         //     Do notifications & LOG.info deserve this ?
         //TODO use constants for LOG.info & notifications common messages
+        // if the service create is a temp-service, OLM will be skipped
+        if (isTempService) {
+            LOG.info("For temp-service create OLM is not computed and skipped");
+            return;
+        }
         LOG.info("Olm power setup A-Z");
         sendNotifications(
-            ServicePathNotificationTypes.ServiceImplementationRequest,
-            powerSetupInputAtoZ.getServiceName(),
-            RpcStatusEx.Pending,
-            "Olm power setup A-Z");
+                ServicePathNotificationTypes.ServiceImplementationRequest,
+                powerSetupInputAtoZ.getServiceName(),
+                RpcStatusEx.Pending,
+                "Olm power setup A-Z");
         ListenableFuture<OLMRenderingResult> olmPowerSetupFutureAtoZ =
-            this.executor.submit(new OlmPowerSetupTask(this.olmService, powerSetupInputAtoZ));
+                this.executor.submit(
+                    new OlmPowerSetupTask(rpcService.getRpc(ServicePowerSetup.class), powerSetupInputAtoZ));
 
         LOG.info("OLM power setup Z-A");
         sendNotifications(
-            ServicePathNotificationTypes.ServiceImplementationRequest,
-            powerSetupInputAtoZ.getServiceName(),
-            RpcStatusEx.Pending,
-            "Olm power setup Z-A");
+                ServicePathNotificationTypes.ServiceImplementationRequest,
+                powerSetupInputAtoZ.getServiceName(),
+                RpcStatusEx.Pending,
+                "Olm power setup Z-A");
         ListenableFuture<OLMRenderingResult> olmPowerSetupFutureZtoA =
-            this.executor.submit(new OlmPowerSetupTask(this.olmService, powerSetupInputZtoA));
-
+                this.executor.submit(
+                    new OlmPowerSetupTask(rpcService.getRpc(ServicePowerSetup.class), powerSetupInputZtoA));
         ListenableFuture<List<OLMRenderingResult>> olmFutures =
-            Futures.allAsList(olmPowerSetupFutureAtoZ, olmPowerSetupFutureZtoA);
+                Futures.allAsList(olmPowerSetupFutureAtoZ, olmPowerSetupFutureZtoA);
 
         List<OLMRenderingResult> olmResults;
         try {
@@ -500,36 +512,35 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
         } catch (InterruptedException | ExecutionException | TimeoutException e) {
             LOG.warn(OLM_ROLL_BACK_MSG, e);
             sendNotifications(
-                ServicePathNotificationTypes.ServiceImplementationRequest,
-                powerSetupInputAtoZ.getServiceName(),
-                RpcStatusEx.Pending,
-                OLM_ROLL_BACK_MSG);
+                    ServicePathNotificationTypes.ServiceImplementationRequest,
+                    powerSetupInputAtoZ.getServiceName(),
+                    RpcStatusEx.Pending,
+                    OLM_ROLL_BACK_MSG);
             rollbackProcessor.addTask(
-                new OlmPowerSetupRollbackTask("AtoZOLMTask", true, this.olmService, powerSetupInputAtoZ));
+                    new OlmPowerSetupRollbackTask("AtoZOLMTask", true, rpcService.getRpc(ServicePowerTurndown.class),
+                        powerSetupInputAtoZ));
             rollbackProcessor.addTask(
-                new OlmPowerSetupRollbackTask("ZtoAOLMTask", true, this.olmService, powerSetupInputZtoA));
+                    new OlmPowerSetupRollbackTask("ZtoAOLMTask", true, rpcService.getRpc(ServicePowerTurndown.class),
+                        powerSetupInputZtoA));
             return;
         }
-
-        rollbackProcessor.addTask(
-            new OlmPowerSetupRollbackTask(
-                "AtoZOLMTask",
-                ! olmResults.get(0).isSuccess(),
-                this.olmService,
+        rollbackProcessor.addTask(new OlmPowerSetupRollbackTask(
+                "AtoZOLMTask", !olmResults.get(0).isSuccess(), rpcService.getRpc(ServicePowerTurndown.class),
                 powerSetupInputAtoZ));
-        rollbackProcessor.addTask(
-            new OlmPowerSetupRollbackTask(
-                "ZtoAOLMTask",
-                ! olmResults.get(1).isSuccess(),
-                this.olmService,
+        rollbackProcessor.addTask(new OlmPowerSetupRollbackTask(
+                "ZtoAOLMTask", !olmResults.get(1).isSuccess(), rpcService.getRpc(ServicePowerTurndown.class),
                 powerSetupInputZtoA));
     }
 
-    @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+    @SuppressFBWarnings(
             value = "UPM_UNCALLED_PRIVATE_METHOD",
             justification = "call in call() method")
     private boolean isServiceActivated(String nodeId, String tpId) {
         LOG.info("Starting service activation test on node {} and tp {}", nodeId, tpId);
+        if (!NodeTypes.Xpdr.equals(portMapping.getNode(nodeId).getNodeInfo().getNodeType())) {
+            LOG.info("Device {} is not xponder, can't verify PreFEC", nodeId);
+            return true;
+        }
         for (int i = 0; i < 3; i++) {
             List<Measurements> measurements = getMeasurements(nodeId, tpId);
             if (measurements == null) {
@@ -551,9 +562,7 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
 
     private List<Measurements> getMeasurements(String nodeId, String tp) {
         try {
-            GetPmOutput getPmOutput =
-                this.olmService
-                    .getPm(
+            GetPmOutput getPmOutput = rpcService.getRpc(GetPm.class).invoke(
                         new GetPmInputBuilder()
                             .setNodeId(nodeId)
                             .setGranularity(PmGranularity._15min)
@@ -608,10 +617,11 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
         return result <= threshold;
     }
 
-    @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+    @SuppressFBWarnings(
         value = "UPM_UNCALLED_PRIVATE_METHOD",
         justification = "call in call() method")
-    private boolean manageServicePathCreation(ServiceImplementationRequestInput input, String serviceType) {
+    private boolean manageServicePathCreation(ServiceImplementationRequestInput input, String serviceType,
+                                              boolean isTempService) {
         ServicePathInputData servicePathInputDataAtoZ =
             ModelMappingUtils
                 .rendererCreateServiceInputAToZ(input.getServiceName(), input.getPathDescription(), Action.Create);
@@ -635,7 +645,7 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
             //olmPowerSetupInputAtoZ,
             ModelMappingUtils.createServicePowerSetupInput(renderingResults.get(0).getOlmList(), input),
             //olmPowerSetupInputZtoA
-            ModelMappingUtils.createServicePowerSetupInput(renderingResults.get(1).getOlmList(), input));
+            ModelMappingUtils.createServicePowerSetupInput(renderingResults.get(1).getOlmList(), input), isTempService);
         if (rollbackProcessor.rollbackAllIfNecessary() > 0) {
             sendNotifications(
                 ServicePathNotificationTypes.ServiceImplementationRequest,
@@ -687,7 +697,7 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
         return true;
     }
 
-    @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+    @SuppressFBWarnings(
         value = "UPM_UNCALLED_PRIVATE_METHOD",
         justification = "call in call() method")
     private boolean manageServicePathDeletion(String serviceName, PathDescription pathDescription, String serviceType)
@@ -696,48 +706,32 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
             ModelMappingUtils.rendererCreateServiceInputAToZ(serviceName, pathDescription, Action.Delete);
         ServicePathInputData servicePathInputDataZtoA =
             ModelMappingUtils.rendererCreateServiceInputZToA(serviceName, pathDescription, Action.Delete);
+
+        ListenableFuture<OLMRenderingResult> olmPowerTurnDownFutureAtoZ = this.executor.submit(
+                new OlmPowerTurnDownTask(serviceName, ATOZPATH, servicePathInputDataAtoZ, notification, rpcService));
+
+        ListenableFuture<OLMRenderingResult> olmPowerTurnDownFutureZtoA = this.executor.submit(
+                new OlmPowerTurnDownTask(serviceName, ZTOAPATH, servicePathInputDataZtoA, notification, rpcService));
+
+        ListenableFuture<List<OLMRenderingResult>> olmPowerTurnDownFutures =
+            Futures.allAsList(olmPowerTurnDownFutureAtoZ, olmPowerTurnDownFutureZtoA);
+
+        List<OLMRenderingResult> olmRenderingResults;
         // OLM turn down power
         try {
-            LOG.debug(TURNING_DOWN_POWER_ON_A_TO_Z_PATH_MSG);
-            sendNotifications(
-                ServicePathNotificationTypes.ServiceDelete,
-                serviceName,
-                RpcStatusEx.Pending,
-                TURNING_DOWN_POWER_ON_A_TO_Z_PATH_MSG);
-            // TODO add some flag rather than string
-            if (FAILED.equals(
-                    olmPowerTurndown(servicePathInputDataAtoZ)
-                        .getResult())) {
-                LOG.error("Service power turndown failed on A-to-Z path for service {}!", serviceName);
-                sendNotifications(
-                    ServicePathNotificationTypes.ServiceDelete,
-                    serviceName,
-                    RpcStatusEx.Failed,
-                    "Service power turndown failed on A-to-Z path for service");
-                return false;
-            }
-            LOG.debug("Turning down power on Z-to-A path");
-            sendNotifications(
-                ServicePathNotificationTypes.ServiceDelete,
-                serviceName,
-                RpcStatusEx.Pending,
-                "Turning down power on Z-to-A path");
-            // TODO add some flag rather than string
-            if (FAILED.equals(
-                    olmPowerTurndown(servicePathInputDataZtoA)
-                        .getResult())) {
-                LOG.error("Service power turndown failed on Z-to-A path for service {}!", serviceName);
-                sendNotifications(
-                    ServicePathNotificationTypes.ServiceDelete,
-                    serviceName,
-                    RpcStatusEx.Failed,
-                    "Service power turndown failed on Z-to-A path for service");
-                return false;
-            }
+            LOG.info("Waiting for A-Z and Z-A OLM power turn down ...");
+            olmRenderingResults = olmPowerTurnDownFutures.get(
+                Timeouts.OLM_TIMEOUT, TimeUnit.MILLISECONDS
+            );
         } catch (InterruptedException | ExecutionException | TimeoutException e) {
             LOG.error("Error while turning down power!", e);
             return false;
         }
+        if (!olmRenderingResults.get(0).isSuccess() || !olmRenderingResults.get(1).isSuccess()) {
+            LOG.error("Error while turning down power!");
+            return false;
+        }
+        LOG.info("OLM power successfully turned down!");
         // delete service path with renderer
         LOG.info("Deleting service path via renderer");
         sendNotifications(
@@ -764,7 +758,7 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
         return true;
     }
 
-    @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+    @SuppressFBWarnings(
         value = "UPM_UNCALLED_PRIVATE_METHOD",
         justification = "call in call() method")
     private boolean manageOtnServicePathCreation(
@@ -820,7 +814,7 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
         return true;
     }
 
-    @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+    @SuppressFBWarnings(
         value = "UPM_UNCALLED_PRIVATE_METHOD",
         justification = "call in call() method")
     private boolean manageOtnServicePathDeletion(
@@ -885,9 +879,13 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
             String serviceName,
             RpcStatusEx rpcStatusEx,
             String message) {
-        send(
-            buildNotification(servicePathNotificationTypes, serviceName, rpcStatusEx, message,
-                null, null, null, null));
+
+        notification.send(
+            servicePathNotificationTypes,
+            serviceName,
+            rpcStatusEx,
+            message
+        );
     }
 
     /**
@@ -905,62 +903,21 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
             String message,
             PathDescription pathDescription,
             Link notifLink,
-            List<String> supportedLinks,
-            String serviceType) {
-        send(
-            buildNotification(servicePathNotificationTypes, serviceName, rpcStatusEx, message,
-                pathDescription, notifLink, supportedLinks, serviceType));
-    }
-
-    /**
-     * Build notification containing path description information.
-     * @param servicePathNotificationTypes ServicePathNotificationTypes
-     * @param serviceName String
-     * @param rpcStatusEx RpcStatusEx
-     * @param message String
-     * @param pathDescription PathDescription
-     * @return notification with RendererRpcResultSp type.
-     */
-    private RendererRpcResultSp buildNotification(
-            ServicePathNotificationTypes servicePathNotificationTypes,
-            String serviceName,
-            RpcStatusEx rpcStatusEx,
-            String message,
-            PathDescription pathDescription,
-            Link notifLink,
-            List<String> supportedLinks,
+            Set<String> supportedLinks,
             String serviceType) {
-        RendererRpcResultSpBuilder builder =
-            new RendererRpcResultSpBuilder()
-                .setNotificationType(servicePathNotificationTypes).setServiceName(serviceName).setStatus(rpcStatusEx)
-                .setStatusMessage(message)
-                .setServiceType(serviceType);
-        if (pathDescription != null) {
-            builder
-                .setAToZDirection(pathDescription.getAToZDirection())
-                .setZToADirection(pathDescription.getZToADirection());
-        }
-        if (notifLink != null) {
-            builder.setLink(notifLink);
-        }
-        if (supportedLinks != null) {
-            builder.setLinkId(supportedLinks);
-        }
-        return builder.build();
-    }
 
-    /**
-     * Send renderer notification.
-     * @param notification Notification
-     */
-    private void send(Notification notification) {
-        try {
-            LOG.info("Sending notification {}", notification);
-            notificationPublishService.putNotification(notification);
-        } catch (InterruptedException e) {
-            LOG.info("notification offer rejected: ", e);
-            Thread.currentThread().interrupt();
-        }
+        notification.send(
+            notification.buildNotification(
+                servicePathNotificationTypes,
+                serviceName,
+                rpcStatusEx,
+                message,
+                pathDescription,
+                notifLink,
+                supportedLinks,
+                serviceType
+            )
+        );
     }
 
     private Link createLinkForNotif(List<LinkTp> otnLinkTerminationPoints) {
@@ -981,23 +938,23 @@ public class RendererServiceOperationsImpl implements RendererServiceOperations
                     .build();
     }
 
-    private List<String> getSupportedLinks(List<String> allSupportLinks, String serviceType) {
+    private Set<String> getSupportedLinks(Set<String> allSupportLinks, String serviceType) {
         //TODO a Map might be more indicated here
         switch (serviceType) {
             case StringConstants.SERVICE_TYPE_10GE:
             case StringConstants.SERVICE_TYPE_1GE:
                 return allSupportLinks.stream()
-                    .filter(lk -> lk.startsWith(OtnLinkType.ODTU4.getName())).collect(Collectors.toList());
+                    .filter(lk -> lk.startsWith(OtnLinkType.ODTU4.getName())).collect(Collectors.toSet());
             case StringConstants.SERVICE_TYPE_100GE_M:
                 return allSupportLinks.stream()
-                    .filter(lk -> lk.startsWith(OtnLinkType.ODUC4.getName())).collect(Collectors.toList());
+                    .filter(lk -> lk.startsWith(OtnLinkType.ODUC4.getName())).collect(Collectors.toSet());
             case StringConstants.SERVICE_TYPE_ODU4:
             case StringConstants.SERVICE_TYPE_100GE_S:
                 return allSupportLinks.stream()
-                    .filter(lk -> lk.startsWith(OtnLinkType.OTU4.getName())).collect(Collectors.toList());
+                    .filter(lk -> lk.startsWith(OtnLinkType.OTU4.getName())).collect(Collectors.toSet());
             case StringConstants.SERVICE_TYPE_ODUC4:
                 return allSupportLinks.stream()
-                    .filter(lk -> lk.startsWith(OtnLinkType.OTUC4.getName())).collect(Collectors.toList());
+                    .filter(lk -> lk.startsWith(OtnLinkType.OTUC4.getName())).collect(Collectors.toSet());
             default:
                 return null;
         }
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/notification/Notification.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/notification/Notification.java
new file mode 100644 (file)
index 0000000..422e351
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright © 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.renderer.provisiondevice.notification;
+
+import java.util.Set;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.RendererRpcResultSp;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.renderer.rpc.result.sp.Link;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.PathDescription;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.RpcStatusEx;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.ServicePathNotificationTypes;
+
+public interface Notification {
+
+    /**
+     * Send renderer notification.
+     */
+    void send(ServicePathNotificationTypes servicePathNotificationTypes,
+              String serviceName,
+              RpcStatusEx rpcStatusEx,
+              String message);
+
+    /**
+     * Send renderer notification.
+     */
+    void send(org.opendaylight.yangtools.yang.binding.Notification notification);
+
+    /**
+     * Build notification containing path description information.
+     *
+     * @param servicePathNotificationTypes ServicePathNotificationTypes
+     * @param serviceName String
+     * @param rpcStatusEx RpcStatusEx
+     * @param message String
+     * @param pathDescription PathDescription
+     * @return notification with RendererRpcResultSp type.
+     */
+    RendererRpcResultSp buildNotification(
+            ServicePathNotificationTypes servicePathNotificationTypes,
+            String serviceName,
+            RpcStatusEx rpcStatusEx,
+            String message,
+            PathDescription pathDescription,
+            Link notifLink,
+            Set<String> supportedLinks,
+            String serviceType);
+
+}
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/notification/NotificationSender.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/notification/NotificationSender.java
new file mode 100644 (file)
index 0000000..2856df7
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * Copyright © 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.renderer.provisiondevice.notification;
+
+import java.util.Set;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.RendererRpcResultSp;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.RendererRpcResultSpBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.renderer.rpc.result.sp.Link;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.PathDescription;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.RpcStatusEx;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.ServicePathNotificationTypes;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Component
+public class NotificationSender implements Notification {
+
+    private final NotificationPublishService notificationPublishService;
+
+    private static final Logger LOG = LoggerFactory.getLogger(NotificationSender.class);
+
+    @Activate
+    public NotificationSender(@Reference NotificationPublishService notificationPublishService) {
+        this.notificationPublishService = notificationPublishService;
+    }
+
+    /**
+     * Send renderer notification.
+     */
+    public void send(ServicePathNotificationTypes servicePathNotificationTypes,
+                     String serviceName,
+                     RpcStatusEx rpcStatusEx,
+                     String message) {
+
+        send(
+            buildNotification(
+                servicePathNotificationTypes,
+                serviceName,
+                rpcStatusEx,
+                message,
+                null,
+                null,
+                null,
+                null
+            )
+        );
+    }
+
+    /**
+     * Send renderer notification.
+     * @param notification Notification
+     */
+    public void send(org.opendaylight.yangtools.yang.binding.Notification notification) {
+        try {
+            LOG.info("Sending notification {}", notification);
+            notificationPublishService.putNotification(notification);
+        } catch (InterruptedException e) {
+            LOG.info("notification offer rejected: ", e);
+            Thread.currentThread().interrupt();
+        }
+    }
+
+    /**
+     * Build notification containing path description information.
+     * @param servicePathNotificationTypes ServicePathNotificationTypes
+     * @param serviceName String
+     * @param rpcStatusEx RpcStatusEx
+     * @param message String
+     * @param pathDescription PathDescription
+     * @return notification with RendererRpcResultSp type.
+     */
+    @Override
+    public RendererRpcResultSp buildNotification(ServicePathNotificationTypes servicePathNotificationTypes,
+                                                 String serviceName,
+                                                 RpcStatusEx rpcStatusEx,
+                                                 String message,
+                                                 PathDescription pathDescription,
+                                                 Link notifLink,
+                                                 Set<String> supportedLinks,
+                                                 String serviceType) {
+
+        RendererRpcResultSpBuilder builder =
+            new RendererRpcResultSpBuilder()
+                .setNotificationType(servicePathNotificationTypes).setServiceName(serviceName).setStatus(rpcStatusEx)
+                .setStatusMessage(message)
+                .setServiceType(serviceType);
+        if (pathDescription != null) {
+            builder
+                .setAToZDirection(pathDescription.getAToZDirection())
+                .setZToADirection(pathDescription.getZToADirection());
+        }
+        if (notifLink != null) {
+            builder.setLink(notifLink);
+        }
+        if (supportedLinks != null) {
+            builder.setLinkId(supportedLinks);
+        }
+        return builder.build();
+    }
+}
index b29e13737e6fd5e05d0718d250e1309539dcf635..0c443d9f53b32a522e94d5caa5aed3ecc7cd5912 100644 (file)
@@ -11,21 +11,21 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.Topology;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.TopologyBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.Topology;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.TopologyBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.get.connection.port.trail.output.Ports;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev211210.resource.DeviceBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev211210.resource.ResourceBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev211210.resource.ResourceTypeBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev211210.resource.resource.resource.port.PortBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev210924.ResourceTypeEnum;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev211210.Hop.HopType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev211210.topology.AToZ;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev211210.topology.AToZBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev211210.topology.AToZKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev211210.topology.ZToA;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev211210.topology.ZToABuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev211210.topology.ZToAKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev230526.resource.DeviceBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev230526.resource.ResourceBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev230526.resource.ResourceTypeBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev230526.resource.resource.resource.port.PortBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev220325.ResourceTypeEnum;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev230526.Hop.HopType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev230526.topology.AToZ;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev230526.topology.AToZBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev230526.topology.AToZKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev230526.topology.ZToA;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev230526.topology.ZToABuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.topology.rev230526.topology.ZToAKey;
 
 public class ServiceListTopology {
 
@@ -36,58 +36,30 @@ public class ServiceListTopology {
 
     public void updateAtoZTopologyList(List<Ports> ports, String nodeId) {
 
-        String circuitPackName = "";
-        String portName = "";
-
         int id = this.a2zTopologyList.size();
-
-        DeviceBuilder deviceBldr = new DeviceBuilder();
-        deviceBldr.setNodeId(new NodeIdType(nodeId));
-
-
         for (Ports port : ports) {
-
             id = id + 1;
-
-            //Get circuitpack name
-            circuitPackName = port.getCircuitPackName();
-
-            //Get port name
-            portName = port.getPortName();
-
-            AToZBuilder a2zBldr = new AToZBuilder();
-
-            //Set Resource Id
-            a2zBldr.setId(Integer.toString(id));
-
-            //Set device Node-id
-            a2zBldr.setDevice(deviceBldr.build());
-
-            //Set hop type to internal
-            a2zBldr.setHopType(HopType.NodeInternal);
-
-            //Set Resource Type to port
-            ResourceTypeBuilder rsrcTypeBldr = new ResourceTypeBuilder();
-            rsrcTypeBldr.setType(ResourceTypeEnum.Port);
-            a2zBldr.setResourceType(rsrcTypeBldr.build());
-
-            //building port resource
-            PortBuilder portBldr = new PortBuilder();
-            portBldr.setCircuitPackName(circuitPackName);
-            portBldr.setPortName(portName);
-            org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev211210.resource.resource.resource
-                .PortBuilder portCase =
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev211210.resource.resource.resource
-                    .PortBuilder();
-            portCase.setPort(portBldr.build());
-            ResourceBuilder rsrcBldr = new ResourceBuilder();
-            rsrcBldr.setResource(portCase.build());
-            a2zBldr.setResource(rsrcBldr.build());
-
             //Add port resource to the list
-            AToZ a2z = a2zBldr.build();
-            this.a2zTopologyList.put(a2z.key(),a2z);
-
+            AToZ a2z = new AToZBuilder()
+                .setId(Integer.toString(id))
+                .setDevice(new DeviceBuilder()
+                    .setNodeId(new NodeIdType(nodeId))
+                    .build())
+                .setHopType(HopType.NodeInternal)
+                .setResourceType(new ResourceTypeBuilder()
+                    .setType(ResourceTypeEnum.Port)
+                    .build())
+                .setResource(new ResourceBuilder()
+                    .setResource(new org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev230526
+                            .resource.resource.resource.PortBuilder()
+                        .setPort(new PortBuilder()
+                            .setCircuitPackName(port.getCircuitPackName())
+                            .setPortName(port.getPortName())
+                            .build())
+                        .build())
+                    .build())
+                .build();
+            this.a2zTopologyList.put(a2z.key(), a2z);
         }
 
         //update Topology
@@ -97,57 +69,31 @@ public class ServiceListTopology {
 
     public void updateZtoATopologyList(List<Ports> ports, String nodeId) {
 
-        String circuitPackName = "";
-        String portName = "";
-
         int id = this.z2aTopologyList.size();
 
-        DeviceBuilder deviceBldr = new DeviceBuilder();
-        deviceBldr.setNodeId(new NodeIdType(nodeId));
-
         for (Ports port : ports) {
-
             id = id + 1;
-
-            //Get circuitpack name
-            circuitPackName = port.getCircuitPackName();
-
-            //Get port name
-            portName = port.getPortName();
-
-            ZToABuilder z2aBldr = new ZToABuilder();
-
-            //Set Resource Id
-            z2aBldr.setId(Integer.toString(id));
-
-            //Set device Node-id
-            z2aBldr.setDevice(deviceBldr.build());
-
-            //Set hop type to internal
-            z2aBldr.setHopType(HopType.NodeInternal);
-
-            //Set Resource Type to port
-            ResourceTypeBuilder rsrcTypeBldr = new ResourceTypeBuilder();
-            rsrcTypeBldr.setType(ResourceTypeEnum.Port);
-            z2aBldr.setResourceType(rsrcTypeBldr.build());
-
-            //building port resource
-            PortBuilder portBldr = new PortBuilder();
-            portBldr.setCircuitPackName(circuitPackName);
-            portBldr.setPortName(portName);
-            org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev211210.resource.resource.resource
-                .PortBuilder portCase =
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev211210.resource.resource.resource
-                    .PortBuilder();
-            portCase.setPort(portBldr.build());
-            ResourceBuilder rsrcBldr = new ResourceBuilder();
-            rsrcBldr.setResource(portCase.build());
-            z2aBldr.setResource(rsrcBldr.build());
-
             //Add port resource to the list
-            ZToA z2a = z2aBldr.build();
+            ZToA z2a = new ZToABuilder()
+                .setId(Integer.toString(id))
+                .setDevice(new DeviceBuilder()
+                    .setNodeId(new NodeIdType(nodeId))
+                    .build())
+                .setHopType(HopType.NodeInternal)
+                .setResourceType(new ResourceTypeBuilder()
+                    .setType(ResourceTypeEnum.Port)
+                    .build())
+                .setResource(new ResourceBuilder()
+                    .setResource(new org.opendaylight.yang.gen.v1.http.org.openroadm.resource.rev230526
+                            .resource.resource.resource.PortBuilder()
+                        .setPort(new PortBuilder()
+                            .setCircuitPackName(port.getCircuitPackName())
+                            .setPortName(port.getPortName())
+                            .build())
+                        .build())
+                    .build())
+                .build();
             this.z2aTopologyList.put(z2a.key(),z2a);
-
         }
 
         //update Topology
index 6954ea55b9ae359e56dd44147136acb3eb2ec14c..e9a0249cbc7dc857fdccfae6c1564fc5538f4e76 100644 (file)
@@ -17,8 +17,8 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.re
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.RendererRollbackInputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.RendererRollbackOutput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.renderer.rollback.output.FailedToRollback;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.node.interfaces.NodeInterface;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.node.interfaces.NodeInterfaceKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.node.interfaces.NodeInterface;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.node.interfaces.NodeInterfaceKey;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
index f6f2bafea2014475a43d060feba67d9d600673d6..4b2d7fbed1364662aacf5d3b0a11d54ef4f3adf7 100644 (file)
@@ -14,8 +14,9 @@ import org.opendaylight.transportpce.renderer.ServicePathInputData;
 import org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererService;
 import org.opendaylight.transportpce.renderer.provisiondevice.DeviceRenderingResult;
 import org.opendaylight.transportpce.renderer.provisiondevice.servicepath.ServicePathDirection;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.history.History;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.ServicePathOutput;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.optical.renderer.nodes.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.optical.renderer.nodes.Nodes;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -26,12 +27,14 @@ public class DeviceRenderingTask implements Callable<DeviceRenderingResult> {
     private final DeviceRendererService deviceRenderer;
     private final ServicePathInputData servicePathInputData;
     private final ServicePathDirection direction;
+    private final History transactionHistory;
 
     public DeviceRenderingTask(DeviceRendererService deviceRenderer, ServicePathInputData servicePathInputData,
-            ServicePathDirection direction) {
+            ServicePathDirection direction, History transactionHistory) {
         this.deviceRenderer = deviceRenderer;
         this.servicePathInputData = servicePathInputData;
         this.direction = direction;
+        this.transactionHistory = transactionHistory;
     }
 
     @Override
@@ -43,7 +46,7 @@ public class DeviceRenderingTask implements Callable<DeviceRenderingResult> {
             case Create:
                 operation = "setup";
                 output = this.deviceRenderer.setupServicePath(this.servicePathInputData.getServicePathInput(),
-                    this.direction);
+                    this.direction, transactionHistory);
                 olmList = this.servicePathInputData.getNodeLists().getOlmNodeList();
                 break;
             case Delete:
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/tasks/NetworkDeviceRenderingRollbackTask.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/tasks/NetworkDeviceRenderingRollbackTask.java
new file mode 100644 (file)
index 0000000..4c1faa1
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright © 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.renderer.provisiondevice.tasks;
+
+import org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererService;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.history.History;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.RendererRollbackOutput;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class NetworkDeviceRenderingRollbackTask extends RollbackTask {
+
+    private final History transactionHistory;
+
+    private final boolean isRollbackNecessary;
+
+    private final DeviceRendererService deviceRendererService;
+
+    private final ResultMessage message;
+
+    private static final Logger LOG = LoggerFactory.getLogger(NetworkDeviceRenderingRollbackTask.class);
+
+    public NetworkDeviceRenderingRollbackTask(String id, History transactionHistory,
+                                              boolean isRollbackNecessary,
+                                              DeviceRendererService deviceRendererService, ResultMessage message) {
+        super(id);
+        this.transactionHistory = transactionHistory;
+        this.isRollbackNecessary = isRollbackNecessary;
+        this.deviceRendererService = deviceRendererService;
+        this.message = message;
+    }
+
+    @Override
+    public boolean isRollbackNecessary() {
+        return isRollbackNecessary;
+    }
+
+    @Override
+    public Void call() throws Exception {
+
+        RendererRollbackOutput rollbackOutput = deviceRendererService.rendererRollback(transactionHistory);
+
+        if (! rollbackOutput.getSuccess()) {
+            LOG.warn("Device rendering rollback of {} was not successful! Failed rollback on {}.", this.getId(),
+                    message.createErrorMessage(rollbackOutput.nonnullFailedToRollback().values()));
+        } else {
+            LOG.info("Device rollback of {} successful.", this.getId());
+        }
+
+        return null;
+    }
+}
index f0cc4b6137a776210605123a77e633ea74d60aec..2555fb0319a0be23f9a1b6966c4ddc8e3186bc52 100644 (file)
@@ -9,27 +9,27 @@ package org.opendaylight.transportpce.renderer.provisiondevice.tasks;
 
 import java.util.concurrent.Future;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndown;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownInputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.TransportpceOlmService;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class OlmPowerSetupRollbackTask extends RollbackTask {
-
     private static final Logger LOG = LoggerFactory.getLogger(OlmPowerSetupRollbackTask.class);
+
     private static final String FAILED = "Failed";
     private final boolean isRollbackNecessary;
-    private final TransportpceOlmService olmService;
+    private final ServicePowerTurndown servicePowerTurndown;
     private final ServicePowerSetupInput powerSetupInput;
 
-    public OlmPowerSetupRollbackTask(String id, boolean isRollbackNecessary, TransportpceOlmService olmService,
-                                     ServicePowerSetupInput powerSetupInput) {
+    public OlmPowerSetupRollbackTask(String id, boolean isRollbackNecessary, ServicePowerTurndown servicePowerTurndown,
+            ServicePowerSetupInput powerSetupInput) {
         super(id);
         this.isRollbackNecessary = isRollbackNecessary;
-        this.olmService = olmService;
+        this.servicePowerTurndown = servicePowerTurndown;
         this.powerSetupInput = powerSetupInput;
     }
 
@@ -44,10 +44,12 @@ public class OlmPowerSetupRollbackTask extends RollbackTask {
                 .setNodes(this.powerSetupInput.getNodes())
                 .setServiceName(this.powerSetupInput.getServiceName())
                 .setWaveNumber(this.powerSetupInput.getWaveNumber())
+                .setLowerSpectralSlotNumber(this.powerSetupInput.getLowerSpectralSlotNumber())
+                .setHigherSpectralSlotNumber(this.powerSetupInput.getHigherSpectralSlotNumber())
                 .build();
 
         Future<RpcResult<ServicePowerTurndownOutput>> powerTurndownResultFuture =
-                this.olmService.servicePowerTurndown(powerTurndownInput);
+                servicePowerTurndown.invoke(powerTurndownInput);
         RpcResult<ServicePowerTurndownOutput> powerTurndownResult = powerTurndownResultFuture.get();
         if (FAILED.equals(powerTurndownResult.getResult().getResult())) {
             LOG.warn("Olmp power setup rollback for {} was not successful!", this.getId());
index 37e17cbfc177b55be11a65d4832019d38143f363..1f1badc54b7785c96d2f926989bf7cb3520b50b5 100644 (file)
@@ -7,13 +7,15 @@
  */
 package org.opendaylight.transportpce.renderer.provisiondevice.tasks;
 
+import static java.util.Objects.requireNonNull;
+
 import java.util.concurrent.Callable;
 import java.util.concurrent.Future;
 import org.opendaylight.transportpce.common.ResponseCodes;
 import org.opendaylight.transportpce.renderer.provisiondevice.OLMRenderingResult;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetup;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.TransportpceOlmService;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -22,17 +24,17 @@ public class OlmPowerSetupTask implements Callable<OLMRenderingResult> {
 
     private static final Logger LOG = LoggerFactory.getLogger(OlmPowerSetupTask.class);
 
-    private final TransportpceOlmService olmService;
+    private final ServicePowerSetup servicePowerSetup;
     private final ServicePowerSetupInput input;
 
-    public OlmPowerSetupTask(TransportpceOlmService olmService, ServicePowerSetupInput input) {
-        this.olmService = olmService;
+    public OlmPowerSetupTask(ServicePowerSetup servicePowerSetup, ServicePowerSetupInput input) {
+        this.servicePowerSetup = requireNonNull(servicePowerSetup);
         this.input = input;
     }
 
     @Override
     public OLMRenderingResult call() throws Exception {
-        Future<RpcResult<ServicePowerSetupOutput>> fr = this.olmService.servicePowerSetup(this.input);
+        Future<RpcResult<ServicePowerSetupOutput>> fr = servicePowerSetup.invoke(this.input);
         RpcResult<ServicePowerSetupOutput> result = fr.get();
         if (result == null) {
             LOG.warn("Result is NULL");
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/tasks/OlmPowerTurnDownTask.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/tasks/OlmPowerTurnDownTask.java
new file mode 100644 (file)
index 0000000..f940b1e
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright © 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.renderer.provisiondevice.tasks;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.Future;
+import org.opendaylight.mdsal.binding.api.RpcService;
+import org.opendaylight.transportpce.common.ResponseCodes;
+import org.opendaylight.transportpce.renderer.ServicePathInputData;
+import org.opendaylight.transportpce.renderer.provisiondevice.OLMRenderingResult;
+import org.opendaylight.transportpce.renderer.provisiondevice.notification.Notification;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndown;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownOutput;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.RpcStatusEx;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.ServicePathNotificationTypes;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class OlmPowerTurnDownTask implements Callable<OLMRenderingResult> {
+
+    private static final Logger LOG = LoggerFactory.getLogger(OlmPowerTurnDownTask.class);
+    private final String serviceName;
+    private final String path;
+    private final ServicePathInputData servicePathInputData;
+    private final Notification notification;
+    private final RpcService rpcService;
+
+    /**
+     * Task used to power down OLM.
+     *
+     * <p>
+     * Intended to be used for parallel execution.
+     */
+    public OlmPowerTurnDownTask(String serviceName, String path, ServicePathInputData servicePathInputData,
+            Notification notification, RpcService rpcService) {
+
+        this.serviceName = serviceName;
+        this.path = path;
+        this.servicePathInputData = servicePathInputData;
+        this.notification = notification;
+        this.rpcService = rpcService;
+    }
+
+    @Override
+    public OLMRenderingResult call() throws Exception {
+
+        LOG.debug("Turning down power on {} path for service {}", path, serviceName);
+
+        Future<RpcResult<ServicePowerTurndownOutput>> fr = rpcService.getRpc(ServicePowerTurndown.class).invoke(
+            new ServicePowerTurndownInputBuilder(
+                servicePathInputData.getServicePathInput()
+            ).build());
+
+        notification.send(
+            ServicePathNotificationTypes.ServiceDelete,
+            serviceName,
+            RpcStatusEx.Pending,
+            String.format("Turning down power on %s path for service %s", path, serviceName)
+        );
+
+        RpcResult<ServicePowerTurndownOutput> result = fr.get();
+
+        if (result == null || !ResponseCodes.SUCCESS_RESULT.equals(result.getResult().getResult())) {
+            notification.send(
+                ServicePathNotificationTypes.ServiceDelete,
+                serviceName,
+                RpcStatusEx.Failed,
+                String.format("Service power turn down failed on %s path for service %s", path, serviceName)
+            );
+            return OLMRenderingResult.failed(
+                String.format("Service power turn down failed on %s path for service %s", path, serviceName)
+            );
+        } else {
+            LOG.debug("OLM power turn down finished successfully on {} for service {}", path, serviceName);
+            return OLMRenderingResult.ok();
+        }
+    }
+}
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/tasks/ResultMessage.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/tasks/ResultMessage.java
new file mode 100644 (file)
index 0000000..d1540ca
--- /dev/null
@@ -0,0 +1,21 @@
+/*
+ * Copyright © 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.renderer.provisiondevice.tasks;
+
+import java.util.Collection;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.renderer.rollback.output.FailedToRollback;
+
+public interface ResultMessage {
+
+    /**
+     * Build an error message for a failed rollback.
+     */
+    String createErrorMessage(Collection<FailedToRollback> failedRollbacks);
+
+}
\ No newline at end of file
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/tasks/RollbackResultMessage.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/tasks/RollbackResultMessage.java
new file mode 100644 (file)
index 0000000..7fae4c9
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright © 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.renderer.provisiondevice.tasks;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.renderer.rollback.output.FailedToRollback;
+
+public class RollbackResultMessage implements ResultMessage {
+
+    @Override
+    public String createErrorMessage(Collection<FailedToRollback> failedRollbacks) {
+        List<String> failedRollbackNodes = new ArrayList<>();
+
+        failedRollbacks.forEach(failedRollback -> {
+            var intf = failedRollback.getInterface();
+
+            failedRollbackNodes.add(
+                failedRollback.getNodeId()
+                    + ": "
+                    + intf == null ? "" : String.join(", ", intf)
+            );
+        });
+
+        return String.join(System.lineSeparator(), failedRollbackNodes);
+    }
+
+}
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/Connection.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/Connection.java
new file mode 100644 (file)
index 0000000..ad04ae7
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * Copyright © 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.renderer.provisiondevice.transaction;
+
+import java.util.List;
+import java.util.Objects;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.delete.Delete;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Connection transaction.
+ *
+ * <p>
+ * i.e. a class tracking a connection.
+ */
+public class Connection implements Transaction {
+
+    private static final Logger LOG = LoggerFactory.getLogger(Connection.class);
+    private final String deviceId;
+    private final String connectionNumber;
+    private final boolean isOtn;
+
+    public Connection(String deviceId, String connectionNumber, boolean isOtn) {
+        this.deviceId = deviceId;
+        this.connectionNumber = connectionNumber;
+        this.isOtn = isOtn;
+    }
+
+    @Override
+    public boolean rollback(Delete delete) {
+        List<String> supportingInterfaces = delete.deleteCrossConnect(deviceId, connectionNumber, isOtn);
+
+        if (supportingInterfaces == null || supportingInterfaces.size() == 0) {
+            return false;
+        }
+
+        LOG.info("Supporting interfaces {} affected by rollback on {} {}",
+                String.join(", ", supportingInterfaces), deviceId, connectionNumber);
+
+        return true;
+
+    }
+
+    @Override
+    public String description() {
+        return String.format("Connection %s connection number %s isOtn %s", deviceId,
+                connectionNumber, isOtn);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof Connection)) {
+            return false;
+        }
+        Connection that = (Connection) object;
+        return isOtn == that.isOtn && Objects.equals(deviceId, that.deviceId)
+                && Objects.equals(connectionNumber, that.connectionNumber);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(deviceId, connectionNumber, isOtn);
+    }
+}
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/DeviceInterface.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/DeviceInterface.java
new file mode 100644 (file)
index 0000000..8bcc2c1
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright © 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.renderer.provisiondevice.transaction;
+
+import java.util.Objects;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.delete.Delete;
+
+public class DeviceInterface implements Transaction {
+
+    private final String nodeId;
+
+    private final String interfaceId;
+
+    public DeviceInterface(String nodeId, String interfaceId) {
+        this.nodeId = nodeId;
+        this.interfaceId = interfaceId;
+    }
+
+    @Override
+    public boolean rollback(Delete delete) {
+        return delete.deleteInterface(nodeId, interfaceId);
+    }
+
+    @Override
+    public String description() {
+        return String.format("Node: %s interface id: %s", nodeId, interfaceId);
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(nodeId, interfaceId);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof DeviceInterface)) {
+            return false;
+        }
+        DeviceInterface that = (DeviceInterface) object;
+        return Objects.equals(nodeId, that.nodeId) && Objects.equals(interfaceId,
+                that.interfaceId);
+    }
+}
\ No newline at end of file
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/Transaction.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/Transaction.java
new file mode 100644 (file)
index 0000000..d1300e3
--- /dev/null
@@ -0,0 +1,29 @@
+/*
+ * Copyright © 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.renderer.provisiondevice.transaction;
+
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.delete.Delete;
+
+/**
+ * Any class wishing to keep track of transactions
+ * may implement this interface.
+ */
+public interface Transaction {
+
+    /**
+     * Rollback this transaction.
+     */
+    boolean rollback(Delete delete);
+
+    String description();
+
+    int hashCode();
+
+    boolean equals(Object object);
+}
\ No newline at end of file
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/delete/Delete.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/delete/Delete.java
new file mode 100644 (file)
index 0000000..95fcdff
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ * Copyright © 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.renderer.provisiondevice.transaction.delete;
+
+import java.util.List;
+
+/**
+ * A class capable of deleting service connections/interfaces
+ * may implement this interface.
+ */
+public interface Delete {
+
+    /**
+     * Delete cross connection.
+     * Typically, deleted before interfaces.
+     */
+    List<String> deleteCrossConnect(String deviceId, String connectionNumber, boolean isOtn);
+
+    /**
+     * Delete an interface.
+     * Typically, deleted after the cross connection.
+     */
+    boolean deleteInterface(String nodeId, String interfaceId);
+}
\ No newline at end of file
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/delete/DeleteService.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/delete/DeleteService.java
new file mode 100644 (file)
index 0000000..62af4bf
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright © 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.renderer.provisiondevice.transaction.delete;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
+import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
+import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DeleteService implements Delete {
+
+    private final CrossConnect crossConnect;
+    private final OpenRoadmInterfaces openRoadmInterfaces;
+
+    private final Subscriber subscriber;
+
+    private static final Logger LOG = LoggerFactory.getLogger(DeleteService.class);
+
+    public DeleteService(
+            CrossConnect crossConnect,
+            OpenRoadmInterfaces openRoadmInterfaces,
+            Subscriber subscriber) {
+        this.crossConnect = crossConnect;
+        this.openRoadmInterfaces = openRoadmInterfaces;
+        this.subscriber = subscriber;
+    }
+
+    @Override
+    public @NonNull List<String> deleteCrossConnect(String deviceId, String connectionNumber,
+                                                    boolean isOtn) {
+        List<String> result = crossConnect.deleteCrossConnect(deviceId, connectionNumber, isOtn);
+
+        if (result == null) {
+            subscriber.result(false, deviceId, connectionNumber);
+            return new ArrayList<>();
+        }
+
+        subscriber.result(true, deviceId, connectionNumber);
+
+        return result;
+    }
+
+    @Override
+    public boolean deleteInterface(String nodeId, String interfaceId) {
+        try {
+            openRoadmInterfaces.deleteInterface(nodeId, interfaceId);
+
+            subscriber.result(true, nodeId, interfaceId);
+            return true;
+        } catch (OpenRoadmInterfaceException e) {
+            LOG.error("Failed rolling back {} {}", nodeId, interfaceId);
+            subscriber.result(false, nodeId, interfaceId);
+            return false;
+        }
+    }
+}
\ No newline at end of file
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/delete/DeleteSubscriber.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/delete/DeleteSubscriber.java
new file mode 100644 (file)
index 0000000..886b459
--- /dev/null
@@ -0,0 +1,26 @@
+/*
+ * Copyright © 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.renderer.provisiondevice.transaction.delete;
+
+public class DeleteSubscriber implements Subscriber {
+
+    private final Result result;
+
+    public DeleteSubscriber(Result result) {
+        this.result = result;
+    }
+
+    @Override
+    public void result(Boolean success, String nodeId, String interfaceId) {
+
+        result.add(success, nodeId, interfaceId);
+
+    }
+
+}
\ No newline at end of file
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/delete/FailedRollbackResult.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/delete/FailedRollbackResult.java
new file mode 100644 (file)
index 0000000..5637879
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright © 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.renderer.provisiondevice.transaction.delete;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.RendererRollbackOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.RendererRollbackOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.renderer.rollback.output.FailedToRollback;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.renderer.rollback.output.FailedToRollbackBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.renderer.rollback.output.FailedToRollbackKey;
+
+public class FailedRollbackResult implements Result {
+
+    private final Map<String, Set<String>> failedRollback = Collections.synchronizedMap(
+            new HashMap<>());
+
+    @Override
+    public boolean add(boolean success, String nodeId, String interfaceId) {
+
+        if (success) {
+            return false;
+        }
+
+        if (!failedRollback.containsKey(nodeId)) {
+            failedRollback.put(nodeId, new LinkedHashSet<>());
+        }
+
+        return failedRollback.get(nodeId).add(interfaceId);
+    }
+
+    @Override
+    public RendererRollbackOutput renderRollbackOutput() {
+
+        Map<FailedToRollbackKey, FailedToRollback> failedToRollbackList = new HashMap<>();
+
+        for (Entry<String, Set<String>> entry : failedRollback.entrySet()) {
+
+            FailedToRollback failedToRollack = new FailedToRollbackBuilder()
+                    .withKey(new FailedToRollbackKey(entry.getKey()))
+                    .setNodeId(entry.getKey())
+                    .setInterface(entry.getValue())
+                    .build();
+
+            failedToRollbackList.put(failedToRollack.key(), failedToRollack);
+
+        }
+
+        return new RendererRollbackOutputBuilder()
+                .setSuccess(failedRollback.isEmpty())
+                .setFailedToRollback(failedToRollbackList)
+                .build();
+
+    }
+
+}
\ No newline at end of file
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/delete/Result.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/delete/Result.java
new file mode 100644 (file)
index 0000000..fb77027
--- /dev/null
@@ -0,0 +1,19 @@
+/*
+ * Copyright © 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.renderer.provisiondevice.transaction.delete;
+
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.RendererRollbackOutput;
+
+public interface Result {
+
+    boolean add(boolean success, String nodeId, String interfaceId);
+
+    RendererRollbackOutput renderRollbackOutput();
+
+}
\ No newline at end of file
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/delete/Subscriber.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/delete/Subscriber.java
new file mode 100644 (file)
index 0000000..8e83d16
--- /dev/null
@@ -0,0 +1,15 @@
+/*
+ * Copyright © 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.renderer.provisiondevice.transaction.delete;
+
+public interface Subscriber {
+
+    void result(Boolean success, String nodeId, String interfaceId);
+
+}
\ No newline at end of file
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/history/History.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/history/History.java
new file mode 100644 (file)
index 0000000..fd2646a
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright © 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.renderer.provisiondevice.transaction.history;
+
+import java.util.List;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.Transaction;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.delete.Delete;
+
+public interface History {
+
+    /**
+     * Add transaction.
+     *
+     * <p>
+     * Only accepts the transaction if this History
+     * object doesn't already contain the object.
+     *
+     * @return true if the transaction was added.
+     */
+    boolean add(Transaction transaction);
+
+    /**
+     * A list of transactions.
+     *
+     * <p>
+     * Will only accept unique transactions.
+     * @return true if all transactions was added. false if one or more transactions was rejected.
+     */
+    boolean add(List<Transaction> transactions);
+
+    /**
+     * Add an array of interface transactions.
+     *
+     * <p>
+     * Duplicate interface ids, null or empty strings
+     * are silently ignored.
+     * @return may return false
+     */
+    boolean addInterfaces(String nodeId, String interfaceId);
+
+    /**
+     * Add an array of interface transactions.
+     *
+     * <p>
+     * Duplicate interface ids, null or empty strings
+     * are silently ignored.
+     * @return may return false
+     */
+    boolean addInterfaces(String nodeId, String[] interfaceIds);
+
+    /**
+     * Add a list of interface transactions.
+     *
+     * <p>
+     * Duplicate interface ids, null or empty strings
+     * are silently ignored.
+     */
+    boolean addInterfaces(String nodeId, List<String> interfaceIds);
+
+    /**
+     * Rollback all transactions.
+     *
+     * <p>
+     * Typically, the transactions are rolled back in reverse
+     * order, but the implementing class may choose a different
+     * logic.
+     */
+    boolean rollback(Delete delete);
+
+}
\ No newline at end of file
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/history/NonStickHistoryMemory.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/history/NonStickHistoryMemory.java
new file mode 100644 (file)
index 0000000..71d8f74
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Copyright © 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.renderer.provisiondevice.transaction.history;
+
+import java.util.List;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.Transaction;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.delete.Delete;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Goldfish implementation of the History interface.
+ *
+ * <p>
+ * This implementation simply doesn't track anything.
+ * Most useful for backwards compatibility reasons.
+ */
+public class NonStickHistoryMemory implements History {
+
+    private static final Logger LOG = LoggerFactory.getLogger(NonStickHistoryMemory.class);
+
+    @Override
+    public boolean add(Transaction transaction) {
+        LOG.warn("Transaction history disabled. Ignoring '{}'.", transaction.description());
+        return false;
+    }
+
+    @Override
+    public boolean add(List<Transaction> transactions) {
+        LOG.warn("Transaction history disabled. No rollback executed.");
+        return false;
+    }
+
+    @Override
+    public boolean addInterfaces(String nodeId, String interfaceId) {
+        LOG.warn("Transaction history disabled.");
+        return false;
+    }
+
+    @Override
+    public boolean addInterfaces(String nodeId, String[] interfaceIds) {
+        LOG.warn("Transaction history disabled.");
+        return false;
+    }
+
+    @Override
+    public boolean addInterfaces(String nodeId, List<String> interfaceIds) {
+        LOG.warn("Transaction history disabled.");
+        return false;
+    }
+
+    @Override
+    public boolean rollback(Delete delete) {
+        LOG.warn("Transaction history disabled. No rollback executed.");
+        return false;
+    }
+}
\ No newline at end of file
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/history/TransactionHistory.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/history/TransactionHistory.java
new file mode 100644 (file)
index 0000000..a1565fc
--- /dev/null
@@ -0,0 +1,115 @@
+/*
+ * Copyright © 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.renderer.provisiondevice.transaction.history;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.DeviceInterface;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.Transaction;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.delete.Delete;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * A class keeping track of transaction history.
+ *
+ * <p>
+ * A transaction can be something like an interface or a roadm connection, that may need to be
+ * rolled back in the future.
+ */
+public class TransactionHistory implements History {
+
+    private static final Logger LOG = LoggerFactory.getLogger(TransactionHistory.class);
+    Set<Transaction> transactionHistory = Collections.synchronizedSet(new LinkedHashSet<>());
+
+    @Override
+    public boolean add(Transaction transaction) {
+
+        boolean result = transactionHistory.add(transaction);
+
+        if (result) {
+            LOG.info("Adding {}", transaction.description());
+        } else {
+            LOG.warn("Transaction {} not added.", transaction.description());
+        }
+
+        return result;
+    }
+
+    @Override
+    public boolean add(List<Transaction> transactions) {
+        Set<Boolean> results = new HashSet<>(transactions.size());
+
+        for (Transaction transaction : transactions) {
+            results.add(add(transaction));
+        }
+
+        return results.stream().allMatch(i -> (i.equals(Boolean.TRUE)));
+    }
+
+    @Override
+    public boolean addInterfaces(String nodeId, String interfaceId) {
+        return addInterfaces(nodeId, Collections.singletonList(interfaceId));
+    }
+
+    @Override
+    public boolean addInterfaces(String nodeId, String[] interfaceIds) {
+
+        return addInterfaces(nodeId, Arrays.asList(interfaceIds));
+
+    }
+
+    @Override
+    public boolean addInterfaces(String nodeId, List<String> interfaceIds) {
+
+        Set<Boolean> results = new HashSet<>();
+        Set<String> unique = new LinkedHashSet<>();
+
+        for (String interfaceId : interfaceIds) {
+            if (interfaceId != null && !interfaceId.trim().isEmpty()) {
+                unique.add(interfaceId.trim());
+            }
+        }
+
+        for (String interfaceId : unique) {
+            results.add(this.add(new DeviceInterface(nodeId, interfaceId)));
+        }
+
+        return results.stream().allMatch(i -> (i.equals(Boolean.TRUE)));
+
+    }
+
+    @Override
+    public boolean rollback(Delete delete) {
+
+        LOG.info("History contains {} items. Rolling them back in reverse order.",
+                transactionHistory.size());
+
+        List<Transaction> reverse = new ArrayList<>(transactionHistory);
+
+        Collections.reverse(reverse);
+
+        boolean success = true;
+
+        for (Transaction transaction : reverse) {
+            LOG.info("Rolling back {}", transaction.description());
+            if (!transaction.rollback(delete)) {
+                success = false;
+            }
+        }
+
+        return success;
+
+    }
+}
\ No newline at end of file
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/CreateOtsOmsImpl.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/CreateOtsOmsImpl.java
new file mode 100644 (file)
index 0000000..2ed0256
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.renderer.rpcs;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
+import org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.CreateOtsOms;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.CreateOtsOmsInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.CreateOtsOmsOutput;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class CreateOtsOmsImpl implements CreateOtsOms {
+    private static final Logger LOG = LoggerFactory.getLogger(CreateOtsOmsImpl.class);
+    private DeviceRendererService deviceRendererService;
+
+    public CreateOtsOmsImpl(final DeviceRendererService deviceRendererService) {
+        this.deviceRendererService = requireNonNull(deviceRendererService);
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<CreateOtsOmsOutput>> invoke(CreateOtsOmsInput input) {
+        LOG.info("Request received to create oms and ots interfaces on {}: {}",
+            input.getNodeId(), input.getLogicalConnectionPoint());
+        try {
+            return RpcResultBuilder.success(deviceRendererService.createOtsOms(input)).buildFuture();
+        } catch (OpenRoadmInterfaceException e) {
+            LOG.error("failed to send request to create oms and ots interfaces on {}: {}",
+                input.getNodeId(), input.getLogicalConnectionPoint(),e);
+        }
+        return RpcResultBuilder.<CreateOtsOmsOutput>failed()
+            .withError(ErrorType.RPC, "to create oms and ots interfaces")
+            .buildFuture();
+    }
+
+}
index 338bea968454fef98f40746dd1af7cad8a6f4ae7..005a32a5aef0f6319bb6cad0e6028ade56ca01f9 100644 (file)
 
 package org.opendaylight.transportpce.renderer.rpcs;
 
-import com.google.common.util.concurrent.ListenableFuture;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
-import org.opendaylight.transportpce.common.service.ServiceTypes;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
 import org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererService;
 import org.opendaylight.transportpce.renderer.provisiondevice.OtnDeviceRendererService;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.CreateOtsOmsInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.CreateOtsOmsOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.OtnServicePathInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.OtnServicePathOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.OtnServicePathOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.RendererRollbackInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.RendererRollbackOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.ServicePathInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.ServicePathOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.ServicePathOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.TransportpceDeviceRendererService;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.opendaylight.yangtools.concepts.Registration;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class DeviceRendererRPCImpl implements TransportpceDeviceRendererService {
+@Component(immediate = true)
+public class DeviceRendererRPCImpl {
 
     private static final Logger LOG = LoggerFactory.getLogger(DeviceRendererRPCImpl.class);
-    private DeviceRendererService deviceRenderer;
-    private OtnDeviceRendererService otnDeviceRendererService;
-
-    public DeviceRendererRPCImpl(DeviceRendererService deviceRenderer,
-                                 OtnDeviceRendererService otnDeviceRendererService) {
-        this.deviceRenderer = deviceRenderer;
-        this.otnDeviceRendererService = otnDeviceRendererService;
-    }
-
-    /**
-     * This method is the implementation of the 'service-path' RESTCONF service,
-     * which is one of the external APIs into the renderer application. The
-     * service provides two functions:
-     *
-     * <p>
-     * 1. Create This operation results in provisioning the device for a given
-     * wavelength and a list of nodes with each node listing its termination
-     * points.
-     *
-     * <p>
-     * 2. Delete This operation results in de-provisioning the device for a
-     * given wavelength and a list of nodes with each node listing its
-     * termination points.
-     *
-     * <p>
-     * The signature for this method was generated by yang tools from the
-     * renderer API model.
-     *
-     * @param input
-     *            Input parameter from the service-path yang model
-     *
-     * @return Result of the request
-     */
-    @Override
-    public ListenableFuture<RpcResult<ServicePathOutput>> servicePath(ServicePathInput input) {
-        if (input.getOperation() != null) {
-            if (input.getOperation().getIntValue() == 1) {
-                LOG.info("Create operation request received");
-                return RpcResultBuilder.success(
-                        this.deviceRenderer.setupServicePath(input, null))
-                        .buildFuture();
-            } else if (input.getOperation().getIntValue() == 2) {
-                LOG.info("Delete operation request received");
-                return RpcResultBuilder
-                        .success(this.deviceRenderer.deleteServicePath(input))
-                        .buildFuture();
-            }
-        }
-        return RpcResultBuilder.success(new ServicePathOutputBuilder().setResult("Invalid operation")).buildFuture();
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<OtnServicePathOutput>> otnServicePath(OtnServicePathInput input) {
-        if (input.getOperation() != null && input.getServiceFormat() != null && input.getServiceRate() != null) {
-            String serviceType = ServiceTypes.getOtnServiceType(input.getServiceFormat(), input.getServiceRate());
-            if (input.getOperation().getIntValue() == 1) {
-                LOG.info("Create operation request received");
-                return RpcResultBuilder.success(this.otnDeviceRendererService
-                        .setupOtnServicePath(input, serviceType)).buildFuture();
-            } else if (input.getOperation().getIntValue() == 2) {
-                LOG.info("Delete operation request received");
-                return RpcResultBuilder.success(this.otnDeviceRendererService
-                        .deleteOtnServicePath(input, serviceType)).buildFuture();
-            }
-        }
-        return RpcResultBuilder.success(new OtnServicePathOutputBuilder().setResult("Invalid operation")).buildFuture();
+    private Registration reg;
+
+    @Activate
+    public DeviceRendererRPCImpl(@Reference RpcProviderService rpcProviderService,
+            @Reference DeviceRendererService deviceRenderer,
+            @Reference OtnDeviceRendererService otnDeviceRendererService) {
+        this.reg = rpcProviderService.registerRpcImplementations(
+                new ServicePathImpl(deviceRenderer),
+                new OtnServicePathImpl(otnDeviceRendererService),
+                new RendererRollbackImpl(deviceRenderer),
+                new CreateOtsOmsImpl(deviceRenderer));
+        LOG.debug("RPC of DeviceRendererRPCImpl instantiated");
     }
 
-    /**
-     * Rollback created interfaces and cross connects specified by input.
-     *
-     * @param input
-     *            Lists of created interfaces and connections per node
-     * @return Success flag and nodes which failed to rollback
-     */
-    @Override
-    public ListenableFuture<RpcResult<RendererRollbackOutput>> rendererRollback(RendererRollbackInput input) {
-        return RpcResultBuilder.success(this.deviceRenderer.rendererRollback(input)).buildFuture();
+    @Deactivate
+    public void close() {
+        this.reg.close();
+        LOG.info("DeviceRendererRPCImpl Closed");
     }
 
-    @Override
-    public ListenableFuture<RpcResult<CreateOtsOmsOutput>> createOtsOms(CreateOtsOmsInput input) {
-        LOG.info("Request received to create oms and ots interfaces on {}: {}", input.getNodeId(), input
-            .getLogicalConnectionPoint());
-        try {
-            return RpcResultBuilder.success(deviceRenderer.createOtsOms(input)).buildFuture();
-        } catch (OpenRoadmInterfaceException e) {
-            LOG.error("failed to send request to create oms and ots interfaces on {}: {}", input.getNodeId(),
-                    input.getLogicalConnectionPoint(),e);
-        }
-        return null;
+    public Registration getRegisteredRpc() {
+        return reg;
     }
 }
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/OtnServicePathImpl.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/OtnServicePathImpl.java
new file mode 100644 (file)
index 0000000..90202d1
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.renderer.rpcs;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.transportpce.common.service.ServiceTypes;
+import org.opendaylight.transportpce.renderer.provisiondevice.OtnDeviceRendererService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.OtnServicePath;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.OtnServicePathInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.OtnServicePathOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.OtnServicePathOutputBuilder;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class OtnServicePathImpl implements OtnServicePath {
+    private static final Logger LOG = LoggerFactory.getLogger(OtnServicePathImpl.class);
+    private OtnDeviceRendererService otnDeviceRendererService;
+
+    public OtnServicePathImpl(final OtnDeviceRendererService otnDeviceRendererService) {
+        this.otnDeviceRendererService = requireNonNull(otnDeviceRendererService);
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<OtnServicePathOutput>> invoke(OtnServicePathInput input) {
+        if (input.getOperation() == null || input.getServiceFormat() == null || input.getServiceRate() == null) {
+            LOG.debug("A mandatory input argument is null");
+            return RpcResultBuilder
+                .success(new OtnServicePathOutputBuilder().setResult("Invalid operation").build())
+                .buildFuture();
+        }
+        String serviceType = ServiceTypes.getOtnServiceType(input.getServiceFormat(), input.getServiceRate());
+        return switch (input.getOperation()) {
+            case Create -> {
+                LOG.info("Create operation request received");
+                yield RpcResultBuilder.success(this.otnDeviceRendererService
+                    .setupOtnServicePath(input, serviceType)).buildFuture();
+            }
+            case Delete -> {
+                LOG.info("Delete operation request received");
+                yield RpcResultBuilder.success(this.otnDeviceRendererService
+                    .deleteOtnServicePath(input, serviceType)).buildFuture();
+            }
+        };
+    }
+}
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/RendererRPCImpl.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/RendererRPCImpl.java
new file mode 100644 (file)
index 0000000..4cff118
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright © 2017 AT&T and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.renderer.rpcs;
+
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
+import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations;
+import org.opendaylight.yangtools.concepts.Registration;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Component(immediate = true)
+public class RendererRPCImpl {
+
+    private static final Logger LOG = LoggerFactory.getLogger(RendererRPCImpl.class);
+    private Registration reg;
+
+    @Activate
+    public RendererRPCImpl(@Reference RendererServiceOperations rendererServiceOperations,
+            @Reference RpcProviderService rpcProviderService) {
+        this.reg = rpcProviderService.registerRpcImplementations(
+                new ServiceImplementationRequestImpl(rendererServiceOperations),
+                new ServiceDeleteImpl(rendererServiceOperations));
+        LOG.debug("TransportPCEServicePathRPCImpl instantiated");
+    }
+
+    @Deactivate
+    public void close() {
+        this.reg.close();
+        LOG.info("TransportPCEServicePathRPCImpl Closed");
+    }
+
+    public Registration getRegisteredRpc() {
+        return reg;
+    }
+
+}
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/RendererRollbackImpl.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/RendererRollbackImpl.java
new file mode 100644 (file)
index 0000000..50fdfa0
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.renderer.rpcs;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.RendererRollback;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.RendererRollbackInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.RendererRollbackOutput;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+
+
+/**
+ * Rollback created interfaces and cross connects specified by input.
+ *
+ */
+public class RendererRollbackImpl implements RendererRollback {
+    private DeviceRendererService deviceRendererService;
+
+    public RendererRollbackImpl(final DeviceRendererService deviceRendererService) {
+        this.deviceRendererService = requireNonNull(deviceRendererService);
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<RendererRollbackOutput>> invoke(RendererRollbackInput input) {
+        return RpcResultBuilder.success(this.deviceRendererService.rendererRollback(input)).buildFuture();
+    }
+
+}
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/ServiceDeleteImpl.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/ServiceDeleteImpl.java
new file mode 100644 (file)
index 0000000..debec5f
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.renderer.rpcs;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.ExecutionException;
+import org.opendaylight.transportpce.renderer.ModelMappingUtils;
+import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDelete;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteOutput;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class ServiceDeleteImpl implements ServiceDelete {
+    private static final Logger LOG = LoggerFactory.getLogger(ServiceDeleteImpl.class);
+    private final RendererServiceOperations rendererServiceOperations;
+
+    public ServiceDeleteImpl(final RendererServiceOperations rendererServiceOperations) {
+        this.rendererServiceOperations = requireNonNull(rendererServiceOperations);
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<ServiceDeleteOutput>> invoke(ServiceDeleteInput input) {
+        String serviceName = input.getServiceName();
+        LOG.info("Calling RPC service delete request {}", serviceName);
+        ServiceDeleteOutput output = null;
+        try {
+            output = this.rendererServiceOperations.serviceDelete(input, null).get();
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("RPC service delete failed !", e);
+            Thread.currentThread().interrupt();
+        }
+        return ModelMappingUtils.createServiceDeleteRpcResponse(output);
+    }
+
+}
similarity index 55%
rename from renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/TransportPCEServicePathRPCImpl.java
rename to renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/ServiceImplementationRequestImpl.java
index 31bdda59fcc8c76f07eaf5e5f0f706e18a6e59c9..3fb1e91704aac2f1fc41b58dfb6961ce8e2c5d8e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2017 AT&T and others.  All rights reserved.
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
@@ -7,55 +7,41 @@
  */
 package org.opendaylight.transportpce.renderer.rpcs;
 
+import static java.util.Objects.requireNonNull;
+
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.concurrent.ExecutionException;
 import org.opendaylight.transportpce.renderer.ModelMappingUtils;
 import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequest;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.TransportpceRendererService;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class TransportPCEServicePathRPCImpl implements TransportpceRendererService {
-
-    private static final Logger LOG = LoggerFactory.getLogger(TransportPCEServicePathRPCImpl.class);
 
+public class ServiceImplementationRequestImpl implements ServiceImplementationRequest {
+    private static final Logger LOG = LoggerFactory.getLogger(ServiceImplementationRequestImpl.class);
     private final RendererServiceOperations rendererServiceOperations;
 
-    public TransportPCEServicePathRPCImpl(RendererServiceOperations rendererServiceOperations) {
-        this.rendererServiceOperations = rendererServiceOperations;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<ServiceDeleteOutput>> serviceDelete(ServiceDeleteInput input) {
-        String serviceName = input.getServiceName();
-        LOG.info("Calling RPC service delete request {}", serviceName);
-        ServiceDeleteOutput output = null;
-        try {
-            output = this.rendererServiceOperations.serviceDelete(input, null).get();
-        } catch (InterruptedException | ExecutionException e) {
-            LOG.error("RPC service delete failed !", e);
-        }
-        return ModelMappingUtils.createServiceDeleteRpcResponse(output);
+    public ServiceImplementationRequestImpl(final RendererServiceOperations rendererServiceOperations) {
+        this.rendererServiceOperations = requireNonNull(rendererServiceOperations);
     }
 
     @Override
-    public ListenableFuture<RpcResult<ServiceImplementationRequestOutput>> serviceImplementationRequest(
+    public ListenableFuture<RpcResult<ServiceImplementationRequestOutput>> invoke(
             ServiceImplementationRequestInput input) {
         String serviceName = input.getServiceName();
         LOG.info("Calling RPC service impl request {}", serviceName);
         ServiceImplementationRequestOutput output = null;
         try {
-            output = this.rendererServiceOperations.serviceImplementation(input).get();
+            output = this.rendererServiceOperations.serviceImplementation(input, false).get();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("RPC service implementation failed !", e);
+            Thread.currentThread().interrupt();
         }
         return ModelMappingUtils.createServiceImplementationRpcResponse(output);
     }
 
 }
-
diff --git a/renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/ServicePathImpl.java b/renderer/src/main/java/org/opendaylight/transportpce/renderer/rpcs/ServicePathImpl.java
new file mode 100644 (file)
index 0000000..0bea071
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.renderer.rpcs;
+
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.ServicePath;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.ServicePathInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.ServicePathOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.ServicePathOutputBuilder;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+/**
+ * This class is the implementation of the 'service-path' RESTCONF service,
+ * which is one of the external APIs into the renderer application. The
+ * service provides two functions:
+ *
+ * <p>
+ * 1. Create This operation results in provisioning the device for a given
+ * wavelength and a list of nodes with each node listing its termination
+ * points.
+ *
+ * <p>
+ * 2. Delete This operation results in de-provisioning the device for a
+ * given wavelength and a list of nodes with each node listing its
+ * termination points.
+ *
+ * <p>
+ * The signature for this method was generated by yang tools from the
+ * renderer API model.
+ */
+public class ServicePathImpl implements ServicePath {
+    private static final Logger LOG = LoggerFactory.getLogger(ServicePathImpl.class);
+    private DeviceRendererService deviceRendererService;
+
+    public ServicePathImpl(final DeviceRendererService deviceRendererService) {
+        this.deviceRendererService = requireNonNull(deviceRendererService);
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<ServicePathOutput>> invoke(ServicePathInput input) {
+        if (input.getOperation() == null) {
+            LOG.debug("A mandatory input argument is null");
+            return RpcResultBuilder
+                .success(new ServicePathOutputBuilder().setResult("Invalid operation").build())
+                .buildFuture();
+        }
+        return switch (input.getOperation()) {
+            case Create -> {
+                LOG.info("Create operation request received");
+                yield RpcResultBuilder.success(this.deviceRendererService.setupServicePath(input, null))
+                    .buildFuture();
+            }
+            case Delete -> {
+                LOG.info("Delete operation request received");
+                yield RpcResultBuilder.success(this.deviceRendererService.deleteServicePath(input))
+                    .buildFuture();
+            }
+        };
+    }
+}
diff --git a/renderer/src/main/resources/OSGI-INF/blueprint/renderer-blueprint.xml b/renderer/src/main/resources/OSGI-INF/blueprint/renderer-blueprint.xml
deleted file mode 100644 (file)
index 72333af..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- vi: set et smarttab sw=4 tabstop=4: -->
-<!--
-Copyright © 2016 Orange and others. All rights reserved.
-
-This program and the accompanying materials are made available under the
-terms of the Eclipse Public License v1.0 which accompanies this distribution,
-and is available at http://www.eclipse.org/legal/epl-v10.html
--->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
-  xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
-  odl:use-default-for-reference-types="true">
-
- <reference id="dataBroker" interface="org.opendaylight.mdsal.binding.api.DataBroker"/>
-  <reference id="notificationPublishService"
-        interface="org.opendaylight.mdsal.binding.api.NotificationPublishService"/>
-  <reference id="rpcProviderService" interface="org.opendaylight.mdsal.binding.api.RpcProviderService" />
-  <reference id="deviceTransactionManager" interface="org.opendaylight.transportpce.common.device.DeviceTransactionManager" />
-  <reference id="openRoadmInterfaces" interface="org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces" />
-  <reference id="portMapping" interface="org.opendaylight.transportpce.common.mapping.PortMapping" />
-  <reference id="crossConnect" interface="org.opendaylight.transportpce.common.crossconnect.CrossConnect" />
-  <reference id="mappingUtils" interface="org.opendaylight.transportpce.common.mapping.MappingUtils"/>
-  <reference id="networkModelService" interface="org.opendaylight.transportpce.networkmodel.service.NetworkModelService"/>
-
-  <odl:rpc-service id="olmService"
-      interface="org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.TransportpceOlmService"/>
-
-  <bean id="openRoadmInterface121"
-        class="org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface121">
-    <argument ref="portMapping"/>
-    <argument ref="openRoadmInterfaces"/>
-  </bean>
-
-  <bean id="openRoadmInterface221"
-        class="org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface221">
-    <argument ref="portMapping"/>
-    <argument ref="openRoadmInterfaces"/>
-  </bean>
-
-  <bean id="openRoadmInterface710"
-        class="org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface710">
-    <argument ref="portMapping"/>
-    <argument ref="openRoadmInterfaces"/>
-  </bean>
-
-  <bean id="openRoadmOtnInterface221"
-        class="org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmOtnInterface221">
-    <argument ref="portMapping"/>
-    <argument ref="openRoadmInterfaces"/>
-  </bean>
-
-  <bean id="openRoadmOtnInterface710"
-    class="org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmOtnInterface710">
-    <argument ref="portMapping"/>
-    <argument ref="openRoadmInterfaces"/>
-  </bean>
-
-  <bean id="openRoadmInterfaceFactory"
-        class="org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterfaceFactory">
-    <argument ref="mappingUtils"/>
-    <argument ref="openRoadmInterface121"/>
-    <argument ref="openRoadmInterface221"/>
-    <argument ref="openRoadmInterface710"/>
-    <argument ref="openRoadmOtnInterface221"/>
-    <argument ref="openRoadmOtnInterface710"/>
-  </bean>
-
-  <bean id="deviceRenderer" class="org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererServiceImpl" >
-    <argument ref="dataBroker" />
-    <argument ref="deviceTransactionManager" />
-    <argument ref="openRoadmInterfaceFactory" />
-    <argument ref="openRoadmInterfaces" />
-    <argument ref="crossConnect" />
-    <argument ref="portMapping" />
-  </bean>
-
-  <bean id="otnDeviceRenderer" class="org.opendaylight.transportpce.renderer.provisiondevice.OtnDeviceRendererServiceImpl" >
-    <argument ref="openRoadmInterfaceFactory" />
-    <argument ref="crossConnect" />
-    <argument ref="openRoadmInterfaces" />
-    <argument ref="deviceTransactionManager" />
-    <argument ref="networkModelService" />
-  </bean>
-
-    <bean id="deviceRendererRPCImpl" class="org.opendaylight.transportpce.renderer.rpcs.DeviceRendererRPCImpl" >
-    <argument ref="deviceRenderer" />
-    <argument ref="otnDeviceRenderer" />
-  </bean>
-
-  <bean id="rendererServiceOperations" class="org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperationsImpl" >
-    <argument ref="deviceRenderer" />
-    <argument ref="otnDeviceRenderer"/>
-    <argument ref="olmService" />
-    <argument ref="dataBroker" />
-    <argument ref="notificationPublishService" />
-    <argument ref="portMapping" />
-  </bean>
-
-  <bean id="rendererProvider" class="org.opendaylight.transportpce.renderer.RendererProvider"
-        init-method="init" destroy-method="close">
-    <argument ref="rpcProviderService" />
-    <argument ref="deviceRendererRPCImpl" />
-    <argument ref="rendererServiceOperations" />
-  </bean>
-
-  <service ref="deviceRenderer"
-           interface="org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererService" />
-  <service ref="rendererServiceOperations"
-           interface="org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations" />
-  <service ref="otnDeviceRenderer"
-            interface="org.opendaylight.transportpce.renderer.provisiondevice.OtnDeviceRendererService"/>
-
-</blueprint>
diff --git a/renderer/src/test/java/org/opendaylight/transportpce/renderer/RendererProviderTest.java b/renderer/src/test/java/org/opendaylight/transportpce/renderer/RendererProviderTest.java
deleted file mode 100644 (file)
index b8a030b..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright © 2019 Orange, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.transportpce.renderer;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.mockito.junit.MockitoJUnitRunner;
-import org.opendaylight.mdsal.binding.api.RpcProviderService;
-import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations;
-import org.opendaylight.transportpce.renderer.rpcs.DeviceRendererRPCImpl;
-import org.opendaylight.transportpce.renderer.rpcs.TransportPCEServicePathRPCImpl;
-import org.opendaylight.transportpce.test.AbstractTest;
-
-@RunWith(MockitoJUnitRunner.StrictStubs.class)
-public class RendererProviderTest extends AbstractTest {
-
-    @Mock
-    RpcProviderService rpcProviderService;
-    @Mock
-    private RendererServiceOperations rendererServiceOperations;
-    @Mock
-    DeviceRendererRPCImpl deviceRendererRPC;
-    private AutoCloseable closeable;
-
-    @Before
-    public void openMocks() {
-        closeable = MockitoAnnotations.openMocks(this);
-    }
-
-    @Test
-    public void testInitMethodRegistersRendererToRpcService() {
-        RendererProvider provider =
-            new RendererProvider(rpcProviderService, deviceRendererRPC, rendererServiceOperations);
-        provider.init();
-
-        verify(rpcProviderService, times(1))
-                .registerRpcImplementation(any(), any(TransportPCEServicePathRPCImpl.class));
-        verify(rpcProviderService, times(1))
-                .registerRpcImplementation(any(), any(DeviceRendererRPCImpl.class));
-    }
-
-    @After
-    public void releaseMocks() throws Exception {
-        closeable.close();
-    }
-}
index 40138853e0c14468a53a195e1c9e0b7ffa610289..7b1bed19f23f9e627e5bd4458184a76879fd5854 100644 (file)
@@ -7,30 +7,31 @@
  */
 package org.opendaylight.transportpce.renderer;
 
-import org.junit.Assert;
-import org.junit.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
 import org.opendaylight.transportpce.renderer.provisiondevice.tasks.RollbackProcessor;
 
 public class RollbackProcessorTest {
 
     @Test
-    public void rollbackIfNecessaryTest() throws Exception {
+    void rollbackIfNecessaryTest() throws Exception {
         int rolledBack = -1;
         RollbackProcessor rollbackProcessor = new RollbackProcessor();
         rollbackProcessor.addTask(new TestRollbackTask("task1", false));
         rollbackProcessor.addTask(new TestRollbackTask("task2", false));
         rolledBack = rollbackProcessor.rollbackAllIfNecessary();
-        Assert.assertEquals(0, rolledBack);
+        assertEquals(0, rolledBack);
         rollbackProcessor.addTask(new TestRollbackTask("task3", true));
         rollbackProcessor.addTask(new TestRollbackTask("task4", false));
         rolledBack = rollbackProcessor.rollbackAllIfNecessary();
-        Assert.assertEquals(4, rolledBack);
+        assertEquals(4, rolledBack);
         rolledBack = rollbackProcessor.rollbackAllIfNecessary();
-        Assert.assertEquals(0, rolledBack);
+        assertEquals(0, rolledBack);
     }
 
     @Test
-    public void rollbackAllTest() throws Exception {
+    void rollbackAllTest() throws Exception {
         RollbackProcessor rollbackProcessor = new RollbackProcessor();
         rollbackProcessor.addTask(new TestRollbackTask("task1", false));
         rollbackProcessor.addTask(new TestRollbackTask("task2", false));
@@ -38,9 +39,8 @@ public class RollbackProcessorTest {
         rollbackProcessor.addTask(new TestRollbackTask("task4", false));
         int rolledBack = -1;
         rolledBack = rollbackProcessor.rollbackAll();
-        Assert.assertEquals(4, rolledBack);
+        assertEquals(4, rolledBack);
         rolledBack = rollbackProcessor.rollbackAll();
-        Assert.assertEquals(0, rolledBack);
+        assertEquals(0, rolledBack);
     }
-
-}
+}
\ No newline at end of file
index 4d6a21b3e878bde87cd0c32bdf150ee92089589b..05892be7dbffef7f98f852fd0c925c02d9448c30 100644 (file)
@@ -7,56 +7,66 @@
  */
 package org.opendaylight.transportpce.renderer.openroadminterface;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
 import java.math.BigDecimal;
 import java.util.Arrays;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mockito;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.transportpce.common.fixedflex.SpectrumInformation;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingBuilder;
 import org.opendaylight.yangtools.yang.common.Uint32;
 
 public class OpenRoadMInterface221Test extends AbstractTest {
 
-    private final PortMapping portMapping = Mockito.mock(PortMapping.class);
+    private final PortMapping portMapping = mock(PortMapping.class);
     private OpenRoadmInterface221 openRoadMInterface221;
     private final String nodeId = "node1";
 
-    @Before
-    public void setup() {
-        OpenRoadmInterfaces openRoadmInterfaces = Mockito.spy(OpenRoadmInterfaces.class);
+    @BeforeEach
+    void setup() {
+        OpenRoadmInterfaces openRoadmInterfaces = spy(OpenRoadmInterfaces.class);
         this.openRoadMInterface221 = new OpenRoadmInterface221(portMapping, openRoadmInterfaces);
     }
 
     @Test
-    public void testCreateOpenRoadmEthInterface() throws OpenRoadmInterfaceException {
+    void testCreateOpenRoadmEthInterface() throws OpenRoadmInterfaceException {
 
         String logicalConnPoint = "logicalConnPoint";
-        Mockito.when(portMapping.getMapping(nodeId, logicalConnPoint))
+        when(portMapping.getMapping(nodeId, logicalConnPoint))
             .thenReturn(new MappingBuilder().setSupportingCircuitPackName("circit-pack").setSupportingPort("port")
                 .setLogicalConnectionPoint(logicalConnPoint).build());
-        Assert.assertEquals(openRoadMInterface221.createOpenRoadmEthInterface(nodeId, logicalConnPoint),
-                logicalConnPoint + "-ETHERNET");
+        assertEquals(openRoadMInterface221.createOpenRoadmEthInterface(nodeId, logicalConnPoint),
+            logicalConnPoint + "-ETHERNET");
     }
 
-    @Test(expected = Exception.class)
-    public void testCreateOpenRoadmEthInterfaceThrowsExcpetion() throws OpenRoadmInterfaceException {
-
-        String logicalConnPoint = "logicalConnPoint";
-        Mockito.when(portMapping.getMapping(nodeId, logicalConnPoint)).thenReturn(null);
-        openRoadMInterface221.createOpenRoadmEthInterface(nodeId, logicalConnPoint);
+    @Test
+    void testCreateOpenRoadmEthInterfaceThrowsExcpetion() throws OpenRoadmInterfaceException {
+        when(portMapping.getMapping(eq(nodeId), any())).thenReturn(null);
+        Exception exception = assertThrows(OpenRoadmInterfaceException.class, () -> {
+            openRoadMInterface221.createOpenRoadmEthInterface(nodeId, "logicalConnPoint");
+        });
+        assertEquals(
+            "Unable to get mapping from PortMapping for node node1 and logical connection port logicalConnPoint",
+            exception.getMessage());
     }
 
     @Test
-    public void testCreateFlexOCH() throws OpenRoadmInterfaceException {
-
+    void testCreateFlexOCH() throws OpenRoadmInterfaceException {
         String logicalConnPoint = "logicalConnPoint";
-        Mockito.when(portMapping.getMapping(nodeId, logicalConnPoint))
+        when(portMapping.getMapping(nodeId, logicalConnPoint))
             .thenReturn(new MappingBuilder().setSupportingCircuitPackName("circit-pack").setSupportingPort("port")
                 .setLogicalConnectionPoint(logicalConnPoint).build());
         SpectrumInformation spectrumInformation = new SpectrumInformation();
@@ -64,16 +74,16 @@ public class OpenRoadMInterface221Test extends AbstractTest {
         spectrumInformation.setLowerSpectralSlotNumber(761);
         spectrumInformation.setHigherSpectralSlotNumber(768);
         spectrumInformation.setCenterFrequency(BigDecimal.valueOf(195.8));
-        Assert.assertNotNull(openRoadMInterface221.createFlexOCH(nodeId, logicalConnPoint, spectrumInformation));
-        Assert.assertEquals(openRoadMInterface221.createFlexOCH(nodeId, logicalConnPoint, spectrumInformation),
-                Arrays.asList(logicalConnPoint + "-nmc-761:768"));
+        assertNotNull(openRoadMInterface221.createFlexOCH(nodeId, logicalConnPoint, spectrumInformation));
+        assertEquals(openRoadMInterface221.createFlexOCH(nodeId, logicalConnPoint, spectrumInformation),
+            Arrays.asList(logicalConnPoint + "-nmc-761:768"));
     }
 
     @Test
-    public void testCreateFlexOCHReturnsMoreThanOneElement() throws OpenRoadmInterfaceException {
+    void testCreateFlexOCHReturnsMoreThanOneElement() throws OpenRoadmInterfaceException {
 
         String logicalConnPoint = "logicalConnPointDEG";
-        Mockito.when(portMapping.getMapping(nodeId, logicalConnPoint))
+        when(portMapping.getMapping(nodeId, logicalConnPoint))
             .thenReturn(new MappingBuilder().setSupportingCircuitPackName("circit-pack").setSupportingPort("port")
                 .setLogicalConnectionPoint(logicalConnPoint).build());
         SpectrumInformation spectrumInformation = new SpectrumInformation();
@@ -83,76 +93,70 @@ public class OpenRoadMInterface221Test extends AbstractTest {
         spectrumInformation.setCenterFrequency(BigDecimal.valueOf(195.8));
         spectrumInformation.setMinFrequency(BigDecimal.valueOf(195.775));
         spectrumInformation.setMaxFrequency(BigDecimal.valueOf(195.825));
-        Assert.assertNotNull(openRoadMInterface221.createFlexOCH(nodeId, logicalConnPoint,spectrumInformation));
-        Assert.assertEquals(openRoadMInterface221.createFlexOCH(nodeId, logicalConnPoint, spectrumInformation),
-                Arrays.asList(logicalConnPoint + "-mc-761:768", logicalConnPoint + "-nmc-761:768"));
+        assertNotNull(openRoadMInterface221.createFlexOCH(nodeId, logicalConnPoint,spectrumInformation));
+        assertEquals(openRoadMInterface221.createFlexOCH(nodeId, logicalConnPoint, spectrumInformation),
+            Arrays.asList(logicalConnPoint + "-mc-761:768", logicalConnPoint + "-nmc-761:768"));
     }
 
     @Test
-    public void testCreateOpenRoadmOchInterface() throws OpenRoadmInterfaceException {
-
+    void testCreateOpenRoadmOchInterface() throws OpenRoadmInterfaceException {
         String logicalConnPoint = "logicalConnPoint";
-        Mockito.when(portMapping.getMapping(nodeId, logicalConnPoint))
-                .thenReturn(new MappingBuilder().setSupportingCircuitPackName("circit-pack").setSupportingPort("port")
-                    .setLogicalConnectionPoint(logicalConnPoint).build());
+        when(portMapping.getMapping(nodeId, logicalConnPoint))
+            .thenReturn(new MappingBuilder().setSupportingCircuitPackName("circit-pack").setSupportingPort("port")
+                .setLogicalConnectionPoint(logicalConnPoint).build());
         SpectrumInformation spectrumInformation = new SpectrumInformation();
         spectrumInformation.setWaveLength(Uint32.valueOf(1));
         spectrumInformation.setLowerSpectralSlotNumber(761);
         spectrumInformation.setHigherSpectralSlotNumber(768);
         spectrumInformation.setCenterFrequency(BigDecimal.valueOf(195.8));
-        Assert.assertEquals(openRoadMInterface221.createOpenRoadmOchInterface(nodeId, logicalConnPoint,
-                spectrumInformation), logicalConnPoint + "-761:768");
+        assertEquals(openRoadMInterface221.createOpenRoadmOchInterface(nodeId, logicalConnPoint,
+            spectrumInformation), logicalConnPoint + "-761:768");
     }
 
     @Test
-    public void testCreateOpenRoadmOtu4Interface() throws OpenRoadmInterfaceException {
-
+    void testCreateOpenRoadmOtu4Interface() throws OpenRoadmInterfaceException {
         String logicalConnPoint = "logicalConnPoint";
         String supportOchInterface = "supportOchInterface";
-        Mockito.when(portMapping.getMapping(nodeId, logicalConnPoint))
+        when(portMapping.getMapping(nodeId, logicalConnPoint))
             .thenReturn(new MappingBuilder().setSupportingCircuitPackName("circit-pack").setSupportingPort("port")
                 .setLogicalConnectionPoint(logicalConnPoint).build());
-        Assert.assertEquals(openRoadMInterface221
-            .createOpenRoadmOtu4Interface(nodeId, logicalConnPoint, supportOchInterface, null, null),
+        assertEquals(
+            openRoadMInterface221.createOpenRoadmOtu4Interface(nodeId, logicalConnPoint, supportOchInterface, null,
+                null),
             logicalConnPoint + "-OTU");
-
     }
 
     @Test
-    public void testCreateOpenRoadmOchInterfaceName() {
-
+    void testCreateOpenRoadmOchInterfaceName() {
         String logicalConnPoint = "logicalConnPoint";
-        Assert.assertEquals(openRoadMInterface221.createOpenRoadmOchInterfaceName(logicalConnPoint, "761:768"),
-                logicalConnPoint + "-761:768");
-
+        assertEquals(openRoadMInterface221.createOpenRoadmOchInterfaceName(logicalConnPoint, "761:768"),
+            logicalConnPoint + "-761:768");
     }
 
     @Test
-    public void testCreateOpenRoadmOmsInterfaceSupportingOtsNotNull() throws OpenRoadmInterfaceException {
+    void testCreateOpenRoadmOmsInterfaceSupportingOtsNotNull() throws OpenRoadmInterfaceException {
         String logicalConnPoint = "logicalConnPoint";
         String supportingOts = "supportingOts";
-        Assert.assertEquals(openRoadMInterface221.createOpenRoadmOmsInterface(nodeId,
-                new MappingBuilder().setSupportingCircuitPackName("circit-pack").setSupportingPort("port")
-                    .setLogicalConnectionPoint(logicalConnPoint).setSupportingOts(supportingOts).build()),
-                "OMS-" + logicalConnPoint);
+        assertEquals(
+            openRoadMInterface221.createOpenRoadmOmsInterface(nodeId, new MappingBuilder()
+                .setSupportingCircuitPackName("circit-pack").setSupportingPort("port")
+                .setLogicalConnectionPoint(logicalConnPoint).setSupportingOts(supportingOts).build()),
+            "OMS-" + logicalConnPoint);
     }
 
     @Test
-    public void testCreateOpenRoadmOmsInterfaceSupportingOmsNotNullException() throws OpenRoadmInterfaceException {
-
-        Assert.assertNull(openRoadMInterface221.createOpenRoadmOmsInterface(nodeId, new MappingBuilder()
-                .setLogicalConnectionPoint("logicalConnPoint").build()));
+    void testCreateOpenRoadmOmsInterfaceSupportingOmsNotNullException() throws OpenRoadmInterfaceException {
+        assertNull(openRoadMInterface221.createOpenRoadmOmsInterface(nodeId, new MappingBuilder()
+            .setLogicalConnectionPoint("logicalConnPoint").build()));
     }
 
     @Test
-    public void testCreateOpenRoadmOmsInterfaceSupportingOmsNull() throws OpenRoadmInterfaceException {
-
+    void testCreateOpenRoadmOmsInterfaceSupportingOmsNull() throws OpenRoadmInterfaceException {
         String supportingOts = "supportingOts";
         String logicalConnPoint = "logicalConnPoint";
-        Assert.assertEquals(
-                openRoadMInterface221.createOpenRoadmOmsInterface(nodeId, new MappingBuilder()
-                        .setLogicalConnectionPoint(logicalConnPoint).setSupportingOts(supportingOts).build()),
-                "OMS-" + logicalConnPoint);
+        assertEquals(
+            openRoadMInterface221.createOpenRoadmOmsInterface(nodeId, new MappingBuilder()
+                .setLogicalConnectionPoint(logicalConnPoint).setSupportingOts(supportingOts).build()),
+            "OMS-" + logicalConnPoint);
     }
-
 }
index 3fd1f28e8cfcadb0d310eaed4f3a577e2ca02b4c..22a2c006f36307fa40ace2fba27d1d6085656f3e 100644 (file)
 
 package org.opendaylight.transportpce.renderer.provisiondevice;
 
-import java.util.ArrayList;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.when;
+
 import java.util.concurrent.ExecutionException;
-import org.junit.Assert;
-import org.junit.Test;
-import org.mockito.Mockito;
-import org.opendaylight.mdsal.binding.api.MountPoint;
-import org.opendaylight.mdsal.binding.api.MountPointService;
-import org.opendaylight.mdsal.binding.api.WriteTransaction;
-import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
-import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl;
-import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl121;
-import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl221;
-import org.opendaylight.transportpce.common.crossconnect.CrossConnectImpl710;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
-import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl;
 import org.opendaylight.transportpce.common.mapping.MappingUtils;
-import org.opendaylight.transportpce.common.mapping.MappingUtilsImpl;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl121;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl221;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl710;
-import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface121;
-import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface221;
-import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterface710;
-import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmInterfaceFactory;
-import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmOtnInterface221;
-import org.opendaylight.transportpce.renderer.openroadminterface.OpenRoadmOtnInterface710;
 import org.opendaylight.transportpce.renderer.utils.CreateOtsOmsDataUtils;
 import org.opendaylight.transportpce.renderer.utils.MountPointUtils;
-import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.transportpce.test.stub.MountPointServiceStub;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.CreateOtsOmsInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.CreateOtsOmsOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.OpenroadmNodeVersion;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfo;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.nodes.NodeInfoBuilder;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
 
-public class DeviceRendererServiceImplCreateOtsOmsTest extends AbstractTest {
+@ExtendWith(MockitoExtension.class)
+public class DeviceRendererServiceImplCreateOtsOmsTest {
 
-    private DeviceRendererService deviceRendererService;
-    private CrossConnect crossConnect;
-    private OpenRoadmInterfaces openRoadmInterfaces;
-    private OpenRoadmInterfaceFactory openRoadmInterfaceFactory;
+    @Mock
+    private DataBroker dataBroker;
+    @Mock
     private DeviceTransactionManager deviceTransactionManager;
+    @Mock
+    private OpenRoadmInterfaces openRoadmInterfaces;
+    @Mock
+    private CrossConnect crossConnect;
+    @Mock
     private MappingUtils mappingUtils;
-    private OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121;
-    private OpenRoadmInterfacesImpl221 openRoadmInterfacesImpl221;
-    private OpenRoadmInterfacesImpl710 openRoadmInterfacesImpl710;
-    private CrossConnectImpl121 crossConnectImpl121;
-    private CrossConnectImpl221 crossConnectImpl221;
-    private CrossConnectImpl710 crossConnectImpl710;
-    private final PortMapping portMapping = Mockito.mock(PortMapping.class);
-
-    private void setMountPoint(MountPoint mountPoint) {
-        MountPointService mountPointService = new MountPointServiceStub(mountPoint);
-        this.deviceTransactionManager = new DeviceTransactionManagerImpl(mountPointService, 3000);
-        this.mappingUtils = new MappingUtilsImpl(getDataBroker());
-        this.mappingUtils = Mockito.spy(MappingUtils.class);
-
-        Mockito.doReturn(StringConstants.OPENROADM_DEVICE_VERSION_1_2_1).when(mappingUtils)
-                .getOpenRoadmVersion(Mockito.anyString());
-        this.openRoadmInterfaces = new OpenRoadmInterfacesImpl(deviceTransactionManager, mappingUtils,
-            openRoadmInterfacesImpl121, openRoadmInterfacesImpl221, openRoadmInterfacesImpl710);
-        this.openRoadmInterfaces = Mockito.spy(this.openRoadmInterfaces);
-        OpenRoadmInterface121 openRoadmInterface121 = new OpenRoadmInterface121(portMapping,openRoadmInterfaces);
-        OpenRoadmInterface221 openRoadmInterface221 = new OpenRoadmInterface221(portMapping,openRoadmInterfaces);
-        OpenRoadmInterface710 openRoadmInterface710 = new OpenRoadmInterface710(portMapping, openRoadmInterfaces);
-        OpenRoadmOtnInterface221 openRoadmOTNInterface221 = new OpenRoadmOtnInterface221(portMapping,
-            openRoadmInterfaces);
-        OpenRoadmOtnInterface710 openRoadmOtnInterface710 = new OpenRoadmOtnInterface710(portMapping,
-            openRoadmInterfaces);
-        this.openRoadmInterfaceFactory = new OpenRoadmInterfaceFactory(this.mappingUtils,openRoadmInterface121,
-            openRoadmInterface221, openRoadmInterface710, openRoadmOTNInterface221, openRoadmOtnInterface710);
+    @Mock
+    private PortMapping portMapping;
+    private DeviceRendererService deviceRendererService;
+    private CreateOtsOmsInput input;
 
-        this.crossConnectImpl121 = new CrossConnectImpl121(this.deviceTransactionManager);
-        this.crossConnectImpl221 = new CrossConnectImpl221(this.deviceTransactionManager);
-        this.crossConnect = new CrossConnectImpl(this.deviceTransactionManager, this.mappingUtils,
-            this.crossConnectImpl121, this.crossConnectImpl221, this.crossConnectImpl710);
-        this.crossConnect = Mockito.spy(this.crossConnect);
-        this.deviceRendererService = new DeviceRendererServiceImpl(getDataBroker(),
-            this.deviceTransactionManager, this.openRoadmInterfaceFactory, this.openRoadmInterfaces,
-            this.crossConnect, portMapping);
+    @BeforeEach
+    void setup() {
+        deviceRendererService = new DeviceRendererServiceImpl(dataBroker, deviceTransactionManager, openRoadmInterfaces,
+                crossConnect, mappingUtils, portMapping);
+        input = CreateOtsOmsDataUtils.buildCreateOtsOms();
     }
 
     @Test
-    public void testCreateOtsOmsWhenDeviceIsNotMounted() throws OpenRoadmInterfaceException {
-        setMountPoint(null);
-        CreateOtsOmsInput input = CreateOtsOmsDataUtils.buildCreateOtsOms();
+    void testCreateOtsOmsFailsWhenDeviceIsNotMounted() throws OpenRoadmInterfaceException {
+        when(deviceTransactionManager.isDeviceMounted(any())).thenReturn(false);
         CreateOtsOmsOutput result = this.deviceRendererService.createOtsOms(input);
-        Assert.assertFalse(result.getSuccess());
-        Assert.assertEquals("node 1 is not mounted on the controller",
-            result.getResult());
+        assertFalse(result.getSuccess());
+        assertEquals("node 1 is not mounted on the controller", result.getResult());
     }
 
     @Test
-    public void testCreateOtsOmsWhenDeviceIsMountedWithNoMapping() throws OpenRoadmInterfaceException {
-        setMountPoint(MountPointUtils.getMountPoint(new ArrayList<>(), getDataBroker()));
-        CreateOtsOmsInput input = CreateOtsOmsDataUtils.buildCreateOtsOms();
+    void testCreateOtsOmsFailsWhenDeviceIsMountedWithNoMapping() throws OpenRoadmInterfaceException {
+        when(deviceTransactionManager.isDeviceMounted(any())).thenReturn(true);
+        when(portMapping.getMapping(any(), any())).thenReturn(null);
         CreateOtsOmsOutput result = this.deviceRendererService.createOtsOms(input);
-        Assert.assertFalse(result.getSuccess());
+        assertFalse(result.getSuccess());
+        assertEquals("Logical Connection point logical point does not exist for node 1", result.getResult());
     }
 
     @Test
-    public void testCreateOtsOmsWhenDeviceIsMountedWithMapping()
-            throws OpenRoadmInterfaceException, InterruptedException, ExecutionException {
-        InstanceIdentifier<NodeInfo> nodeInfoIID = InstanceIdentifier.builder(Network.class).child(Nodes.class,
-                new NodesKey("node 1")).child(NodeInfo.class).build();
-        InstanceIdentifier<Nodes> nodeIID = InstanceIdentifier.builder(Network.class).child(Nodes.class,
-                new NodesKey("node 1")).build();
-        final NodeInfo nodeInfo = new NodeInfoBuilder().setOpenroadmVersion(OpenroadmNodeVersion._221).build();
-        Nodes nodes = new NodesBuilder().setNodeId("node 1").setNodeInfo(nodeInfo).build();
-        WriteTransaction wr = getDataBroker().newWriteOnlyTransaction();
-        wr.merge(LogicalDatastoreType.CONFIGURATION, nodeIID, nodes);
-        wr.merge(LogicalDatastoreType.CONFIGURATION, nodeInfoIID, nodeInfo);
-        wr.commit().get();
-        setMountPoint(MountPointUtils.getMountPoint(new ArrayList<>(), getDataBroker()));
-        CreateOtsOmsInput input = CreateOtsOmsDataUtils.buildCreateOtsOms();
+    void testCreateOtsOms() throws OpenRoadmInterfaceException, InterruptedException, ExecutionException {
+        when(deviceTransactionManager.isDeviceMounted(any())).thenReturn(true);
+        when(mappingUtils.getOpenRoadmVersion(any())).thenReturn(StringConstants.OPENROADM_DEVICE_VERSION_2_2_1);
         Mapping mapping = MountPointUtils.createMapping(input.getNodeId(), input.getLogicalConnectionPoint());
-        Mockito.when(portMapping.getMapping(Mockito.anyString(), Mockito.anyString())).thenReturn(mapping);
+        when(portMapping.getMapping(anyString(), anyString())).thenReturn(mapping);
         CreateOtsOmsOutput result = this.deviceRendererService.createOtsOms(input);
-        Assert.assertTrue(result.getSuccess());
+        assertTrue(result.getSuccess());
     }
-
-}
+}
\ No newline at end of file
index a2671ba2ef3cb2dd6493c4b0b339b1ce5384211d..fbedc423b9ecb663bb57514281026c06db6ad0f1 100644 (file)
@@ -8,18 +8,30 @@
 
 package org.opendaylight.transportpce.renderer.provisiondevice;
 
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
 import com.google.common.util.concurrent.ListenableFuture;
-import java.util.Collections;
 import java.util.Map;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeoutException;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mockito;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.MountPoint;
 import org.opendaylight.mdsal.binding.api.MountPointService;
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.mdsal.binding.api.RpcService;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.ResponseCodes;
 import org.opendaylight.transportpce.common.StringConstants;
@@ -27,7 +39,7 @@ import org.opendaylight.transportpce.common.crossconnect.CrossConnect;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
-import org.opendaylight.transportpce.renderer.stub.OlmServiceStub;
+import org.opendaylight.transportpce.renderer.provisiondevice.notification.NotificationSender;
 import org.opendaylight.transportpce.renderer.utils.NotificationPublishServiceMock;
 import org.opendaylight.transportpce.renderer.utils.ServiceDeleteDataUtils;
 import org.opendaylight.transportpce.renderer.utils.TransactionUtils;
@@ -35,20 +47,20 @@ import org.opendaylight.transportpce.test.AbstractTest;
 import org.opendaylight.transportpce.test.stub.MountPointServiceStub;
 import org.opendaylight.transportpce.test.stub.MountPointStub;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.ServicePathOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndown;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.TransportpceOlmService;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteOutput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ConnectionType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceAEnd;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceAEndBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.TxDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.TxDirectionKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.port.PortBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ConnectionType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.ServiceAEnd;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.TxDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.TxDirectionKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.port.PortBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.ServicesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.ServicesBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.handler.header.ServiceHandlerHeaderBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.ServicePathList;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePaths;
@@ -59,41 +71,48 @@ import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.opendaylight.yangtools.yang.common.Uint8;
 
+@ExtendWith(MockitoExtension.class)
 public class RendererServiceOperationsImplDeleteTest extends AbstractTest {
 
     private DeviceTransactionManager deviceTransactionManager;
+    @Mock
+    private DeviceRendererService deviceRenderer;
+    @Mock
+    private OtnDeviceRendererService otnDeviceRendererService;
+    private DataBroker dataBroker;
+    @Mock
+    private PortMapping portMapping;
+    @Mock
+    private RpcService rpcService;
+    @Mock
+    private CrossConnect crossConnect;
+    @Mock
+    private ServicePowerTurndown servicePowerTurndown;
     private RendererServiceOperationsImpl rendererServiceOperations;
-    private final DeviceRendererService deviceRenderer = Mockito.mock(DeviceRendererService.class);
-    private final OtnDeviceRendererService otnDeviceRendererService = Mockito.mock(OtnDeviceRendererService.class);
-    private final PortMapping portMapping = Mockito.mock(PortMapping.class);
-    private final CrossConnect crossConnect = Mockito.mock(CrossConnect.class);
-    private TransportpceOlmService olmService;
 
     private void setMountPoint(MountPoint mountPoint) {
         MountPointService mountPointService = new MountPointServiceStub(mountPoint);
         this.deviceTransactionManager = new DeviceTransactionManagerImpl(mountPointService, 3000);
     }
 
-    @Before
-    public void setUp() {
-        setMountPoint(new MountPointStub(getDataBroker()));
-        this.olmService = new OlmServiceStub();
-        this.olmService = Mockito.spy(this.olmService);
+    @BeforeEach
+    void setUp() {
+        dataBroker = getNewDataBroker();
+        setMountPoint(new MountPointStub(dataBroker));
         NotificationPublishService notificationPublishService = new NotificationPublishServiceMock();
         this.rendererServiceOperations =  new RendererServiceOperationsImpl(deviceRenderer,
-            otnDeviceRendererService, olmService, getDataBroker(), notificationPublishService, portMapping);
+            otnDeviceRendererService, dataBroker, new NotificationSender(notificationPublishService), portMapping,
+            rpcService);
     }
 
 
     @Test
-    public void serviceDeleteOperationPp() throws ExecutionException, InterruptedException, TimeoutException {
+    void serviceDeleteOperationPp() throws ExecutionException, InterruptedException, TimeoutException {
         writePathDescription();
         ServiceDeleteInputBuilder serviceDeleteInputBuilder = new ServiceDeleteInputBuilder();
         serviceDeleteInputBuilder.setServiceName("service 1");
         serviceDeleteInputBuilder.setServiceHandlerHeader((new ServiceHandlerHeaderBuilder())
             .setRequestId("request1").build());
-        Mockito.doReturn(Collections.emptyList()).when(this.crossConnect).deleteCrossConnect(Mockito.anyString(),
-            Mockito.anyString(), Mockito.eq(false));
         ServiceAEnd serviceAEnd = new ServiceAEndBuilder()
             .setServiceFormat(ServiceFormat.Ethernet)
             .setServiceRate(Uint32.valueOf("100"))
@@ -107,18 +126,21 @@ public class RendererServiceOperationsImplDeleteTest extends AbstractTest {
             .setConnectionType(ConnectionType.Service)
             .setServiceAEnd(serviceAEnd)
             .build();
-        Mockito.when(portMapping.getMapping(Mockito.anyString(), Mockito.anyString()))
-            .thenReturn(null);
-        Mockito.when(deviceRenderer.deleteServicePath(Mockito.any()))
+        when(portMapping.getMapping(anyString(), anyString())).thenReturn(null);
+        when(deviceRenderer.deleteServicePath(any()))
             .thenReturn(new ServicePathOutputBuilder().setSuccess(true).build());
-        ServiceDeleteOutput serviceDeleteOutput
-                = this.rendererServiceOperations.serviceDelete(serviceDeleteInputBuilder.build(), service).get();
-        Assert.assertEquals(ResponseCodes.RESPONSE_OK,
-            serviceDeleteOutput.getConfigurationResponseCommon().getResponseCode());
+        when(rpcService.getRpc(ServicePowerTurndown.class)).thenReturn(servicePowerTurndown);
+        doReturn(RpcResultBuilder
+                .success(new ServicePowerTurndownOutputBuilder().setResult(ResponseCodes.SUCCESS_RESULT).build())
+                .buildFuture())
+            .when(servicePowerTurndown).invoke(any());
+        ServiceDeleteOutput serviceDeleteOutput = this.rendererServiceOperations
+            .serviceDelete(serviceDeleteInputBuilder.build(), service).get();
+        assertEquals(ResponseCodes.RESPONSE_OK, serviceDeleteOutput.getConfigurationResponseCommon().getResponseCode());
     }
 
     @Test
-    public void serviceDeleteOperationNoDescription() throws InterruptedException, ExecutionException {
+    void serviceDeleteOperationWithoutPathDescription() throws InterruptedException, ExecutionException {
         ServiceDeleteInputBuilder serviceDeleteInputBuilder = new ServiceDeleteInputBuilder();
         serviceDeleteInputBuilder.setServiceName("service 1");
         Services service = new ServicesBuilder()
@@ -126,119 +148,114 @@ public class RendererServiceOperationsImplDeleteTest extends AbstractTest {
             .setServiceAEnd(new ServiceAEndBuilder()
                 .setServiceFormat(ServiceFormat.Ethernet)
                 .setServiceRate(Uint32.valueOf(100))
-                .setTxDirection(Map.of(new TxDirectionKey(Uint8.ZERO),
-                    new TxDirectionBuilder().setIndex(Uint8.ZERO).setPort(new PortBuilder().setPortName("port-name")
-                        .build()).build()))
+                .setTxDirection(Map.of(
+                        new TxDirectionKey(Uint8.ZERO),
+                        new TxDirectionBuilder().setIndex(Uint8.ZERO).setPort(new PortBuilder()
+                            .setPortName("port-name").build()).build()))
                 .setNodeId(new NodeIdType("optical-node1"))
                 .build())
             .build();
-        Mockito.when(portMapping.getMapping(Mockito.anyString(), Mockito.anyString()))
-            .thenReturn(null);
-        Mockito.doReturn(RpcResultBuilder.success((new ServicePowerTurndownOutputBuilder())
-            .setResult("Failed").build()).buildFuture()).when(this.olmService).servicePowerTurndown(Mockito.any());
         ServiceDeleteOutput serviceDeleteOutput
                 = this.rendererServiceOperations.serviceDelete(serviceDeleteInputBuilder.build(), service).get();
-        Assert.assertEquals(ResponseCodes.RESPONSE_FAILED,
+        assertEquals(
+            ResponseCodes.RESPONSE_FAILED,
             serviceDeleteOutput.getConfigurationResponseCommon().getResponseCode());
-        Mockito.verify(this.crossConnect, Mockito.times(0))
-                .deleteCrossConnect(Mockito.any(), Mockito.any(), Mockito.eq(false));
+        verify(this.crossConnect, times(0)).deleteCrossConnect(any(), any(), eq(false));
     }
 
     @Test
-    public void serviceDeleteOperationTearDownFailedAtoZ() throws ExecutionException, InterruptedException {
-        Mockito.doReturn(Collections.emptyList()).when(this.crossConnect).deleteCrossConnect(Mockito.anyString(),
-            Mockito.anyString(), Mockito.eq(false));
-        Mockito.doReturn(RpcResultBuilder.success((new ServicePowerTurndownOutputBuilder())
-            .setResult("Failed").build()).buildFuture()).when(this.olmService).servicePowerTurndown(Mockito.any());
-
+    void serviceDeleteOperationTearDownFailedAtoZ() throws ExecutionException, InterruptedException {
         writePathDescription();
-        ServiceDeleteInputBuilder serviceDeleteInputBuilder = new ServiceDeleteInputBuilder();
-        serviceDeleteInputBuilder.setServiceName("service 1");
-        serviceDeleteInputBuilder.setServiceHandlerHeader((new ServiceHandlerHeaderBuilder())
-                .setRequestId("request1").build());
-        ServiceAEnd serviceAEnd = new ServiceAEndBuilder()
-            .setServiceFormat(ServiceFormat.Ethernet)
-            .setServiceRate(Uint32.valueOf("100"))
-            .setTxDirection(Map.of(new TxDirectionKey(Uint8.ZERO),
-                new TxDirectionBuilder().setIndex(Uint8.ZERO).setPort(new PortBuilder().setPortName("port-name")
-                    .build()).build()))
-            .setNodeId(new NodeIdType("optical-node1"))
-            .build();
         Services service = new ServicesBuilder()
             .setServiceName("service 1")
             .setConnectionType(ConnectionType.Service)
-            .setServiceAEnd(serviceAEnd)
+            .setServiceAEnd(new ServiceAEndBuilder()
+                .setServiceFormat(ServiceFormat.Ethernet)
+                .setServiceRate(Uint32.valueOf("100"))
+                .setTxDirection(Map.of(
+                    new TxDirectionKey(Uint8.ZERO),
+                    new TxDirectionBuilder()
+                        .setIndex(Uint8.ZERO)
+                        .setPort(new PortBuilder().setPortName("port-name").build())
+                        .build()))
+                .setNodeId(new NodeIdType("optical-node1"))
+                .build())
             .build();
-        Mockito.when(portMapping.getMapping(Mockito.anyString(), Mockito.anyString()))
+        when(portMapping.getMapping(anyString(), anyString()))
             .thenReturn(null);
-        ListenableFuture<ServiceDeleteOutput> serviceDeleteOutput
-                = this.rendererServiceOperations.serviceDelete(serviceDeleteInputBuilder.build(), service);
+        when(rpcService.getRpc(ServicePowerTurndown.class)).thenReturn(servicePowerTurndown);
+        doReturn(RpcResultBuilder
+                .success(new ServicePowerTurndownOutputBuilder().setResult(ResponseCodes.FAILED_RESULT).build())
+                .buildFuture())
+            .when(servicePowerTurndown).invoke(any());
+
+        ListenableFuture<ServiceDeleteOutput> serviceDeleteOutput = this.rendererServiceOperations
+            .serviceDelete(
+                new ServiceDeleteInputBuilder()
+                    .setServiceName("service 1")
+                    .setServiceHandlerHeader((new ServiceHandlerHeaderBuilder()).setRequestId("request1").build())
+                    .build(),
+                service);
         ServiceDeleteOutput output = serviceDeleteOutput.get();
-        Assert.assertEquals(ResponseCodes.RESPONSE_FAILED,
+        assertEquals(ResponseCodes.RESPONSE_FAILED,
                 output.getConfigurationResponseCommon().getResponseCode());
-        Mockito.verify(this.crossConnect, Mockito.times(0)).deleteCrossConnect(Mockito.eq("node1"), Mockito.any(),
-            Mockito.eq(false));
-        Mockito.verify(this.crossConnect, Mockito.times(0)).deleteCrossConnect(Mockito.eq("node2"), Mockito.any(),
-            Mockito.eq(false));
+        verify(this.crossConnect, times(0)).deleteCrossConnect(eq("node1"), any(), eq(false));
+        verify(this.crossConnect, times(0)).deleteCrossConnect(eq("node2"), any(), eq(false));
     }
 
     @Test
-    public void serviceDeleteOperationTearDownFailedZtoA() throws ExecutionException, InterruptedException {
-        Mockito.doReturn(Collections.emptyList()).when(this.crossConnect).deleteCrossConnect(Mockito.anyString(),
-            Mockito.anyString(), Mockito.eq(false));
-        Mockito.when(this.olmService.servicePowerTurndown(Mockito.any()))
-            .thenReturn(RpcResultBuilder.success((new ServicePowerTurndownOutputBuilder())
-                .setResult("Success").build()).buildFuture())
-            .thenReturn(RpcResultBuilder.success((new ServicePowerTurndownOutputBuilder())
-                .setResult("Failed").build()).buildFuture());
-
+    void serviceDeleteOperationTearDownFailedZtoA() throws ExecutionException, InterruptedException {
         writePathDescription();
-        ServiceDeleteInputBuilder serviceDeleteInputBuilder = new ServiceDeleteInputBuilder();
-        serviceDeleteInputBuilder.setServiceName("service 1");
-        serviceDeleteInputBuilder.setServiceHandlerHeader((new ServiceHandlerHeaderBuilder())
-            .setRequestId("request1").build());
-        ServiceAEnd serviceAEnd = new ServiceAEndBuilder()
-            .setServiceFormat(ServiceFormat.Ethernet)
-            .setServiceRate(Uint32.valueOf("100"))
-            .setTxDirection(Map.of(new TxDirectionKey(Uint8.ZERO),
-                new TxDirectionBuilder().setIndex(Uint8.ZERO).setPort(new PortBuilder().setPortName("port-name")
-                    .build()).build()))
-            .setNodeId(new NodeIdType("optical-node1"))
-            .build();
-        Services service = new ServicesBuilder()
-            .setServiceName("service 1")
-            .setConnectionType(ConnectionType.Service)
-            .setServiceAEnd(serviceAEnd)
-            .build();
-        Mockito.when(portMapping.getMapping(Mockito.anyString(), Mockito.anyString()))
+        when(rpcService.getRpc(ServicePowerTurndown.class)).thenReturn(servicePowerTurndown);
+        when(servicePowerTurndown.invoke(any()))
+            .thenReturn(RpcResultBuilder.success((new ServicePowerTurndownOutputBuilder()).setResult("Success").build())
+                .buildFuture())
+            .thenReturn(RpcResultBuilder.success((new ServicePowerTurndownOutputBuilder()).setResult("Failed").build())
+                .buildFuture());
+        when(portMapping.getMapping(anyString(), anyString()))
             .thenReturn(null);
-        ServiceDeleteOutput serviceDeleteOutput =
-                this.rendererServiceOperations.serviceDelete(serviceDeleteInputBuilder.build(), service).get();
-        Assert.assertEquals(ResponseCodes.RESPONSE_FAILED,
+        ServiceDeleteOutput serviceDeleteOutput = this.rendererServiceOperations.serviceDelete(
+                new ServiceDeleteInputBuilder()
+                    .setServiceName("service 1")
+                    .setServiceHandlerHeader((new ServiceHandlerHeaderBuilder()).setRequestId("request1").build())
+                    .build(),
+                new ServicesBuilder()
+                    .setServiceName("service 1")
+                    .setConnectionType(ConnectionType.Service)
+                    .setServiceAEnd(new ServiceAEndBuilder()
+                        .setServiceFormat(ServiceFormat.Ethernet)
+                        .setServiceRate(Uint32.valueOf("100"))
+                        .setTxDirection(Map.of(
+                            new TxDirectionKey(Uint8.ZERO),
+                            new TxDirectionBuilder()
+                                .setIndex(Uint8.ZERO)
+                                .setPort(new PortBuilder().setPortName("port-name").build())
+                                .build()))
+                        .setNodeId(new NodeIdType("optical-node1"))
+                        .build())
+                    .build())
+            .get();
+        assertEquals(ResponseCodes.RESPONSE_FAILED,
             serviceDeleteOutput.getConfigurationResponseCommon().getResponseCode());
-        Mockito.verify(this.olmService, Mockito.times(2)).servicePowerTurndown(Mockito.any());
-        Mockito.verify(this.crossConnect, Mockito.times(0)).deleteCrossConnect(Mockito.eq("node1"), Mockito.any(),
-            Mockito.eq(false));
-        Mockito.verify(this.crossConnect, Mockito.times(0)).deleteCrossConnect(Mockito.eq("node2"), Mockito.any(),
-            Mockito.eq(false));
+        verify(servicePowerTurndown, times(2)).invoke(any());
+        verify(this.crossConnect, times(0)).deleteCrossConnect(eq("node1"), any(),eq(false));
+        verify(this.crossConnect, times(0)).deleteCrossConnect(eq("node2"), any(),eq(false));
     }
 
     private void writePathDescription() throws ExecutionException, InterruptedException {
-        ServicePathsBuilder servicePathsBuilder = new ServicePathsBuilder();
-        servicePathsBuilder.setPathDescription(ServiceDeleteDataUtils
-            .createTransactionPathDescription(StringConstants.PP_TOKEN));
-        servicePathsBuilder.setServiceAEnd(ServiceDeleteDataUtils.getServiceAEndBuild().build())
-            .setServiceZEnd(ServiceDeleteDataUtils.getServiceZEndBuild().build());
-        servicePathsBuilder.withKey(new ServicePathsKey("service 1"));
-        servicePathsBuilder.setServiceHandlerHeader(new ServiceHandlerHeaderBuilder().setRequestId("Request 1")
-            .build());
-        InstanceIdentifier<ServicePaths> servicePathsInstanceIdentifier = InstanceIdentifier.create(
-            ServicePathList.class).child(ServicePaths.class, new ServicePathsKey("service 1"));
         TransactionUtils.writeTransaction(
-            this.deviceTransactionManager,
-            "node1" + StringConstants.PP_TOKEN,
-            LogicalDatastoreType.OPERATIONAL,
-            servicePathsInstanceIdentifier,
-            servicePathsBuilder.build());
+                this.deviceTransactionManager,
+                "node1" + StringConstants.PP_TOKEN,
+                LogicalDatastoreType.OPERATIONAL,
+                InstanceIdentifier.create(ServicePathList.class)
+                    .child(ServicePaths.class, new ServicePathsKey("service 1")),
+                new ServicePathsBuilder()
+                    .setPathDescription(ServiceDeleteDataUtils
+                        .createTransactionPathDescription(StringConstants.PP_TOKEN))
+                    .setServiceAEnd(ServiceDeleteDataUtils.getServiceAEndBuild().build())
+                    .setServiceZEnd(ServiceDeleteDataUtils.getServiceZEndBuild().build())
+                    .withKey(new ServicePathsKey("service 1"))
+                    .setServiceHandlerHeader(new ServiceHandlerHeaderBuilder().setRequestId("Request 1").build())
+                    .build());
     }
-}
+}
\ No newline at end of file
index 51d195a43a10bb63698f907cf6cc35dec28bf94b..a16530d1c35f3eadc0cda6e506a323ce34129977 100644 (file)
  */
 package org.opendaylight.transportpce.renderer.provisiondevice;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.when;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mockito;
-import org.opendaylight.mdsal.binding.api.MountPoint;
-import org.opendaylight.mdsal.binding.api.MountPointService;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Disabled;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.mdsal.binding.api.RpcService;
 import org.opendaylight.transportpce.common.ResponseCodes;
 import org.opendaylight.transportpce.common.StringConstants;
-import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
-import org.opendaylight.transportpce.common.device.DeviceTransactionManagerImpl;
-import org.opendaylight.transportpce.common.mapping.MappingUtils;
-import org.opendaylight.transportpce.common.mapping.MappingUtilsImpl;
 import org.opendaylight.transportpce.common.mapping.PortMapping;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaces;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl121;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl221;
-import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfacesImpl710;
-import org.opendaylight.transportpce.renderer.stub.OlmServiceStub;
+import org.opendaylight.transportpce.renderer.provisiondevice.notification.NotificationSender;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.history.History;
 import org.opendaylight.transportpce.renderer.utils.NotificationPublishServiceMock;
 import org.opendaylight.transportpce.renderer.utils.ServiceDataUtils;
-import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.transportpce.test.stub.MountPointServiceStub;
-import org.opendaylight.transportpce.test.stub.MountPointStub;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.RendererRollbackOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.ServicePathOutput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.ServicePathOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPm;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmInputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmOutput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.TransportpceOlmService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetup;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndown;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownOutputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.get.pm.output.Measurements;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.get.pm.output.MeasurementsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.nodes.NodeInfo;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.pm.types.rev161014.PmGranularity;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.NodeTypes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.resource.types.rev161014.ResourceTypeEnum;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.olm.get.pm.input.ResourceIdentifierBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.PmGranularity;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.olm.get.pm.input.ResourceIdentifierBuilder;
 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 
-public class RendererServiceOperationsImplTest extends AbstractTest {
-
-    private MountPointService mountPointService;
-    private DeviceTransactionManager deviceTransactionManager;
-    private final DeviceRendererService deviceRenderer = Mockito.mock(DeviceRendererService.class);
-    private final OtnDeviceRendererService otnDeviceRendererService = Mockito.mock(OtnDeviceRendererService.class);
-    private final PortMapping portMapping = Mockito.mock(PortMapping.class);
+@ExtendWith(MockitoExtension.class)
+public class RendererServiceOperationsImplTest {
+
+    @Mock
+    private DeviceRendererService deviceRenderer;
+    @Mock
+    private OtnDeviceRendererService otnDeviceRendererService;
+    @Mock
+    private DataBroker dataBroker;
+    @Mock
+    private PortMapping portMapping;
+    @Mock
+    private RpcService rpcService;
+    @Mock
+    private ServicePowerSetup servicePowerSetup;
+    @Mock
+    private ServicePowerTurndown servicePowerTurndown;
+    @Mock
+    private GetPm getPm;
+    @Mock
+    private Nodes node;
+    @Mock
+    private NodeInfo nodeInfo;
     private RendererServiceOperationsImpl rendererServiceOperations;
-    private OpenRoadmInterfaces openRoadmInterfaces;
-    private TransportpceOlmService olmService;
-    private MappingUtils mappingUtils;
-    private OpenRoadmInterfacesImpl121 openRoadmInterfacesImpl121;
-    private OpenRoadmInterfacesImpl221 openRoadmInterfacesImpl221;
-    private OpenRoadmInterfacesImpl710 openRoadmInterfacesImpl710;
-
-    private void setMountPoint(MountPoint mountPoint) {
-        this.mountPointService = new MountPointServiceStub(mountPoint);
-        this.deviceTransactionManager = new DeviceTransactionManagerImpl(this.mountPointService, 3000);
-        this.mappingUtils = new MappingUtilsImpl(getDataBroker());
-        this.openRoadmInterfaces = new OpenRoadmInterfacesImpl(deviceTransactionManager, mappingUtils,
-            openRoadmInterfacesImpl121, openRoadmInterfacesImpl221, openRoadmInterfacesImpl710);
-        this.openRoadmInterfaces = Mockito.spy(this.openRoadmInterfaces);
-    }
-
-    @Before
-    public void setUp() throws OpenRoadmInterfaceException {
-        setMountPoint(new MountPointStub(getDataBroker()));
-        this.olmService = new OlmServiceStub();
-        Mockito.doNothing().when(this.openRoadmInterfaces).postEquipmentState(Mockito.anyString(),
-            Mockito.anyString(), Mockito.anyBoolean());
-        NotificationPublishService notificationPublishService = new NotificationPublishServiceMock();
-        this.olmService = Mockito.spy(this.olmService);
-        this.rendererServiceOperations =  new RendererServiceOperationsImpl(deviceRenderer,
-            otnDeviceRendererService, this.olmService, getDataBroker(), notificationPublishService, portMapping);
-    }
-
-    @Test
-    public void serviceImplementationTerminationPointAsResourceTtp() throws InterruptedException, ExecutionException {
-
-        ServiceImplementationRequestInput input = ServiceDataUtils
-            .buildServiceImplementationRequestInputTerminationPointResource(StringConstants.TTP_TOKEN);
-        ServicePathOutputBuilder mockOutputBuilder = new ServicePathOutputBuilder().setResult("success")
-            .setSuccess(true);
-        Mockito.doReturn(mockOutputBuilder.build()).when(this.deviceRenderer).setupServicePath(Mockito.any(),
-            Mockito.any());
-        ServiceImplementationRequestOutput result = this.rendererServiceOperations.serviceImplementation(input).get();
-        Assert.assertEquals(ResponseCodes.RESPONSE_OK, result.getConfigurationResponseCommon().getResponseCode());
-
-    }
-
-    @Test
-    public void serviceImplementationTerminationPointAsResourceTtp2() throws InterruptedException, ExecutionException {
-
-        ServiceImplementationRequestInput input = ServiceDataUtils
-            .buildServiceImplementationRequestInputTerminationPointResource(StringConstants.TTP_TOKEN);
-        ServicePathOutputBuilder mockOutputBuilder = new ServicePathOutputBuilder().setResult("success")
-            .setSuccess(true);
-        Mockito.doReturn(mockOutputBuilder.build()).when(this.deviceRenderer).setupServicePath(Mockito.any(),
-            Mockito.any());
-        Mockito.doReturn(RpcResultBuilder.failed().buildFuture()).when(this.olmService)
-            .servicePowerSetup(Mockito.any());
-        ServiceImplementationRequestOutput result = this.rendererServiceOperations.serviceImplementation(input).get();
-        Assert.assertEquals(ResponseCodes.RESPONSE_FAILED, result.getConfigurationResponseCommon().getResponseCode());
-
-    }
 
-    @Test
-    public void serviceImplementationTerminationPointAsResourcePp() throws InterruptedException, ExecutionException {
-
-        ServiceImplementationRequestInput input = ServiceDataUtils
-            .buildServiceImplementationRequestInputTerminationPointResource(StringConstants.PP_TOKEN);
-        ServicePathOutputBuilder mockOutputBuilder = new ServicePathOutputBuilder().setResult("success")
-            .setSuccess(true);
-        Mockito.doReturn(mockOutputBuilder.build()).when(this.deviceRenderer).setupServicePath(Mockito.any(),
-            Mockito.any());
-        ServiceImplementationRequestOutput result = this.rendererServiceOperations.serviceImplementation(input).get();
-        Assert.assertEquals(ResponseCodes.RESPONSE_OK, result.getConfigurationResponseCommon().getResponseCode());
 
+    @BeforeEach
+    void setUp() throws OpenRoadmInterfaceException {
+        NotificationPublishService notificationPublishService = new NotificationPublishServiceMock();
+        this.rendererServiceOperations = new RendererServiceOperationsImpl(deviceRenderer, otnDeviceRendererService,
+                dataBroker, new NotificationSender(notificationPublishService), portMapping, rpcService);
     }
 
     @Test
-    public void serviceImplementationTerminationPointAsResourceNetwork()
-            throws InterruptedException, ExecutionException {
-
+    void serviceImplementationTerminationPointAsResourceTtp() throws InterruptedException, ExecutionException {
         ServiceImplementationRequestInput input = ServiceDataUtils
-            .buildServiceImplementationRequestInputTerminationPointResource(StringConstants.NETWORK_TOKEN);
-        ServicePathOutputBuilder mockOutputBuilder = new ServicePathOutputBuilder().setResult("success")
-            .setSuccess(true);
-        Mockito.doReturn(mockOutputBuilder.build()).when(this.deviceRenderer).setupServicePath(Mockito.any(),
-            Mockito.any());
-        ServiceImplementationRequestOutput result = this.rendererServiceOperations.serviceImplementation(input).get();
-        Assert.assertEquals(ResponseCodes.RESPONSE_OK, result.getConfigurationResponseCommon().getResponseCode());
-
+                .buildServiceImplementationRequestInputTerminationPointResource(StringConstants.TTP_TOKEN);
+        when(deviceRenderer.setupServicePath(any(), any(), any()))
+                .thenReturn(new ServicePathOutputBuilder().setResult("success").setSuccess(true).build());
+
+        when(rpcService.getRpc(ServicePowerSetup.class)).thenReturn(servicePowerSetup);
+        when(rpcService.getRpc(ServicePowerTurndown.class)).thenReturn(servicePowerTurndown);
+        when(rpcService.getRpc(GetPm.class)).thenReturn(getPm);
+        doReturn(RpcResultBuilder
+                .success(new ServicePowerSetupOutputBuilder().setResult(ResponseCodes.SUCCESS_RESULT).build())
+                .buildFuture()).when(servicePowerSetup).invoke(any());
+        doReturn(RpcResultBuilder.success(new GetPmOutputBuilder().setNodeId("node id").build()).buildFuture())
+                .when(getPm).invoke(any());
+        when(portMapping.getNode(any())).thenReturn(node);
+        when(node.getNodeInfo()).thenReturn(nodeInfo);
+        when(nodeInfo.getNodeType()).thenReturn(NodeTypes.Xpdr);
+
+        ServiceImplementationRequestOutput result = this.rendererServiceOperations.serviceImplementation(input, false)
+                .get();
+        assertEquals(ResponseCodes.RESPONSE_OK, result.getConfigurationResponseCommon().getResponseCode());
     }
 
     @Test
-    public void serviceImplementationTerminationPointAsResourceClient()
-            throws InterruptedException, ExecutionException {
-
+    void serviceImplementationTerminationPointAsResourceTtp2() throws InterruptedException, ExecutionException {
         ServiceImplementationRequestInput input = ServiceDataUtils
-            .buildServiceImplementationRequestInputTerminationPointResource(StringConstants.CLIENT_TOKEN);
-        ServicePathOutputBuilder mockOutputBuilder = new ServicePathOutputBuilder().setResult("success")
-            .setSuccess(true);
-        Mockito.doReturn(mockOutputBuilder.build()).when(this.deviceRenderer).setupServicePath(Mockito.any(),
-            Mockito.any());
-        ServiceImplementationRequestOutput result = this.rendererServiceOperations.serviceImplementation(input).get();
-        Assert.assertEquals(ResponseCodes.RESPONSE_OK, result.getConfigurationResponseCommon().getResponseCode());
+                .buildServiceImplementationRequestInputTerminationPointResource(StringConstants.TTP_TOKEN);
+        ServicePathOutput mockServicePathOutput = new ServicePathOutputBuilder()
+                .setResult("success")
+                .setSuccess(true)
+                .build();
+        doReturn(mockServicePathOutput).when(this.deviceRenderer).setupServicePath(any(), any(), any());
+        when(rpcService.getRpc(ServicePowerSetup.class)).thenReturn(servicePowerSetup);
+        ServicePowerSetupOutput mockServicePowerSetupOutput = new ServicePowerSetupOutputBuilder()
+                .setResult("result")
+                .build();
+        doReturn(RpcResultBuilder.failed().withResult(mockServicePowerSetupOutput).buildFuture())
+            .when(servicePowerSetup).invoke(any());
+
+        when(rpcService.getRpc(ServicePowerTurndown.class)).thenReturn(servicePowerTurndown);
+        doReturn(RpcResultBuilder
+                .success(new ServicePowerTurndownOutputBuilder()
+                        .setResult("result")
+                        .build())
+                .buildFuture())
+            .when(servicePowerTurndown).invoke(any());
+        when(this.deviceRenderer.rendererRollback(any(History.class)))
+            .thenReturn(new RendererRollbackOutputBuilder().setSuccess(true).build());
+        ServiceImplementationRequestOutput result = this.rendererServiceOperations.serviceImplementation(input, false)
+                .get();
+        assertEquals(ResponseCodes.RESPONSE_FAILED, result.getConfigurationResponseCommon().getResponseCode());
     }
 
     @Test
-    public void serviceImplementationTerminationPointAsResourceNoMapping()
-            throws InterruptedException, ExecutionException {
-
-        String[] interfaceTokens = {
-            StringConstants.NETWORK_TOKEN,
-            StringConstants.CLIENT_TOKEN,
-            StringConstants.TTP_TOKEN,
-            StringConstants.PP_TOKEN
-        };
-
-        ServicePathOutputBuilder mockOutputBuilder = new ServicePathOutputBuilder().setResult("failed")
-            .setSuccess(false);
-        Mockito.doReturn(mockOutputBuilder.build()).when(this.deviceRenderer).setupServicePath(Mockito.any(),
-            Mockito.any());
-
+    void serviceImplementationTerminationPointAsResourceNoMapping() throws InterruptedException, ExecutionException {
+        // when no mapping available, 100GE between transponders must be implemented
+
+        when(deviceRenderer.setupServicePath(any(), any(), any()))
+                .thenReturn(new ServicePathOutputBuilder().setResult("success").setSuccess(true).build());
+
+        when(rpcService.getRpc(ServicePowerSetup.class)).thenReturn(servicePowerSetup);
+        when(rpcService.getRpc(ServicePowerTurndown.class)).thenReturn(servicePowerTurndown);
+        when(rpcService.getRpc(GetPm.class)).thenReturn(getPm);
+        doReturn(RpcResultBuilder
+                .success(new ServicePowerSetupOutputBuilder().setResult(ResponseCodes.SUCCESS_RESULT).build())
+                .buildFuture()).when(servicePowerSetup).invoke(any());
+        doReturn(RpcResultBuilder.success(new GetPmOutputBuilder().setNodeId("node id").build()).buildFuture())
+                .when(getPm).invoke(any());
+        when(portMapping.getNode(any())).thenReturn(node);
+        when(node.getNodeInfo()).thenReturn(nodeInfo);
+        when(nodeInfo.getNodeType()).thenReturn(NodeTypes.Xpdr);
+        String[] interfaceTokens = { StringConstants.NETWORK_TOKEN, StringConstants.CLIENT_TOKEN,
+            StringConstants.TTP_TOKEN, StringConstants.PP_TOKEN };
         for (String tpToken : interfaceTokens) {
             ServiceImplementationRequestInput input = ServiceDataUtils
-                .buildServiceImplementationRequestInputTerminationPointResource(tpToken);
-            ServiceImplementationRequestOutput result =
-                this.rendererServiceOperations.serviceImplementation(input).get();
-            Assert.assertEquals(ResponseCodes.RESPONSE_FAILED,
-                result.getConfigurationResponseCommon().getResponseCode());
+                    .buildServiceImplementationRequestInputTerminationPointResource(tpToken);
+            ServiceImplementationRequestOutput result = this.rendererServiceOperations
+                    .serviceImplementation(input, false).get();
+            assertEquals(ResponseCodes.RESPONSE_OK, result.getConfigurationResponseCommon().getResponseCode());
         }
     }
 
     @Test
-    public void serviceImplementationRollbackAllNecessary() throws InterruptedException, ExecutionException {
-
+    void serviceImplementationRollbackAllNecessary() throws InterruptedException, ExecutionException {
         ServiceImplementationRequestInput input = ServiceDataUtils
-            .buildServiceImplementationRequestInputTerminationPointResource(StringConstants.NETWORK_TOKEN);
-//        writePortMapping(input, StringConstants.NETWORK_TOKEN);
-        Mockito.doReturn(RpcResultBuilder.failed().buildFuture()).when(this.olmService)
-            .servicePowerSetup(Mockito.any());
-        ServiceImplementationRequestOutput result = this.rendererServiceOperations.serviceImplementation(input).get();
-        Assert.assertEquals(ResponseCodes.RESPONSE_FAILED, result.getConfigurationResponseCommon().getResponseCode());
-
-    }
-
-    private GetPmInput createGetPmInput(String nodeId, String tp) {
-        GetPmInputBuilder getPmIpBldr = new GetPmInputBuilder();
-        getPmIpBldr.setNodeId(nodeId);
-        getPmIpBldr.setGranularity(PmGranularity._15min);
-        ResourceIdentifierBuilder rsrcBldr = new ResourceIdentifierBuilder();
-        rsrcBldr.setResourceName(tp + "-OTU");
-        getPmIpBldr.setResourceIdentifier(rsrcBldr.build());
-        getPmIpBldr.setResourceType(ResourceTypeEnum.Interface);
-        return getPmIpBldr.build();
+                .buildServiceImplementationRequestInputTerminationPointResource(StringConstants.NETWORK_TOKEN);
+        when(deviceRenderer.setupServicePath(any(), any(), any()))
+                .thenReturn(new ServicePathOutputBuilder().setResult("success").setSuccess(true).build());
+        when(rpcService.getRpc(ServicePowerSetup.class)).thenReturn(servicePowerSetup);
+        when(rpcService.getRpc(ServicePowerTurndown.class)).thenReturn(servicePowerTurndown);
+        doReturn(RpcResultBuilder
+                .success(new ServicePowerSetupOutputBuilder().setResult(ResponseCodes.RESPONSE_FAILED).build())
+                .buildFuture()).when(servicePowerSetup).invoke(any());
+        doReturn(RpcResultBuilder
+                .success(new ServicePowerTurndownOutputBuilder().setResult(ResponseCodes.SUCCESS_RESULT).build())
+                .buildFuture()).when(servicePowerTurndown).invoke(any());
+        when(deviceRenderer.rendererRollback(any(History.class)))
+                .thenReturn(new RendererRollbackOutputBuilder().setSuccess(true).build());
+
+        ServiceImplementationRequestOutput result = this.rendererServiceOperations.serviceImplementation(input, false)
+                .get();
+        assertEquals(ResponseCodes.RESPONSE_FAILED, result.getConfigurationResponseCommon().getResponseCode());
     }
 
+    @Disabled("Disabled until we understand the author objective...")
     @Test
-    public void serviceImplementationServiceInActive() throws InterruptedException, ExecutionException {
-
+    void serviceImplementationServiceInActive() throws InterruptedException, ExecutionException {
         ServiceImplementationRequestInput input = ServiceDataUtils
-            .buildServiceImplementationRequestInputTerminationPointResource(StringConstants.NETWORK_TOKEN);
-        Measurements measurements = new MeasurementsBuilder().setPmparameterName("FECUncorrectableBlocks")
-            .setPmparameterValue("1").build();
+                .buildServiceImplementationRequestInputTerminationPointResource(StringConstants.NETWORK_TOKEN);
         List<Measurements> measurementsList = new ArrayList<Measurements>();
-        measurementsList.add(measurements);
-        GetPmOutput getPmOutput = new GetPmOutputBuilder()
-            .setNodeId("node1").setMeasurements(measurementsList).build();
-        Mockito.doReturn(RpcResultBuilder.success(getPmOutput).buildFuture()).when(this.olmService)
-            .getPm(Mockito.any());
-        ServiceImplementationRequestOutput result = this.rendererServiceOperations.serviceImplementation(input).get();
-        Assert.assertEquals(ResponseCodes.RESPONSE_FAILED, result.getConfigurationResponseCommon().getResponseCode());
-
+        measurementsList.add(new MeasurementsBuilder().setPmparameterName("FECUncorrectableBlocks")
+                .setPmparameterValue("1").build());
+        GetPmOutput getPmOutput = new GetPmOutputBuilder().setNodeId("node1").setMeasurements(measurementsList).build();
+        doReturn(RpcResultBuilder.success(getPmOutput).buildFuture()).when(getPm).invoke(any());
+        ServiceImplementationRequestOutput result = this.rendererServiceOperations.serviceImplementation(input, false)
+                .get();
+        assertEquals(ResponseCodes.RESPONSE_FAILED, result.getConfigurationResponseCommon().getResponseCode());
     }
 
+    @Disabled("Disabled until we understand the author objective...")
     @Test
-    public void serviceImplementationServiceInActive2() throws InterruptedException, ExecutionException {
-
-        ServiceImplementationRequestInput input = ServiceDataUtils
-            .buildServiceImplementationRequestInputTerminationPointResource(StringConstants.NETWORK_TOKEN);
-        Measurements measurements = new MeasurementsBuilder().setPmparameterName("FECUncorrectableBlocks")
-            .setPmparameterValue("1").build();
+    void serviceImplementationServiceInActive3() throws InterruptedException, ExecutionException {
+        when(rpcService.getRpc(ServicePowerSetup.class)).thenReturn(servicePowerSetup);
         List<Measurements> measurementsList = new ArrayList<Measurements>();
-        measurementsList.add(measurements);
-        GetPmOutput getPmOutput = new GetPmOutputBuilder()
-            .setNodeId("node1").setMeasurements(measurementsList).build();
-
-        Mockito.when(this.olmService.getPm(Mockito.any()))
-            .thenReturn(RpcResultBuilder.success(getPmOutput).buildFuture());
-        ServiceImplementationRequestOutput result = this.rendererServiceOperations.serviceImplementation(input).get();
-        Assert.assertEquals(ResponseCodes.RESPONSE_FAILED, result.getConfigurationResponseCommon().getResponseCode());
-
-    }
+        measurementsList.add(new MeasurementsBuilder().setPmparameterName("FECUncorrectableBlocks")
+                .setPmparameterValue("1").build());
+        GetPmOutput getPmOutput = new GetPmOutputBuilder().setNodeId("node1").setMeasurements(measurementsList).build();
+        GetPmOutput getPmOutput2 = new GetPmOutputBuilder().setNodeId("node1").setMeasurements(new ArrayList<>())
+                .build();
 
-    @Test
-    public void serviceImplementationServiceInActive3() throws InterruptedException, ExecutionException {
+        GetPmInput getPmInputZ = createGetPmInput("XPONDER-2-3", StringConstants.NETWORK_TOKEN);
+        GetPmInput getPmInputA = createGetPmInput("XPONDER-1-2", StringConstants.NETWORK_TOKEN);
 
-        Measurements measurements = new MeasurementsBuilder().setPmparameterName("FECUncorrectableBlocks")
-            .setPmparameterValue("1").build();
-        List<Measurements> measurementsList = new ArrayList<Measurements>();
-        measurementsList.add(measurements);
-        GetPmOutput getPmOutput = new GetPmOutputBuilder()
-            .setNodeId("node1").setMeasurements(measurementsList).build();
-        GetPmOutput getPmOutput2 = new GetPmOutputBuilder()
-            .setNodeId("node1").setMeasurements(new ArrayList<>()).build();
-
-        GetPmInput getPmInputZ = createGetPmInput("XPONDER-2-3",
-            StringConstants.NETWORK_TOKEN);
-        GetPmInput getPmInputA = createGetPmInput("XPONDER-1-2",
-            StringConstants.NETWORK_TOKEN);
-
-        Mockito.when(this.olmService.getPm(Mockito.eq(getPmInputZ)))
-            .thenReturn(RpcResultBuilder.success(getPmOutput2).buildFuture());
-        Mockito.when(this.olmService.getPm(Mockito.eq(getPmInputA)))
-            .thenReturn(RpcResultBuilder.success(getPmOutput).buildFuture());
+        when(getPm.invoke(eq(getPmInputZ))).thenReturn(RpcResultBuilder.success(getPmOutput2).buildFuture());
+        when(getPm.invoke(eq(getPmInputA))).thenReturn(RpcResultBuilder.success(getPmOutput).buildFuture());
         ServicePathOutputBuilder mockOutputBuilder = new ServicePathOutputBuilder().setResult("success")
-            .setSuccess(true);
-        Mockito.doReturn(mockOutputBuilder.build()).when(this.deviceRenderer).setupServicePath(Mockito.any(),
-            Mockito.any());
+                .setSuccess(true);
+        doReturn(mockOutputBuilder.build()).when(this.deviceRenderer).setupServicePath(any(), any(), any());
         ServiceImplementationRequestInput input = ServiceDataUtils
-            .buildServiceImplementationRequestInputTerminationPointResource(StringConstants.NETWORK_TOKEN);
-        ServiceImplementationRequestOutput result = this.rendererServiceOperations.serviceImplementation(input).get();
-        Assert.assertEquals(ResponseCodes.RESPONSE_OK, result.getConfigurationResponseCommon().getResponseCode());
-
+                .buildServiceImplementationRequestInputTerminationPointResource(StringConstants.NETWORK_TOKEN);
+        ServiceImplementationRequestOutput result = this.rendererServiceOperations.serviceImplementation(input, false)
+                .get();
+        assertEquals(ResponseCodes.RESPONSE_FAILED, result.getConfigurationResponseCommon().getResponseCode());
     }
 
     @Test
-    public void serviceImplementationServiceActive() throws InterruptedException, ExecutionException {
-
+    void serviceImplementationServiceActive() throws InterruptedException, ExecutionException {
         ServiceImplementationRequestInput input = ServiceDataUtils
-            .buildServiceImplementationRequestInputTerminationPointResource(StringConstants.NETWORK_TOKEN);
+                .buildServiceImplementationRequestInputTerminationPointResource(StringConstants.NETWORK_TOKEN);
+        when(deviceRenderer.setupServicePath(any(), any(), any()))
+                .thenReturn(new ServicePathOutputBuilder().setResult("success").setSuccess(true).build());
+
+        when(rpcService.getRpc(ServicePowerSetup.class)).thenReturn(servicePowerSetup);
+        when(rpcService.getRpc(ServicePowerTurndown.class)).thenReturn(servicePowerTurndown);
+        when(rpcService.getRpc(GetPm.class)).thenReturn(getPm);
+        doReturn(RpcResultBuilder
+                .success(new ServicePowerSetupOutputBuilder().setResult(ResponseCodes.SUCCESS_RESULT).build())
+                .buildFuture()).when(servicePowerSetup).invoke(any());
         GetPmOutput getPmOutput1 = null;
-        Mockito.when(this.olmService.getPm(Mockito.any())).thenReturn(RpcResultBuilder.success(getPmOutput1)
-            .buildFuture());
-        ServicePathOutputBuilder mockOutputBuilder = new ServicePathOutputBuilder().setResult("success")
-            .setSuccess(true);
-        Mockito.doReturn(mockOutputBuilder.build()).when(this.deviceRenderer).setupServicePath(Mockito.any(),
-            Mockito.any());
-        ServiceImplementationRequestOutput result = this.rendererServiceOperations.serviceImplementation(input).get();
-        Assert.assertEquals(ResponseCodes.RESPONSE_OK, result.getConfigurationResponseCommon().getResponseCode());
-
-    }
+        when(getPm.invoke(any())).thenReturn(RpcResultBuilder.success(getPmOutput1).buildFuture());
 
-    @Test
-    public void serviceImplementationServiceActive2() throws InterruptedException, ExecutionException {
-
-        ServiceImplementationRequestInput input = ServiceDataUtils
-            .buildServiceImplementationRequestInputTerminationPointResource(StringConstants.NETWORK_TOKEN);
-        GetPmOutput getPmOutput = new GetPmOutputBuilder().setMeasurements(new ArrayList<>()).build();
-        Mockito.when(this.olmService.getPm(Mockito.any())).thenReturn(RpcResultBuilder.success(getPmOutput)
-            .buildFuture());
-        ServicePathOutputBuilder mockOutputBuilder = new ServicePathOutputBuilder().setResult("success")
-            .setSuccess(true);
-        Mockito.doReturn(mockOutputBuilder.build()).when(this.deviceRenderer).setupServicePath(Mockito.any(),
-            Mockito.any());
-        ServiceImplementationRequestOutput result = this.rendererServiceOperations.serviceImplementation(input).get();
-        Assert.assertEquals(ResponseCodes.RESPONSE_OK, result.getConfigurationResponseCommon().getResponseCode());
+        when(portMapping.getNode(any())).thenReturn(node);
+        when(node.getNodeInfo()).thenReturn(nodeInfo);
+        when(nodeInfo.getNodeType()).thenReturn(NodeTypes.Xpdr);
 
+        ServiceImplementationRequestOutput result = this.rendererServiceOperations.serviceImplementation(input, false)
+                .get();
+        assertEquals(ResponseCodes.RESPONSE_OK, result.getConfigurationResponseCommon().getResponseCode());
     }
 
     @Test
-    public void serviceImplementationServiceInActive4() throws InterruptedException, ExecutionException {
+    void serviceImplementationServiceInActive4() throws InterruptedException, ExecutionException {
+        when(deviceRenderer.setupServicePath(any(), any(), any()))
+                .thenReturn(new ServicePathOutputBuilder().setResult("success").setSuccess(true).build());
+
+        when(rpcService.getRpc(ServicePowerSetup.class)).thenReturn(servicePowerSetup);
+        when(rpcService.getRpc(ServicePowerTurndown.class)).thenReturn(servicePowerTurndown);
+        when(rpcService.getRpc(GetPm.class)).thenReturn(getPm);
+        doReturn(RpcResultBuilder
+                .success(new ServicePowerSetupOutputBuilder().setResult(ResponseCodes.SUCCESS_RESULT).build())
+                .buildFuture()).when(servicePowerSetup).invoke(any());
 
-        Measurements measurements = new MeasurementsBuilder().setPmparameterName("preFECCorrectedErrors")
-            .setPmparameterValue("1").build();
         List<Measurements> measurementsList = new ArrayList<Measurements>();
-        measurementsList.add(measurements);
-        GetPmOutput getPmOutput = new GetPmOutputBuilder()
-            .setNodeId("node1").setMeasurements(measurementsList).build();
+        measurementsList.add(
+                new MeasurementsBuilder().setPmparameterName("preFECCorrectedErrors").setPmparameterValue("1").build());
+        GetPmOutput getPmOutput = new GetPmOutputBuilder().setNodeId("node1").setMeasurements(measurementsList).build();
+        when(getPm.invoke(any())).thenReturn(RpcResultBuilder.success(getPmOutput).buildFuture());
+        when(portMapping.getNode(any())).thenReturn(node);
+        when(node.getNodeInfo()).thenReturn(nodeInfo);
+        when(nodeInfo.getNodeType()).thenReturn(NodeTypes.Xpdr);
 
-        Mockito.doReturn(RpcResultBuilder.success(getPmOutput).buildFuture()).when(this.olmService)
-            .getPm(Mockito.any());
-        ServicePathOutputBuilder mockOutputBuilder = new ServicePathOutputBuilder().setResult("success")
-            .setSuccess(true);
-        Mockito.doReturn(mockOutputBuilder.build()).when(this.deviceRenderer).setupServicePath(Mockito.any(),
-            Mockito.any());
         ServiceImplementationRequestInput input = ServiceDataUtils
-            .buildServiceImplementationRequestInputTerminationPointResource(StringConstants.NETWORK_TOKEN);
-        ServiceImplementationRequestOutput result = this.rendererServiceOperations.serviceImplementation(input).get();
-        Assert.assertEquals(ResponseCodes.RESPONSE_OK, result.getConfigurationResponseCommon().getResponseCode());
-
+                .buildServiceImplementationRequestInputTerminationPointResource(StringConstants.NETWORK_TOKEN);
+        ServiceImplementationRequestOutput result = this.rendererServiceOperations.serviceImplementation(input, false)
+                .get();
+        assertEquals(ResponseCodes.RESPONSE_OK, result.getConfigurationResponseCommon().getResponseCode());
     }
 
     @Test
-    public void serviceImplementationServiceInActive5() throws InterruptedException, ExecutionException {
+    void serviceImplementationServiceInActive5() throws InterruptedException, ExecutionException {
+        when(deviceRenderer.setupServicePath(any(), any(), any()))
+                .thenReturn(new ServicePathOutputBuilder().setResult("success").setSuccess(true).build());
+        when(rpcService.getRpc(ServicePowerSetup.class)).thenReturn(servicePowerSetup);
+        when(rpcService.getRpc(ServicePowerTurndown.class)).thenReturn(servicePowerTurndown);
+        when(rpcService.getRpc(GetPm.class)).thenReturn(getPm);
+        doReturn(RpcResultBuilder
+                .success(new ServicePowerSetupOutputBuilder().setResult(ResponseCodes.SUCCESS_RESULT).build())
+                .buildFuture()).when(servicePowerSetup).invoke(any());
 
-        ServiceImplementationRequestInput input = ServiceDataUtils
-            .buildServiceImplementationRequestInputTerminationPointResource(StringConstants.NETWORK_TOKEN);
-        Measurements measurements = new MeasurementsBuilder().setPmparameterName("preFECCorrectedErrors")
-            .setPmparameterValue("112000000000d").build();
         List<Measurements> measurementsList = new ArrayList<Measurements>();
-        measurementsList.add(measurements);
-        GetPmOutput getPmOutput = new GetPmOutputBuilder()
-            .setNodeId("node1").setMeasurements(measurementsList).build();
+        measurementsList.add(new MeasurementsBuilder().setPmparameterName("preFECCorrectedErrors")
+                .setPmparameterValue("112000000000d").build());
+        GetPmOutput getPmOutput = new GetPmOutputBuilder().setNodeId("node1").setMeasurements(measurementsList).build();
+        when(getPm.invoke(any())).thenReturn(RpcResultBuilder.success(getPmOutput).buildFuture());
+        when(portMapping.getNode(any())).thenReturn(node);
+        when(node.getNodeInfo()).thenReturn(nodeInfo);
+        when(nodeInfo.getNodeType()).thenReturn(NodeTypes.Xpdr);
+        when(rpcService.getRpc(ServicePowerTurndown.class)).thenReturn(servicePowerTurndown);
+        doReturn(RpcResultBuilder
+                .success(new ServicePowerTurndownOutputBuilder()
+                        .setResult("result")
+                        .build())
+                .buildFuture())
+            .when(servicePowerTurndown).invoke(any());
+        when(this.deviceRenderer.rendererRollback(any(History.class)))
+            .thenReturn(new RendererRollbackOutputBuilder().setSuccess(true).build());
 
-        Mockito.doReturn(RpcResultBuilder.success(getPmOutput).buildFuture()).when(this.olmService)
-            .getPm(Mockito.any());
-        ServiceImplementationRequestOutput result = this.rendererServiceOperations.serviceImplementation(input).get();
-        Assert.assertEquals(ResponseCodes.RESPONSE_FAILED, result.getConfigurationResponseCommon().getResponseCode());
+        ServiceImplementationRequestInput input = ServiceDataUtils
+                .buildServiceImplementationRequestInputTerminationPointResource(StringConstants.NETWORK_TOKEN);
+        ServiceImplementationRequestOutput result = this.rendererServiceOperations.serviceImplementation(input, false)
+                .get();
+        assertEquals(ResponseCodes.RESPONSE_FAILED, result.getConfigurationResponseCommon().getResponseCode());
+    }
 
+    private GetPmInput createGetPmInput(String nodeId, String tp) {
+        return new GetPmInputBuilder().setNodeId(nodeId).setGranularity(PmGranularity._15min)
+                .setResourceIdentifier(new ResourceIdentifierBuilder().setResourceName(tp + "-OTU").build())
+                .setResourceType(ResourceTypeEnum.Interface).build();
     }
-}
+}
\ No newline at end of file
diff --git a/renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/ConnectionTest.java b/renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/ConnectionTest.java
new file mode 100644 (file)
index 0000000..a3ba1e7
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+ * Copyright © 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.renderer.provisiondevice.transaction;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Assert;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.delete.Delete;
+
+class ConnectionTest {
+
+    @Test
+    void rollback() {
+        Delete delete = Mockito.mock(Delete.class);
+        Mockito.when(delete.deleteCrossConnect("ROADM-A", "DEG1", false))
+                .thenReturn(List.of("Interface1"));
+
+        Connection n1 = new Connection("ROADM-A", "DEG1", false);
+
+        Assert.assertTrue(n1.rollback(delete));
+
+        Mockito.verify(delete, Mockito.times(1))
+                .deleteCrossConnect("ROADM-A", "DEG1", false);
+    }
+
+    @Test
+    void testTwoObjectsWithSameInformationIsEqual() {
+        Connection n1 = new Connection("ROADM-A", "DEG1", false);
+        Connection n2 = new Connection("ROADM-A", "DEG1", false);
+
+        Assert.assertTrue(n1.equals(n2));
+    }
+
+    @Test
+    void testTwoObjectsWithDifferentInformationIsNotEqual() {
+        Connection n1 = new Connection("ROADM-A", "DEG1", true);
+        Connection n2 = new Connection("ROADM-A", "DEG1", false);
+
+        Assert.assertFalse(n1.equals(n2));
+    }
+
+    @Test
+    void testTwoDifferentRoadmNodesAreNotEqual() {
+        Connection n1 = new Connection("ROADM-A", "DEG1", false);
+        Connection n2 = new Connection("ROADM-B", "DEG1", false);
+
+        Assert.assertFalse(n1.equals(n2));
+    }
+
+
+    @Test
+    void deleteReturnNull() {
+        Delete delete = Mockito.mock(Delete.class);
+        Mockito.when(delete.deleteCrossConnect("ROADM-A", "DEG1", false))
+                .thenReturn(null);
+
+        Connection n1 = new Connection("ROADM-A", "DEG1", false);
+
+        Assert.assertFalse(n1.rollback(delete));
+
+        Mockito.verify(delete, Mockito.times(1))
+                .deleteCrossConnect("ROADM-A", "DEG1", false);
+    }
+
+    @Test
+    void deleteReturnEmptyList() {
+        Delete delete = Mockito.mock(Delete.class);
+        Mockito.when(delete.deleteCrossConnect("ROADM-A", "DEG1", false))
+                .thenReturn(new ArrayList<>());
+
+        Connection n1 = new Connection("ROADM-A", "DEG1", false);
+
+        Assert.assertFalse(n1.rollback(delete));
+
+        Mockito.verify(delete, Mockito.times(1))
+                .deleteCrossConnect("ROADM-A", "DEG1", false);
+    }
+}
\ No newline at end of file
diff --git a/renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/DeviceInterfaceTest.java b/renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/DeviceInterfaceTest.java
new file mode 100644 (file)
index 0000000..d0481ae
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright © 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.renderer.provisiondevice.transaction;
+
+import org.junit.Assert;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.delete.Delete;
+
+class DeviceInterfaceTest {
+
+    @Test
+    void rollback() {
+        Delete delete = Mockito.mock(Delete.class);
+        Mockito.when(delete.deleteInterface("ROADM-A", "DEG1")).thenReturn(true);
+
+        DeviceInterface n1 = new DeviceInterface("ROADM-A", "DEG1");
+        Assert.assertTrue(n1.rollback(delete));
+
+        Mockito.verify(delete, Mockito.times(1)).deleteInterface("ROADM-A", "DEG1");
+    }
+
+    @Test
+    void testTwoInterfacesAreEqual() {
+        DeviceInterface n1 = new DeviceInterface("ROADM-A", "DEG1");
+        DeviceInterface n2 = new DeviceInterface("ROADM-A", "DEG1");
+
+        Assert.assertTrue(n1.equals(n2));
+    }
+
+    @Test
+    void testTwoInterfacesAreNotEqual() {
+        DeviceInterface n1 = new DeviceInterface("ROADM-A", "DEG1");
+        DeviceInterface n2 = new DeviceInterface("ROADM-B", "DEG1");
+
+        Assert.assertFalse(n1.equals(n2));
+    }
+}
\ No newline at end of file
diff --git a/renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/history/TransactionHistoryTest.java b/renderer/src/test/java/org/opendaylight/transportpce/renderer/provisiondevice/transaction/history/TransactionHistoryTest.java
new file mode 100644 (file)
index 0000000..0adf418
--- /dev/null
@@ -0,0 +1,143 @@
+/*
+ * Copyright © 2024 Smartoptics and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.renderer.provisiondevice.transaction.history;
+
+import java.util.List;
+import org.junit.Assert;
+import org.junit.jupiter.api.Test;
+import org.mockito.InOrder;
+import org.mockito.Mockito;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.DeviceInterface;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.Transaction;
+import org.opendaylight.transportpce.renderer.provisiondevice.transaction.delete.Delete;
+
+class TransactionHistoryTest {
+
+    @Test
+    void add() {
+        Transaction transaction = Mockito.mock(Transaction.class);
+        History history = new TransactionHistory();
+
+        Assert.assertTrue(history.add(transaction));
+    }
+
+    @Test
+    void testDuplicateTransactionIsIgnored() {
+
+        Transaction t1 = new DeviceInterface("ROADM-A", "DEG1");
+        Transaction t2 = new DeviceInterface("ROADM-A", "DEG1");
+
+        History history = new TransactionHistory();
+
+        history.add(t1);
+        Assert.assertFalse(history.add(t2));
+    }
+
+    @Test
+    void testAddCollectionOfUniqueTransactions() {
+        Transaction t1 = new DeviceInterface("ROADM-A", "DEG1");
+        Transaction t2 = new DeviceInterface("ROADM-A", "DEG2");
+
+        List<Transaction> transactions = List.of(t1, t2);
+
+        History history = new TransactionHistory();
+
+        Assert.assertTrue(history.add(transactions));
+    }
+
+    @Test
+    void testAddCollectionOfDuplicateTransactions() {
+        Transaction t1 = new DeviceInterface("ROADM-A", "DEG1");
+        Transaction t2 = new DeviceInterface("ROADM-A", "DEG1");
+
+        List<Transaction> transactions = List.of(t1, t2);
+
+        History history = new TransactionHistory();
+
+        Assert.assertFalse(history.add(transactions));
+    }
+
+    @Test
+    void testAddUniqueStringOfInterfaceIds() {
+        String nodeId = "ROADM-A";
+        String[] interfaces = new String[]{"DEG1", "DEG2"};
+
+        History history = new TransactionHistory();
+
+        Assert.assertTrue(history.addInterfaces(nodeId, interfaces));
+    }
+
+    @Test
+    void testAddDuplicateStringOfInterfaceIds() {
+        String nodeId = "ROADM-A";
+        String[] interfaces = new String[]{"DEG1", "DEG1"};
+
+        History history = new TransactionHistory();
+
+        Assert.assertTrue(history.addInterfaces(nodeId, interfaces));
+
+    }
+
+    @Test
+    void testAddDuplicateListOfInterfaceIds() {
+        String nodeId = "ROADM-A";
+        List<String> interfaces = List.of("DEG1", "DEG1");
+
+        History history = new TransactionHistory();
+
+        Assert.assertTrue(history.addInterfaces(nodeId, interfaces));
+
+    }
+
+    @Test
+    void rollbackOneInterface() {
+
+        String nodeId = "ROADM-A";
+        List<String> interfaces = List.of("DEG1", "DEG1");
+
+        History history = new TransactionHistory();
+        history.addInterfaces(nodeId, interfaces);
+
+        Delete delete = Mockito.mock(Delete.class);
+        Mockito.when(delete.deleteInterface("ROADM-A", "DEG1")).thenReturn(true);
+
+        Assert.assertTrue(history.rollback(delete));
+
+        //Although the same interface was added twice, we only rollback once.
+        Mockito.verify(delete, Mockito.times(1))
+                .deleteInterface("ROADM-A", "DEG1");
+    }
+
+    @Test
+    void rollbackTwoInterfacesInReverseOrderTheyWereAdded() {
+
+        String nodeId = "ROADM-A";
+
+        //Note DEG1 is added before DEG2
+        List<String> interfaces = List.of("DEG1", "DEG2");
+
+        History history = new TransactionHistory();
+        history.addInterfaces(nodeId, interfaces);
+
+        Delete delete = Mockito.mock(Delete.class);
+        Mockito.when(delete.deleteInterface("ROADM-A", "DEG1")).thenReturn(true);
+        Mockito.when(delete.deleteInterface("ROADM-A", "DEG2")).thenReturn(true);
+
+        Assert.assertTrue(history.rollback(delete));
+
+        //The rollback occurs in the reverse order.
+        // i.e. DEG2 before DEG1.
+        InOrder inOrder = Mockito.inOrder(delete);
+        inOrder.verify(delete, Mockito.times(1))
+                .deleteInterface("ROADM-A", "DEG2");
+        inOrder.verify(delete, Mockito.times(1))
+                .deleteInterface("ROADM-A", "DEG1");
+
+    }
+}
\ No newline at end of file
index d55569a985773aca77174d0d18c7d9f5c5c710a4..80a81d00c5cc5532637b380a5599630ef93d5667 100644 (file)
  */
 package org.opendaylight.transportpce.renderer.rpcs;
 
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mockito;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.ExecutionException;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
 import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfaceException;
 import org.opendaylight.transportpce.renderer.provisiondevice.DeviceRendererService;
 import org.opendaylight.transportpce.renderer.provisiondevice.OtnDeviceRendererService;
-import org.opendaylight.transportpce.test.AbstractTest;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.Action;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.CreateOtsOms;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.CreateOtsOmsInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.CreateOtsOmsOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.RendererRollback;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.RendererRollbackInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.RendererRollbackOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.ServicePath;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.device.renderer.rev211004.ServicePathInput;
-
-public class DeviceRendererRPCImplTest extends AbstractTest {
-    private final DeviceRendererService deviceRenderer = Mockito.mock(DeviceRendererService.class);
-    private final OtnDeviceRendererService otnDeviceRenderer = Mockito.mock(OtnDeviceRendererService.class);
-    private final ServicePathInput servicePathInput = Mockito.spy(ServicePathInput.class);
-    private final CreateOtsOmsInput createOtsOmsInput = Mockito.mock(CreateOtsOmsInput.class);
-    private final RendererRollbackInput rendererRollbackInput = Mockito.mock(RendererRollbackInput.class);
-    private DeviceRendererRPCImpl deviceRendererRPC = null;
-
-    @Before
-    public void setup() {
-
-        deviceRendererRPC = new DeviceRendererRPCImpl(deviceRenderer, otnDeviceRenderer);
+import org.opendaylight.yangtools.yang.common.RpcResult;
+
+@ExtendWith(MockitoExtension.class)
+public class DeviceRendererRPCImplTest {
+    @Mock
+    private DeviceRendererService deviceRendererService;
+    @Mock
+    private RpcProviderService rpcProviderService;
+    @Mock
+    private DeviceRendererService deviceRenderer;
+    @Mock
+    private OtnDeviceRendererService otnDeviceRendererService;
+    @Spy
+    private ServicePathInput servicePathInput;
+    @Mock
+    private CreateOtsOmsInput createOtsOmsInput;
+    @Mock
+    private RendererRollbackInput rendererRollbackInput;
+    private ServicePath servicePath;
+    private RendererRollback rendererRollback;
+    private CreateOtsOms createOtsOms;
+
+    @BeforeEach
+    void setup() {
+        servicePath = new ServicePathImpl(deviceRenderer);
+        rendererRollback = new RendererRollbackImpl(deviceRenderer);
+        createOtsOms = new CreateOtsOmsImpl(deviceRenderer);
     }
 
-
     @Test
-    public void testServicePathCreateOption() {
-
-        Mockito.when(servicePathInput.getOperation()).thenReturn(Action.Create);
-        deviceRendererRPC.servicePath(servicePathInput);
-        Mockito.verify(deviceRenderer, Mockito.times(1)).setupServicePath(servicePathInput, null);
-
+    void testRpcRegistration() {
+        new DeviceRendererRPCImpl(rpcProviderService, deviceRenderer, otnDeviceRendererService);
+        verify(rpcProviderService, times(1)).registerRpcImplementations(
+                any(ServicePathImpl.class), any(OtnServicePathImpl.class), any(RendererRollbackImpl.class),
+                any(CreateOtsOmsImpl.class));
     }
 
     @Test
-    public void testServicePathDeleteOption() {
-
-        Mockito.when(servicePathInput.getOperation()).thenReturn(Action.Delete);
-        deviceRendererRPC.servicePath(servicePathInput);
-        Mockito.verify(deviceRenderer, Mockito.times(1)).deleteServicePath(servicePathInput);
-
+    void testServicePathCreateOption() {
+        when(servicePathInput.getOperation()).thenReturn(Action.Create);
+        servicePath.invoke(servicePathInput);
+        verify(deviceRenderer, times(1)).setupServicePath(servicePathInput, null);
     }
 
     @Test
-    public void testRendererRollback() {
-        Mockito.when(deviceRenderer.rendererRollback(rendererRollbackInput))
-                .thenReturn(new RendererRollbackOutputBuilder().build());
-        deviceRendererRPC.rendererRollback(rendererRollbackInput);
-        Mockito.verify(deviceRenderer, Mockito.times(1)).rendererRollback(rendererRollbackInput);
+    void testServicePathDeleteOption() {
+        when(servicePathInput.getOperation()).thenReturn(Action.Delete);
+        servicePath.invoke(servicePathInput);
+        verify(deviceRenderer, times(1)).deleteServicePath(servicePathInput);
     }
 
     @Test
-    public void testCreateOtsOms() throws OpenRoadmInterfaceException {
-
-        Mockito.when(createOtsOmsInput.getNodeId()).thenReturn("nodeId");
-        Mockito.when(createOtsOmsInput.getLogicalConnectionPoint()).thenReturn("logicalConnectionPoint");
-        Mockito.when(deviceRenderer.createOtsOms(createOtsOmsInput)).thenReturn(null);
-        deviceRendererRPC.createOtsOms(createOtsOmsInput);
-        Mockito.verify(deviceRenderer, Mockito.times(1)).createOtsOms(createOtsOmsInput);
-
-
+    void testRendererRollback() {
+        when(deviceRenderer.rendererRollback(rendererRollbackInput))
+            .thenReturn(new RendererRollbackOutputBuilder().build());
+        rendererRollback.invoke(rendererRollbackInput);
+        verify(deviceRenderer, times(1)).rendererRollback(rendererRollbackInput);
     }
 
     @Test
-    public void testCreateOtsOmsReturnException() throws OpenRoadmInterfaceException {
-
-        Mockito.when(createOtsOmsInput.getNodeId()).thenReturn("nodeId");
-        Mockito.when(createOtsOmsInput.getLogicalConnectionPoint()).thenReturn("logicalConnectionPoint");
-        Mockito.when(deviceRenderer.createOtsOms(createOtsOmsInput)).thenThrow(OpenRoadmInterfaceException.class);
-        Assert.assertNull(deviceRendererRPC.createOtsOms(createOtsOmsInput));
-
-
+    void testCreateOtsOms() throws OpenRoadmInterfaceException {
+        when(createOtsOmsInput.getNodeId()).thenReturn("nodeId");
+        when(createOtsOmsInput.getLogicalConnectionPoint()).thenReturn("logicalConnectionPoint");
+        when(deviceRenderer.createOtsOms(createOtsOmsInput)).thenReturn(null);
+        createOtsOms.invoke(createOtsOmsInput);
+        verify(deviceRenderer, times(1)).createOtsOms(createOtsOmsInput);
     }
 
-
+    @Test
+    void testCreateOtsOmsReturnException()
+            throws OpenRoadmInterfaceException, InterruptedException, ExecutionException {
+        when(createOtsOmsInput.getNodeId()).thenReturn("nodeId");
+        when(createOtsOmsInput.getLogicalConnectionPoint()).thenReturn("logicalConnectionPoint");
+        when(deviceRenderer.createOtsOms(createOtsOmsInput)).thenThrow(OpenRoadmInterfaceException.class);
+        ListenableFuture<RpcResult<CreateOtsOmsOutput>> result = createOtsOms.invoke(createOtsOmsInput);
+        assertTrue(result.isDone());
+        assertFalse(result.get().isSuccessful());
+        assertNull(result.get().getResult());
+        assertEquals("to create oms and ots interfaces", result.get().getErrors().get(0).getMessage());
+    }
 }
diff --git a/renderer/src/test/java/org/opendaylight/transportpce/renderer/stub/OlmServiceStub.java b/renderer/src/test/java/org/opendaylight/transportpce/renderer/stub/OlmServiceStub.java
deleted file mode 100644 (file)
index dc8bfb1..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright © 2018 Orange Systems, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.transportpce.renderer.stub;
-
-import com.google.common.util.concurrent.ListenableFuture;
-import java.util.ArrayList;
-import org.opendaylight.transportpce.common.ResponseCodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossBaseInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossBaseOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossCurrentInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.CalculateSpanlossCurrentOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.GetPmOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerResetInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerResetOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.TransportpceOlmService;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
-
-
-public class OlmServiceStub implements TransportpceOlmService {
-
-    @Override public ListenableFuture<RpcResult<CalculateSpanlossCurrentOutput>> calculateSpanlossCurrent(
-        CalculateSpanlossCurrentInput input) {
-        return null;
-    }
-
-    @Override public ListenableFuture<RpcResult<GetPmOutput>> getPm(GetPmInput input) {
-        GetPmOutput output = new GetPmOutputBuilder()
-            .setNodeId("node1").setMeasurements(new ArrayList<>()).build();
-        return RpcResultBuilder.success(
-            output).buildFuture();
-    }
-
-    @Override public ListenableFuture<RpcResult<ServicePowerTurndownOutput>> servicePowerTurndown(
-        ServicePowerTurndownInput input) {
-        return RpcResultBuilder.success((new ServicePowerTurndownOutputBuilder())
-                .setResult("Success").build()).buildFuture();
-    }
-
-    @Override public ListenableFuture<RpcResult<CalculateSpanlossBaseOutput>> calculateSpanlossBase(
-        CalculateSpanlossBaseInput input) {
-        return null;
-    }
-
-    @Override public ListenableFuture<RpcResult<ServicePowerResetOutput>> servicePowerReset(
-            ServicePowerResetInput input) {
-        return null;
-    }
-
-    @Override public ListenableFuture<RpcResult<ServicePowerSetupOutput>> servicePowerSetup(
-            ServicePowerSetupInput input) {
-        return RpcResultBuilder.success(new ServicePowerSetupOutputBuilder()
-            .setResult(ResponseCodes.SUCCESS_RESULT).build()).buildFuture();
-    }
-}
index 9c6b749e6e38ef2520fc7fa3b6c0e1c7720cf3e0..cbd13bdeccb6778e278fde068994ae2dd5902269 100644 (file)
@@ -8,18 +8,22 @@
 
 package org.opendaylight.transportpce.renderer.utils;
 
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+
 import com.google.common.util.concurrent.ListenableFuture;
 import java.util.List;
-import org.mockito.Mockito;
 import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
+import org.opendaylight.mdsal.binding.api.RpcService;
 import org.opendaylight.transportpce.test.stub.MountPointStub;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.GetConnectionPortTrail;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.GetConnectionPortTrailOutput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.GetConnectionPortTrailOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.OrgOpenroadmDeviceService;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.get.connection.port.trail.output.Ports;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
@@ -28,17 +32,17 @@ import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 public final class MountPointUtils {
 
     public static MountPointStub getMountPoint(List<Ports> ports, DataBroker dataBroker) {
-        RpcConsumerRegistry rpcConsumerRegistry = Mockito.spy(RpcConsumerRegistry.class);
-        OrgOpenroadmDeviceService orgOpenroadmDeviceService = Mockito.spy(OrgOpenroadmDeviceService.class);
+        RpcService rpcService = spy(RpcService.class);
+        GetConnectionPortTrail getConnectionPortTrail = spy(GetConnectionPortTrail.class);
         GetConnectionPortTrailOutputBuilder getConnectionPortTrailOutputBldr
                 = new GetConnectionPortTrailOutputBuilder();
         getConnectionPortTrailOutputBldr.setPorts(ports);
         ListenableFuture<RpcResult<GetConnectionPortTrailOutput>> rpcResultFuture =
                 RpcResultBuilder.success(getConnectionPortTrailOutputBldr.build()).buildFuture();
-        Mockito.doReturn(rpcResultFuture).when(orgOpenroadmDeviceService).getConnectionPortTrail(Mockito.any());
-        Mockito.doReturn(orgOpenroadmDeviceService).when(rpcConsumerRegistry).getRpcService(Mockito.any());
+        doReturn(rpcResultFuture).when(getConnectionPortTrail.invoke(any()));
+        doReturn(getConnectionPortTrail).when(rpcService).getRpc(any());
         MountPointStub mountPoint = new MountPointStub(dataBroker);
-        mountPoint.setRpcConsumerRegistry(rpcConsumerRegistry);
+        mountPoint.setRpcService(rpcService);
         return mountPoint;
     }
 
index 1b2ce3afb0c439cc11783534184d12baae4abfd9..582903b1b4f666dece3ebf08ae2b7a03b3175366 100644 (file)
@@ -19,19 +19,19 @@ public class NotificationPublishServiceMock implements NotificationPublishServic
     private static final Logger LOG = LoggerFactory.getLogger(NotificationPublishServiceMock.class);
 
     @Override
-    public void putNotification(Notification notification) throws InterruptedException {
+    public void putNotification(Notification<?> notification) throws InterruptedException {
         LOG.info("putNotification");
     }
 
     @Override
-    public ListenableFuture<?> offerNotification(Notification notification) {
+    public ListenableFuture<?> offerNotification(Notification<?> notification) {
         LOG.info("offerNotification");
         throw new UnsupportedOperationException("offerNotification is not implemented");
     }
 
     @Override
-    public ListenableFuture<?> offerNotification(Notification notification, int timeout, TimeUnit unit)
-        throws InterruptedException {
+    public ListenableFuture<?> offerNotification(Notification<?> notification, int timeout, TimeUnit unit)
+            throws InterruptedException {
         LOG.info("offerNotification");
         throw new UnsupportedOperationException("offerNotification is not implemented");
     }
index 0e57579d92bbe2bb055564d5769de25fe5dd9cee..3022f9616ba447fe345d1fefafbbfb504bf833c0 100644 (file)
@@ -23,29 +23,29 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.service.implementation.request.input.PathDescriptionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.service.implementation.request.input.ServiceAEndBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.service.implementation.request.input.ServiceZEndBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev211210.FrequencyTHz;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ConnectionType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.port.PortBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev230526.FrequencyTHz;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ConnectionType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.port.PortBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirection;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirection;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZ;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZKey;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToA;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToABuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToAKey;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.ResourceBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.TerminationPoint;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.TerminationPointBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirection;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirection;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZ;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToA;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToABuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToAKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.ResourceBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.TerminationPoint;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.TerminationPointBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.RxDirectionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.TxDirectionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.handler.header.ServiceHandlerHeaderBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.optical.renderer.nodes.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.optical.renderer.nodes.NodesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev210930.optical.renderer.nodes.NodesKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.optical.renderer.nodes.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.optical.renderer.nodes.NodesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.optical.renderer.nodes.NodesKey;
 import org.opendaylight.yangtools.yang.common.Uint32;
 
 
index 2290fabff0cec4a86a8f45338ee169bdc230a820..7921fa461249a504caa7ceacdeb8bb29ddcfe65c 100644 (file)
@@ -10,23 +10,23 @@ package org.opendaylight.transportpce.renderer.utils;
 
 import java.util.HashMap;
 import java.util.Map;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev211210.FrequencyTHz;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.port.PortBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.optical.channel.types.rev230526.FrequencyTHz;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.port.PortBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirection;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirection;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZ;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZKey;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToA;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToABuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToAKey;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.ResourceBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.TerminationPoint;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.TerminationPointBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirection;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirection;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZ;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToA;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToABuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToAKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.ResourceBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.TerminationPoint;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.TerminationPointBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.RxDirectionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.TxDirectionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.path.PathDescription;
index 031c8db994d85fc73a35c9b566848f084ccde6f4..62385266ce483b6808f42d5cd532ae06b5b74f97 100644 (file)
@@ -40,7 +40,7 @@ public final class TransactionUtils {
         if (!deviceTxFuture.get().isPresent()) {
             return false;
         }
-        DeviceTransaction deviceTx = deviceTxFuture.get().get();
+        DeviceTransaction deviceTx = deviceTxFuture.get().orElseThrow();
         deviceTx.merge(logicalDatastoreType, instanceIdentifier, object);
         deviceTx.commit(Timeouts.DEVICE_WRITE_TIMEOUT, Timeouts.DEVICE_WRITE_TIMEOUT_UNIT).get();
         return true;
@@ -53,16 +53,10 @@ public final class TransactionUtils {
             throws ExecutionException, InterruptedException {
         Future<Optional<DeviceTransaction>> deviceTxFuture =
                 deviceTransactionManager.getDeviceTransaction(nodeId);
-        if (!deviceTxFuture.get().isPresent()) {
-            return null;
-        }
-        DeviceTransaction deviceTx = deviceTxFuture.get().get();
+        DeviceTransaction deviceTx = deviceTxFuture.get().orElseThrow(null);
         Optional<? extends DataObject> readOpt
                 = deviceTx.read(logicalDatastoreType, instanceIdentifier).get();
-        if (!readOpt.isPresent()) {
-            return null;
-        }
-        return readOpt.get();
+        return readOpt.orElseThrow(null);
     }
 
 }
index 0cd5a205764036af4f767a8e03700a3db89a1c52..30de3466321ec09933f7b359d30e269e0005fb45 100644 (file)
@@ -15,30 +15,43 @@ Author: Martial Coulibaly <martial.coulibaly@gfi.com> on behalf of Orange
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>8.0.11</version>
+    <version>13.0.1</version>
     <relativePath/>
   </parent>
 
   <groupId>org.opendaylight.transportpce</groupId>
   <artifactId>transportpce-servicehandler</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
+  <version>10.0.0-SNAPSHOT</version>
   <packaging>bundle</packaging>
 
+  <properties>
+    <transportpce.models.version>20.0.0-SNAPSHOT</transportpce.models.version>
+  </properties>
+
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.opendaylight.transportpce.models</groupId>
+        <artifactId>transportpce-models-artifacts</artifactId>
+        <version>${transportpce.models.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
   <dependencies>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-common</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-7.1.0</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-network</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-13.1.0</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-service</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-service-13.1.0</artifactId>
     </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
@@ -89,10 +102,19 @@ Author: Martial Coulibaly <martial.coulibaly@gfi.com> on behalf of Orange
       <groupId>org.opendaylight.mdsal</groupId>
       <artifactId>mdsal-binding-api</artifactId>
     </dependency>
+    <dependency>
+      <groupId>com.github.spotbugs</groupId>
+      <artifactId>spotbugs-annotations</artifactId>
+      <optional>true</optional>
+    </dependency>
     <dependency>
       <groupId>com.google.guava</groupId>
       <artifactId>guava</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.service.component.annotations</artifactId>
+    </dependency>
 
     <!-- Testing Dependencies -->
     <dependency>
diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/CatalogInput.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/CatalogInput.java
new file mode 100644 (file)
index 0000000..c63d283
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright © 2023 Fujitsu Network Communications, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.servicehandler;
+
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.sdnc.request.header.SdncRequestHeader;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddOpenroadmOperationalModesToCatalogInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddSpecificOperationalModesToCatalogInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.add.openroadm.operational.modes.to.catalog.input.OperationalModeInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class CatalogInput {
+
+    private static final Logger LOG = LoggerFactory.getLogger(CatalogInput.class);
+    private SdncRequestHeader sdncRequestHeader;
+    private OperationalModeInfo operationalModeInfo;
+
+    private org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.add.specific.operational.modes
+            .to.catalog.input.OperationalModeInfo operationalModeInfoSpecific;
+
+    public CatalogInput(AddOpenroadmOperationalModesToCatalogInput addORToCatalogInput) {
+        LOG.info("CatalogInput AddOpenroadmOperationalModesToCatalogInput");
+        setSdncRequestHeader(addORToCatalogInput.getSdncRequestHeader());
+        setOperationalModeInfo(addORToCatalogInput.getOperationalModeInfo());
+    }
+
+    public CatalogInput(AddSpecificOperationalModesToCatalogInput addSpecificToCatalogInput) {
+        LOG.info("CatalogInput AddSpecificOperationalModesToCatalogInput");
+        setSdncRequestHeader(addSpecificToCatalogInput.getSdncRequestHeader());
+        setOperationalModeInfoSpecific(addSpecificToCatalogInput.getOperationalModeInfo());
+    }
+
+    public SdncRequestHeader getSdncRequestHeader() {
+        return sdncRequestHeader;
+    }
+
+    public void setSdncRequestHeader(SdncRequestHeader sdncRequestHeader) {
+        this.sdncRequestHeader = sdncRequestHeader;
+    }
+
+    public OperationalModeInfo getOperationalModeInfo() {
+        return operationalModeInfo;
+    }
+
+    public void setOperationalModeInfo(OperationalModeInfo operationalModeInfo) {
+        this.operationalModeInfo = operationalModeInfo;
+    }
+
+    public org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.add.specific.operational.modes
+            .to.catalog.input.OperationalModeInfo getOperationalModeInfoSpecific() {
+        return operationalModeInfoSpecific;
+    }
+
+    public void setOperationalModeInfoSpecific(
+            org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                    .add.specific.operational.modes.to.catalog.input.OperationalModeInfo
+                operationalModeInfoSpecific) {
+        this.operationalModeInfoSpecific = operationalModeInfoSpecific;
+    }
+}
index 499e91f6ad9ae4794e8feae5a1fa2cc706b0d316..3c37c929c4ec8b0ce01124e2c161b6fa91a12b2e 100644 (file)
@@ -14,30 +14,29 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.common.constraints.LinkIdentifier;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.common.constraints.LinkIdentifierKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.CoRouting;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.CoRoutingBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.Distance;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.DistanceBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.Diversity;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.DiversityBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.Exclude;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.ExcludeBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.HopCount;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.HopCountBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.Include;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.IncludeBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.Latency;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.LatencyBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.TEMetric;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.TEMetricBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co.routing.ServiceIdentifierList;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co.routing.ServiceIdentifierListKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.HardConstraints;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.HardConstraintsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.SoftConstraints;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.SoftConstraintsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.common.constraints.LinkIdentifier;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.CoRouting;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.CoRoutingBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.Distance;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.DistanceBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.Diversity;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.DiversityBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.Exclude;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.ExcludeBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.HopCount;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.HopCountBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.Include;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.IncludeBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.Latency;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.LatencyBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.TEMetric;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.TEMetricBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co.routing.ServiceIdentifierList;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co.routing.ServiceIdentifierListKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.HardConstraints;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.HardConstraintsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.SoftConstraints;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.SoftConstraintsBuilder;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -68,7 +67,7 @@ public final class DowngradeConstraints {
                     || softConstraintsBuilder.getCustomerCode().isEmpty()) {
                 softConstraintsBuilder.setCustomerCode(hardConstraints.getCustomerCode());
             } else {
-                List<String> updatedCustomerCode = new ArrayList<>(softConstraintsBuilder.getCustomerCode());
+                Set<String> updatedCustomerCode = new HashSet<>(softConstraintsBuilder.getCustomerCode());
                 updatedCustomerCode.addAll(hardConstraints.getCustomerCode());
                 softConstraintsBuilder.setCustomerCode(updatedCustomerCode);
             }
@@ -78,7 +77,7 @@ public final class DowngradeConstraints {
                     || softConstraintsBuilder.getOperationalMode().isEmpty()) {
                 softConstraintsBuilder.setOperationalMode(hardConstraints.getOperationalMode());
             } else {
-                List<String> updatedOperationalMode = new ArrayList<>(softConstraintsBuilder.getOperationalMode());
+                Set<String> updatedOperationalMode = new HashSet<>(softConstraintsBuilder.getOperationalMode());
                 updatedOperationalMode.addAll(hardConstraints.getOperationalMode());
                 softConstraintsBuilder.setOperationalMode(updatedOperationalMode);
             }
@@ -135,7 +134,7 @@ public final class DowngradeConstraints {
             if (includeBldr.getNodeId() == null) {
                 includeBldr.setNodeId(hard.getNodeId());
             } else {
-                Set<NodeIdType> nodeIdList = new HashSet<>(includeBldr.getNodeId());
+                List<NodeIdType> nodeIdList = new ArrayList<>(includeBldr.getNodeId());
                 nodeIdList.addAll(hard.getNodeId());
                 includeBldr.setNodeId(new ArrayList<>(nodeIdList));
             }
@@ -144,7 +143,7 @@ public final class DowngradeConstraints {
             if (includeBldr.getSite() == null) {
                 includeBldr.setSite(hard.getSite());
             } else {
-                Set<String> siteList = new HashSet<>(includeBldr.getSite());
+                List<String> siteList = new ArrayList<>(includeBldr.getSite());
                 siteList.addAll(hard.getSite());
                 includeBldr.setSite(new ArrayList<>(siteList));
             }
@@ -153,7 +152,7 @@ public final class DowngradeConstraints {
             if (includeBldr.getSrlgId() == null) {
                 includeBldr.setSrlgId(hard.getSrlgId());
             } else {
-                Set<Uint32> srlgList = new HashSet<>(includeBldr.getSrlgId());
+                List<Uint32> srlgList = new ArrayList<>(includeBldr.getSrlgId());
                 srlgList.addAll(hard.getSrlgId());
                 includeBldr.setSrlgId(new ArrayList<>(srlgList));
             }
@@ -162,7 +161,7 @@ public final class DowngradeConstraints {
             if (includeBldr.getSupportingServiceName() == null) {
                 includeBldr.setSupportingServiceName(hard.getSupportingServiceName());
             } else {
-                Set<String> serviceList = new HashSet<>(includeBldr.getSupportingServiceName());
+                List<String> serviceList = new ArrayList<>(includeBldr.getSupportingServiceName());
                 serviceList.addAll(hard.getSupportingServiceName());
                 includeBldr.setSupportingServiceName(new ArrayList<>(serviceList));
             }
@@ -171,8 +170,8 @@ public final class DowngradeConstraints {
             if (includeBldr.getLinkIdentifier() == null) {
                 includeBldr.setLinkIdentifier(hard.getLinkIdentifier());
             } else {
-                Map<LinkIdentifierKey, LinkIdentifier> linkList = new HashMap<>(includeBldr.getLinkIdentifier());
-                linkList.putAll(hard.getLinkIdentifier());
+                List<LinkIdentifier> linkList = new ArrayList<>(includeBldr.getLinkIdentifier());
+                linkList.addAll(hard.getLinkIdentifier());
                 includeBldr.setLinkIdentifier(linkList);
             }
         }
@@ -195,7 +194,7 @@ public final class DowngradeConstraints {
             if (excludeBldr.getNodeId() == null) {
                 excludeBldr.setNodeId(hard.getNodeId());
             } else {
-                Set<NodeIdType> nodeIdList = new HashSet<>(excludeBldr.getNodeId());
+                List<NodeIdType> nodeIdList = new ArrayList<>(excludeBldr.getNodeId());
                 nodeIdList.addAll(hard.getNodeId());
                 excludeBldr.setNodeId(new ArrayList<>(nodeIdList));
             }
@@ -204,7 +203,7 @@ public final class DowngradeConstraints {
             if (excludeBldr.getSite() == null) {
                 excludeBldr.setSite(hard.getSite());
             } else {
-                Set<String> siteList = new HashSet<>(excludeBldr.getSite());
+                List<String> siteList = new ArrayList<>(excludeBldr.getSite());
                 siteList.addAll(hard.getSite());
                 excludeBldr.setSite(new ArrayList<>(siteList));
             }
@@ -213,7 +212,7 @@ public final class DowngradeConstraints {
             if (excludeBldr.getSrlgId() == null) {
                 excludeBldr.setSrlgId(hard.getSrlgId());
             } else {
-                Set<Uint32> srlgList = new HashSet<>(excludeBldr.getSrlgId());
+                List<Uint32> srlgList = new ArrayList<>(excludeBldr.getSrlgId());
                 srlgList.addAll(hard.getSrlgId());
                 excludeBldr.setSrlgId(new ArrayList<>(srlgList));
             }
@@ -222,7 +221,7 @@ public final class DowngradeConstraints {
             if (excludeBldr.getSupportingServiceName() == null) {
                 excludeBldr.setSupportingServiceName(hard.getSupportingServiceName());
             } else {
-                Set<String> serviceList = new HashSet<>(excludeBldr.getSupportingServiceName());
+                List<String> serviceList = new ArrayList<>(excludeBldr.getSupportingServiceName());
                 serviceList.addAll(hard.getSupportingServiceName());
                 excludeBldr.setSupportingServiceName(new ArrayList<>(serviceList));
             }
@@ -231,8 +230,8 @@ public final class DowngradeConstraints {
             if (excludeBldr.getLinkIdentifier() == null) {
                 excludeBldr.setLinkIdentifier(hard.getLinkIdentifier());
             } else {
-                Map<LinkIdentifierKey, LinkIdentifier> linkList = new HashMap<>(excludeBldr.getLinkIdentifier());
-                linkList.putAll(hard.getLinkIdentifier());
+                List<LinkIdentifier> linkList = new ArrayList<>(excludeBldr.getLinkIdentifier());
+                linkList.addAll(hard.getLinkIdentifier());
                 excludeBldr.setLinkIdentifier(linkList);
             }
         }
@@ -243,14 +242,14 @@ public final class DowngradeConstraints {
         DiversityBuilder diversityBldr = soft == null ? new DiversityBuilder() : new DiversityBuilder(soft);
 
         Map<
-            org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.diversity.existing.service
+            org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.diversity.existing.service
                     .constraints.ServiceIdentifierListKey,
-            org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.diversity.existing.service
+            org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.diversity.existing.service
                     .constraints.ServiceIdentifierList> sil =
                 diversityBldr.getServiceIdentifierList() == null
                     ? new HashMap<>()
                     : new HashMap<>(diversityBldr.getServiceIdentifierList());
-        if (!hard.getServiceIdentifierList().isEmpty()) {
+        if (!hard.nonnullServiceIdentifierList().isEmpty()) {
             sil.putAll(hard.getServiceIdentifierList());
             diversityBldr.setServiceIdentifierList(sil);
         }
index 11be1f1b5b31102d00a5bf9541feacf4f2670ead..1ecb8114021a4174bac5b45031fa7fcf6504f933 100644 (file)
@@ -7,20 +7,29 @@
  */
 package org.opendaylight.transportpce.servicehandler;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.common.util.concurrent.ListenableFuture;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.path.computation.request.input.ServiceAEnd;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.path.computation.request.input.ServiceAEndBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.path.computation.request.input.ServiceZEnd;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.path.computation.request.input.ServiceZEndBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.service.path.rpc.result.PathDescription;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import java.util.HashMap;
+import java.util.Map;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.request.input.ServiceAEnd;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.request.input.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.request.input.ServiceZEnd;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.request.input.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.service.path.rpc.result.PathDescription;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev181130.NodeIdType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ServiceEndpoint;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommonBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.response.parameters.ResponseParametersBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ServiceEndpoint;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommonBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.response.parameters.ResponseParametersBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.hierarchy.TransportAssignmentBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.hierarchy.transport.assignment.McTtpBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.hierarchy.transport.assignment.NmcCtp;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.hierarchy.transport.assignment.NmcCtpBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.hierarchy.transport.assignment.NmcCtpKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.LifecycleState;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
@@ -45,33 +54,42 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev21092
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OTUflex;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OduRateIdentity;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OtuRateIdentity;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceFeasibilityCheckInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceFeasibilityCheckOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceFeasibilityCheckOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRestorationInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRestorationOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRestorationOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceDeleteInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceDeleteOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceDeleteOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.ServicesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.ServicesKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddOpenroadmOperationalModesToCatalogInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddOpenroadmOperationalModesToCatalogOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddOpenroadmOperationalModesToCatalogOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddSpecificOperationalModesToCatalogInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddSpecificOperationalModesToCatalogOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddSpecificOperationalModesToCatalogOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceFeasibilityCheckInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceFeasibilityCheckOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceFeasibilityCheckOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReconfigureInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReconfigureOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReconfigureOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRestorationInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRestorationOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRestorationOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceDeleteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceDeleteOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceDeleteOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.ServicesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.ServicesKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.temp.service.list.services.SupportingServiceHierarchy;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.temp.service.list.services.SupportingServiceHierarchyBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.temp.service.list.services.SupportingServiceHierarchyKey;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.RxDirection;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.RxDirectionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.TxDirection;
@@ -89,6 +107,33 @@ import org.slf4j.LoggerFactory;
 public final class ModelMappingUtils {
     private static final Logger LOG = LoggerFactory.getLogger(ModelMappingUtils.class);
 
+    private static final ImmutableMap<String, OduRateIdentity> ODU_RATE_MAP =
+        ImmutableMap.<String, OduRateIdentity>builder()
+            .put("ODU0", ODU0.VALUE)
+            .put("ODU1", ODU1.VALUE)
+            .put("ODU2", ODU2.VALUE)
+            .put("ODU2e", ODU2e.VALUE)
+            .put("ODU3", ODU3.VALUE)
+            .put("ODU4", ODU4.VALUE)
+            .put("ODUCn", ODUCn.VALUE)
+            .put("ODUflexCbr", ODUflexCbr.VALUE)
+            .put("ODUflexFlexe", ODUflexFlexe.VALUE)
+            .put("ODUflexGfp", ODUflexGfp.VALUE)
+            .put("ODUflexImp", ODUflexImp.VALUE)
+            .build();
+
+    private static final ImmutableMap<String, OtuRateIdentity> OTU_RATE_MAP =
+        ImmutableMap.<String, OtuRateIdentity>builder()
+            .put("OTU0", OTU0.VALUE)
+            .put("OTU1", OTU1.VALUE)
+            .put("OTU2", OTU2.VALUE)
+            .put("OTU2e", OTU2e.VALUE)
+            .put("OTU3", OTU3.VALUE)
+            .put("OTU4", OTU4.VALUE)
+            .put("OTUCn", OTUCn.VALUE)
+            .put("OTUflex", OTUflex.VALUE)
+            .build();
+
     private ModelMappingUtils() {
     }
 
@@ -114,13 +159,15 @@ public final class ModelMappingUtils {
                         new org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118
                                 .service.endpoint.sp.TxDirectionBuilder()
                             .setPort(
-                                input.getServiceAEnd().getTxDirection().values().stream().findFirst().get().getPort())
+                                input.getServiceAEnd().getTxDirection().values().stream().findFirst().orElseThrow()
+                                    .getPort())
                             .build())
                     .setRxDirection(
                         new org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118
                                 .service.endpoint.sp.RxDirectionBuilder()
                             .setPort(
-                                input.getServiceAEnd().getRxDirection().values().stream().findFirst().get().getPort())
+                                input.getServiceAEnd().getRxDirection().values().stream().findFirst().orElseThrow()
+                                    .getPort())
                             .build())
                     .build())
             .setServiceZEnd(
@@ -136,13 +183,15 @@ public final class ModelMappingUtils {
                         new org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118
                                 .service.endpoint.sp.TxDirectionBuilder()
                             .setPort(
-                                input.getServiceZEnd().getTxDirection().values().stream().findFirst().get().getPort())
+                                input.getServiceZEnd().getTxDirection().values().stream().findFirst().orElseThrow()
+                                    .getPort())
                             .build())
                     .setRxDirection(
                         new org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118
                                 .service.endpoint.sp.RxDirectionBuilder()
                             .setPort(
-                                input.getServiceZEnd().getRxDirection().values().stream().findFirst().get().getPort())
+                                input.getServiceZEnd().getRxDirection().values().stream().findFirst().orElseThrow()
+                                    .getPort())
                             .build())
                     .build())
             .setConnectionType(input.getConnectionType())
@@ -157,74 +206,20 @@ public final class ModelMappingUtils {
             .build();
     }
 
-    private static Class<? extends OduRateIdentity> getOduServiceRate(
-            Class<? extends org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OduRateIdentity>
-                oduServiceRate) {
-        if (oduServiceRate == null) {
+    private static OduRateIdentity getOduServiceRate(OduRateIdentity oduServiceRate) {
+        if (oduServiceRate == null || !ODU_RATE_MAP.containsKey(oduServiceRate.toString())) {
+            LOG.error("ODU rate {} not recognized", oduServiceRate);
             return null;
         }
-        String oduRate = oduServiceRate.getSimpleName();
-        LOG.info("ODU rate = {}", oduRate);
-        //TODO a Map would probably be more indicated here
-        switch (oduRate) {
-            case "ODU0":
-                return ODU0.class;
-            case "ODU1":
-                return ODU1.class;
-            case "ODU2":
-                return ODU2.class;
-            case "ODU2e":
-                return ODU2e.class;
-            case "ODU3":
-                return ODU3.class;
-            case "ODU4":
-                return ODU4.class;
-            case "ODUCn":
-                return ODUCn.class;
-            case "ODUflexCbr":
-                return ODUflexCbr.class;
-            case "ODUflexFlexe":
-                return ODUflexFlexe.class;
-            case "ODUflexGfp":
-                return ODUflexGfp.class;
-            case "ODUflexImp":
-                return ODUflexImp.class;
-            default:
-                LOG.error("OTU rate {} not recognized", oduRate);
-        }
-        return null;
+        return ODU_RATE_MAP.get(oduServiceRate.toString());
     }
 
-    private static Class<? extends OtuRateIdentity> getOtuServiceRate(
-            Class<? extends org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OtuRateIdentity>
-                otuServiceRate) {
-        if (otuServiceRate == null) {
+    private static OtuRateIdentity getOtuServiceRate(OtuRateIdentity otuServiceRate) {
+        if (otuServiceRate == null || !OTU_RATE_MAP.containsKey(otuServiceRate.toString())) {
+            LOG.error("OTU rate {} not recognized", otuServiceRate);
             return null;
         }
-        String otuRate = otuServiceRate.getSimpleName();
-        LOG.info("OTU rate = {}", otuRate);
-        //TODO a Map would probably be more indicated here
-        switch (otuRate) {
-            case "OTU0":
-                return OTU0.class;
-            case "OTU1":
-                return OTU1.class;
-            case "OTU2":
-                return OTU2.class;
-            case "OTU2e":
-                return OTU2e.class;
-            case "OTU3":
-                return OTU3.class;
-            case "OTU4":
-                return OTU4.class;
-            case "OTUCn":
-                return OTUCn.class;
-            case "OTUflex":
-                return OTUflex.class;
-            default:
-                LOG.error("OTU rate {} not recognized", otuRate);
-        }
-        return null;
+        return OTU_RATE_MAP.get(otuServiceRate.toString());
     }
 
     public static org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
@@ -278,32 +273,62 @@ public final class ModelMappingUtils {
         return new ServiceAEndBuilder()
             .setClli(serviceAEnd.getClli())
             .setNodeId(serviceAEnd.getNodeId().getValue())
-            .setRxDirection(createRxDirection(serviceAEnd.getRxDirection().values().stream().findFirst().get()))
+            .setRxDirection(createRxDirection(serviceAEnd.getRxDirection().values().stream().findFirst().orElseThrow()))
             .setServiceFormat(serviceAEnd.getServiceFormat())
             .setServiceRate(serviceAEnd.getServiceRate())
-            .setTxDirection(createTxDirection(serviceAEnd.getTxDirection().values().stream().findFirst().get()))
+            .setTxDirection(createTxDirection(serviceAEnd.getTxDirection().values().stream().findFirst().orElseThrow()))
             .build();
     }
 
+    public static org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205
+            .path.computation.reroute.request.input.ServiceAEnd createServiceAEndReroute(ServiceEndpoint serviceAEnd) {
+        return new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205
+                    .path.computation.reroute.request.input.ServiceAEndBuilder()
+                .setClli(serviceAEnd.getClli())
+                .setNodeId(serviceAEnd.getNodeId().getValue())
+                .setRxDirection(createRxDirection(serviceAEnd.getRxDirection().values().stream().findFirst()
+                        .orElseThrow()))
+                .setServiceFormat(serviceAEnd.getServiceFormat())
+                .setServiceRate(serviceAEnd.getServiceRate())
+                .setTxDirection(createTxDirection(serviceAEnd.getTxDirection().values().stream().findFirst()
+                        .orElseThrow()))
+                .build();
+    }
+
     public static ServiceZEnd createServiceZEnd(ServiceEndpoint serviceZEnd) {
         return new ServiceZEndBuilder()
             .setClli(serviceZEnd.getClli())
             .setNodeId(serviceZEnd.getNodeId().getValue())
-            .setRxDirection(createRxDirection(serviceZEnd.getRxDirection().values().stream().findFirst().get()))
+            .setRxDirection(createRxDirection(serviceZEnd.getRxDirection().values().stream().findFirst().orElseThrow()))
             .setServiceFormat(serviceZEnd.getServiceFormat())
             .setServiceRate(serviceZEnd.getServiceRate())
-            .setTxDirection(createTxDirection(serviceZEnd.getTxDirection().values().stream().findFirst().get()))
+            .setTxDirection(createTxDirection(serviceZEnd.getTxDirection().values().stream().findFirst().orElseThrow()))
             .build();
     }
 
+    public static org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205
+            .path.computation.reroute.request.input.ServiceZEnd createServiceZEndReroute(ServiceEndpoint serviceZEnd) {
+        return new org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205
+                    .path.computation.reroute.request.input.ServiceZEndBuilder()
+                .setClli(serviceZEnd.getClli())
+                .setNodeId(serviceZEnd.getNodeId().getValue())
+                .setRxDirection(createRxDirection(serviceZEnd.getRxDirection().values().stream().findFirst()
+                        .orElseThrow()))
+                .setServiceFormat(serviceZEnd.getServiceFormat())
+                .setServiceRate(serviceZEnd.getServiceRate())
+                .setTxDirection(createTxDirection(serviceZEnd.getTxDirection().values().stream().findFirst()
+                        .orElseThrow()))
+                .build();
+    }
+
     public static RxDirection createRxDirection(
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
                 .service.endpoint.RxDirection rxDirection) {
         return new RxDirectionBuilder().setPort(rxDirection.getPort()).build();
     }
 
     public static TxDirection createTxDirection(
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
                 .service.endpoint.TxDirection txDirection) {
         return new TxDirectionBuilder().setPort(txDirection.getPort()).build();
     }
@@ -417,14 +442,16 @@ public final class ModelMappingUtils {
     }
 
     public static ListenableFuture<RpcResult<ServiceRerouteOutput>> createRerouteServiceReply(
-            ServiceRerouteInput input, String finalAckYes, String message) {
+            ServiceRerouteInput input, String finalAckYes, String message, String responseCode) {
         return RpcResultBuilder
             .success(
                 new ServiceRerouteOutputBuilder()
                     .setConfigurationResponseCommon(
                         new ConfigurationResponseCommonBuilder()
-                            .setResponseMessage(message)
-                            .build())
+                             .setAckFinalIndicator(finalAckYes)
+                             .setResponseCode(responseCode)
+                             .setResponseMessage(message)
+                             .build())
                     .setHardConstraints(null)
                     .setSoftConstraints(null)
                     .build())
@@ -455,16 +482,17 @@ public final class ModelMappingUtils {
                 .setConnectionType(serviceCreateInput.getConnectionType())
                 .setCustomer(serviceCreateInput.getCustomer())
                 .setCustomerContact(serviceCreateInput.getCustomerContact())
+                .setServiceResiliency(serviceCreateInput.getServiceResiliency())
                 .setHardConstraints(serviceCreateInput.getHardConstraints())
                 .setSoftConstraints(serviceCreateInput.getSoftConstraints())
                 .setSdncRequestHeader(serviceCreateInput.getSdncRequestHeader())
                 .setLifecycleState(LifecycleState.Planned)
                 .setServiceAEnd(
-                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
                             .service.ServiceAEndBuilder(serviceCreateInput.getServiceAEnd())
                         .build())
                 .setServiceZEnd(
-                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
                             .service.ServiceZEndBuilder(serviceCreateInput.getServiceZEnd())
                         .build())
                 .build();
@@ -482,11 +510,11 @@ public final class ModelMappingUtils {
                 .setSoftConstraints(serviceReconfigureInput.getSoftConstraints())
                 .setLifecycleState(LifecycleState.Planned)
                 .setServiceAEnd(
-                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
                             .service.ServiceAEndBuilder(serviceReconfigureInput.getServiceAEnd())
                         .build())
                 .setServiceZEnd(
-                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
                             .service.ServiceZEndBuilder(serviceReconfigureInput.getServiceZEnd())
                         .build())
                 .build();
@@ -499,9 +527,37 @@ public final class ModelMappingUtils {
         return new ServicesBuilder().withKey(new ServicesKey("unknown")).build();
     }
 
-    public static org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210
-            .temp.service.list.Services mappingServices(TempServiceCreateInput tempServiceCreateInput) {
-        return new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210
+    public static org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+            .temp.service.list.Services mappingServices(TempServiceCreateInput tempServiceCreateInput,
+                                                        PathDescription pathDescription) {
+        Map<SupportingServiceHierarchyKey, SupportingServiceHierarchy> supportingServiceHierarchyMap = new HashMap<>();
+        Map<NmcCtpKey, NmcCtp> nmcCtpMap = new HashMap<>();
+        SupportingServiceHierarchyKey supportingServiceHierarchyKey = new SupportingServiceHierarchyKey(
+                tempServiceCreateInput.getCommonId());
+        // TODO: here we assume the A-Z and Z-A has parameters
+        LOG.info("Min and Max frequencies are {} {}", pathDescription.getAToZDirection().getAToZMinFrequency(),
+                pathDescription.getAToZDirection().getAToZMinFrequency());
+        nmcCtpMap.put(
+            new NmcCtpKey("1"),
+            new NmcCtpBuilder()
+                .setId("1")
+                .setFrequency(pathDescription.getAToZDirection().getCentralFrequency())
+                .setWidth(pathDescription.getAToZDirection().getWidth())
+                .build());
+        supportingServiceHierarchyMap.put(
+            supportingServiceHierarchyKey,
+            new SupportingServiceHierarchyBuilder().setServiceIdentifier(tempServiceCreateInput.getCommonId())
+                .setTransportAssignment(
+                    new TransportAssignmentBuilder()
+                        .setMcTtp(
+                            new McTtpBuilder()
+                                .setMaxFreq(pathDescription.getAToZDirection().getAToZMaxFrequency())
+                                .setMinFreq(pathDescription.getAToZDirection().getAToZMinFrequency())
+                                .build())
+                        .setNmcCtp(nmcCtpMap)
+                        .build())
+                .build());
+        return new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
                 .temp.service.list.ServicesBuilder()
             .setServiceName(tempServiceCreateInput.getCommonId())
             .setAdministrativeState(AdminStates.OutOfService)
@@ -515,11 +571,12 @@ public final class ModelMappingUtils {
             .setSdncRequestHeader(tempServiceCreateInput.getSdncRequestHeader())
             .setLifecycleState(LifecycleState.Planned)
             .setServiceAEnd(
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
                     .service.ServiceAEndBuilder(tempServiceCreateInput.getServiceAEnd()).build())
             .setServiceZEnd(
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
                     .service.ServiceZEndBuilder(tempServiceCreateInput.getServiceZEnd()).build())
+            .setSupportingServiceHierarchy(supportingServiceHierarchyMap)
             .build();
     }
 
@@ -548,7 +605,7 @@ public final class ModelMappingUtils {
                                         .service.endpoint.sp.TxDirectionBuilder()
                                 .setPort(
                                     serviceInput.getServiceAEnd().getTxDirection()
-                                        .values().stream().findFirst().get().getPort())
+                                        .values().stream().findFirst().orElseThrow().getPort())
                                 .build())
                         .setRxDirection(
                             new org.opendaylight.yang.gen.v1
@@ -556,7 +613,7 @@ public final class ModelMappingUtils {
                                         .service.endpoint.sp.RxDirectionBuilder()
                                 .setPort(
                                     serviceInput.getServiceAEnd().getRxDirection()
-                                        .values().stream().findFirst().get().getPort())
+                                        .values().stream().findFirst().orElseThrow().getPort())
                                 .build())
                         .build())
                 .setServiceZEnd(
@@ -572,7 +629,7 @@ public final class ModelMappingUtils {
                                         .service.endpoint.sp.TxDirectionBuilder()
                                 .setPort(
                                     serviceInput.getServiceZEnd().getTxDirection()
-                                        .values().stream().findFirst().get().getPort())
+                                        .values().stream().findFirst().orElseThrow().getPort())
                                 .build())
                         .setRxDirection(
                             new org.opendaylight.yang.gen.v1
@@ -580,7 +637,7 @@ public final class ModelMappingUtils {
                                         .service.endpoint.sp.RxDirectionBuilder()
                                 .setPort(
                                     serviceInput.getServiceZEnd().getRxDirection()
-                                        .values().stream().findFirst().get().getPort())
+                                        .values().stream().findFirst().orElseThrow().getPort())
                                 .build())
                         .build())
                 .setServicePathName(serviceInput.getServiceName())
@@ -604,7 +661,7 @@ public final class ModelMappingUtils {
     }
 
 
-    @edu.umd.cs.findbugs.annotations.SuppressFBWarnings(
+    @SuppressFBWarnings(
         value = "PZLA_PREFER_ZERO_LENGTH_ARRAYS",
         justification = "not relevant to return and zero length array as we need real pos")
     public static int[] findTheLongestSubstring(String s1, String s2) {
@@ -629,4 +686,45 @@ public final class ModelMappingUtils {
         }
         return new int[] { endPos - maxLen, endPos };
     }
+
+    public static ListenableFuture<RpcResult<AddOpenroadmOperationalModesToCatalogOutput>>
+        addOpenroadmServiceReply(AddOpenroadmOperationalModesToCatalogInput input, String finalAck,
+                                 String message,String responseCode) {
+        return RpcResultBuilder
+            .success(
+                new AddOpenroadmOperationalModesToCatalogOutputBuilder()
+                    .setConfigurationResponseCommon(
+                        new ConfigurationResponseCommonBuilder()
+                                .setAckFinalIndicator(finalAck)
+                                .setResponseMessage(message)
+                            .setResponseCode(responseCode)
+                                .setRequestId(
+                                        input.getSdncRequestHeader() == null
+                                                ? null
+                                                : input.getSdncRequestHeader().getRequestId())
+                            .build())
+                    .build())
+            .buildFuture();
+    }
+
+    public static ListenableFuture<RpcResult<AddSpecificOperationalModesToCatalogOutput>>
+        addSpecificOpenroadmServiceReply(AddSpecificOperationalModesToCatalogInput input, String finalAck,
+                                         String message,String responseCode) {
+        return RpcResultBuilder
+                .success(
+                        new AddSpecificOperationalModesToCatalogOutputBuilder()
+                                .setConfigurationResponseCommon(
+                                        new ConfigurationResponseCommonBuilder()
+                                                .setAckFinalIndicator(finalAck)
+                                                .setResponseMessage(message)
+                                                .setResponseCode(responseCode)
+                                                .setRequestId(
+                                                        input.getSdncRequestHeader() == null
+                                                                ? null
+                                                                : input.getSdncRequestHeader().getRequestId())
+                                                .build())
+                                .build())
+                .buildFuture();
+    }
+
 }
index 6f45e5894792ae5ec153818afb77d8decc4e82ae..dbe905ca83c3dbb53c13ea6d76e6fee005c7154c 100644 (file)
@@ -7,29 +7,30 @@
  */
 package org.opendaylight.transportpce.servicehandler;
 
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ConnectionType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.RpcActions;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ServiceEndpoint;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.sdnc.request.header.SdncRequestHeader;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.sdnc.request.header.SdncRequestHeaderBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.HardConstraints;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.SoftConstraints;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceFeasibilityCheckInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceDeleteInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input.ServiceAEndBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ConnectionType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ServiceEndpoint;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.sdnc.request.header.SdncRequestHeader;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.sdnc.request.header.SdncRequestHeaderBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.resiliency.ServiceResiliency;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.HardConstraints;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.SoftConstraints;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceFeasibilityCheckInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReconfigureInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceDeleteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.create.input.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.create.input.ServiceZEndBuilder;
 
 /**
  * Super class of {@link ServiceCreateInput} and {@link TempServiceCreateInput}.
  *
  * @author Martial Coulibaly ( martial.coulibaly@gfi.com ) on behalf of Orange
- *
  */
 public class ServiceInput {
     private String serviceName;
@@ -43,6 +44,7 @@ public class ServiceInput {
     private ServiceEndpoint serviceZEnd;
     private String customer;
     private String customerContact;
+    private ServiceResiliency serviceResiliency;
     private boolean serviceReconfigure;
 
     public ServiceInput(ServiceCreateInput serviceCreateInput) {
@@ -56,6 +58,7 @@ public class ServiceInput {
         setServiceZEnd(serviceCreateInput.getServiceZEnd());
         setCustomer(serviceCreateInput.getCustomer());
         setCustomerContact(serviceCreateInput.getCustomerContact());
+        setServiceResiliency(serviceCreateInput.getServiceResiliency());
         setServiceReconfigure(false);
     }
 
@@ -73,6 +76,7 @@ public class ServiceInput {
         setServiceZEnd(serviceReconfigureInput.getServiceZEnd());
         setCustomer(serviceReconfigureInput.getCustomer());
         setCustomerContact(serviceReconfigureInput.getCustomerContact());
+        setServiceResiliency(serviceReconfigureInput.getServiceResiliency());
         setServiceReconfigure(true);
     }
 
@@ -93,6 +97,7 @@ public class ServiceInput {
         setServiceZEnd(tempServiceCreateInput.getServiceZEnd());
         setCustomer(tempServiceCreateInput.getCustomer());
         setCustomerContact(tempServiceCreateInput.getCustomerContact());
+        setServiceResiliency(tempServiceCreateInput.getServiceResiliency());
         setServiceReconfigure(false);
     }
 
@@ -107,6 +112,7 @@ public class ServiceInput {
         setServiceZEnd(serviceFeasibilityCheckInput.getServiceZEnd());
         setCustomer(serviceFeasibilityCheckInput.getCustomer());
         setCustomerContact(serviceFeasibilityCheckInput.getCustomerContact());
+        setServiceResiliency(serviceFeasibilityCheckInput.getServiceResiliency());
         setServiceReconfigure(false);
     }
 
@@ -118,6 +124,13 @@ public class ServiceInput {
         setServiceReconfigure(false);
     }
 
+    public ServiceInput(ServiceRerouteInput serviceRerouteInput) {
+        setServiceName(serviceRerouteInput.getServiceName());
+        setSdncRequestHeader(serviceRerouteInput.getSdncRequestHeader());
+        setServiceResiliency(serviceRerouteInput.getServiceResiliency());
+        setServiceReconfigure(false);
+    }
+
     public ServiceCreateInput getServiceCreateInput() {
         ServiceCreateInputBuilder serviceCreateInputBuilder = new ServiceCreateInputBuilder()
                 .setCommonId(commonId)
@@ -128,7 +141,8 @@ public class ServiceInput {
                 .setServiceAEnd(new ServiceAEndBuilder(serviceAEnd).build())
                 .setServiceZEnd(new ServiceZEndBuilder(serviceZEnd).build())
                 .setCustomer(customer)
-                .setCustomerContact(customerContact);
+                .setCustomerContact(customerContact)
+                .setServiceResiliency(serviceResiliency);
         if (isServiceReconfigure()) {
             serviceCreateInputBuilder.setServiceName(newServiceName);
         } else {
@@ -138,14 +152,20 @@ public class ServiceInput {
     }
 
     public TempServiceCreateInput getTempServiceCreateInput() {
-        return new TempServiceCreateInputBuilder().setCommonId(commonId)
-                .setConnectionType(connectionType).setSdncRequestHeader(sdncRequestHeader)
-                .setHardConstraints(hardConstraints).setSoftConstraints(softConstraints)
-                .setServiceAEnd(new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service
+        return new TempServiceCreateInputBuilder()
+                .setCommonId(commonId)
+                .setConnectionType(connectionType)
+                .setSdncRequestHeader(sdncRequestHeader)
+                .setHardConstraints(hardConstraints)
+                .setSoftConstraints(softConstraints)
+                .setServiceAEnd(new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.temp.service
                         .create.input.ServiceAEndBuilder(serviceAEnd).build())
-                .setServiceZEnd(new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service
-                        .create.input.ServiceZEndBuilder(serviceZEnd).build()).setCustomer(customer)
-                .setCustomerContact(customerContact).build();
+                .setServiceZEnd(new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.temp.service
+                        .create.input.ServiceZEndBuilder(serviceZEnd).build())
+                .setCustomer(customer)
+                .setCustomerContact(customerContact)
+                .setServiceResiliency(serviceResiliency)
+                .build();
     }
 
     public String getServiceName() {
@@ -236,6 +256,14 @@ public class ServiceInput {
         this.newServiceName = newServiceName;
     }
 
+    public void setServiceResiliency(ServiceResiliency serviceResiliency) {
+        this.serviceResiliency = serviceResiliency;
+    }
+
+    public ServiceResiliency getServiceResiliency() {
+        return serviceResiliency;
+    }
+
     public boolean isServiceReconfigure() {
         return serviceReconfigure;
     }
diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/catalog/CatalogDataStoreOperations.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/catalog/CatalogDataStoreOperations.java
new file mode 100644 (file)
index 0000000..4441077
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright © 2023 Fujitsu Network Communications, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.servicehandler.catalog;
+
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.OpenroadmOperationalModes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.SpecificOperationalModes;
+
+/**
+ * Store operational mode catalog into MDSAL .
+ */
+public interface CatalogDataStoreOperations {
+
+    /**
+     * Store OpenroadmOperationalModes object in the config data store.
+     */
+    void addOpenroadmOperationalModesToCatalog(OpenroadmOperationalModes objToSave);
+
+    /**
+     * Store SpecificOperationalModes object in the config data store.
+     */
+    void addSpecificOperationalModesToCatalog(SpecificOperationalModes objToSave);
+
+}
diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/catalog/CatalogDataStoreOperationsImpl.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/catalog/CatalogDataStoreOperationsImpl.java
new file mode 100644 (file)
index 0000000..56189c4
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright © 2023 Fujitsu Network Communications, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.servicehandler.catalog;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.transportpce.common.Timeouts;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.OpenroadmOperationalModes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.SpecificOperationalModes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.OperationalModeCatalog;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Component
+public class CatalogDataStoreOperationsImpl implements CatalogDataStoreOperations {
+    private static final Logger LOG = LoggerFactory.getLogger(CatalogDataStoreOperationsImpl.class);
+
+    private NetworkTransactionService networkTransactionService;
+
+    @Activate
+    public CatalogDataStoreOperationsImpl(@Reference NetworkTransactionService networkTransactionService) {
+        this.networkTransactionService = networkTransactionService;
+    }
+
+    /**
+     * Store OpenroadmOperationalModes object in the config data store.
+     */
+    @Override
+    public void addOpenroadmOperationalModesToCatalog(OpenroadmOperationalModes objToSave) {
+        LOG.info("Inside addOpenroadmOperationalModesToCatalog method of CatalogDataStoreOperationsImpl");
+        try {
+            InstanceIdentifier<OpenroadmOperationalModes> instanceIdentifier =
+                InstanceIdentifier.create(OperationalModeCatalog.class).child(OpenroadmOperationalModes.class);
+            networkTransactionService.merge(LogicalDatastoreType.CONFIGURATION, instanceIdentifier , objToSave);
+            networkTransactionService.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS);
+        } catch (TimeoutException | InterruptedException | ExecutionException e) {
+            LOG.warn("Warning addOpenroadmOperationalModesToCatalog CatalogDataStoreOperationsImpl");
+        }
+    }
+
+    /**
+     * Store SpecificOperationalModes object in the config data store.
+     */
+    @Override
+    public void addSpecificOperationalModesToCatalog(SpecificOperationalModes objToSave) {
+        LOG.info("Inside addSpecificOperationalModesToCatalog method of CatalogDataStoreOperationsImpl");
+        try {
+            InstanceIdentifier<SpecificOperationalModes> instanceIdentifier = InstanceIdentifier
+                    .create(OperationalModeCatalog.class).child(SpecificOperationalModes.class);
+            networkTransactionService.merge(LogicalDatastoreType.CONFIGURATION, instanceIdentifier , objToSave);
+            networkTransactionService.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS);
+        } catch (TimeoutException | InterruptedException | ExecutionException e) {
+            LOG.warn("Warning addSpecificOperationalModesToCatalog CatalogDataStoreOperationsImpl");
+        }
+    }
+}
diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/catalog/CatalogMapper.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/catalog/CatalogMapper.java
new file mode 100644 (file)
index 0000000..c7683e9
--- /dev/null
@@ -0,0 +1,141 @@
+/*
+ * Copyright © 2023 Fujitsu Network Communications, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.servicehandler.catalog;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.OpenroadmOperationalModes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.OpenroadmOperationalModesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.SpecificOperationalModes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.SpecificOperationalModesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.openroadm.operational.modes.AmplifiersBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.openroadm.operational.modes.GridParametersBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.openroadm.operational.modes.RoadmsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.openroadm.operational.modes.XpondersPluggablesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.openroadm.operational.modes.xponders.pluggables.XponderPluggableOpenroadmOperationalModeBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.specific.operational.modes.SpecificOperationalModeBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddOpenroadmOperationalModesToCatalogInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddSpecificOperationalModesToCatalogInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.add.openroadm.operational.modes.to.catalog.input.OperationalModeInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public final class CatalogMapper {
+    private static final Logger LOG = LoggerFactory.getLogger(CatalogMapper.class);
+
+    private CatalogMapper() {
+    }
+
+    static SpecificOperationalModesBuilder specificObjBuilder = new SpecificOperationalModesBuilder();
+
+    static OpenroadmOperationalModesBuilder objBuilder = new OpenroadmOperationalModesBuilder();
+
+    /**
+     * Preparation of SpecificOperationalModes object which will be stored in the config data store
+     * and returning the same.
+     */
+    public static SpecificOperationalModes createSpecificModesToSave(AddSpecificOperationalModesToCatalogInput input) {
+        LOG.info("Inside createSpecificModesToSave method of CatalogMapper");
+        saveSpecificOperationalModes(input.getOperationalModeInfo().getSpecificOperationalModes());
+        return specificObjBuilder.build();
+    }
+
+    /**
+     * Preparation of OpenroadmOperationalModes object which will be stored in the config data store
+     * and returning the same.
+     */
+    public static OpenroadmOperationalModes createORModesToSave(AddOpenroadmOperationalModesToCatalogInput input) {
+        LOG.info("Inside createORModesToSave method of CatalogMapper");
+        OperationalModeInfo modesFromInput = input.getOperationalModeInfo();
+        saveGridParameters(modesFromInput);
+        saveXpondersPlugabbles(modesFromInput);
+        saveRoadms(modesFromInput);
+        saveAmplifiers(modesFromInput);
+        return objBuilder.build();
+    }
+
+    /**
+     * Preparation of Amplifiers for OpenroadmOperationalModes object.
+     */
+    private static void saveAmplifiers(OperationalModeInfo modesFromInput) {
+        objBuilder.setAmplifiers(
+                new AmplifiersBuilder()
+                        .setAmplifier(modesFromInput.getAmplifiers().getAmplifier())
+                        .build());
+    }
+
+    /**
+     * Preparation of Grid Parameters for OpenroadmOperationalModes object.
+     */
+    private static void saveGridParameters(OperationalModeInfo modesFromInput) {
+        objBuilder.setGridParameters(new GridParametersBuilder(modesFromInput.getGridParameters()).build());
+    }
+
+    /**
+     * Preparation of Xponders Pluggables for OpenroadmOperationalModes object.
+     */
+    private static void saveXpondersPlugabbles(OperationalModeInfo modesFromInput) {
+        Map<org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526
+                .operational.mode.catalog.openroadm.operational.modes.xponders.pluggables
+                .XponderPluggableOpenroadmOperationalModeKey,
+            org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526
+                .operational.mode.catalog.openroadm.operational.modes.xponders.pluggables
+                .XponderPluggableOpenroadmOperationalMode> mapFinal = new HashMap<>();
+        for (var entry : modesFromInput.getXpondersPluggables().getXponderPluggableOpenroadmOperationalMode()
+                .entrySet()) {
+            mapFinal.put(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526
+                    .operational.mode.catalog.openroadm.operational.modes.xponders.pluggables
+                    .XponderPluggableOpenroadmOperationalModeKey(entry.getKey().toString()),
+                new XponderPluggableOpenroadmOperationalModeBuilder(entry.getValue())
+                    .setOpenroadmOperationalModeId(entry.getValue().getOpenroadmOperationalModeId())
+                    .build());
+            objBuilder.setXpondersPluggables(
+                new XpondersPluggablesBuilder().setXponderPluggableOpenroadmOperationalMode(mapFinal).build());
+        }
+    }
+
+    /**
+     * Preparation of Roadms for OpenroadmOperationalModes object.
+     */
+    private static void saveRoadms(OperationalModeInfo modesFromInput) {
+        objBuilder.setRoadms(
+            new RoadmsBuilder()
+                .setAdd(modesFromInput.getRoadms().getAdd())
+                .setDrop(modesFromInput.getRoadms().getDrop())
+                .setExpress(modesFromInput.getRoadms().getExpress())
+                .build());
+    }
+
+    /**
+     * Preparation of Specific Operational Modes for SpecificOperationalModes object.
+     */
+    private static  void saveSpecificOperationalModes(org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+           .add.specific.operational.modes.to.catalog.input.operational.mode.info.SpecificOperationalModes
+                specificModesFromInput) {
+        Map<org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526
+                .operational.mode.catalog.specific.operational.modes.SpecificOperationalModeKey,
+            org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526
+                .operational.mode.catalog.specific.operational.modes.SpecificOperationalMode>
+            mapFinal = new HashMap<>();
+        for (var entry : specificModesFromInput.getSpecificOperationalMode().entrySet()) {
+            SpecificOperationalModeBuilder specificModeBuilder = new SpecificOperationalModeBuilder();
+            specificModeBuilder.fieldsFrom(entry.getValue());
+            mapFinal.put(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526
+                    .operational.mode.catalog.specific.operational.modes.SpecificOperationalModeKey(
+                        entry.getKey().toString()),
+                specificModeBuilder
+                    .setOperationalModeId(entry.getValue().getOperationalModeId())
+                    .setConfigurableOutputPower(true)
+                    .build());
+            specificObjBuilder.setSpecificOperationalMode(mapFinal);
+        }
+    }
+}
diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/AddOpenroadmOperationalModesToCatalogImpl.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/AddOpenroadmOperationalModesToCatalogImpl.java
new file mode 100644 (file)
index 0000000..2170117
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.servicehandler.impl;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.transportpce.common.OperationResult;
+import org.opendaylight.transportpce.common.ResponseCodes;
+import org.opendaylight.transportpce.servicehandler.CatalogInput;
+import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
+import org.opendaylight.transportpce.servicehandler.catalog.CatalogDataStoreOperations;
+import org.opendaylight.transportpce.servicehandler.catalog.CatalogMapper;
+import org.opendaylight.transportpce.servicehandler.impl.ServicehandlerImpl.LogMessages;
+import org.opendaylight.transportpce.servicehandler.validation.CatalogValidation;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.OpenroadmOperationalModes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddOpenroadmOperationalModesToCatalog;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddOpenroadmOperationalModesToCatalogInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddOpenroadmOperationalModesToCatalogOutput;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class AddOpenroadmOperationalModesToCatalogImpl implements AddOpenroadmOperationalModesToCatalog {
+    private static final Logger LOG = LoggerFactory.getLogger(AddOpenroadmOperationalModesToCatalogImpl.class);
+    private static final String ADD_OR_TO_CATALOG_MSG = "addORToCatalog: {}";
+
+    private CatalogDataStoreOperations catalogDataStoreOperations;
+
+    public AddOpenroadmOperationalModesToCatalogImpl(CatalogDataStoreOperations catalogDataStoreOperations) {
+        this.catalogDataStoreOperations = catalogDataStoreOperations;
+    }
+
+    /**
+     * Implementation of the RPC to set OR  operational modes in the catalog of the controller.
+     * Semantics of the RPC is such that the information in the input replaces the full content
+     * of the OR operational modes catalog in the config data store. Incremental changes to the
+     * catalog, if required, must be done via individual PUT/POST/DELETE RESTconf APIs.
+     *
+     * @param input AddOpenroadmOperationalModesToCatalogInput to be added to Catalog
+     * @return Result of the request
+     */
+    @Override
+    public ListenableFuture<RpcResult<AddOpenroadmOperationalModesToCatalogOutput>> invoke(
+            AddOpenroadmOperationalModesToCatalogInput input) {
+        LOG.info("RPC addOpenroadmOperationalModesToCatalog in progress");
+        LOG.debug(" Input openRoadm {}", input);
+        // Validation
+        OperationResult validationResult = CatalogValidation.validateORCatalogRequest(
+                new CatalogInput(input), RpcActions.FillCatalogWithOrOperationalModes);
+        if (! validationResult.isSuccess()) {
+            LOG.warn(ADD_OR_TO_CATALOG_MSG, LogMessages.ABORT_OR_TO_CATALOG_FAILED);
+            return ModelMappingUtils.addOpenroadmServiceReply(
+                    input, ResponseCodes.FINAL_ACK_YES,
+                    validationResult.getResultMessage(), ResponseCodes.RESPONSE_FAILED);
+        }
+        LOG.info(" Request System Id {} " ,input.getSdncRequestHeader().getRequestSystemId());
+        LOG.info(" Rpc Action {} " ,input.getSdncRequestHeader().getRpcAction());
+
+        OpenroadmOperationalModes objToSave = CatalogMapper.createORModesToSave(input);
+        catalogDataStoreOperations.addOpenroadmOperationalModesToCatalog(objToSave);
+        LOG.info("RPC addOpenroadmOperationalModesToCatalog Completed");
+        return ModelMappingUtils.addOpenroadmServiceReply(input, ResponseCodes.FINAL_ACK_YES,
+                validationResult.getResultMessage(), ResponseCodes.RESPONSE_OK);
+    }
+
+}
diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/AddSpecificOperationalModesToCatalogImpl.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/AddSpecificOperationalModesToCatalogImpl.java
new file mode 100644 (file)
index 0000000..c65a169
--- /dev/null
@@ -0,0 +1,72 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.servicehandler.impl;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.transportpce.common.OperationResult;
+import org.opendaylight.transportpce.common.ResponseCodes;
+import org.opendaylight.transportpce.servicehandler.CatalogInput;
+import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
+import org.opendaylight.transportpce.servicehandler.catalog.CatalogDataStoreOperations;
+import org.opendaylight.transportpce.servicehandler.catalog.CatalogMapper;
+import org.opendaylight.transportpce.servicehandler.impl.ServicehandlerImpl.LogMessages;
+import org.opendaylight.transportpce.servicehandler.validation.CatalogValidation;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.operational.mode.catalog.rev230526.operational.mode.catalog.SpecificOperationalModes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddSpecificOperationalModesToCatalog;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddSpecificOperationalModesToCatalogInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddSpecificOperationalModesToCatalogOutput;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class AddSpecificOperationalModesToCatalogImpl implements AddSpecificOperationalModesToCatalog {
+    private static final Logger LOG = LoggerFactory.getLogger(AddSpecificOperationalModesToCatalogImpl.class);
+    private static final String ADD_SPECIFIC_TO_CATALOG_MSG = "addSpecificToCatalog: {}";
+
+    private CatalogDataStoreOperations catalogDataStoreOperations;
+
+    public AddSpecificOperationalModesToCatalogImpl(CatalogDataStoreOperations catalogDataStoreOperations) {
+        this.catalogDataStoreOperations = catalogDataStoreOperations;
+    }
+
+    /**
+     * Implementation of the RPC to set specific operational modes in the catalog of the controller.
+     * Semantics of the RPC is such that the information in the input replaces the full content
+     * of the specific operational modes catalog in the config data store. Incremental changes to the
+     * catalog, if required, must be done via individual PUT/POST/DELETE RESTconf APIs.
+     *
+     * @param input AddSpecificOperationalModesToCatalogInput to be added to Catalog
+     * @return Result of the request
+     */
+    @Override
+    public ListenableFuture<RpcResult<AddSpecificOperationalModesToCatalogOutput>> invoke(
+            AddSpecificOperationalModesToCatalogInput input) {
+        LOG.info("RPC addSpecificOperationalModesToCatalog in progress");
+        LOG.debug(" Input openSpecificRoadm {}", input);
+        // Validation
+        OperationResult validationResult = CatalogValidation.validateSpecificCatalogRequest(
+                new CatalogInput(input), RpcActions.FillCatalogWithSpecificOperationalModes);
+        if (! validationResult.isSuccess()) {
+            LOG.warn(ADD_SPECIFIC_TO_CATALOG_MSG, LogMessages.ABORT_SPECIFIC_TO_CATALOG_FAILED);
+            return ModelMappingUtils.addSpecificOpenroadmServiceReply(
+                    input, ResponseCodes.FINAL_ACK_YES,
+                    validationResult.getResultMessage(), ResponseCodes.RESPONSE_FAILED);
+        }
+        LOG.info(" Request System Id {} " ,input.getSdncRequestHeader().getRequestSystemId());
+        LOG.info(" Rpc Action {} " ,input.getSdncRequestHeader().getRpcAction());
+
+        SpecificOperationalModes objToSave = CatalogMapper.createSpecificModesToSave(input);
+        catalogDataStoreOperations.addSpecificOperationalModesToCatalog(objToSave);
+        LOG.info("RPC addSpecificOperationalModesToCatalog Completed");
+        return ModelMappingUtils.addSpecificOpenroadmServiceReply(input, ResponseCodes.FINAL_ACK_YES,
+                validationResult.getResultMessage(), ResponseCodes.RESPONSE_OK);
+    }
+
+}
diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServiceCreateImpl.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServiceCreateImpl.java
new file mode 100644 (file)
index 0000000..8c2a5f9
--- /dev/null
@@ -0,0 +1,131 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.servicehandler.impl;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.transportpce.common.OperationResult;
+import org.opendaylight.transportpce.common.ResponseCodes;
+import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
+import org.opendaylight.transportpce.servicehandler.ServiceInput;
+import org.opendaylight.transportpce.servicehandler.impl.ServicehandlerImpl.LogMessages;
+import org.opendaylight.transportpce.servicehandler.listeners.NetworkListener;
+import org.opendaylight.transportpce.servicehandler.listeners.PceListener;
+import org.opendaylight.transportpce.servicehandler.listeners.RendererListener;
+import org.opendaylight.transportpce.servicehandler.service.PCEServiceWrapper;
+import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
+import org.opendaylight.transportpce.servicehandler.validation.ServiceCreateValidation;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommon;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreate;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateOutput;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationProcessServiceBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.process.service.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.process.service.ServiceZEndBuilder;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class ServiceCreateImpl implements ServiceCreate {
+    private static final Logger LOG = LoggerFactory.getLogger(ServiceCreateImpl.class);
+    private static final String SERVICE_CREATE_MSG = "serviceCreate: {}";
+    private static final String PUBLISHER = "ServiceHandler";
+
+    private ServiceDataStoreOperations serviceDataStoreOperations;
+    private PceListener pceListener;
+    private RendererListener rendererListener;
+    private NetworkListener networkListener;
+    private PCEServiceWrapper pceServiceWrapper;
+    private NotificationPublishService notificationPublishService;
+
+    public ServiceCreateImpl(final ServiceDataStoreOperations serviceDataStoreOperations,
+            final PceListener pceListener, RendererListener rendererListener, NetworkListener networkListener,
+            PCEServiceWrapper pceServiceWrapper, NotificationPublishService notificationPublishService) {
+        this.serviceDataStoreOperations = serviceDataStoreOperations;
+        this.pceListener = pceListener;
+        this.rendererListener = rendererListener;
+        this.networkListener = networkListener;
+        this.pceServiceWrapper = pceServiceWrapper;
+        this.notificationPublishService = notificationPublishService;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<ServiceCreateOutput>> invoke(ServiceCreateInput input) {
+        LOG.info("RPC serviceCreate received");
+        // Validation
+        OperationResult validationResult = ServiceCreateValidation.validateServiceCreateRequest(
+                new ServiceInput(input), RpcActions.ServiceCreate);
+        if (!validationResult.isSuccess()) {
+            LOG.warn(SERVICE_CREATE_MSG, LogMessages.ABORT_VALID_FAILED);
+            return ModelMappingUtils.createCreateServiceReply(
+                    input, ResponseCodes.FINAL_ACK_YES,
+                    validationResult.getResultMessage(), ResponseCodes.RESPONSE_FAILED);
+        }
+        //Check any presence of services with the same nameequipmentNotification
+        String serviceName = input.getServiceName();
+        if (this.serviceDataStoreOperations.getService(serviceName).isPresent()) {
+            LOG.warn(SERVICE_CREATE_MSG, LogMessages.serviceInDS(serviceName));
+            return ModelMappingUtils.createCreateServiceReply(input, ResponseCodes.FINAL_ACK_YES,
+                    LogMessages.serviceInDS(serviceName), ResponseCodes.RESPONSE_FAILED);
+        }
+        // TODO: Here we also have to check if there is an associated temp-service.
+        // TODO: If there is one, delete it from the temp-service-list??
+        this.pceListener.setInput(new ServiceInput(input));
+        this.pceListener.setServiceReconfigure(false);
+        this.pceListener.setTempService(false);
+        this.pceListener.setserviceDataStoreOperations(this.serviceDataStoreOperations);
+        this.rendererListener.setserviceDataStoreOperations(serviceDataStoreOperations);
+        this.rendererListener.setServiceInput(new ServiceInput(input));
+        // This ensures that the temp-service boolean is false, especially, when
+        // service-create is initiated after the temp-service-create
+        this.rendererListener.setTempService(false);
+        this.networkListener.setserviceDataStoreOperations(serviceDataStoreOperations);
+        LOG.debug(SERVICE_CREATE_MSG, LogMessages.PCE_CALLING);
+        PathComputationRequestOutput output = this.pceServiceWrapper.performPCE(input, true);
+        if (output == null) {
+            LOG.warn(SERVICE_CREATE_MSG, LogMessages.ABORT_PCE_FAILED);
+            sendNbiNotification(new PublishNotificationProcessServiceBuilder()
+                    .setServiceName(serviceName)
+                    .setServiceAEnd(new ServiceAEndBuilder(input.getServiceAEnd()).build())
+                    .setServiceZEnd(new ServiceZEndBuilder(input.getServiceZEnd()).build())
+                    .setCommonId(input.getCommonId())
+                    .setConnectionType(input.getConnectionType())
+                    .setResponseFailed(LogMessages.ABORT_PCE_FAILED)
+                    .setMessage("ServiceCreate request failed ...")
+                    .setOperationalState(State.Degraded)
+                    .setPublisherName(PUBLISHER)
+                    .build());
+            return ModelMappingUtils.createCreateServiceReply(input, ResponseCodes.FINAL_ACK_YES,
+                    LogMessages.PCE_FAILED, ResponseCodes.RESPONSE_FAILED);
+        }
+        LOG.info("RPC serviceCreate in progress...");
+        ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
+        return ModelMappingUtils.createCreateServiceReply(
+                input, common.getAckFinalIndicator(),
+                common.getResponseMessage(), common.getResponseCode());
+    }
+
+    /**
+     * Send notification to NBI notification in order to publish message.
+     * @param service PublishNotificationService
+     */
+    private void sendNbiNotification(PublishNotificationProcessService service) {
+        try {
+            notificationPublishService.putNotification(service);
+        } catch (InterruptedException e) {
+            LOG.warn("Cannot send notification to nbi", e);
+            Thread.currentThread().interrupt();
+        }
+    }
+
+}
diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServiceDeleteImpl.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServiceDeleteImpl.java
new file mode 100644 (file)
index 0000000..1bb9d53
--- /dev/null
@@ -0,0 +1,144 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.servicehandler.impl;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.Optional;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.transportpce.common.ResponseCodes;
+import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
+import org.opendaylight.transportpce.servicehandler.ServiceInput;
+import org.opendaylight.transportpce.servicehandler.impl.ServicehandlerImpl.LogMessages;
+import org.opendaylight.transportpce.servicehandler.listeners.NetworkListener;
+import org.opendaylight.transportpce.servicehandler.listeners.PceListener;
+import org.opendaylight.transportpce.servicehandler.listeners.RendererListener;
+import org.opendaylight.transportpce.servicehandler.service.RendererServiceWrapper;
+import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
+import org.opendaylight.transportpce.servicehandler.validation.checks.ComplianceCheckResult;
+import org.opendaylight.transportpce.servicehandler.validation.checks.ServicehandlerComplianceCheck;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ServiceNotificationTypes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommon;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDelete;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationProcessServiceBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.process.service.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.process.service.ServiceZEndBuilder;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class ServiceDeleteImpl implements ServiceDelete {
+    private static final Logger LOG = LoggerFactory.getLogger(ServiceDeleteImpl.class);
+    private static final String SERVICE_DELETE_MSG = "serviceDelete: {}";
+    private static final String PUBLISHER = "ServiceHandler";
+
+    private ServiceDataStoreOperations serviceDataStoreOperations;
+    private PceListener pceListener;
+    private RendererListener rendererListener;
+    private NetworkListener networkListener;
+    private RendererServiceWrapper rendererServiceWrapper;
+    private NotificationPublishService notificationPublishService;
+
+    public ServiceDeleteImpl(final ServiceDataStoreOperations serviceDataStoreOperations,
+            final PceListener pceListener, RendererListener rendererListener, NetworkListener networkListener,
+            RendererServiceWrapper rendererServiceWrapper,
+            NotificationPublishService notificationPublishService) {
+        this.serviceDataStoreOperations = serviceDataStoreOperations;
+        this.pceListener = pceListener;
+        this.rendererListener = rendererListener;
+        this.networkListener = networkListener;
+        this.rendererServiceWrapper = rendererServiceWrapper;
+        this.notificationPublishService = notificationPublishService;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<ServiceDeleteOutput>> invoke(ServiceDeleteInput input) {
+        String serviceName = input.getServiceDeleteReqInfo().getServiceName();
+        LOG.info("RPC serviceDelete request received for {}", serviceName);
+        /*
+         * Upon receipt of service-deleteService RPC, service header and sdnc-request
+         * header compliance are verified.
+         */
+        ComplianceCheckResult serviceHandlerCheckResult =
+            ServicehandlerComplianceCheck.check(
+                input.getServiceDeleteReqInfo().getServiceName(),
+                input.getSdncRequestHeader(), null, RpcActions.ServiceDelete, false, true);
+        if (!serviceHandlerCheckResult.hasPassed()) {
+            LOG.warn(SERVICE_DELETE_MSG, LogMessages.ABORT_SERVICE_NON_COMPLIANT);
+            return ModelMappingUtils.createDeleteServiceReply(
+                    input, ResponseCodes.FINAL_ACK_YES,
+                    LogMessages.SERVICE_NON_COMPLIANT, ResponseCodes.RESPONSE_FAILED);
+        }
+        //Check presence of service to be deleted
+        Optional<Services> serviceOpt = this.serviceDataStoreOperations.getService(serviceName);
+        if (serviceOpt.isEmpty()) {
+            LOG.warn(SERVICE_DELETE_MSG, LogMessages.serviceNotInDS(serviceName));
+            return ModelMappingUtils.createDeleteServiceReply(
+                    input, ResponseCodes.FINAL_ACK_YES,
+                    LogMessages.serviceNotInDS(serviceName), ResponseCodes.RESPONSE_FAILED);
+        }
+        LOG.debug("serviceDelete: Service '{}' found in datastore", serviceName);
+        this.pceListener.setInput(new ServiceInput(input));
+        this.pceListener.setServiceReconfigure(false);
+        this.pceListener.setTempService(false);
+        this.pceListener.setserviceDataStoreOperations(this.serviceDataStoreOperations);
+        this.rendererListener.setTempService(false);
+        this.rendererListener.setserviceDataStoreOperations(serviceDataStoreOperations);
+        this.rendererListener.setServiceInput(new ServiceInput(input));
+        this.networkListener.setserviceDataStoreOperations(serviceDataStoreOperations);
+        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInput
+                serviceDeleteInput = ModelMappingUtils.createServiceDeleteInput(new ServiceInput(input));
+        Services service = serviceOpt.orElseThrow();
+        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteOutput output =
+            this.rendererServiceWrapper.performRenderer(
+                serviceDeleteInput, ServiceNotificationTypes.ServiceDeleteResult, service);
+        if (output == null) {
+            LOG.error(SERVICE_DELETE_MSG, LogMessages.RENDERER_DELETE_FAILED);
+            sendNbiNotification(new PublishNotificationProcessServiceBuilder()
+                    .setServiceName(service.getServiceName())
+                    .setServiceAEnd(new ServiceAEndBuilder(service.getServiceAEnd()).build())
+                    .setServiceZEnd(new ServiceZEndBuilder(service.getServiceZEnd()).build())
+                    .setCommonId(service.getCommonId())
+                    .setConnectionType(service.getConnectionType())
+                    .setMessage("ServiceDelete request failed ...")
+                    .setOperationalState(State.InService)
+                    .setResponseFailed(LogMessages.RENDERER_DELETE_FAILED)
+                    .setPublisherName(PUBLISHER)
+                    .build());
+            return ModelMappingUtils.createDeleteServiceReply(
+                    input, ResponseCodes.FINAL_ACK_YES,
+                    LogMessages.RENDERER_DELETE_FAILED, ResponseCodes.RESPONSE_FAILED);
+        }
+
+        LOG.debug("RPC serviceDelete in progress...");
+        ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
+        return ModelMappingUtils.createDeleteServiceReply(
+                input, common.getAckFinalIndicator(),
+                common.getResponseMessage(), common.getResponseCode());
+    }
+
+    /**
+     * Send notification to NBI notification in order to publish message.
+     * @param service PublishNotificationService
+     */
+    private void sendNbiNotification(PublishNotificationProcessService service) {
+        try {
+            notificationPublishService.putNotification(service);
+        } catch (InterruptedException e) {
+            LOG.warn("Cannot send notification to nbi", e);
+            Thread.currentThread().interrupt();
+        }
+    }
+
+}
diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServiceFeasibilityCheckImpl.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServiceFeasibilityCheckImpl.java
new file mode 100644 (file)
index 0000000..70bf60f
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.servicehandler.impl;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.transportpce.common.OperationResult;
+import org.opendaylight.transportpce.common.ResponseCodes;
+import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
+import org.opendaylight.transportpce.servicehandler.ServiceInput;
+import org.opendaylight.transportpce.servicehandler.impl.ServicehandlerImpl.LogMessages;
+import org.opendaylight.transportpce.servicehandler.listeners.NetworkListener;
+import org.opendaylight.transportpce.servicehandler.listeners.PceListener;
+import org.opendaylight.transportpce.servicehandler.listeners.RendererListener;
+import org.opendaylight.transportpce.servicehandler.service.PCEServiceWrapper;
+import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
+import org.opendaylight.transportpce.servicehandler.validation.ServiceCreateValidation;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommon;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceFeasibilityCheck;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceFeasibilityCheckInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceFeasibilityCheckOutput;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class ServiceFeasibilityCheckImpl implements ServiceFeasibilityCheck {
+    private static final Logger LOG = LoggerFactory.getLogger(ServiceFeasibilityCheckImpl.class);
+    private static final String SERVICE_FEASIBILITY_CHECK_MSG = "serviceFeasibilityCheck: {}";
+
+    private ServiceDataStoreOperations serviceDataStoreOperations;
+    private PceListener pceListener;
+    private RendererListener rendererListener;
+    private NetworkListener networkListener;
+    private PCEServiceWrapper pceServiceWrapper;
+
+    public ServiceFeasibilityCheckImpl(final ServiceDataStoreOperations serviceDataStoreOperations,
+            final PceListener pceListener, RendererListener rendererListener, NetworkListener networkListener,
+            PCEServiceWrapper pceServiceWrapper) {
+        this.serviceDataStoreOperations = serviceDataStoreOperations;
+        this.pceListener = pceListener;
+        this.rendererListener = rendererListener;
+        this.networkListener = networkListener;
+        this.pceServiceWrapper = pceServiceWrapper;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<ServiceFeasibilityCheckOutput>> invoke(ServiceFeasibilityCheckInput input) {
+        LOG.info("RPC serviceFeasibilityCheck received");
+        // Validation
+        ServiceInput serviceInput = new ServiceInput(input);
+        OperationResult validationResult = ServiceCreateValidation.validateServiceCreateRequest(serviceInput,
+                RpcActions.ServiceFeasibilityCheck);
+        if (! validationResult.isSuccess()) {
+            LOG.warn(SERVICE_FEASIBILITY_CHECK_MSG, LogMessages.ABORT_VALID_FAILED);
+            return ModelMappingUtils.createCreateServiceReply(
+                    input, ResponseCodes.FINAL_ACK_YES,
+                    validationResult.getResultMessage(), ResponseCodes.RESPONSE_FAILED);
+        }
+        this.pceListener.setInput(new ServiceInput(input));
+        this.pceListener.setServiceReconfigure(false);
+        this.pceListener.setServiceFeasiblity(true);
+        this.pceListener.setserviceDataStoreOperations(this.serviceDataStoreOperations);
+        this.rendererListener.setserviceDataStoreOperations(serviceDataStoreOperations);
+        this.rendererListener.setServiceInput(new ServiceInput(input));
+        this.networkListener.setserviceDataStoreOperations(serviceDataStoreOperations);
+        LOG.debug(SERVICE_FEASIBILITY_CHECK_MSG, LogMessages.PCE_CALLING);
+        PathComputationRequestOutput output = this.pceServiceWrapper.performPCE(input, true);
+        if (output == null) {
+            LOG.warn(SERVICE_FEASIBILITY_CHECK_MSG, LogMessages.ABORT_PCE_FAILED);
+            return ModelMappingUtils.createCreateServiceReply(input, ResponseCodes.FINAL_ACK_YES,
+                    LogMessages.PCE_FAILED, ResponseCodes.RESPONSE_FAILED);
+        }
+        LOG.info("RPC serviceFeasibilityCheck in progress...");
+        ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
+        return ModelMappingUtils.createCreateServiceReply(
+                input, common.getAckFinalIndicator(),
+                common.getResponseMessage(), common.getResponseCode());
+    }
+
+}
diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServiceHandlerProvider.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServiceHandlerProvider.java
new file mode 100644 (file)
index 0000000..c1c1872
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright © 2017 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.servicehandler.impl;
+
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
+import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
+import org.opendaylight.mdsal.binding.api.NotificationService;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.transportpce.servicehandler.listeners.NetworkModelNotificationHandler;
+import org.opendaylight.transportpce.servicehandler.listeners.PceNotificationHandler;
+import org.opendaylight.transportpce.servicehandler.listeners.RendererNotificationHandler;
+import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceList;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
+import org.opendaylight.yangtools.concepts.Registration;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Class to register
+ * Servicehandler Service and Notification.
+ * @author Martial Coulibaly ( martial.coulibaly@gfi.com ) on behalf of Orange
+ *
+ */
+@Component
+public class ServiceHandlerProvider {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ServiceHandlerProvider.class);
+    private static final InstanceIdentifier<Services> SERVICE = InstanceIdentifier.create(ServiceList.class)
+            .child(Services.class);
+
+    private final Registration pcelistenerRegistration;
+    private Registration serviceListListenerRegistration;
+    private final Registration rendererlistenerRegistration;
+    private final Registration networkmodellistenerRegistration;
+    private ServiceDataStoreOperations serviceDataStoreOperations;
+
+    @Activate
+    public ServiceHandlerProvider(@Reference final DataBroker dataBroker,
+            @Reference NotificationService notificationService,
+            @Reference ServiceDataStoreOperations serviceDataStoreOperations,
+            @Reference PceNotificationHandler pceNotificationHandler,
+            @Reference RendererNotificationHandler rendererNotificationHandler,
+            @Reference NetworkModelNotificationHandler networkModelNotificationHandler,
+            @Reference DataTreeChangeListener<Services> serviceListener) {
+        this.serviceDataStoreOperations = serviceDataStoreOperations;
+        this.serviceDataStoreOperations.initialize();
+        pcelistenerRegistration = notificationService
+            .registerCompositeListener(pceNotificationHandler.getCompositeListener());
+        rendererlistenerRegistration = notificationService
+            .registerCompositeListener(rendererNotificationHandler.getCompositeListener());
+        networkmodellistenerRegistration = notificationService
+            .registerCompositeListener(networkModelNotificationHandler.getCompositeListener());
+        final var serviceListId = DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, SERVICE);
+        serviceListListenerRegistration = dataBroker.registerTreeChangeListener(serviceListId, serviceListener);
+        LOG.info("ServicehandlerProvider Session Initiated");
+        LOG.info("Transportpce controller started");
+    }
+
+    /**
+     * Method called when the blueprint container is destroyed.
+     */
+    @Deactivate
+    public void close() {
+        LOG.info("ServicehandlerProvider Closed");
+        pcelistenerRegistration.close();
+        serviceListListenerRegistration.close();
+        rendererlistenerRegistration.close();
+        networkmodellistenerRegistration.close();
+    }
+}
diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServiceReconfigureImpl.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServiceReconfigureImpl.java
new file mode 100644 (file)
index 0000000..2999875
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.servicehandler.impl;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.Optional;
+import org.opendaylight.transportpce.common.OperationResult;
+import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
+import org.opendaylight.transportpce.servicehandler.ServiceInput;
+import org.opendaylight.transportpce.servicehandler.impl.ServicehandlerImpl.LogMessages;
+import org.opendaylight.transportpce.servicehandler.listeners.NetworkListener;
+import org.opendaylight.transportpce.servicehandler.listeners.PceListener;
+import org.opendaylight.transportpce.servicehandler.listeners.RendererListener;
+import org.opendaylight.transportpce.servicehandler.service.RendererServiceWrapper;
+import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
+import org.opendaylight.transportpce.servicehandler.validation.ServiceCreateValidation;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ServiceNotificationTypes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommon;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReconfigure;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReconfigureInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReconfigureOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class ServiceReconfigureImpl implements ServiceReconfigure {
+    private static final Logger LOG = LoggerFactory.getLogger(ServiceReconfigureImpl.class);
+    private static final String SERVICE_RECONFIGURE_MSG = "serviceReconfigure: {}";
+
+    private ServiceDataStoreOperations serviceDataStoreOperations;
+    private PceListener pceListener;
+    private RendererListener rendererListener;
+    private NetworkListener networkListener;
+    private RendererServiceWrapper rendererServiceWrapper;
+
+    public ServiceReconfigureImpl(final ServiceDataStoreOperations serviceDataStoreOperations,
+            final PceListener pceListener, RendererListener rendererListener, NetworkListener networkListener,
+            RendererServiceWrapper rendererServiceWrapper) {
+        this.serviceDataStoreOperations = serviceDataStoreOperations;
+        this.pceListener = pceListener;
+        this.rendererListener = rendererListener;
+        this.networkListener = networkListener;
+        this.rendererServiceWrapper = rendererServiceWrapper;
+    }
+
+
+    @Override
+    public ListenableFuture<RpcResult<ServiceReconfigureOutput>> invoke(ServiceReconfigureInput input) {
+        String serviceName = input.getServiceName();
+        LOG.info("RPC serviceReconfigure received for {}", serviceName);
+        Optional<Services> servicesObject = this.serviceDataStoreOperations.getService(serviceName);
+        if (servicesObject.isEmpty()) {
+            LOG.warn(SERVICE_RECONFIGURE_MSG, LogMessages.serviceNotInDS(serviceName));
+            return ModelMappingUtils.createCreateServiceReply(
+                input,
+                LogMessages.serviceNotInDS(serviceName));
+        }
+        LOG.debug("Service '{}' found in datastore", serviceName);
+        OperationResult validationResult = ServiceCreateValidation
+                .validateServiceCreateRequest(new ServiceInput(input), RpcActions.ServiceReconfigure);
+        if (!validationResult.isSuccess()) {
+            LOG.warn(SERVICE_RECONFIGURE_MSG, LogMessages.ABORT_VALID_FAILED);
+            return ModelMappingUtils.createCreateServiceReply(
+                    input,
+                    validationResult.getResultMessage());
+        }
+        this.pceListener.setInput(new ServiceInput(input));
+        this.pceListener.setServiceReconfigure(true);
+        this.pceListener.setserviceDataStoreOperations(this.serviceDataStoreOperations);
+        this.rendererListener.setserviceDataStoreOperations(serviceDataStoreOperations);
+        this.rendererListener.setServiceInput(new ServiceInput(input));
+        this.networkListener.setserviceDataStoreOperations(serviceDataStoreOperations);
+        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
+                .ServiceDeleteInput serviceDeleteInput =
+                        ModelMappingUtils.createServiceDeleteInput(new ServiceInput(input));
+        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
+                .ServiceDeleteOutput output = this.rendererServiceWrapper.performRenderer(serviceDeleteInput,
+                        ServiceNotificationTypes.ServiceDeleteResult, null);
+        if (output == null) {
+            LOG.error(SERVICE_RECONFIGURE_MSG, LogMessages.RENDERER_DELETE_FAILED);
+            return ModelMappingUtils.createCreateServiceReply(
+                    input,
+                    LogMessages.RENDERER_DELETE_FAILED);
+                    //TODO check if RpcStatus.Successful is really expected here
+        }
+        LOG.info("RPC serviceReconfigure in progress...");
+        ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
+        return ModelMappingUtils.createCreateServiceReply(
+                input,
+                common.getResponseMessage());
+    }
+
+}
diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServiceRerouteImpl.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServiceRerouteImpl.java
new file mode 100644 (file)
index 0000000..cb6e1b1
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.servicehandler.impl;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.Map;
+import java.util.Optional;
+import org.opendaylight.transportpce.common.ResponseCodes;
+import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
+import org.opendaylight.transportpce.servicehandler.ServiceInput;
+import org.opendaylight.transportpce.servicehandler.impl.ServicehandlerImpl.LogMessages;
+import org.opendaylight.transportpce.servicehandler.service.PCEServiceWrapper;
+import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRerouteRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.reroute.request.input.EndpointsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommon;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReroute;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZ;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.TerminationPoint;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePaths;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class ServiceRerouteImpl implements ServiceReroute {
+    private static final Logger LOG = LoggerFactory.getLogger(ServiceRerouteImpl.class);
+
+    private ServiceDataStoreOperations serviceDataStoreOperations;
+    private PCEServiceWrapper pceServiceWrapper;
+
+    public ServiceRerouteImpl(final ServiceDataStoreOperations serviceDataStoreOperations,
+            PCEServiceWrapper pceServiceWrapper) {
+        this.serviceDataStoreOperations = serviceDataStoreOperations;
+        this.pceServiceWrapper = pceServiceWrapper;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<ServiceRerouteOutput>> invoke(ServiceRerouteInput input) {
+        String serviceName = input.getServiceName();
+        LOG.info("RPC serviceReroute received for {}", serviceName);
+        Optional<Services> servicesObject = this.serviceDataStoreOperations.getService(serviceName);
+        if (servicesObject.isEmpty()) {
+            LOG.warn("serviceReroute: {}", LogMessages.serviceNotInDS(serviceName));
+            return ModelMappingUtils.createRerouteServiceReply(
+                    input, ResponseCodes.FINAL_ACK_YES,
+                    LogMessages.serviceNotInDS(serviceName),
+                    ResponseCodes.RESPONSE_FAILED);
+        }
+        Optional<ServicePaths> servicePathsObject = this.serviceDataStoreOperations.getServicePath(serviceName);
+        if (servicePathsObject.isEmpty()) {
+            LOG.warn("serviceReroute: {}", LogMessages.servicePathNotInDS(serviceName));
+            return ModelMappingUtils.createRerouteServiceReply(
+                    input, ResponseCodes.FINAL_ACK_YES,
+                    LogMessages.servicePathNotInDS(serviceName),
+                    ResponseCodes.RESPONSE_FAILED);
+        }
+        // serviceInput for later use maybe...
+        Services service = servicesObject.orElseThrow();
+        ServiceInput serviceInput = new ServiceInput(input);
+        serviceInput.setServiceAEnd(service.getServiceAEnd());
+        serviceInput.setServiceZEnd(service.getServiceZEnd());
+        serviceInput.setConnectionType(service.getConnectionType());
+        serviceInput.setCommonId(service.getCommonId());
+        serviceInput.setHardConstraints(service.getHardConstraints());
+        serviceInput.setSoftConstraints(service.getSoftConstraints());
+        serviceInput.setCustomer(service.getCustomer());
+        serviceInput.setCustomerContact(service.getCustomerContact());
+        // Get the network xpdr termination points
+        ServicePaths servicePaths = servicePathsObject.orElseThrow();
+        Map<AToZKey, AToZ> mapaToz = servicePaths.getPathDescription().getAToZDirection().getAToZ();
+        PathComputationRerouteRequestOutput output = this.pceServiceWrapper.performPCEReroute(
+                service.getHardConstraints(), service.getSoftConstraints(), input.getSdncRequestHeader(),
+                service.getServiceAEnd(), service.getServiceZEnd(),
+                new EndpointsBuilder()
+                    .setAEndTp(
+                        ((TerminationPoint) mapaToz
+                                .get(new AToZKey(String.valueOf(mapaToz.size() - 3)))
+                                .getResource()
+                                .getResource())
+                            .getTpId())
+                    .setZEndTp(
+                        ((TerminationPoint) mapaToz
+                                .get(new AToZKey("2"))
+                                .getResource()
+                                .getResource())
+                            .getTpId())
+                    .build());
+        if (output == null) {
+            LOG.error("serviceReroute: {}", LogMessages.PCE_FAILED);
+            return ModelMappingUtils.createRerouteServiceReply(
+                    input, ResponseCodes.FINAL_ACK_YES,
+                    LogMessages.PCE_FAILED, ResponseCodes.RESPONSE_FAILED);
+        }
+        LOG.info("RPC ServiceReroute is done");
+        ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
+        return ModelMappingUtils.createRerouteServiceReply(input, common.getAckFinalIndicator(),
+                common.getResponseMessage(), common.getResponseCode());
+    }
+
+}
diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServiceRestorationImpl.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServiceRestorationImpl.java
new file mode 100644 (file)
index 0000000..817515a
--- /dev/null
@@ -0,0 +1,139 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.servicehandler.impl;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.util.Optional;
+import org.opendaylight.transportpce.servicehandler.DowngradeConstraints;
+import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
+import org.opendaylight.transportpce.servicehandler.ServiceInput;
+import org.opendaylight.transportpce.servicehandler.impl.ServicehandlerImpl.LogMessages;
+import org.opendaylight.transportpce.servicehandler.listeners.NetworkListener;
+import org.opendaylight.transportpce.servicehandler.listeners.PceListener;
+import org.opendaylight.transportpce.servicehandler.listeners.RendererListener;
+import org.opendaylight.transportpce.servicehandler.service.RendererServiceWrapper;
+import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ServiceNotificationTypes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommon;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.sdnc.request.header.SdncRequestHeaderBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.HardConstraints;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.SoftConstraints;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRestoration;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRestorationInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRestorationOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.delete.input.ServiceDeleteReqInfo.TailRetention;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.delete.input.ServiceDeleteReqInfoBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class ServiceRestorationImpl implements ServiceRestoration {
+    private static final Logger LOG = LoggerFactory.getLogger(ServiceRestorationImpl.class);
+    private static final String SERVICE_RESTORATION_MSG = "serviceRestoration: {}";
+
+    private ServiceDataStoreOperations serviceDataStoreOperations;
+    private PceListener pceListener;
+    private RendererListener rendererListener;
+    private NetworkListener networkListener;
+    private RendererServiceWrapper rendererServiceWrapper;
+
+    public ServiceRestorationImpl(final ServiceDataStoreOperations serviceDataStoreOperations,
+            final PceListener pceListener, RendererListener rendererListener, NetworkListener networkListener,
+            RendererServiceWrapper rendererServiceWrapper) {
+        this.serviceDataStoreOperations = serviceDataStoreOperations;
+        this.pceListener = pceListener;
+        this.rendererListener = rendererListener;
+        this.networkListener = networkListener;
+        this.rendererServiceWrapper = rendererServiceWrapper;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<ServiceRestorationOutput>> invoke(ServiceRestorationInput input) {
+        String serviceName = input.getServiceName();
+        LOG.info("RPC serviceRestoration received for {}", serviceName);
+        Optional<Services> servicesObject = this.serviceDataStoreOperations.getService(serviceName);
+
+        if (servicesObject.isEmpty()) {
+            LOG.warn(SERVICE_RESTORATION_MSG, LogMessages.serviceNotInDS(serviceName));
+            return ModelMappingUtils.createRestoreServiceReply(
+                    LogMessages.serviceNotInDS(serviceName));
+        }
+
+        Services service = servicesObject.orElseThrow();
+        State state = service.getOperationalState();
+
+        if (state == State.InService) {
+            LOG.error(SERVICE_RESTORATION_MSG, LogMessages.serviceInService(serviceName));
+            return ModelMappingUtils.createRestoreServiceReply(
+                    LogMessages.serviceInService(serviceName));
+        }
+
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx");
+        OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneOffset.UTC);
+        DateAndTime datetime = new DateAndTime(dtf.format(offsetDateTime));
+        SdncRequestHeaderBuilder sdncBuilder = new SdncRequestHeaderBuilder()
+                .setNotificationUrl(service.getSdncRequestHeader().getNotificationUrl())
+                .setRequestId(service.getSdncRequestHeader().getRequestId())
+                .setRequestSystemId(service.getSdncRequestHeader().getRequestSystemId())
+                .setRpcAction(RpcActions.ServiceDelete);
+        ServiceDeleteInputBuilder deleteInputBldr = new ServiceDeleteInputBuilder()
+                .setServiceDeleteReqInfo(new ServiceDeleteReqInfoBuilder()
+                    .setServiceName(serviceName)
+                    .setDueDate(datetime)
+                    .setTailRetention(TailRetention.No).build())
+                .setSdncRequestHeader(sdncBuilder.build());
+        ServiceInput serviceInput = new ServiceInput(deleteInputBldr.build());
+        serviceInput.setServiceAEnd(service.getServiceAEnd());
+        serviceInput.setServiceZEnd(service.getServiceZEnd());
+        serviceInput.setConnectionType(service.getConnectionType());
+        HardConstraints hardConstraints = service.getHardConstraints();
+        if (hardConstraints == null) {
+            LOG.warn("service '{}' HardConstraints is not set !", serviceName);
+        } else {
+            SoftConstraints softConstraints = service.getSoftConstraints();
+            if (softConstraints == null) {
+                LOG.warn("service '{}' SoftConstraints is not set !", serviceName);
+                serviceInput.setSoftConstraints(DowngradeConstraints.convertToSoftConstraints(hardConstraints));
+            } else {
+                LOG.info("converting hard constraints to soft constraints ...");
+                serviceInput.setSoftConstraints(
+                        DowngradeConstraints.updateSoftConstraints(hardConstraints, softConstraints));
+            }
+            serviceInput.setHardConstraints(DowngradeConstraints.downgradeHardConstraints(hardConstraints));
+        }
+        this.pceListener.setInput(serviceInput);
+        this.pceListener.setServiceReconfigure(true);
+        this.pceListener.setserviceDataStoreOperations(this.serviceDataStoreOperations);
+        this.rendererListener.setServiceInput(serviceInput);
+        this.rendererListener.setserviceDataStoreOperations(this.serviceDataStoreOperations);
+        this.networkListener.setserviceDataStoreOperations(serviceDataStoreOperations);
+        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
+            .ServiceDeleteInput serviceDeleteInput = ModelMappingUtils.createServiceDeleteInput(
+                    new ServiceInput(deleteInputBldr.build()));
+        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
+            .ServiceDeleteOutput output = this.rendererServiceWrapper.performRenderer(serviceDeleteInput,
+                ServiceNotificationTypes.ServiceDeleteResult, null);
+        if (output == null) {
+            LOG.error(SERVICE_RESTORATION_MSG, LogMessages.RENDERER_DELETE_FAILED);
+            return ModelMappingUtils.createRestoreServiceReply(LogMessages.RENDERER_DELETE_FAILED);
+        }
+        LOG.info("RPC serviceRestore in progress...");
+        ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
+        return ModelMappingUtils.createRestoreServiceReply(common.getResponseMessage());
+    }
+
+}
index 7827f87a30bb2ba5e1a8846767a68c17969d814a..2c0ea7d0a8fe9460925cb76bae04e9fc89b8ec41 100644 (file)
  */
 package org.opendaylight.transportpce.servicehandler.impl;
 
-import com.google.common.util.concurrent.ListenableFuture;
-import java.time.OffsetDateTime;
-import java.time.ZoneOffset;
-import java.time.format.DateTimeFormatter;
-import java.util.Optional;
-import org.opendaylight.mdsal.binding.api.DataBroker;
+import com.google.common.collect.ImmutableClassToInstanceMap;
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
-import org.opendaylight.transportpce.common.OperationResult;
-import org.opendaylight.transportpce.common.ResponseCodes;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
 import org.opendaylight.transportpce.pce.service.PathComputationService;
 import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations;
-import org.opendaylight.transportpce.servicehandler.DowngradeConstraints;
-import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
-import org.opendaylight.transportpce.servicehandler.ServiceInput;
-import org.opendaylight.transportpce.servicehandler.listeners.NetworkModelListenerImpl;
-import org.opendaylight.transportpce.servicehandler.listeners.PceListenerImpl;
-import org.opendaylight.transportpce.servicehandler.listeners.RendererListenerImpl;
+import org.opendaylight.transportpce.servicehandler.catalog.CatalogDataStoreOperations;
+import org.opendaylight.transportpce.servicehandler.listeners.NetworkListener;
+import org.opendaylight.transportpce.servicehandler.listeners.PceListener;
+import org.opendaylight.transportpce.servicehandler.listeners.RendererListener;
 import org.opendaylight.transportpce.servicehandler.service.PCEServiceWrapper;
 import org.opendaylight.transportpce.servicehandler.service.RendererServiceWrapper;
 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
-import org.opendaylight.transportpce.servicehandler.validation.ServiceCreateValidation;
-import org.opendaylight.transportpce.servicehandler.validation.checks.ComplianceCheckResult;
-import org.opendaylight.transportpce.servicehandler.validation.checks.ServicehandlerComplianceCheck;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.RpcActions;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ServiceNotificationTypes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommon;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.sdnc.request.header.SdncRequestHeaderBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.HardConstraints;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.SoftConstraints;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.AddOpenroadmOperationalModesToCatalogInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.AddOpenroadmOperationalModesToCatalogOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.AddSpecificOperationalModesToCatalogInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.AddSpecificOperationalModesToCatalogOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.EquipmentNotificationInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.EquipmentNotificationOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.NetworkReOptimizationInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.NetworkReOptimizationOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OpticalTunnelCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OpticalTunnelCreateOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OpticalTunnelRequestCancelInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OpticalTunnelRequestCancelOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OrgOpenroadmServiceService;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateBulkInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateBulkOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateComplexResultNotificationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateComplexResultNotificationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateResultNotificationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateResultNotificationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteComplexResultNotificationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteComplexResultNotificationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteResultNotificationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteResultNotificationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceFeasibilityCheckBulkInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceFeasibilityCheckBulkOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceFeasibilityCheckInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceFeasibilityCheckOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureBulkInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureBulkOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureResultNotificationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureResultNotificationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteConfirmInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteConfirmOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteConfirmResultNotificationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteConfirmResultNotificationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRestorationInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRestorationOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRestorationResultNotificationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRestorationResultNotificationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReversionInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReversionOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReversionResultNotificationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReversionResultNotificationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRollInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRollOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRollResultNotificationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRollResultNotificationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceSrlgGetInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceSrlgGetOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateBulkInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateBulkOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceDeleteInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceDeleteOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.delete.input.ServiceDeleteReqInfo.TailRetention;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.delete.input.ServiceDeleteReqInfoBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationProcessService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationProcessServiceBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.notification.process.service.ServiceAEndBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.notification.process.service.ServiceZEndBuilder;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
-import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddOpenroadmOperationalModesToCatalog;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddSpecificOperationalModesToCatalog;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreate;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDelete;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceFeasibilityCheck;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReconfigure;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReroute;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRestoration;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreate;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceDelete;
+import org.opendaylight.yangtools.concepts.Registration;
+import org.opendaylight.yangtools.yang.binding.Rpc;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -118,43 +42,76 @@ import org.slf4j.LoggerFactory;
 /**
  * Top level service interface providing main OpenROADM controller services.
  */
-public class ServicehandlerImpl implements OrgOpenroadmServiceService {
+@Component
+public class ServicehandlerImpl {
     private static final Logger LOG = LoggerFactory.getLogger(ServicehandlerImpl.class);
-    private static final String PUBLISHER = "ServiceHandler";
-    private static final String TEMP_SERVICE_CREATE_MSG = "tempServiceCreate: {}";
-    private static final String TEMP_SERVICE_DELETE_MSG = "tempServiceDelete: {}";
-    private static final String SERVICE_RESTORATION_MSG = "serviceRestoration: {}";
-    private static final String SERVICE_RECONFIGURE_MSG = "serviceReconfigure: {}";
-    private static final String SERVICE_FEASIBILITY_CHECK_MSG = "serviceFeasibilityCheck: {}";
-    private static final String SERVICE_DELETE_MSG = "serviceDelete: {}";
-    private static final String SERVICE_CREATE_MSG = "serviceCreate: {}";
 
-    private DataBroker db;
     private ServiceDataStoreOperations serviceDataStoreOperations;
+    private PceListener pceListenerImpl;
+    private RendererListener rendererListenerImpl;
+    private NetworkListener networkModelListenerImpl;
+    private CatalogDataStoreOperations catalogDataStoreOperations;
+    private NotificationPublishService notificationPublishService;
     private PCEServiceWrapper pceServiceWrapper;
     private RendererServiceWrapper rendererServiceWrapper;
-    private PceListenerImpl pceListenerImpl;
-    private RendererListenerImpl rendererListenerImpl;
-    private NetworkModelListenerImpl networkModelListenerImpl;
-    private NotificationPublishService notificationPublishService;
-
-    //TODO: remove private request fields as they are in global scope
-
-    public ServicehandlerImpl(DataBroker databroker, PathComputationService pathComputationService,
-            RendererServiceOperations rendererServiceOperations, NotificationPublishService notificationPublishService,
-            PceListenerImpl pceListenerImpl, RendererListenerImpl rendererListenerImpl,
-            NetworkModelListenerImpl networkModelListenerImpl, ServiceDataStoreOperations serviceDataStoreOperations) {
-        this.db = databroker;
+    private Registration reg;
+
+    @Activate
+    public ServicehandlerImpl(@Reference RpcProviderService rpcProviderService,
+            @Reference ServiceDataStoreOperations serviceDataStoreOperations,
+            @Reference PceListener pceListenerImpl,
+            @Reference RendererListener rendererListenerImpl,
+            @Reference NetworkListener networkModelListenerImpl,
+            @Reference CatalogDataStoreOperations catalogDataStoreOperations,
+            @Reference PathComputationService pathComputationService,
+            @Reference RendererServiceOperations rendererServiceOperations,
+            @Reference NotificationPublishService notificationPublishService) {
         this.serviceDataStoreOperations = serviceDataStoreOperations;
-        this.pceServiceWrapper = new PCEServiceWrapper(pathComputationService, notificationPublishService);
-        this.rendererServiceWrapper = new RendererServiceWrapper(rendererServiceOperations, notificationPublishService);
         this.pceListenerImpl = pceListenerImpl;
         this.rendererListenerImpl = rendererListenerImpl;
         this.networkModelListenerImpl = networkModelListenerImpl;
+        this.catalogDataStoreOperations = catalogDataStoreOperations;
         this.notificationPublishService =  notificationPublishService;
+        this.pceServiceWrapper = new PCEServiceWrapper(pathComputationService, notificationPublishService);
+        this.rendererServiceWrapper = new RendererServiceWrapper(rendererServiceOperations, notificationPublishService);
+        this.reg = rpcProviderService.registerRpcImplementations(registerRPCs());
+        LOG.info("ServicehandlerImpl Initiated");
+    }
+
+    @Deactivate
+    public void close() {
+        this.reg.close();
+        LOG.info("ServicehandlerImpl Closed");
+    }
+
+    public Registration getRegisteredRpc() {
+        return reg;
+    }
+
+    private ImmutableClassToInstanceMap<Rpc<?, ?>> registerRPCs() {
+        return ImmutableClassToInstanceMap.<Rpc<?, ?>>builder()
+            .put(ServiceCreate.class, new ServiceCreateImpl(serviceDataStoreOperations, pceListenerImpl,
+                    rendererListenerImpl, networkModelListenerImpl, pceServiceWrapper, notificationPublishService))
+            .put(ServiceDelete.class, new ServiceDeleteImpl(serviceDataStoreOperations, pceListenerImpl,
+                    rendererListenerImpl, networkModelListenerImpl, rendererServiceWrapper, notificationPublishService))
+            .put(ServiceFeasibilityCheck.class, new ServiceFeasibilityCheckImpl(serviceDataStoreOperations,
+                    pceListenerImpl, rendererListenerImpl, networkModelListenerImpl, pceServiceWrapper))
+            .put(ServiceReconfigure.class, new ServiceReconfigureImpl(serviceDataStoreOperations, pceListenerImpl,
+                    rendererListenerImpl, networkModelListenerImpl, rendererServiceWrapper))
+            .put(ServiceRestoration.class, new ServiceRestorationImpl(serviceDataStoreOperations, pceListenerImpl,
+                    rendererListenerImpl, networkModelListenerImpl, rendererServiceWrapper))
+            .put(ServiceReroute.class, new ServiceRerouteImpl(serviceDataStoreOperations, pceServiceWrapper))
+            .put(TempServiceCreate.class, new TempServiceCreateImpl(serviceDataStoreOperations, pceListenerImpl,
+                    rendererListenerImpl, networkModelListenerImpl, pceServiceWrapper))
+            .put(TempServiceDelete.class, new TempServiceDeleteImpl(serviceDataStoreOperations, pceListenerImpl,
+                    rendererListenerImpl, rendererServiceWrapper))
+            .put(AddOpenroadmOperationalModesToCatalog.class,
+                    new AddOpenroadmOperationalModesToCatalogImpl(catalogDataStoreOperations))
+            .put(AddSpecificOperationalModesToCatalog.class,
+                    new AddSpecificOperationalModesToCatalogImpl(catalogDataStoreOperations))
+            .build();
     }
 
-
     // This is class is public so that these messages can be accessed from Junit (avoid duplications).
     public static final class LogMessages {
 
@@ -165,6 +122,8 @@ public class ServicehandlerImpl implements OrgOpenroadmServiceService {
         public static final String SERVICE_NON_COMPLIANT;
         public static final String RENDERER_DELETE_FAILED;
         public static final String ABORT_VALID_FAILED;
+        public static final String ABORT_OR_TO_CATALOG_FAILED;
+        public static final String ABORT_SPECIFIC_TO_CATALOG_FAILED;
 
         // Static blocks are generated once and spare memory.
         static {
@@ -175,12 +134,22 @@ public class ServicehandlerImpl implements OrgOpenroadmServiceService {
             SERVICE_NON_COMPLIANT = "non-compliant service";
             RENDERER_DELETE_FAILED = "Renderer service delete failed";
             ABORT_VALID_FAILED = "Aborting: validation of service create request failed";
+            ABORT_OR_TO_CATALOG_FAILED = "Aborting: validation of add OR to catalog request failed";
+            ABORT_SPECIFIC_TO_CATALOG_FAILED = "Aborting: validation of add Specific to catalog request failed";
+        }
+
+        public static String serviceInDS(String serviceName) {
+            return "Service '" + serviceName + "' already exists in datastore";
         }
 
         public static String serviceNotInDS(String serviceName) {
             return "Service '" + serviceName + "' does not exist in datastore";
         }
 
+        public static String servicePathNotInDS(String serviceName) {
+            return "Service Path from '" + serviceName + "' does not exist in datastore";
+        }
+
         public static String serviceInService(String serviceName) {
             return "Service '" + serviceName + "' is in 'inService' state";
         }
@@ -188,592 +157,5 @@ public class ServicehandlerImpl implements OrgOpenroadmServiceService {
         private LogMessages() {
         }
     }
-
-    @Override
-    public ListenableFuture<RpcResult<ServiceCreateOutput>> serviceCreate(ServiceCreateInput input) {
-        LOG.info("RPC serviceCreate received");
-        // Validation
-        OperationResult validationResult = ServiceCreateValidation.validateServiceCreateRequest(
-                new ServiceInput(input), RpcActions.ServiceCreate);
-        if (! validationResult.isSuccess()) {
-            LOG.warn(SERVICE_CREATE_MSG, LogMessages.ABORT_VALID_FAILED);
-            return ModelMappingUtils.createCreateServiceReply(
-                    input, ResponseCodes.FINAL_ACK_YES,
-                    validationResult.getResultMessage(), ResponseCodes.RESPONSE_FAILED);
-        }
-        this.pceListenerImpl.setInput(new ServiceInput(input));
-        this.pceListenerImpl.setServiceReconfigure(false);
-        this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
-        this.rendererListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
-        this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
-        this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
-        LOG.debug(SERVICE_CREATE_MSG, LogMessages.PCE_CALLING);
-        PathComputationRequestOutput output = this.pceServiceWrapper.performPCE(input, true);
-        if (output == null) {
-            LOG.warn(SERVICE_CREATE_MSG, LogMessages.ABORT_PCE_FAILED);
-            sendNbiNotification(new PublishNotificationProcessServiceBuilder()
-                    .setServiceName(input.getServiceName())
-                    .setServiceAEnd(new ServiceAEndBuilder(input.getServiceAEnd()).build())
-                    .setServiceZEnd(new ServiceZEndBuilder(input.getServiceZEnd()).build())
-                    .setCommonId(input.getCommonId())
-                    .setConnectionType(input.getConnectionType())
-                    .setResponseFailed(LogMessages.ABORT_PCE_FAILED)
-                    .setMessage("ServiceCreate request failed ...")
-                    .setOperationalState(State.Degraded)
-                    .setPublisherName(PUBLISHER)
-                    .build());
-            return ModelMappingUtils.createCreateServiceReply(input, ResponseCodes.FINAL_ACK_YES,
-                    LogMessages.PCE_FAILED, ResponseCodes.RESPONSE_FAILED);
-        }
-        LOG.info("RPC serviceCreate in progress...");
-        ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
-        return ModelMappingUtils.createCreateServiceReply(
-                input, common.getAckFinalIndicator(),
-                common.getResponseMessage(), common.getResponseCode());
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<ServiceDeleteOutput>> serviceDelete(ServiceDeleteInput input) {
-        String serviceName = input.getServiceDeleteReqInfo().getServiceName();
-        LOG.info("RPC serviceDelete request received for {}", serviceName);
-
-        /*
-         * Upon receipt of service-deleteService RPC, service header and sdnc-request
-         * header compliance are verified.
-         */
-        ComplianceCheckResult serviceHandlerCheckResult =
-            ServicehandlerComplianceCheck.check(
-                input.getServiceDeleteReqInfo().getServiceName(),
-                input.getSdncRequestHeader(), null, RpcActions.ServiceDelete, false, true);
-        if (!serviceHandlerCheckResult.hasPassed()) {
-            LOG.warn(SERVICE_DELETE_MSG, LogMessages.ABORT_SERVICE_NON_COMPLIANT);
-            return ModelMappingUtils.createDeleteServiceReply(
-                    input, ResponseCodes.FINAL_ACK_YES,
-                    LogMessages.SERVICE_NON_COMPLIANT, ResponseCodes.RESPONSE_FAILED);
-        }
-
-        //Check presence of service to be deleted
-        Optional<Services> serviceOpt = this.serviceDataStoreOperations.getService(serviceName);
-        Services service;
-        if (serviceOpt.isEmpty()) {
-            LOG.warn(SERVICE_DELETE_MSG, LogMessages.serviceNotInDS(serviceName));
-            return ModelMappingUtils.createDeleteServiceReply(
-                    input, ResponseCodes.FINAL_ACK_YES,
-                    LogMessages.serviceNotInDS(serviceName), ResponseCodes.RESPONSE_FAILED);
-        }
-        service = serviceOpt.get();
-        LOG.debug("serviceDelete: Service '{}' found in datastore", serviceName);
-        this.pceListenerImpl.setInput(new ServiceInput(input));
-        this.pceListenerImpl.setServiceReconfigure(false);
-        this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
-        this.rendererListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
-        this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
-        this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
-        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInput
-                serviceDeleteInput = ModelMappingUtils.createServiceDeleteInput(new ServiceInput(input));
-        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteOutput output =
-            this.rendererServiceWrapper.performRenderer(
-                serviceDeleteInput, ServiceNotificationTypes.ServiceDeleteResult, service);
-
-        if (output == null) {
-            LOG.error(SERVICE_DELETE_MSG, LogMessages.RENDERER_DELETE_FAILED);
-            sendNbiNotification(new PublishNotificationProcessServiceBuilder()
-                    .setServiceName(service.getServiceName())
-                    .setServiceAEnd(new ServiceAEndBuilder(service.getServiceAEnd()).build())
-                    .setServiceZEnd(new ServiceZEndBuilder(service.getServiceZEnd()).build())
-                    .setCommonId(service.getCommonId())
-                    .setConnectionType(service.getConnectionType())
-                    .setMessage("ServiceDelete request failed ...")
-                    .setOperationalState(State.InService)
-                    .setResponseFailed(LogMessages.RENDERER_DELETE_FAILED)
-                    .setPublisherName(PUBLISHER)
-                    .build());
-            return ModelMappingUtils.createDeleteServiceReply(
-                    input, ResponseCodes.FINAL_ACK_YES,
-                    LogMessages.RENDERER_DELETE_FAILED, ResponseCodes.RESPONSE_FAILED);
-        }
-
-        LOG.debug("RPC serviceDelete in progress...");
-        ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
-        return ModelMappingUtils.createDeleteServiceReply(
-                input, common.getAckFinalIndicator(),
-                common.getResponseMessage(), common.getResponseCode());
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<ServiceFeasibilityCheckOutput>> serviceFeasibilityCheck(
-            ServiceFeasibilityCheckInput input) {
-        LOG.info("RPC serviceFeasibilityCheck received");
-        // Validation
-        ServiceInput serviceInput = new ServiceInput(input);
-        OperationResult validationResult = ServiceCreateValidation.validateServiceCreateRequest(serviceInput,
-                RpcActions.ServiceFeasibilityCheck);
-        if (! validationResult.isSuccess()) {
-            LOG.warn(SERVICE_FEASIBILITY_CHECK_MSG, LogMessages.ABORT_VALID_FAILED);
-            return ModelMappingUtils.createCreateServiceReply(
-                    input, ResponseCodes.FINAL_ACK_YES,
-                    validationResult.getResultMessage(), ResponseCodes.RESPONSE_FAILED);
-        }
-        this.pceListenerImpl.setInput(new ServiceInput(input));
-        this.pceListenerImpl.setServiceReconfigure(false);
-        this.pceListenerImpl.setServiceFeasiblity(true);
-        this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
-        this.rendererListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
-        this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
-        this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
-        LOG.debug(SERVICE_FEASIBILITY_CHECK_MSG, LogMessages.PCE_CALLING);
-        PathComputationRequestOutput output = this.pceServiceWrapper.performPCE(input, true);
-        if (output == null) {
-            LOG.warn(SERVICE_FEASIBILITY_CHECK_MSG, LogMessages.ABORT_PCE_FAILED);
-            return ModelMappingUtils.createCreateServiceReply(input, ResponseCodes.FINAL_ACK_YES,
-                    LogMessages.PCE_FAILED, ResponseCodes.RESPONSE_FAILED);
-        }
-        LOG.info("RPC serviceFeasibilityCheck in progress...");
-        ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
-        return ModelMappingUtils.createCreateServiceReply(
-                input, common.getAckFinalIndicator(),
-                common.getResponseMessage(), common.getResponseCode());
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<ServiceReconfigureOutput>> serviceReconfigure(ServiceReconfigureInput input) {
-        String serviceName = input.getServiceName();
-        LOG.info("RPC serviceReconfigure received for {}", serviceName);
-        Optional<Services> servicesObject = this.serviceDataStoreOperations.getService(serviceName);
-        if (servicesObject.isEmpty()) {
-            LOG.warn(SERVICE_RECONFIGURE_MSG, LogMessages.serviceNotInDS(serviceName));
-            return ModelMappingUtils.createCreateServiceReply(
-                input,
-                LogMessages.serviceNotInDS(serviceName));
-        }
-        LOG.debug("Service '{}' found in datastore", serviceName);
-        OperationResult validationResult = ServiceCreateValidation
-                .validateServiceCreateRequest(new ServiceInput(input), RpcActions.ServiceReconfigure);
-        if (!validationResult.isSuccess()) {
-            LOG.warn(SERVICE_RECONFIGURE_MSG, LogMessages.ABORT_VALID_FAILED);
-            return ModelMappingUtils.createCreateServiceReply(
-                    input,
-                    validationResult.getResultMessage());
-        }
-        this.pceListenerImpl.setInput(new ServiceInput(input));
-        this.pceListenerImpl.setServiceReconfigure(true);
-        this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
-        this.rendererListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
-        this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
-        this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
-        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
-                .ServiceDeleteInput serviceDeleteInput =
-                        ModelMappingUtils.createServiceDeleteInput(new ServiceInput(input));
-        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
-                .ServiceDeleteOutput output = this.rendererServiceWrapper.performRenderer(serviceDeleteInput,
-                        ServiceNotificationTypes.ServiceDeleteResult, null);
-        if (output == null) {
-            LOG.error(SERVICE_RECONFIGURE_MSG, LogMessages.RENDERER_DELETE_FAILED);
-            return ModelMappingUtils.createCreateServiceReply(
-                    input,
-                    LogMessages.RENDERER_DELETE_FAILED);
-                    //TODO check if RpcStatus.Successful is really expected here
-        }
-        LOG.info("RPC serviceReconfigure in progress...");
-        ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
-        return ModelMappingUtils.createCreateServiceReply(
-                input,
-                common.getResponseMessage());
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<ServiceRestorationOutput>> serviceRestoration(ServiceRestorationInput input) {
-        String serviceName = input.getServiceName();
-        LOG.info("RPC serviceRestoration received for {}", serviceName);
-        Optional<Services> servicesObject = this.serviceDataStoreOperations.getService(serviceName);
-
-        if (!servicesObject.isPresent()) {
-            LOG.warn(SERVICE_RESTORATION_MSG, LogMessages.serviceNotInDS(serviceName));
-            return ModelMappingUtils.createRestoreServiceReply(
-                    LogMessages.serviceNotInDS(serviceName));
-        }
-
-        Services service = servicesObject.get();
-        State state = service.getOperationalState();
-
-        if (state == State.InService) {
-            LOG.error(SERVICE_RESTORATION_MSG, LogMessages.serviceInService(serviceName));
-            return ModelMappingUtils.createRestoreServiceReply(
-                    LogMessages.serviceInService(serviceName));
-        }
-
-        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx");
-        OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneOffset.UTC);
-        DateAndTime datetime = new DateAndTime(dtf.format(offsetDateTime));
-        SdncRequestHeaderBuilder sdncBuilder = new SdncRequestHeaderBuilder()
-                .setNotificationUrl(service.getSdncRequestHeader().getNotificationUrl())
-                .setRequestId(service.getSdncRequestHeader().getRequestId())
-                .setRequestSystemId(service.getSdncRequestHeader().getRequestSystemId())
-                .setRpcAction(RpcActions.ServiceDelete);
-        ServiceDeleteInputBuilder deleteInputBldr = new ServiceDeleteInputBuilder()
-                .setServiceDeleteReqInfo(new ServiceDeleteReqInfoBuilder()
-                    .setServiceName(serviceName)
-                    .setDueDate(datetime)
-                    .setTailRetention(TailRetention.No).build())
-                .setSdncRequestHeader(sdncBuilder.build());
-        ServiceInput serviceInput = new ServiceInput(deleteInputBldr.build());
-        serviceInput.setServiceAEnd(service.getServiceAEnd());
-        serviceInput.setServiceZEnd(service.getServiceZEnd());
-        serviceInput.setConnectionType(service.getConnectionType());
-        HardConstraints hardConstraints = service.getHardConstraints();
-        if (hardConstraints == null) {
-            LOG.warn("service '{}' HardConstraints is not set !", serviceName);
-        } else {
-            SoftConstraints softConstraints = service.getSoftConstraints();
-            if (softConstraints == null) {
-                LOG.warn("service '{}' SoftConstraints is not set !", serviceName);
-                serviceInput.setSoftConstraints(DowngradeConstraints.convertToSoftConstraints(hardConstraints));
-            } else {
-                LOG.info("converting hard constraints to soft constraints ...");
-                serviceInput.setSoftConstraints(
-                        DowngradeConstraints.updateSoftConstraints(hardConstraints, softConstraints));
-            }
-            serviceInput.setHardConstraints(DowngradeConstraints.downgradeHardConstraints(hardConstraints));
-        }
-        this.pceListenerImpl.setInput(serviceInput);
-        this.pceListenerImpl.setServiceReconfigure(true);
-        this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
-        this.rendererListenerImpl.setServiceInput(serviceInput);
-        this.rendererListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
-        this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
-        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
-            .ServiceDeleteInput serviceDeleteInput = ModelMappingUtils.createServiceDeleteInput(
-                    new ServiceInput(deleteInputBldr.build()));
-        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
-            .ServiceDeleteOutput output = this.rendererServiceWrapper.performRenderer(serviceDeleteInput,
-                ServiceNotificationTypes.ServiceDeleteResult, null);
-        if (output == null) {
-            LOG.error(SERVICE_RESTORATION_MSG, LogMessages.RENDERER_DELETE_FAILED);
-            return ModelMappingUtils.createRestoreServiceReply(LogMessages.RENDERER_DELETE_FAILED);
-        }
-        LOG.info("RPC serviceRestore in progress...");
-        ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
-        return ModelMappingUtils.createRestoreServiceReply(common.getResponseMessage());
-
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<EquipmentNotificationOutput>>
-            equipmentNotification(EquipmentNotificationInput input) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<ServiceRerouteConfirmOutput>>
-            serviceRerouteConfirm(ServiceRerouteConfirmInput input) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<ServiceRerouteOutput>> serviceReroute(ServiceRerouteInput input) {
-        String serviceName = input.getServiceName();
-        LOG.info("RPC serviceReroute received for {}", serviceName);
-        Optional<Services> servicesObject = this.serviceDataStoreOperations.getService(serviceName);
-        if (servicesObject.isEmpty()) {
-            LOG.warn("serviceReroute: {}", LogMessages.serviceNotInDS(serviceName));
-            return ModelMappingUtils.createRerouteServiceReply(
-                    input, ResponseCodes.FINAL_ACK_NO,
-                    LogMessages.serviceNotInDS(serviceName));
-        }
-        Services service = servicesObject.get();
-        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx");
-        OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneOffset.UTC);
-        DateAndTime datetime = new DateAndTime(dtf.format(offsetDateTime));
-        SdncRequestHeaderBuilder sdncBuilder = new SdncRequestHeaderBuilder()
-                .setNotificationUrl(service.getSdncRequestHeader().getNotificationUrl())
-                .setRequestId(service.getSdncRequestHeader().getRequestId())
-                .setRequestSystemId(service.getSdncRequestHeader().getRequestSystemId())
-                .setRpcAction(RpcActions.ServiceDelete);
-        ServiceDeleteInputBuilder deleteInputBldr = new ServiceDeleteInputBuilder()
-                .setServiceDeleteReqInfo(new ServiceDeleteReqInfoBuilder()
-                    .setServiceName(serviceName).setDueDate(datetime)
-                    .setTailRetention(TailRetention.No).build())
-                .setSdncRequestHeader(sdncBuilder.build());
-        ServiceInput serviceInput = new ServiceInput(deleteInputBldr.build());
-        serviceInput.setServiceAEnd(service.getServiceAEnd());
-        serviceInput.setServiceZEnd(service.getServiceZEnd());
-        serviceInput.setConnectionType(service.getConnectionType());
-        this.pceListenerImpl.setInput(serviceInput);
-        this.pceListenerImpl.setServiceReconfigure(true);
-        this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
-        this.rendererListenerImpl.setServiceInput(serviceInput);
-        this.rendererListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
-        this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
-        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
-            .ServiceDeleteInput serviceDeleteInput = ModelMappingUtils.createServiceDeleteInput(
-                    new ServiceInput(deleteInputBldr.build()));
-        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
-            .ServiceDeleteOutput output = this.rendererServiceWrapper.performRenderer(serviceDeleteInput,
-                ServiceNotificationTypes.ServiceDeleteResult, null);
-        if (output == null) {
-            LOG.error("serviceReroute: {}", LogMessages.RENDERER_DELETE_FAILED);
-            return ModelMappingUtils.createRerouteServiceReply(
-                    input, ResponseCodes.FINAL_ACK_YES,
-                    LogMessages.RENDERER_DELETE_FAILED);
-        }
-        LOG.info("RPC ServiceReroute in progress...");
-        ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
-        return ModelMappingUtils.createRerouteServiceReply(
-                input, common.getAckFinalIndicator(),
-                common.getResponseMessage());
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<ServiceReversionOutput>> serviceReversion(ServiceReversionInput input) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<ServiceRollOutput>> serviceRoll(ServiceRollInput input) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<NetworkReOptimizationOutput>>
-            networkReOptimization(NetworkReOptimizationInput input) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<TempServiceDeleteOutput>> tempServiceDelete(TempServiceDeleteInput input) {
-        String commonId = input.getCommonId();
-        LOG.info("RPC temp serviceDelete request received for {}", commonId);
-
-        /*
-         * Upon receipt of service-deleteService RPC, service header and sdnc-request
-         * header compliance are verified.
-         */
-        LOG.debug("checking Service Compliance ...");
-        ComplianceCheckResult serviceHandlerCheckResult = ServicehandlerComplianceCheck.check(
-                commonId, null, null, RpcActions.ServiceDelete, false, false
-            );
-        if (!serviceHandlerCheckResult.hasPassed()) {
-            LOG.warn(TEMP_SERVICE_DELETE_MSG, LogMessages.ABORT_SERVICE_NON_COMPLIANT);
-            return ModelMappingUtils.createDeleteServiceReply(
-                    input, ResponseCodes.FINAL_ACK_YES,
-                    LogMessages.SERVICE_NON_COMPLIANT, ResponseCodes.RESPONSE_FAILED);
-        }
-
-        //Check presence of service to be deleted
-        LOG.debug("service common-id '{}' is compliant", commonId);
-        Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list.Services>
-                service =
-            this.serviceDataStoreOperations.getTempService(commonId);
-        if (service.isEmpty()) {
-            LOG.error(TEMP_SERVICE_DELETE_MSG, LogMessages.serviceNotInDS(commonId));
-            return ModelMappingUtils.createDeleteServiceReply(
-                    input, ResponseCodes.FINAL_ACK_YES,
-                    LogMessages.serviceNotInDS(commonId), ResponseCodes.RESPONSE_FAILED);
-        }
-
-        LOG.info("Service '{}' present in datastore !", commonId);
-        this.pceListenerImpl.setInput(new ServiceInput(input));
-        this.pceListenerImpl.setServiceReconfigure(false);
-        this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
-        this.rendererListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
-        this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
-        this.rendererListenerImpl.setTempService(true);
-        this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
-        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteOutput output =
-                this.rendererServiceWrapper.performRenderer(input, ServiceNotificationTypes.ServiceDeleteResult);
-        if (output == null) {
-            LOG.error(TEMP_SERVICE_DELETE_MSG, LogMessages.RENDERER_DELETE_FAILED);
-            return ModelMappingUtils.createDeleteServiceReply(
-                    input, ResponseCodes.FINAL_ACK_YES,
-                    LogMessages.RENDERER_DELETE_FAILED, ResponseCodes.RESPONSE_FAILED);
-        }
-        LOG.info("RPC tempServiceDelete in progress...");
-        ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
-        return ModelMappingUtils.createDeleteServiceReply(
-                input, common.getAckFinalIndicator(),
-                common.getResponseMessage(), common.getResponseCode());
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<TempServiceCreateOutput>> tempServiceCreate(TempServiceCreateInput input) {
-        LOG.info("RPC tempServiceCreate received");
-        // Validation
-        OperationResult validationResult = ServiceCreateValidation.validateServiceCreateRequest(
-                new ServiceInput(input), RpcActions.TempServiceCreate);
-        if (! validationResult.isSuccess()) {
-            LOG.warn(TEMP_SERVICE_CREATE_MSG, LogMessages.ABORT_VALID_FAILED);
-            return ModelMappingUtils.createCreateServiceReply(
-                    input, ResponseCodes.FINAL_ACK_YES,
-                    validationResult.getResultMessage(), ResponseCodes.RESPONSE_FAILED);
-        }
-
-        // Starting service create operation
-        LOG.debug(TEMP_SERVICE_CREATE_MSG, LogMessages.PCE_CALLING);
-        this.pceListenerImpl.setInput(new ServiceInput(input));
-        this.pceListenerImpl.setServiceReconfigure(false);
-        this.pceListenerImpl.setserviceDataStoreOperations(this.serviceDataStoreOperations);
-        this.pceListenerImpl.setTempService(true);
-        this.rendererListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
-        this.rendererListenerImpl.setServiceInput(new ServiceInput(input));
-        this.rendererListenerImpl.setTempService(true);
-        this.networkModelListenerImpl.setserviceDataStoreOperations(serviceDataStoreOperations);
-        PathComputationRequestOutput output = this.pceServiceWrapper.performPCE(input, true);
-        if (output == null) {
-            LOG.warn(TEMP_SERVICE_CREATE_MSG, LogMessages.ABORT_PCE_FAILED);
-            return ModelMappingUtils.createCreateServiceReply(
-                    input, ResponseCodes.FINAL_ACK_YES,
-                    LogMessages.PCE_FAILED, ResponseCodes.RESPONSE_FAILED);
-        }
-        LOG.info("RPC tempServiceCreate in progress...");
-        ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
-        return ModelMappingUtils.createCreateServiceReply(
-                input, common.getAckFinalIndicator(),
-                common.getResponseMessage(), common.getResponseCode());
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<
-        ServiceDeleteComplexResultNotificationRequestOutput>> serviceDeleteComplexResultNotificationRequest(
-            ServiceDeleteComplexResultNotificationRequestInput input) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<
-        ServiceCreateResultNotificationRequestOutput>> serviceCreateResultNotificationRequest(
-            ServiceCreateResultNotificationRequestInput input) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<
-        ServiceDeleteResultNotificationRequestOutput>> serviceDeleteResultNotificationRequest(
-            ServiceDeleteResultNotificationRequestInput input) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<
-        ServiceCreateComplexResultNotificationRequestOutput>> serviceCreateComplexResultNotificationRequest(
-            ServiceCreateComplexResultNotificationRequestInput input) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<ServiceFeasibilityCheckBulkOutput>> serviceFeasibilityCheckBulk(
-        ServiceFeasibilityCheckBulkInput input) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    /**
-     * Send notification to NBI notification in order to publish message.
-     * @param service PublishNotificationService
-     */
-    private void sendNbiNotification(PublishNotificationProcessService service) {
-        try {
-            notificationPublishService.putNotification(service);
-        } catch (InterruptedException e) {
-            LOG.warn("Cannot send notification to nbi", e);
-            Thread.currentThread().interrupt();
-        }
-    }
-
-
-    @Override
-    public ListenableFuture<RpcResult<ServiceCreateBulkOutput>> serviceCreateBulk(ServiceCreateBulkInput input) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<TempServiceCreateBulkOutput>> tempServiceCreateBulk(
-        TempServiceCreateBulkInput input) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<ServiceRollResultNotificationRequestOutput>> serviceRollResultNotificationRequest(
-        ServiceRollResultNotificationRequestInput input) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<ServiceReconfigureBulkOutput>> serviceReconfigureBulk(
-        ServiceReconfigureBulkInput input) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<ServiceReconfigureResultNotificationRequestOutput>>
-            serviceReconfigureResultNotificationRequest(ServiceReconfigureResultNotificationRequestInput input) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<ServiceRestorationResultNotificationRequestOutput>>
-            serviceRestorationResultNotificationRequest(ServiceRestorationResultNotificationRequestInput input) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<ServiceReversionResultNotificationRequestOutput>>
-            serviceReversionResultNotificationRequest(ServiceReversionResultNotificationRequestInput input) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<ServiceRerouteConfirmResultNotificationRequestOutput>>
-            serviceRerouteConfirmResultNotificationRequest(ServiceRerouteConfirmResultNotificationRequestInput input) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<OpticalTunnelCreateOutput>> opticalTunnelCreate(OpticalTunnelCreateInput input) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<OpticalTunnelRequestCancelOutput>> opticalTunnelRequestCancel(
-            OpticalTunnelRequestCancelInput input) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<AddOpenroadmOperationalModesToCatalogOutput>>
-            addOpenroadmOperationalModesToCatalog(AddOpenroadmOperationalModesToCatalogInput input) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<AddSpecificOperationalModesToCatalogOutput>> addSpecificOperationalModesToCatalog(
-            AddSpecificOperationalModesToCatalogInput input) {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<ServiceSrlgGetOutput>> serviceSrlgGet(ServiceSrlgGetInput input) {
-        // TODO Auto-generated method stub
-        return null;
-    }
 }
+
diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerProvider.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerProvider.java
deleted file mode 100644 (file)
index 586ce25..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright © 2017 Orange, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.transportpce.servicehandler.impl;
-
-import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
-import org.opendaylight.mdsal.binding.api.NotificationService;
-import org.opendaylight.mdsal.binding.api.RpcProviderService;
-import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
-import org.opendaylight.transportpce.servicehandler.listeners.NetworkModelListenerImpl;
-import org.opendaylight.transportpce.servicehandler.listeners.PceListenerImpl;
-import org.opendaylight.transportpce.servicehandler.listeners.RendererListenerImpl;
-import org.opendaylight.transportpce.servicehandler.listeners.ServiceListener;
-import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.TransportpceNetworkmodelListener;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.TransportpcePceListener;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.TransportpceRendererListener;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OrgOpenroadmServiceService;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceList;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.concepts.ObjectRegistration;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Class to register
- * Servicehandler Service and Notification.
- * @author Martial Coulibaly ( martial.coulibaly@gfi.com ) on behalf of Orange
- *
- */
-public class ServicehandlerProvider {
-
-    private static final Logger LOG = LoggerFactory.getLogger(ServicehandlerProvider.class);
-    private static final InstanceIdentifier<Services> SERVICE = InstanceIdentifier.builder(ServiceList.class)
-            .child(Services.class).build();
-
-    private final DataBroker dataBroker;
-    private final RpcProviderService rpcService;
-    private final NotificationService notificationService;
-    private ListenerRegistration<TransportpcePceListener> pcelistenerRegistration;
-    private ListenerRegistration<ServiceListener> serviceDataTreeChangeListenerRegistration;
-    private ListenerRegistration<TransportpceRendererListener> rendererlistenerRegistration;
-    private ListenerRegistration<TransportpceNetworkmodelListener> networkmodellistenerRegistration;
-    private ObjectRegistration<OrgOpenroadmServiceService> rpcRegistration;
-    private ServiceDataStoreOperations serviceDataStoreOperations;
-    private PceListenerImpl pceListenerImpl;
-    private ServiceListener serviceListener;
-    private RendererListenerImpl rendererListenerImpl;
-    private NetworkModelListenerImpl networkModelListenerImpl;
-    private ServicehandlerImpl servicehandler;
-
-    public ServicehandlerProvider(final DataBroker dataBroker, RpcProviderService rpcProviderService,
-            NotificationService notificationService, ServiceDataStoreOperations serviceDataStoreOperations,
-            PceListenerImpl pceListenerImpl, ServiceListener serviceListener, RendererListenerImpl rendererListenerImpl,
-            NetworkModelListenerImpl networkModelListenerImpl, ServicehandlerImpl servicehandler) {
-        this.dataBroker = dataBroker;
-        this.rpcService = rpcProviderService;
-        this.notificationService = notificationService;
-        this.serviceDataStoreOperations = serviceDataStoreOperations;
-        this.serviceDataStoreOperations.initialize();
-        this.pceListenerImpl = pceListenerImpl;
-        this.serviceListener = serviceListener;
-        this.rendererListenerImpl = rendererListenerImpl;
-        this.networkModelListenerImpl = networkModelListenerImpl;
-        this.servicehandler = servicehandler;
-    }
-
-    /**
-     * Method called when the blueprint container is created.
-     */
-    public void init() {
-        LOG.info("ServicehandlerProvider Session Initiated");
-        pcelistenerRegistration = notificationService.registerNotificationListener(pceListenerImpl);
-        serviceDataTreeChangeListenerRegistration = dataBroker.registerDataTreeChangeListener(
-                DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, SERVICE), serviceListener);
-        rendererlistenerRegistration = notificationService.registerNotificationListener(rendererListenerImpl);
-        networkmodellistenerRegistration = notificationService.registerNotificationListener(networkModelListenerImpl);
-        rpcRegistration = rpcService.registerRpcImplementation(OrgOpenroadmServiceService.class, servicehandler);
-    }
-
-    /**
-     * Method called when the blueprint container is destroyed.
-     */
-    public void close() {
-        LOG.info("ServicehandlerProvider Closed");
-        pcelistenerRegistration.close();
-        serviceDataTreeChangeListenerRegistration.close();
-        rendererlistenerRegistration.close();
-        networkmodellistenerRegistration.close();
-        rpcRegistration.close();
-    }
-
-}
diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/TempServiceCreateImpl.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/TempServiceCreateImpl.java
new file mode 100644 (file)
index 0000000..cb49499
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.servicehandler.impl;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.transportpce.common.OperationResult;
+import org.opendaylight.transportpce.common.ResponseCodes;
+import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
+import org.opendaylight.transportpce.servicehandler.ServiceInput;
+import org.opendaylight.transportpce.servicehandler.impl.ServicehandlerImpl.LogMessages;
+import org.opendaylight.transportpce.servicehandler.listeners.NetworkListener;
+import org.opendaylight.transportpce.servicehandler.listeners.PceListener;
+import org.opendaylight.transportpce.servicehandler.listeners.RendererListener;
+import org.opendaylight.transportpce.servicehandler.service.PCEServiceWrapper;
+import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
+import org.opendaylight.transportpce.servicehandler.validation.ServiceCreateValidation;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommon;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreate;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateOutput;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class TempServiceCreateImpl implements TempServiceCreate {
+    private static final Logger LOG = LoggerFactory.getLogger(TempServiceCreateImpl.class);
+    private static final String TEMP_SERVICE_CREATE_MSG = "tempServiceCreate: {}";
+
+    private ServiceDataStoreOperations serviceDataStoreOperations;
+    private PceListener pceListener;
+    private RendererListener rendererListener;
+    private NetworkListener networkListener;
+    private PCEServiceWrapper pceServiceWrapper;
+
+    public TempServiceCreateImpl(final ServiceDataStoreOperations serviceDataStoreOperations,
+            final PceListener pceListener, RendererListener rendererListener, NetworkListener networkListener,
+            PCEServiceWrapper pceServiceWrapper) {
+        this.serviceDataStoreOperations = serviceDataStoreOperations;
+        this.pceListener = pceListener;
+        this.rendererListener = rendererListener;
+        this.networkListener = networkListener;
+        this.pceServiceWrapper = pceServiceWrapper;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<TempServiceCreateOutput>> invoke(TempServiceCreateInput input) {
+        LOG.info("RPC tempServiceCreate received");
+        // Validation
+        OperationResult validationResult = ServiceCreateValidation.validateServiceCreateRequest(
+                new ServiceInput(input), RpcActions.TempServiceCreate);
+        if (!validationResult.isSuccess()) {
+            LOG.warn(TEMP_SERVICE_CREATE_MSG, LogMessages.ABORT_VALID_FAILED);
+            return ModelMappingUtils.createCreateServiceReply(
+                    input, ResponseCodes.FINAL_ACK_YES,
+                    validationResult.getResultMessage(), ResponseCodes.RESPONSE_FAILED);
+        }
+
+        //Check any presence of temp-service with the same commonId
+        String commonId = input.getCommonId();
+        if (this.serviceDataStoreOperations.getTempService(commonId).isPresent()) {
+            LOG.warn(TEMP_SERVICE_CREATE_MSG, LogMessages.serviceInDS("Temp (" + commonId + ")"));
+            return ModelMappingUtils.createCreateServiceReply(input, ResponseCodes.FINAL_ACK_YES,
+                    LogMessages.serviceInDS("Temp (" + commonId + ")"), ResponseCodes.RESPONSE_FAILED);
+        }
+
+        // Starting service create operation
+        LOG.debug(TEMP_SERVICE_CREATE_MSG, LogMessages.PCE_CALLING);
+        this.pceListener.setInput(new ServiceInput(input));
+        this.pceListener.setServiceReconfigure(false);
+        this.pceListener.setserviceDataStoreOperations(this.serviceDataStoreOperations);
+        this.pceListener.setTempService(true);
+        this.rendererListener.setserviceDataStoreOperations(serviceDataStoreOperations);
+        this.rendererListener.setServiceInput(new ServiceInput(input));
+        this.rendererListener.setTempService(true);
+        this.networkListener.setserviceDataStoreOperations(serviceDataStoreOperations);
+        PathComputationRequestOutput output = this.pceServiceWrapper.performPCE(input, true);
+        if (output == null) {
+            LOG.warn(TEMP_SERVICE_CREATE_MSG, LogMessages.ABORT_PCE_FAILED);
+            return ModelMappingUtils.createCreateServiceReply(
+                    input, ResponseCodes.FINAL_ACK_YES,
+                    LogMessages.PCE_FAILED, ResponseCodes.RESPONSE_FAILED);
+        }
+        LOG.info("RPC tempServiceCreate in progress...");
+        ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
+        return ModelMappingUtils.createCreateServiceReply(
+                input, common.getAckFinalIndicator(),
+                common.getResponseMessage(), common.getResponseCode());
+    }
+
+}
diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/TempServiceDeleteImpl.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/impl/TempServiceDeleteImpl.java
new file mode 100644 (file)
index 0000000..9248338
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.servicehandler.impl;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.Optional;
+import org.opendaylight.transportpce.common.ResponseCodes;
+import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
+import org.opendaylight.transportpce.servicehandler.ServiceInput;
+import org.opendaylight.transportpce.servicehandler.impl.ServicehandlerImpl.LogMessages;
+import org.opendaylight.transportpce.servicehandler.listeners.PceListener;
+import org.opendaylight.transportpce.servicehandler.listeners.RendererListener;
+import org.opendaylight.transportpce.servicehandler.service.RendererServiceWrapper;
+import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
+import org.opendaylight.transportpce.servicehandler.validation.checks.ComplianceCheckResult;
+import org.opendaylight.transportpce.servicehandler.validation.checks.ServicehandlerComplianceCheck;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ServiceNotificationTypes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommon;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceDelete;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceDeleteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceDeleteOutput;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class TempServiceDeleteImpl implements TempServiceDelete {
+    private static final Logger LOG = LoggerFactory.getLogger(TempServiceDeleteImpl.class);
+    private static final String TEMP_SERVICE_DELETE_MSG = "tempServiceDelete: {}";
+
+    private ServiceDataStoreOperations serviceDataStoreOperations;
+    private PceListener pceListener;
+    private RendererListener rendererListener;
+    private RendererServiceWrapper rendererServiceWrapper;
+
+    public TempServiceDeleteImpl(final ServiceDataStoreOperations serviceDataStoreOperations,
+            final PceListener pceListener, RendererListener rendererListener,
+            RendererServiceWrapper rendererServiceWrapper) {
+        this.serviceDataStoreOperations = serviceDataStoreOperations;
+        this.pceListener = pceListener;
+        this.rendererListener = rendererListener;
+        this.rendererServiceWrapper = rendererServiceWrapper;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<TempServiceDeleteOutput>> invoke(TempServiceDeleteInput input) {
+        String commonId = input.getCommonId();
+        LOG.info("RPC temp serviceDelete request received for {}", commonId);
+
+        /*
+         * Upon receipt of service-deleteService RPC, service header and sdnc-request
+         * header compliance are verified.
+         */
+        LOG.debug("checking Service Compliance ...");
+        ComplianceCheckResult serviceHandlerCheckResult = ServicehandlerComplianceCheck.check(
+                commonId, null, null, RpcActions.ServiceDelete, false, false
+            );
+        if (!serviceHandlerCheckResult.hasPassed()) {
+            LOG.warn(TEMP_SERVICE_DELETE_MSG, LogMessages.ABORT_SERVICE_NON_COMPLIANT);
+            return ModelMappingUtils.createDeleteServiceReply(
+                    input, ResponseCodes.FINAL_ACK_YES,
+                    LogMessages.SERVICE_NON_COMPLIANT, ResponseCodes.RESPONSE_FAILED);
+        }
+
+        //Check presence of service to be deleted
+        LOG.debug("service common-id '{}' is compliant", commonId);
+        Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.temp.service.list.Services>
+                serviceOpt =
+            this.serviceDataStoreOperations.getTempService(commonId);
+        if (serviceOpt.isEmpty()) {
+            LOG.error(TEMP_SERVICE_DELETE_MSG, LogMessages.serviceNotInDS(commonId));
+            return ModelMappingUtils.createDeleteServiceReply(
+                    input, ResponseCodes.FINAL_ACK_YES,
+                    LogMessages.serviceNotInDS(commonId), ResponseCodes.RESPONSE_FAILED);
+        }
+        LOG.info("Service '{}' present in datastore !", commonId);
+        this.pceListener.setInput(new ServiceInput(input));
+        this.pceListener.setServiceReconfigure(false);
+        this.pceListener.setTempService(true);
+        this.pceListener.setserviceDataStoreOperations(this.serviceDataStoreOperations);
+        this.rendererListener.setserviceDataStoreOperations(this.serviceDataStoreOperations);
+        this.rendererListener.setServiceInput(new ServiceInput(input));
+        this.rendererListener.setTempService(true);
+        this.rendererListener.setserviceDataStoreOperations(serviceDataStoreOperations);
+        org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                .temp.service.list.Services service = serviceOpt.orElseThrow();
+        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteOutput output =
+                this.rendererServiceWrapper.performRenderer(input, ServiceNotificationTypes.ServiceDeleteResult,
+                        service);
+        if (output == null) {
+            LOG.error(TEMP_SERVICE_DELETE_MSG, LogMessages.RENDERER_DELETE_FAILED);
+            return ModelMappingUtils.createDeleteServiceReply(
+                    input, ResponseCodes.FINAL_ACK_YES,
+                    LogMessages.RENDERER_DELETE_FAILED, ResponseCodes.RESPONSE_FAILED);
+        }
+        LOG.info("RPC tempServiceDelete in progress...");
+        ConfigurationResponseCommon common = output.getConfigurationResponseCommon();
+        return ModelMappingUtils.createDeleteServiceReply(
+                input, common.getAckFinalIndicator(),
+                common.getResponseMessage(), common.getResponseCode());
+    }
+
+}
diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/NetworkListener.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/NetworkListener.java
new file mode 100644 (file)
index 0000000..6a839a0
--- /dev/null
@@ -0,0 +1,15 @@
+/*
+ * Copyright © 2023 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.servicehandler.listeners;
+
+import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
+
+public interface NetworkListener {
+
+    void setserviceDataStoreOperations(ServiceDataStoreOperations serviceData);
+}
@@ -12,59 +12,70 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.Set;
 import java.util.stream.Collectors;
 import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.mdsal.binding.api.NotificationService.CompositeListener;
 import org.opendaylight.transportpce.common.OperationResult;
 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.TopologyUpdateResult;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.TransportpceNetworkmodelListener;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.TopologyUpdateResultBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.topology.update.result.TopologyChanges;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.topology.update.result.TopologyChangesKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirection;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirection;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZ;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZKey;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToA;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToABuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToAKey;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.Resource;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.ResourceBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.TerminationPoint;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirection;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirection;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZ;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToA;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToABuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToAKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.Resource;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.ResourceBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.Link;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.TerminationPoint;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.path.PathDescription;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.path.PathDescriptionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.ServicePathList;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePaths;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class NetworkModelListenerImpl implements TransportpceNetworkmodelListener {
+@Component(service = {NetworkModelNotificationHandler.class, NetworkListener.class})
+public class NetworkModelNotificationHandler implements NetworkListener {
 
-    private static final Logger LOG = LoggerFactory.getLogger(NetworkModelListenerImpl.class);
-    private final NotificationPublishService notificationPublishService; // to be used for T-API notification
+    private static final Logger LOG = LoggerFactory.getLogger(NetworkModelNotificationHandler.class);
     private ServiceDataStoreOperations serviceDataStoreOperations;
     private TopologyUpdateResult topologyUpdateResult;
 
-    public NetworkModelListenerImpl(NotificationPublishService notificationPublishService,
-                                    ServiceDataStoreOperations serviceDataStoreOperations) {
-        this.notificationPublishService = notificationPublishService;
+    @Activate
+    public NetworkModelNotificationHandler(@Reference NotificationPublishService notificationPublishService,
+            @Reference ServiceDataStoreOperations serviceDataStoreOperations) {
         this.serviceDataStoreOperations = serviceDataStoreOperations;
     }
 
-    @Override
-    public void onTopologyUpdateResult(TopologyUpdateResult notification) {
-        LOG.debug("Topology update notification: {}", notification.toString());
+    public CompositeListener getCompositeListener() {
+        return new CompositeListener(Set.of(
+            new CompositeListener.Component<>(TopologyUpdateResult.class, this::onTopologyUpdateResult)));
+    }
+
+    void onTopologyUpdateResult(TopologyUpdateResult notification) {
+        LOG.debug("Topology update notification: {}", notification);
         if (compareTopologyUpdateResult(notification)) {
             LOG.warn("TopologyUpdateResult already wired !");
             return;
         }
-        topologyUpdateResult = notification;
+        topologyUpdateResult = new TopologyUpdateResultBuilder()
+                .setTopologyChanges(new HashMap<>(notification.getTopologyChanges()))
+                .build();
         // Update service datastore and service path description
         updateServicePaths(notification);
     }
@@ -73,16 +84,15 @@ public class NetworkModelListenerImpl implements TransportpceNetworkmodelListene
      * Process topology update result.
      * @param notification the result notification.
      */
-    private void updateServicePaths(TopologyUpdateResult notification) {
+    protected void updateServicePaths(TopologyUpdateResult notification) {
         @Nullable
         Map<TopologyChangesKey, TopologyChanges> topologyChanges = notification.getTopologyChanges();
         Optional<ServicePathList> servicePathListOptional = this.serviceDataStoreOperations.getServicePaths();
-        ServicePathList servicePathList = null;
-        if (!servicePathListOptional.isPresent()) {
+        if (servicePathListOptional.isEmpty()) {
             LOG.warn("Enable to retrieve service path list");
             return;
         }
-        servicePathList = servicePathListOptional.get();
+        ServicePathList servicePathList = servicePathListOptional.orElseThrow();
         for (ServicePaths servicePaths : servicePathList.getServicePaths().values()) {
             String serviceName = servicePaths.getServicePathName();
             PathDescription pathDescription = servicePaths.getPathDescription();
@@ -98,60 +108,55 @@ public class NetworkModelListenerImpl implements TransportpceNetworkmodelListene
             // update service in the datastore. Only path description with all elements in service can have a service
             // in service. Therefore we check if all the states of the path description resources are inService
             Optional<Services> serviceOptional = this.serviceDataStoreOperations.getService(serviceName);
-            Services services = null;
-            if (!serviceOptional.isPresent()) {
+            if (serviceOptional.isEmpty()) {
                 LOG.error("Couldn't retrieve service");
                 continue;
             }
-            services = serviceOptional.get();
-            OperationResult operationResult1 = null;
+            Services services = serviceOptional.orElseThrow();
+            State newState;
             switch (services.getOperationalState()) {
                 case InService:
-                    if (!allElementsinPathinService(updatedAtoZ, updatedZtoA)) {
-                        LOG.debug("Service={} needs to be updated to outOfService", serviceName);
-                        //if (operationResult1 != null && operationResult1.isSuccess()) {
-                        //null check probably no more needed
-                        if (this.serviceDataStoreOperations
-                                .modifyService(serviceName, State.OutOfService, AdminStates.OutOfService)
-                                .isSuccess()) {
-                            LOG.info("Service state of {} correctly updated to outOfService in datastore", serviceName);
-                            continue;
-                        } else {
-                            LOG.error("Service state of {} cannot be updated to outOfService in datastore",
-                                serviceName);
-                        }
+                    if (allElementsinPathinService(updatedAtoZ, updatedZtoA)) {
+                        LOG.debug("Service {} state does not need to be modified", serviceName);
+                        continue;
                     }
+                    newState = State.OutOfService;
                     break;
                 case OutOfService:
-                    if (allElementsinPathinService(updatedAtoZ, updatedZtoA)) {
-                        LOG.debug("Service={} needs to be updated to inService", serviceName);
-                        //if (operationResult1 != null && operationResult1.isSuccess()) {
-                        //null check probably no more needed
-                        if (this.serviceDataStoreOperations
-                                .modifyService(serviceName, State.InService, AdminStates.InService)
-                                .isSuccess()) {
-                            LOG.info("Service state of {} correctly updated to inService in datastore", serviceName);
-                            continue;
-                        } else {
-                            LOG.error("Service state of {} cannot be updated to inService in datastore", serviceName);
-                        }
+                    if (!allElementsinPathinService(updatedAtoZ, updatedZtoA)) {
+                        LOG.debug("Service {} state does not need to be modified", serviceName);
+                        continue;
                     }
+                    newState = State.InService;
                     break;
                 default:
                     LOG.warn("Service {} state not managed", serviceName);
                     continue;
             }
-            LOG.debug("Service {} state does not need to be modified", serviceName);
+
+
+            LOG.debug("Service={} needs to be updated to {}", serviceName, newState);
+            //if (operationResult1 != null && operationResult1.isSuccess()) {
+            //null check probably no more needed
+            if (this.serviceDataStoreOperations
+                    .modifyService(serviceName, newState, services.getAdministrativeState())
+                    .isSuccess()) {
+                LOG.info("Service state of {} correctly updated to {} in datastore", serviceName, newState);
+                continue;
+            }
+            LOG.error("Service state of {} cannot be updated to {} in datastore", serviceName, newState);
+
         }
     }
 
-    private Map<ZToAKey, ZToA> changePathElementStateZA(Map<TopologyChangesKey, TopologyChanges> topologyChanges,
+    protected Map<ZToAKey, ZToA> changePathElementStateZA(Map<TopologyChangesKey, TopologyChanges> topologyChanges,
         PathDescription pathDescription) {
-
         Map<ZToAKey, ZToA> newztoaMap = new HashMap<>(pathDescription.getZToADirection().getZToA());
         List<ZToA> tpResources = pathDescription.getZToADirection().getZToA().values().stream()
-            .filter(ele -> ele.getResource().getResource().implementedInterface().getSimpleName()
-                .equals("TerminationPoint"))
+                .filter(ele -> ele.getResource().getResource() instanceof TerminationPoint)
+                .collect(Collectors.toList());
+        List<ZToA> linkResources = pathDescription.getZToADirection().getZToA().values().stream()
+            .filter(ele -> ele.getResource().getResource() instanceof Link)
             .collect(Collectors.toList());
         for (ZToA ztoA : tpResources) {
             String ztoAid = ztoA.getId();
@@ -172,18 +177,35 @@ public class NetworkModelListenerImpl implements TransportpceNetworkmodelListene
                     .setResource(updatedResource)
                     .build();
                 newztoaMap.put(updatedZToA.key(), updatedZToA);
+                for (ZToA ztoALink : linkResources) {
+                    Link link = (Link)ztoALink.getResource().getResource();
+                    if (link.getLinkId().contains(tp.getTpNodeId())
+                            && link.getLinkId().contains(tp.getTpId())
+                            && ztoALink.getResource().getState() != updatedState) {
+                        ZToA updatedZToAlink = new ZToABuilder(ztoALink)
+                            .setId(ztoAid)
+                            .setResource(new ResourceBuilder()
+                                .setResource(link)
+                                .setState(updatedState)
+                                .build())
+                            .build();
+                        newztoaMap.put(updatedZToAlink.key(), updatedZToAlink);
+                    }
+                }
             }
         }
         return newztoaMap;
     }
 
-    private Map<AToZKey, AToZ> changePathElementStateAZ(Map<TopologyChangesKey,
+    protected Map<AToZKey, AToZ> changePathElementStateAZ(Map<TopologyChangesKey,
             TopologyChanges> topologyChanges, PathDescription pathDescription) {
 
         Map<AToZKey, AToZ> newatozMap = new HashMap<>(pathDescription.getAToZDirection().getAToZ());
         List<AToZ> tpResources = pathDescription.getAToZDirection().getAToZ().values().stream()
-            .filter(ele -> ele.getResource().getResource().implementedInterface().getSimpleName()
-                .equals("TerminationPoint"))
+            .filter(ele -> ele.getResource().getResource() instanceof TerminationPoint)
+            .collect(Collectors.toList());
+        List<AToZ> linkResources = pathDescription.getAToZDirection().getAToZ().values().stream()
+            .filter(ele -> ele.getResource().getResource() instanceof Link)
             .collect(Collectors.toList());
         for (AToZ atoZ : tpResources) {
             String atoZid = atoZ.getId();
@@ -204,6 +226,21 @@ public class NetworkModelListenerImpl implements TransportpceNetworkmodelListene
                     .setResource(updatedResource)
                     .build();
                 newatozMap.put(updatedAToZ.key(), updatedAToZ);
+                for (AToZ atozLink : linkResources) {
+                    Link link = (Link)atozLink.getResource().getResource();
+                    if (link.getLinkId().contains(tp.getTpNodeId())
+                            && link.getLinkId().contains(tp.getTpId())
+                            && atozLink.getResource().getState() != updatedState) {
+                        AToZ updatedAToZlink = new AToZBuilder(atozLink)
+                            .setId(atoZid)
+                            .setResource(new ResourceBuilder()
+                                .setResource(link)
+                                .setState(updatedState)
+                                .build())
+                            .build();
+                        newatozMap.put(updatedAToZlink.key(), updatedAToZlink);
+                    }
+                }
             }
         }
         return newatozMap;
@@ -223,7 +260,7 @@ public class NetworkModelListenerImpl implements TransportpceNetworkmodelListene
             .build();
     }
 
-    private boolean allElementsinPathinService(Map<AToZKey, AToZ> updatedAtoZ, Map<ZToAKey, ZToA> updatedZtoA) {
+    protected boolean allElementsinPathinService(Map<AToZKey, AToZ> updatedAtoZ, Map<ZToAKey, ZToA> updatedZtoA) {
         boolean allEleminService = true;
         Iterator<AToZ> i1 = updatedAtoZ.values().iterator();
         Iterator<ZToA> i2 = updatedZtoA.values().iterator();
@@ -240,16 +277,11 @@ public class NetworkModelListenerImpl implements TransportpceNetworkmodelListene
     }
 
     private boolean compareTopologyUpdateResult(TopologyUpdateResult notification) {
-        if (topologyUpdateResult == null) {
-            return false;
-        }
-        if (topologyUpdateResult.getTopologyChanges().values()
-                .equals(notification.getTopologyChanges().values())) {
-            return false;
-        }
-        return true;
+        return topologyUpdateResult != null
+                && topologyUpdateResult.getTopologyChanges().equals(notification.getTopologyChanges());
     }
 
+    @Override
     public void setserviceDataStoreOperations(ServiceDataStoreOperations serviceData) {
         this.serviceDataStoreOperations = serviceData;
     }
diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/PceListener.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/PceListener.java
new file mode 100644 (file)
index 0000000..07f8cce
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright © 2023 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.servicehandler.listeners;
+
+import org.opendaylight.transportpce.servicehandler.ServiceInput;
+import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
+
+public interface PceListener {
+
+    void setInput(ServiceInput serviceInput);
+
+    void setServiceReconfigure(Boolean serv);
+
+    void setserviceDataStoreOperations(ServiceDataStoreOperations serviceData);
+
+    void setTempService(Boolean tempService);
+
+    void setServiceFeasiblity(Boolean serviceFeasiblity);
+}
similarity index 77%
rename from servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/PceListenerImpl.java
rename to servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/PceNotificationHandler.java
index e936ea3ea41d0c3dcb7e2964f8134602d1b2b375..9ce49beebabc11b418824bbe80f3d0d5cae033d5 100644 (file)
@@ -8,7 +8,9 @@
 package org.opendaylight.transportpce.servicehandler.listeners;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import java.util.Set;
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.mdsal.binding.api.NotificationService.CompositeListener;
 import org.opendaylight.transportpce.common.OperationResult;
 import org.opendaylight.transportpce.pce.service.PathComputationService;
 import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations;
@@ -16,26 +18,29 @@ import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
 import org.opendaylight.transportpce.servicehandler.ServiceInput;
 import org.opendaylight.transportpce.servicehandler.service.PCEServiceWrapper;
 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.ServicePathRpcResult;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.TransportpcePceListener;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.service.path.rpc.result.PathDescription;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.service.path.rpc.result.PathDescriptionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.ServicePathRpcResult;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.service.path.rpc.result.PathDescription;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.service.path.rpc.result.PathDescriptionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestInput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.RpcStatusEx;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.response.parameters.sp.ResponseParametersBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationProcessService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationProcessServiceBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.notification.process.service.ServiceAEndBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.notification.process.service.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationProcessServiceBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.process.service.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.process.service.ServiceZEndBuilder;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class PceListenerImpl implements TransportpcePceListener {
+@Component(service = {PceNotificationHandler.class, PceListener.class})
+public class PceNotificationHandler implements PceListener {
 
-    private static final Logger LOG = LoggerFactory.getLogger(PceListenerImpl.class);
+    private static final Logger LOG = LoggerFactory.getLogger(PceNotificationHandler.class);
     private static final String PUBLISHER = "PceListener";
 
     private ServicePathRpcResult servicePathRpcResult;
@@ -48,11 +53,12 @@ public class PceListenerImpl implements TransportpcePceListener {
     private Boolean serviceFeasiblity;
     private NotificationPublishService notificationPublishService;
 
-    public PceListenerImpl(
-            RendererServiceOperations rendererServiceOperations,
-            PathComputationService pathComputationService,
-            NotificationPublishService notificationPublishService,
-            ServiceDataStoreOperations serviceDataStoreOperations) {
+    @Activate
+    public PceNotificationHandler(
+            @Reference RendererServiceOperations rendererServiceOperations,
+            @Reference PathComputationService pathComputationService,
+            @Reference NotificationPublishService notificationPublishService,
+            @Reference ServiceDataStoreOperations serviceDataStoreOperations) {
         this.rendererServiceOperations = rendererServiceOperations;
         this.pceServiceWrapper = new PCEServiceWrapper(pathComputationService, notificationPublishService);
         this.serviceDataStoreOperations = serviceDataStoreOperations;
@@ -63,8 +69,12 @@ public class PceListenerImpl implements TransportpcePceListener {
         this.notificationPublishService = notificationPublishService;
     }
 
-    @Override
-    public void onServicePathRpcResult(ServicePathRpcResult notification) {
+    public CompositeListener getCompositeListener() {
+        return new CompositeListener(Set.of(
+            new CompositeListener.Component<>(ServicePathRpcResult.class, this::onServicePathRpcResult)));
+    }
+
+    private void onServicePathRpcResult(ServicePathRpcResult notification) {
         if (compareServicePathRpcResult(notification)) {
             LOG.warn("ServicePathRpcResult already wired !");
             return;
@@ -91,6 +101,7 @@ public class PceListenerImpl implements TransportpcePceListener {
     private void onPathComputationResult(ServicePathRpcResult notification) {
         LOG.info("PCE '{}' Notification received : {}", servicePathRpcResult.getNotificationType().getName(),
                 notification);
+
         if (!checkStatus(notification)) {
             return;
         }
@@ -114,7 +125,9 @@ public class PceListenerImpl implements TransportpcePceListener {
         }
         OperationResult operationResult = null;
         if (tempService) {
-            operationResult = this.serviceDataStoreOperations.createTempService(input.getTempServiceCreateInput());
+            operationResult =
+                    this.serviceDataStoreOperations.createTempService(
+                            input.getTempServiceCreateInput(), pathDescription);
             if (!operationResult.isSuccess()) {
                 LOG.error("Temp Service not created in datastore !");
             }
@@ -145,7 +158,8 @@ public class PceListenerImpl implements TransportpcePceListener {
         ServiceImplementationRequestInput serviceImplementationRequest =
             ModelMappingUtils.createServiceImplementationRequest(input, pathDescription);
         LOG.info("Sending serviceImplementation request : {}", serviceImplementationRequest);
-        this.rendererServiceOperations.serviceImplementation(serviceImplementationRequest);
+        LOG.debug("Temp-service value is {}", tempService);
+        this.rendererServiceOperations.serviceImplementation(serviceImplementationRequest, tempService);
     }
 
     /**
@@ -214,26 +228,47 @@ public class PceListenerImpl implements TransportpcePceListener {
             LOG.error("PCE cancel returned an unknown RpcStatusEx code !");
             return;
         }
-        Services service = serviceDataStoreOperations.getService(input.getServiceName()).get();
-        PublishNotificationProcessServiceBuilder nbiNotificationBuilder =
-            new PublishNotificationProcessServiceBuilder()
-                .setServiceName(service.getServiceName())
-                .setServiceAEnd(new ServiceAEndBuilder(service.getServiceAEnd()).build())
-                .setServiceZEnd(new ServiceZEndBuilder(service.getServiceZEnd()).build())
-                .setCommonId(service.getCommonId())
-                .setConnectionType(service.getConnectionType())
-                .setPublisherName(PUBLISHER);
+        PublishNotificationProcessServiceBuilder nbiNotificationBuilder;
+        State serviceOpState;
+        if (tempService) {
+            org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.temp.service.list.Services
+                    tempServiceList = serviceDataStoreOperations.getTempService(input.getServiceName()).orElseThrow();
+            serviceOpState = tempServiceList.getOperationalState();
+            nbiNotificationBuilder =
+                    new PublishNotificationProcessServiceBuilder()
+                            .setServiceAEnd(new ServiceAEndBuilder(tempServiceList.getServiceAEnd()).build())
+                            .setServiceZEnd(new ServiceZEndBuilder(tempServiceList.getServiceZEnd()).build())
+                            .setCommonId(tempServiceList.getCommonId())
+                            .setConnectionType(tempServiceList.getConnectionType())
+                            .setIsTempService(true)
+                            .setPublisherName(PUBLISHER);
+        } else {
+            Services service = serviceDataStoreOperations.getService(input.getServiceName()).orElseThrow();
+            serviceOpState = service.getOperationalState();
+            nbiNotificationBuilder =
+                    new PublishNotificationProcessServiceBuilder()
+                            .setServiceName(service.getServiceName())
+                            .setServiceAEnd(new ServiceAEndBuilder(service.getServiceAEnd()).build())
+                            .setServiceZEnd(new ServiceZEndBuilder(service.getServiceZEnd()).build())
+                            .setCommonId(service.getCommonId())
+                            .setIsTempService(false)
+                            .setConnectionType(service.getConnectionType())
+                            .setPublisherName(PUBLISHER);
+
+        }
+
         if (servicePathRpcResult.getStatus() == RpcStatusEx.Failed) {
             LOG.info("PCE cancel resource failed !");
             sendNbiNotification(
                 nbiNotificationBuilder
                     .setResponseFailed("PCE cancel resource failed !")
                     .setMessage("ServiceDelete request failed ...")
-                    .setOperationalState(service.getOperationalState())
+                    .setOperationalState(serviceOpState)
                     .build());
             return;
         }
         LOG.info("PCE cancel resource done OK !");
+        // Here the input refers to the transportPCE API and the serviceName will be commonId for temp-service
         OperationResult deleteServicePathOperationResult =
                 this.serviceDataStoreOperations.deleteServicePath(input.getServiceName());
         if (!deleteServicePathOperationResult.isSuccess()) {
@@ -255,14 +290,15 @@ public class PceListenerImpl implements TransportpcePceListener {
                     .setOperationalState(State.Degraded)
                     .build());
         } else {
-            LOG.warn("{}Service was not removed from datastore !", serviceType);
+            LOG.warn("{} Service was not removed from datastore !", serviceType);
             sendNbiNotification(
                 nbiNotificationBuilder
                     .setResponseFailed(serviceType + "Service was not removed from datastore !")
                     .setMessage("ServiceDelete request failed ...")
-                    .setOperationalState(service.getOperationalState())
+                    .setOperationalState(serviceOpState)
                     .build());
         }
+        // TODO: should we re-initialize the temp-service boolean to false?
         /**
          * if it was an RPC serviceReconfigure, re-launch PCR.
          */
@@ -295,22 +331,27 @@ public class PceListenerImpl implements TransportpcePceListener {
         return true;
     }
 
+    @Override
     public void setInput(ServiceInput serviceInput) {
         this.input = serviceInput;
     }
 
+    @Override
     public void setServiceReconfigure(Boolean serv) {
         this.serviceReconfigure = serv;
     }
 
+    @Override
     public void setserviceDataStoreOperations(ServiceDataStoreOperations serviceData) {
         this.serviceDataStoreOperations = serviceData;
     }
 
+    @Override
     public void setTempService(Boolean tempService) {
         this.tempService = tempService;
     }
 
+    @Override
     public void setServiceFeasiblity(Boolean serviceFeasiblity) {
         this.serviceFeasiblity = serviceFeasiblity;
     }
diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/RendererListener.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/listeners/RendererListener.java
new file mode 100644 (file)
index 0000000..6021581
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Copyright © 2023 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.servicehandler.listeners;
+
+import org.opendaylight.transportpce.servicehandler.ServiceInput;
+import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
+
+public interface RendererListener {
+
+    void setServiceInput(ServiceInput serviceInput);
+
+    void setserviceDataStoreOperations(ServiceDataStoreOperations serviceData);
+
+    void setTempService(Boolean tempService);
+}
@@ -8,9 +8,12 @@
 package org.opendaylight.transportpce.servicehandler.listeners;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.mdsal.binding.api.NotificationService.CompositeListener;
 import org.opendaylight.transportpce.common.OperationResult;
 import org.opendaylight.transportpce.common.StringConstants;
 import org.opendaylight.transportpce.networkmodel.service.NetworkModelService;
@@ -18,20 +21,27 @@ import org.opendaylight.transportpce.pce.service.PathComputationService;
 import org.opendaylight.transportpce.servicehandler.ServiceInput;
 import org.opendaylight.transportpce.servicehandler.service.PCEServiceWrapper;
 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkutils.rev220630.OtnLinkType;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.RendererRpcResultSp;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.TransportpceRendererListener;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.renderer.rpc.result.sp.Link;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.ServiceRpcResultSh;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.ServiceRpcResultShBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ServiceNotificationTypes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ServiceNotificationTypes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services;
-import org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.OtnLinkType;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationProcessService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationProcessServiceBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.notification.process.service.ServiceAEndBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.notification.process.service.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRpcResult;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRpcResultBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.rpc.result.PathComputationResultBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.rpc.result.path.computation.result.AToZBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.rpc.result.path.computation.result.ZToABuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationProcessService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationProcessServiceBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.process.service.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.process.service.ServiceZEndBuilder;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -41,10 +51,11 @@ import org.slf4j.LoggerFactory;
  * @author Martial Coulibaly ( martial.coulibaly@gfi.com ) on behalf of Orange
  *
  */
-public class RendererListenerImpl implements TransportpceRendererListener {
+@Component(service = {RendererNotificationHandler.class, RendererListener.class})
+public class RendererNotificationHandler implements RendererListener {
 
     private static final String PUBLISHER = "RendererListener";
-    private static final Logger LOG = LoggerFactory.getLogger(RendererListenerImpl.class);
+    private static final Logger LOG = LoggerFactory.getLogger(RendererNotificationHandler.class);
     private RendererRpcResultSp serviceRpcResultSp;
     private ServiceDataStoreOperations serviceDataStoreOperations;
     private ServiceInput input;
@@ -53,9 +64,10 @@ public class RendererListenerImpl implements TransportpceRendererListener {
     private NotificationPublishService notificationPublishService;
     private final NetworkModelService networkModelService;
 
-
-    public RendererListenerImpl(PathComputationService pathComputationService,
-            NotificationPublishService notificationPublishService, NetworkModelService networkModelService) {
+    @Activate
+    public RendererNotificationHandler(@Reference PathComputationService pathComputationService,
+            @Reference NotificationPublishService notificationPublishService,
+            @Reference NetworkModelService networkModelService) {
         this.pceServiceWrapper = new PCEServiceWrapper(pathComputationService, notificationPublishService);
         setServiceInput(null);
         setTempService(false);
@@ -63,8 +75,12 @@ public class RendererListenerImpl implements TransportpceRendererListener {
         this.networkModelService = networkModelService;
     }
 
-    @Override
-    public void onRendererRpcResultSp(RendererRpcResultSp notification) {
+    public CompositeListener getCompositeListener() {
+        return new CompositeListener(Set.of(
+            new CompositeListener.Component<>(RendererRpcResultSp.class, this::onRendererRpcResultSp)));
+    }
+
+    private void onRendererRpcResultSp(RendererRpcResultSp notification) {
         if (compareServiceRpcResultSp(notification)) {
             LOG.warn("ServiceRpcResultSp already wired !");
             return;
@@ -98,12 +114,13 @@ public class RendererListenerImpl implements TransportpceRendererListener {
                 break;
             case Failed:
                 LOG.error("Renderer service delete failed !");
-                Services service = serviceDataStoreOperations.getService(input.getServiceName()).get();
+                Services service = serviceDataStoreOperations.getService(input.getServiceName()).orElseThrow();
                 sendNbiNotification(new PublishNotificationProcessServiceBuilder()
                         .setServiceName(service.getServiceName())
                         .setServiceAEnd(new ServiceAEndBuilder(service.getServiceAEnd()).build())
                         .setServiceZEnd(new ServiceZEndBuilder(service.getServiceZEnd()).build())
                         .setCommonId(service.getCommonId())
+                        .setIsTempService(false)
                         .setConnectionType(service.getConnectionType())
                         .setResponseFailed("Renderer service delete failed !")
                         .setMessage("ServiceDelete request failed ...")
@@ -160,42 +177,86 @@ public class RendererListenerImpl implements TransportpceRendererListener {
             LOG.debug("serviceDataStoreOperations is null");
             return;
         }
-
         updateOtnTopology(notification, false);
-
-        PublishNotificationProcessServiceBuilder nbiNotificationBuilder = new PublishNotificationProcessServiceBuilder()
-                .setServiceName(input.getServiceName())
+        PublishNotificationProcessServiceBuilder nbiNotificationBuilder =
+            new PublishNotificationProcessServiceBuilder()
                 .setServiceAEnd(new ServiceAEndBuilder(input.getServiceAEnd()).build())
                 .setServiceZEnd(new ServiceZEndBuilder(input.getServiceZEnd()).build())
-                .setCommonId(input.getCommonId()).setConnectionType(input.getConnectionType())
                 .setPublisherName(PUBLISHER);
-        OperationResult operationResult;
         String serviceTemp = "";
         if (tempService) {
-            operationResult = this.serviceDataStoreOperations.modifyTempService(
+            nbiNotificationBuilder.setCommonId(input.getCommonId()).setConnectionType(input.getConnectionType());
+            nbiNotificationBuilder.setIsTempService(true);
+            if (input.getServiceName() != null) {
+                nbiNotificationBuilder.setServiceName(input.getServiceName());
+            }
+            OperationResult operationResult = this.serviceDataStoreOperations.modifyTempService(
                     serviceRpcResultSp.getServiceName(), State.InService, AdminStates.InService);
             serviceTemp = "Temp ";
+            if (operationResult.isSuccess()) {
+                ServiceRpcResult serviceRpcResult =
+                    sendServiceRpcResultNotification(notification, ServiceNotificationTypes.ServiceCreateResult);
+                sendNbiNotification(nbiNotificationBuilder
+                    .setResponseFailed("")
+                    .setMessage("Temp Service implemented")
+                    .setAToZ(
+                        new org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.process.service
+                                .AToZBuilder()
+                            .setFrequency(serviceRpcResult.getPathComputationResult().getAToZ().getFrequency())
+                            .setWidth(serviceRpcResult.getPathComputationResult().getAToZ().getWidth())
+                            .setOpticalOperationalMode(serviceRpcResult.getPathComputationResult()
+                                        .getAToZ().getOpticalOperationalMode())
+                            // TODO: add GNSR, OSNR, min/max output powers
+                            .build())
+                    .setZToA(
+                        new org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.notification.process.service
+                                .ZToABuilder()
+                            .setFrequency(serviceRpcResult.getPathComputationResult().getZToA().getFrequency())
+                            .setWidth(serviceRpcResult.getPathComputationResult().getZToA().getWidth())
+                            .setOpticalOperationalMode(serviceRpcResult.getPathComputationResult()
+                                        .getZToA().getOpticalOperationalMode())
+                            // TODO: add GNSR, OSNR, min/max output powers
+                            .build())
+                    .setOperationalState(State.InService)
+                    .build());
+                LOG.debug("For the Temp service, sending notification on service-result-rpc");
+                return;
+            }
         } else {
-            operationResult = this.serviceDataStoreOperations.modifyService(
+            // Here the service is implemented and the tempService has to be deleted if present
+            nbiNotificationBuilder.setServiceName(input.getServiceName()).setConnectionType(input.getConnectionType());
+            // Make sure temp-service is false
+            nbiNotificationBuilder.setIsTempService(false);
+            String commonId = input.getCommonId();
+            if (commonId != null) {
+                nbiNotificationBuilder.setCommonId(commonId);
+                if (this.serviceDataStoreOperations.getTempService(commonId).isPresent()) {
+                    LOG.info("Temp-service exists with the common-Id {}", commonId);
+                    // Delete the common-id from this temp-service-list here
+                    OperationResult tempServiceListDelete = serviceDataStoreOperations.deleteTempService(commonId);
+                    //TODO: Also need to delete the service-path from the transportpce-service-path list
+                    this.serviceDataStoreOperations.deleteServicePath(commonId);
+                    LOG.info("Result for temp-service-list with {} is {}", commonId, tempServiceListDelete);
+                }
+            }
+            OperationResult operationResult = this.serviceDataStoreOperations.modifyService(
                     serviceRpcResultSp.getServiceName(), State.InService, AdminStates.InService);
-        }
-        if (operationResult.isSuccess()) {
-            sendNbiNotification(nbiNotificationBuilder
+            if (operationResult.isSuccess()) {
+                sendNbiNotification(nbiNotificationBuilder
                     .setResponseFailed("")
                     .setMessage("Service implemented !")
                     .setOperationalState(State.InService)
                     .build());
-            if (!tempService) {
                 sendServiceHandlerNotification(notification, ServiceNotificationTypes.ServiceCreateResult);
+                return;
             }
-        } else {
-            LOG.warn("{}Service status not updated in datastore !", serviceTemp);
-            sendNbiNotification(nbiNotificationBuilder
-                    .setResponseFailed(serviceTemp + "Service status not updated in datastore !")
-                    .setMessage("ServiceCreate request failed ...")
-                    .setOperationalState(State.OutOfService)
-                    .build());
         }
+        LOG.warn("{}Service status not updated in datastore !", serviceTemp);
+        sendNbiNotification(nbiNotificationBuilder
+            .setResponseFailed(serviceTemp + "Service status not updated in datastore !")
+            .setMessage("ServiceCreate request failed ...")
+            .setOperationalState(State.OutOfService)
+            .build());
     }
 
     /**
@@ -203,7 +264,8 @@ public class RendererListenerImpl implements TransportpceRendererListener {
      * @param notification RendererRpcResultSp
      * @param type ServiceNotificationTypes
      */
-    private void sendServiceHandlerNotification(RendererRpcResultSp notification, ServiceNotificationTypes type) {
+    private void sendServiceHandlerNotification(
+            RendererRpcResultSp notification, ServiceNotificationTypes type) {
         try {
             ServiceRpcResultSh serviceHandlerNotification = new ServiceRpcResultShBuilder()
                     .setAToZDirection(notification.getAToZDirection())
@@ -214,8 +276,7 @@ public class RendererListenerImpl implements TransportpceRendererListener {
                     .setNotificationType(type)
                     .build();
             LOG.debug("Service update in datastore OK, sending notification {}", serviceHandlerNotification);
-            notificationPublishService.putNotification(
-                    serviceHandlerNotification);
+            notificationPublishService.putNotification(serviceHandlerNotification);
         } catch (InterruptedException e) {
             LOG.warn("Something went wrong while sending notification for service {}",
                     serviceRpcResultSp.getServiceName(), e);
@@ -223,19 +284,68 @@ public class RendererListenerImpl implements TransportpceRendererListener {
         }
     }
 
+    private ServiceRpcResult sendServiceRpcResultNotification(
+            RendererRpcResultSp notification, ServiceNotificationTypes type) {
+        try {
+            ServiceRpcResult serviceRpcResult = new ServiceRpcResultBuilder()
+                    .setServiceName(notification.getServiceName())
+                    .setNotificationType(type)
+                    .setStatusMessage(notification.getStatusMessage())
+                    .setCommonId(notification.getCommonId())
+                    .setPathComputationResult(new PathComputationResultBuilder()
+                            .setAToZ(new AToZBuilder()
+                                            .setFrequency(notification
+                                                            .getAToZDirection()
+                                                            .getCentralFrequency())
+                                            .setWidth(notification
+                                                            .getAToZDirection()
+                                                            .getWidth())
+                                            // TODO: here the optical operational mode should be set
+                                            // A default value is set here
+                                            .setOpticalOperationalMode("OR-W-400G-oFEC-63.1Gbd")
+                                            // TODO: also set the GNSR, OSNR, power values
+                                            .build())
+                            .setZToA(new ZToABuilder()
+                                            .setFrequency(notification
+                                                            .getZToADirection()
+                                                            .getCentralFrequency())
+                                            .setWidth(notification
+                                                            .getZToADirection()
+                                                            .getWidth())
+                                            // TODO: here the optical operational mode should be set
+                                            // A default value is set here
+                                            .setOpticalOperationalMode("OR-W-400G-oFEC-63.1Gbd")
+                                            // TODO: also set the GNSR, OSNR, power values
+                                            .build())
+                            .build())
+                    .build();
+            LOG.info("Sending the notification for service-rpc-result {}", serviceRpcResult);
+            notificationPublishService.putNotification(serviceRpcResult);
+            return serviceRpcResult;
+        } catch (InterruptedException e) {
+            LOG.warn("Something went wrong while sending notification for service {}",
+                    serviceRpcResultSp.getServiceName(), e);
+            Thread.currentThread().interrupt();
+        }
+        return null;
+    }
+
+
+
     /**
      * Process failed service implementation for serviceName.
      * @param serviceName String
      */
     private void onFailedServiceImplementation(String serviceName) {
         LOG.error("Renderer implementation failed !");
-        Services service = serviceDataStoreOperations.getService(input.getServiceName()).get();
+        Services service = serviceDataStoreOperations.getService(input.getServiceName()).orElseThrow();
         sendNbiNotification(new PublishNotificationProcessServiceBuilder()
                 .setServiceName(service.getServiceName())
                 .setServiceAEnd(new ServiceAEndBuilder(service.getServiceAEnd()).build())
                 .setServiceZEnd(new ServiceZEndBuilder(service.getServiceZEnd()).build())
                 .setCommonId(service.getCommonId())
                 .setConnectionType(service.getConnectionType())
+                .setIsTempService(false)
                 .setResponseFailed("Renderer implementation failed !")
                 .setMessage("ServiceCreate request failed ...")
                 .setOperationalState(service.getOperationalState())
@@ -254,7 +364,7 @@ public class RendererListenerImpl implements TransportpceRendererListener {
         } else {
             deleteServiceOperationResult = this.serviceDataStoreOperations.deleteService(serviceName);
         }
-        if (deleteServiceOperationResult.isSuccess()) {
+        if (!deleteServiceOperationResult.isSuccess()) {
             LOG.warn("{}Service was not removed from datastore!", serviceType);
         }
     }
@@ -273,14 +383,17 @@ public class RendererListenerImpl implements TransportpceRendererListener {
         return true;
     }
 
+    @Override
     public void setServiceInput(ServiceInput serviceInput) {
         this.input = serviceInput;
     }
 
+    @Override
     public void setserviceDataStoreOperations(ServiceDataStoreOperations serviceData) {
         this.serviceDataStoreOperations = serviceData;
     }
 
+    @Override
     public void setTempService(Boolean tempService) {
         this.tempService = tempService;
     }
@@ -301,11 +414,13 @@ public class RendererListenerImpl implements TransportpceRendererListener {
 
     private void updateOtnTopology(RendererRpcResultSp notification, boolean isDeletion) {
         Link link = notification.getLink();
-        List<String> supportedLinkIds = notification.getLinkId();
-        if (link == null && supportedLinkIds == null) {
+        if (link == null && notification.getLinkId() == null) {
             return;
         }
-
+        List<String> supportedLinkIds = null;
+        if (notification.getLinkId() != null) {
+            supportedLinkIds = new ArrayList<>(notification.getLinkId());
+        }
         String serviceType = notification.getServiceType();
         switch (serviceType) {
             case StringConstants.SERVICE_TYPE_OTU4:
index c4ee91ea902c5e90680c3e420b9501ae9fecd02a..967cbe4ff08404997ef7ce4c8ff9c5866daea435 100644 (file)
  */
 package org.opendaylight.transportpce.servicehandler.listeners;
 
-import java.util.Collection;
-import org.opendaylight.mdsal.binding.api.DataBroker;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.MoreExecutors;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.mdsal.binding.api.RpcService;
+import org.opendaylight.transportpce.common.ResponseCodes;
+import org.opendaylight.transportpce.servicehandler.ServiceInput;
+import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.Restorable;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.routing.metric.RoutingMetric;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.sdnc.request.header.SdncRequestHeaderBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.resiliency.ServiceResiliency;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationAlarmService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationAlarmServiceBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreate;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDelete;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReroute;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.create.input.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.create.input.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.delete.input.ServiceDeleteReqInfo;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.delete.input.ServiceDeleteReqInfoBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationAlarmService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationAlarmServiceBuilder;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@Component
 public class ServiceListener implements DataTreeChangeListener<Services> {
 
     private static final Logger LOG = LoggerFactory.getLogger(ServiceListener.class);
     private static final String PUBLISHER = "ServiceListener";
-    private final DataBroker dataBroker;
+    private final RpcService rpcService;
+    private ServiceDataStoreOperations serviceDataStoreOperations;
     private NotificationPublishService notificationPublishService;
+    private Map<String, ServiceInput> mapServiceInputReroute;
+    private final ScheduledExecutorService executor;
 
-    public ServiceListener(final DataBroker dataBroker, NotificationPublishService notificationPublishService) {
-        this.dataBroker = dataBroker;
+    @Activate
+    public ServiceListener(@Reference RpcService rpcService,
+            @Reference ServiceDataStoreOperations serviceDataStoreOperations,
+            @Reference NotificationPublishService notificationPublishService) {
+        this.rpcService = rpcService;
+        this.serviceDataStoreOperations = serviceDataStoreOperations;
         this.notificationPublishService = notificationPublishService;
+        this.executor = MoreExecutors.getExitingScheduledExecutorService(new ScheduledThreadPoolExecutor(4));
+        mapServiceInputReroute = new HashMap<>();
     }
 
-    public void onDataTreeChanged(Collection<DataTreeModification<Services>> changes) {
+    @Override
+    public void onDataTreeChanged(List<DataTreeModification<Services>> changes) {
         LOG.info("onDataTreeChanged - {}", this.getClass().getSimpleName());
         for (DataTreeModification<Services> change : changes) {
             DataObjectModification<Services> rootService = change.getRootNode();
-            if (rootService.getDataBefore() == null) {
+            if (rootService.dataBefore() == null) {
                 continue;
             }
-            String serviceName = rootService.getDataBefore().key().getServiceName();
-            switch (rootService.getModificationType()) {
+            String serviceInputName = rootService.dataBefore().key().getServiceName();
+            switch (rootService.modificationType()) {
                 case DELETE:
-                    LOG.info("Service {} correctly deleted from controller", serviceName);
+                    LOG.info("Service {} correctly deleted from controller", serviceInputName);
+                    if (mapServiceInputReroute.get(serviceInputName) != null) {
+                        serviceRerouteStep2(serviceInputName);
+                    }
                     break;
                 case WRITE:
-                    Services input = rootService.getDataAfter();
-                    if (rootService.getDataBefore().getOperationalState() == State.InService
-                            && rootService.getDataAfter().getOperationalState() == State.OutOfService) {
-                        LOG.info("Service {} is becoming outOfService", serviceName);
+                    Services inputBefore = rootService.dataBefore();
+                    Services inputAfter = rootService.dataAfter();
+                    if (inputBefore.getOperationalState() == State.InService
+                            && inputAfter.getOperationalState() == State.OutOfService) {
+                        LOG.info("Service {} is becoming outOfService", serviceInputName);
                         sendNbiNotification(new PublishNotificationAlarmServiceBuilder()
-                                .setServiceName(input.getServiceName())
-                                .setConnectionType(input.getConnectionType())
+                                .setServiceName(inputAfter.getServiceName())
+                                .setConnectionType(inputAfter.getConnectionType())
                                 .setMessage("The service is now outOfService")
                                 .setOperationalState(State.OutOfService)
                                 .setPublisherName(PUBLISHER)
                                 .build());
-                    }
-                    else if (rootService.getDataBefore().getOperationalState() == State.OutOfService
-                            && rootService.getDataAfter().getOperationalState() == State.InService) {
-                        LOG.info("Service {} is becoming InService", serviceName);
+                        if (inputAfter.getAdministrativeState() == AdminStates.InService
+                                && inputAfter.getServiceResiliency() != null
+                                && inputAfter.getServiceResiliency().getResiliency() != null
+                                && inputAfter.getServiceResiliency().getResiliency().equals(Restorable.VALUE)) {
+                            LOG.info("Attempting to reroute the service '{}'...", serviceInputName);
+                            if (!serviceRerouteCheck(serviceInputName, inputAfter.getServiceResiliency(),
+                                    inputAfter.getRoutingMetric())) {
+                                LOG.info("No other path available, cancelling reroute process of service '{}'...",
+                                        serviceInputName);
+                                continue;
+                            }
+                            mapServiceInputReroute.put(serviceInputName, null);
+                            if (inputAfter.getServiceResiliency().getHoldoffTime() != null) {
+                                LOG.info("Waiting hold off time before rerouting...");
+                                executor.schedule(
+                                        () -> {
+                                            if (mapServiceInputReroute.containsKey(serviceInputName)
+                                                    && mapServiceInputReroute.get(serviceInputName) == null) {
+                                                serviceRerouteStep1(serviceInputName);
+                                            } else {
+                                                LOG.info("Cancelling reroute process of service '{}'...",
+                                                        serviceInputName);
+                                            }
+                                        },
+                                        Long.parseLong(String.valueOf(inputAfter.getServiceResiliency()
+                                                .getHoldoffTime())),
+                                        TimeUnit.MILLISECONDS);
+                            } else {
+                                serviceRerouteStep1(serviceInputName);
+                            }
+                        }
+                    } else if (inputAfter.getAdministrativeState() == AdminStates.InService
+                            && inputBefore.getOperationalState() == State.OutOfService
+                            && inputAfter.getOperationalState() == State.InService) {
+                        LOG.info("Service {} is becoming InService", serviceInputName);
                         sendNbiNotification(new PublishNotificationAlarmServiceBuilder()
-                                .setServiceName(input.getServiceName())
-                                .setConnectionType(input.getConnectionType())
+                                .setServiceName(inputAfter.getServiceName())
+                                .setConnectionType(inputAfter.getConnectionType())
                                 .setMessage("The service is now inService")
                                 .setOperationalState(State.InService)
                                 .setPublisherName(PUBLISHER)
                                 .build());
+                        if (mapServiceInputReroute.containsKey(serviceInputName)
+                                && mapServiceInputReroute.get(serviceInputName) == null) {
+                            mapServiceInputReroute.remove(serviceInputName);
+                        }
                     }
                     break;
                 default:
-                    LOG.debug("Unknown modification type {}", rootService.getModificationType().name());
+                    LOG.debug("Unknown modification type {}", rootService.modificationType().name());
                     break;
             }
         }
     }
 
+    /**
+     * First step of the reroute : apply a service-delete RPC to the service.
+     *
+     * @param serviceNameToReroute Name of the service
+     */
+    private void serviceRerouteStep1(String serviceNameToReroute) {
+        mapServiceInputReroute.remove(serviceNameToReroute);
+        Optional<Services> serviceOpt = serviceDataStoreOperations.getService(serviceNameToReroute);
+        if (serviceOpt.isEmpty()) {
+            LOG.warn("Service '{}' does not exist in datastore", serviceNameToReroute);
+            return;
+        }
+        Services service = serviceOpt.orElseThrow();
+        ListenableFuture<RpcResult<ServiceDeleteOutput>> res = rpcService.getRpc(ServiceDelete.class).invoke(
+                new ServiceDeleteInputBuilder()
+                        .setSdncRequestHeader(new SdncRequestHeaderBuilder(service.getSdncRequestHeader())
+                                .setRpcAction(RpcActions.ServiceDelete)
+                                .build())
+                        .setServiceDeleteReqInfo(new ServiceDeleteReqInfoBuilder()
+                                .setServiceName(serviceNameToReroute)
+                                .setTailRetention(ServiceDeleteReqInfo.TailRetention.No)
+                                .build())
+                        .build());
+        try {
+            String httpResponseCode = res.get().getResult().getConfigurationResponseCommon().getResponseCode();
+            if (httpResponseCode.equals(ResponseCodes.RESPONSE_OK)) {
+                mapServiceInputReroute.put(serviceNameToReroute, new ServiceInput(
+                        new ServiceCreateInputBuilder()
+                                .setServiceName(serviceNameToReroute)
+                                .setCommonId(service.getCommonId())
+                                .setConnectionType(service.getConnectionType())
+                                .setServiceAEnd(new ServiceAEndBuilder(service.getServiceAEnd()).build())
+                                .setServiceZEnd(new ServiceZEndBuilder(service.getServiceZEnd()).build())
+                                .setHardConstraints(service.getHardConstraints())
+                                .setSoftConstraints(service.getSoftConstraints())
+                                .setSdncRequestHeader(service.getSdncRequestHeader())
+                                .setCustomer(service.getCustomer())
+                                .setCustomerContact(service.getCustomerContact())
+                                .setServiceResiliency(service.getServiceResiliency())
+                                .setDueDate(service.getDueDate())
+                                .setOperatorContact(service.getOperatorContact())
+                                .build()));
+                LOG.info("ServiceRerouteStep1 (deletion of the service) in progress");
+            } else {
+                LOG.warn("ServiceRerouteStep1 (deletion of the service) failed '{}' http code ", httpResponseCode);
+            }
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.warn("ServiceRerouteStep1 FAILED ! ", e);
+        }
+    }
+
+    /**
+     * Second step of the reroute : apply a service-create RPC. This method is called after the first step of reroute
+     * when the service has been successfully deleted.
+     *
+     * @param serviceNameToReroute Name of the service
+     */
+    private void serviceRerouteStep2(String serviceNameToReroute) {
+        ListenableFuture<RpcResult<ServiceCreateOutput>> res = rpcService.getRpc(ServiceCreate.class).invoke(
+                mapServiceInputReroute.get(serviceNameToReroute).getServiceCreateInput());
+        try {
+            String httpResponseCode = res.get().getResult().getConfigurationResponseCommon().getResponseCode();
+            if (httpResponseCode.equals(ResponseCodes.RESPONSE_OK)) {
+                LOG.info("ServiceRerouteStep2 (creation of the new service) in progress");
+            } else {
+                LOG.warn("ServiceRerouteStep2 (creation of the new service) failed '{}' http code ", httpResponseCode);
+            }
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.warn("ServiceRerouteStep2 FAILED ! ", e);
+        }
+        mapServiceInputReroute.remove(serviceNameToReroute);
+    }
+
+    /**
+     * Prior to the reroute steps: check that an alternative route of the service is possible.
+     *
+     * @param serviceNameToReroute Name of the service
+     * @param serviceResiliency Resiliency of the service
+     * @param routingMetric Metric of the routing
+     */
+    private boolean serviceRerouteCheck(String serviceNameToReroute, ServiceResiliency serviceResiliency,
+                                        RoutingMetric routingMetric) {
+        ServiceRerouteInput serviceRerouteInput = new ServiceRerouteInputBuilder()
+                .setServiceName(serviceNameToReroute)
+                .setServiceResiliency(serviceResiliency)
+                .setRoutingMetric(routingMetric)
+                .setSdncRequestHeader(new SdncRequestHeaderBuilder()
+                        .setRpcAction(RpcActions.ServiceReroute)
+                        .build())
+                .build();
+        ListenableFuture<RpcResult<ServiceRerouteOutput>> res = rpcService.getRpc(ServiceReroute.class).invoke(
+                serviceRerouteInput);
+        try {
+            return res.get().getResult().getConfigurationResponseCommon().getResponseCode()
+                    .equals(ResponseCodes.RESPONSE_OK);
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.warn("ServiceRerouteCheck FAILED ! ", e);
+            return false;
+        }
+    }
+
     /**
      * Send notification to NBI notification in order to publish message.
      *
@@ -89,4 +276,5 @@ public class ServiceListener implements DataTreeChangeListener<Services> {
             Thread.currentThread().interrupt();
         }
     }
+
 }
index 0a2551c2efe2e2bde64771e229ba775f694aca18..7eb2e29c1ba6ab7b6474fdfec907a77194340f04 100644 (file)
@@ -12,31 +12,38 @@ import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.common.util.concurrent.MoreExecutors;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executors;
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
 import org.opendaylight.transportpce.common.ResponseCodes;
 import org.opendaylight.transportpce.pce.service.PathComputationService;
 import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.CancelResourceReserveInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.CancelResourceReserveInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.CancelResourceReserveOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.CancelResourceReserveOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.CancelResourceReserveInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.CancelResourceReserveInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.CancelResourceReserveOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.CancelResourceReserveOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRerouteRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRerouteRequestInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRerouteRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRerouteRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.reroute.request.input.Endpoints;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.reroute.request.input.EndpointsBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.ServiceRpcResultSh;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.ServiceRpcResultShBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ServiceEndpoint;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ServiceNotificationTypes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommon;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommonBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.sdnc.request.header.SdncRequestHeader;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.HardConstraints;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.SoftConstraints;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceFeasibilityCheckInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ServiceEndpoint;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ServiceNotificationTypes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommon;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommonBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.sdnc.request.header.SdncRequestHeader;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.HardConstraints;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.SoftConstraints;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceFeasibilityCheckInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateInput;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.PceMetric;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.RpcStatusEx;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.response.parameters.sp.ResponseParameters;
@@ -71,7 +78,8 @@ public class PCEServiceWrapper {
             return performPCE(serviceCreateInput.getHardConstraints(), serviceCreateInput.getSoftConstraints(),
                     serviceCreateInput.getServiceName(), serviceCreateInput.getSdncRequestHeader(),
                     serviceCreateInput.getServiceAEnd(), serviceCreateInput.getServiceZEnd(),
-                    ServiceNotificationTypes.ServiceCreateResult, reserveResource);
+                    ServiceNotificationTypes.ServiceCreateResult, reserveResource,
+                    serviceCreateInput.getCustomer());
         } else {
             return returnPCEFailed();
         }
@@ -84,7 +92,8 @@ public class PCEServiceWrapper {
             return performPCE(tempServiceCreateInput.getHardConstraints(), tempServiceCreateInput.getSoftConstraints(),
                     tempServiceCreateInput.getCommonId(), tempServiceCreateInput.getSdncRequestHeader(),
                     tempServiceCreateInput.getServiceAEnd(), tempServiceCreateInput.getServiceZEnd(),
-                    ServiceNotificationTypes.ServiceCreateResult, reserveResource);
+                    ServiceNotificationTypes.ServiceCreateResult, reserveResource,
+                    tempServiceCreateInput.getCustomer());
         } else {
             return returnPCEFailed();
         }
@@ -99,7 +108,8 @@ public class PCEServiceWrapper {
                     serviceFeasibilityCheckInput.getSoftConstraints(), serviceFeasibilityCheckInput.getCommonId(),
                     serviceFeasibilityCheckInput.getSdncRequestHeader(), serviceFeasibilityCheckInput.getServiceAEnd(),
                     serviceFeasibilityCheckInput.getServiceZEnd(),
-                    ServiceNotificationTypes.ServiceCreateResult, reserveResource);
+                    ServiceNotificationTypes.ServiceCreateResult, reserveResource,
+                    serviceFeasibilityCheckInput.getCustomer());
         } else {
             return returnPCEFailed();
         }
@@ -107,7 +117,8 @@ public class PCEServiceWrapper {
 
     private PathComputationRequestOutput performPCE(HardConstraints hardConstraints, SoftConstraints softConstraints,
             String serviceName, SdncRequestHeader sdncRequestHeader, ServiceEndpoint serviceAEnd,
-            ServiceEndpoint serviceZEnd, ServiceNotificationTypes notifType, boolean reserveResource) {
+            ServiceEndpoint serviceZEnd, ServiceNotificationTypes notifType, boolean reserveResource,
+            String customerName) {
         LOG.info("Calling path computation.");
         notification = new ServiceRpcResultShBuilder().setNotificationType(notifType).setServiceName(serviceName)
                 .setStatus(RpcStatusEx.Pending)
@@ -120,7 +131,7 @@ public class PCEServiceWrapper {
         FutureCallback<PathComputationRequestOutput> pceCallback =
                 new PathComputationRequestOutputCallback(notifType, serviceName);
         PathComputationRequestInput pathComputationRequestInput = createPceRequestInput(serviceName, sdncRequestHeader,
-                hardConstraints, softConstraints, reserveResource, serviceAEnd, serviceZEnd);
+                hardConstraints, softConstraints, reserveResource, serviceAEnd, serviceZEnd, customerName);
         ListenableFuture<PathComputationRequestOutput> pce = this.pathComputationService
                 .pathComputationRequest(pathComputationRequestInput);
         Futures.addCallback(pce, pceCallback, executor);
@@ -138,10 +149,35 @@ public class PCEServiceWrapper {
                 .build();
     }
 
+    public PathComputationRerouteRequestOutput performPCEReroute(HardConstraints hardConstraints,
+           SoftConstraints softConstraints, SdncRequestHeader serviceHandler, ServiceEndpoint serviceAEnd,
+           ServiceEndpoint serviceZEnd,
+           Endpoints endpoints) {
+        // TODO: Make it asynchronous
+        LOG.info("Calling path computation reroute");
+        PathComputationRerouteRequestInput inputPCE = createPceRerouteRequestInput(hardConstraints, softConstraints,
+                serviceHandler, serviceAEnd, serviceZEnd, endpoints);
+        ListenableFuture<PathComputationRerouteRequestOutput> res =
+                pathComputationService.pathComputationRerouteRequest(inputPCE);
+        try {
+            return res.get();
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.warn("PerformPCEReroute FAILED ! ", e);
+            return new PathComputationRerouteRequestOutputBuilder()
+                    .setConfigurationResponseCommon(new ConfigurationResponseCommonBuilder()
+                            .setAckFinalIndicator(ResponseCodes.FINAL_ACK_YES)
+                            .setRequestId("None")
+                            .setResponseCode(ResponseCodes.RESPONSE_OK)
+                            .setResponseMessage("PCE calculation FAILED")
+                            .build())
+                    .build();
+        }
+    }
+
     private PathComputationRequestInput createPceRequestInput(String serviceName,
             SdncRequestHeader serviceHandler, HardConstraints hardConstraints,
             SoftConstraints softConstraints, Boolean reserveResource, ServiceEndpoint serviceAEnd,
-            ServiceEndpoint serviceZEnd) {
+            ServiceEndpoint serviceZEnd, String customerName) {
         LOG.info("Mapping ServiceCreateInput or ServiceFeasibilityCheckInput or serviceReconfigureInput to PCE"
                 + "requests");
         ServiceHandlerHeaderBuilder serviceHandlerHeader = new ServiceHandlerHeaderBuilder();
@@ -155,11 +191,32 @@ public class PCEServiceWrapper {
             .setHardConstraints(hardConstraints)
             .setSoftConstraints(softConstraints)
             .setPceRoutingMetric(PceMetric.TEMetric)
+            .setCustomerName(customerName)
             .setServiceAEnd(ModelMappingUtils.createServiceAEnd(serviceAEnd))
             .setServiceZEnd(ModelMappingUtils.createServiceZEnd(serviceZEnd))
             .build();
     }
 
+    private PathComputationRerouteRequestInput createPceRerouteRequestInput(HardConstraints hardConstraints,
+            SoftConstraints softConstraints, SdncRequestHeader serviceHandler, ServiceEndpoint serviceAEnd,
+            ServiceEndpoint serviceZEnd, Endpoints endpoints) {
+        LOG.info("Mapping Service-reroute to PCE requests");
+        return new PathComputationRerouteRequestInputBuilder()
+                .setServiceHandlerHeader(serviceHandler == null
+                        ? new ServiceHandlerHeaderBuilder().build()
+                        : new ServiceHandlerHeaderBuilder().setRequestId(serviceHandler.getRequestId()).build())
+                .setHardConstraints(hardConstraints)
+                .setSoftConstraints(softConstraints)
+                .setPceRoutingMetric(PceMetric.TEMetric)
+                .setEndpoints(new EndpointsBuilder()
+                        .setAEndTp(endpoints.getAEndTp())
+                        .setZEndTp(endpoints.getZEndTp())
+                        .build())
+                .setServiceAEnd(ModelMappingUtils.createServiceAEndReroute(serviceAEnd))
+                .setServiceZEnd(ModelMappingUtils.createServiceZEndReroute(serviceZEnd))
+                .build();
+    }
+
     private CancelResourceReserveInput mappingCancelResourceReserve(String serviceName,
                                                                     SdncRequestHeader sdncRequestHeader) {
         LOG.info("Mapping to PCE Cancel resource request input");
index ec2e2a7115c843b34d628f820b2b7a5b301d6d05..4bfaa6ebabef0b3d92c591f9a50beded7439bb8b 100644 (file)
@@ -22,11 +22,14 @@ import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteOutputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.ServiceRpcResultSh;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.ServiceRpcResultShBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ServiceNotificationTypes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommon;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommonBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceDeleteInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ServiceNotificationTypes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommon;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommonBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceDeleteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.ServicesBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.RpcStatusEx;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.handler.header.ServiceHandlerHeader;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.handler.header.ServiceHandlerHeaderBuilder;
@@ -72,16 +75,61 @@ public class RendererServiceWrapper {
         }
     }
 
-    public ServiceDeleteOutput performRenderer(TempServiceDeleteInput tempServiceDeleteInput,
-            ServiceNotificationTypes notifType) {
+
+    // TODO: Here is where the  we are sending null values for the service and that is causing issues
+    // We are performing renderer using null values
+    public ServiceDeleteOutput performRenderer(
+            TempServiceDeleteInput tempServiceDeleteInput,
+            ServiceNotificationTypes notifType,
+            org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                    .temp.service.list.Services tempService) {
         String commonId = tempServiceDeleteInput.getCommonId();
-        if (validateParams(commonId, null, true)) {
-            ServiceHandlerHeader serviceHandler = new ServiceHandlerHeaderBuilder().setRequestId(commonId).build();
-            return performRenderer(tempServiceDeleteInput.getCommonId(), serviceHandler,
-                    ServiceNotificationTypes.ServiceDeleteResult, null);
-        } else {
-            return returnRendererFailed();
-        }
+        return validateParams(commonId, null, true)
+            ? performRenderer(tempServiceDeleteInput,
+                new ServiceHandlerHeaderBuilder().setRequestId(commonId).build(),
+                ServiceNotificationTypes.ServiceDeleteResult,
+                tempService)
+            : returnRendererFailed();
+    }
+
+    private ServiceDeleteOutput performRenderer(
+            TempServiceDeleteInput tempServiceDeleteInput,
+            ServiceHandlerHeader serviceHandlerHeader,
+            ServiceNotificationTypes notifType,
+            org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                    .temp.service.list.Services tempService) {
+        String commonId = tempServiceDeleteInput.getCommonId();
+        notification = new ServiceRpcResultShBuilder()
+                .setNotificationType(notifType)
+                .setServiceName(commonId)
+                .setStatus(RpcStatusEx.Pending)
+                .setStatusMessage("Service compliant, submitting temp service delete Request ...")
+                .build();
+        sendNotifications(notification);
+        FutureCallback<ServiceDeleteOutput> rendererCallback =
+                new ServiceDeleteOutputFutureCallback(notifType, commonId);
+        ServiceDeleteInput serviceDeleteInput = createRendererRequestInput(commonId, serviceHandlerHeader);
+        // Here build the regular service-list container from the temp-service-list
+        ListenableFuture<ServiceDeleteOutput> renderer =
+                this.rendererServiceOperations.serviceDelete(serviceDeleteInput,
+                        new ServicesBuilder()
+                                .setServiceName(commonId)
+                                .setServiceAEnd(new ServiceAEndBuilder(tempService.getServiceAEnd()).build())
+                                .setServiceZEnd(new ServiceZEndBuilder(tempService.getServiceZEnd()).build())
+                                .setCommonId(commonId)
+                                .build());
+        Futures.addCallback(renderer, rendererCallback, executor);
+        return new ServiceDeleteOutputBuilder()
+                .setConfigurationResponseCommon(
+                        new ConfigurationResponseCommonBuilder()
+                                .setAckFinalIndicator(ResponseCodes.FINAL_ACK_NO)
+                                .setRequestId(serviceDeleteInput
+                                        .getServiceHandlerHeader()
+                                        .getRequestId())
+                                .setResponseCode(ResponseCodes.RESPONSE_OK)
+                                .setResponseMessage("Renderer temp-service delete in progress")
+                                .build())
+                .build();
     }
 
     private ServiceDeleteOutput performRenderer(String serviceName, ServiceHandlerHeader serviceHandlerHeader,
index a412793e669717a81cf7daaee4c2e3a054cf27dd..dbf2099399297699b40abc27a86d7d56cf562e31 100644 (file)
@@ -10,13 +10,13 @@ package org.opendaylight.transportpce.servicehandler.service;
 import java.util.Optional;
 import org.opendaylight.transportpce.common.OperationResult;
 import org.opendaylight.transportpce.servicehandler.ServiceInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceList;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceList;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.path.PathDescription;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.ServicePathList;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePaths;
@@ -54,7 +54,7 @@ public interface ServiceDataStoreOperations {
      *     unique common-id of the service
      * @return Optional of Services
      */
-    Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list
+    Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.temp.service.list
         .Services> getTempService(String commonId);
 
     /**
@@ -124,9 +124,12 @@ public interface ServiceDataStoreOperations {
      *
      * @param tempServiceCreateInput tempServiceCreateInput data for creation of
      *                               service
+     * @param pathDescription data to update the transport-assignment of the service
      * @return result of createTempService operation
      */
-    OperationResult createTempService(TempServiceCreateInput tempServiceCreateInput);
+    OperationResult createTempService(TempServiceCreateInput tempServiceCreateInput,
+                                      org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205
+                                              .service.path.rpc.result.PathDescription pathDescription);
 
     Optional<ServicePathList> getServicePaths();
 
index 1974801e5855d188abd50cfcd38356169236d068..4704950da306a21e473494a3755a03c56ccce294 100644 (file)
@@ -10,12 +10,10 @@ package org.opendaylight.transportpce.servicehandler.service;
 import com.google.common.util.concurrent.FluentFuture;
 import java.util.Optional;
 import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.api.ReadTransaction;
 import org.opendaylight.mdsal.binding.api.WriteTransaction;
 import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
@@ -23,27 +21,31 @@ import org.opendaylight.transportpce.common.OperationResult;
 import org.opendaylight.transportpce.common.Timeouts;
 import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
 import org.opendaylight.transportpce.servicehandler.ServiceInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutput;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceList;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceListBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceList;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceListBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.ServicesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.ServicesKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceList;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceListBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceList;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceListBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.ServicesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.ServicesKey;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.path.PathDescription;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.ServicePathList;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePaths;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePathsBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePathsKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@Component(immediate = true)
 public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperations {
     private static final Logger LOG = LoggerFactory.getLogger(ServiceDataStoreOperationsImpl.class);
     private static final String CREATE_MSG = "create";
@@ -73,7 +75,8 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation
     }
 
 
-    public ServiceDataStoreOperationsImpl(DataBroker dataBroker) {
+    @Activate
+    public ServiceDataStoreOperationsImpl(@Reference DataBroker dataBroker) {
         this.dataBroker = dataBroker;
     }
 
@@ -87,9 +90,10 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation
         try {
             LOG.info("initializing service registry");
             WriteTransaction transaction = this.dataBroker.newWriteOnlyTransaction();
-            InstanceIdentifier<ServiceList> iid = InstanceIdentifier.create(ServiceList.class);
-            ServiceList initialRegistry = new ServiceListBuilder().build();
-            transaction.put(LogicalDatastoreType.OPERATIONAL, iid, initialRegistry);
+            transaction.merge(
+                LogicalDatastoreType.OPERATIONAL,
+                InstanceIdentifier.create(ServiceList.class),
+                new ServiceListBuilder().build());
             FluentFuture<? extends @NonNull CommitInfo> future = transaction.commit();
             future.get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS);
         } catch (InterruptedException | ExecutionException | TimeoutException e) {
@@ -101,9 +105,10 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation
         try {
             LOG.info("initializing temp service registry");
             WriteTransaction transaction = this.dataBroker.newWriteOnlyTransaction();
-            InstanceIdentifier<TempServiceList> iid = InstanceIdentifier.create(TempServiceList.class);
-            TempServiceList initialRegistry = new TempServiceListBuilder().build();
-            transaction.put(LogicalDatastoreType.OPERATIONAL, iid, initialRegistry);
+            transaction.merge(
+                LogicalDatastoreType.OPERATIONAL,
+                InstanceIdentifier.create(TempServiceList.class),
+                new TempServiceListBuilder().build());
             FluentFuture<? extends @NonNull CommitInfo> future = transaction.commit();
             future.get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS);
         } catch (InterruptedException | ExecutionException | TimeoutException e) {
@@ -114,12 +119,13 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation
     @Override
     public Optional<Services> getService(String serviceName) {
         try {
-            ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction();
-            InstanceIdentifier<Services> iid =
-                    InstanceIdentifier.create(ServiceList.class).child(Services.class, new ServicesKey(serviceName));
-            Future<java.util.Optional<Services>> future =
-                    readTx.read(LogicalDatastoreType.OPERATIONAL, iid);
-            return future.get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
+            return this.dataBroker.newReadOnlyTransaction()
+                    .read(
+                        LogicalDatastoreType.OPERATIONAL,
+                        InstanceIdentifier.create(ServiceList.class)
+                            .child(Services.class, new ServicesKey(serviceName))
+                        )
+                    .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
         } catch (InterruptedException | ExecutionException | TimeoutException e) {
             LOG.warn("Reading service {} failed:", serviceName, e);
         }
@@ -129,12 +135,11 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation
     @Override
     public Optional<ServiceList> getServices() {
         try {
-            ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction();
-            InstanceIdentifier<ServiceList> iid =
-                    InstanceIdentifier.create(ServiceList.class);
-            Future<java.util.Optional<ServiceList>> future =
-                    readTx.read(LogicalDatastoreType.OPERATIONAL, iid);
-            return future.get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
+            return this.dataBroker.newReadOnlyTransaction()
+                    .read(
+                        LogicalDatastoreType.OPERATIONAL,
+                        InstanceIdentifier.create(ServiceList.class))
+                    .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
         } catch (InterruptedException | ExecutionException | TimeoutException e) {
             LOG.warn("Reading services failed:", e);
         }
@@ -142,19 +147,19 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation
     }
 
     @Override
-    public Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list.Services>
-            getTempService(String serviceName) {
+    public Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+            .temp.service.list.Services> getTempService(String serviceName) {
         try {
-            ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction();
-            InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list
-                .Services> iid = InstanceIdentifier.create(TempServiceList.class).child(
-                    org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list.Services.class,
-                    new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list.ServicesKey(
-                        serviceName));
-            FluentFuture<Optional<
-                org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list.Services>> future
-                = readTx.read(LogicalDatastoreType.OPERATIONAL, iid);
-            return future.get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
+            return this.dataBroker.newReadOnlyTransaction()
+                    .read(
+                        LogicalDatastoreType.OPERATIONAL,
+                        InstanceIdentifier.create(TempServiceList.class)
+                            .child(
+                                org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                                    .temp.service.list.Services.class,
+                                new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                                    .temp.service.list.ServicesKey(serviceName)))
+                    .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
         } catch (InterruptedException | ExecutionException | TimeoutException e) {
             LOG.warn("Reading service {} failed:", serviceName, e);
         }
@@ -166,9 +171,10 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation
         LOG.debug(DELETING_SERVICE_MSG, serviceName);
         try {
             WriteTransaction writeTx = this.dataBroker.newWriteOnlyTransaction();
-            InstanceIdentifier<Services> iid =
-                    InstanceIdentifier.create(ServiceList.class).child(Services.class, new ServicesKey(serviceName));
-            writeTx.delete(LogicalDatastoreType.OPERATIONAL, iid);
+            writeTx.delete(
+                LogicalDatastoreType.OPERATIONAL,
+                InstanceIdentifier.create(ServiceList.class)
+                    .child(Services.class, new ServicesKey(serviceName)));
             writeTx.commit().get(Timeouts.DATASTORE_DELETE, TimeUnit.MILLISECONDS);
             return OperationResult.ok(LogMessages.SUCCESSFUL_MESSAGE);
         } catch (TimeoutException | InterruptedException | ExecutionException e) {
@@ -182,12 +188,14 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation
         LOG.debug(DELETING_SERVICE_MSG, commonId);
         try {
             WriteTransaction writeTx = this.dataBroker.newWriteOnlyTransaction();
-            InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list
-                .Services> iid = InstanceIdentifier.create(TempServiceList.class).child(org.opendaylight.yang.gen.v1
-                        .http.org.openroadm.service.rev211210.temp.service.list.Services.class,
-                        new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list
-                            .ServicesKey(commonId));
-            writeTx.delete(LogicalDatastoreType.OPERATIONAL, iid);
+            writeTx.delete(
+                LogicalDatastoreType.OPERATIONAL,
+                InstanceIdentifier.create(TempServiceList.class)
+                    .child(
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                            .temp.service.list.Services.class,
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                            .temp.service.list.ServicesKey(commonId)));
             writeTx.commit().get(Timeouts.DATASTORE_DELETE, TimeUnit.MILLISECONDS);
             return OperationResult.ok(LogMessages.SUCCESSFUL_MESSAGE);
         } catch (TimeoutException | InterruptedException | ExecutionException e) {
@@ -200,19 +208,20 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation
     public OperationResult modifyService(String serviceName, State operationalState, AdminStates administrativeState) {
         LOG.debug("Modifying '{}' Service", serviceName);
         Optional<Services> readService = getService(serviceName);
-        if (!readService.isPresent()) {
+        if (readService.isEmpty()) {
             LOG.warn("modifyService: {}", LogMessages.SERVICE_NOT_FOUND);
             return OperationResult.failed(LogMessages.SERVICE_NOT_FOUND);
         }
         try {
             WriteTransaction writeTx = this.dataBroker.newWriteOnlyTransaction();
-            InstanceIdentifier<Services> iid = InstanceIdentifier.create(ServiceList.class)
-                    .child(Services.class, new ServicesKey(serviceName));
-            Services services = new ServicesBuilder(readService.get())
-                .setOperationalState(operationalState)
-                .setAdministrativeState(administrativeState)
-                .build();
-            writeTx.merge(LogicalDatastoreType.OPERATIONAL, iid, services);
+            writeTx.merge(
+                LogicalDatastoreType.OPERATIONAL,
+                InstanceIdentifier.create(ServiceList.class)
+                    .child(Services.class, new ServicesKey(serviceName)),
+                new ServicesBuilder(readService.orElseThrow())
+                    .setOperationalState(operationalState)
+                    .setAdministrativeState(administrativeState)
+                    .build());
             writeTx.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS);
             return OperationResult.ok(LogMessages.SUCCESSFUL_MESSAGE);
         } catch (TimeoutException | InterruptedException | ExecutionException e) {
@@ -222,29 +231,30 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation
     }
 
     @Override
-    public OperationResult modifyTempService(String serviceName, State operationalState,
-        AdminStates administrativeState) {
+    public OperationResult modifyTempService(
+            String serviceName, State operationalState, AdminStates administrativeState) {
         LOG.debug("Modifying '{}' Temp Service", serviceName);
-        Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list
-            .Services> readService = getTempService(serviceName);
-        if (!readService.isPresent()) {
+        Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                .temp.service.list.Services> readService = getTempService(serviceName);
+        if (readService.isEmpty()) {
             LOG.warn("modifyTempService: {}", LogMessages.SERVICE_NOT_FOUND);
             return OperationResult.failed(LogMessages.SERVICE_NOT_FOUND);
         }
         try {
             WriteTransaction writeTx = this.dataBroker.newWriteOnlyTransaction();
-            InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list
-                .Services> iid = InstanceIdentifier.create(TempServiceList.class)
-                    .child(org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list
-                            .Services.class, new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210
-                                .temp.service.list.ServicesKey(serviceName));
-            org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list.Services services =
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list.ServicesBuilder(
-                    readService.get())
-                .setOperationalState(operationalState)
-                .setAdministrativeState(administrativeState)
-                .build();
-            writeTx.merge(LogicalDatastoreType.OPERATIONAL, iid, services);
+            writeTx.merge(
+                LogicalDatastoreType.OPERATIONAL,
+                InstanceIdentifier.create(TempServiceList.class)
+                    .child(
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                            .temp.service.list.Services.class,
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                            .temp.service.list.ServicesKey(serviceName)),
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                        .temp.service.list.ServicesBuilder(readService.orElseThrow())
+                    .setOperationalState(operationalState)
+                    .setAdministrativeState(administrativeState)
+                    .build());
             writeTx.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS);
             return OperationResult.ok(LogMessages.SUCCESSFUL_MESSAGE);
         } catch (TimeoutException | InterruptedException | ExecutionException e) {
@@ -257,11 +267,12 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation
     public OperationResult createService(ServiceCreateInput serviceCreateInput) {
         LOG.debug("Writing '{}' Service", serviceCreateInput.getServiceName());
         try {
-            InstanceIdentifier<Services> iid = InstanceIdentifier.create(ServiceList.class)
-                    .child(Services.class, new ServicesKey(serviceCreateInput.getServiceName()));
-            Services service = ModelMappingUtils.mappingServices(serviceCreateInput, null);
             WriteTransaction writeTx = this.dataBroker.newWriteOnlyTransaction();
-            writeTx.put(LogicalDatastoreType.OPERATIONAL, iid, service);
+            writeTx.put(
+                LogicalDatastoreType.OPERATIONAL,
+                InstanceIdentifier.create(ServiceList.class)
+                    .child(Services.class, new ServicesKey(serviceCreateInput.getServiceName())),
+                ModelMappingUtils.mappingServices(serviceCreateInput, null));
             writeTx.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS);
             return OperationResult.ok(LogMessages.SUCCESSFUL_MESSAGE);
         } catch (TimeoutException | InterruptedException | ExecutionException e) {
@@ -271,18 +282,21 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation
     }
 
     @Override
-    public OperationResult createTempService(TempServiceCreateInput tempServiceCreateInput) {
+    public OperationResult createTempService(
+            TempServiceCreateInput tempServiceCreateInput,
+            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205
+                    .service.path.rpc.result.PathDescription pathDescription) {
         LOG.debug("Writing '{}' Temp Service", tempServiceCreateInput.getCommonId());
         try {
-            InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list
-                .Services> iid = InstanceIdentifier.create(TempServiceList.class)
-                    .child(org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list
-                            .Services.class, new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp
-                                .service.list.ServicesKey(tempServiceCreateInput.getCommonId()));
-            org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list
-                .Services service = ModelMappingUtils.mappingServices(tempServiceCreateInput);
             WriteTransaction writeTx = this.dataBroker.newWriteOnlyTransaction();
-            writeTx.put(LogicalDatastoreType.OPERATIONAL, iid, service);
+            writeTx.put(
+                LogicalDatastoreType.OPERATIONAL,
+                InstanceIdentifier.create(TempServiceList.class)
+                    .child(org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                            .temp.service.list.Services.class,
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                            .temp.service.list.ServicesKey(tempServiceCreateInput.getCommonId())),
+                ModelMappingUtils.mappingServices(tempServiceCreateInput, pathDescription));
             writeTx.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS);
             return OperationResult.ok(LogMessages.SUCCESSFUL_MESSAGE);
         } catch (TimeoutException | InterruptedException | ExecutionException e) {
@@ -296,11 +310,11 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation
     public Optional<ServicePathList> getServicePaths() {
         LOG.debug("Retrieving list of ServicePath...");
         try {
-            ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction();
-            InstanceIdentifier<ServicePathList> servicePathListIID = InstanceIdentifier.create(ServicePathList.class);
-            Future<java.util.Optional<ServicePathList>> future = readTx.read(LogicalDatastoreType.OPERATIONAL,
-                    servicePathListIID);
-            return future.get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
+            return this.dataBroker.newReadOnlyTransaction()
+                    .read(
+                        LogicalDatastoreType.OPERATIONAL,
+                        InstanceIdentifier.create(ServicePathList.class))
+                    .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
         } catch (InterruptedException | ExecutionException | TimeoutException e) {
             LOG.error("Reading service path list failed. Error={}", e.getMessage());
         }
@@ -311,12 +325,12 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation
     public Optional<ServicePaths> getServicePath(String serviceName) {
         LOG.debug("Retrieving service path of service {}", serviceName);
         try {
-            ReadTransaction readTx = this.dataBroker.newReadOnlyTransaction();
-            InstanceIdentifier<ServicePaths> servicePathsIID = InstanceIdentifier.create(ServicePathList.class)
-                    .child(ServicePaths.class, new ServicePathsKey(serviceName));
-            Future<java.util.Optional<ServicePaths>> future = readTx.read(LogicalDatastoreType.OPERATIONAL,
-                    servicePathsIID);
-            return future.get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
+            return this.dataBroker.newReadOnlyTransaction()
+                    .read(
+                        LogicalDatastoreType.OPERATIONAL,
+                        InstanceIdentifier.create(ServicePathList.class)
+                            .child(ServicePaths.class, new ServicePathsKey(serviceName)))
+                    .get(Timeouts.DATASTORE_READ, TimeUnit.MILLISECONDS);
         } catch (InterruptedException | ExecutionException | TimeoutException e) {
             LOG.error("Reading service path failed. Error={}", e.getMessage());
         }
@@ -327,11 +341,12 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation
     public OperationResult createServicePath(ServiceInput serviceInput, PathComputationRequestOutput outputFromPce) {
         LOG.debug("Writing '{}' ServicePath ", serviceInput.getServiceName());
         try {
-            InstanceIdentifier<ServicePaths> servicePathsIID = InstanceIdentifier.create(ServicePathList.class)
-                    .child(ServicePaths.class, new ServicePathsKey(serviceInput.getServiceName()));
-            ServicePaths servicePath = ModelMappingUtils.mappingServicePaths(serviceInput, outputFromPce);
             WriteTransaction writeTx = this.dataBroker.newWriteOnlyTransaction();
-            writeTx.put(LogicalDatastoreType.OPERATIONAL, servicePathsIID, servicePath);
+            writeTx.put(
+                LogicalDatastoreType.OPERATIONAL,
+                InstanceIdentifier.create(ServicePathList.class)
+                    .child(ServicePaths.class, new ServicePathsKey(serviceInput.getServiceName())),
+                ModelMappingUtils.mappingServicePaths(serviceInput, outputFromPce));
             writeTx.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS);
             return OperationResult.ok(LogMessages.SUCCESSFUL_MESSAGE);
         } catch (TimeoutException | InterruptedException | ExecutionException e) {
@@ -345,30 +360,30 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation
     public OperationResult modifyServicePath(PathDescription pathDescription, String serviceName) {
         LOG.debug("Updating servicePath because of a change in the openroadm-topology");
         Optional<ServicePaths> readServicePath = getServicePath(serviceName);
-        if (!readServicePath.isPresent()) {
+        if (readServicePath.isEmpty()) {
             LOG.warn("modifyServicePath: {}", LogMessages.SERVICE_PATH_NOT_FOUND);
             return OperationResult.failed(LogMessages.SERVICE_PATH_NOT_FOUND);
         }
         try {
             WriteTransaction writeTx = this.dataBroker.newWriteOnlyTransaction();
-            InstanceIdentifier<ServicePaths> iid = InstanceIdentifier.create(ServicePathList.class)
-                    .child(ServicePaths.class, new ServicePathsKey(serviceName));
-            ServicePaths servicePaths = new ServicePathsBuilder()
-                    .setServiceAEnd(readServicePath.get().getServiceAEnd())
-                    .setServiceHandlerHeader(readServicePath.get().getServiceHandlerHeader())
-                    .setServicePathName(readServicePath.get().getServicePathName())
-                    .setServiceZEnd(readServicePath.get().getServiceZEnd())
-                    .setSupportingServiceName(readServicePath.get().getSupportingServiceName())
-                    .setEquipmentSrgs(readServicePath.get().getEquipmentSrgs())
-                    .setFiberSpanSrlgs(readServicePath.get().getFiberSpanSrlgs())
-                    .setHardConstraints(readServicePath.get().getHardConstraints())
-                    .setLatency(readServicePath.get().getLatency())
+            writeTx.merge(
+                LogicalDatastoreType.OPERATIONAL,
+                InstanceIdentifier.create(ServicePathList.class)
+                    .child(ServicePaths.class, new ServicePathsKey(serviceName)),
+                new ServicePathsBuilder()
+                    .setServiceAEnd(readServicePath.orElseThrow().getServiceAEnd())
+                    .setServiceHandlerHeader(readServicePath.orElseThrow().getServiceHandlerHeader())
+                    .setServicePathName(readServicePath.orElseThrow().getServicePathName())
+                    .setServiceZEnd(readServicePath.orElseThrow().getServiceZEnd())
+                    .setSupportingServiceName(readServicePath.orElseThrow().getSupportingServiceName())
+                    .setEquipmentSrgs(readServicePath.orElseThrow().getEquipmentSrgs())
+                    .setFiberSpanSrlgs(readServicePath.orElseThrow().getFiberSpanSrlgs())
+                    .setHardConstraints(readServicePath.orElseThrow().getHardConstraints())
+                    .setLatency(readServicePath.orElseThrow().getLatency())
                     .setPathDescription(pathDescription)
-                    .setPceRoutingMetric(readServicePath.get().getPceRoutingMetric())
-                    .setSoftConstraints(readServicePath.get().getSoftConstraints())
-                    .build();
-
-            writeTx.merge(LogicalDatastoreType.OPERATIONAL, iid, servicePaths);
+                    .setPceRoutingMetric(readServicePath.orElseThrow().getPceRoutingMetric())
+                    .setSoftConstraints(readServicePath.orElseThrow().getSoftConstraints())
+                    .build());
             writeTx.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS);
             return OperationResult.ok(LogMessages.SUCCESSFUL_MESSAGE);
         } catch (TimeoutException | InterruptedException | ExecutionException e) {
@@ -379,7 +394,8 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation
 
     @Override
     public OperationResult deleteServicePath(String serviceName) {
-        InstanceIdentifier<ServicePaths> servicePathsIID = InstanceIdentifier.create(ServicePathList.class)
+        InstanceIdentifier<ServicePaths> servicePathsIID =
+            InstanceIdentifier.create(ServicePathList.class)
                 .child(ServicePaths.class, new ServicePathsKey(serviceName));
         LOG.debug("Deleting service from {}", servicePathsIID);
         WriteTransaction servicePathsWriteTx = this.dataBroker.newWriteOnlyTransaction();
@@ -408,26 +424,25 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation
      */
     @Deprecated
     @Override
-    public String writeOrModifyOrDeleteServiceList(String serviceName, ServiceCreateInput input,
-            PathComputationRequestOutput output, int choice) {
+    public String writeOrModifyOrDeleteServiceList(
+            String serviceName, ServiceCreateInput input, PathComputationRequestOutput output, int choice) {
         LOG.debug("WriteOrModifyOrDeleting '{}' Service", serviceName);
         WriteTransaction writeTx = this.dataBroker.newWriteOnlyTransaction();
         Optional<Services> readService = getService(serviceName);
-
         /*
          * Write Service.
          */
-        if (!readService.isPresent()) {
+        if (readService.isEmpty()) {
             if (choice != 2) {
                 LOG.warn("writeOrModifyOrDeleteServiceList: {}", LogMessages.SERVICE_NOT_FOUND);
                 return LogMessages.SERVICE_NOT_FOUND;
             }
-
             LOG.debug("Writing '{}' Service", serviceName);
-            InstanceIdentifier<Services> iid = InstanceIdentifier.create(ServiceList.class)
-                    .child(Services.class, new ServicesKey(serviceName));
-            Services service = ModelMappingUtils.mappingServices(input, null);
-            writeTx.put(LogicalDatastoreType.OPERATIONAL, iid, service);
+            writeTx.put(
+                LogicalDatastoreType.OPERATIONAL,
+                InstanceIdentifier.create(ServiceList.class)
+                    .child(Services.class, new ServicesKey(serviceName)),
+                ModelMappingUtils.mappingServices(input, null));
             try {
                 writeTx.commit().get(Timeouts.DATASTORE_WRITE, TimeUnit.MILLISECONDS);
                 return null;
@@ -441,15 +456,18 @@ public class ServiceDataStoreOperationsImpl implements ServiceDataStoreOperation
          * Modify / Delete Service.
          */
         InstanceIdentifier<Services> iid =
-                InstanceIdentifier.create(ServiceList.class).child(Services.class, new ServicesKey(serviceName));
-        ServicesBuilder service = new ServicesBuilder(readService.get());
+            InstanceIdentifier.create(ServiceList.class).child(Services.class, new ServicesKey(serviceName));
         String action = null;
         switch (choice) {
             case 0 : /* Modify. */
                 LOG.debug("Modifying '{}' Service", serviceName);
-                service.setOperationalState(State.InService)
-                    .setAdministrativeState(AdminStates.InService);
-                writeTx.merge(LogicalDatastoreType.OPERATIONAL, iid, service.build());
+                writeTx.merge(
+                    LogicalDatastoreType.OPERATIONAL,
+                    iid,
+                    new ServicesBuilder(readService.orElseThrow())
+                        .setOperationalState(State.InService)
+                        .setAdministrativeState(AdminStates.InService)
+                        .build());
                 action = "modifyService";
                 break;
             case 1 : /* Delete */
diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/utils/CatalogDataUtils.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/utils/CatalogDataUtils.java
new file mode 100644 (file)
index 0000000..499c8c4
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Copyright © 2023 Fujitsu Network Communications, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.servicehandler.utils;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.sdnc.request.header.SdncRequestHeaderBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddOpenroadmOperationalModesToCatalogInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddOpenroadmOperationalModesToCatalogInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddSpecificOperationalModesToCatalogInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddSpecificOperationalModesToCatalogInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.add.openroadm.operational.modes.to.catalog.input.OperationalModeInfoBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.add.openroadm.operational.modes.to.catalog.input.operational.mode.info.AmplifiersBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.add.openroadm.operational.modes.to.catalog.input.operational.mode.info.GridParametersBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.add.openroadm.operational.modes.to.catalog.input.operational.mode.info.RoadmsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.add.openroadm.operational.modes.to.catalog.input.operational.mode.info.XpondersPluggablesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.add.openroadm.operational.modes.to.catalog.input.operational.mode.info.xponders.pluggables.XponderPluggableOpenroadmOperationalModeBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.add.openroadm.operational.modes.to.catalog.input.operational.mode.info.xponders.pluggables.XponderPluggableOpenroadmOperationalModeKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.add.specific.operational.modes.to.catalog.input.operational.mode.info.SpecificOperationalModesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.add.specific.operational.modes.to.catalog.input.operational.mode.info.specific.operational.modes.SpecificOperationalModeBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.add.specific.operational.modes.to.catalog.input.operational.mode.info.specific.operational.modes.SpecificOperationalModeKey;
+
+public final class CatalogDataUtils {
+
+    private CatalogDataUtils() {
+
+    }
+
+    public static AddOpenroadmOperationalModesToCatalogInput buildAddORToCatalogInput() {
+        XponderPluggableOpenroadmOperationalModeKey key =
+            new XponderPluggableOpenroadmOperationalModeKey("testOROperationalMode");
+        return new AddOpenroadmOperationalModesToCatalogInputBuilder()
+            .setSdncRequestHeader(new SdncRequestHeaderBuilder()
+                .setRequestId("load-OM-Catalog")
+                .setRequestSystemId("appname")
+                .setRpcAction(RpcActions.FillCatalogWithOrOperationalModes)
+                .build())
+            .setOperationalModeInfo(new OperationalModeInfoBuilder()
+                .setGridParameters(new GridParametersBuilder().build())
+                .setXpondersPluggables(
+                    new XpondersPluggablesBuilder()
+                        .setXponderPluggableOpenroadmOperationalMode(new HashMap<>(Map.of(
+                            key,
+                            new XponderPluggableOpenroadmOperationalModeBuilder()
+                                .setOpenroadmOperationalModeId(key.toString())
+                                .build())))
+                        .build())
+                .setRoadms(new RoadmsBuilder().build())
+                .setAmplifiers(new AmplifiersBuilder().build())
+                .build())
+            .build();
+    }
+
+    public static AddSpecificOperationalModesToCatalogInput buildAddSpecificToCatalogInput() {
+        SpecificOperationalModeKey key = new SpecificOperationalModeKey("testSpecificOperationalMode");
+        return new AddSpecificOperationalModesToCatalogInputBuilder()
+            .setSdncRequestHeader(new SdncRequestHeaderBuilder()
+                .setRequestId("load-specific-OM-Catalog")
+                .setRequestSystemId("test")
+                .setRpcAction(RpcActions.FillCatalogWithSpecificOperationalModes)
+                .build())
+            .setOperationalModeInfo(new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                    .add.specific.operational.modes.to.catalog.input.OperationalModeInfoBuilder()
+                .setSpecificOperationalModes(
+                    new SpecificOperationalModesBuilder()
+                        .setSpecificOperationalMode(
+                            new HashMap<>(Map.of(
+                                key,
+                                new SpecificOperationalModeBuilder()
+                                    .setOperationalModeId(key.toString())
+                                    .build()))
+                            )
+                        .build())
+                .build())
+            .build();
+    }
+}
diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/validation/CatalogValidation.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/validation/CatalogValidation.java
new file mode 100644 (file)
index 0000000..790c3a7
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright © 2023 Fujitsu Network Communications, Inc. and others. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.servicehandler.validation;
+
+import org.opendaylight.transportpce.common.OperationResult;
+import org.opendaylight.transportpce.servicehandler.CatalogInput;
+import org.opendaylight.transportpce.servicehandler.validation.checks.ComplianceCheckResult;
+import org.opendaylight.transportpce.servicehandler.validation.checks.ServicehandlerComplianceCheck;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public final class CatalogValidation {
+
+    private CatalogValidation() {
+    }
+
+    private static final Logger LOG = LoggerFactory.getLogger(CatalogValidation.class);
+
+    public static OperationResult validateORCatalogRequest(CatalogInput input, RpcActions rpcActions) {
+        /*
+         * -OR request header and operational mode info compliance are verified.
+         */
+        LOG.debug("checking OR Catalog Compliance ...");
+        ComplianceCheckResult serviceHandlerCheckResult = ServicehandlerComplianceCheck.checkORCatalog(
+                input.getSdncRequestHeader(), input.getOperationalModeInfo(), rpcActions, true);
+        if (!serviceHandlerCheckResult.hasPassed()) {
+            return OperationResult.failed(serviceHandlerCheckResult.getMessage());
+        }
+        LOG.debug("Catalog OR request compliant !");
+        return OperationResult.ok("Validation successful.");
+    }
+
+    public static OperationResult validateSpecificCatalogRequest(CatalogInput input, RpcActions rpcActions) {
+        /*
+         * -Specific request header and operational mode info compliance are verified.
+         */
+        LOG.debug("checking specific Catalog Compliance ...");
+        ComplianceCheckResult serviceHandlerCheckResult = ServicehandlerComplianceCheck.checkSpecificCatalog(
+                input.getSdncRequestHeader(), input.getOperationalModeInfoSpecific(), rpcActions, true);
+        if (!serviceHandlerCheckResult.hasPassed()) {
+            return OperationResult.failed(serviceHandlerCheckResult.getMessage());
+        }
+        LOG.debug("Catalog specific request compliant !");
+        return OperationResult.ok("Validation successful.");
+    }
+}
index 93f80eca1ae333ba1a440e6aacb2a4d01e36de39..156f9674619a147f01a2970890f48e19034309f0 100644 (file)
@@ -14,10 +14,11 @@ import org.opendaylight.transportpce.servicehandler.ServiceInput;
 import org.opendaylight.transportpce.servicehandler.validation.checks.CheckCoherencyHardSoft;
 import org.opendaylight.transportpce.servicehandler.validation.checks.ComplianceCheckResult;
 import org.opendaylight.transportpce.servicehandler.validation.checks.ServicehandlerComplianceCheck;
+import org.opendaylight.transportpce.servicehandler.validation.checks.ServicehandlerServiceResiliencyCheck;
 import org.opendaylight.transportpce.servicehandler.validation.checks.ServicehandlerTxRxCheck;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ConnectionType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.RpcActions;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.sdnc.request.header.SdncRequestHeader;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ConnectionType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.sdnc.request.header.SdncRequestHeader;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -82,6 +83,18 @@ public final class ServiceCreateValidation {
         } else {
             LOG.warn("Common-id not specified !");
         }
+
+        if (input.getServiceResiliency() != null) {
+            LOG.debug("Service-resiliency specified");
+            ComplianceCheckResult complianceCheckResult = ServicehandlerServiceResiliencyCheck
+                    .check(input.getServiceResiliency());
+            if (complianceCheckResult.hasPassed()) {
+                LOG.debug("Service-resiliency checked !");
+            } else {
+                return OperationResult.failed(complianceCheckResult.getMessage());
+            }
+        }
+
         return OperationResult.ok("Validation successful.");
     }
 
index 851b2c9f1bdc4b25455285e76eae00120fed463c..bd70ae9ee7eb298424711a129c9f9b2383d5f816 100644 (file)
@@ -8,8 +8,8 @@
 
 package org.opendaylight.transportpce.servicehandler.validation.checks;
 
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.HardConstraints;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.SoftConstraints;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.HardConstraints;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.SoftConstraints;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
index 85b8a1d08c9ffef2d029bf27278c308618306ea6..c7f6f2c140305e2655327ccc09a27386b93bf8fe 100644 (file)
@@ -7,9 +7,12 @@
  */
 package org.opendaylight.transportpce.servicehandler.validation.checks;
 
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ConnectionType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.RpcActions;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.sdnc.request.header.SdncRequestHeader;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ConnectionType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.sdnc.request.header.SdncRequestHeader;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.add.openroadm.operational.modes.to.catalog.input.OperationalModeInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Class for checking service sdnc-request-header compliance.
@@ -17,6 +20,8 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev2
  */
 public final class ServicehandlerComplianceCheck {
 
+    private static final Logger LOG = LoggerFactory.getLogger(ServicehandlerComplianceCheck.class);
+
     // This is class is public so that these messages can be accessed from Junit (avoid duplications).
     public static final class LogMessages {
 
@@ -26,6 +31,12 @@ public final class ServicehandlerComplianceCheck {
         public static final String RPCACTION_NOT_SET;
         public static final String HEADER_NOT_SET;
 
+        public static final String CATALOG_REQUESTID_NOT_SET;
+        public static final String CATALOG_HEADER_NOT_SET;
+        public static final String CATALOG_REQUESTSYSTEMID_NOT_SET;
+        public static final String CATALOG_RPCACTION_NOT_SET;
+        public static final String CATALOG_OPERATIONAL_MODE_INFO_NOT_SET;
+
         // Static blocks are generated once and spare memory.
         static {
             SERVICENAME_NOT_SET = "Service Name (common-id for Temp service) is not set";
@@ -33,6 +44,11 @@ public final class ServicehandlerComplianceCheck {
             REQUESTID_NOT_SET = "Service sdncRequestHeader 'request-id' is not set";
             RPCACTION_NOT_SET = "Service sdncRequestHeader 'rpc-action' is not set";
             HEADER_NOT_SET = "Service sdncRequestHeader is not set";
+            CATALOG_REQUESTID_NOT_SET = "sdnc-request-header 'request-id' is not set";
+            CATALOG_REQUESTSYSTEMID_NOT_SET = "sdnc-request-header 'request-system-id' is not set";
+            CATALOG_HEADER_NOT_SET = "sdnc-request-header is not set";
+            CATALOG_RPCACTION_NOT_SET = "sdnc-request-header 'rpc-action' is not set";
+            CATALOG_OPERATIONAL_MODE_INFO_NOT_SET = "operational-mode-info is not set";
         }
 
         public static String rpcactionsDiffers(RpcActions action1, RpcActions action2) {
@@ -40,6 +56,11 @@ public final class ServicehandlerComplianceCheck {
                 "Service sdncRequestHeader rpc-action '" + action1.name() + "' not equal to '" + action2.name() + "'";
         }
 
+        public static String catalogRpcactionsDiffers(RpcActions action1, RpcActions action2) {
+            return
+                "Catalog sdnc-request-header rpc-action '" + action1.name() + "' not equal to '" + action2.name() + "'";
+        }
+
         private LogMessages() {
         }
     }
@@ -52,7 +73,7 @@ public final class ServicehandlerComplianceCheck {
      * @return true if String ok false if not
      */
     public static boolean checkString(String value) {
-        return ((value != null) && (!value.isEmpty()));
+        return value != null && !value.isEmpty();
     }
 
     /**
@@ -86,11 +107,10 @@ public final class ServicehandlerComplianceCheck {
             if (sdncRequestHeader == null) {
                 return new ComplianceCheckResult(false, LogMessages.HEADER_NOT_SET);
             }
-            RpcActions serviceAction = sdncRequestHeader.getRpcAction();
-            String requestId = sdncRequestHeader.getRequestId();
-            if (!checkString(requestId)) {
+            if (!checkString(sdncRequestHeader.getRequestId())) {
                 return new ComplianceCheckResult(false, LogMessages.REQUESTID_NOT_SET);
             }
+            RpcActions serviceAction = sdncRequestHeader.getRpcAction();
             if (serviceAction == null) {
                 return new ComplianceCheckResult(false, LogMessages.RPCACTION_NOT_SET);
             }
@@ -101,6 +121,56 @@ public final class ServicehandlerComplianceCheck {
         return new ComplianceCheckResult(true, "");
     }
 
+    public static ComplianceCheckResult checkORCatalog(SdncRequestHeader sdncRequestHeader,
+                                                       OperationalModeInfo operationalModeInfo, RpcActions action,
+                                                       Boolean sdncRequest) {
+        String resultMsg = sdncRequestHeaderValidate(sdncRequest, sdncRequestHeader, action).getMessage();
+        if (resultMsg.contains("sdnc-request-header")) {
+            return new ComplianceCheckResult(false, resultMsg);
+        }
+        if (operationalModeInfo == null) {
+            return new ComplianceCheckResult(false, LogMessages.CATALOG_OPERATIONAL_MODE_INFO_NOT_SET);
+        }
+        return new ComplianceCheckResult(true, "");
+    }
+
+    public static ComplianceCheckResult checkSpecificCatalog(SdncRequestHeader sdncRequestHeader,
+            org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                .add.specific.operational.modes.to.catalog.input.OperationalModeInfo operationalModeInfoSpecific,
+            RpcActions action, Boolean sdncRequest) {
+        String resultMsg = sdncRequestHeaderValidate(sdncRequest, sdncRequestHeader, action).getMessage();
+        if (resultMsg.contains("sdnc-request-header")) {
+            return new ComplianceCheckResult(false,resultMsg);
+        }
+        if (operationalModeInfoSpecific == null) {
+            return new ComplianceCheckResult(false, LogMessages.CATALOG_OPERATIONAL_MODE_INFO_NOT_SET);
+        }
+        return new ComplianceCheckResult(true, "");
+    }
+
+    public static ComplianceCheckResult sdncRequestHeaderValidate(Boolean sdncRequest,
+            SdncRequestHeader sdncRequestHeader, RpcActions action) {
+        if (sdncRequest) {
+            if (sdncRequestHeader == null) {
+                return new ComplianceCheckResult(false, LogMessages.CATALOG_HEADER_NOT_SET);
+            }
+            if (!checkString(sdncRequestHeader.getRequestId())) {
+                return new ComplianceCheckResult(false, LogMessages.CATALOG_REQUESTID_NOT_SET);
+            }
+            if (!checkString(sdncRequestHeader.getRequestSystemId())) {
+                return new ComplianceCheckResult(false, LogMessages.CATALOG_REQUESTSYSTEMID_NOT_SET);
+            }
+            RpcActions serviceAction = sdncRequestHeader.getRpcAction();
+            if (serviceAction == null) {
+                return new ComplianceCheckResult(false, LogMessages.CATALOG_RPCACTION_NOT_SET);
+            }
+            if (serviceAction.compareTo(action) != 0) {
+                return new ComplianceCheckResult(false, LogMessages.catalogRpcactionsDiffers(serviceAction, action));
+            }
+        }
+        return new ComplianceCheckResult(true, "");
+    }
+
     private ServicehandlerComplianceCheck() {
     }
 
diff --git a/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/validation/checks/ServicehandlerServiceResiliencyCheck.java b/servicehandler/src/main/java/org/opendaylight/transportpce/servicehandler/validation/checks/ServicehandlerServiceResiliencyCheck.java
new file mode 100644 (file)
index 0000000..7d82bd0
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * Copyright © 2022 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.servicehandler.validation.checks;
+
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.resiliency.ServiceResiliency;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Class to check compliance of service-resiliency input.
+ */
+public final class ServicehandlerServiceResiliencyCheck {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ServicehandlerServiceResiliencyCheck.class);
+    public static final String LOG_ATTRIBUTE_NOT_DEDICATED = "An attribute not dedicated for this type of "
+            + "resiliency was filled";
+    public static final String LOG_RESILIENCY_TYPE_UNMANAGED = "Resiliency unmanaged for compliance check !";
+    public static final String LOG_RESILIENCY_NULL = "Resiliency is null !";
+
+    /**
+     * Function to check coherency of service-resiliency inputs.
+     *
+     * @param serviceResiliency ServiceResiliency to check
+     * @return <code> true </code>  if coherent
+     *         <code> false </code> otherwise
+     */
+    public static ComplianceCheckResult check(ServiceResiliency serviceResiliency) {
+        if (serviceResiliency.getResiliency() == null) {
+            LOG.warn(LOG_RESILIENCY_NULL);
+            return new ComplianceCheckResult(false, LOG_RESILIENCY_NULL);
+        }
+        String serviceResiliencyType = serviceResiliency.getResiliency().toString().split("\\{")[0];
+        switch (serviceResiliencyType) {
+            case "Unprotected":
+                return checkUnprotectedResiliency(serviceResiliency);
+            case "UnprotectedDiverselyRouted":
+                return checkUnprotectedDiverselyRoutedResiliency(serviceResiliency);
+            case "Protected":
+                return checkProtectedResiliency(serviceResiliency);
+            case "Restorable":
+            case "ExternalTriggerRestorable":
+                return checkRestorableAndExternalTriggerRestorableResiliency(serviceResiliency);
+            default:
+                LOG.warn(LOG_RESILIENCY_TYPE_UNMANAGED);
+                return new ComplianceCheckResult(false, LOG_RESILIENCY_TYPE_UNMANAGED);
+        }
+    }
+
+    private static ComplianceCheckResult checkUnprotectedResiliency(ServiceResiliency serviceResiliency) {
+        return serviceResiliency.getRevertive() == null
+                && serviceResiliency.getWaitToRestore() == null
+                && serviceResiliency.getHoldoffTime() == null
+                && serviceResiliency.getPreCalculatedBackupPathNumber() == null
+                && serviceResiliency.getCoupledService() == null
+                    ? new ComplianceCheckResult(true, "")
+                    : new ComplianceCheckResult(false, LOG_ATTRIBUTE_NOT_DEDICATED);
+    }
+
+    private static ComplianceCheckResult checkUnprotectedDiverselyRoutedResiliency(
+            ServiceResiliency serviceResiliency) {
+        return serviceResiliency.getRevertive() == null
+                && serviceResiliency.getWaitToRestore() == null
+                && serviceResiliency.getHoldoffTime() == null
+                && serviceResiliency.getPreCalculatedBackupPathNumber() == null
+                    ? new ComplianceCheckResult(true, "")
+                    : new ComplianceCheckResult(false, LOG_ATTRIBUTE_NOT_DEDICATED);
+    }
+
+    private static ComplianceCheckResult checkProtectedResiliency(ServiceResiliency serviceResiliency) {
+        return (serviceResiliency.getWaitToRestore() == null
+                || (serviceResiliency.getRevertive() != null && serviceResiliency.getRevertive()))
+                && serviceResiliency.getPreCalculatedBackupPathNumber() == null
+                && serviceResiliency.getCoupledService() == null
+                    ? new ComplianceCheckResult(true, "")
+                    : new ComplianceCheckResult(false, LOG_ATTRIBUTE_NOT_DEDICATED);
+    }
+
+    private static ComplianceCheckResult checkRestorableAndExternalTriggerRestorableResiliency(
+            ServiceResiliency serviceResiliency) {
+        return (serviceResiliency.getWaitToRestore() == null
+                || (serviceResiliency.getRevertive() != null && serviceResiliency.getRevertive()))
+                && serviceResiliency.getCoupledService() == null
+                    ? new ComplianceCheckResult(true, "")
+                    : new ComplianceCheckResult(false, LOG_ATTRIBUTE_NOT_DEDICATED);
+    }
+
+    private ServicehandlerServiceResiliencyCheck() {
+    }
+}
index 8de3102ef7ba96548ccae0a98961ece8670572fc..f267cfc7cc6c1cd6dfa7ba5f05e6a7aff552b1b5 100644 (file)
@@ -9,7 +9,7 @@
 package org.opendaylight.transportpce.servicehandler.validation.checks;
 
 import org.opendaylight.transportpce.servicehandler.ServiceEndpointType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ServiceEndpoint;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ServiceEndpoint;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
 
 /**
diff --git a/servicehandler/src/main/resources/OSGI-INF/blueprint/servicehandler-blueprint.xml b/servicehandler/src/main/resources/OSGI-INF/blueprint/servicehandler-blueprint.xml
deleted file mode 100644 (file)
index 5001049..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- vi: set et smarttab sw=4 tabstop=4: -->
-<!--
-Copyright © 2017 Orange and others. All rights reserved.
-
-This program and the accompanying materials are made available under the
-terms of the Eclipse Public License v1.0 which accompanies this distribution,
-and is available at http://www.eclipse.org/legal/epl-v10.html
-
-Author: Martial Coulibaly <martial.coulibaly@gfi.com> on behalf of Orange
--->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
-  xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
-  odl:use-default-for-reference-types="true">
-
-    <reference id="rpcService"
-          interface="org.opendaylight.mdsal.binding.api.RpcProviderService"/>
-
-    <reference id="dataBroker"
-          interface="org.opendaylight.mdsal.binding.api.DataBroker"/>
-
-    <reference id="notificationService"
-          interface="org.opendaylight.mdsal.binding.api.NotificationService"/>
-
-    <reference id="notificationPublishService"
-          interface="org.opendaylight.mdsal.binding.api.NotificationPublishService"/>
-
-    <reference id="pathComputationService"
-          interface="org.opendaylight.transportpce.pce.service.PathComputationService"/>
-
-    <reference id="rendererServiceOperations"
-             interface="org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations" />
-    <reference id="networkModelService" interface="org.opendaylight.transportpce.networkmodel.service.NetworkModelService"/>
-
-    <bean id="serviceDatastoreOperation" class="org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperationsImpl">
-        <argument ref="dataBroker"/>
-      </bean>
-
-    <bean id="pceListener" class="org.opendaylight.transportpce.servicehandler.listeners.PceListenerImpl">
-        <argument ref="rendererServiceOperations" />
-        <argument ref="pathComputationService" />
-        <argument ref="notificationPublishService" />
-        <argument ref="serviceDatastoreOperation" />
-    </bean>
-
-    <bean id="serviceListener" class="org.opendaylight.transportpce.servicehandler.listeners.ServiceListener">
-        <argument ref="dataBroker" />
-        <argument ref="notificationPublishService" />
-    </bean>
-
-    <bean id="rendererListener" class="org.opendaylight.transportpce.servicehandler.listeners.RendererListenerImpl">
-        <argument ref="pathComputationService" />
-        <argument ref="notificationPublishService" />
-        <argument ref="networkModelService" />
-    </bean>
-
-    <bean id="networkModelListener" class="org.opendaylight.transportpce.servicehandler.listeners.NetworkModelListenerImpl">
-        <argument ref="notificationPublishService" />
-        <argument ref="serviceDatastoreOperation" />
-    </bean>
-
-    <bean id="serviceHandlerImpl" class="org.opendaylight.transportpce.servicehandler.impl.ServicehandlerImpl">
-        <argument ref="dataBroker"/>
-        <argument ref="pathComputationService" />
-        <argument ref="notificationPublishService" />
-        <argument ref="rendererServiceOperations" />
-        <argument ref="pceListener" />
-        <argument ref="rendererListener" />
-        <argument ref="networkModelListener" />
-        <argument ref="serviceDatastoreOperation" />
-    </bean>
-
-    <bean id="provider"
-          class="org.opendaylight.transportpce.servicehandler.impl.ServicehandlerProvider"
-          init-method="init" destroy-method="close">
-        <argument ref="rpcService" />
-        <argument ref="dataBroker" />
-        <argument ref="notificationService" />
-        <argument ref="serviceDatastoreOperation" />
-        <argument ref="pceListener" />
-        <argument ref="serviceListener" />
-        <argument ref="rendererListener" />
-        <argument ref="networkModelListener" />
-        <argument ref="serviceHandlerImpl" />
-    </bean>
-
-    <service ref="serviceHandlerImpl"
-        interface="org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OrgOpenroadmServiceService"/>
-
-    <service ref="serviceDatastoreOperation"
-             interface="org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations"/>
-
-</blueprint>
index 61596966ebe50196b155fbde00acfba310d5fac4..b3bcaa70c0f5a32ba49e8b6c73c933386464c377 100644 (file)
@@ -7,28 +7,28 @@
  */
 package org.opendaylight.transportpce.servicehandler;
 
+import static org.hamcrest.CoreMatchers.hasItems;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
 import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.opendaylight.transportpce.servicehandler.utils.ConstraintsUtils.buildHardConstraint;
 import static org.opendaylight.transportpce.servicehandler.utils.ConstraintsUtils.buildSoftConstraint;
 
-import java.util.Arrays;
-import java.util.List;
+import java.util.Set;
 import org.hamcrest.collection.IsMapContaining;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.DiversityConstraints.DiversityType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.common.constraints.LinkIdentifierKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.diversity.existing.service.constraints.ServiceIdentifierListKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.HardConstraints;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.HardConstraintsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.SoftConstraints;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.DiversityConstraints.DiversityType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.common.constraints.LinkIdentifierBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.diversity.existing.service.constraints.ServiceIdentifierListKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.HardConstraints;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.HardConstraintsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.SoftConstraints;
 
 /**
  * Class to test downgrading and updating Constraints .
@@ -38,7 +38,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev21
 public class DowngradeConstraintsTest {
 
     @Test
-    public void testUpdateSoftConstraintsForCustomerCode() {
+    void testUpdateSoftConstraintsForCustomerCode() {
         // test no addition when hard customer-code is null or empty
         HardConstraints initialHardConstraints =
             buildHardConstraint(null, false, null, null, null, null, false, false, null, null);
@@ -46,9 +46,9 @@ public class DowngradeConstraintsTest {
             buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
         SoftConstraints generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertNull("updated soft constraints should contain no customer code",
-            generatedSoftConstraints.getCustomerCode());
-        List<String> softCustomerCode = Arrays.asList("soft-customer-code 3", "soft-customer-code 4");
+        assertNull(generatedSoftConstraints.getCustomerCode(),
+            "updated soft constraints should contain no customer code");
+        Set<String> softCustomerCode = Set.of("soft-customer-code 3", "soft-customer-code 4");
         initialSoftConstraints =
             buildSoftConstraint(softCustomerCode, false, null, null, null, null, false, false, null, null);
         generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
@@ -56,20 +56,19 @@ public class DowngradeConstraintsTest {
         assertEquals(initialSoftConstraints.getCustomerCode(), generatedSoftConstraints.getCustomerCode());
 
         // test addition of hard customer-code when no soft customer-code
-        List<String> hardCustomerCode = Arrays.asList("hard-customer-code 1", "hard-customer-code 2");
+        Set<String> hardCustomerCode = Set.of("hard-customer-code 1", "hard-customer-code 2");
         initialHardConstraints =
             buildHardConstraint(hardCustomerCode, false, null, null, null, null, false, false, null, null);
         initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
         generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertEquals("updated soft constraints should contain the customer code of hard constraint",
-            generatedSoftConstraints.getCustomerCode(),
-            initialHardConstraints.getCustomerCode());
+        assertEquals(generatedSoftConstraints.getCustomerCode(),initialHardConstraints.getCustomerCode(),
+            "updated soft constraints should contain the customer code of hard constraint");
         // test addition of hard customer-code when existing soft customer-code
         initialSoftConstraints =
             buildSoftConstraint(softCustomerCode, false, null, null, null, null, false, false, null, null);
         generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
-            initialHardConstraints, initialSoftConstraints);
+                initialHardConstraints, initialSoftConstraints);
         assertThat("updated soft constraints should contain 4 customer code",
             generatedSoftConstraints.getCustomerCode(), hasSize(4));
         assertThat(generatedSoftConstraints.getCustomerCode(),
@@ -78,16 +77,16 @@ public class DowngradeConstraintsTest {
     }
 
     @Test
-    public void testUpdateSoftConstraintsForDiversity() {
+    void testUpdateSoftConstraintsForDiversity() {
         HardConstraints initialHardConstraints =
             buildHardConstraint(null, false, null, null, null, null, false, false, null, null);
         SoftConstraints initialSoftConstraints =
             buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
         SoftConstraints generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertNull("updated soft constraints should contain no diversity constraint",
-            generatedSoftConstraints.getDiversity());
-        List<String> softDiversityServiceid = Arrays.asList("soft-service 3");
+        assertNull(generatedSoftConstraints.getDiversity(),
+            "updated soft constraints should contain no diversity constraint");
+        Set<String> softDiversityServiceid = Set.of("soft-service 3");
         initialSoftConstraints =
             buildSoftConstraint(null, false, softDiversityServiceid, null, null, null, false, false, null, null);
         generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
@@ -95,15 +94,14 @@ public class DowngradeConstraintsTest {
         assertEquals(initialSoftConstraints.getDiversity(), generatedSoftConstraints.getDiversity());
 
         // test addition of hard diversity when no soft diversity
-        List<String> hardDiversityServiceid = Arrays.asList("hard-service 1", "hard-service 2");
+        Set<String> hardDiversityServiceid = Set.of("hard-service 1", "hard-service 2");
         initialHardConstraints =
             buildHardConstraint(null, false, hardDiversityServiceid, null, null, null, false, false, null, null);
         initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
         generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertEquals("updated soft constraints should contain the diversity of hard constraint",
-            generatedSoftConstraints.getDiversity(),
-            initialHardConstraints.getDiversity());
+        assertEquals(generatedSoftConstraints.getDiversity(), initialHardConstraints.getDiversity(),
+            "updated soft constraints should contain the diversity of hard constraint");
 
         // test addition of hard diversity when existing soft diversity
         initialSoftConstraints =
@@ -112,9 +110,8 @@ public class DowngradeConstraintsTest {
             initialHardConstraints, initialSoftConstraints);
         assertThat("updated soft constraints should contain diversity with 3 services",
             generatedSoftConstraints.getDiversity().getServiceIdentifierList().size(), is(3));
-        assertEquals("updated soft constraints should have diversity type of serial",
-            DiversityType.Serial,
-            generatedSoftConstraints.getDiversity().getDiversityType());
+        assertEquals(DiversityType.Serial, generatedSoftConstraints.getDiversity().getDiversityType(),
+            "updated soft constraints should have diversity type of serial");
         assertThat(generatedSoftConstraints.getDiversity().getServiceIdentifierList(),
             IsMapContaining.hasKey(new ServiceIdentifierListKey("hard-service 1")));
         assertThat(generatedSoftConstraints.getDiversity().getServiceIdentifierList(),
@@ -124,21 +121,21 @@ public class DowngradeConstraintsTest {
     }
 
     @Test
-    public void testUpdateSoftConstraintsForExclude() {
+    void testUpdateSoftConstraintsForExclude() {
         HardConstraints initialHardConstraints =
             buildHardConstraint(null, false, null, null, null, null, false, false, null, null);
         SoftConstraints initialSoftConstraints =
             buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
         SoftConstraints generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertNull("updated soft constraints should contain no exclude constraint",
-            generatedSoftConstraints.getExclude());
+        assertNull(generatedSoftConstraints.getExclude(),
+            "updated soft constraints should contain no exclude constraint");
 
         initialSoftConstraints = buildSoftConstraint(null, false, null, "link", null, null, false, false, null, null);
         generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertEquals("updated soft constraints should not be changed",
-            initialSoftConstraints.getExclude(), generatedSoftConstraints.getExclude());
+        assertEquals(initialSoftConstraints.getExclude(), generatedSoftConstraints.getExclude(),
+            "updated soft constraints should not be changed");
 
         // test addition of hard exclude with fiber list when no soft exclude
         initialHardConstraints =
@@ -146,8 +143,8 @@ public class DowngradeConstraintsTest {
         initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
         generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertEquals("updated soft constraints should contain the exclude constraint of hard constraint",
-            generatedSoftConstraints.getExclude(), initialHardConstraints.getExclude());
+        assertEquals(generatedSoftConstraints.getExclude(), initialHardConstraints.getExclude(),
+            "updated soft constraints should contain the exclude constraint of hard constraint");
 
         // test addition of hard exclude with fiber list when existing soft
         // exclude with fiber list
@@ -165,8 +162,8 @@ public class DowngradeConstraintsTest {
         initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
         generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertEquals("updated soft constraints should contain the exclude constraint of hard constraint",
-            generatedSoftConstraints.getExclude(), initialHardConstraints.getExclude());
+        assertEquals(generatedSoftConstraints.getExclude(), initialHardConstraints.getExclude(),
+            "updated soft constraints should contain the exclude constraint of hard constraint");
 
         // test addition of hard exclude with link list when existing soft
         // exclude with link list
@@ -175,30 +172,30 @@ public class DowngradeConstraintsTest {
             initialHardConstraints, initialSoftConstraints);
         assertThat("updated soft constraints should contain exclude with 3 links",
             generatedSoftConstraints.getExclude().getLinkIdentifier().size(), is(3));
-        assertThat(generatedSoftConstraints.getExclude().getLinkIdentifier(),
-            IsMapContaining.hasKey(new LinkIdentifierKey("link-id 1", "openroadm-topology")));
-        assertThat(generatedSoftConstraints.getExclude().getLinkIdentifier(),
-            IsMapContaining.hasKey(new LinkIdentifierKey("link-id 2", "openroadm-topology")));
-        assertThat(generatedSoftConstraints.getExclude().getLinkIdentifier(),
-            IsMapContaining.hasKey(new LinkIdentifierKey("link-id 3", "openroadm-topology")));
+        assertThat(generatedSoftConstraints.getExclude().getLinkIdentifier(), hasItems(new LinkIdentifierBuilder()
+            .setLinkId("link-id 1").setLinkNetworkId("openroadm-topology").build()));
+        assertThat(generatedSoftConstraints.getExclude().getLinkIdentifier(), hasItems(new LinkIdentifierBuilder()
+            .setLinkId("link-id 2").setLinkNetworkId("openroadm-topology").build()));
+        assertThat(generatedSoftConstraints.getExclude().getLinkIdentifier(), hasItems(new LinkIdentifierBuilder()
+            .setLinkId("link-id 3").setLinkNetworkId("openroadm-topology").build()));
     }
 
     @Test
-    public void testUpdateSoftConstraintsForInclude() {
+    void testUpdateSoftConstraintsForInclude() {
         HardConstraints initialHardConstraints =
             buildHardConstraint(null, false, null, null, null, null, false, false, null, null);
         SoftConstraints initialSoftConstraints =
             buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
         SoftConstraints generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertNull("updated soft constraints should contain no include constraint",
-            generatedSoftConstraints.getInclude());
+        assertNull(generatedSoftConstraints.getInclude(),
+            "updated soft constraints should contain no include constraint");
 
         initialSoftConstraints = buildSoftConstraint(null, false, null, null, "link", null, false, false, null, null);
         generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertEquals("updated soft constraints should not be changed",
-            initialSoftConstraints.getInclude(), generatedSoftConstraints.getInclude());
+        assertEquals(initialSoftConstraints.getInclude(), generatedSoftConstraints.getInclude(),
+            "updated soft constraints should not be changed");
 
         // test addition of hard include with fiber list when no soft include
         initialHardConstraints =
@@ -206,8 +203,8 @@ public class DowngradeConstraintsTest {
         initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
         generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertEquals("updated soft constraints should contain the include constraint of hard constraint",
-            generatedSoftConstraints.getInclude(), initialHardConstraints.getInclude());
+        assertEquals(generatedSoftConstraints.getInclude(), initialHardConstraints.getInclude(),
+            "updated soft constraints should contain the include constraint of hard constraint");
 
         // test addition of hard include with fiber list when existing soft
         // include with fiber list
@@ -225,8 +222,8 @@ public class DowngradeConstraintsTest {
         initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
         generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertEquals("updated soft constraints should contain the include constraint of hard constraint",
-            generatedSoftConstraints.getInclude(), initialHardConstraints.getInclude());
+        assertEquals(generatedSoftConstraints.getInclude(), initialHardConstraints.getInclude(),
+            "updated soft constraints should contain the include constraint of hard constraint");
 
         // test addition of hard include with link list when existing soft
         // include with link list
@@ -235,33 +232,33 @@ public class DowngradeConstraintsTest {
             initialHardConstraints, initialSoftConstraints);
         assertThat("updated soft constraints should contain include with 3 links",
             generatedSoftConstraints.getInclude().getLinkIdentifier().size(), is(3));
-        assertThat(generatedSoftConstraints.getInclude().getLinkIdentifier(),
-            IsMapContaining.hasKey(new LinkIdentifierKey("link-id 1", "openroadm-topology")));
-        assertThat(generatedSoftConstraints.getInclude().getLinkIdentifier(),
-            IsMapContaining.hasKey(new LinkIdentifierKey("link-id 2", "openroadm-topology")));
-        assertThat(generatedSoftConstraints.getInclude().getLinkIdentifier(),
-            IsMapContaining.hasKey(new LinkIdentifierKey("link-id 3", "openroadm-topology")));
+        assertThat(generatedSoftConstraints.getInclude().getLinkIdentifier(), hasItems(new LinkIdentifierBuilder()
+                .setLinkId("link-id 1").setLinkNetworkId("openroadm-topology").build()));
+        assertThat(generatedSoftConstraints.getInclude().getLinkIdentifier(), hasItems(new LinkIdentifierBuilder()
+                .setLinkId("link-id 2").setLinkNetworkId("openroadm-topology").build()));
+        assertThat(generatedSoftConstraints.getInclude().getLinkIdentifier(), hasItems(new LinkIdentifierBuilder()
+                .setLinkId("link-id 3").setLinkNetworkId("openroadm-topology").build()));
     }
 
     @Test
-    public void testUpdateSoftConstraintsForLatency() {
+    void testUpdateSoftConstraintsForLatency() {
         HardConstraints initialHardConstraints =
             buildHardConstraint(null, false, null, null, null, null, false, false, null, null);
         SoftConstraints initialSoftConstraints =
             buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
         SoftConstraints generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertNull("updated soft constraints should contain no latency constraint",
-            generatedSoftConstraints.getLatency());
+        assertNull(generatedSoftConstraints.getLatency(),
+            "updated soft constraints should contain no latency constraint");
 
         initialSoftConstraints =
             buildSoftConstraint(null, false, null, null, null, Double.valueOf(12.2), false, false, null, null);
         generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertEquals("updated soft constraints should not be changed",
-            initialSoftConstraints.getLatency(), generatedSoftConstraints.getLatency());
-        assertEquals("updated soft constraints value should be '12.2'",
-            (float) 12.2, generatedSoftConstraints.getLatency().getMaxLatency().floatValue(), 0.0f);
+        assertEquals(initialSoftConstraints.getLatency(), generatedSoftConstraints.getLatency(),
+            "updated soft constraints should not be changed");
+        assertEquals((float) 12.2, generatedSoftConstraints.getLatency().getMaxLatency().floatValue(), 0.0f,
+            "updated soft constraints value should be '12.2'");
 
         // test addition of hard latency when no soft latency
         initialHardConstraints =
@@ -269,141 +266,141 @@ public class DowngradeConstraintsTest {
         initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
         generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertEquals("updated soft constraints value should be '16.59'",
-            (float) 16.59, generatedSoftConstraints.getLatency().getMaxLatency().floatValue(), 0.0f);
+        assertEquals((float) 16.59, generatedSoftConstraints.getLatency().getMaxLatency().floatValue(), 0.0f,
+            "updated soft constraints value should be '16.59'");
 
         // test addition of hard latency when existing different soft latency
         initialSoftConstraints =
             buildSoftConstraint(null, false, null, null, null, Double.valueOf(12.2), false, false, null, null);
         generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertEquals("updated soft constraints value should be '12.2'",
-            (float) 12.2, generatedSoftConstraints.getLatency().getMaxLatency().floatValue(), 0.0f);
+        assertEquals((float) 12.2, generatedSoftConstraints.getLatency().getMaxLatency().floatValue(), 0.0f,
+            "updated soft constraints value should be '12.2'");
     }
 
     @Test
-    public void testUpdateSoftConstraintsForDistance() {
+    void testUpdateSoftConstraintsForDistance() {
         HardConstraints initialHardConstraints =
             buildHardConstraint(null, false, null, null, null, null, false, false, null, null);
         SoftConstraints initialSoftConstraints =
             buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
         SoftConstraints generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertNull("updated soft constraints should contain no distance constraint",
-            generatedSoftConstraints.getDistance());
+        assertNull(generatedSoftConstraints.getDistance(),
+            "updated soft constraints should contain no distance constraint");
 
         initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, "750.2", null);
         generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertEquals("updated soft constraints should not be changed",
-            initialSoftConstraints.getDistance(), generatedSoftConstraints.getDistance());
-        assertEquals("updated soft constraints value should be '750.2'",
-            (float) 750.2, generatedSoftConstraints.getDistance().getMaxDistance().floatValue(), 0.0f);
+        assertEquals(initialSoftConstraints.getDistance(), generatedSoftConstraints.getDistance(),
+            "updated soft constraints should not be changed");
+        assertEquals((float) 750.2, generatedSoftConstraints.getDistance().getMaxDistance().floatValue(), 0.0f,
+            "updated soft constraints value should be '750.2'");
 
         // test addition of hard distance when no soft distance
         initialHardConstraints = buildHardConstraint(null, false, null, null, null, null, false, false, "555.5", null);
         initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
         generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertEquals("updated soft constraints value should be '555.5'",
-            (float) 555.5, generatedSoftConstraints.getDistance().getMaxDistance().floatValue(), 0.0f);
+        assertEquals((float) 555.5, generatedSoftConstraints.getDistance().getMaxDistance().floatValue(), 0.0f,
+            "updated soft constraints value should be '555.5'");
 
         // test addition of hard distance when existing different soft distance
         initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, "750.2", null);
         generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertEquals("updated soft constraints value should be '555.5'",
-            (float) 555.5, generatedSoftConstraints.getDistance().getMaxDistance().floatValue(), 0.0f);
+        assertEquals((float) 555.5, generatedSoftConstraints.getDistance().getMaxDistance().floatValue(), 0.0f,
+            "updated soft constraints value should be '555.5'");
     }
 
     @Test
-    public void testUpdateSoftConstraintsForHopCountAndTEmetric() {
+    void testUpdateSoftConstraintsForHopCountAndTEmetric() {
         HardConstraints initialHardConstraints =
             buildHardConstraint(null, false, null, null, null, null, false, false, null, null);
         SoftConstraints initialSoftConstraints =
             buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
         SoftConstraints generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertNull("updated soft constraints should contain no hop-count constraint",
-            generatedSoftConstraints.getHopCount());
+        assertNull(generatedSoftConstraints.getHopCount(),
+            "updated soft constraints should contain no hop-count constraint");
 
         initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, true, true, null, null);
         generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertEquals("updated soft constraints should not be changed",
-            initialSoftConstraints.getHopCount(), generatedSoftConstraints.getHopCount());
-        assertEquals("updated soft constraints max-wdm-hop-count should be '3'",
-            3, generatedSoftConstraints.getHopCount().getMaxWdmHopCount().intValue());
-        assertEquals("updated soft constraints max-otn-hop-count should be '5'",
-            5, generatedSoftConstraints.getHopCount().getMaxOtnHopCount().intValue());
-        assertEquals("updated soft constraints max-wdm-TE-metric should be '8'",
-            8, generatedSoftConstraints.getTEMetric().getMaxWdmTEMetric().intValue());
-        assertEquals("updated soft constraints max-otn-TE-metric should be '11'",
-            11, generatedSoftConstraints.getTEMetric().getMaxOtnTEMetric().intValue());
+        assertEquals(initialSoftConstraints.getHopCount(), generatedSoftConstraints.getHopCount(),
+            "updated soft constraints should not be changed");
+        assertEquals(3, generatedSoftConstraints.getHopCount().getMaxWdmHopCount().intValue(),
+            "updated soft constraints max-wdm-hop-count should be '3'");
+        assertEquals(5, generatedSoftConstraints.getHopCount().getMaxOtnHopCount().intValue(),
+            "updated soft constraints max-otn-hop-count should be '5'");
+        assertEquals(8, generatedSoftConstraints.getTEMetric().getMaxWdmTEMetric().intValue(),
+            "updated soft constraints max-wdm-TE-metric should be '8'");
+        assertEquals(11, generatedSoftConstraints.getTEMetric().getMaxOtnTEMetric().intValue(),
+            "updated soft constraints max-otn-TE-metric should be '11'");
 
         // test addition of hard hop-count when no soft hop-count
         initialHardConstraints = buildHardConstraint(null, false, null, null, null, null, true, true, null, null);
         initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
         generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertEquals("updated soft constraints should contain hard constraint",
-            initialHardConstraints.getHopCount(), generatedSoftConstraints.getHopCount());
-        assertEquals("updated soft constraints max-wdm-hop-count should be '3'",
-            3, generatedSoftConstraints.getHopCount().getMaxWdmHopCount().intValue());
-        assertEquals("updated soft constraints max-otn-hop-count should be '5'",
-            5, generatedSoftConstraints.getHopCount().getMaxOtnHopCount().intValue());
-        assertEquals("updated soft constraints max-wdm-TE-metric should be '8'",
-            8, generatedSoftConstraints.getTEMetric().getMaxWdmTEMetric().intValue());
-        assertEquals("updated soft constraints max-otn-TE-metric should be '11'",
-            11, generatedSoftConstraints.getTEMetric().getMaxOtnTEMetric().intValue());
+        assertEquals(initialHardConstraints.getHopCount(), generatedSoftConstraints.getHopCount(),
+            "updated soft constraints should contain hard constraint");
+        assertEquals(3, generatedSoftConstraints.getHopCount().getMaxWdmHopCount().intValue(),
+            "updated soft constraints max-wdm-hop-count should be '3'");
+        assertEquals(5, generatedSoftConstraints.getHopCount().getMaxOtnHopCount().intValue(),
+            "updated soft constraints max-otn-hop-count should be '5'");
+        assertEquals(8, generatedSoftConstraints.getTEMetric().getMaxWdmTEMetric().intValue(),
+            "updated soft constraints max-wdm-TE-metric should be '8'");
+        assertEquals(11, generatedSoftConstraints.getTEMetric().getMaxOtnTEMetric().intValue(),
+            "updated soft constraints max-otn-TE-metric should be '11'");
 
         // test addition of hard hop-count when existing soft hop-count
         initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, true, true, null, null);
         generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertEquals("updated soft constraints max-wdm-hop-count should be '3'",
-            3, generatedSoftConstraints.getHopCount().getMaxWdmHopCount().intValue());
-        assertEquals("updated soft constraints max-otn-hop-count should be '5'",
-            5, generatedSoftConstraints.getHopCount().getMaxOtnHopCount().intValue());
-        assertEquals("updated soft constraints max-wdm-TE-metric should be '8'",
-            8, generatedSoftConstraints.getTEMetric().getMaxWdmTEMetric().intValue());
-        assertEquals("updated soft constraints max-otn-TE-metric should be '11'",
-            11, generatedSoftConstraints.getTEMetric().getMaxOtnTEMetric().intValue());
+        assertEquals(3, generatedSoftConstraints.getHopCount().getMaxWdmHopCount().intValue(),
+            "updated soft constraints max-wdm-hop-count should be '3'");
+        assertEquals(5, generatedSoftConstraints.getHopCount().getMaxOtnHopCount().intValue(),
+            "updated soft constraints max-otn-hop-count should be '5'");
+        assertEquals(8, generatedSoftConstraints.getTEMetric().getMaxWdmTEMetric().intValue(),
+            "updated soft constraints max-wdm-TE-metric should be '8'");
+        assertEquals(11, generatedSoftConstraints.getTEMetric().getMaxOtnTEMetric().intValue(),
+            "updated soft constraints max-otn-TE-metric should be '11'");
     }
 
     @Test
-    public void testUpdateSoftConstraintsForCoRouting() {
+    void testUpdateSoftConstraintsForCoRouting() {
         HardConstraints initialHardConstraints =
             buildHardConstraint(null, false, null, null, null, null, false, false, null, null);
         SoftConstraints initialSoftConstraints =
             buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
         SoftConstraints generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertNull("updated soft constraints should contain no co-routing constraint",
-            generatedSoftConstraints.getCoRouting());
+        assertNull(generatedSoftConstraints.getCoRouting(),
+            "updated soft constraints should contain no co-routing constraint");
 
         initialSoftConstraints =
             buildSoftConstraint(null, false, null, null, null, null, true, false, null, "coRouting1");
         generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertEquals("updated soft constraints should not be changed",
-            initialSoftConstraints.getCoRouting(), generatedSoftConstraints.getCoRouting());
-        assertEquals("updated soft constraints should contain 2 co-routed services",
-            2, generatedSoftConstraints.getCoRouting().getServiceIdentifierList().size());
+        assertEquals(initialSoftConstraints.getCoRouting(), generatedSoftConstraints.getCoRouting(),
+            "updated soft constraints should not be changed");
+        assertEquals(2, generatedSoftConstraints.getCoRouting().getServiceIdentifierList().size(),
+            "updated soft constraints should contain 2 co-routed services");
         assertTrue(generatedSoftConstraints.getCoRouting().getServiceIdentifierList()
-            .get(new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co
+            .get(new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co
                     .routing.ServiceIdentifierListKey("service 1"))
             .getServiceApplicability().getEquipment().getRoadmSrg());
         assertNull(generatedSoftConstraints.getCoRouting().getServiceIdentifierList()
-            .get(new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co
+            .get(new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co
                         .routing.ServiceIdentifierListKey("service 1"))
             .getServiceApplicability().getLink());
         assertNull(generatedSoftConstraints.getCoRouting().getServiceIdentifierList()
-            .get(new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co
+            .get(new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co
                         .routing.ServiceIdentifierListKey("service 2"))
             .getServiceApplicability().getEquipment());
         assertTrue(generatedSoftConstraints.getCoRouting().getServiceIdentifierList()
-            .get(new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co
+            .get(new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co
                     .routing.ServiceIdentifierListKey("service 2"))
             .getServiceApplicability().getLink());
 
@@ -413,16 +410,16 @@ public class DowngradeConstraintsTest {
         initialSoftConstraints = buildSoftConstraint(null, false, null, null, null, null, false, false, null, null);
         generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertEquals("updated soft constraints should contain hard constraint",
-            initialHardConstraints.getCoRouting(), generatedSoftConstraints.getCoRouting());
-        assertEquals("updated soft constraints should contain 1 co-routed service",
-            1, generatedSoftConstraints.getCoRouting().getServiceIdentifierList().size());
+        assertEquals(initialHardConstraints.getCoRouting(), generatedSoftConstraints.getCoRouting(),
+            "updated soft constraints should contain hard constraint");
+        assertEquals(1, generatedSoftConstraints.getCoRouting().getServiceIdentifierList().size(),
+            "updated soft constraints should contain 1 co-routed service");
         assertTrue(generatedSoftConstraints.getCoRouting().getServiceIdentifierList()
-            .get(new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co
+            .get(new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co
                         .routing.ServiceIdentifierListKey("service 3"))
             .getServiceApplicability().getSite());
         assertNull(generatedSoftConstraints.getCoRouting().getServiceIdentifierList()
-            .get(new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co
+            .get(new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co
                         .routing.ServiceIdentifierListKey("service 3"))
             .getServiceApplicability().getLink());
 
@@ -431,77 +428,76 @@ public class DowngradeConstraintsTest {
             buildSoftConstraint(null, false, null, null, null, null, true, false, null, "coRouting1");
         generatedSoftConstraints = DowngradeConstraints.updateSoftConstraints(
             initialHardConstraints, initialSoftConstraints);
-        assertEquals("updated soft constraints should contain 3 co-routed service",
-            3, generatedSoftConstraints.getCoRouting().getServiceIdentifierList().size());
+        assertEquals(3, generatedSoftConstraints.getCoRouting().getServiceIdentifierList().size(),
+            "updated soft constraints should contain 3 co-routed service");
         assertThat(generatedSoftConstraints.getCoRouting().getServiceIdentifierList(),
             IsMapContaining.hasKey(
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co
                         .routing.ServiceIdentifierListKey("service 1")));
         assertThat(generatedSoftConstraints.getCoRouting().getServiceIdentifierList(),
             IsMapContaining.hasKey(
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co
                         .routing.ServiceIdentifierListKey("service 2")));
         assertThat(generatedSoftConstraints.getCoRouting().getServiceIdentifierList(),
             IsMapContaining.hasKey(
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co
                         .routing.ServiceIdentifierListKey("service 3")));
     }
 
     @Test
-    public void testDowngradeHardConstraints() {
+    void testDowngradeHardConstraints() {
         HardConstraints initialHardConstraints = null;
         HardConstraints genHardConstraints = DowngradeConstraints.downgradeHardConstraints(initialHardConstraints);
-        assertNotNull("generated hard-constraints should be empty, not null", genHardConstraints);
+        assertNotNull(genHardConstraints, "generated hard-constraints should be empty, not null");
         initialHardConstraints = new HardConstraintsBuilder().build();
         genHardConstraints = DowngradeConstraints.downgradeHardConstraints(initialHardConstraints);
-        assertNotNull("generated hard-constraints should be empty, not null", genHardConstraints);
+        assertNotNull(genHardConstraints, "generated hard-constraints should be empty, not null");
         initialHardConstraints = buildHardConstraint(null, false, null, "link1", null, Double.valueOf(12.8), false,
             false, null, null);
         genHardConstraints = DowngradeConstraints.downgradeHardConstraints(initialHardConstraints);
-        assertEquals("Latency value should be 12.8",
-            (long) 12.8, genHardConstraints.getLatency().getMaxLatency().longValue());
-        assertNull("generated hard constraints should only contain max-latency value",
-            genHardConstraints.getCoRouting());
-        assertNull("generated hard constraints should only contain max-latency value",
-            genHardConstraints.getExclude());
-        assertNull("generated hard constraints should only contain max-latency value",
-            genHardConstraints.getInclude());
+        assertEquals((long) 12.8, genHardConstraints.getLatency().getMaxLatency().longValue(),
+            "Latency value should be 12.8");
+        assertNull(genHardConstraints.getCoRouting(),
+            "generated hard constraints should only contain max-latency value");
+        assertNull(genHardConstraints.getExclude(), "generated hard constraints should only contain max-latency value");
+        assertNull(genHardConstraints.getInclude(), "generated hard constraints should only contain max-latency value");
     }
 
     @Test
-    public void testConvertToSoftConstraints() {
+    void testConvertToSoftConstraints() {
         HardConstraints initialHardConstraints = null;
         SoftConstraints genSoftConstraints = DowngradeConstraints.convertToSoftConstraints(initialHardConstraints);
-        assertNotNull("generated soft constraints should never be null", genSoftConstraints);
-        assertNull("generated soft constraints should be empty", genSoftConstraints.getExclude());
-        assertNull("generated soft constraints should be empty", genSoftConstraints.getCoRouting());
-        assertNull("generated soft constraints should be empty", genSoftConstraints.getLatency());
+        assertNotNull(genSoftConstraints, "generated soft constraints should never be null");
+        assertNull(genSoftConstraints.getExclude(), "generated soft constraints should be empty");
+        assertNull(genSoftConstraints.getCoRouting(), "generated soft constraints should be empty");
+        assertNull(genSoftConstraints.getLatency(), "generated soft constraints should be empty");
 
-        List<String> hardCustomerCode = Arrays.asList("customer-code 1", "customer-code 2");
+        Set<String> hardCustomerCode = Set.of("customer-code 1", "customer-code 2");
         initialHardConstraints =
             buildHardConstraint(hardCustomerCode, false, null, "link1", "node", null, false, false, null, null);
         genSoftConstraints = DowngradeConstraints.convertToSoftConstraints(initialHardConstraints);
-        assertEquals("generated soft constraints should contain customer-code items", 2,
-            genSoftConstraints.getCustomerCode().size());
+        assertEquals(2, genSoftConstraints.getCustomerCode().size(),
+            "generated soft constraints should contain customer-code items");
         assertTrue(genSoftConstraints.getCustomerCode().contains("customer-code 1"));
         assertTrue(genSoftConstraints.getCustomerCode().contains("customer-code 2"));
-        assertNotNull("generated soft constraints should contain exclude constraint", genSoftConstraints.getExclude());
-        assertEquals("generated soft constraints should contain exclude constraint with one link-id",
-            1, genSoftConstraints.getExclude().getLinkIdentifier().values().size());
+        assertNotNull(genSoftConstraints.getExclude(), "generated soft constraints should contain exclude constraint");
+        assertEquals(1, genSoftConstraints.getExclude().getLinkIdentifier().size(),
+            "generated soft constraints should contain exclude constraint with one link-id");
         assertEquals("link-id 1",
-            genSoftConstraints.getExclude().getLinkIdentifier().values().stream().findAny().get().getLinkId());
+            genSoftConstraints.getExclude().getLinkIdentifier().stream().findAny().orElseThrow().getLinkId());
         assertEquals("openroadm-topology",
-            genSoftConstraints.getExclude().getLinkIdentifier().values().stream().findAny().get().getLinkNetworkId());
-        assertNotNull("generated soft constraints should contain include constraint", genSoftConstraints.getInclude());
-        assertEquals("generated soft constraints should contain include constraint with two node-id",
-            2, genSoftConstraints.getInclude().getNodeId().size());
+            genSoftConstraints.getExclude().getLinkIdentifier().stream().findAny().orElseThrow()
+                .getLinkNetworkId());
+        assertNotNull(genSoftConstraints.getInclude(), "generated soft constraints should contain include constraint");
+        assertEquals(2, genSoftConstraints.getInclude().getNodeId().size(),
+            "generated soft constraints should contain include constraint with two node-id");
         assertTrue(genSoftConstraints.getInclude().getNodeId().contains(new NodeIdType("node-id-1")));
         assertTrue(genSoftConstraints.getInclude().getNodeId().contains(new NodeIdType("node-id-3")));
-        assertNull("generated soft constraints should not contain any latency constraint",
-            genSoftConstraints.getLatency());
-        assertNull("generated soft constraints should not contain any max-distance constraint",
-            genSoftConstraints.getDistance());
-        assertNull("generated soft constraints should not contain any co-routing constraint",
-            genSoftConstraints.getCoRouting());
+        assertNull(genSoftConstraints.getLatency(),
+            "generated soft constraints should not contain any latency constraint");
+        assertNull(genSoftConstraints.getDistance(),
+            "generated soft constraints should not contain any max-distance constraint");
+        assertNull(genSoftConstraints.getCoRouting(),
+            "generated soft constraints should not contain any co-routing constraint");
     }
 }
index f9d800ab8f133d9af139497615e1928d9bf29d69..387c7c6fcb9b48586cbe13ddd6db23bf68b9b993 100644 (file)
@@ -7,59 +7,61 @@
  */
 package org.opendaylight.transportpce.servicehandler;
 
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.common.util.concurrent.MoreExecutors;
 import java.time.OffsetDateTime;
 import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
-import java.util.Arrays;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executors;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.transportpce.common.ResponseCodes;
 import org.opendaylight.transportpce.servicehandler.utils.ServiceDataUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ConnectionType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommon;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommonBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.sdnc.request.header.SdncRequestHeaderBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.CoRoutingBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co.routing.ServiceIdentifierListBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.HardConstraintsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.SoftConstraintsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceFeasibilityCheckInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceFeasibilityCheckInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceFeasibilityCheckOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRestorationInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRestorationInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRestorationOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.ServicesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.ServicesKey;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.response.parameters.sp.ResponseParameters;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ConnectionType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommonBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.sdnc.request.header.SdncRequestHeaderBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.CoRoutingBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co.routing.ServiceIdentifierListBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.HardConstraintsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.SoftConstraintsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceFeasibilityCheckInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceFeasibilityCheckInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceFeasibilityCheckOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReconfigureInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReconfigureInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRestorationInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRestorationInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRestorationOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.ServicesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.ServicesKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirectionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.response.parameters.sp.ResponseParametersBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.response.parameters.sp.response.parameters.PathDescriptionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePaths;
@@ -75,44 +77,43 @@ public class ModelMappingUtilsTest extends AbstractTest {
     private CountDownLatch endSignal;
     private static final int NUM_THREADS = 5;
 
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp() {
         executorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(NUM_THREADS));
         endSignal = new CountDownLatch(1);
     }
 
-    @After
-    public void tearDown() {
+    @AfterEach
+    void tearDown() {
         executorService.shutdownNow();
     }
 
     private ServiceReconfigureInput buildServiceConfigurationInput() {
-        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx");
-        OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneOffset.UTC);
-        OffsetDateTime offsetDateTime2 = offsetDateTime.plusDays(10);
-        return new ServiceReconfigureInputBuilder().setNewServiceName("service 1")
-            .setServiceName("service 1").setCommonId("common id").setConnectionType(ConnectionType.Service)
-            .setCustomer("customer").setCustomerContact("customer contact").setDueDate(new DateAndTime(
-                    dtf.format(offsetDateTime)))
-            .setEndDate(new DateAndTime(dtf.format(offsetDateTime2)))
+        return new ServiceReconfigureInputBuilder()
+            .setNewServiceName("service 1").setServiceName("service 1").setCommonId("common id")
+            .setConnectionType(ConnectionType.Service).setCustomer("customer").setCustomerContact("customer contact")
+            .setDueDate(new DateAndTime(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx")
+                .format(OffsetDateTime.now(ZoneOffset.UTC))))
+            .setEndDate(new DateAndTime(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx")
+                .format(OffsetDateTime.now(ZoneOffset.UTC).plusDays(10))))
             .setNcCode("nc node").setNciCode("nci node").setSecondaryNciCode("secondry").setOperatorContact("operator")
             .setServiceAEnd(ServiceDataUtils.getServiceAEndBuildReconfigure().build())
             .setServiceZEnd(ServiceDataUtils.getServiceZEndBuildReconfigure().build())
             .setHardConstraints(new HardConstraintsBuilder()
-                .setCustomerCode(Arrays.asList("Some customer-code"))
+                .setCustomerCode(Set.of("Some customer-code"))
                 .setCoRouting(new CoRoutingBuilder()
                     .setServiceIdentifierList(Map.of(
-                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209
                             .constraints.co.routing.ServiceIdentifierListKey("Some existing-service"),
                         new ServiceIdentifierListBuilder().setServiceIdentifier("Some existing-service")
                             .build()))
                     .build())
                 .build())
             .setSoftConstraints(new SoftConstraintsBuilder()
-                .setCustomerCode(Arrays.asList("Some customer-code"))
+                .setCustomerCode(Set.of("Some customer-code"))
                 .setCoRouting(new CoRoutingBuilder()
                     .setServiceIdentifierList(Map.of(
-                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209
                             .constraints.co.routing.ServiceIdentifierListKey("Some existing-service"),
                         new ServiceIdentifierListBuilder().setServiceIdentifier("Some existing-service")
                             .build()))
@@ -122,108 +123,107 @@ public class ModelMappingUtilsTest extends AbstractTest {
     }
 
     private PathComputationRequestOutput buildPathComputationOutput() {
-        ConfigurationResponseCommon configurationResponseCommon = new ConfigurationResponseCommonBuilder()
-                .setRequestId("request 1").setAckFinalIndicator(ResponseCodes.FINAL_ACK_NO)
-                .setResponseCode(ResponseCodes.RESPONSE_OK).setResponseMessage("PCE calculation in progress").build();
-        ResponseParameters responseParameters = new ResponseParametersBuilder()
-            .setPathDescription(new PathDescriptionBuilder()
-                .setAToZDirection(new AToZDirectionBuilder().setAToZWavelengthNumber(Uint32.valueOf(1))
-                    .setRate(Uint32.valueOf(1)).build())
-                .setZToADirection(new ZToADirectionBuilder().setZToAWavelengthNumber(Uint32.valueOf(1))
-                    .setRate(Uint32.valueOf(1)).build()).build())
+        return new PathComputationRequestOutputBuilder()
+            .setConfigurationResponseCommon(new ConfigurationResponseCommonBuilder()
+                .setRequestId("request 1")
+                .setAckFinalIndicator(ResponseCodes.FINAL_ACK_NO)
+                .setResponseCode(ResponseCodes.RESPONSE_OK)
+                .setResponseMessage("PCE calculation in progress")
+                .build())
+            .setResponseParameters(new ResponseParametersBuilder()
+                .setPathDescription(new PathDescriptionBuilder()
+                    .setAToZDirection(new AToZDirectionBuilder()
+                        .setAToZWavelengthNumber(Uint32.valueOf(1))
+                        .setRate(Uint32.valueOf(1))
+                        .build())
+                    .setZToADirection(new ZToADirectionBuilder()
+                        .setZToAWavelengthNumber(Uint32.valueOf(1))
+                        .setRate(Uint32.valueOf(1))
+                        .build())
+                    .build())
+                .build())
             .build();
-        return new PathComputationRequestOutputBuilder().setConfigurationResponseCommon(configurationResponseCommon)
-            .setResponseParameters(responseParameters).build();
     }
 
     @Test
-    //TODO : is this unit test relevant ?
-    public void mappingServicesNullServiceCreateInput() {
-        Services services = ModelMappingUtils.mappingServices(null, null);
-        Assert.assertEquals(new ServicesBuilder().withKey(new ServicesKey("unknown")).build(), services);
-    }
-
-    @Test
-    public void mappingServiceNotNullServiceReconfigureInput() {
+    void mappingServiceNotNullServiceReconfigureInput() {
         Services services = ModelMappingUtils.mappingServices(null, buildServiceConfigurationInput());
-        Assert.assertEquals("service 1", services.getServiceName());
+        assertEquals("service 1", services.getServiceName());
     }
 
     @Test
-    public void mappingServiceValid() {
-        Services services = ModelMappingUtils.mappingServices(ServiceDataUtils.buildServiceCreateInput(),
-                null);
-        Assert.assertEquals("service 1", services.getServiceName());
+    void mappingServiceValid() {
+        Services services = ModelMappingUtils.mappingServices(ServiceDataUtils.buildServiceCreateInput(), null);
+        assertEquals("service 1", services.getServiceName());
     }
 
     @Test
     //TODO : is this unit test relevant ?
-    public void mappingServicesPathNullServiceCreateInput() {
+    void mappingServicesPathNullServiceCreateInput() {
         ServicePaths services = ModelMappingUtils.mappingServicePaths(null, buildPathComputationOutput());
-        Assert.assertEquals(new ServicePathsBuilder().withKey(new ServicePathsKey("unknown")).build(), services);
+        assertEquals(new ServicePathsBuilder().withKey(new ServicePathsKey("unknown")).build(), services);
     }
 
     @Test
-    public void mappingServicePathWithServiceInputWithHardConstraints() {
+    void mappingServicePathWithServiceInputWithHardConstraints() {
         ServiceCreateInput createInput = ServiceDataUtils.buildServiceCreateInputWithHardConstraints();
         ServiceInput serviceInput = new ServiceInput(createInput);
         ServicePaths services = ModelMappingUtils.mappingServicePaths(serviceInput, buildPathComputationOutput());
-        Assert.assertEquals(serviceInput.getServiceName(), services.getServicePathName());
-        Assert.assertNotNull(services.getHardConstraints());
+        assertEquals(serviceInput.getServiceName(), services.getServicePathName());
+        assertNotNull(services.getHardConstraints());
     }
 
     @Test
-    public void mappingServicePathWithServiceInputWithSoftConstraints() {
+    void mappingServicePathWithServiceInputWithSoftConstraints() {
         ServiceCreateInput createInput = ServiceDataUtils.buildServiceCreateInputWithSoftConstraints();
         ServiceInput serviceInput = new ServiceInput(createInput);
         ServicePaths services = ModelMappingUtils.mappingServicePaths(serviceInput, buildPathComputationOutput());
-        Assert.assertEquals(serviceInput.getServiceName(), services.getServicePathName());
-        Assert.assertNotNull(services.getSoftConstraints());
+        assertEquals(serviceInput.getServiceName(), services.getServicePathName());
+        assertNotNull(services.getSoftConstraints());
     }
 
     @Test
-    public void createServiceDeleteInputWithServiceRerouteInput() {
+    void createServiceDeleteInputWithServiceRerouteInput() {
         ServiceRerouteInput serviceRerouteinput = new ServiceRerouteInputBuilder().setServiceName("reroute").build();
         Services services = new ServicesBuilder()
-                .withKey(new ServicesKey("reroute"))
-                .setSdncRequestHeader(new SdncRequestHeaderBuilder().setRequestId("123").build()).build();
-        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInput
-            serviceDeleteInput =
-                    ModelMappingUtils.createServiceDeleteInput(serviceRerouteinput, services);
-        Assert.assertEquals("reroute", serviceDeleteInput.getServiceName());
-        Assert.assertEquals("123", serviceDeleteInput.getServiceHandlerHeader().getRequestId());
+                    .withKey(new ServicesKey("reroute"))
+                    .setSdncRequestHeader(new SdncRequestHeaderBuilder().setRequestId("123").build())
+                    .build();
+        var serviceDeleteInput = ModelMappingUtils.createServiceDeleteInput(serviceRerouteinput, services);
+        assertEquals("reroute", serviceDeleteInput.getServiceName());
+        assertEquals("123", serviceDeleteInput.getServiceHandlerHeader().getRequestId());
     }
 
     @Test
-    public void  createServiceDeleteInputWithServiceReconfigureInput() {
-        ServiceReconfigureInput serviceReconfigureInput = new  ServiceReconfigureInputBuilder()
-                .setServiceName("reconf").build();
-        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInput
-            serviceDeleteInput =
-                    ModelMappingUtils.createServiceDeleteInput(serviceReconfigureInput);
-        Assert.assertEquals("reconf", serviceDeleteInput.getServiceName());
-        Assert.assertEquals("reconf-reconfigure", serviceDeleteInput.getServiceHandlerHeader().getRequestId());
+    void  createServiceDeleteInputWithServiceReconfigureInput() {
+        ServiceReconfigureInput serviceReconfigureInput = new ServiceReconfigureInputBuilder()
+                .setServiceName("reconf")
+                .build();
+        var serviceDeleteInput = ModelMappingUtils.createServiceDeleteInput(serviceReconfigureInput);
+        assertEquals("reconf", serviceDeleteInput.getServiceName());
+        assertEquals("reconf-reconfigure", serviceDeleteInput.getServiceHandlerHeader().getRequestId());
     }
 
     @Test
-    public void createServiceDeleteInputWithServiceRestorationInput() {
+    void createServiceDeleteInputWithServiceRestorationInput() {
         Services services = new ServicesBuilder()
                 .withKey(new ServicesKey("rest"))
-                .setSdncRequestHeader(new SdncRequestHeaderBuilder().setRequestId("123").build()).build();
-        ServiceRestorationInput serviceRestorationInput =
-            new ServiceRestorationInputBuilder().setServiceName("rest").build();
-        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInput
-            serviceDeleteInput =
-                    ModelMappingUtils.createServiceDeleteInput(serviceRestorationInput, services);
-        Assert.assertEquals("rest", serviceDeleteInput.getServiceName());
-        Assert.assertEquals("123", serviceDeleteInput.getServiceHandlerHeader().getRequestId());
+                .setSdncRequestHeader(new SdncRequestHeaderBuilder().setRequestId("123").build())
+                .build();
+        ServiceRestorationInput serviceRestorationInput = new ServiceRestorationInputBuilder()
+                .setServiceName("rest")
+                .build();
+        var serviceDeleteInput = ModelMappingUtils.createServiceDeleteInput(serviceRestorationInput, services);
+        assertEquals("rest", serviceDeleteInput.getServiceName());
+        assertEquals("123", serviceDeleteInput.getServiceHandlerHeader().getRequestId());
     }
 
     @Test
-    public void createDeleteServiceReplyWithServiceDeleteInputWithSdncHeader()
-        throws ExecutionException, InterruptedException  {
+    void createDeleteServiceReplyWithServiceDeleteInputWithSdncHeader()
+            throws ExecutionException, InterruptedException  {
         ServiceDeleteInput input = new ServiceDeleteInputBuilder()
-                .setSdncRequestHeader(new SdncRequestHeaderBuilder().setRequestId("12").build()).build();
+                .setSdncRequestHeader(new SdncRequestHeaderBuilder().setRequestId("12").build())
+                .build();
         ListenableFuture<RpcResult<ServiceDeleteOutput>> serviceDeleteOutputF =
             ModelMappingUtils.createDeleteServiceReply(input, "ack", "message", "200");
         serviceDeleteOutputF.addListener(new Runnable() {
@@ -235,16 +235,14 @@ public class ModelMappingUtilsTest extends AbstractTest {
 
         endSignal.await();
         RpcResult<ServiceDeleteOutput> serviceDeleteOutput = serviceDeleteOutputF.get();
-        Assert.assertEquals("200", serviceDeleteOutput.getResult().getConfigurationResponseCommon().getResponseCode());
-        Assert.assertEquals(
-            "ack", serviceDeleteOutput.getResult().getConfigurationResponseCommon().getAckFinalIndicator());
-        Assert.assertEquals(
-            "message", serviceDeleteOutput.getResult().getConfigurationResponseCommon().getResponseMessage());
-        Assert.assertEquals("12", serviceDeleteOutput.getResult().getConfigurationResponseCommon().getRequestId());
+        assertEquals("200", serviceDeleteOutput.getResult().getConfigurationResponseCommon().getResponseCode());
+        assertEquals("ack", serviceDeleteOutput.getResult().getConfigurationResponseCommon().getAckFinalIndicator());
+        assertEquals("message", serviceDeleteOutput.getResult().getConfigurationResponseCommon().getResponseMessage());
+        assertEquals("12", serviceDeleteOutput.getResult().getConfigurationResponseCommon().getRequestId());
     }
 
     @Test
-    public void createDeleteServiceReplyWithServiceDeleteInputWithoutSdncHeader()
+    void createDeleteServiceReplyWithServiceDeleteInputWithoutSdncHeader()
             throws ExecutionException, InterruptedException  {
         ServiceDeleteInput input = new ServiceDeleteInputBuilder().build();
         ListenableFuture<RpcResult<ServiceDeleteOutput>> serviceDeleteOutputF =
@@ -258,20 +256,18 @@ public class ModelMappingUtilsTest extends AbstractTest {
 
         endSignal.await();
         RpcResult<ServiceDeleteOutput> serviceDeleteOutput = serviceDeleteOutputF.get();
-        Assert.assertEquals("200", serviceDeleteOutput.getResult().getConfigurationResponseCommon().getResponseCode());
-        Assert.assertEquals(
-            "ack", serviceDeleteOutput.getResult().getConfigurationResponseCommon().getAckFinalIndicator());
-        Assert.assertEquals(
-            "message", serviceDeleteOutput.getResult().getConfigurationResponseCommon().getResponseMessage());
-        Assert.assertNull(serviceDeleteOutput.getResult().getConfigurationResponseCommon().getRequestId());
+        assertEquals("200", serviceDeleteOutput.getResult().getConfigurationResponseCommon().getResponseCode());
+        assertEquals("ack", serviceDeleteOutput.getResult().getConfigurationResponseCommon().getAckFinalIndicator());
+        assertEquals("message", serviceDeleteOutput.getResult().getConfigurationResponseCommon().getResponseMessage());
+        assertNull(serviceDeleteOutput.getResult().getConfigurationResponseCommon().getRequestId());
     }
 
     @Test
-    public void createCreateServiceReplyWithServiceCreatInputWithSdncRequestHeader()
+    void createCreateServiceReplyWithServiceCreatInputWithSdncRequestHeader()
             throws ExecutionException, InterruptedException {
-        ServiceCreateInput input =
-            new ServiceCreateInputBuilder()
-                .setSdncRequestHeader(new SdncRequestHeaderBuilder().setRequestId("12").build()).build();
+        ServiceCreateInput input = new ServiceCreateInputBuilder()
+                .setSdncRequestHeader(new SdncRequestHeaderBuilder().setRequestId("12").build())
+                .build();
         ListenableFuture<RpcResult<ServiceCreateOutput>> serviceCreatOutputF =
             ModelMappingUtils.createCreateServiceReply(input, "ack", "message", "200");
         serviceCreatOutputF.addListener(new Runnable() {
@@ -283,16 +279,14 @@ public class ModelMappingUtilsTest extends AbstractTest {
 
         endSignal.await();
         RpcResult<ServiceCreateOutput> serviceCreatOutput = serviceCreatOutputF.get();
-        Assert.assertEquals("200", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseCode());
-        Assert.assertEquals(
-            "ack", serviceCreatOutput.getResult().getConfigurationResponseCommon().getAckFinalIndicator());
-        Assert.assertEquals(
-            "message", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseMessage());
-        Assert.assertEquals("12", serviceCreatOutput.getResult().getConfigurationResponseCommon().getRequestId());
+        assertEquals("200", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseCode());
+        assertEquals("ack", serviceCreatOutput.getResult().getConfigurationResponseCommon().getAckFinalIndicator());
+        assertEquals("message", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseMessage());
+        assertEquals("12", serviceCreatOutput.getResult().getConfigurationResponseCommon().getRequestId());
     }
 
     @Test
-    public void createCreateServiceReplyWithServiceCreatInputWithoutSdncRequestHeader()
+    void createCreateServiceReplyWithServiceCreatInputWithoutSdncRequestHeader()
         throws ExecutionException, InterruptedException {
         ServiceCreateInput input = new ServiceCreateInputBuilder().build();
         ListenableFuture<RpcResult<ServiceCreateOutput>> serviceCreatOutputF =
@@ -306,20 +300,18 @@ public class ModelMappingUtilsTest extends AbstractTest {
 
         endSignal.await();
         RpcResult<ServiceCreateOutput> serviceCreatOutput = serviceCreatOutputF.get();
-        Assert.assertEquals("200", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseCode());
-        Assert.assertEquals(
-            "ack", serviceCreatOutput.getResult().getConfigurationResponseCommon().getAckFinalIndicator());
-        Assert.assertEquals(
-            "message", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseMessage());
-        Assert.assertNull(serviceCreatOutput.getResult().getConfigurationResponseCommon().getRequestId());
+        assertEquals("200", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseCode());
+        assertEquals("ack", serviceCreatOutput.getResult().getConfigurationResponseCommon().getAckFinalIndicator());
+        assertEquals("message", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseMessage());
+        assertNull(serviceCreatOutput.getResult().getConfigurationResponseCommon().getRequestId());
     }
 
     @Test
-    public void createCreateServiceReplyWithTempServiceCreatInputWithSdncRequestHeader()
+    void createCreateServiceReplyWithTempServiceCreatInputWithSdncRequestHeader()
         throws ExecutionException, InterruptedException {
-        TempServiceCreateInput input =
-            new TempServiceCreateInputBuilder()
-                .setSdncRequestHeader(new SdncRequestHeaderBuilder().setRequestId("12").build()).build();
+        TempServiceCreateInput input = new TempServiceCreateInputBuilder()
+                .setSdncRequestHeader(new SdncRequestHeaderBuilder().setRequestId("12").build())
+                .build();
         ListenableFuture<RpcResult<TempServiceCreateOutput>> serviceCreatOutputF =
             ModelMappingUtils.createCreateServiceReply(input, "ack", "message", "200");
         serviceCreatOutputF.addListener(new Runnable() {
@@ -331,16 +323,14 @@ public class ModelMappingUtilsTest extends AbstractTest {
 
         endSignal.await();
         RpcResult<TempServiceCreateOutput> serviceCreatOutput = serviceCreatOutputF.get();
-        Assert.assertEquals("200", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseCode());
-        Assert.assertEquals(
-            "ack", serviceCreatOutput.getResult().getConfigurationResponseCommon().getAckFinalIndicator());
-        Assert.assertEquals(
-            "message", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseMessage());
-        Assert.assertEquals("12", serviceCreatOutput.getResult().getConfigurationResponseCommon().getRequestId());
+        assertEquals("200", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseCode());
+        assertEquals("ack", serviceCreatOutput.getResult().getConfigurationResponseCommon().getAckFinalIndicator());
+        assertEquals("message", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseMessage());
+        assertEquals("12", serviceCreatOutput.getResult().getConfigurationResponseCommon().getRequestId());
     }
 
     @Test
-    public void createCreateServiceReplyWithTempServiceCreatInputWithoutSdncRequestHeader()
+    void createCreateServiceReplyWithTempServiceCreatInputWithoutSdncRequestHeader()
         throws ExecutionException, InterruptedException {
         TempServiceCreateInput input = new TempServiceCreateInputBuilder().build();
         ListenableFuture<RpcResult<TempServiceCreateOutput>> serviceCreatOutputF =
@@ -354,20 +344,18 @@ public class ModelMappingUtilsTest extends AbstractTest {
 
         endSignal.await();
         RpcResult<TempServiceCreateOutput> serviceCreatOutput = serviceCreatOutputF.get();
-        Assert.assertEquals("200", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseCode());
-        Assert.assertEquals(
-            "ack", serviceCreatOutput.getResult().getConfigurationResponseCommon().getAckFinalIndicator());
-        Assert.assertEquals(
-            "message", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseMessage());
-        Assert.assertNull(serviceCreatOutput.getResult().getConfigurationResponseCommon().getRequestId());
+        assertEquals("200", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseCode());
+        assertEquals("ack", serviceCreatOutput.getResult().getConfigurationResponseCommon().getAckFinalIndicator());
+        assertEquals("message", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseMessage());
+        assertNull(serviceCreatOutput.getResult().getConfigurationResponseCommon().getRequestId());
     }
 
     @Test
-    public void createCreateServiceReplyWithServiceFeasibilityCheckInputWithSdncRequestHeader()
+    void createCreateServiceReplyWithServiceFeasibilityCheckInputWithSdncRequestHeader()
         throws ExecutionException, InterruptedException {
-        ServiceFeasibilityCheckInput input =
-            new ServiceFeasibilityCheckInputBuilder()
-                .setSdncRequestHeader(new SdncRequestHeaderBuilder().setRequestId("12").build()).build();
+        ServiceFeasibilityCheckInput input = new ServiceFeasibilityCheckInputBuilder()
+                .setSdncRequestHeader(new SdncRequestHeaderBuilder().setRequestId("12").build())
+                .build();
         ListenableFuture<RpcResult<ServiceFeasibilityCheckOutput>> serviceCreatOutputF =
             ModelMappingUtils.createCreateServiceReply(input, "ack", "message", "200");
         serviceCreatOutputF.addListener(new Runnable() {
@@ -379,16 +367,14 @@ public class ModelMappingUtilsTest extends AbstractTest {
 
         endSignal.await();
         RpcResult<ServiceFeasibilityCheckOutput> serviceCreatOutput = serviceCreatOutputF.get();
-        Assert.assertEquals("200", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseCode());
-        Assert.assertEquals(
-            "ack", serviceCreatOutput.getResult().getConfigurationResponseCommon().getAckFinalIndicator());
-        Assert.assertEquals(
-            "message", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseMessage());
-        Assert.assertEquals("12", serviceCreatOutput.getResult().getConfigurationResponseCommon().getRequestId());
+        assertEquals("200", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseCode());
+        assertEquals("ack", serviceCreatOutput.getResult().getConfigurationResponseCommon().getAckFinalIndicator());
+        assertEquals("message", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseMessage());
+        assertEquals("12", serviceCreatOutput.getResult().getConfigurationResponseCommon().getRequestId());
     }
 
     @Test
-    public void createCreateServiceReplyWithServiceFeasibilityCheckInputWithoutSdncRequestHeader()
+    void createCreateServiceReplyWithServiceFeasibilityCheckInputWithoutSdncRequestHeader()
         throws ExecutionException, InterruptedException {
         ServiceFeasibilityCheckInput input = new ServiceFeasibilityCheckInputBuilder().build();
         ListenableFuture<RpcResult<ServiceFeasibilityCheckOutput>> serviceCreatOutputF =
@@ -402,16 +388,14 @@ public class ModelMappingUtilsTest extends AbstractTest {
 
         endSignal.await();
         RpcResult<ServiceFeasibilityCheckOutput> serviceCreatOutput = serviceCreatOutputF.get();
-        Assert.assertEquals("200", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseCode());
-        Assert.assertEquals(
-            "ack", serviceCreatOutput.getResult().getConfigurationResponseCommon().getAckFinalIndicator());
-        Assert.assertEquals(
-            "message", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseMessage());
-        Assert.assertNull(serviceCreatOutput.getResult().getConfigurationResponseCommon().getRequestId());
+        assertEquals("200", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseCode());
+        assertEquals("ack", serviceCreatOutput.getResult().getConfigurationResponseCommon().getAckFinalIndicator());
+        assertEquals("message", serviceCreatOutput.getResult().getConfigurationResponseCommon().getResponseMessage());
+        assertNull(serviceCreatOutput.getResult().getConfigurationResponseCommon().getRequestId());
     }
 
     @Test
-    public void testCreateRestoreServiceReply() throws ExecutionException, InterruptedException {
+    void testCreateRestoreServiceReply() throws ExecutionException, InterruptedException {
         ListenableFuture<RpcResult<ServiceRestorationOutput>> serviceRestorationOutputF =
             ModelMappingUtils.createRestoreServiceReply("message");
         serviceRestorationOutputF.addListener(new Runnable() {
index c3209527c1094954e6d301efa9a48a151c4ff0a7..c6f53f1ee91ae359df88383ed0573a7731cd2d05 100644 (file)
@@ -7,21 +7,21 @@
  */
 package org.opendaylight.transportpce.servicehandler;
 
-import org.junit.Assert;
-import org.junit.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
 
 public class ServiceEndpointTypeTest {
 
     @Test
-    public void testgetIntValue() {
-        Assert.assertEquals(1, ServiceEndpointType.SERVICEAEND.getIntValue());
-        Assert.assertEquals(2, ServiceEndpointType.SERVICEZEND.getIntValue());
+    void testgetIntValue() {
+        assertEquals(1, ServiceEndpointType.SERVICEAEND.getIntValue());
+        assertEquals(2, ServiceEndpointType.SERVICEZEND.getIntValue());
     }
 
     @Test
-    public void testForValue() {
-        Assert.assertEquals(ServiceEndpointType.SERVICEAEND, ServiceEndpointType.forValue(1));
-        Assert.assertEquals(ServiceEndpointType.SERVICEZEND, ServiceEndpointType.forValue(2));
+    void testForValue() {
+        assertEquals(ServiceEndpointType.SERVICEAEND, ServiceEndpointType.forValue(1));
+        assertEquals(ServiceEndpointType.SERVICEZEND, ServiceEndpointType.forValue(2));
     }
-
-}
+}
\ No newline at end of file
diff --git a/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/impl/ServiceHandlerProviderTest.java b/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/impl/ServiceHandlerProviderTest.java
new file mode 100644 (file)
index 0000000..d210e2b
--- /dev/null
@@ -0,0 +1,63 @@
+/*
+ * Copyright © 2019 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.servicehandler.impl;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.transportpce.networkmodel.service.NetworkModelService;
+import org.opendaylight.transportpce.pce.service.PathComputationService;
+import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations;
+import org.opendaylight.transportpce.servicehandler.listeners.NetworkModelNotificationHandler;
+import org.opendaylight.transportpce.servicehandler.listeners.PceNotificationHandler;
+import org.opendaylight.transportpce.servicehandler.listeners.RendererNotificationHandler;
+import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
+import org.opendaylight.transportpce.test.AbstractTest;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
+
+@ExtendWith(MockitoExtension.class)
+public class ServiceHandlerProviderTest extends AbstractTest {
+
+    @Mock
+    RendererServiceOperations rendererServiceOperations;
+    @Mock
+    PathComputationService pathComputationService;
+    @Mock
+    NetworkModelService networkModelService;
+    @Mock
+    DataBroker dataBroker;
+    @Mock
+    ServiceDataStoreOperations serviceDataStoreOperations;
+    @Mock
+    NotificationPublishService notificationPublishService;
+    @Mock
+    DataTreeChangeListener<Services> serviceListener;
+
+    private final PceNotificationHandler pceNotificationHandler = new PceNotificationHandler(rendererServiceOperations,
+        pathComputationService, notificationPublishService, serviceDataStoreOperations);
+    private final RendererNotificationHandler rendererNotificationHandler = new RendererNotificationHandler(
+        pathComputationService, notificationPublishService, networkModelService);
+    private final NetworkModelNotificationHandler networkModelNotificationHandler = new NetworkModelNotificationHandler(
+        notificationPublishService, serviceDataStoreOperations);
+
+    @Test
+    void testInitRegisterServiceHandlerToRpcRegistry() {
+        new ServiceHandlerProvider(dataBroker, getNotificationService(),
+            serviceDataStoreOperations, pceNotificationHandler, rendererNotificationHandler,
+            networkModelNotificationHandler, serviceListener);
+        verify(dataBroker, times(1)).registerTreeChangeListener(any(), any());
+    }
+}
index 8634966e75f984e682719f609bfe5851ecdf4f28..0fe165174326525239a37f0d064c79497a8b7120 100644 (file)
  */
 package org.opendaylight.transportpce.servicehandler.impl;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 import static org.opendaylight.transportpce.servicehandler.impl.ServicehandlerImpl.LogMessages;
 
+import com.google.common.collect.ClassToInstanceMap;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.common.util.concurrent.MoreExecutors;
+import java.util.Map;
+import java.util.Optional;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executors;
 import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
-import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
 import org.opendaylight.transportpce.common.ResponseCodes;
+import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
 import org.opendaylight.transportpce.pce.service.PathComputationService;
 import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations;
-import org.opendaylight.transportpce.servicehandler.listeners.NetworkModelListenerImpl;
-import org.opendaylight.transportpce.servicehandler.listeners.PceListenerImpl;
-import org.opendaylight.transportpce.servicehandler.listeners.RendererListenerImpl;
+import org.opendaylight.transportpce.servicehandler.ServiceInput;
+import org.opendaylight.transportpce.servicehandler.catalog.CatalogDataStoreOperations;
+import org.opendaylight.transportpce.servicehandler.catalog.CatalogDataStoreOperationsImpl;
+import org.opendaylight.transportpce.servicehandler.listeners.NetworkListener;
+import org.opendaylight.transportpce.servicehandler.listeners.PceListener;
+import org.opendaylight.transportpce.servicehandler.listeners.RendererListener;
+import org.opendaylight.transportpce.servicehandler.service.PCEServiceWrapper;
+import org.opendaylight.transportpce.servicehandler.service.RendererServiceWrapper;
 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperationsImpl;
+import org.opendaylight.transportpce.servicehandler.utils.CatalogDataUtils;
 import org.opendaylight.transportpce.servicehandler.utils.ServiceDataUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceFeasibilityCheckInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceFeasibilityCheckInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceFeasibilityCheckOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRestorationInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRestorationInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRestorationOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceDeleteInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceDeleteInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceDeleteOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.delete.input.ServiceDeleteReqInfoBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRerouteRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.service.path.rpc.result.PathDescription;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommonBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddOpenroadmOperationalModesToCatalogInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddOpenroadmOperationalModesToCatalogOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddSpecificOperationalModesToCatalogInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.AddSpecificOperationalModesToCatalogOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceFeasibilityCheckInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceFeasibilityCheckOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReconfigureInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReconfigureInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReconfigureOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRestorationInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRestorationInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRestorationOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceDeleteInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceDeleteOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.delete.input.ServiceDeleteReqInfoBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.ServicesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZ;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.ResourceBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.TerminationPointBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.response.parameters.sp.ResponseParametersBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.response.parameters.sp.response.parameters.PathDescriptionBuilder;
 import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.Uint32;
 
-public class ServicehandlerImplTest extends AbstractTest  {
-
+@ExtendWith(MockitoExtension.class)
+public class ServicehandlerImplTest extends AbstractTest {
+    @Mock
+    private RpcProviderService rpcProviderService;
     @Mock
     private PathComputationService pathComputationService;
-
     @Mock
     private RendererServiceOperations rendererServiceOperations;
-
     @Mock
     private NotificationPublishService notificationPublishService;
-
     @Mock
-    private PceListenerImpl pceListenerImpl;
-
+    private PceListener pceListenerImpl;
     @Mock
-    private RendererListenerImpl rendererListenerImpl;
-
+    private RendererListener rendererListenerImpl;
     @Mock
-    private NetworkModelListenerImpl networkModelListenerImpl;
+    private NetworkListener networkModelListenerImpl;
 
+    @Mock
+    private PathDescription pathDescription;
     private ServiceDataStoreOperations serviceDataStoreOperations;
+    private CatalogDataStoreOperations catalogDataStoreOperations;
+    private ServiceCreateInput serviceCreateInput;
+    private ServiceDeleteInput serviceDeleteInput;
+    private ServiceReconfigureInput serviceReconfigureInput;
+    private ServiceRestorationInput serviceRestorationInput;
+    private ServiceRerouteInput serviceRerouteInput;
     private ListeningExecutorService executorService;
     private CountDownLatch endSignal;
     private static final int NUM_THREADS = 5;
+    private PCEServiceWrapper pceServiceWrapper;
+    private RendererServiceWrapper rendererServiceWrapper;
 
-    @Before
-    public void setUp() {
+    @BeforeEach
+    void setUp() {
         executorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(NUM_THREADS));
         endSignal = new CountDownLatch(1);
-        MockitoAnnotations.openMocks(this);
         this.serviceDataStoreOperations = new ServiceDataStoreOperationsImpl(getNewDataBroker());
+        this.catalogDataStoreOperations =
+            new CatalogDataStoreOperationsImpl(new NetworkTransactionImpl(getDataBroker()));
+        serviceCreateInput = ServiceDataUtils.buildServiceCreateInput();
+        serviceDeleteInput = ServiceDataUtils.buildServiceDeleteInput();
+        serviceReconfigureInput = ServiceDataUtils.buildServiceReconfigureInput();
+        serviceRestorationInput = ServiceDataUtils.buildServiceRestorationInput();
+        serviceRerouteInput = ServiceDataUtils.buildServiceRerouteInput();
+        pathDescription = ServiceDataUtils.createPathDescription(0,1,0,1);
+        pceServiceWrapper = new PCEServiceWrapper(pathComputationService, notificationPublishService);
+        this.rendererServiceWrapper = new RendererServiceWrapper(rendererServiceOperations, notificationPublishService);
     }
 
     @Test
-    public void createServiceShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException {
-        ServicehandlerImpl servicehandlerImpl =
-            new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations,
-                notificationPublishService, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl,
-                serviceDataStoreOperations);
-        ListenableFuture<RpcResult<ServiceCreateOutput>> result =
-            servicehandlerImpl.serviceCreate(new ServiceCreateInputBuilder().build());
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
+    void testRpcRegistration() {
+        new ServicehandlerImpl(rpcProviderService, serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl,
+                networkModelListenerImpl, catalogDataStoreOperations, pathComputationService, rendererServiceOperations,
+                notificationPublishService);
+        verify(rpcProviderService, times(1)).registerRpcImplementations(any(ClassToInstanceMap.class));
+    }
 
+    @Test
+    void createServiceShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException {
+        ListenableFuture<RpcResult<ServiceCreateOutput>> result =
+            new ServiceCreateImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl,
+                    networkModelListenerImpl, pceServiceWrapper, notificationPublishService)
+                .invoke(new ServiceCreateInputBuilder().build());
+        result.addListener(() -> endSignal.countDown(), executorService);
         endSignal.await();
-
-        RpcResult<ServiceCreateOutput> rpcResult = result.get();
-        Assert.assertEquals(
-            ResponseCodes.RESPONSE_FAILED, rpcResult.getResult().getConfigurationResponseCommon().getResponseCode());
+        assertEquals(
+            ResponseCodes.RESPONSE_FAILED,
+            result.get().getResult().getConfigurationResponseCommon().getResponseCode());
     }
 
     @Test
-    public void createServiceShouldBeSuccessfulWhenPreformPCESuccessful()
-        throws ExecutionException, InterruptedException {
-        ServiceCreateInput input = ServiceDataUtils.buildServiceCreateInput();
-        Mockito.when(pathComputationService.pathComputationRequest(any())).thenReturn(Futures.immediateFuture(any()));
-        ServicehandlerImpl servicehandlerImpl =
-            new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations,
-                notificationPublishService, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl,
-                serviceDataStoreOperations);
-        ListenableFuture<RpcResult<ServiceCreateOutput>> result =  servicehandlerImpl.serviceCreate(input);
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-
+    void createServiceShouldBeFailedWithServiceAlreadyExist() throws ExecutionException, InterruptedException {
+        final ServiceDataStoreOperations serviceDSOperations = mock(ServiceDataStoreOperations.class);
+        when(serviceDSOperations.getService(serviceCreateInput.getServiceName()))
+                .thenReturn(Optional.of(
+                        new ServicesBuilder()
+                                .setServiceName(serviceCreateInput.getServiceName())
+                                .build()));
+        ListenableFuture<RpcResult<ServiceCreateOutput>> result =
+            new ServiceCreateImpl(serviceDSOperations, pceListenerImpl, rendererListenerImpl,
+                    networkModelListenerImpl, pceServiceWrapper, notificationPublishService)
+                .invoke(serviceCreateInput);
+        result.addListener(() -> endSignal.countDown(), executorService);
         endSignal.await();
+        assertEquals(
+            ResponseCodes.RESPONSE_FAILED,
+            result.get().getResult().getConfigurationResponseCommon().getResponseCode());
+    }
 
-        RpcResult<ServiceCreateOutput> rpcResult = result.get();
-        Assert.assertEquals(
-            ResponseCodes.RESPONSE_OK, rpcResult.getResult().getConfigurationResponseCommon().getResponseCode());
+    @Test
+    void createServiceShouldBeSuccessfulWhenPerformPCESuccessful() throws ExecutionException, InterruptedException {
+        when(pathComputationService.pathComputationRequest(any())).thenReturn(Futures.immediateFuture(any()));
+        ListenableFuture<RpcResult<ServiceCreateOutput>> result =
+                new ServiceCreateImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl,
+                        networkModelListenerImpl, pceServiceWrapper, notificationPublishService)
+                    .invoke(serviceCreateInput);
+        result.addListener(() -> endSignal.countDown(), executorService);
+        endSignal.await();
+        assertEquals(
+            ResponseCodes.RESPONSE_OK,
+            result.get().getResult().getConfigurationResponseCommon().getResponseCode());
     }
 
     @Test
-    public void deleteServiceShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException {
-        ServicehandlerImpl servicehandlerImpl =
-            new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations,
-                notificationPublishService, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl,
-                serviceDataStoreOperations);
+    void deleteServiceShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException {
         ListenableFuture<RpcResult<ServiceDeleteOutput>> result =
-            servicehandlerImpl.serviceDelete(new ServiceDeleteInputBuilder()
-                .setServiceDeleteReqInfo(new ServiceDeleteReqInfoBuilder().setServiceName("").build()).build());
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-
+                new ServiceDeleteImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl,
+                        networkModelListenerImpl, rendererServiceWrapper, notificationPublishService)
+                    .invoke(new ServiceDeleteInputBuilder()
+                            .setServiceDeleteReqInfo(new ServiceDeleteReqInfoBuilder()
+                                    .setServiceName("")
+                                    .build())
+                            .build());
+        result.addListener(() -> endSignal.countDown(), executorService);
         endSignal.await();
-
-        RpcResult<ServiceDeleteOutput> rpcResult = result.get();
-        Assert.assertEquals(
-            ResponseCodes.RESPONSE_FAILED, rpcResult.getResult().getConfigurationResponseCommon().getResponseCode());
+        assertEquals(
+            ResponseCodes.RESPONSE_FAILED,
+            result.get().getResult().getConfigurationResponseCommon().getResponseCode());
     }
 
     @Test
-    public void deleteServiceShouldBeFailedWithNonExistService() throws ExecutionException, InterruptedException {
-        ServiceDeleteInput input = ServiceDataUtils.buildServiceDeleteInput();
-        ServicehandlerImpl servicehandlerImpl =
-            new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations,
-                notificationPublishService, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl,
-                serviceDataStoreOperations);
-        ListenableFuture<RpcResult<ServiceDeleteOutput>> result = servicehandlerImpl.serviceDelete(input);
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-
+    void deleteServiceShouldBeFailedWithNonExistService() throws ExecutionException, InterruptedException {
+        ListenableFuture<RpcResult<ServiceDeleteOutput>> result =
+                new ServiceDeleteImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl,
+                        networkModelListenerImpl, rendererServiceWrapper, notificationPublishService)
+                    .invoke(serviceDeleteInput);
+        result.addListener(() -> endSignal.countDown(), executorService);
         endSignal.await();
-
-        RpcResult<ServiceDeleteOutput> rpcResult = result.get();
-        Assert.assertEquals(
-            ResponseCodes.RESPONSE_FAILED, rpcResult.getResult().getConfigurationResponseCommon().getResponseCode());
+        assertEquals(
+            ResponseCodes.RESPONSE_FAILED,
+            result.get().getResult().getConfigurationResponseCommon().getResponseCode());
     }
 
     @Test
-    public void deleteServiceShouldBeSuccessForExistingService() throws ExecutionException, InterruptedException {
-        DataBroker dataBroker = getNewDataBroker();
-        Mockito.when(rendererServiceOperations.serviceDelete(any(), any())).thenReturn(Futures.immediateFuture(any()));
-        ServicehandlerImpl servicehandlerImpl =
-            new ServicehandlerImpl(dataBroker, pathComputationService, rendererServiceOperations,
-                notificationPublishService, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl,
-                serviceDataStoreOperations);
-        ServiceCreateInput createInput = ServiceDataUtils.buildServiceCreateInput();
-        serviceDataStoreOperations.createService(createInput);
-        ServiceDeleteInput input = ServiceDataUtils.buildServiceDeleteInput();
-        ListenableFuture<RpcResult<ServiceDeleteOutput>> result = servicehandlerImpl.serviceDelete(input);
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-
+    void deleteServiceShouldBeSuccessForExistingService() throws ExecutionException, InterruptedException {
+        when(rendererServiceOperations.serviceDelete(any(), any())).thenReturn(Futures.immediateFuture(any()));
+        serviceDataStoreOperations.createService(serviceCreateInput);
+        ListenableFuture<RpcResult<ServiceDeleteOutput>> result =
+                new ServiceDeleteImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl,
+                        networkModelListenerImpl, rendererServiceWrapper, notificationPublishService)
+                    .invoke(serviceDeleteInput);
+        result.addListener(() -> endSignal.countDown(), executorService);
         endSignal.await();
-
-        RpcResult<ServiceDeleteOutput> rpcResult = result.get();
-        Assert.assertEquals(
-            ResponseCodes.RESPONSE_OK, rpcResult.getResult().getConfigurationResponseCommon().getResponseCode());
+        assertEquals(
+            ResponseCodes.RESPONSE_OK,
+            result.get().getResult().getConfigurationResponseCommon().getResponseCode());
     }
 
-
     @Test
-    public void serviceFeasibilityCheckShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException {
-        ServicehandlerImpl servicehandlerImpl =
-                new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations,
-                        notificationPublishService, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl,
-                        serviceDataStoreOperations);
+    void serviceFeasibilityCheckShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException {
         ListenableFuture<RpcResult<ServiceFeasibilityCheckOutput>> result =
-                servicehandlerImpl.serviceFeasibilityCheck(new ServiceFeasibilityCheckInputBuilder().build());
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-
+                new ServiceFeasibilityCheckImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl,
+                        networkModelListenerImpl, pceServiceWrapper)
+                    .invoke(new ServiceFeasibilityCheckInputBuilder().build());
+        result.addListener(() -> endSignal.countDown(), executorService);
         endSignal.await();
-
-        RpcResult<ServiceFeasibilityCheckOutput> rpcResult = result.get();
-        Assert.assertEquals(
-            ResponseCodes.RESPONSE_FAILED, rpcResult.getResult().getConfigurationResponseCommon().getResponseCode());
+        assertEquals(
+            ResponseCodes.RESPONSE_FAILED,
+            result.get().getResult().getConfigurationResponseCommon().getResponseCode());
     }
 
     @Test
-    public void serviceFeasibilityCheckShouldBeSuccessfulWhenPreformPCESuccessful()
+    void serviceFeasibilityCheckShouldBeSuccessfulWhenPerformPCESuccessful()
             throws ExecutionException, InterruptedException {
-        ServiceFeasibilityCheckInput input = ServiceDataUtils.buildServiceFeasibilityCheckInput();
-        Mockito.when(pathComputationService.pathComputationRequest(any())).thenReturn(Futures.immediateFuture(any()));
-        ServicehandlerImpl servicehandlerImpl =
-                new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations,
-                        notificationPublishService, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl,
-                        serviceDataStoreOperations);
+        when(pathComputationService.pathComputationRequest(any())).thenReturn(Futures.immediateFuture(any()));
         ListenableFuture<RpcResult<ServiceFeasibilityCheckOutput>> result =
-            servicehandlerImpl.serviceFeasibilityCheck(input);
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-
+                new ServiceFeasibilityCheckImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl,
+                        networkModelListenerImpl, pceServiceWrapper)
+                    .invoke(ServiceDataUtils.buildServiceFeasibilityCheckInput());
+        result.addListener(() -> endSignal.countDown(), executorService);
         endSignal.await();
-
-        RpcResult<ServiceFeasibilityCheckOutput> rpcResult = result.get();
-        Assert.assertEquals(
-                ResponseCodes.RESPONSE_OK, rpcResult.getResult().getConfigurationResponseCommon().getResponseCode());
+        assertEquals(
+            ResponseCodes.RESPONSE_OK,
+            result.get().getResult().getConfigurationResponseCommon().getResponseCode());
     }
 
     @Test
-    public void serviceReconfigureShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException {
-        ServicehandlerImpl servicehandlerImpl =
-                new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations,
-                        notificationPublishService, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl,
-                        serviceDataStoreOperations);
+    void serviceReconfigureShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException {
         ListenableFuture<RpcResult<ServiceReconfigureOutput>> result =
-                servicehandlerImpl.serviceReconfigure(new ServiceReconfigureInputBuilder().setServiceName("").build());
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-
+                new ServiceReconfigureImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl,
+                        networkModelListenerImpl, rendererServiceWrapper)
+                    .invoke(new ServiceReconfigureInputBuilder().setServiceName("").build());
+        result.addListener(() -> endSignal.countDown(), executorService);
         endSignal.await();
     }
 
 
     @Test
-    public void serviceReconfigureShouldBeFailedWithNonExistService() throws ExecutionException, InterruptedException {
-        ServiceReconfigureInput input = ServiceDataUtils.buildServiceReconfigureInput();
-
+    void serviceReconfigureShouldBeFailedWithNonExistService() throws ExecutionException, InterruptedException {
         //action -> service reconfigure
-        ServicehandlerImpl servicehandlerImpl =
-                new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations,
-                        notificationPublishService, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl,
-                        serviceDataStoreOperations);
-        ListenableFuture<RpcResult<ServiceReconfigureOutput>> result = servicehandlerImpl.serviceReconfigure(input);
-
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-
+        ListenableFuture<RpcResult<ServiceReconfigureOutput>> result =
+                new ServiceReconfigureImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl,
+                        networkModelListenerImpl, rendererServiceWrapper)
+                    .invoke(serviceReconfigureInput);
+        result.addListener(() -> endSignal.countDown(), executorService);
         endSignal.await();
     }
 
     @Test
-    public void serviceReconfigureShouldBeSuccessForExistingService() throws ExecutionException, InterruptedException {
-        DataBroker dataBroker = getNewDataBroker();
-
-        //mocking
+    void serviceReconfigureShouldBeSuccessForExistingService() throws ExecutionException, InterruptedException {
         // serviceReconfigure is calling service delete method in renderer
-        Mockito.when(rendererServiceOperations.serviceDelete(any(), any())).thenReturn(Futures.immediateFuture(any()));
+        when(rendererServiceOperations.serviceDelete(any(), any())).thenReturn(Futures.immediateFuture(any()));
         //create service to reconfigure
-        ServicehandlerImpl servicehandlerImpl =
-                new ServicehandlerImpl(dataBroker, pathComputationService, rendererServiceOperations,
-                        notificationPublishService, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl,
-                        serviceDataStoreOperations);
-        ServiceCreateInput createInput = ServiceDataUtils.buildServiceCreateInput();
-        serviceDataStoreOperations.createService(createInput);
-
+        serviceDataStoreOperations.createService(serviceCreateInput);
         //service reconfigure test action
-        ServiceReconfigureInput input = ServiceDataUtils.buildServiceReconfigureInput();
         //ServiceReconfigureInput is created with the same service information that is created before
-        ListenableFuture<RpcResult<ServiceReconfigureOutput>> result = servicehandlerImpl.serviceReconfigure(input);
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-
+        ListenableFuture<RpcResult<ServiceReconfigureOutput>> result =
+                new ServiceReconfigureImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl,
+                        networkModelListenerImpl, rendererServiceWrapper)
+                    .invoke(serviceReconfigureInput);
+        result.addListener(() -> endSignal.countDown(), executorService);
         endSignal.await();
     }
 
     @Test
-    public void serviceReRestorationShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException {
-        ServicehandlerImpl servicehandlerImpl =
-                new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations,
-                        notificationPublishService, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl,
-                        serviceDataStoreOperations);
+    void serviceReRestorationShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException {
         ListenableFuture<RpcResult<ServiceRestorationOutput>> result =
-                servicehandlerImpl.serviceRestoration(new ServiceRestorationInputBuilder().setServiceName("").build());
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-
+                new ServiceRestorationImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl,
+                        networkModelListenerImpl, rendererServiceWrapper)
+                    .invoke(new ServiceRestorationInputBuilder()
+                            .setServiceName("")
+                            .build());
+        result.addListener(() -> endSignal.countDown(), executorService);
         endSignal.await();
     }
 
-
     @Test
-    public void serviceRestorationShouldBeFailedWithNonExistService() throws ExecutionException, InterruptedException {
-        ServiceRestorationInput input = ServiceDataUtils.buildServiceRestorationInput();
-
+    void serviceRestorationShouldBeFailedWithNonExistService() throws ExecutionException, InterruptedException {
         //action -> service restore
-        ServicehandlerImpl servicehandlerImpl =
-                new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations,
-                        notificationPublishService, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl,
-                        serviceDataStoreOperations);
-        ListenableFuture<RpcResult<ServiceRestorationOutput>> result = servicehandlerImpl.serviceRestoration(input);
-
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-
+        ListenableFuture<RpcResult<ServiceRestorationOutput>> result =
+                new ServiceRestorationImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl,
+                        networkModelListenerImpl, rendererServiceWrapper)
+                    .invoke(serviceRestorationInput);
+        result.addListener(() -> endSignal.countDown(), executorService);
         endSignal.await();
     }
 
     @Test
-    public void serviceRestorationShouldBeSuccessForExistingService() throws ExecutionException, InterruptedException {
-        DataBroker dataBroker = getNewDataBroker();
-
-        //mocking
+    void serviceRestorationShouldBeSuccessForExistingService() throws ExecutionException, InterruptedException {
         // serviceRestoration is calling service delete method in renderer
-        Mockito.when(rendererServiceOperations.serviceDelete(any(), any())).thenReturn(Futures.immediateFuture(any()));
+        when(rendererServiceOperations.serviceDelete(any(), any())).thenReturn(Futures.immediateFuture(any()));
         //create service to restore
-        ServicehandlerImpl servicehandlerImpl =
-                new ServicehandlerImpl(dataBroker, pathComputationService, rendererServiceOperations,
-                        notificationPublishService, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl,
-                        serviceDataStoreOperations);
-        ServiceCreateInput createInput = ServiceDataUtils.buildServiceCreateInput();
-        serviceDataStoreOperations.createService(createInput);
-
+        serviceDataStoreOperations.createService(serviceCreateInput);
         //service Restoration test action
-        ServiceRestorationInput input = ServiceDataUtils.buildServiceRestorationInput();
         //ServiceRestorationInput is created with the same service information that is created before
-        ListenableFuture<RpcResult<ServiceRestorationOutput>> result = servicehandlerImpl.serviceRestoration(input);
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-
+        ListenableFuture<RpcResult<ServiceRestorationOutput>> result =
+                new ServiceRestorationImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl,
+                        networkModelListenerImpl, rendererServiceWrapper)
+                    .invoke(serviceRestorationInput);
+        result.addListener(() -> endSignal.countDown(), executorService);
         endSignal.await();
     }
 
     @Test
-    public void serviceRerouteShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException {
-        ServicehandlerImpl servicehandlerImpl =
-                new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations,
-                        notificationPublishService, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl,
-                        serviceDataStoreOperations);
+    void serviceRerouteShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException {
         ListenableFuture<RpcResult<ServiceRerouteOutput>> result =
-                servicehandlerImpl.serviceReroute(new ServiceRerouteInputBuilder().setServiceName("").build());
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-
+                new ServiceRerouteImpl(serviceDataStoreOperations, pceServiceWrapper)
+                    .invoke(new ServiceRerouteInputBuilder()
+                            .setServiceName("")
+                            .build());
+        result.addListener(() -> endSignal.countDown(), executorService);
         endSignal.await();
+        assertEquals(
+            ResponseCodes.RESPONSE_FAILED,
+            result.get().getResult().getConfigurationResponseCommon().getResponseCode());
     }
 
     @Test
-    public void serviceRerouteShouldBeFailedWithNonExistService() throws ExecutionException, InterruptedException {
-        ServiceRerouteInput input = ServiceDataUtils.buildServiceRerouteInput();
-
+    void serviceRerouteShouldBeFailedWithNonExistService() throws ExecutionException, InterruptedException {
         //action -> service reconfigure
-        ServicehandlerImpl servicehandlerImpl =
-                new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations,
-                        notificationPublishService, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl,
-                        serviceDataStoreOperations);
-        ListenableFuture<RpcResult<ServiceRerouteOutput>> result = servicehandlerImpl.serviceReroute(input);
-
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-
+        ListenableFuture<RpcResult<ServiceRerouteOutput>> result =
+                new ServiceRerouteImpl(serviceDataStoreOperations, pceServiceWrapper)
+                    .invoke(serviceRerouteInput);
+        result.addListener(() -> endSignal.countDown(), executorService);
         endSignal.await();
+        assertEquals(
+            ResponseCodes.RESPONSE_FAILED,
+            result.get().getResult().getConfigurationResponseCommon().getResponseCode());
     }
 
     @Test
-    public void serviceRerouteShouldBeSuccessForExistingService() throws ExecutionException, InterruptedException {
-        DataBroker dataBroker = getNewDataBroker();
-
-        //mocking
-        // serviceReroute is calling service delete method in renderer
-        Mockito.when(rendererServiceOperations.serviceDelete(any(), any())).thenReturn(Futures.immediateFuture(any()));
-        //create service to be rerouted later
-        ServicehandlerImpl servicehandlerImpl =
-                new ServicehandlerImpl(dataBroker, pathComputationService, rendererServiceOperations,
-                        notificationPublishService, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl,
-                        serviceDataStoreOperations);
-        ServiceCreateInput createInput = ServiceDataUtils.buildServiceCreateInput();
-        serviceDataStoreOperations.createService(createInput);
-
-        //service reroute test action
-        ServiceRerouteInput input = ServiceDataUtils.buildServiceRerouteInput();
-        //ServiceRerouteInput is created with the same service information that is created before
-        ListenableFuture<RpcResult<ServiceRerouteOutput>> result = servicehandlerImpl.serviceReroute(input);
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-
+    void serviceRerouteShouldBeSuccessForExistingService() throws ExecutionException, InterruptedException {
+        when(pathComputationService.pathComputationRerouteRequest(any()))
+            .thenReturn(Futures.immediateFuture(new PathComputationRerouteRequestOutputBuilder()
+                    .setConfigurationResponseCommon(new ConfigurationResponseCommonBuilder()
+                            .setResponseCode(ResponseCodes.RESPONSE_OK)
+                            .build())
+                    .build()));
+        Map<AToZKey, AToZ> atoz = Map.of(
+                new AToZKey("0"),
+                new AToZBuilder()
+                        .setId("0")
+                        .setResource(new ResourceBuilder()
+                                .setResource(new TerminationPointBuilder()
+                                        .setTpNodeId("tpNodeIdC")
+                                        .setTpId("TpIdC1")
+                                        .build())
+                                .setState(State.InService)
+                                .build())
+                        .build(),
+                new AToZKey("1"),
+                new AToZBuilder()
+                        .setId("1")
+                        .setResource(new ResourceBuilder()
+                                .setResource(new TerminationPointBuilder()
+                                        .setTpNodeId("tpNodeIdD")
+                                        .setTpId("TpIdCD")
+                                        .build())
+                                .setState(State.InService)
+                                .build())
+                        .build(), new AToZKey("2"),
+                new AToZBuilder()
+                        .setId("2")
+                        .setResource(new ResourceBuilder()
+                                .setResource(new TerminationPointBuilder()
+                                        .setTpNodeId("tpNodeIdA")
+                                        .setTpId("TpIdA1")
+                                        .build())
+                                .setState(State.InService)
+                                .build())
+                        .build()
+
+        );
+        serviceDataStoreOperations.createServicePath(new ServiceInput(serviceCreateInput),
+                new PathComputationRequestOutputBuilder()
+                        .setResponseParameters(new ResponseParametersBuilder()
+                                .setPathDescription(new PathDescriptionBuilder()
+                                        .setAToZDirection(new AToZDirectionBuilder()
+                                                .setAToZ(atoz)
+                                                .setRate(Uint32.valueOf(1))
+                                                .build())
+                                        .setZToADirection(new ZToADirectionBuilder()
+                                                .setRate(Uint32.valueOf(1))
+                                                .build())
+                                        .build())
+                                .build())
+                        .build());
+        serviceDataStoreOperations.createService(serviceCreateInput);
+        ListenableFuture<RpcResult<ServiceRerouteOutput>> result =
+                new ServiceRerouteImpl(serviceDataStoreOperations, pceServiceWrapper)
+                    .invoke(serviceRerouteInput);
+        result.addListener(() -> endSignal.countDown(), executorService);
         endSignal.await();
+        assertEquals(
+            ResponseCodes.RESPONSE_OK,
+            result.get().getResult().getConfigurationResponseCommon().getResponseCode());
     }
 
     @Test
-    public void tempServiceDeleteShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException {
-        ServicehandlerImpl servicehandlerImpl =
-                new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations,
-                        notificationPublishService, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl,
-                        serviceDataStoreOperations);
+    void tempServiceDeleteShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException {
         ListenableFuture<RpcResult<TempServiceDeleteOutput>> result =
-                servicehandlerImpl.tempServiceDelete(new TempServiceDeleteInputBuilder()
-                        .setCommonId("").build());
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-
+                new TempServiceDeleteImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl,
+                        rendererServiceWrapper)
+                    .invoke(new TempServiceDeleteInputBuilder()
+                            .setCommonId("")
+                            .build());
+        result.addListener(() -> endSignal.countDown(), executorService);
         endSignal.await();
-
         RpcResult<TempServiceDeleteOutput> rpcResult = result.get();
-        Assert.assertEquals(
-            ResponseCodes.RESPONSE_FAILED, rpcResult.getResult().getConfigurationResponseCommon().getResponseCode());
-        Assert.assertEquals(
+        assertEquals(
+            ResponseCodes.RESPONSE_FAILED,
+            rpcResult.getResult().getConfigurationResponseCommon().getResponseCode());
+        assertEquals(
             LogMessages.SERVICE_NON_COMPLIANT,
             rpcResult.getResult().getConfigurationResponseCommon().getResponseMessage());
     }
 
     @Test
-    public void tempServiceDeleteShouldBeFailedWithNonExistService() throws ExecutionException, InterruptedException {
-        TempServiceDeleteInput input = ServiceDataUtils.buildTempServiceDeleteInput();
-        ServicehandlerImpl servicehandlerImpl =
-                new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations,
-                        notificationPublishService, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl,
-                        serviceDataStoreOperations);
-        ListenableFuture<RpcResult<TempServiceDeleteOutput>> result = servicehandlerImpl.tempServiceDelete(input);
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-
+    void tempServiceDeleteShouldBeFailedWithNonExistService() throws ExecutionException, InterruptedException {
+        ListenableFuture<RpcResult<TempServiceDeleteOutput>> result =
+                new TempServiceDeleteImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl,
+                        rendererServiceWrapper)
+                    .invoke(ServiceDataUtils.buildTempServiceDeleteInput());
+        result.addListener(() -> endSignal.countDown(), executorService);
         endSignal.await();
-
-        RpcResult<TempServiceDeleteOutput> rpcResult = result.get();
-        Assert.assertEquals(
-            ResponseCodes.RESPONSE_FAILED, rpcResult.getResult().getConfigurationResponseCommon().getResponseCode());
+        assertEquals(
+            ResponseCodes.RESPONSE_FAILED,
+            result.get().getResult().getConfigurationResponseCommon().getResponseCode());
     }
 
     @Test
-    public void tempServiceDeleteShouldBeSuccessForExistingService() throws ExecutionException, InterruptedException {
-        DataBroker dataBroker = getNewDataBroker();
-        Mockito.when(rendererServiceOperations.serviceDelete(any(), any())).thenReturn(Futures.immediateFuture(any()));
-
+    void tempServiceDeleteShouldBeSuccessForExistingService() throws ExecutionException, InterruptedException {
+        when(rendererServiceOperations.serviceDelete(any(), any())).thenReturn(Futures.immediateFuture(any()));
         //create temp service to delete in the temp delete action
-        ServicehandlerImpl servicehandlerImpl =
-                new ServicehandlerImpl(dataBroker, pathComputationService, rendererServiceOperations,
-                        notificationPublishService, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl,
-                        serviceDataStoreOperations);
         TempServiceCreateInput createInput = ServiceDataUtils.buildTempServiceCreateInput();
-        serviceDataStoreOperations.createTempService(createInput);
-
-
-        TempServiceDeleteInput input = ServiceDataUtils.buildTempServiceDeleteInput(createInput.getCommonId());
-        ListenableFuture<RpcResult<TempServiceDeleteOutput>> result = servicehandlerImpl.tempServiceDelete(input);
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-
+        serviceDataStoreOperations.createTempService(createInput, pathDescription);
+        ListenableFuture<RpcResult<TempServiceDeleteOutput>> result =
+                new TempServiceDeleteImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl,
+                        rendererServiceWrapper)
+                    .invoke(ServiceDataUtils.buildTempServiceDeleteInput(createInput.getCommonId()));
+        result.addListener(() -> endSignal.countDown(), executorService);
         endSignal.await();
+        assertEquals(
+            ResponseCodes.RESPONSE_OK,
+            result.get().getResult().getConfigurationResponseCommon().getResponseCode());
+    }
 
-        RpcResult<TempServiceDeleteOutput> rpcResult = result.get();
-        Assert.assertEquals(
-                ResponseCodes.RESPONSE_OK, rpcResult.getResult().getConfigurationResponseCommon().getResponseCode());
+    @Test
+    void tempServiceCreateShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException {
+        ListenableFuture<RpcResult<TempServiceCreateOutput>> result =
+                new TempServiceCreateImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl,
+                        networkModelListenerImpl, pceServiceWrapper)
+                    .invoke(new TempServiceCreateInputBuilder().build());
+        result.addListener(() -> endSignal.countDown(), executorService);
+        endSignal.await();
+        assertEquals(
+            ResponseCodes.RESPONSE_FAILED,
+            result.get().getResult().getConfigurationResponseCommon().getResponseCode());
     }
 
     @Test
-    public void tempServiceCreateShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException {
-        ServicehandlerImpl servicehandlerImpl =
-                new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations,
-                        notificationPublishService, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl,
-                        serviceDataStoreOperations);
+    void tempServiceCreateShouldBeFailedWithServiceAlreadyExist() throws ExecutionException, InterruptedException {
+        final ServiceDataStoreOperations serviceDSOperations = mock(ServiceDataStoreOperations.class);
+        when(serviceDSOperations.getTempService(any()))
+            .thenReturn(Optional.of(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.temp.service.list
+                            .ServicesBuilder()
+                        .setCommonId("bad_commonId")
+                        .build()));
         ListenableFuture<RpcResult<TempServiceCreateOutput>> result =
-                servicehandlerImpl.tempServiceCreate(new TempServiceCreateInputBuilder().build());
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
+                new TempServiceCreateImpl(serviceDSOperations, pceListenerImpl, rendererListenerImpl,
+                        networkModelListenerImpl, pceServiceWrapper)
+                    .invoke(ServiceDataUtils.buildTempServiceCreateInput());
+        result.addListener(() -> endSignal.countDown(), executorService);
+        endSignal.await();
+        assertEquals(
+            ResponseCodes.RESPONSE_FAILED,
+            result.get().getResult().getConfigurationResponseCommon().getResponseCode());
+        assertEquals(
+            "Service 'Temp (commonId)' already exists in datastore",
+            result.get().getResult().getConfigurationResponseCommon().getResponseMessage());
+    }
 
+    @Test
+    void tempServiceCreateShouldBeSuccessfulWhenPerformPCESuccessful()
+            throws ExecutionException, InterruptedException {
+        when(pathComputationService.pathComputationRequest(any())).thenReturn(Futures.immediateFuture(any()));
+        ListenableFuture<RpcResult<TempServiceCreateOutput>> result =
+                new TempServiceCreateImpl(serviceDataStoreOperations, pceListenerImpl, rendererListenerImpl,
+                        networkModelListenerImpl, pceServiceWrapper)
+                    .invoke(ServiceDataUtils.buildTempServiceCreateInput());
+        result.addListener(() -> endSignal.countDown(), executorService);
         endSignal.await();
+        assertEquals(
+            ResponseCodes.RESPONSE_OK,
+            result.get().getResult().getConfigurationResponseCommon().getResponseCode());
+    }
 
-        RpcResult<TempServiceCreateOutput> rpcResult = result.get();
+    @Test
+    public void addOpenroadmOperationalModesToCatalogShouldBeFailedWithEmptyInput()
+            throws ExecutionException, InterruptedException {
+        ListenableFuture<RpcResult<AddOpenroadmOperationalModesToCatalogOutput>> result =
+                new AddOpenroadmOperationalModesToCatalogImpl(catalogDataStoreOperations)
+                    .invoke(new AddOpenroadmOperationalModesToCatalogInputBuilder().build());
         Assert.assertEquals(
-            ResponseCodes.RESPONSE_FAILED, rpcResult.getResult().getConfigurationResponseCommon().getResponseCode());
+            ResponseCodes.RESPONSE_FAILED,
+            result.get().getResult().getConfigurationResponseCommon().getResponseCode());
     }
 
-
     @Test
-    public void tempServiceCreateShouldBeSuccessfulWhenPreformPCESuccessful()
+    public void addSpecificOperationalModesToCatalogShouldBeFailedWithEmptyInput()
             throws ExecutionException, InterruptedException {
-        TempServiceCreateInput input = ServiceDataUtils.buildTempServiceCreateInput();
-        Mockito.when(pathComputationService.pathComputationRequest(any())).thenReturn(Futures.immediateFuture(any()));
-
-        ServicehandlerImpl servicehandlerImpl =
-                new ServicehandlerImpl(getNewDataBroker(), pathComputationService, rendererServiceOperations,
-                        notificationPublishService, pceListenerImpl, rendererListenerImpl, networkModelListenerImpl,
-                        serviceDataStoreOperations);
-
-        ListenableFuture<RpcResult<TempServiceCreateOutput>> result =  servicehandlerImpl.tempServiceCreate(input);
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-
-        endSignal.await();
-
-        RpcResult<TempServiceCreateOutput> rpcResult = result.get();
+        ListenableFuture<RpcResult<AddSpecificOperationalModesToCatalogOutput>> result =
+                new AddSpecificOperationalModesToCatalogImpl(catalogDataStoreOperations)
+                    .invoke(new AddSpecificOperationalModesToCatalogInputBuilder().build());
+        Assert.assertEquals(
+            ResponseCodes.RESPONSE_FAILED,
+            result.get().getResult().getConfigurationResponseCommon().getResponseCode());
+    }
 
+    @Test
+    public void addOpenroadmOperationalModesToCatalogShouldBeSuccessfulWhenAddORToCatalog()
+            throws ExecutionException, InterruptedException {
+        ListenableFuture<RpcResult<AddOpenroadmOperationalModesToCatalogOutput>> result =
+                new AddOpenroadmOperationalModesToCatalogImpl(catalogDataStoreOperations)
+                    .invoke(CatalogDataUtils.buildAddORToCatalogInput());
         Assert.assertEquals(
-                ResponseCodes.RESPONSE_OK, rpcResult.getResult().getConfigurationResponseCommon().getResponseCode());
+            ResponseCodes.RESPONSE_OK,
+            result.get().getResult().getConfigurationResponseCommon().getResponseCode());
     }
 
+    @Test
+    public void addSpecificOperationalModesToCatalogShouldBeSuccessfulWhenAddSpecificToCatalog()
+            throws ExecutionException, InterruptedException {
+        ListenableFuture<RpcResult<AddSpecificOperationalModesToCatalogOutput>> result =
+                new AddSpecificOperationalModesToCatalogImpl(catalogDataStoreOperations)
+                    .invoke(CatalogDataUtils.buildAddSpecificToCatalogInput());
+        Assert.assertEquals(
+            ResponseCodes.RESPONSE_OK,
+            result.get().getResult().getConfigurationResponseCommon().getResponseCode());
+    }
 }
diff --git a/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerProviderTest.java b/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/impl/ServicehandlerProviderTest.java
deleted file mode 100644 (file)
index 85b51d7..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright © 2019 Orange, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.transportpce.servicehandler.impl;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.opendaylight.mdsal.binding.api.RpcProviderService;
-import org.opendaylight.transportpce.servicehandler.listeners.NetworkModelListenerImpl;
-import org.opendaylight.transportpce.servicehandler.listeners.PceListenerImpl;
-import org.opendaylight.transportpce.servicehandler.listeners.RendererListenerImpl;
-import org.opendaylight.transportpce.servicehandler.listeners.ServiceListener;
-import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
-import org.opendaylight.transportpce.test.AbstractTest;
-
-public class ServicehandlerProviderTest  extends AbstractTest {
-
-    @Mock
-    RpcProviderService rpcProviderRegistry;
-
-    @Mock
-    ServiceDataStoreOperations serviceDataStoreOperations;
-
-    @Mock
-    PceListenerImpl pceListenerImpl;
-
-    @Mock
-    ServiceListener serviceListener;
-
-    @Mock
-    RendererListenerImpl rendererListenerImpl;
-
-    @Mock
-    NetworkModelListenerImpl networkModelListenerImpl;
-
-    @Mock
-    ServicehandlerImpl servicehandler;
-
-
-    private AutoCloseable closeable;
-
-    @Before
-    public void openMocks() {
-        closeable = MockitoAnnotations.openMocks(this);
-    }
-
-    @Test
-    public void testInitRegisterServiceHandlerToRpcRegistry() {
-        ServicehandlerProvider provider =  new ServicehandlerProvider(
-                getDataBroker(), rpcProviderRegistry,
-                getNotificationService() , serviceDataStoreOperations, pceListenerImpl, serviceListener,
-                rendererListenerImpl, networkModelListenerImpl, servicehandler);
-
-        provider.init();
-
-        verify(rpcProviderRegistry, times(1))
-                .registerRpcImplementation(any(), any(ServicehandlerImpl.class));
-    }
-
-    @After public void releaseMocks() throws Exception {
-        closeable.close();
-    }
-
-}
diff --git a/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/listeners/NetworkModelNotificationHandlerTest.java b/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/listeners/NetworkModelNotificationHandlerTest.java
new file mode 100644 (file)
index 0000000..7780952
--- /dev/null
@@ -0,0 +1,515 @@
+/*
+ * Copyright © 2022 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.servicehandler.listeners;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doCallRealMethod;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.transportpce.common.OperationResult;
+import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.TopologyUpdateResult;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.TopologyUpdateResultBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.topology.update.result.TopologyChanges;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.topology.update.result.TopologyChangesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.networkmodel.rev201116.topology.update.result.TopologyChangesKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.ServicesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZ;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToA;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToABuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToAKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.ResourceBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.LinkBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.NodeBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.TerminationPointBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.path.PathDescription;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.path.PathDescriptionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.ServicePathListBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePaths;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePathsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePathsKey;
+
+@ExtendWith(MockitoExtension.class)
+public class NetworkModelNotificationHandlerTest {
+
+    @Mock
+    private NotificationPublishService notificationPublishService;
+    @Mock
+    private ServiceDataStoreOperations serviceDataStoreOperations;
+    private static PathDescription pathDescription;
+    private NetworkModelNotificationHandler networkModelListener;
+
+    @BeforeEach
+    void setUp() {
+        pathDescription = new PathDescriptionBuilder()
+                .setAToZDirection(new AToZDirectionBuilder().setAToZ(new HashMap<>(createMapAtoZ())).build())
+                .setZToADirection(new ZToADirectionBuilder().setZToA(new HashMap<>(createMapZtoA())).build())
+                .build();
+        networkModelListener = new NetworkModelNotificationHandler(notificationPublishService,
+                serviceDataStoreOperations);
+    }
+
+    @Test
+    void testChangePathElementStateZAShouldNotModifyPathDescriptionsElementStates() {
+        Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
+                new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
+                new TopologyChangesBuilder()
+                        .setNodeId("tpNodeIdA")
+                        .setTpId("TpIdA1")
+                        .setState(State.InService)
+                        .build(),
+                new TopologyChangesKey("tpNodeIdA", "TpIdA2"),
+                new TopologyChangesBuilder()
+                        .setNodeId("tpNodeIdA")
+                        .setTpId("TpIdA2")
+                        .setState(State.InService)
+                        .build()
+        );
+
+        assertEquals(
+            pathDescription.getZToADirection().getZToA(),
+            networkModelListener.changePathElementStateZA(topologyChanges, pathDescription));
+    }
+
+    @Test
+    void testChangePathElementStateZAShouldModifyPathDescriptionsElementStates() {
+        Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
+                new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
+                new TopologyChangesBuilder()
+                        .setNodeId("tpNodeIdA")
+                        .setTpId("TpIdA1")
+                        .setState(State.OutOfService)
+                        .build(),
+                new TopologyChangesKey("tpNodeIdA", "TpIdA2"),
+                new TopologyChangesBuilder()
+                        .setNodeId("tpNodeIdA")
+                        .setTpId("TpIdA2")
+                        .setState(State.OutOfService)
+                        .build());
+
+        Map<ZToAKey, ZToA> ztoamapExpected = pathDescription.getZToADirection().getZToA();
+        ztoamapExpected.computeIfPresent(
+                new ZToAKey("6"),
+                (zToAKey, zToA) -> new ZToABuilder(zToA)
+                        .setResource(new ResourceBuilder(zToA.getResource())
+                                .setState(State.OutOfService)
+                                .build())
+                        .build());
+        ztoamapExpected.computeIfPresent(
+                new ZToAKey("4"),
+                (zToAKey, zToA) -> new ZToABuilder(zToA)
+                        .setResource(new ResourceBuilder(zToA.getResource())
+                                .setState(State.OutOfService)
+                                .build())
+                        .build());
+        assertEquals(ztoamapExpected, networkModelListener.changePathElementStateZA(topologyChanges, pathDescription));
+    }
+
+    @Test
+    void testChangePathElementStateAZShouldNotModifyPathDescriptionsElementStates() {
+        Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
+                new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
+                new TopologyChangesBuilder()
+                        .setNodeId("tpNodeIdA")
+                        .setTpId("TpIdA1")
+                        .setState(State.InService)
+                        .build(),
+                new TopologyChangesKey("tpNodeIdA", "TpIdA2"),
+                new TopologyChangesBuilder()
+                        .setNodeId("tpNodeIdA")
+                        .setTpId("TpIdA2")
+                        .setState(State.InService)
+                        .build());
+
+        assertEquals(
+            pathDescription.getAToZDirection().getAToZ(),
+            networkModelListener.changePathElementStateAZ(topologyChanges, pathDescription));
+    }
+
+    @Test
+    void testChangePathElementStateAZShouldModifyPathDescriptionsElementStates() {
+        Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
+                new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
+                new TopologyChangesBuilder()
+                        .setNodeId("tpNodeIdA")
+                        .setTpId("TpIdA1")
+                        .setState(State.OutOfService)
+                        .build(),
+                new TopologyChangesKey("tpNodeIdA", "TpIdA2"),
+                new TopologyChangesBuilder()
+                        .setNodeId("tpNodeIdA")
+                        .setTpId("TpIdA2")
+                        .setState(State.OutOfService)
+                        .build());
+
+        Map<AToZKey, AToZ> atozmapExpected = pathDescription.getAToZDirection().getAToZ();
+        atozmapExpected.computeIfPresent(
+                new AToZKey("0"),
+                (aToZKey, aToZ) -> new AToZBuilder(aToZ)
+                        .setResource(new ResourceBuilder(aToZ.getResource())
+                                .setState(State.OutOfService)
+                                .build())
+                        .build());
+        atozmapExpected.computeIfPresent(
+                new AToZKey("2"),
+                (aToZKey, aToZ) -> new AToZBuilder(aToZ)
+                        .setResource(new ResourceBuilder(aToZ.getResource())
+                                .setState(State.OutOfService)
+                                .build())
+                        .build());
+        assertEquals(atozmapExpected, networkModelListener.changePathElementStateAZ(topologyChanges, pathDescription));
+    }
+
+    @Test
+    void testAllElementsinPathinServiceShouldReturnFalse() {
+        Map<AToZKey, AToZ> atozmap = pathDescription.getAToZDirection().getAToZ();
+        atozmap.computeIfPresent(
+                new AToZKey("0"),
+                (aToZKey, aToZ) -> new AToZBuilder(aToZ)
+                        .setResource(new ResourceBuilder(aToZ.getResource())
+                                .setState(State.OutOfService)
+                                .build())
+                        .build());
+        Map<ZToAKey, ZToA> ztoamap = pathDescription.getZToADirection().getZToA();
+        ztoamap.computeIfPresent(
+                new ZToAKey("6"),
+                (zToAKey, zToA) -> new ZToABuilder(zToA)
+                        .setResource(new ResourceBuilder(zToA.getResource())
+                                .setState(State.OutOfService)
+                                .build())
+                        .build());
+        assertFalse(networkModelListener.allElementsinPathinService(atozmap, ztoamap));
+    }
+
+    @Test
+    void testAllElementsinPathinServiceShouldReturnTrue() {
+        assertTrue(networkModelListener.allElementsinPathinService(pathDescription.getAToZDirection().getAToZ(),
+                pathDescription.getZToADirection().getZToA()));
+    }
+
+    @Test
+    void testUpdateServicePathsShouldNotModifyServiceState() {
+        Map<ServicePathsKey, ServicePaths> servicePathMap = Map.of(new ServicePathsKey("service-path 1"),
+                new ServicePathsBuilder()
+                        .setServicePathName("service-path 1")
+                        .setPathDescription(pathDescription)
+                        .build());
+
+        when(serviceDataStoreOperations.getServicePaths())
+            .thenReturn(Optional.of(new ServicePathListBuilder().setServicePaths(servicePathMap).build()));
+        when(serviceDataStoreOperations.modifyServicePath(any(PathDescription.class), anyString()))
+            .thenReturn(OperationResult.ok(""));
+        when(serviceDataStoreOperations.getService(anyString()))
+            .thenReturn(Optional.of(new ServicesBuilder()
+                    .setServiceName("serviceTest")
+                    .setOperationalState(State.InService)
+                    .setAdministrativeState(AdminStates.InService)
+                    .build()));
+
+        Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
+                new TopologyChangesKey("tpNodeIdC", "TpIdC1"),
+                new TopologyChangesBuilder()
+                        .setNodeId("tpNodeIdC")
+                        .setTpId("TpIdC1")
+                        .setState(State.OutOfService)
+                        .build(),
+                new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
+                new TopologyChangesBuilder()
+                        .setNodeId("tpNodeIdA")
+                        .setTpId("TpIdA1")
+                        .setState(State.InService)
+                        .build());
+
+        networkModelListener.updateServicePaths(new TopologyUpdateResultBuilder()
+                .setTopologyChanges(topologyChanges).build());
+        verify(serviceDataStoreOperations, never())
+            .modifyService(anyString(), any(State.class), any(AdminStates.class));
+    }
+
+    @Test
+    void testUpdateServicePathsShouldModifyServiceState() {
+        Map<ServicePathsKey, ServicePaths> servicePathMap = Map.of(
+                new ServicePathsKey("service-path 1"),
+                new ServicePathsBuilder()
+                        .setServicePathName("service-path 1")
+                        .setPathDescription(pathDescription)
+                        .build());
+
+        when(serviceDataStoreOperations.getServicePaths())
+            .thenReturn(Optional.of(new ServicePathListBuilder().setServicePaths(servicePathMap).build()));
+        when(serviceDataStoreOperations.modifyServicePath(any(PathDescription.class), anyString()))
+            .thenReturn(OperationResult.ok(""));
+        when(serviceDataStoreOperations.getService(anyString()))
+            .thenReturn(Optional.of(new ServicesBuilder()
+                    .setServiceName("serviceTest")
+                    .setOperationalState(State.InService)
+                    .setAdministrativeState(AdminStates.InService)
+                    .build()));
+        when(serviceDataStoreOperations.modifyService(anyString(), any(State.class), any(AdminStates.class)))
+            .thenReturn(OperationResult.ok(""));
+
+        Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
+                new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
+                new TopologyChangesBuilder()
+                        .setNodeId("tpNodeIdA")
+                        .setTpId("TpIdA1")
+                        .setState(State.OutOfService)
+                        .build());
+
+        networkModelListener.updateServicePaths(new TopologyUpdateResultBuilder()
+                .setTopologyChanges(topologyChanges).build());
+        verify(serviceDataStoreOperations, times(1))
+            .modifyService(anyString(), eq(State.OutOfService), any(AdminStates.class));
+    }
+
+    @Test
+    void testOnTopologyUpdateResultWhenNeverWired() {
+        NetworkModelNotificationHandler networkModelListenerMocked = Mockito.mock(
+            NetworkModelNotificationHandler.class);
+        doCallRealMethod().when(networkModelListenerMocked).onTopologyUpdateResult(any(TopologyUpdateResult.class));
+
+        Map<TopologyChangesKey, TopologyChanges> topologyChanges1 = Map.of(
+                new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
+                new TopologyChangesBuilder()
+                        .setNodeId("tpNodeIdA")
+                        .setTpId("TpIdA1")
+                        .setState(State.OutOfService)
+                        .build());
+        Map<TopologyChangesKey, TopologyChanges> topologyChanges2 = Map.of(
+                new TopologyChangesKey("tpNodeIdC", "TpIdC1"),
+                new TopologyChangesBuilder()
+                        .setNodeId("tpNodeIdC")
+                        .setTpId("TpIdC1")
+                        .setState(State.OutOfService)
+                        .build());
+
+        networkModelListenerMocked.onTopologyUpdateResult(new TopologyUpdateResultBuilder()
+                .setTopologyChanges(topologyChanges1).build());
+        networkModelListenerMocked.onTopologyUpdateResult(new TopologyUpdateResultBuilder()
+                .setTopologyChanges(topologyChanges2).build());
+        verify(networkModelListenerMocked, times(2)).updateServicePaths(any(TopologyUpdateResult.class));
+    }
+
+    @Test
+    void testOnTopologyUpdateResultWhenAlreadyWired() {
+        NetworkModelNotificationHandler networkModelListenerMocked = Mockito.mock(
+            NetworkModelNotificationHandler.class);
+        doCallRealMethod().when(networkModelListenerMocked).onTopologyUpdateResult(any(TopologyUpdateResult.class));
+
+        Map<TopologyChangesKey, TopologyChanges> topologyChanges = Map.of(
+                new TopologyChangesKey("tpNodeIdA", "TpIdA1"),
+                new TopologyChangesBuilder()
+                        .setNodeId("tpNodeIdA")
+                        .setTpId("TpIdA1")
+                        .setState(State.OutOfService)
+                        .build());
+        TopologyUpdateResult topologyUpdateResult = new TopologyUpdateResultBuilder()
+                .setTopologyChanges(topologyChanges).build();
+
+        networkModelListenerMocked.onTopologyUpdateResult(topologyUpdateResult);
+        networkModelListenerMocked.onTopologyUpdateResult(topologyUpdateResult);
+        verify(networkModelListenerMocked, times(1)).updateServicePaths(any(TopologyUpdateResult.class));
+    }
+
+    private Map<AToZKey, AToZ> createMapAtoZ() {
+        Map<AToZKey, AToZ> atozmap = new HashMap<>();
+        atozmap.put(
+                new AToZKey("0"),
+                new AToZBuilder()
+                        .setId("0")
+                        .setResource(new ResourceBuilder()
+                                .setResource(new TerminationPointBuilder()
+                                        .setTpNodeId("tpNodeIdA")
+                                        .setTpId("TpIdA1")
+                                        .build())
+                                .setState(State.InService)
+                                .build())
+                        .build());
+        atozmap.put(
+                new AToZKey("1"),
+                new AToZBuilder()
+                        .setId("1")
+                        .setResource(new ResourceBuilder()
+                                .setResource(new NodeBuilder()
+                                        .setNodeId("NodeIdA")
+                                        .build())
+                                .setState(State.InService)
+                                .build())
+                        .build());
+        atozmap.put(
+                new AToZKey("2"),
+                new AToZBuilder()
+                        .setId("2")
+                        .setResource(new ResourceBuilder()
+                                .setResource(new TerminationPointBuilder()
+                                        .setTpNodeId("tpNodeIdA")
+                                        .setTpId("TpIdA2")
+                                        .build())
+                                .setState(State.InService)
+                                .build())
+                        .build());
+        atozmap.put(
+                new AToZKey("3"),
+                new AToZBuilder()
+                        .setId("3")
+                        .setResource(new ResourceBuilder()
+                                .setResource(new LinkBuilder()
+                                        .setLinkId("LinkIdAZ")
+                                        .build())
+                                .setState(State.InService)
+                                .build())
+                        .build());
+        atozmap.put(
+                new AToZKey("4"),
+                new AToZBuilder()
+                        .setId("4")
+                        .setResource(new ResourceBuilder()
+                                .setResource(new TerminationPointBuilder()
+                                        .setTpNodeId("tpNodeIdZ")
+                                        .setTpId("TpIdZ2")
+                                        .build())
+                                .setState(State.InService)
+                                .build())
+                        .build());
+        atozmap.put(
+                new AToZKey("5"),
+                new AToZBuilder()
+                        .setId("5")
+                        .setResource(new ResourceBuilder()
+                                .setResource(new NodeBuilder()
+                                        .setNodeId("NodeIdZ")
+                                        .build())
+                                .setState(State.InService)
+                                .build())
+                        .build());
+        atozmap.put(
+                new AToZKey("6"),
+                new AToZBuilder()
+                        .setId("6")
+                        .setResource(new ResourceBuilder()
+                                .setResource(new TerminationPointBuilder()
+                                        .setTpNodeId("tpNodeIdZ")
+                                        .setTpId("TpIdZ1")
+                                        .build())
+                                .setState(State.InService)
+                                .build())
+                        .build());
+        return atozmap;
+    }
+
+    private Map<ZToAKey, ZToA> createMapZtoA() {
+        Map<ZToAKey, ZToA> ztoamap = new HashMap<>();
+        ztoamap.put(
+                new ZToAKey("0"),
+                new ZToABuilder()
+                        .setId("0")
+                        .setResource(new ResourceBuilder()
+                                .setResource(new TerminationPointBuilder()
+                                        .setTpNodeId("tpNodeIdZ")
+                                        .setTpId("TpIdZ1")
+                                        .build())
+                                .setState(State.InService)
+                                .build())
+                        .build());
+        ztoamap.put(
+                new ZToAKey("1"),
+                new ZToABuilder()
+                        .setId("1")
+                        .setResource(new ResourceBuilder()
+                                .setResource(new NodeBuilder()
+                                        .setNodeId("NodeIdZ")
+                                        .build())
+                                .setState(State.InService)
+                                .build())
+                        .build());
+        ztoamap.put(
+                new ZToAKey("2"),
+                new ZToABuilder()
+                        .setId("2")
+                        .setResource(new ResourceBuilder()
+                                .setResource(new TerminationPointBuilder()
+                                        .setTpNodeId("tpNodeIdZ")
+                                        .setTpId("TpIdZ2")
+                                        .build())
+                                .setState(State.InService)
+                                .build())
+                        .build());
+        ztoamap.put(
+                new ZToAKey("3"),
+                new ZToABuilder()
+                        .setId("3")
+                        .setResource(new ResourceBuilder()
+                                .setResource(new LinkBuilder()
+                                        .setLinkId("LinkIdAZ")
+                                        .build())
+                                .setState(State.InService)
+                                .build())
+                        .build());
+        ztoamap.put(
+                new ZToAKey("4"),
+                new ZToABuilder()
+                        .setId("4")
+                        .setResource(new ResourceBuilder()
+                                .setResource(new TerminationPointBuilder()
+                                        .setTpNodeId("tpNodeIdA")
+                                        .setTpId("TpIdA2")
+                                        .build())
+                                .setState(State.InService)
+                                .build())
+                        .build());
+        ztoamap.put(
+                new ZToAKey("5"),
+                new ZToABuilder()
+                        .setId("5")
+                        .setResource(new ResourceBuilder()
+                                .setResource(new NodeBuilder()
+                                        .setNodeId("NodeIdA")
+                                        .build())
+                                .setState(State.InService)
+                                .build())
+                        .build());
+        ztoamap.put(
+                new ZToAKey("6"),
+                new ZToABuilder()
+                        .setId("6")
+                        .setResource(new ResourceBuilder()
+                                .setResource(new TerminationPointBuilder()
+                                        .setTpNodeId("tpNodeIdA")
+                                        .setTpId("TpIdA1")
+                                        .build())
+                                .setState(State.InService)
+                                .build())
+                        .build());
+        return ztoamap;
+    }
+}
index 5dfe23e79a718c83f2d38c409384be95c7d64102..442189164fcc09cbaa31796529f2750178cdf588 100755 (executable)
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-
 package org.opendaylight.transportpce.servicehandler.listeners;
 
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.fail;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import java.util.Collection;
-import java.util.HashSet;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import java.util.Optional;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
-import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.mdsal.binding.api.RpcService;
+import org.opendaylight.transportpce.common.ResponseCodes;
+import org.opendaylight.transportpce.pce.service.PathComputationService;
+import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ConnectionType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceAEnd;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceAEndBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceZEnd;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceZEndBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.RxDirection;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.RxDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.RxDirectionKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.TxDirection;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.TxDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.TxDirectionKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.lgx.LgxBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.port.PortBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ConnectionType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.Restorable;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommonBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.sdnc.request.header.SdncRequestHeaderBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.RxDirection;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.RxDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.RxDirectionKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.TxDirection;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.TxDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.TxDirectionKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.lgx.LgxBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.port.PortBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.resiliency.ServiceResiliency;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.resiliency.ServiceResiliencyBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.ServicesBuilder;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationAlarmService;
-import org.opendaylight.yang.gen.v1.nbi.notifications.rev210813.PublishNotificationAlarmServiceBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreate;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDelete;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReroute;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.ServicesBuilder;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationAlarmService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishNotificationAlarmServiceBuilder;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.opendaylight.yangtools.yang.common.Uint8;
 
-@RunWith(MockitoJUnitRunner.StrictStubs.class)
+@ExtendWith(MockitoExtension.class)
 public class ServiceListenerTest {
 
     @Mock
-    private DataBroker dataBroker;
+    private RpcService rpcService;
+    @Mock
+    private ServiceDataStoreOperations serviceDataStoreOperations;
     @Mock
     private NotificationPublishService notificationPublishService;
+    @Mock
+    private PathComputationService pathComputationService;
+    @Mock
+    private ServiceDelete serviceDelete;
+    @Mock
+    private ServiceReroute serviceReroute;
+    @Mock
+    private ServiceCreate serviceCreate;
 
     @Test
-    public void testOnDataTreeChangedWhenDeleteService() {
+    void testOnDataTreeChangedWhenDeleteService() {
         @SuppressWarnings("unchecked") final DataObjectModification<Services> service =
                 mock(DataObjectModification.class);
-        final Collection<DataTreeModification<Services>> changes = new HashSet<>();
+        final List<DataTreeModification<Services>> changes = new ArrayList<>();
         @SuppressWarnings("unchecked") final DataTreeModification<Services> ch = mock(DataTreeModification.class);
         changes.add(ch);
         when(ch.getRootNode()).thenReturn(service);
 
-        when(service.getModificationType()).thenReturn(DataObjectModification.ModificationType.DELETE);
-        when(service.getDataBefore()).thenReturn(buildService(State.InService, AdminStates.InService));
-        ServiceListener listener = new ServiceListener(dataBroker, notificationPublishService);
+        when(service.modificationType()).thenReturn(DataObjectModification.ModificationType.DELETE);
+        when(service.dataBefore()).thenReturn(buildService(State.InService, AdminStates.InService));
+        ServiceListener listener = new ServiceListener(rpcService, serviceDataStoreOperations,
+                notificationPublishService);
         listener.onDataTreeChanged(changes);
         verify(ch, times(1)).getRootNode();
-        verify(service, times(1)).getModificationType();
-        verify(service, times(2)).getDataBefore();
-        verify(service, never()).getDataAfter();
+        verify(service, times(1)).modificationType();
+        verify(service, times(2)).dataBefore();
+        verify(service, never()).dataAfter();
         try {
             verify(notificationPublishService, never()).putNotification(any(PublishNotificationAlarmService.class));
         } catch (InterruptedException e) {
@@ -84,51 +109,51 @@ public class ServiceListenerTest {
     }
 
     @Test
-    public void testOnDataTreeChangedWhenAddService() {
+    void testOnDataTreeChangedWhenServiceBecomesOutOfService() {
         @SuppressWarnings("unchecked") final DataObjectModification<Services> service =
                 mock(DataObjectModification.class);
-        final Collection<DataTreeModification<Services>> changes = new HashSet<>();
+        final List<DataTreeModification<Services>> changes = new ArrayList<>();
         @SuppressWarnings("unchecked") final DataTreeModification<Services> ch = mock(DataTreeModification.class);
         changes.add(ch);
         when(ch.getRootNode()).thenReturn(service);
 
-        Services serviceDown = buildService(State.OutOfService, AdminStates.OutOfService);
-        when(service.getModificationType()).thenReturn(DataObjectModification.ModificationType.WRITE);
-        when(service.getDataBefore()).thenReturn(buildService(State.InService, AdminStates.InService));
-        when(service.getDataAfter()).thenReturn(serviceDown);
-        ServiceListener listener = new ServiceListener(dataBroker, notificationPublishService);
+        Services serviceDown = buildService(State.OutOfService, AdminStates.InService);
+        when(service.modificationType()).thenReturn(DataObjectModification.ModificationType.WRITE);
+        when(service.dataBefore()).thenReturn(buildService(State.InService, AdminStates.InService));
+        when(service.dataAfter()).thenReturn(serviceDown);
+        ServiceListener listener = new ServiceListener(rpcService, serviceDataStoreOperations,
+                notificationPublishService);
         listener.onDataTreeChanged(changes);
         verify(ch, times(1)).getRootNode();
-        verify(service, times(1)).getModificationType();
-        verify(service, times(3)).getDataBefore();
-        verify(service, times(2)).getDataAfter();
-        PublishNotificationAlarmService publishNotificationAlarmService =
-                buildNotificationAlarmService(serviceDown, "The service is now outOfService");
+        verify(service, times(1)).modificationType();
+        verify(service, times(3)).dataBefore();
+        verify(service, times(1)).dataAfter();
         try {
             verify(notificationPublishService, times(1))
-                    .putNotification(publishNotificationAlarmService);
+                    .putNotification(buildNotificationAlarmService(serviceDown, "The service is now outOfService"));
         } catch (InterruptedException e) {
             fail("Failed publishing notification");
         }
     }
 
     @Test
-    public void testOnDataTreeChangedWhenShouldNeverHappen() {
+    void testOnDataTreeChangedWhenShouldNeverHappen() {
         @SuppressWarnings("unchecked") final DataObjectModification<Services> service =
                 mock(DataObjectModification.class);
-        final Collection<DataTreeModification<Services>> changes = new HashSet<>();
+        final List<DataTreeModification<Services>> changes = new ArrayList<>();
         @SuppressWarnings("unchecked") final DataTreeModification<Services> ch = mock(DataTreeModification.class);
         changes.add(ch);
         when(ch.getRootNode()).thenReturn(service);
 
-        when(service.getModificationType()).thenReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED);
-        when(service.getDataBefore()).thenReturn(buildService(State.InService, AdminStates.InService));
-        ServiceListener listener = new ServiceListener(dataBroker, notificationPublishService);
+        when(service.modificationType()).thenReturn(DataObjectModification.ModificationType.SUBTREE_MODIFIED);
+        when(service.dataBefore()).thenReturn(buildService(State.InService, AdminStates.InService));
+        ServiceListener listener = new ServiceListener(rpcService, serviceDataStoreOperations,
+                notificationPublishService);
         listener.onDataTreeChanged(changes);
         verify(ch, times(1)).getRootNode();
-        verify(service, times(2)).getModificationType();
-        verify(service, times(2)).getDataBefore();
-        verify(service, never()).getDataAfter();
+        verify(service, times(2)).modificationType();
+        verify(service, times(2)).dataBefore();
+        verify(service, never()).dataAfter();
         try {
             verify(notificationPublishService, never()).putNotification(any(PublishNotificationAlarmService.class));
         } catch (InterruptedException e) {
@@ -136,36 +161,119 @@ public class ServiceListenerTest {
         }
     }
 
+    @Test
+    void testOnDataTreeChangedWhenServiceDegradedShouldBeRerouted() {
+        @SuppressWarnings("unchecked") final DataObjectModification<Services> service =
+                mock(DataObjectModification.class);
+        final List<DataTreeModification<Services>> changes = new ArrayList<>();
+        @SuppressWarnings("unchecked") final DataTreeModification<Services> ch = mock(DataTreeModification.class);
+        changes.add(ch);
+        when(ch.getRootNode()).thenReturn(service);
+
+        ServiceResiliency serviceResiliency = new ServiceResiliencyBuilder().setResiliency(Restorable.VALUE).build();
+        Services serviceAfter = new ServicesBuilder(buildService(State.OutOfService, AdminStates.InService))
+                .setServiceResiliency(serviceResiliency)
+                .build();
+        when(service.modificationType()).thenReturn(DataObjectModification.ModificationType.WRITE);
+        when(service.dataBefore())
+            .thenReturn(new ServicesBuilder(buildService(State.InService, AdminStates.InService))
+                        .setServiceResiliency(serviceResiliency)
+                        .build());
+        when(service.dataAfter()).thenReturn(serviceAfter);
+        when(serviceDataStoreOperations.getService(anyString())).thenReturn(Optional.of(serviceAfter));
+        when(rpcService.getRpc(ServiceDelete.class)).thenReturn(serviceDelete);
+        when(serviceDelete.invoke(any()))
+            .thenReturn(RpcResultBuilder.success(new ServiceDeleteOutputBuilder()
+                                .setConfigurationResponseCommon(new ConfigurationResponseCommonBuilder()
+                                                .setResponseCode(ResponseCodes.RESPONSE_OK)
+                                                .build())
+                                .build())
+                        .buildFuture());
+        when(rpcService.getRpc(ServiceReroute.class)).thenReturn(serviceReroute);
+        when(serviceReroute.invoke(any()))
+            .thenReturn(RpcResultBuilder.success(new ServiceRerouteOutputBuilder()
+                                .setConfigurationResponseCommon(new ConfigurationResponseCommonBuilder()
+                                                .setResponseCode(ResponseCodes.RESPONSE_OK)
+                                                .build())
+                                .build())
+                        .buildFuture());
+        when(rpcService.getRpc(ServiceCreate.class)).thenReturn(serviceCreate);
+        when(serviceCreate.invoke(any()))
+            .thenReturn(RpcResultBuilder.success(new ServiceCreateOutputBuilder()
+                                .setConfigurationResponseCommon(new ConfigurationResponseCommonBuilder()
+                                                .setResponseCode(ResponseCodes.RESPONSE_OK)
+                                                .build())
+                                .build())
+                        .buildFuture());
+        ServiceListener listener = new ServiceListener(rpcService, serviceDataStoreOperations,
+                notificationPublishService);
+        listener.onDataTreeChanged(changes);
+        verify(ch, times(1)).getRootNode();
+        verify(service, times(1)).modificationType();
+        verify(service, times(3)).dataBefore();
+        verify(service, times(1)).dataAfter();
+//        verify(servicehandler, times(1)).serviceDelete(any());
+
+        when(service.modificationType()).thenReturn(DataObjectModification.ModificationType.DELETE);
+        listener.onDataTreeChanged(changes);
+//        verify(servicehandler, times(1)).serviceCreate(any());
+    }
+
+    @Test
+    void testOnDataTreeChangedWhenServiceDegradedShouldNotBeRerouted() {
+        @SuppressWarnings("unchecked") final DataObjectModification<Services> service =
+                mock(DataObjectModification.class);
+        final List<DataTreeModification<Services>> changes = new ArrayList<>();
+        @SuppressWarnings("unchecked") final DataTreeModification<Services> ch = mock(DataTreeModification.class);
+        changes.add(ch);
+        when(ch.getRootNode()).thenReturn(service);
+
+        Services serviceAfter = buildService(State.OutOfService, AdminStates.InService);
+        when(service.modificationType()).thenReturn(DataObjectModification.ModificationType.WRITE);
+        when(service.dataBefore()).thenReturn(buildService(State.InService, AdminStates.InService));
+        when(service.dataAfter()).thenReturn(serviceAfter);
+        ServiceListener listener = new ServiceListener(rpcService, serviceDataStoreOperations,
+                notificationPublishService);
+        listener.onDataTreeChanged(changes);
+        verify(ch, times(1)).getRootNode();
+        verify(service, times(1)).modificationType();
+        verify(service, times(3)).dataBefore();
+        verify(service, times(1)).dataAfter();
+//        verify(servicehandler, times(0)).serviceDelete(any());
+
+        when(service.modificationType()).thenReturn(DataObjectModification.ModificationType.DELETE);
+        listener.onDataTreeChanged(changes);
+//        verify(servicehandler, times(0)).serviceCreate(any());
+    }
+
     private Services buildService(State state, AdminStates adminStates) {
-        ServiceAEnd serviceAEnd = getServiceAEndBuild().build();
-        ServiceZEnd serviceZEnd = new ServiceZEndBuilder()
-                    .setClli("clli")
-                    .setServiceFormat(ServiceFormat.OC)
-                    .setServiceRate(Uint32.valueOf(1))
-                    .setNodeId(new NodeIdType("XPONDER-3-2"))
-                    .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()),getTxDirection()))
-                    .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection()))
-                    .build();
-        ServicesBuilder builtInput = new ServicesBuilder()
+        return new ServicesBuilder()
+                .setSdncRequestHeader(new SdncRequestHeaderBuilder().build())
                 .setCommonId("commonId")
                 .setConnectionType(ConnectionType.Service)
                 .setCustomer("Customer")
                 .setServiceName("service 1")
-                .setServiceAEnd(serviceAEnd)
-                .setServiceZEnd(serviceZEnd)
+                .setServiceAEnd(getServiceAEndBuild().build())
+                .setServiceZEnd(new ServiceZEndBuilder()
+                        .setClli("clli")
+                        .setServiceFormat(ServiceFormat.Ethernet)
+                        .setServiceRate(Uint32.valueOf(1))
+                        .setNodeId(new NodeIdType("XPONDER-3-2"))
+                        .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()), getTxDirection()))
+                        .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection()))
+                        .build())
                 .setOperationalState(state)
-                .setAdministrativeState(adminStates);
-
-        return builtInput.build();
+                .setAdministrativeState(adminStates)
+                .build();
     }
 
     private ServiceAEndBuilder getServiceAEndBuild() {
         return new ServiceAEndBuilder()
                 .setClli("clli")
-                .setServiceFormat(ServiceFormat.OC)
+                .setServiceFormat(ServiceFormat.Ethernet)
                 .setServiceRate(Uint32.valueOf(1))
                 .setNodeId(new NodeIdType("XPONDER-1-2"))
-                .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()),getTxDirection()))
+                .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()), getTxDirection()))
                 .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection()));
     }
 
@@ -220,4 +328,4 @@ public class ServiceListenerTest {
                 .setPublisherName("ServiceListener")
                 .build();
     }
-}
+}
\ No newline at end of file
index 3da8e653491d6a7522e25e4752ad056352eb9b87..30f8bb9e55a1a33f8a058dac0de08d706949c49c 100644 (file)
@@ -7,37 +7,39 @@
  */
 package org.opendaylight.transportpce.servicehandler.service;
 
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoInteractions;
+import static org.mockito.Mockito.when;
 
 import com.google.common.util.concurrent.ListenableFuture;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
 import org.opendaylight.transportpce.common.ResponseCodes;
 import org.opendaylight.transportpce.pce.service.PathComputationService;
 import org.opendaylight.transportpce.servicehandler.utils.ServiceDataUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.CancelResourceReserveInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.CancelResourceReserveOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.CancelResourceReserveOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ServiceNotificationTypes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommon;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommonBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.CancelResourceReserveInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.CancelResourceReserveOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.CancelResourceReserveOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ServiceNotificationTypes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommon;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommonBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateInputBuilder;
 
+@ExtendWith(MockitoExtension.class)
 public class PCEServiceWrapperTest extends AbstractTest {
 
     @Mock
@@ -47,124 +49,98 @@ public class PCEServiceWrapperTest extends AbstractTest {
     @InjectMocks
     private PCEServiceWrapper pceServiceWrapperMock;
 
-    private AutoCloseable closeable;
-
-    @Before
-    public void openMocks() throws NoSuchMethodException {
-        closeable = MockitoAnnotations.openMocks(this);
-    }
 
     @Test
-    public void performPCENullSdncRequestHeader() {
+    void performPCENullSdncRequestHeader() {
         ServiceCreateInput input =  ServiceDataUtils.buildServiceCreateInput();
         input = new ServiceCreateInputBuilder(input).setSdncRequestHeader(null).build();
         PathComputationRequestOutput pceResponse = this.pceServiceWrapperMock.performPCE(input, true);
-        Assert.assertEquals(ResponseCodes.FINAL_ACK_YES,
-                pceResponse.getConfigurationResponseCommon().getAckFinalIndicator());
-        Assert.assertEquals(ResponseCodes.RESPONSE_FAILED,
-                pceResponse.getConfigurationResponseCommon().getResponseCode());
-        Mockito.verifyNoInteractions(this.pathComputationServiceMock);
+        assertEquals(ResponseCodes.FINAL_ACK_YES, pceResponse.getConfigurationResponseCommon().getAckFinalIndicator());
+        assertEquals(ResponseCodes.RESPONSE_FAILED, pceResponse.getConfigurationResponseCommon().getResponseCode());
+        verifyNoInteractions(this.pathComputationServiceMock);
     }
 
     @Test
-    public void performPCENullServiceName() {
+    void performPCENullServiceName() {
         ServiceCreateInput input = ServiceDataUtils.buildServiceCreateInput();
         input = new ServiceCreateInputBuilder(input).setServiceName(null).build();
         PathComputationRequestOutput pceResponse = this.pceServiceWrapperMock.performPCE(input, true);
-        Assert.assertEquals(ResponseCodes.FINAL_ACK_YES,
-                pceResponse.getConfigurationResponseCommon().getAckFinalIndicator());
-        Assert.assertEquals(ResponseCodes.RESPONSE_FAILED,
-                pceResponse.getConfigurationResponseCommon().getResponseCode());
-        Mockito.verifyNoInteractions(this.pathComputationServiceMock);
+        assertEquals(ResponseCodes.FINAL_ACK_YES, pceResponse.getConfigurationResponseCommon().getAckFinalIndicator());
+        assertEquals(ResponseCodes.RESPONSE_FAILED, pceResponse.getConfigurationResponseCommon().getResponseCode());
+        verifyNoInteractions(this.pathComputationServiceMock);
     }
 
     @Test
-    public void performPCENullCommonId() {
+    void performPCENullCommonId() {
         TempServiceCreateInput input = ServiceDataUtils.buildTempServiceCreateInput();
         input = new TempServiceCreateInputBuilder(input).setCommonId(null).build();
         PathComputationRequestOutput pceResponse = this.pceServiceWrapperMock.performPCE(input, true);
-        Assert.assertEquals(ResponseCodes.FINAL_ACK_YES,
-                pceResponse.getConfigurationResponseCommon().getAckFinalIndicator());
-        Assert.assertEquals(ResponseCodes.RESPONSE_FAILED,
-                pceResponse.getConfigurationResponseCommon().getResponseCode());
-        Mockito.verifyNoInteractions(this.pathComputationServiceMock);
+        assertEquals(ResponseCodes.FINAL_ACK_YES, pceResponse.getConfigurationResponseCommon().getAckFinalIndicator());
+        assertEquals(ResponseCodes.RESPONSE_FAILED, pceResponse.getConfigurationResponseCommon().getResponseCode());
+        verifyNoInteractions(this.pathComputationServiceMock);
     }
 
 
     @Test
-    public void cancelPCEResourceNullServiceName() {
+    void cancelPCEResourceNullServiceName() {
         CancelResourceReserveOutput pceResponse =
                 this.pceServiceWrapperMock.cancelPCEResource(null, ServiceNotificationTypes.ServiceDeleteResult);
-        Assert.assertEquals(ResponseCodes.FINAL_ACK_YES,
-                pceResponse.getConfigurationResponseCommon().getAckFinalIndicator());
-        Assert.assertEquals(ResponseCodes.RESPONSE_FAILED,
-                pceResponse.getConfigurationResponseCommon().getResponseCode());
-        Mockito.verifyNoInteractions(this.pathComputationServiceMock);
+        assertEquals(ResponseCodes.FINAL_ACK_YES, pceResponse.getConfigurationResponseCommon().getAckFinalIndicator());
+        assertEquals(ResponseCodes.RESPONSE_FAILED, pceResponse.getConfigurationResponseCommon().getResponseCode());
+        verifyNoInteractions(this.pathComputationServiceMock);
     }
 
     @Test
-    public void cancelPCEResourceValid() {
+    void cancelPCEResourceValid() {
         ConfigurationResponseCommon configurationResponseCommon = new ConfigurationResponseCommonBuilder()
                 .setRequestId("request 1").setAckFinalIndicator(ResponseCodes.FINAL_ACK_NO)
                 .setResponseCode(ResponseCodes.RESPONSE_OK).setResponseMessage("PCE calculation in progress").build();
         CancelResourceReserveOutput output = new CancelResourceReserveOutputBuilder()
                 .setConfigurationResponseCommon(configurationResponseCommon).build();
         ListenableFuture<CancelResourceReserveOutput> response = ServiceDataUtils.returnFuture(output);
-        Mockito.when(this.pathComputationServiceMock.cancelResourceReserve(any(CancelResourceReserveInput.class)))
-                .thenReturn(response);
-        CancelResourceReserveOutput pceResponse =
-                this.pceServiceWrapperMock.cancelPCEResource("service 1", ServiceNotificationTypes.ServiceDeleteResult);
-        Assert.assertEquals(ResponseCodes.FINAL_ACK_NO,
-                pceResponse.getConfigurationResponseCommon().getAckFinalIndicator());
-        Assert.assertEquals(ResponseCodes.RESPONSE_OK,
-                pceResponse.getConfigurationResponseCommon().getResponseCode());
-        Assert.assertEquals("PCE calculation in progress",
-                pceResponse.getConfigurationResponseCommon().getResponseMessage());
+        when(this.pathComputationServiceMock.cancelResourceReserve(any(CancelResourceReserveInput.class)))
+            .thenReturn(response);
+        CancelResourceReserveOutput pceResponse = this.pceServiceWrapperMock
+            .cancelPCEResource("service 1", ServiceNotificationTypes.ServiceDeleteResult);
+        assertEquals(ResponseCodes.FINAL_ACK_NO, pceResponse.getConfigurationResponseCommon().getAckFinalIndicator());
+        assertEquals(ResponseCodes.RESPONSE_OK, pceResponse.getConfigurationResponseCommon().getResponseCode());
+        assertEquals("PCE calculation in progress", pceResponse.getConfigurationResponseCommon().getResponseMessage());
         verify(this.pathComputationServiceMock).cancelResourceReserve(any(CancelResourceReserveInput.class));
     }
 
     @Test
-    public void performPCEValid() {
+    void performPCEValid() {
         ConfigurationResponseCommon configurationResponseCommon = new ConfigurationResponseCommonBuilder()
                 .setRequestId("request 1").setAckFinalIndicator(ResponseCodes.FINAL_ACK_NO)
                 .setResponseCode(ResponseCodes.RESPONSE_OK).setResponseMessage("PCE calculation in progress").build();
         PathComputationRequestOutput output = new PathComputationRequestOutputBuilder()
                 .setConfigurationResponseCommon(configurationResponseCommon).build();
         ListenableFuture<PathComputationRequestOutput> response = ServiceDataUtils.returnFuture(output);
-        Mockito.when(this.pathComputationServiceMock.pathComputationRequest(any(PathComputationRequestInput.class)))
-                .thenReturn(response);
+        when(this.pathComputationServiceMock.pathComputationRequest(any(PathComputationRequestInput.class)))
+            .thenReturn(response);
         ServiceCreateInput input =  ServiceDataUtils.buildServiceCreateInput();
         PathComputationRequestOutput pceResponse = this.pceServiceWrapperMock.performPCE(input, true);
-        Assert.assertEquals(ResponseCodes.FINAL_ACK_NO,
-                pceResponse.getConfigurationResponseCommon().getAckFinalIndicator());
-        Assert.assertEquals(ResponseCodes.RESPONSE_OK,
-                pceResponse.getConfigurationResponseCommon().getResponseCode());
-        Assert.assertEquals("PCE calculation in progress",
-                pceResponse.getConfigurationResponseCommon().getResponseMessage());
+        assertEquals(ResponseCodes.FINAL_ACK_NO, pceResponse.getConfigurationResponseCommon().getAckFinalIndicator());
+        assertEquals(ResponseCodes.RESPONSE_OK, pceResponse.getConfigurationResponseCommon().getResponseCode());
+        assertEquals("PCE calculation in progress", pceResponse.getConfigurationResponseCommon().getResponseMessage());
         verify(this.pathComputationServiceMock).pathComputationRequest((any(PathComputationRequestInput.class)));
     }
 
     @Test
-    public void performPCETempValid() {
+    void performPCETempValid() {
         ConfigurationResponseCommon configurationResponseCommon = new ConfigurationResponseCommonBuilder()
                 .setRequestId("request 1").setAckFinalIndicator(ResponseCodes.FINAL_ACK_NO)
                 .setResponseCode(ResponseCodes.RESPONSE_OK).setResponseMessage("PCE calculation in progress").build();
         PathComputationRequestOutput output = new PathComputationRequestOutputBuilder()
                 .setConfigurationResponseCommon(configurationResponseCommon).build();
         ListenableFuture<PathComputationRequestOutput> response = ServiceDataUtils.returnFuture(output);
-        Mockito.when(this.pathComputationServiceMock.pathComputationRequest(any(PathComputationRequestInput.class)))
-                .thenReturn(response);
+        when(this.pathComputationServiceMock.pathComputationRequest(any(PathComputationRequestInput.class)))
+            .thenReturn(response);
         TempServiceCreateInput input = ServiceDataUtils.buildTempServiceCreateInput();
         PathComputationRequestOutput pceResponse = this.pceServiceWrapperMock.performPCE(input, true);
-        Assert.assertEquals(ResponseCodes.FINAL_ACK_NO,
-                pceResponse.getConfigurationResponseCommon().getAckFinalIndicator());
-        Assert.assertEquals(ResponseCodes.RESPONSE_OK, pceResponse.getConfigurationResponseCommon().getResponseCode());
-        Assert.assertEquals("PCE calculation in progress",
-                pceResponse.getConfigurationResponseCommon().getResponseMessage());
+        assertEquals(ResponseCodes.FINAL_ACK_NO, pceResponse.getConfigurationResponseCommon().getAckFinalIndicator());
+        assertEquals(ResponseCodes.RESPONSE_OK, pceResponse.getConfigurationResponseCommon().getResponseCode());
+        assertEquals("PCE calculation in progress", pceResponse.getConfigurationResponseCommon().getResponseMessage());
         verify(this.pathComputationServiceMock).pathComputationRequest((any(PathComputationRequestInput.class)));
     }
-
-    @After public void releaseMocks() throws Exception {
-        closeable.close();
-    }
-}
+}
\ No newline at end of file
index ff4404cd3c7b706ffe14d3c08fe2c3abe3948ff8..f2e4f8db0aa2c588229225c6f98991276cf95378 100644 (file)
@@ -7,18 +7,18 @@
  */
 package org.opendaylight.transportpce.servicehandler.service;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoInteractions;
+import static org.mockito.Mockito.when;
 
 import com.google.common.util.concurrent.ListenableFuture;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
 import org.opendaylight.transportpce.common.ResponseCodes;
 import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations;
@@ -29,12 +29,12 @@ import org.opendaylight.transportpce.test.AbstractTest;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteOutput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ServiceNotificationTypes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommon;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommonBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceDeleteInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceDeleteInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ServiceNotificationTypes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommon;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommonBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceDeleteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceDeleteInputBuilder;
 
 /**
  * Test RendererServiceWrapper class.
@@ -42,6 +42,7 @@ import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempSer
  * @author Martial Coulibaly ( martial.coulibaly@gfi.com ) on behalf of Orange
  *
  */
+@ExtendWith(MockitoExtension.class)
 public class RendererServiceWrapperTest extends AbstractTest {
     @Mock
     private RendererServiceOperations rendererServiceOperationsMock;
@@ -50,115 +51,99 @@ public class RendererServiceWrapperTest extends AbstractTest {
     @InjectMocks
     private RendererServiceWrapper rendererServiceWrapperMock;
 
-    private AutoCloseable closeable;
-
-    @Before
-    public void openMocks() throws NoSuchMethodException {
-        closeable = MockitoAnnotations.openMocks(this);
-    }
 
     @Test
-    public void performRendererNullServiceHandlerHeader() {
-        ServiceDeleteInput input = ServiceDataUtils.buildServiceDeleteInput();
-        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInput
-            serviceDeleteInput =
-                ModelMappingUtils.createServiceDeleteInput(new ServiceInput(input));
+    void performRendererNullServiceHandlerHeader() {
+        var serviceDeleteInput = ModelMappingUtils
+            .createServiceDeleteInput(new ServiceInput(ServiceDataUtils.buildServiceDeleteInput()));
         serviceDeleteInput = new ServiceDeleteInputBuilder(serviceDeleteInput).setServiceHandlerHeader(null).build();
         ServiceDeleteOutput response = this.rendererServiceWrapperMock.performRenderer(serviceDeleteInput,
                 ServiceNotificationTypes.ServiceDeleteResult, null);
-        Assert.assertEquals(ResponseCodes.FINAL_ACK_YES,
+        assertEquals(ResponseCodes.FINAL_ACK_YES,
                 response.getConfigurationResponseCommon().getAckFinalIndicator());
-        Assert.assertEquals(ResponseCodes.RESPONSE_FAILED,
+        assertEquals(ResponseCodes.RESPONSE_FAILED,
                 response.getConfigurationResponseCommon().getResponseCode());
-        Mockito.verifyNoInteractions(this.rendererServiceOperationsMock);
+        verifyNoInteractions(this.rendererServiceOperationsMock);
     }
 
     @Test
-    public void performRendererNullServiceName() {
-        ServiceDeleteInput input = ServiceDataUtils.buildServiceDeleteInput();
-        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInput
-            serviceDeleteInput =
-                ModelMappingUtils.createServiceDeleteInput(new ServiceInput(input));
+    void performRendererNullServiceName() {
+        var serviceDeleteInput = ModelMappingUtils
+            .createServiceDeleteInput(new ServiceInput(ServiceDataUtils.buildServiceDeleteInput()));
         serviceDeleteInput = new ServiceDeleteInputBuilder(serviceDeleteInput).setServiceName(null).build();
-        ServiceDeleteOutput response = this.rendererServiceWrapperMock.performRenderer(serviceDeleteInput,
-                ServiceNotificationTypes.ServiceDeleteResult, null);
-        Assert.assertEquals(ResponseCodes.FINAL_ACK_YES,
-                response.getConfigurationResponseCommon().getAckFinalIndicator());
-        Assert.assertEquals(ResponseCodes.RESPONSE_FAILED,
-                response.getConfigurationResponseCommon().getResponseCode());
-        Mockito.verifyNoInteractions(this.rendererServiceOperationsMock);
+        ServiceDeleteOutput response = this.rendererServiceWrapperMock
+            .performRenderer(serviceDeleteInput, ServiceNotificationTypes.ServiceDeleteResult, null);
+        assertEquals(ResponseCodes.FINAL_ACK_YES, response.getConfigurationResponseCommon().getAckFinalIndicator());
+        assertEquals(ResponseCodes.RESPONSE_FAILED, response.getConfigurationResponseCommon().getResponseCode());
+        verifyNoInteractions(this.rendererServiceOperationsMock);
     }
 
     @Test
-    public void performRendererNullCommonId() {
-        TempServiceDeleteInput input = ServiceDataUtils.buildTempServiceDeleteInput();
-        input = new TempServiceDeleteInputBuilder(input).setCommonId(null).build();
-        ServiceDeleteOutput response =
-                this.rendererServiceWrapperMock.performRenderer(input, ServiceNotificationTypes.ServiceDeleteResult);
-        Assert.assertEquals(ResponseCodes.FINAL_ACK_YES,
-                response.getConfigurationResponseCommon().getAckFinalIndicator());
-        Assert.assertEquals(ResponseCodes.RESPONSE_FAILED,
-                response.getConfigurationResponseCommon().getResponseCode());
-        Mockito.verifyNoInteractions(this.rendererServiceOperationsMock);
+    void performRendererNullCommonId() {
+        TempServiceDeleteInput input = new TempServiceDeleteInputBuilder(ServiceDataUtils.buildTempServiceDeleteInput())
+            .setCommonId(null).build();
+        ServiceDeleteOutput response = this.rendererServiceWrapperMock
+            .performRenderer(input, ServiceNotificationTypes.ServiceDeleteResult, null);
+        assertEquals(ResponseCodes.FINAL_ACK_YES, response.getConfigurationResponseCommon().getAckFinalIndicator());
+        assertEquals(ResponseCodes.RESPONSE_FAILED, response.getConfigurationResponseCommon().getResponseCode());
+        verifyNoInteractions(this.rendererServiceOperationsMock);
     }
 
-
     @Test
-    public void performRendererValid() {
+    void performRendererValid() {
         ConfigurationResponseCommon configurationResponseCommon = new ConfigurationResponseCommonBuilder()
-                .setRequestId("request 1").setAckFinalIndicator(ResponseCodes.FINAL_ACK_NO)
-                .setResponseCode(ResponseCodes.RESPONSE_OK).setResponseMessage("Renderer service delete in progress")
-                .build();
+            .setRequestId("request 1").setAckFinalIndicator(ResponseCodes.FINAL_ACK_NO)
+            .setResponseCode(ResponseCodes.RESPONSE_OK).setResponseMessage("Renderer service delete in progress")
+            .build();
         ServiceDeleteOutput output = new ServiceDeleteOutputBuilder()
-                .setConfigurationResponseCommon(configurationResponseCommon).build();
+            .setConfigurationResponseCommon(configurationResponseCommon).build();
         ListenableFuture<ServiceDeleteOutput> response = ServiceDataUtils.returnFuture(output);
-        Mockito.when(this.rendererServiceOperationsMock.serviceDelete(any(
-                org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
-                .ServiceDeleteInput.class), any())).thenReturn(response);
+        when(this.rendererServiceOperationsMock.serviceDelete(any(
+                org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInput
+                    .class), any()))
+            .thenReturn(response);
         ServiceDeleteInput input = ServiceDataUtils.buildServiceDeleteInput();
-        org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInput
-            serviceDeleteInput =
-                ModelMappingUtils.createServiceDeleteInput(new ServiceInput(input));
-        ServiceDeleteOutput rendereResponse = this.rendererServiceWrapperMock.performRenderer(serviceDeleteInput,
-                ServiceNotificationTypes.ServiceDeleteResult, null);
-        Assert.assertEquals(ResponseCodes.FINAL_ACK_NO,
-                rendereResponse.getConfigurationResponseCommon().getAckFinalIndicator());
-        Assert.assertEquals(ResponseCodes.RESPONSE_OK,
-                rendereResponse.getConfigurationResponseCommon().getResponseCode());
-        Assert.assertEquals("Renderer service delete in progress",
-                rendereResponse.getConfigurationResponseCommon().getResponseMessage());
+        var serviceDeleteInput = ModelMappingUtils.createServiceDeleteInput(new ServiceInput(input));
+        ServiceDeleteOutput rendereResponse = this.rendererServiceWrapperMock
+            .performRenderer(serviceDeleteInput, ServiceNotificationTypes.ServiceDeleteResult, null);
+        assertEquals(
+            ResponseCodes.FINAL_ACK_NO,
+            rendereResponse.getConfigurationResponseCommon().getAckFinalIndicator());
+        assertEquals(ResponseCodes.RESPONSE_OK, rendereResponse.getConfigurationResponseCommon().getResponseCode());
+        assertEquals(
+            "Renderer service delete in progress",
+            rendereResponse.getConfigurationResponseCommon().getResponseMessage());
         verify(this.rendererServiceOperationsMock).serviceDelete(any(
-                org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
-                        .ServiceDeleteInput.class), any());
+                org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInput
+                    .class), any());
     }
 
     @Test
-    public void performRendererTempValid() {
+    void performRendererTempValid() {
         ConfigurationResponseCommon configurationResponseCommon = new ConfigurationResponseCommonBuilder()
-                .setRequestId("request 1").setAckFinalIndicator(ResponseCodes.FINAL_ACK_NO)
-                .setResponseCode(ResponseCodes.RESPONSE_OK).setResponseMessage("Renderer service delete in progress")
-                .build();
+            .setRequestId("request 1").setAckFinalIndicator(ResponseCodes.FINAL_ACK_NO)
+            .setResponseCode(ResponseCodes.RESPONSE_OK).setResponseMessage("Renderer service delete in progress")
+            .build();
         ServiceDeleteOutput output = new ServiceDeleteOutputBuilder()
-                .setConfigurationResponseCommon(configurationResponseCommon).build();
+            .setConfigurationResponseCommon(configurationResponseCommon).build();
         ListenableFuture<ServiceDeleteOutput> response = ServiceDataUtils.returnFuture(output);
-        Mockito.when(this.rendererServiceOperationsMock.serviceDelete(any(
-                org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
-                .ServiceDeleteInput.class), any())).thenReturn(response);
+        when(this.rendererServiceOperationsMock.serviceDelete(any(
+                org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInput
+                    .class), any()))
+            .thenReturn(response);
         TempServiceDeleteInput input = ServiceDataUtils.buildTempServiceDeleteInput();
-        ServiceDeleteOutput rendereResponse = this.rendererServiceWrapperMock.performRenderer(input,
-                ServiceNotificationTypes.ServiceDeleteResult);
-        Assert.assertEquals(ResponseCodes.FINAL_ACK_NO,
-                rendereResponse.getConfigurationResponseCommon().getAckFinalIndicator());
-        Assert.assertEquals(ResponseCodes.RESPONSE_OK,
-                rendereResponse.getConfigurationResponseCommon().getResponseCode());
-        Assert.assertEquals("Renderer service delete in progress",
-                rendereResponse.getConfigurationResponseCommon().getResponseMessage());
+        var tempServiceDeleteInput = ModelMappingUtils.createServiceDeleteInput(new ServiceInput(input));
+        ServiceDeleteOutput rendereResponse = this.rendererServiceWrapperMock
+            .performRenderer(tempServiceDeleteInput, ServiceNotificationTypes.ServiceDeleteResult, null);
+        assertEquals(
+            ResponseCodes.FINAL_ACK_NO,
+            rendereResponse.getConfigurationResponseCommon().getAckFinalIndicator());
+        assertEquals(ResponseCodes.RESPONSE_OK, rendereResponse.getConfigurationResponseCommon().getResponseCode());
+        assertEquals(
+            "Renderer service delete in progress",
+            rendereResponse.getConfigurationResponseCommon().getResponseMessage());
         verify(this.rendererServiceOperationsMock).serviceDelete(any(
                 org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInput
                     .class), any());
     }
-
-    @After public void releaseMocks() throws Exception {
-        closeable.close();
-    }
-}
+}
\ No newline at end of file
index 523e7e6934add11b033258d07c32e7b1fc1d391b..0f40f3842918b3d4e1f637d808e421ba558678ff 100644 (file)
@@ -7,29 +7,33 @@
  */
 package org.opendaylight.transportpce.servicehandler.service;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperationsImpl.LogMessages;
 
 import java.util.Optional;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.transportpce.common.OperationResult;
 import org.opendaylight.transportpce.common.ResponseCodes;
 import org.opendaylight.transportpce.servicehandler.ServiceInput;
 import org.opendaylight.transportpce.servicehandler.utils.ServiceDataUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommon;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommonBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.service.path.rpc.result.PathDescription;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommon;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommonBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirectionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.response.parameters.sp.ResponseParameters;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.response.parameters.sp.ResponseParametersBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.response.parameters.sp.response.parameters.PathDescriptionBuilder;
@@ -41,52 +45,48 @@ public class ServiceDataStoreOperationsImplTest extends AbstractTest {
 
     private ServiceDataStoreOperationsImpl serviceDataStoreOperations;
 
-    @Before
-    public void init() {
+    @BeforeEach
+    void init() {
         DataBroker dataBroker = this.getNewDataBroker();
         this.serviceDataStoreOperations = new ServiceDataStoreOperationsImpl(dataBroker);
     }
 
     @Test
-    public void modifyIfServiceNotPresent() {
-        OperationResult result =
-                this.serviceDataStoreOperations.modifyService("service 1", State.InService, AdminStates.InService);
-        Assert.assertFalse(result.isSuccess());
-        Assert.assertEquals(LogMessages.SERVICE_NOT_FOUND, result.getResultMessage());
+    void modifyIfServiceNotPresent() {
+        OperationResult result = this.serviceDataStoreOperations
+            .modifyService("service 1", State.InService, AdminStates.InService);
+        assertFalse(result.isSuccess());
+        assertEquals(LogMessages.SERVICE_NOT_FOUND, result.getResultMessage());
     }
 
     @Test
-    public void writeOrModifyOrDeleteServiceListNotPresentWithNoWriteChoice() {
-
+    void writeOrModifyOrDeleteServiceListNotPresentWithNoWriteChoice() {
         ServiceCreateInput createInput = ServiceDataUtils.buildServiceCreateInput();
         ConfigurationResponseCommon configurationResponseCommon = new ConfigurationResponseCommonBuilder()
                 .setRequestId("request 1").setAckFinalIndicator(ResponseCodes.FINAL_ACK_NO)
                 .setResponseCode(ResponseCodes.RESPONSE_OK).setResponseMessage("PCE calculation in progress").build();
         PathComputationRequestOutput pathComputationRequestOutput = new PathComputationRequestOutputBuilder()
                 .setConfigurationResponseCommon(configurationResponseCommon).build();
-        String result = serviceDataStoreOperations.writeOrModifyOrDeleteServiceList("serviceCreateInput",
-            createInput, pathComputationRequestOutput, 3);
-
-        Assert.assertEquals(LogMessages.SERVICE_NOT_FOUND, result);
+        String result = serviceDataStoreOperations
+            .writeOrModifyOrDeleteServiceList("serviceCreateInput", createInput, pathComputationRequestOutput, 3);
+        assertEquals(LogMessages.SERVICE_NOT_FOUND, result);
     }
 
     @Test
-    public void writeOrModifyOrDeleteServiceListNotPresentWithWriteChoice() {
-
+    void writeOrModifyOrDeleteServiceListNotPresentWithWriteChoice() {
         ServiceCreateInput createInput = ServiceDataUtils.buildServiceCreateInput();
         ConfigurationResponseCommon configurationResponseCommon = new ConfigurationResponseCommonBuilder()
                 .setRequestId("request 1").setAckFinalIndicator(ResponseCodes.FINAL_ACK_NO)
                 .setResponseCode(ResponseCodes.RESPONSE_OK).setResponseMessage("PCE calculation in progress").build();
         PathComputationRequestOutput pathComputationRequestOutput = new PathComputationRequestOutputBuilder()
                 .setConfigurationResponseCommon(configurationResponseCommon).build();
-        String result = serviceDataStoreOperations.writeOrModifyOrDeleteServiceList("service 1",
-            createInput, pathComputationRequestOutput, 2);
-
-        Assert.assertNull(result);
+        String result = serviceDataStoreOperations
+            .writeOrModifyOrDeleteServiceList("service 1", createInput, pathComputationRequestOutput, 2);
+        assertNull(result);
     }
 
     @Test
-    public void writeOrModifyOrDeleteServiceListPresentWithModifyChoice() {
+    void writeOrModifyOrDeleteServiceListPresentWithModifyChoice() {
         ServiceCreateInput createInput = ServiceDataUtils.buildServiceCreateInput();
         ConfigurationResponseCommon configurationResponseCommon = new ConfigurationResponseCommonBuilder()
                 .setRequestId("request 1").setAckFinalIndicator(ResponseCodes.FINAL_ACK_NO)
@@ -94,28 +94,27 @@ public class ServiceDataStoreOperationsImplTest extends AbstractTest {
         PathComputationRequestOutput pathComputationRequestOutput = new PathComputationRequestOutputBuilder()
                 .setConfigurationResponseCommon(configurationResponseCommon).build();
         this.serviceDataStoreOperations.createService(createInput);
-        String result = serviceDataStoreOperations.writeOrModifyOrDeleteServiceList("service 1",
-            createInput, pathComputationRequestOutput, 0);
-        Assert.assertNull(result);
+        String result = serviceDataStoreOperations
+            .writeOrModifyOrDeleteServiceList("service 1", createInput, pathComputationRequestOutput, 0);
+        assertNull(result);
     }
 
     @Test
-    public void writeOrModifyOrDeleteServiceListPresentWithDeleteChoice() {
+    void writeOrModifyOrDeleteServiceListPresentWithDeleteChoice() {
         ServiceCreateInput createInput = ServiceDataUtils.buildServiceCreateInput();
-
         ConfigurationResponseCommon configurationResponseCommon = new ConfigurationResponseCommonBuilder()
                 .setRequestId("request 1").setAckFinalIndicator(ResponseCodes.FINAL_ACK_NO)
                 .setResponseCode(ResponseCodes.RESPONSE_OK).setResponseMessage("PCE calculation in progress").build();
         PathComputationRequestOutput pathComputationRequestOutput = new PathComputationRequestOutputBuilder()
                 .setConfigurationResponseCommon(configurationResponseCommon).build();
         this.serviceDataStoreOperations.createService(createInput);
-        String result = serviceDataStoreOperations.writeOrModifyOrDeleteServiceList("service 1",
-            createInput, pathComputationRequestOutput, 1);
-        Assert.assertNull(result);
+        String result = serviceDataStoreOperations
+            .writeOrModifyOrDeleteServiceList("service 1", createInput, pathComputationRequestOutput, 1);
+        assertNull(result);
     }
 
     @Test
-    public void writeOrModifyOrDeleteServiceListPresentWithNoValidChoice() {
+    void writeOrModifyOrDeleteServiceListPresentWithNoValidChoice() {
         ServiceCreateInput createInput = ServiceDataUtils.buildServiceCreateInput();
         ConfigurationResponseCommon configurationResponseCommon = new ConfigurationResponseCommonBuilder()
                 .setRequestId("request 1").setAckFinalIndicator(ResponseCodes.FINAL_ACK_NO)
@@ -123,102 +122,105 @@ public class ServiceDataStoreOperationsImplTest extends AbstractTest {
         PathComputationRequestOutput pathComputationRequestOutput = new PathComputationRequestOutputBuilder()
                 .setConfigurationResponseCommon(configurationResponseCommon).build();
         this.serviceDataStoreOperations.createService(createInput);
-        String result = serviceDataStoreOperations.writeOrModifyOrDeleteServiceList("service 1",
-            createInput, pathComputationRequestOutput, 2);
-        Assert.assertNull(result);
-
+        String result = serviceDataStoreOperations
+            .writeOrModifyOrDeleteServiceList("service 1",createInput, pathComputationRequestOutput, 2);
+        assertNull(result);
     }
 
     @Test
-    public void getServiceFromEmptyDataStoreShouldBeEmpty() {
+    void getServiceFromEmptyDataStoreShouldBeEmpty() {
         Optional<Services> optService = this.serviceDataStoreOperations.getService("service 1");
-        Assert.assertFalse(optService.isPresent());
+        assertFalse(optService.isPresent());
     }
 
     @Test
-    public void createServiceShouldBeSuccessForValidInput() {
+    void createServiceShouldBeSuccessForValidInput() {
         ServiceCreateInput createInput = ServiceDataUtils.buildServiceCreateInput();
         OperationResult result = this.serviceDataStoreOperations.createService(createInput);
-        Assert.assertTrue(result.isSuccess());
+        assertTrue(result.isSuccess());
     }
 
     @Test
-    public void getServiceShouldReturnTheCorrectServiceForTheCreatedService() {
+    void getServiceShouldReturnTheCorrectServiceForTheCreatedService() {
         ServiceCreateInput createInput = ServiceDataUtils.buildServiceCreateInput();
         this.serviceDataStoreOperations.createService(createInput);
 
         Optional<Services> optService = this.serviceDataStoreOperations.getService(createInput.getServiceName());
-        Assert.assertTrue(optService.isPresent());
-        Assert.assertEquals(createInput.getServiceName(), optService.get().getServiceName());
+        assertTrue(optService.isPresent());
+        assertEquals(createInput.getServiceName(), optService.orElseThrow().getServiceName());
     }
 
     @Test
-    public void deleteServiceShouldBeSuccessfulForDeletingService() {
+    void deleteServiceShouldBeSuccessfulForDeletingService() {
         ServiceCreateInput createInput = ServiceDataUtils.buildServiceCreateInput();
         this.serviceDataStoreOperations.createService(createInput);
         OperationResult result = this.serviceDataStoreOperations.deleteService(createInput.getServiceName());
-        Assert.assertTrue(result.isSuccess());
+        assertTrue(result.isSuccess());
     }
 
-//    @Test
-//    public void deleteServiceShouldBeFailedIfServiceDoNotExists() {
-//        OperationResult result = this.serviceDataStoreOperations.deleteService("Any service");
-//        Assert.assertFalse(result.isSuccess());
-//    }
+    @Test
+    void deleteServiceShouldBeSuccessEvenIfServiceDoNotExists() {
+        OperationResult result = this.serviceDataStoreOperations.deleteService("Any service");
+        assertTrue(result.isSuccess());
+    }
 
     @Test
-    public void modifyServiceIsSuccessfulForPresentService() {
+    void modifyServiceIsSuccessfulForPresentService() {
         ServiceCreateInput createInput = ServiceDataUtils.buildServiceCreateInput();
         this.serviceDataStoreOperations.createService(createInput);
         OperationResult result = this.serviceDataStoreOperations.modifyService(createInput.getServiceName(),
             State.InService, AdminStates.InService);
-        Assert.assertTrue(result.isSuccess());
+        assertTrue(result.isSuccess());
     }
 
     @Test
-    public void getTempServiceFromEmptyDataStoreShouldBeEmpty() {
-        Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list
+    void getTempServiceFromEmptyDataStoreShouldBeEmpty() {
+        Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.temp.service.list
                 .Services> optService = this.serviceDataStoreOperations.getTempService("service 1");
-        Assert.assertFalse(optService.isPresent());
+        assertFalse(optService.isPresent());
     }
 
     @Test
-    public void createTempServiceShouldBeSuccessForValidInput() {
+    void createTempServiceShouldBeSuccessForValidInput() {
         TempServiceCreateInput createInput = ServiceDataUtils.buildTempServiceCreateInput();
-        OperationResult result = this.serviceDataStoreOperations.createTempService(createInput);
-        Assert.assertTrue(result.isSuccess());
+        PathDescription pathDescription = ServiceDataUtils.createPathDescription(0,1, 0, 1);
+        OperationResult result = this.serviceDataStoreOperations.createTempService(createInput, pathDescription);
+        assertTrue(result.isSuccess());
     }
 
     @Test
-    public void getTempServiceShouldReturnTheCorrectTempServiceForTheCreatedService() {
+    void getTempServiceShouldReturnTheCorrectTempServiceForTheCreatedService() {
         TempServiceCreateInput createInput = ServiceDataUtils.buildTempServiceCreateInput();
-        this.serviceDataStoreOperations.createTempService(createInput);
+        PathDescription pathDescription = ServiceDataUtils.createPathDescription(0,1, 0, 1);
+        this.serviceDataStoreOperations.createTempService(createInput, pathDescription);
 
-        Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.list
+        Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.temp.service.list
                 .Services> optService = this.serviceDataStoreOperations.getTempService(createInput.getCommonId());
-        Assert.assertTrue(optService.isPresent());
-        Assert.assertEquals(createInput.getCommonId(), optService.get().getCommonId());
+        assertTrue(optService.isPresent());
+        assertEquals(createInput.getCommonId(), optService.orElseThrow().getCommonId());
     }
 
     @Test
-    public void deleteTempServiceShouldBeSuccessfulForDeletingTempService() {
+    void deleteTempServiceShouldBeSuccessfulForDeletingTempService() {
         TempServiceCreateInput createInput = ServiceDataUtils.buildTempServiceCreateInput();
-        this.serviceDataStoreOperations.createTempService(createInput);
+        PathDescription pathDescription = ServiceDataUtils.createPathDescription(0,1, 0, 1);
+        this.serviceDataStoreOperations.createTempService(createInput, pathDescription);
         OperationResult result = this.serviceDataStoreOperations.deleteTempService(createInput.getCommonId());
-        Assert.assertTrue(result.isSuccess());
+        assertTrue(result.isSuccess());
     }
 
     @Test
-    public void modifyTempServiceIsSuccessfulForPresentTempService() {
+    void modifyTempServiceIsSuccessfulForPresentTempService() {
         TempServiceCreateInput createInput = ServiceDataUtils.buildTempServiceCreateInput();
-        this.serviceDataStoreOperations.createTempService(createInput);
+        PathDescription pathDescription = ServiceDataUtils.createPathDescription(0,1, 0, 1);
+        this.serviceDataStoreOperations.createTempService(createInput, pathDescription);
         OperationResult result = this.serviceDataStoreOperations.modifyTempService(
             createInput.getCommonId(), State.InService, AdminStates.InService);
-        Assert.assertTrue(result.isSuccess());
+        assertTrue(result.isSuccess());
     }
 
     @Test
-    public void createServicePathShouldBeSuccessfulForValidInput() {
+    void createServicePathShouldBeSuccessfulForValidInput() {
         ServiceCreateInput createInput = ServiceDataUtils.buildServiceCreateInput();
         this.serviceDataStoreOperations.createService(createInput);
         ServiceInput serviceInput = new ServiceInput(createInput);
@@ -235,13 +237,13 @@ public class ServiceDataStoreOperationsImplTest extends AbstractTest {
         PathComputationRequestOutput pathComputationRequestOutput = new PathComputationRequestOutputBuilder()
             .setConfigurationResponseCommon(configurationResponseCommon).setResponseParameters(responseParameters)
             .build();
-        OperationResult result =
-            this.serviceDataStoreOperations.createServicePath(serviceInput, pathComputationRequestOutput);
-        Assert.assertTrue(result.isSuccess());
+        OperationResult result = this.serviceDataStoreOperations
+            .createServicePath(serviceInput, pathComputationRequestOutput);
+        assertTrue(result.isSuccess());
     }
 
     @Test
-    public void createServicePathShouldFailForInvalidInput() {
+    void createServicePathShouldFailForInvalidInput() {
         ServiceCreateInput createInput = ServiceDataUtils.buildServiceCreateInput();
         this.serviceDataStoreOperations.createService(createInput);
         ServiceInput serviceInput = new ServiceInput(createInput);
@@ -252,13 +254,13 @@ public class ServiceDataStoreOperationsImplTest extends AbstractTest {
         PathComputationRequestOutput pathComputationRequestOutput = new PathComputationRequestOutputBuilder()
             .setConfigurationResponseCommon(configurationResponseCommon).setResponseParameters(responseParameters)
             .build();
-        OperationResult result =
-            this.serviceDataStoreOperations.createServicePath(serviceInput, pathComputationRequestOutput);
-        Assert.assertFalse(result.isSuccess());
+        OperationResult result = this.serviceDataStoreOperations
+            .createServicePath(serviceInput, pathComputationRequestOutput);
+        assertFalse(result.isSuccess());
     }
 
     @Test
-    public void deleteServicePathShouldBeSuccessForDeletingServicePath() {
+    void deleteServicePathShouldBeSuccessForDeletingServicePath() {
         ServiceCreateInput createInput = ServiceDataUtils.buildServiceCreateInput();
         this.serviceDataStoreOperations.createService(createInput);
         ServiceInput serviceInput = new ServiceInput(createInput);
@@ -278,6 +280,6 @@ public class ServiceDataStoreOperationsImplTest extends AbstractTest {
         this.serviceDataStoreOperations.createServicePath(serviceInput, pathComputationRequestOutput);
 
         OperationResult result = this.serviceDataStoreOperations.deleteServicePath(serviceInput.getServiceName());
-        Assert.assertTrue(result.isSuccess());
+        assertTrue(result.isSuccess());
     }
-}
+}
\ No newline at end of file
index ecd809f95d4f6714c0c4ceb0fc69e57da9b70164..47c5740d2c23361c0e5e47f45ba947610d497135 100644 (file)
@@ -7,35 +7,35 @@
  */
 package org.opendaylight.transportpce.servicehandler.utils;
 
-import java.math.BigDecimal;
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.DiversityConstraints.DiversityType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.common.constraints.LinkIdentifier;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.common.constraints.LinkIdentifierBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.CoRouting;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.CoRoutingBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.DistanceBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.DiversityBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.Exclude;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.ExcludeBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.HopCountBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.Include;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.IncludeBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.LatencyBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.TEMetricBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co.routing.ServiceIdentifierList;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co.routing.ServiceIdentifierListBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.diversity.existing.service.constraints.ServiceIdentifierListKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.equipment.EquipmentBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.HardConstraints;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.HardConstraintsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.SoftConstraints;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.SoftConstraintsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.service.applicability.g.ServiceApplicabilityBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.DiversityConstraints.DiversityType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.common.constraints.LinkIdentifier;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.common.constraints.LinkIdentifierBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.CoRouting;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.CoRoutingBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.DistanceBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.DiversityBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.Exclude;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.ExcludeBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.HopCountBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.Include;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.IncludeBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.LatencyBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.TEMetricBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co.routing.ServiceIdentifierList;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co.routing.ServiceIdentifierListBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.diversity.existing.service.constraints.ServiceIdentifierListKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.equipment.EquipmentBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.HardConstraints;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.HardConstraintsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.SoftConstraints;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.SoftConstraintsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.service.applicability.g.ServiceApplicabilityBuilder;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.opendaylight.yangtools.yang.common.Uint8;
 
@@ -64,8 +64,8 @@ public final class ConstraintsUtils {
      * @param  coRoutingServiceId   set co-routing constraints
      * @return                      the hard-constraints
      */
-    public static SoftConstraints buildSoftConstraint(List<String> customerCode, boolean operationalMode,
-                                                      List<String> diversityServiceList, String exclude, String include,
+    public static SoftConstraints buildSoftConstraint(Set<String> customerCode, boolean operationalMode,
+                                                      Set<String> diversityServiceList, String exclude, String include,
                                                       Double maxLatency, boolean hopCount, boolean teMetric,
                                                       String maxDistance, String coRoutingServiceId) {
 
@@ -100,18 +100,18 @@ public final class ConstraintsUtils {
      * @param  coRoutingServiceId   set co-routing constraints
      * @return                      the hard-constraints
      */
-    public static HardConstraints buildHardConstraint(List<String> customerCode, boolean operationalMode,
-                                                      List<String> diversityServiceList, String exclude, String include,
+    public static HardConstraints buildHardConstraint(Set<String> customerCode, boolean operationalMode,
+                                                      Set<String> diversityServiceList, String exclude, String include,
                                                       Double maxLatency, boolean hopCount, boolean teMetric,
                                                       String maxDistance, String coRoutingServiceId) {
 
         Map<ServiceIdentifierListKey,
-            org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.diversity.existing.service
+            org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.diversity.existing.service
                     .constraints.ServiceIdentifierList>
                 serviceIdList = new HashMap<>();
         if (diversityServiceList != null) {
             for (String serviceId : diversityServiceList) {
-                org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.diversity.existing.service
+                org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.diversity.existing.service
                         .constraints.ServiceIdentifierList sil = createServiceIdentifierListForDiversity(serviceId);
                 serviceIdList.put(sil.key(), sil);
             }
@@ -125,7 +125,7 @@ public final class ConstraintsUtils {
             .setCustomerCode(customerCode)
             .setOperationalMode(
                 operationalMode
-                    ? Arrays.asList("operational-mode 1", "operational-mode 2")
+                    ? Set.of("operational-mode 1", "operational-mode 2")
                     : null)
             .setDiversity(
                 serviceIdList.isEmpty()
@@ -145,7 +145,7 @@ public final class ConstraintsUtils {
             .setLatency(
                 maxLatency == null
                     ? null
-                    : new LatencyBuilder().setMaxLatency(new BigDecimal(maxLatency)).build())
+                    : new LatencyBuilder().setMaxLatency(Decimal64.valueOf(String.valueOf(maxLatency))).build())
             .setHopCount(
                 hopCount
                     ? new HopCountBuilder()
@@ -163,7 +163,7 @@ public final class ConstraintsUtils {
             .setDistance(
                 maxDistance == null
                     ? null
-                    : new DistanceBuilder().setMaxDistance(new BigDecimal(maxDistance)).build())
+                    : new DistanceBuilder().setMaxDistance(Decimal64.valueOf(String.valueOf(maxDistance))).build())
             .setCoRouting(
                 coRoutingServiceId == null || !coRoutingMap.containsKey(coRoutingServiceId)
                     ? null
@@ -171,11 +171,11 @@ public final class ConstraintsUtils {
             .build();
     }
 
-    private static org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.diversity.existing
+    private static org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.diversity.existing
             .service.constraints.ServiceIdentifierList createServiceIdentifierListForDiversity(String serviceId) {
-        return new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.diversity.existing
+        return new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.diversity.existing
                     .service.constraints.ServiceIdentifierListBuilder()
-            .setServiceIndentifier(serviceId)
+            .setServiceIdentifier(serviceId)
             .setServiceApplicability(new ServiceApplicabilityBuilder()
                 .setLink(true)
                 .setNode(true)
@@ -194,7 +194,7 @@ public final class ConstraintsUtils {
         excludeHashMap.put(
             "link1",
             new ExcludeBuilder()
-                .setLinkIdentifier(Map.of(linkId1.key(), linkId1))
+                .setLinkIdentifier(List.of(linkId1))
                 .build());
         excludeHashMap.put(
             "node",
@@ -227,7 +227,7 @@ public final class ConstraintsUtils {
         excludeHashMap.put(
             "link2",
             new ExcludeBuilder()
-                .setLinkIdentifier(Map.of(linkId2.key(), linkId2, linkId3.key(), linkId3))
+                .setLinkIdentifier(List.of(linkId2, linkId3))
                 .build());
         return excludeHashMap;
     }
@@ -241,7 +241,7 @@ public final class ConstraintsUtils {
         includeHashMap.put(
             "link1",
             new IncludeBuilder()
-                .setLinkIdentifier(Map.of(linkId1.key(), linkId1))
+                .setLinkIdentifier(List.of(linkId1))
                 .build());
         includeHashMap.put(
             "node",
@@ -274,7 +274,7 @@ public final class ConstraintsUtils {
         includeHashMap.put(
             "link2",
             new IncludeBuilder()
-                .setLinkIdentifier(Map.of(linkId2.key(), linkId2, linkId3.key(), linkId3))
+                .setLinkIdentifier(List.of(linkId2, linkId3))
                 .build());
         return includeHashMap;
     }
index 2a54caaeae321abe11c1131cf85f4c6e5fb8438a..ed375bc11314fc4b58a7b56c825fc3b78c20082a 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.transportpce.servicehandler.utils;
 
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.mock;
index 0604a6c95492a25c181a9cf1619181a816de6257..557d43dc4782c9b37a47ae9d565dfbb4d4acbe88 100644 (file)
@@ -9,40 +9,40 @@ package org.opendaylight.transportpce.servicehandler.utils;
 
 import com.google.common.util.concurrent.ListenableFuture;
 import org.opendaylight.transportpce.servicehandler.ServiceInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.path.computation.request.input.ServiceAEnd;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.path.computation.request.input.ServiceAEndBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.path.computation.request.input.ServiceZEnd;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.path.computation.request.input.ServiceZEndBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.service.path.rpc.result.PathDescription;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.request.input.ServiceAEnd;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.request.input.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.request.input.ServiceZEnd;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.path.computation.request.input.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.service.path.rpc.result.PathDescription;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceDeleteInputBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestInput;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.ServiceImplementationRequestInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev181130.NodeIdType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ServiceEndpoint;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.configuration.response.common.ConfigurationResponseCommonBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.response.parameters.ResponseParametersBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ServiceEndpoint;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommonBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.response.parameters.ResponseParametersBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.LifecycleState;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceDeleteInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceDeleteOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceDeleteOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.ServicesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReconfigureInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceDeleteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceDeleteOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceDeleteOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.ServicesBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.RxDirection;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.RxDirectionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.service.endpoint.sp.TxDirection;
@@ -74,12 +74,14 @@ public final class ModelMappingUtils {
                 .setTxDirection(
                     new org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118
                             .service.endpoint.sp.TxDirectionBuilder()
-                        .setPort(input.getServiceAEnd().getTxDirection().values().stream().findFirst().get().getPort())
+                        .setPort(input.getServiceAEnd().getTxDirection().values().stream().findFirst().orElseThrow()
+                            .getPort())
                         .build())
                 .setRxDirection(
                     new org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118
                             .service.endpoint.sp.RxDirectionBuilder()
-                        .setPort(input.getServiceAEnd().getRxDirection().values().stream().findFirst().get().getPort())
+                        .setPort(input.getServiceAEnd().getRxDirection().values().stream().findFirst().orElseThrow()
+                            .getPort())
                         .build());
         org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915
                 .service.implementation.request.input.ServiceZEndBuilder serviceZEnd =
@@ -91,12 +93,14 @@ public final class ModelMappingUtils {
                 .setTxDirection(
                     new org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118
                             .service.endpoint.sp.TxDirectionBuilder()
-                        .setPort(input.getServiceZEnd().getTxDirection().values().stream().findFirst().get().getPort())
+                        .setPort(input.getServiceZEnd().getTxDirection().values().stream().findFirst().orElseThrow()
+                            .getPort())
                         .build())
                 .setRxDirection(
                     new org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118
                             .service.endpoint.sp.RxDirectionBuilder()
-                        .setPort(input.getServiceZEnd().getRxDirection().values().stream().findFirst().get().getPort())
+                        .setPort(input.getServiceZEnd().getRxDirection().values().stream().findFirst().orElseThrow()
+                            .getPort())
                         .build());
         return serviceImplementationRequestInputBuilder
             .setServiceAEnd(serviceAEnd.build())
@@ -139,11 +143,11 @@ public final class ModelMappingUtils {
             .setClli(serviceAEnd.getClli())
             .setNodeId(new NodeIdType(serviceAEnd.getNodeId().getValue()).getValue())
             .setRxDirection(
-                createRxDirection(serviceAEnd.getRxDirection().values().stream().findFirst().get()))
+                createRxDirection(serviceAEnd.getRxDirection().values().stream().findFirst().orElseThrow()))
             .setServiceFormat(serviceAEnd.getServiceFormat())
             .setServiceRate(serviceAEnd.getServiceRate())
             .setTxDirection(
-                createTxDirection(serviceAEnd.getTxDirection().values().stream().findFirst().get()))
+                createTxDirection(serviceAEnd.getTxDirection().values().stream().findFirst().orElseThrow()))
             .build();
     }
 
@@ -152,16 +156,16 @@ public final class ModelMappingUtils {
             .setClli(serviceZEnd.getClli())
             .setNodeId(new NodeIdType(serviceZEnd.getNodeId().getValue()).getValue())
             .setRxDirection(
-                createRxDirection(serviceZEnd.getRxDirection().values().stream().findFirst().get()))
+                createRxDirection(serviceZEnd.getRxDirection().values().stream().findFirst().orElseThrow()))
             .setServiceFormat(serviceZEnd.getServiceFormat())
             .setServiceRate(serviceZEnd.getServiceRate())
             .setTxDirection(
-                createTxDirection(serviceZEnd.getTxDirection().values().stream().findFirst().get()))
+                createTxDirection(serviceZEnd.getTxDirection().values().stream().findFirst().orElseThrow()))
         .build();
     }
 
     public static RxDirection createRxDirection(
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
                 .service.endpoint.RxDirection rxDirection) {
         return new RxDirectionBuilder()
             .setPort(rxDirection.getPort())
@@ -169,7 +173,7 @@ public final class ModelMappingUtils {
     }
 
     public static TxDirection createTxDirection(
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
                 .service.endpoint.TxDirection txDirection) {
         return new TxDirectionBuilder()
             .setPort(txDirection.getPort())
@@ -280,11 +284,11 @@ public final class ModelMappingUtils {
                 .setSdncRequestHeader(serviceCreateInput.getSdncRequestHeader())
                 .setLifecycleState(LifecycleState.Planned)
                 .setServiceAEnd(
-                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
                             .service.ServiceAEndBuilder(serviceCreateInput.getServiceAEnd())
                         .build())
                 .setServiceZEnd(
-                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
                             .service.ServiceZEndBuilder(serviceCreateInput.getServiceZEnd())
                         .build())
                 .build();
@@ -302,11 +306,11 @@ public final class ModelMappingUtils {
                 .setSoftConstraints(serviceReconfigureInput.getSoftConstraints())
                 .setLifecycleState(LifecycleState.Planned)
                 .setServiceAEnd(
-                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
                             .service.ServiceAEndBuilder(serviceReconfigureInput.getServiceAEnd())
                         .build())
                 .setServiceZEnd(
-                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
                             .service.ServiceZEndBuilder(serviceReconfigureInput.getServiceZEnd())
                         .build())
                 .build();
@@ -314,9 +318,9 @@ public final class ModelMappingUtils {
         return new ServicesBuilder().build();
     }
 
-    public static org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210
+    public static org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
             .temp.service.list.Services mappingServices(TempServiceCreateInput tempServiceCreateInput) {
-        return new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210
+        return new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
                 .temp.service.list.ServicesBuilder()
             .setServiceName(tempServiceCreateInput.getCommonId())
             .setAdministrativeState(AdminStates.OutOfService)
@@ -330,10 +334,10 @@ public final class ModelMappingUtils {
             .setSdncRequestHeader(tempServiceCreateInput.getSdncRequestHeader())
             .setLifecycleState(LifecycleState.Planned)
             .setServiceAEnd(
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
                     .service.ServiceAEndBuilder(tempServiceCreateInput.getServiceAEnd()).build())
             .setServiceZEnd(
-                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
                     .service.ServiceZEndBuilder(tempServiceCreateInput.getServiceZEnd()).build())
             .build();
     }
@@ -357,7 +361,7 @@ public final class ModelMappingUtils {
                                         .service.endpoint.sp.TxDirectionBuilder()
                                 .setPort(
                                     serviceInput.getServiceAEnd().getTxDirection()
-                                        .values().stream().findFirst().get().getPort())
+                                        .values().stream().findFirst().orElseThrow().getPort())
                                 .build())
                         .setRxDirection(
                             new org.opendaylight.yang.gen.v1
@@ -365,7 +369,7 @@ public final class ModelMappingUtils {
                                         .service.endpoint.sp.RxDirectionBuilder()
                                 .setPort(
                                     serviceInput.getServiceAEnd().getRxDirection()
-                                        .values().stream().findFirst().get().getPort())
+                                        .values().stream().findFirst().orElseThrow().getPort())
                                 .build())
                         .build())
                 .setServiceZEnd(
@@ -381,7 +385,7 @@ public final class ModelMappingUtils {
                                         .service.endpoint.sp.TxDirectionBuilder()
                                 .setPort(
                                     serviceInput.getServiceZEnd().getTxDirection()
-                                        .values().stream().findFirst().get().getPort())
+                                        .values().stream().findFirst().orElseThrow().getPort())
                                 .build())
                         .setRxDirection(
                             new org.opendaylight.yang.gen.v1
@@ -389,7 +393,7 @@ public final class ModelMappingUtils {
                                         .service.endpoint.sp.RxDirectionBuilder()
                                 .setPort(
                                     serviceInput.getServiceZEnd().getRxDirection()
-                                        .values().stream().findFirst().get().getPort())
+                                        .values().stream().findFirst().orElseThrow().getPort())
                                 .build())
                         .build())
                 .setServicePathName(serviceInput.getServiceName())
index 60dca17c3e982f18f7f7752aab8fb7f72e6fef1a..a9df0ed95617547121c5dd26c8dee3c5bb217edd 100644 (file)
@@ -17,58 +17,54 @@ import java.util.Map;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Executors;
 import org.opendaylight.transportpce.servicehandler.ModelMappingUtils;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.PathComputationRequestInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.ServicePathRpcResult;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.ServicePathRpcResultBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.service.path.rpc.result.PathDescription;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.service.path.rpc.result.PathDescriptionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.PathComputationRequestInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.ServicePathRpcResult;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.ServicePathRpcResultBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.service.path.rpc.result.PathDescription;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.service.path.rpc.result.PathDescriptionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.RendererRpcResultSp;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.RendererRpcResultSpBuilder;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.ServiceRpcResultSh;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.ServiceRpcResultShBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ConnectionType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.RpcActions;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ServiceNotificationTypes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.sdnc.request.header.SdncRequestHeader;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.sdnc.request.header.SdncRequestHeaderBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.RxDirection;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.RxDirectionKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.TxDirection;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.TxDirectionKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.lgx.LgxBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.port.PortBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.HardConstraintsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.SoftConstraintsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ConnectionType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ServiceNotificationTypes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.sdnc.request.header.SdncRequestHeader;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.sdnc.request.header.SdncRequestHeaderBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.RxDirection;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.RxDirectionKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.TxDirection;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.TxDirectionKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.lgx.LgxBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.port.PortBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.HardConstraintsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.SoftConstraintsBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceFeasibilityCheckInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceFeasibilityCheckInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceReconfigureInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRerouteInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRestorationInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRestorationInput.Option;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceRestorationInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceCreateInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceDeleteInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.TempServiceDeleteInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.delete.input.ServiceDeleteReqInfo;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.delete.input.ServiceDeleteReqInfoBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.feasibility.check.inputs.ServiceAEnd;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.feasibility.check.inputs.ServiceAEndBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.feasibility.check.inputs.ServiceZEnd;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.feasibility.check.inputs.ServiceZEndBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirection;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.AToZDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirection;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ZToADirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceFeasibilityCheckInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceFeasibilityCheckInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReconfigureInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceReconfigureInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRerouteInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRestorationInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRestorationInput.Option;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceRestorationInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceCreateInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceDeleteInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.TempServiceDeleteInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.delete.input.ServiceDeleteReqInfo;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.delete.input.ServiceDeleteReqInfoBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.feasibility.check.inputs.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.feasibility.check.inputs.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.AToZDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ZToADirectionBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.PceMetric;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.RpcStatusEx;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.ServicePathNotificationTypes;
@@ -80,98 +76,92 @@ import org.opendaylight.yangtools.yang.common.Uint8;
 public final class ServiceDataUtils {
 
     public static ServiceCreateInput buildServiceCreateInput() {
-
-        org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input
-            .ServiceAEnd serviceAEnd = getServiceAEndBuild()
-            .build();
-        org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input
-            .ServiceZEnd serviceZEnd = new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service
-            .create.input.ServiceZEndBuilder()
-            .setClli("clli").setServiceFormat(ServiceFormat.OC).setServiceRate(Uint32.valueOf(1))
-            .setNodeId(new NodeIdType("XPONDER-3-2"))
-            .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()),getTxDirection()))
-            .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection()))
-            .build();
-
-        ServiceCreateInputBuilder builtInput = new ServiceCreateInputBuilder()
+        return new ServiceCreateInputBuilder()
             .setCommonId("commonId")
             .setConnectionType(ConnectionType.Service)
             .setCustomer("Customer")
             .setServiceName("service 1")
-            .setServiceAEnd(serviceAEnd)
-            .setServiceZEnd(serviceZEnd)
-            .setSdncRequestHeader(new SdncRequestHeaderBuilder().setRequestId("request 1")
-                .setRpcAction(RpcActions.ServiceCreate).setNotificationUrl("notification url").build());
-
-        return builtInput.build();
+            .setServiceAEnd(getServiceAEndBuild().build())
+            .setServiceZEnd(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                        .service.create.input.ServiceZEndBuilder()
+                    .setClli("clli").setServiceFormat(ServiceFormat.OC).setServiceRate(Uint32.valueOf(1))
+                    .setNodeId(new NodeIdType("XPONDER-3-2"))
+                    .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()),getTxDirection()))
+                    .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection()))
+                    .build())
+            .setSdncRequestHeader(
+                new SdncRequestHeaderBuilder()
+                    .setRequestId("request 1")
+                    .setRpcAction(RpcActions.ServiceCreate)
+                    .setNotificationUrl("notification url")
+                    .build())
+            .build();
     }
 
     public static ServiceCreateInput buildServiceCreateInputWithHardConstraints() {
-
-        org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input
-                .ServiceAEnd serviceAEnd = getServiceAEndBuild()
-                .build();
-        org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input
-                .ServiceZEnd serviceZEnd = new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service
-                .create.input.ServiceZEndBuilder()
-                .setClli("clli").setServiceFormat(ServiceFormat.OC).setServiceRate(Uint32.valueOf(1))
-                .setNodeId(new NodeIdType("XPONDER-3-2"))
-                .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()),getTxDirection()))
-                .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection()))
-                .build();
-
-        ServiceCreateInputBuilder builtInput = new ServiceCreateInputBuilder()
+        return new ServiceCreateInputBuilder()
             .setCommonId("commonId")
             .setConnectionType(ConnectionType.Service)
             .setCustomer("Customer")
             .setServiceName("service 1")
-            .setServiceAEnd(serviceAEnd)
-            .setServiceZEnd(serviceZEnd)
-            .setSdncRequestHeader(new SdncRequestHeaderBuilder().setRequestId("request 1")
-                .setRpcAction(RpcActions.ServiceCreate).setNotificationUrl("notification url").build())
-            .setHardConstraints(new HardConstraintsBuilder().build());
-
-        return builtInput.build();
+            .setServiceAEnd(getServiceAEndBuild().build())
+            .setServiceZEnd(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                        .service.create.input.ServiceZEndBuilder()
+                    .setClli("clli")
+                    .setServiceFormat(ServiceFormat.OC)
+                    .setServiceRate(Uint32.valueOf(1))
+                    .setNodeId(new NodeIdType("XPONDER-3-2"))
+                    .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()),getTxDirection()))
+                    .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection()))
+                    .build())
+            .setSdncRequestHeader(
+                new SdncRequestHeaderBuilder()
+                    .setRequestId("request 1")
+                    .setRpcAction(RpcActions.ServiceCreate)
+                    .setNotificationUrl("notification url")
+                    .build())
+            .setHardConstraints(new HardConstraintsBuilder().build())
+            .build();
     }
 
     public static ServiceCreateInput buildServiceCreateInputWithSoftConstraints() {
-
-        org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input
-                .ServiceAEnd serviceAEnd = getServiceAEndBuild()
-                .build();
-        org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input
-                .ServiceZEnd serviceZEnd = new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service
-                .create.input.ServiceZEndBuilder()
-                .setClli("clli").setServiceFormat(ServiceFormat.OC).setServiceRate(Uint32.valueOf(1))
-                .setNodeId(new NodeIdType("XPONDER-3-2"))
-                .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()),getTxDirection()))
-                .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection()))
-                .build();
-
-        ServiceCreateInputBuilder builtInput = new ServiceCreateInputBuilder()
+        return new ServiceCreateInputBuilder()
             .setCommonId("commonId")
             .setConnectionType(ConnectionType.Service)
             .setCustomer("Customer")
             .setServiceName("service 1")
-            .setServiceAEnd(serviceAEnd)
-            .setServiceZEnd(serviceZEnd)
-            .setSdncRequestHeader(new SdncRequestHeaderBuilder().setRequestId("request 1")
-                .setRpcAction(RpcActions.ServiceCreate).setNotificationUrl("notification url").build())
-            .setSoftConstraints(new SoftConstraintsBuilder().build());
-
-        return builtInput.build();
+            .setServiceAEnd(getServiceAEndBuild().build())
+            .setServiceZEnd(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                        .service.create.input.ServiceZEndBuilder()
+                    .setClli("clli")
+                    .setServiceFormat(ServiceFormat.OC)
+                    .setServiceRate(Uint32.valueOf(1))
+                    .setNodeId(new NodeIdType("XPONDER-3-2"))
+                    .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()),getTxDirection()))
+                    .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection()))
+                    .build())
+            .setSdncRequestHeader(
+                new SdncRequestHeaderBuilder()
+                    .setRequestId("request 1")
+                    .setRpcAction(RpcActions.ServiceCreate)
+                    .setNotificationUrl("notification url")
+                    .build())
+            .setSoftConstraints(new SoftConstraintsBuilder().build())
+            .build();
     }
 
     public static PathComputationRequestInput createPceRequestInput(ServiceCreateInput input) {
-        ServiceHandlerHeaderBuilder serviceHandlerHeader = new ServiceHandlerHeaderBuilder();
         SdncRequestHeader serviceHandler = input.getSdncRequestHeader();
-        if (serviceHandler != null) {
-            serviceHandlerHeader.setRequestId(serviceHandler.getRequestId());
-        }
         return new PathComputationRequestInputBuilder()
             .setServiceName(input.getServiceName())
             .setResourceReserve(true)
-            .setServiceHandlerHeader(serviceHandlerHeader.build())
+            .setServiceHandlerHeader(
+                serviceHandler == null
+                    ? new ServiceHandlerHeaderBuilder().build()
+                    : new ServiceHandlerHeaderBuilder().setRequestId(serviceHandler.getRequestId()).build())
             .setHardConstraints(input.getHardConstraints())
             .setSoftConstraints(input.getSoftConstraints())
             .setPceRoutingMetric(PceMetric.TEMetric)
@@ -181,194 +171,226 @@ public final class ServiceDataUtils {
     }
 
     public static TempServiceCreateInput buildTempServiceCreateInput() {
-
-        org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.create.input
-            .ServiceAEnd serviceAEnd = new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp
-                .service.create.input.ServiceAEndBuilder()
-            .setClli("clli").setServiceFormat(ServiceFormat.OC).setServiceRate(Uint32.valueOf(1))
-            .setNodeId(new NodeIdType("XPONDER-1-2"))
-            .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()),getTxDirection()))
-            .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection()))
-            .build();
-        org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp.service.create.input
-            .ServiceZEnd serviceZEnd = new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.temp
-            .service.create.input.ServiceZEndBuilder()
-            .setClli("clli").setServiceFormat(ServiceFormat.OC).setServiceRate(Uint32.valueOf(1))
-            .setNodeId(new NodeIdType("XPONDER-3-2"))
-            .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()),getTxDirection()))
-            .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection()))
-            .build();
-
-        TempServiceCreateInputBuilder builtInput = new TempServiceCreateInputBuilder()
+        return new TempServiceCreateInputBuilder()
             .setCommonId("commonId")
             .setConnectionType(ConnectionType.Service)
             .setCustomer("Customer")
-            .setServiceAEnd(serviceAEnd)
-            .setServiceZEnd(serviceZEnd)
-            .setSdncRequestHeader(new SdncRequestHeaderBuilder().setRequestId("request 1")
-                .setRpcAction(RpcActions.TempServiceCreate).setNotificationUrl("notification url").build());
-
-        return builtInput.build();
-    }
-
-    public static ServiceFeasibilityCheckInput buildServiceFeasibilityCheckInput() {
-
-        ServiceAEnd serviceAEnd = new ServiceAEndBuilder()
+            .setServiceAEnd(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                        .temp.service.create.input.ServiceAEndBuilder()
                     .setClli("clli").setServiceFormat(ServiceFormat.OC).setServiceRate(Uint32.valueOf(1))
                     .setNodeId(new NodeIdType("XPONDER-1-2"))
                     .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()),getTxDirection()))
-                    .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection())).build();
-        ServiceZEnd serviceZEnd = new ServiceZEndBuilder()
+                    .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection()))
+                    .build())
+            .setServiceZEnd(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                        .temp.service.create.input.ServiceZEndBuilder()
                     .setClli("clli").setServiceFormat(ServiceFormat.OC).setServiceRate(Uint32.valueOf(1))
                     .setNodeId(new NodeIdType("XPONDER-3-2"))
                     .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()),getTxDirection()))
-                    .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection())).build();
+                    .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection()))
+                    .build())
+            .setSdncRequestHeader(
+                new SdncRequestHeaderBuilder()
+                    .setRequestId("request 1")
+                    .setRpcAction(RpcActions.TempServiceCreate)
+                    .setNotificationUrl("notification url")
+                    .build())
+            .build();
+    }
 
-        ServiceFeasibilityCheckInputBuilder builtInput = new ServiceFeasibilityCheckInputBuilder()
+    public static ServiceFeasibilityCheckInput buildServiceFeasibilityCheckInput() {
+        return new ServiceFeasibilityCheckInputBuilder()
             .setCommonId("commonId")
             .setConnectionType(ConnectionType.Service)
             .setCustomer("Customer")
-            .setServiceAEnd(serviceAEnd)
-            .setServiceZEnd(serviceZEnd)
-            .setSdncRequestHeader(new SdncRequestHeaderBuilder().setRequestId("request 1")
-                .setRpcAction(RpcActions.ServiceFeasibilityCheck).setNotificationUrl("notification url").build());
-        return builtInput.build();
+            .setServiceAEnd(
+                new ServiceAEndBuilder()
+                    .setClli("clli").setServiceFormat(ServiceFormat.OC).setServiceRate(Uint32.valueOf(1))
+                    .setNodeId(new NodeIdType("XPONDER-1-2"))
+                    .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()),getTxDirection()))
+                    .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection()))
+                    .build())
+            .setServiceZEnd(
+                new ServiceZEndBuilder()
+                    .setClli("clli").setServiceFormat(ServiceFormat.OC).setServiceRate(Uint32.valueOf(1))
+                    .setNodeId(new NodeIdType("XPONDER-3-2"))
+                    .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()),getTxDirection()))
+                    .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection()))
+                    .build())
+            .setSdncRequestHeader(
+                new SdncRequestHeaderBuilder()
+                    .setRequestId("request 1")
+                    .setRpcAction(RpcActions.ServiceFeasibilityCheck)
+                    .setNotificationUrl("notification url")
+                    .build())
+            .build();
     }
 
-    public static org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input
-        .ServiceAEndBuilder getServiceAEndBuild() {
-        return new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input
-            .ServiceAEndBuilder()
-            .setClli("clli").setServiceFormat(ServiceFormat.OC).setServiceRate(Uint32.valueOf(1))
+    public static org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+            .service.create.input.ServiceAEndBuilder getServiceAEndBuild() {
+        return new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                .service.create.input.ServiceAEndBuilder()
+            .setClli("clli")
+            .setServiceFormat(ServiceFormat.OC)
+            .setServiceRate(Uint32.valueOf(1))
             .setNodeId(new NodeIdType("XPONDER-1-2"))
             .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()),getTxDirection()))
             .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection()));
     }
 
-    public static org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input
-        .ServiceZEndBuilder getServiceZEndBuild() {
-        return new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input
-            .ServiceZEndBuilder()
-            .setClli("clli").setServiceFormat(ServiceFormat.OC).setServiceRate(Uint32.valueOf(1))
+    public static org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+            .service.create.input.ServiceZEndBuilder getServiceZEndBuild() {
+        return new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                .service.create.input.ServiceZEndBuilder()
+            .setClli("clli")
+            .setServiceFormat(ServiceFormat.OC)
+            .setServiceRate(Uint32.valueOf(1))
             .setNodeId(new NodeIdType("XPONDER-1-2"))
             .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()),getTxDirection()))
             .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection()));
     }
 
     private static TxDirection getTxDirection() {
-        return new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service
-                .endpoint.TxDirectionBuilder().setPort(new PortBuilder().setPortDeviceName("device name")
-                        .setPortName("port name").setPortRack("port rack").setPortShelf("port shelf")
-                        .setPortSlot("port slot").setPortSubSlot("port subslot").setPortType("port type").build())
-                        .setLgx(new LgxBuilder().setLgxDeviceName("lgx device name").setLgxPortName("lgx port name")
-                                .setLgxPortRack("lgx port rack").setLgxPortShelf("lgx port shelf").build())
-                        .setIndex(Uint8.ZERO)
-                        .build();
+        return new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
+                .service.endpoint.TxDirectionBuilder()
+            .setPort(
+                new PortBuilder()
+                    .setPortDeviceName("device name")
+                    .setPortName("port name")
+                    .setPortRack("port rack")
+                    .setPortShelf("port shelf")
+                    .setPortSlot("port slot")
+                    .setPortSubSlot("port subslot")
+                    .setPortType("port type")
+                    .build())
+            .setLgx(
+                new LgxBuilder()
+                    .setLgxDeviceName("lgx device name")
+                    .setLgxPortName("lgx port name")
+                    .setLgxPortRack("lgx port rack")
+                    .setLgxPortShelf("lgx port shelf")
+                    .build())
+            .setIndex(Uint8.ZERO)
+            .build();
     }
 
     private static RxDirection getRxDirection() {
-        return new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service
-                .endpoint.RxDirectionBuilder()
-                    .setPort(new PortBuilder().setPortDeviceName("device name").setPortName("port name")
-                        .setPortRack("port rack").setPortShelf("port shelf").setPortSlot("port slot")
-                        .setPortSubSlot("port subslot").setPortType("port type").build())
-                    .setLgx(new LgxBuilder().setLgxDeviceName("lgx device name")
-                        .setLgxPortName("lgx port name").setLgxPortRack("lgx port rack")
-                        .setLgxPortShelf("lgx port shelf").build())
-                    .setIndex(Uint8.ZERO)
-                    .build();
+        return new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
+                .service.endpoint.RxDirectionBuilder()
+            .setPort(
+                new PortBuilder()
+                    .setPortDeviceName("device name")
+                    .setPortName("port name")
+                    .setPortRack("port rack")
+                    .setPortShelf("port shelf")
+                    .setPortSlot("port slot")
+                    .setPortSubSlot("port subslot")
+                    .setPortType("port type")
+                    .build())
+            .setLgx(
+                new LgxBuilder()
+                    .setLgxDeviceName("lgx device name")
+                    .setLgxPortName("lgx port name")
+                    .setLgxPortRack("lgx port rack")
+                    .setLgxPortShelf("lgx port shelf")
+                    .build())
+            .setIndex(Uint8.ZERO)
+            .build();
     }
 
     public static ServiceDeleteInput buildServiceDeleteInput() {
-
-        ServiceDeleteInputBuilder deleteInputBldr = new ServiceDeleteInputBuilder();
-        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx");
-        OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneOffset.UTC);
-        DateAndTime datetime = new DateAndTime(dtf.format(offsetDateTime));
-        deleteInputBldr.setServiceDeleteReqInfo(new ServiceDeleteReqInfoBuilder().setServiceName("service 1")
-            .setDueDate(datetime).setTailRetention(ServiceDeleteReqInfo.TailRetention.No).build());
-        SdncRequestHeaderBuilder sdncBuilder = new SdncRequestHeaderBuilder()
-            .setNotificationUrl("notification url")
-            .setRequestId("request 1")
-            .setRequestSystemId("request system 1")
-            .setRpcAction(RpcActions.ServiceDelete);
-        deleteInputBldr.setSdncRequestHeader(sdncBuilder.build());
-        return deleteInputBldr.build();
+        return new ServiceDeleteInputBuilder()
+            .setServiceDeleteReqInfo(
+                new ServiceDeleteReqInfoBuilder().setServiceName("service 1")
+                    .setDueDate(
+                        new DateAndTime(
+                            DateTimeFormatter
+                                .ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx")
+                                .format(OffsetDateTime.now(ZoneOffset.UTC))))
+                    .setTailRetention(ServiceDeleteReqInfo.TailRetention.No)
+                    .build())
+            .setSdncRequestHeader(
+                new SdncRequestHeaderBuilder()
+                    .setNotificationUrl("notification url")
+                    .setRequestId("request 1")
+                    .setRequestSystemId("request system 1")
+                    .setRpcAction(RpcActions.ServiceDelete)
+                    .build())
+            .build();
     }
 
     public static TempServiceDeleteInput buildTempServiceDeleteInput() {
-        TempServiceDeleteInputBuilder deleteInputBldr = new TempServiceDeleteInputBuilder()
-            .setCommonId("service 1");
-        return deleteInputBldr.build();
+        return new TempServiceDeleteInputBuilder().setCommonId("service 1").build();
     }
 
     public static TempServiceDeleteInput buildTempServiceDeleteInput(String commonId) {
-        TempServiceDeleteInputBuilder deleteInputBldr = new TempServiceDeleteInputBuilder()
-            .setCommonId(commonId);
-        return deleteInputBldr.build();
+        return new TempServiceDeleteInputBuilder().setCommonId(commonId).build();
     }
 
     public static ServiceRerouteInput buildServiceRerouteInput() {
-        ServiceRerouteInputBuilder builder = new ServiceRerouteInputBuilder()
-            .setServiceName("service 1");
-        return builder.build();
+        return new ServiceRerouteInputBuilder().setServiceName("service 1").build();
     }
 
     public static ServiceRestorationInput buildServiceRestorationInput() {
-        ServiceRestorationInputBuilder builder = new ServiceRestorationInputBuilder()
+        return new ServiceRestorationInputBuilder()
             .setServiceName("service 1")
-            .setOption(Option.Permanent);
-        return builder.build();
+            .setOption(Option.Permanent)
+            .build();
     }
 
     public static ServiceReconfigureInput buildServiceReconfigureInput() {
-
-        org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.reconfigure.input
-            .ServiceAEnd serviceAEnd = new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service
-                .reconfigure.input.ServiceAEndBuilder()
-                .setClli("clli").setServiceFormat(ServiceFormat.OC).setServiceRate(Uint32.valueOf(1))
-                .setNodeId(new NodeIdType("XPONDER-1-2"))
-                .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()),getTxDirection()))
-                .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection()))
-                .build();
-        org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.reconfigure.input
-            .ServiceZEnd serviceZEnd = new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service
-                .reconfigure.input.ServiceZEndBuilder()
-                .setClli("clli").setServiceFormat(ServiceFormat.OC).setServiceRate(Uint32.valueOf(1))
-                .setNodeId(new NodeIdType("XPONDER-3-2"))
-                .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()),getTxDirection()))
-                .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection()))
-                .build();
-
-        ServiceReconfigureInputBuilder builtInput = new ServiceReconfigureInputBuilder()
+        return new ServiceReconfigureInputBuilder()
             .setCommonId("commonId")
             .setConnectionType(ConnectionType.Service)
             .setCustomer("Customer")
             .setServiceName("service 1")
-            .setServiceAEnd(serviceAEnd)
-            .setServiceZEnd(serviceZEnd);
-        return builtInput.build();
+            .setServiceAEnd(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                        .service.reconfigure.input.ServiceAEndBuilder()
+                    .setClli("clli")
+                    .setServiceFormat(ServiceFormat.OC)
+                    .setServiceRate(Uint32.valueOf(1))
+                    .setNodeId(new NodeIdType("XPONDER-1-2"))
+                    .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()),getTxDirection()))
+                    .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection()))
+                    .build())
+            .setServiceZEnd(
+                new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                        .service.reconfigure.input.ServiceZEndBuilder()
+                    .setClli("clli")
+                    .setServiceFormat(ServiceFormat.OC)
+                    .setServiceRate(Uint32.valueOf(1))
+                    .setNodeId(new NodeIdType("XPONDER-3-2"))
+                    .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()),getTxDirection()))
+                    .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection()))
+                    .build())
+            .build();
     }
 
     public static ServicePathRpcResult buildServicePathRpcResult() {
-        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx");
-        OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneOffset.UTC);
-        DateAndTime datetime = new DateAndTime(dtf.format(offsetDateTime));
-        ServicePathRpcResultBuilder builder = new ServicePathRpcResultBuilder();
-        builder.setActualDate(datetime).setNotificationType(ServicePathNotificationTypes.PathComputationRequest)
+        return new ServicePathRpcResultBuilder()
+            .setActualDate(
+                new DateAndTime(
+                    DateTimeFormatter
+                        .ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx")
+                        .format(OffsetDateTime.now(ZoneOffset.UTC))))
+            .setNotificationType(ServicePathNotificationTypes.PathComputationRequest)
             .setPathDescription(createPathDescription(0,1, 0, 1))
             .setServiceName("service 1")
-            .setStatus(RpcStatusEx.Successful).setStatusMessage("success");
-        return builder.build();
+            .setStatus(RpcStatusEx.Successful).setStatusMessage("success")
+            .build();
     }
 
     public static ServicePathRpcResult buildServicePathRpcResult(
             ServicePathNotificationTypes servicePathNotificationTypes, String serviceName, RpcStatusEx rpcStatusEx,
             String message, Boolean pathDescription) {
-        ServicePathRpcResultBuilder builder = new ServicePathRpcResultBuilder();
-        builder.setNotificationType(servicePathNotificationTypes)
-                .setServiceName(serviceName)
-                .setStatus(rpcStatusEx).setStatusMessage(message);
+        ServicePathRpcResultBuilder builder = new ServicePathRpcResultBuilder()
+            .setNotificationType(servicePathNotificationTypes)
+            .setServiceName(serviceName)
+            .setStatus(rpcStatusEx)
+            .setStatusMessage(message);
         if (pathDescription) {
             builder.setPathDescription(createPathDescription(0L, 5L, 0L, 5L));
         }
@@ -376,101 +398,122 @@ public final class ServiceDataUtils {
     }
 
     public static ServicePathRpcResult buildFailedPceServicePathRpcResult() {
-        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx");
-        OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneOffset.UTC);
-        DateAndTime datetime = new DateAndTime(dtf.format(offsetDateTime));
-        ServicePathRpcResultBuilder builder = new ServicePathRpcResultBuilder();
-        builder.setActualDate(datetime).setNotificationType(ServicePathNotificationTypes.PathComputationRequest)
-                .setPathDescription(createPathDescription(0, 1, 0, 1)).setServiceName("service 1")
-                .setStatus(RpcStatusEx.Failed).setStatusMessage("failed");
-        return builder.build();
+        return new ServicePathRpcResultBuilder()
+            .setActualDate(
+                new DateAndTime(
+                    DateTimeFormatter
+                        .ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx")
+                        .format(OffsetDateTime.now(ZoneOffset.UTC))))
+            .setNotificationType(ServicePathNotificationTypes.PathComputationRequest)
+            .setPathDescription(createPathDescription(0, 1, 0, 1))
+            .setServiceName("service 1")
+            .setStatus(RpcStatusEx.Failed).setStatusMessage("failed")
+        .build();
     }
 
     public static ServicePathRpcResult buildFailedServicePathRpcResult() {
-        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx");
-        OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneOffset.UTC);
-        DateAndTime datetime = new DateAndTime(dtf.format(offsetDateTime));
-        ServicePathRpcResultBuilder builder = new ServicePathRpcResultBuilder();
-        builder.setActualDate(datetime).setNotificationType(ServicePathNotificationTypes.ServiceImplementationRequest)
+        return new ServicePathRpcResultBuilder()
+            .setActualDate(
+                new DateAndTime(
+                    DateTimeFormatter
+                        .ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx")
+                        .format(OffsetDateTime.now(ZoneOffset.UTC))))
+            .setNotificationType(ServicePathNotificationTypes.ServiceImplementationRequest)
             .setPathDescription(createPathDescription(0,1, 0, 1))
             .setServiceName("service 1")
-                .setStatus(RpcStatusEx.Failed).setStatusMessage("failed");
-        return builder.build();
+            .setStatus(RpcStatusEx.Failed)
+            .setStatusMessage("failed")
+            .build();
     }
 
     public static RendererRpcResultSp buildRendererRpcResultSp() {
-        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx");
-        OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneOffset.UTC);
-        DateAndTime datetime = new DateAndTime(dtf.format(offsetDateTime));
-        RendererRpcResultSpBuilder builder = new RendererRpcResultSpBuilder();
-        builder.setActualDate(datetime).setNotificationType(ServicePathNotificationTypes.ServiceImplementationRequest)
-                .setServiceName("service 1").setStatus(RpcStatusEx.Successful).setStatusMessage("success");
-        return builder.build();
+        return new RendererRpcResultSpBuilder()
+            .setActualDate(
+                new DateAndTime(
+                    DateTimeFormatter
+                        .ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx")
+                        .format(OffsetDateTime.now(ZoneOffset.UTC))))
+            .setNotificationType(ServicePathNotificationTypes.ServiceImplementationRequest)
+            .setServiceName("service 1")
+            .setStatus(RpcStatusEx.Successful)
+            .setStatusMessage("success")
+            .build();
     }
 
     public static RendererRpcResultSp buildRendererRpcResultSp(
             ServicePathNotificationTypes servicePathNotificationTypes,
             String serviceName, RpcStatusEx rpcStatusEx, String message) {
-        RendererRpcResultSpBuilder builder = new RendererRpcResultSpBuilder();
-        builder.setNotificationType(servicePathNotificationTypes).setServiceName(serviceName)
-                .setStatus(rpcStatusEx).setStatusMessage(message);
-        return builder.build();
+        return new RendererRpcResultSpBuilder()
+            .setNotificationType(servicePathNotificationTypes)
+            .setServiceName(serviceName)
+            .setStatus(rpcStatusEx)
+            .setStatusMessage(message)
+            .build();
     }
 
     public static ServiceRpcResultSh buildServiceRpcResultSh(
             ServiceNotificationTypes serviceNotificationTypes,
             String serviceName,
-            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.RpcStatusEx
-                rpcStatusEx,
+            org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118
+                .RpcStatusEx rpcStatusEx,
             String message) {
-        ServiceRpcResultShBuilder builder = new ServiceRpcResultShBuilder();
-        builder.setNotificationType(serviceNotificationTypes).setServiceName(serviceName)
-                .setStatus(rpcStatusEx).setStatusMessage(message);
-        return builder.build();
+        return new ServiceRpcResultShBuilder()
+            .setNotificationType(serviceNotificationTypes)
+            .setServiceName(serviceName)
+            .setStatus(rpcStatusEx)
+            .setStatusMessage(message)
+            .build();
     }
 
     public static RendererRpcResultSp buildFailedRendererRpcResultSp() {
-        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx");
-        OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneOffset.UTC);
-        DateAndTime datetime = new DateAndTime(dtf.format(offsetDateTime));
-        RendererRpcResultSpBuilder builder = new RendererRpcResultSpBuilder();
-        builder.setActualDate(datetime).setNotificationType(ServicePathNotificationTypes.ServiceImplementationRequest)
-                .setServiceName("service 1").setStatus(RpcStatusEx.Failed).setStatusMessage("failed");
-        return builder.build();
+        return new RendererRpcResultSpBuilder()
+            .setActualDate(
+                new DateAndTime(
+                    DateTimeFormatter
+                        .ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx")
+                        .format(OffsetDateTime.now(ZoneOffset.UTC))))
+            .setNotificationType(ServicePathNotificationTypes.ServiceImplementationRequest)
+            .setServiceName("service 1")
+            .setStatus(RpcStatusEx.Failed)
+            .setStatusMessage("failed")
+            .build();
     }
 
-    public static PathDescription createPathDescription(long azRate, long azWaveLength, long zaRate,
-        long zaWaveLength) {
-        AToZDirection atozDirection = new AToZDirectionBuilder()
-            .setRate(Uint32.valueOf(azRate))
-            .setAToZWavelengthNumber(Uint32.valueOf(azWaveLength))
-            .build();
-        ZToADirection ztoaDirection = new ZToADirectionBuilder()
-            .setRate(Uint32.valueOf(zaRate))
-            .setZToAWavelengthNumber(Uint32.valueOf(zaWaveLength))
-            .build();
-        PathDescription pathDescription = new PathDescriptionBuilder()
-            .setAToZDirection(atozDirection)
-            .setZToADirection(ztoaDirection)
+    public static PathDescription createPathDescription(
+            long azRate, long azWaveLength, long zaRate, long zaWaveLength) {
+        return new PathDescriptionBuilder()
+            .setAToZDirection(
+                new AToZDirectionBuilder()
+                    .setRate(Uint32.valueOf(azRate))
+                    .setAToZWavelengthNumber(Uint32.valueOf(azWaveLength))
+                    .build())
+            .setZToADirection(
+                new ZToADirectionBuilder()
+                    .setRate(Uint32.valueOf(zaRate))
+                    .setZToAWavelengthNumber(Uint32.valueOf(zaWaveLength))
+                    .build())
             .build();
-        return pathDescription;
     }
 
-    public static org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.reconfigure.input
-        .ServiceAEndBuilder getServiceAEndBuildReconfigure() {
-        return new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.reconfigure.input
-            .ServiceAEndBuilder()
-            .setClli("clli").setServiceFormat(ServiceFormat.OC).setServiceRate(Uint32.valueOf(1))
+    public static org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+            .service.reconfigure.input.ServiceAEndBuilder getServiceAEndBuildReconfigure() {
+        return new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                .service.reconfigure.input.ServiceAEndBuilder()
+            .setClli("clli")
+            .setServiceFormat(ServiceFormat.OC)
+            .setServiceRate(Uint32.valueOf(1))
             .setNodeId(new NodeIdType("XPONDER-1-2"))
             .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()),getTxDirection()))
             .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection()));
     }
 
-    public static org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.reconfigure.input
-        .ServiceZEndBuilder getServiceZEndBuildReconfigure() {
-        return new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.reconfigure.input
-            .ServiceZEndBuilder()
-            .setClli("clli").setServiceFormat(ServiceFormat.OC).setServiceRate(Uint32.valueOf(1))
+    public static org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+            .service.reconfigure.input.ServiceZEndBuilder getServiceZEndBuildReconfigure() {
+        return new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                .service.reconfigure.input.ServiceZEndBuilder()
+            .setClli("clli")
+            .setServiceFormat(ServiceFormat.OC)
+            .setServiceRate(Uint32.valueOf(1))
             .setNodeId(new NodeIdType("XPONDER-1-2"))
             .setTxDirection(Map.of(new TxDirectionKey(getTxDirection().key()),getTxDirection()))
             .setRxDirection(Map.of(new RxDirectionKey(getRxDirection().key()), getRxDirection()));
index 377d6f995ac75a0699437fdddbf10008beb7155b..74eff0190f648fcfaf00433861ddc312b4dd5d56 100644 (file)
  */
 package org.opendaylight.transportpce.servicehandler.validation;
 
-import java.util.Arrays;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
 import java.util.Map;
-import org.junit.Assert;
-import org.junit.Test;
+import java.util.Set;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.transportpce.common.OperationResult;
 import org.opendaylight.transportpce.servicehandler.ServiceInput;
 import org.opendaylight.transportpce.servicehandler.utils.ServiceDataUtils;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.RpcActions;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.CoRoutingBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.constraints.co.routing.ServiceIdentifierListBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.HardConstraintsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210.routing.constraints.SoftConstraintsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.CoRoutingBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.constraints.co.routing.ServiceIdentifierListBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.HardConstraintsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209.routing.constraints.SoftConstraintsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInputBuilder;
 
 
 public class ServiceCreateValidationTest {
 
     @Test
-    public void validateServiceCreateRequestIfCommonIdNull() {
+    void validateServiceCreateRequestIfCommonIdNull() {
         ServiceCreateInput input = new ServiceCreateInputBuilder(ServiceDataUtils.buildServiceCreateInput())
             .setCommonId(null).build();
-        OperationResult result =
-                ServiceCreateValidation.validateServiceCreateRequest(new ServiceInput(input), RpcActions.ServiceCreate);
-        Assert.assertEquals(true, result.isSuccess());
+        OperationResult result = ServiceCreateValidation
+            .validateServiceCreateRequest(new ServiceInput(input), RpcActions.ServiceCreate);
+        assertEquals(true, result.isSuccess());
     }
 
     @Test
-    public void validateServiceCreateRequestIfConstraintsNotNull() {
+    void validateServiceCreateRequestIfConstraintsNotNull() {
         ServiceCreateInput input = new ServiceCreateInputBuilder(ServiceDataUtils.buildServiceCreateInput())
             .setHardConstraints(new HardConstraintsBuilder()
                 .setCoRouting(new CoRoutingBuilder()
                     .setServiceIdentifierList(Map.of(
-                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209
                             .constraints.co.routing.ServiceIdentifierListKey("Some existing-service"),
                         new ServiceIdentifierListBuilder().setServiceIdentifier("Some existing-service")
                             .build()))
                     .build())
-                .setCustomerCode(Arrays.asList("Some customer-code"))
+                .setCustomerCode(Set.of("Some customer-code"))
                 .build())
             .setSoftConstraints(new SoftConstraintsBuilder()
                 .setCoRouting(new CoRoutingBuilder()
                     .setServiceIdentifierList(Map.of(
-                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209
                             .constraints.co.routing.ServiceIdentifierListKey("Some existing-service"),
                         new ServiceIdentifierListBuilder().setServiceIdentifier("Some existing-service")
                             .build()))
                     .build())
-                .setCustomerCode(Arrays.asList("Some customer-code"))
+                .setCustomerCode(Set.of("Some customer-code"))
                 .build()).build();
-        OperationResult result =
-                ServiceCreateValidation.validateServiceCreateRequest(new ServiceInput(input), RpcActions.ServiceCreate);
-        Assert.assertEquals(false, result.isSuccess());
+        OperationResult result = ServiceCreateValidation
+            .validateServiceCreateRequest(new ServiceInput(input), RpcActions.ServiceCreate);
+        assertEquals(false, result.isSuccess());
     }
 
     @Test
-    public void validateServiceCreateRequestIfConstraintsNull() {
+    void validateServiceCreateRequestIfConstraintsNull() {
         ServiceCreateInput input = new ServiceCreateInputBuilder(ServiceDataUtils.buildServiceCreateInput())
             .setSoftConstraints(null).setHardConstraints(null).build();
-        OperationResult result =
-                ServiceCreateValidation.validateServiceCreateRequest(new ServiceInput(input), RpcActions.ServiceCreate);
-        Assert.assertEquals(true, result.isSuccess());
+        OperationResult result = ServiceCreateValidation
+            .validateServiceCreateRequest(new ServiceInput(input), RpcActions.ServiceCreate);
+        assertEquals(true, result.isSuccess());
     }
 
     @Test
-    public void validateServiceCreateRequestIfHardConstraintsNull() {
+    void validateServiceCreateRequestIfHardConstraintsNull() {
         ServiceCreateInput input = new ServiceCreateInputBuilder(ServiceDataUtils.buildServiceCreateInput())
             .setSoftConstraints(new SoftConstraintsBuilder()
                 .setCoRouting(new CoRoutingBuilder()
                     .setServiceIdentifierList(Map.of(
-                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209
                             .constraints.co.routing.ServiceIdentifierListKey("Some existing-service"),
                         new ServiceIdentifierListBuilder().setServiceIdentifier("Some existing-service")
                             .build()))
                     .build())
-                .setCustomerCode(Arrays.asList("Some customer-code"))
+                .setCustomerCode(Set.of("Some customer-code"))
                 .build()).setHardConstraints(null).build();
-        OperationResult result =
-                ServiceCreateValidation.validateServiceCreateRequest(new ServiceInput(input), RpcActions.ServiceCreate);
-        Assert.assertEquals(true, result.isSuccess());
+        OperationResult result = ServiceCreateValidation
+            .validateServiceCreateRequest(new ServiceInput(input), RpcActions.ServiceCreate);
+        assertEquals(true, result.isSuccess());
     }
 
     @Test
-    public void validateServiceCreateRequestIfSoftConstraintsNull() {
+    void validateServiceCreateRequestIfSoftConstraintsNull() {
         ServiceCreateInput input = new ServiceCreateInputBuilder(ServiceDataUtils.buildServiceCreateInput())
             .setSoftConstraints(null).setHardConstraints(new HardConstraintsBuilder()
                 .setCoRouting(new CoRoutingBuilder()
                     .setServiceIdentifierList(Map.of(
-                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev211210
+                        new org.opendaylight.yang.gen.v1.http.org.openroadm.routing.constraints.rev221209
                             .constraints.co.routing.ServiceIdentifierListKey("Some existing-service"),
                         new ServiceIdentifierListBuilder().setServiceIdentifier("Some existing-service")
                             .build()))
                     .build())
-                .setCustomerCode(Arrays.asList("Some customer-code"))
+                .setCustomerCode(Set.of("Some customer-code"))
                 .build()).build();
-        OperationResult result =
-                ServiceCreateValidation.validateServiceCreateRequest(new ServiceInput(input), RpcActions.ServiceCreate);
-        Assert.assertEquals(true, result.isSuccess());
+        OperationResult result = ServiceCreateValidation
+            .validateServiceCreateRequest(new ServiceInput(input), RpcActions.ServiceCreate);
+        assertEquals(true, result.isSuccess());
     }
-}
+}
\ No newline at end of file
diff --git a/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/validation/checks/CheckCoherencyServiceResiliencyTest.java b/servicehandler/src/test/java/org/opendaylight/transportpce/servicehandler/validation/checks/CheckCoherencyServiceResiliencyTest.java
new file mode 100644 (file)
index 0000000..c5ea98a
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ * Copyright © 2022 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+
+package org.opendaylight.transportpce.servicehandler.validation.checks;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.Protected;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.Restorable;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.Unprotected;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.UnprotectedDiverselyRouted;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.resiliency.ServiceResiliencyBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.resiliency.service.resiliency.CoupledServiceBuilder;
+import org.opendaylight.yangtools.yang.common.Uint64;
+import org.opendaylight.yangtools.yang.common.Uint8;
+
+@ExtendWith(MockitoExtension.class)
+public class CheckCoherencyServiceResiliencyTest {
+
+    @Test
+    void testCheckWhenResiliencyNull() {
+        ComplianceCheckResult result = ServicehandlerServiceResiliencyCheck
+            .check(new ServiceResiliencyBuilder().setRevertive(true).build());
+
+        assertFalse(result.hasPassed());
+        assertEquals(ServicehandlerServiceResiliencyCheck.LOG_RESILIENCY_NULL, result.getMessage());
+    }
+
+    @Test
+    void testCheckWhenUnprotectedResiliencyWithWrongAttributes() {
+        ServiceResiliencyBuilder input = new ServiceResiliencyBuilder().setResiliency(Unprotected.VALUE);
+
+        assertFalse(ServicehandlerServiceResiliencyCheck.check(input.setRevertive(true).build()).hasPassed());
+        assertFalse(ServicehandlerServiceResiliencyCheck
+            .check(input.setWaitToRestore(Uint64.valueOf(1)).build())
+            .hasPassed());
+        assertFalse(ServicehandlerServiceResiliencyCheck
+            .check(input.setHoldoffTime(Uint64.valueOf(1)).build())
+            .hasPassed());
+        assertFalse(ServicehandlerServiceResiliencyCheck
+            .check(input.setPreCalculatedBackupPathNumber(Uint8.valueOf(1)).build())
+            .hasPassed());
+        assertFalse(ServicehandlerServiceResiliencyCheck
+            .check(input.setCoupledService(new CoupledServiceBuilder().build()).build())
+            .hasPassed());
+    }
+
+    @Test
+    void testCheckWhenUnprotectedResiliencyWithCorrectAttributes() {
+        assertTrue(ServicehandlerServiceResiliencyCheck
+            .check(new ServiceResiliencyBuilder().setResiliency(Unprotected.VALUE).build())
+            .hasPassed());
+    }
+
+    @Test
+    void testCheckWhenUnprotectedDiverselyRoutedResiliencyWithWrongAttributes() {
+        ServiceResiliencyBuilder input = new ServiceResiliencyBuilder().setResiliency(UnprotectedDiverselyRouted.VALUE);
+
+        assertFalse(ServicehandlerServiceResiliencyCheck.check(input.setRevertive(true).build()).hasPassed());
+        assertFalse(ServicehandlerServiceResiliencyCheck
+            .check(input.setWaitToRestore(Uint64.valueOf(1)).build())
+            .hasPassed());
+        assertFalse(ServicehandlerServiceResiliencyCheck
+            .check(input.setHoldoffTime(Uint64.valueOf(1)).build())
+            .hasPassed());
+        assertFalse(ServicehandlerServiceResiliencyCheck
+            .check(input.setPreCalculatedBackupPathNumber(Uint8.valueOf(1)).build())
+            .hasPassed());
+    }
+
+    @Test
+    void testCheckWhenUnprotectedDiverselyRoutedResiliencyWithCorrectAttributes() {
+        assertTrue(ServicehandlerServiceResiliencyCheck
+            .check(new ServiceResiliencyBuilder()
+                .setResiliency(UnprotectedDiverselyRouted.VALUE)
+                .setCoupledService(new CoupledServiceBuilder().build())
+                .build())
+            .hasPassed());
+    }
+
+    @Test
+    void testCheckWhenProtectedResiliencyWithWrongAttributes() {
+        ServiceResiliencyBuilder input = new ServiceResiliencyBuilder().setResiliency(Protected.VALUE);
+
+        assertFalse(ServicehandlerServiceResiliencyCheck
+            .check(input.setWaitToRestore(Uint64.valueOf(1)).setRevertive(false).build())
+            .hasPassed());
+        assertFalse(ServicehandlerServiceResiliencyCheck
+            .check(input.setPreCalculatedBackupPathNumber(Uint8.valueOf(1)).build())
+            .hasPassed());
+        assertFalse(ServicehandlerServiceResiliencyCheck
+            .check(input.setCoupledService(new CoupledServiceBuilder().build()).build())
+            .hasPassed());
+    }
+
+    @Test
+    void testCheckWhenProtectedResiliencyWithCorrectAttributes() {
+        assertTrue(ServicehandlerServiceResiliencyCheck
+            .check(new ServiceResiliencyBuilder()
+                .setResiliency(Protected.VALUE)
+                .setRevertive(true)
+                .setWaitToRestore(Uint64.valueOf(1))
+                .setHoldoffTime(Uint64.valueOf(1))
+                .build())
+            .hasPassed());
+    }
+
+    @Test
+    void testCheckWhenRestorableOrExternalTriggerRestorableResiliencyWithWrongAttributes() {
+        ServiceResiliencyBuilder input = new ServiceResiliencyBuilder().setResiliency(Restorable.VALUE);
+
+        assertFalse(ServicehandlerServiceResiliencyCheck
+            .check(input.setWaitToRestore(Uint64.valueOf(1)).setRevertive(false).build())
+            .hasPassed());
+        assertFalse(ServicehandlerServiceResiliencyCheck
+            .check(input.setCoupledService(new CoupledServiceBuilder().build()).build())
+            .hasPassed());
+    }
+
+    @Test
+    void testCheckWhenRestorableOrExternalTriggerRestorableResiliencyWithCorrectAttributes() {
+        assertTrue(ServicehandlerServiceResiliencyCheck
+            .check(new ServiceResiliencyBuilder()
+                .setResiliency(Restorable.VALUE)
+                .setRevertive(true)
+                .setWaitToRestore(Uint64.valueOf(1))
+                .setHoldoffTime(Uint64.valueOf(1))
+                .setPreCalculatedBackupPathNumber(Uint8.valueOf(1))
+                .build())
+            .hasPassed());
+    }
+}
index 0c6e44d5782a6c1d6488d7466509bb51b3d7f64b..dbabd5af7486ff5afe4e31027052386f78503a44 100644 (file)
@@ -7,17 +7,18 @@
  */
 package org.opendaylight.transportpce.servicehandler.validation.checks;
 
-import org.junit.Assert;
-import org.junit.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+import org.junit.jupiter.api.Test;
 
 public class ComplianceCheckResultTest {
 
     @Test
-    public void constructComplianceCheckResult() {
+    void constructComplianceCheckResult() {
         ComplianceCheckResult checkResult = new ComplianceCheckResult(true);
-        Assert.assertEquals(true, checkResult.hasPassed());
+        assertEquals(true, checkResult.hasPassed());
 
         checkResult = new ComplianceCheckResult(false);
-        Assert.assertEquals(false, checkResult.hasPassed());
+        assertEquals(false, checkResult.hasPassed());
     }
-}
+}
\ No newline at end of file
index cab20097be47138154a76f2b40042a29bd6dfecf..9d756697caf612261631098d62fcf6d8759f9083 100644 (file)
@@ -7,87 +7,84 @@
  */
 package org.opendaylight.transportpce.servicehandler.validation.checks;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.opendaylight.transportpce.servicehandler.validation.checks.ServicehandlerComplianceCheck.LogMessages;
 
-import org.junit.Assert;
-import org.junit.Test;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ConnectionType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.RpcActions;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.sdnc.request.header.SdncRequestHeaderBuilder;
+import org.junit.jupiter.api.Test;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ConnectionType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.sdnc.request.header.SdncRequestHeaderBuilder;
 
 public class ServicehandlerComplianceCheckTest {
 
-    public ServicehandlerComplianceCheckTest() {
-    }
-
     @Test
-    public void checkFalseSdncRequest() {
+    void checkFalseSdncRequest() {
         ComplianceCheckResult result = ServicehandlerComplianceCheck.check("service 1",
-            new SdncRequestHeaderBuilder().setRequestId("1").setRequestSystemId("1").setNotificationUrl("1")
-            .setRpcAction(RpcActions.ServiceCreate).build(),
-            ConnectionType.Service,RpcActions.ServiceCreate, false, false);
+                new SdncRequestHeaderBuilder().setRequestId("1").setRequestSystemId("1").setNotificationUrl("1")
+                    .setRpcAction(RpcActions.ServiceCreate).build(),
+                ConnectionType.Service,RpcActions.ServiceCreate, false, false);
 
-        Assert.assertEquals("", result.getMessage());
-        Assert.assertTrue(result.hasPassed());
+        assertEquals("", result.getMessage());
+        assertTrue(result.hasPassed());
     }
 
     @Test
-    public void checkServiceNameNull() {
-        ComplianceCheckResult result = ServicehandlerComplianceCheck.check(null, null,
-                ConnectionType.Service, null, false, false);
+    void checkServiceNameNull() {
+        ComplianceCheckResult result = ServicehandlerComplianceCheck
+            .check(null, null, ConnectionType.Service, null, false, false);
 
-        Assert.assertEquals(LogMessages.SERVICENAME_NOT_SET, result.getMessage());
-        Assert.assertFalse(result.hasPassed());
+        assertEquals(LogMessages.SERVICENAME_NOT_SET, result.getMessage());
+        assertFalse(result.hasPassed());
     }
 
     @Test
-    public void checkConTypeFalseAndNull() {
-        ComplianceCheckResult result = ServicehandlerComplianceCheck.check("service 1", null,
-                null, null, true, false);
-        Assert.assertEquals(LogMessages.CONNECTIONTYPE_NOT_SET, result.getMessage());
-        Assert.assertFalse(result.hasPassed());
+    void checkConTypeFalseAndNull() {
+        ComplianceCheckResult result = ServicehandlerComplianceCheck
+            .check("service 1", null, null, null, true, false);
+        assertEquals(LogMessages.CONNECTIONTYPE_NOT_SET, result.getMessage());
+        assertFalse(result.hasPassed());
     }
 
     @Test
-    public void checkSdncRequestHeaderNull() {
-        ComplianceCheckResult result = ServicehandlerComplianceCheck.check("service 1", null,
-                ConnectionType.Service, null, true, true);
+    void checkSdncRequestHeaderNull() {
+        ComplianceCheckResult result = ServicehandlerComplianceCheck
+            .check("service 1", null, ConnectionType.Service, null, true, true);
 
-        Assert.assertEquals(LogMessages.HEADER_NOT_SET, result.getMessage());
-        Assert.assertFalse(result.hasPassed());
+        assertEquals(LogMessages.HEADER_NOT_SET, result.getMessage());
+        assertFalse(result.hasPassed());
     }
 
     @Test
-    public void checkRequestIdEmptyString() {
+    void checkRequestIdEmptyString() {
         ComplianceCheckResult result = ServicehandlerComplianceCheck.check("service 1",
-                new SdncRequestHeaderBuilder().setRequestId("")
-                        .setRpcAction(RpcActions.ServiceCreate).build(),
+                new SdncRequestHeaderBuilder().setRequestId("").setRpcAction(RpcActions.ServiceCreate).build(),
                 ConnectionType.Service, RpcActions.ServiceCreate, true, true);
 
-        Assert.assertEquals(LogMessages.REQUESTID_NOT_SET, result.getMessage());
-        Assert.assertFalse(result.hasPassed());
+        assertEquals(LogMessages.REQUESTID_NOT_SET, result.getMessage());
+        assertFalse(result.hasPassed());
     }
 
     @Test
-    public void checkDifferentAction() {
+    void checkDifferentAction() {
         ComplianceCheckResult result = ServicehandlerComplianceCheck.check("service 1",
-                new SdncRequestHeaderBuilder().setRequestId("1")
-                        .setRpcAction(RpcActions.ServiceCreate).build(),
+                new SdncRequestHeaderBuilder().setRequestId("1").setRpcAction(RpcActions.ServiceCreate).build(),
                 ConnectionType.Service, RpcActions.NetworkReOptimization, true, true);
 
-        Assert.assertEquals(
-                LogMessages.rpcactionsDiffers(RpcActions.ServiceCreate, RpcActions.NetworkReOptimization),
-                result.getMessage());
-        Assert.assertFalse(result.hasPassed());
+        assertEquals(
+            LogMessages.rpcactionsDiffers(RpcActions.ServiceCreate, RpcActions.NetworkReOptimization),
+            result.getMessage());
+        assertFalse(result.hasPassed());
     }
 
     @Test
-    public void checkServiceActionNull() {
+    void checkServiceActionNull() {
         ComplianceCheckResult result = ServicehandlerComplianceCheck.check("service 1",
                 new SdncRequestHeaderBuilder().setRequestId("1").build(),
                 ConnectionType.Service, RpcActions.NetworkReOptimization, true, true);
 
-        Assert.assertEquals(LogMessages.RPCACTION_NOT_SET, result.getMessage());
-        Assert.assertFalse(result.hasPassed());
+        assertEquals(LogMessages.RPCACTION_NOT_SET, result.getMessage());
+        assertFalse(result.hasPassed());
     }
 }
index 832328aa3132effc7e41580b4c3d185b7864b24d..cd68db52e87e04efa27ab0b04bace43a3feabf28 100644 (file)
@@ -8,59 +8,60 @@
 
 package org.opendaylight.transportpce.servicehandler.validation.checks;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.opendaylight.transportpce.servicehandler.validation.checks.ServicehandlerTxRxCheck.LogMessages;
 
-import org.junit.Assert;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.transportpce.servicehandler.ServiceEndpointType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.ServiceAEndBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
 import org.opendaylight.yangtools.yang.common.Uint32;
 
 public class ServicehandlerTxRxCheckTest {
 
     @Test
-    public void checkForServiceEndNull() {
+    void checkForServiceEndNull() {
         ComplianceCheckResult result = ServicehandlerTxRxCheck.check(null, ServiceEndpointType.SERVICEAEND);
 
-        Assert.assertFalse(result.hasPassed());
-        Assert.assertEquals(LogMessages.endpointTypeNotSet(ServiceEndpointType.SERVICEAEND), result.getMessage());
+        assertFalse(result.hasPassed());
+        assertEquals(LogMessages.endpointTypeNotSet(ServiceEndpointType.SERVICEAEND), result.getMessage());
     }
 
     @Test
-    public void checkForServiceRateNull() {
-        ComplianceCheckResult result =
-            ServicehandlerTxRxCheck.check(new ServiceAEndBuilder().build(), ServiceEndpointType.SERVICEAEND);
+    void checkForServiceRateNull() {
+        ComplianceCheckResult result = ServicehandlerTxRxCheck
+            .check(new ServiceAEndBuilder().build(), ServiceEndpointType.SERVICEAEND);
 
-        Assert.assertFalse(result.hasPassed());
-        Assert.assertEquals(LogMessages.rateNull(ServiceEndpointType.SERVICEAEND), result.getMessage());
+        assertFalse(result.hasPassed());
+        assertEquals(LogMessages.rateNull(ServiceEndpointType.SERVICEAEND), result.getMessage());
     }
 
     @Test
-    public void checkForServiceRateEquals0() {
-        ComplianceCheckResult result = ServicehandlerTxRxCheck.check(
-            new ServiceAEndBuilder().setServiceRate(Uint32.valueOf(0)).build(), ServiceEndpointType.SERVICEAEND);
+    void checkForServiceRateEquals0() {
+        ComplianceCheckResult result = ServicehandlerTxRxCheck
+            .check(new ServiceAEndBuilder().setServiceRate(Uint32.valueOf(0)).build(), ServiceEndpointType.SERVICEAEND);
 
-        Assert.assertFalse(result.hasPassed());
-        Assert.assertEquals(LogMessages.rateNotSet(ServiceEndpointType.SERVICEAEND), result.getMessage());
+        assertFalse(result.hasPassed());
+        assertEquals(LogMessages.rateNotSet(ServiceEndpointType.SERVICEAEND), result.getMessage());
     }
 
     @Test
-    public void checkForServiceFormatNull() {
-        ComplianceCheckResult result = ServicehandlerTxRxCheck.check(
-            new ServiceAEndBuilder().setServiceRate(Uint32.valueOf(3)).build(), ServiceEndpointType.SERVICEAEND);
+    void checkForServiceFormatNull() {
+        ComplianceCheckResult result = ServicehandlerTxRxCheck
+            .check(new ServiceAEndBuilder().setServiceRate(Uint32.valueOf(3)).build(), ServiceEndpointType.SERVICEAEND);
 
-        Assert.assertFalse(result.hasPassed());
-        Assert.assertEquals(LogMessages.formatNotSet(ServiceEndpointType.SERVICEAEND), result.getMessage());
+        assertFalse(result.hasPassed());
+        assertEquals(LogMessages.formatNotSet(ServiceEndpointType.SERVICEAEND), result.getMessage());
     }
 
     @Test
-    public void checkForClliEmpty() {
+    void checkForClliEmpty() {
         ComplianceCheckResult result = ServicehandlerTxRxCheck.check(new ServiceAEndBuilder()
-            .setServiceRate(Uint32.valueOf(3)).setClli("").setServiceFormat(ServiceFormat.Ethernet).build(),
+                .setServiceRate(Uint32.valueOf(3)).setClli("").setServiceFormat(ServiceFormat.Ethernet).build(),
             ServiceEndpointType.SERVICEAEND);
 
-        Assert.assertFalse(result.hasPassed());
-        Assert.assertEquals(LogMessages.clliNotSet(ServiceEndpointType.SERVICEAEND), result.getMessage());
+        assertFalse(result.hasPassed());
+        assertEquals(LogMessages.clliNotSet(ServiceEndpointType.SERVICEAEND), result.getMessage());
     }
-}
+}
\ No newline at end of file
index 4d4588f914c7808c3461d6de9de96786b793a058..28f127ac0bf6d82c7844350eeba13966b00e0442 100644 (file)
@@ -15,21 +15,32 @@ Author: Martial Coulibaly <martial.coulibaly@gfi.com> on behalf of Orange
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>8.0.11</version>
+    <version>13.0.1</version>
     <relativePath/>
   </parent>
 
   <groupId>org.opendaylight.transportpce</groupId>
   <artifactId>transportpce-tapi</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
+  <version>10.0.0-SNAPSHOT</version>
   <packaging>bundle</packaging>
 
+  <properties>
+    <transportpce.models.version>20.0.0-SNAPSHOT</transportpce.models.version>
+  </properties>
+
   <dependencyManagement>
     <dependencies>
+      <dependency>
+        <groupId>org.opendaylight.transportpce.models</groupId>
+        <artifactId>transportpce-models-artifacts</artifactId>
+        <version>${transportpce.models.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
       <dependency>
         <groupId>org.opendaylight.netconf</groupId>
         <artifactId>netconf-artifacts</artifactId>
-        <version>2.0.14</version>
+        <version>7.0.4</version>
         <scope>import</scope>
         <type>pom</type>
       </dependency>
@@ -38,29 +49,40 @@ Author: Martial Coulibaly <martial.coulibaly@gfi.com> on behalf of Orange
 
   <dependencies>
     <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>transportpce-tapimodels</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-2.2.1</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-common</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-7.1.0</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-device</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-13.1.0</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-network</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-device-1.2.1</artifactId>
     </dependency>
     <dependency>
-      <groupId>${project.groupId}.ordmodels</groupId>
-      <artifactId>transportpce-ordmodels-service</artifactId>
-      <version>${project.version}</version>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-device-2.2.1</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-device-7.1.0</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-network-13.1.0</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-service-13.1.0</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>tapi-2.4.0</artifactId>
     </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
@@ -128,21 +150,26 @@ Author: Martial Coulibaly <martial.coulibaly@gfi.com> on behalf of Orange
       <groupId>org.opendaylight.mdsal</groupId>
       <artifactId>mdsal-binding-api</artifactId>
     </dependency>
+    <dependency>
+      <groupId>com.github.spotbugs</groupId>
+      <artifactId>spotbugs-annotations</artifactId>
+      <optional>true</optional>
+    </dependency>
     <dependency>
       <groupId>com.google.guava</groupId>
       <artifactId>guava</artifactId>
     </dependency>
     <dependency>
       <groupId>org.opendaylight.netconf</groupId>
-      <artifactId>sal-netconf-connector</artifactId>
+      <artifactId>netconf-topology</artifactId>
     </dependency>
-
-    <!-- Sodium bump: javax.annotation.Nullable and friends -->
     <dependency>
-      <groupId>com.google.code.findbugs</groupId>
-      <artifactId>jsr305</artifactId>
-      <version>3.0.2</version>
-      <optional>true</optional>
+      <groupId>org.opendaylight.netconf</groupId>
+      <artifactId>netconf-client-mdsal</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.osgi</groupId>
+      <artifactId>org.osgi.service.component.annotations</artifactId>
     </dependency>
 
     <!-- Testing Dependencies -->
index d2d36f129b3a4239d59609d5118b85198413f22a..886aac77888ab8e992268ec43ff2970d0773869e 100644 (file)
@@ -9,35 +9,35 @@ package org.opendaylight.transportpce.tapi;
 
 import java.util.Collection;
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
-import org.eclipse.jdt.annotation.Nullable;
 import org.opendaylight.mdsal.binding.api.MountPoint;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.Timeouts;
 import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.tapi.utils.TapiLink;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.cp.to.degree.CpToDegree;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev170929.Direction;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.Network;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.cp.to.degree.CpToDegree;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.OrgOpenroadmDeviceData;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.OrgOpenroadmDevice;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.org.openroadm.device.container.org.openroadm.device.Protocols;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev161014.Protocols1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev161014.lldp.container.lldp.NbrList;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev161014.lldp.container.lldp.nbr.list.IfName;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.common.types.rev220926.Direction;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.LinkKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -51,7 +51,7 @@ public class R2RTapiLinkDiscovery {
     private final TapiLink tapiLink;
 
     public R2RTapiLinkDiscovery(NetworkTransactionService networkTransactionService,
-                                DeviceTransactionManager deviceTransactionManager, TapiLink tapiLink) {
+            DeviceTransactionManager deviceTransactionManager, TapiLink tapiLink) {
         this.networkTransactionService = networkTransactionService;
         this.deviceTransactionManager = deviceTransactionManager;
         this.tapiLink = tapiLink;
@@ -64,41 +64,44 @@ public class R2RTapiLinkDiscovery {
         switch (nodeVersion) {
             case 1:
                 // 1.2.1
-                InstanceIdentifier<Protocols> protocols121IID = InstanceIdentifier.create(OrgOpenroadmDevice.class)
-                    .child(Protocols.class);
+                InstanceIdentifier<Protocols> protocols121IID = InstanceIdentifier
+                    .builderOfInherited(OrgOpenroadmDeviceData.class, OrgOpenroadmDevice.class)
+                    .child(Protocols.class)
+                    .build();
                 Optional<Protocols> protocol121Object = this.deviceTransactionManager.getDataFromDevice(
                     nodeId.getValue(), LogicalDatastoreType.OPERATIONAL, protocols121IID, Timeouts.DEVICE_READ_TIMEOUT,
                     Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-                if (!protocol121Object.isPresent()
-                        || (protocol121Object.get().augmentation(Protocols1.class) == null)) {
-                    LOG.warn("LLDP subtree is missing : isolated openroadm device");
+                if (hasNoNeighbor121(protocol121Object)) {
+                    LOG.warn("LLDP subtree is missing or incomplete: isolated openroadm device");
                     return new HashMap<>();
                 }
                 // get neighbor list
-                NbrList nbr121List = protocol121Object.get().augmentation(Protocols1.class).getLldp().getNbrList();
+                NbrList nbr121List = protocol121Object.orElseThrow().augmentation(Protocols1.class).getLldp()
+                    .getNbrList();
                 LOG.info("LLDP subtree is present. Device has {} neighbours", nbr121List.getIfName().size());
                 // try to create rdm2rdm link
                 return rdm2rdmLinkCreatev121(nodeId, tapiTopoUuid, nbr121List);
             case 2:
                 // 2.2.1
                 InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device
-                    .container.org.openroadm.device.Protocols> protocols221IID =
-                        InstanceIdentifier.create(org.opendaylight.yang.gen.v1.http
-                            .org.openroadm.device.rev181019.org.openroadm.device.container.OrgOpenroadmDevice.class)
-                            .child(org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019
-                                .org.openroadm.device.container.org.openroadm.device.Protocols.class);
-                Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device
-                    .container.org.openroadm.device.Protocols> protocol221Object = this.deviceTransactionManager
+                        .container.org.openroadm.device.Protocols> protocols221IID = InstanceIdentifier
+                    .builderOfInherited(
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.OrgOpenroadmDeviceData.class,
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container
+                            .OrgOpenroadmDevice.class)
+                    .child(org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device
+                        .container.org.openroadm.device.Protocols.class)
+                    .build();
+                var protocol221Object = this.deviceTransactionManager
                     .getDataFromDevice(nodeId.getValue(), LogicalDatastoreType.OPERATIONAL, protocols221IID,
                         Timeouts.DEVICE_READ_TIMEOUT, Timeouts.DEVICE_READ_TIMEOUT_UNIT);
-                if (!protocol221Object.isPresent() || (protocol221Object.get().augmentation(
-                        org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev181019.Protocols1.class) == null)) {
-                    LOG.warn("LLDP subtree is missing : isolated openroadm device");
+                if (hasNoNeighbor221(protocol221Object)) {
+                    LOG.warn("LLDP subtree is missing or incomplete: isolated openroadm device");
                     return new HashMap<>();
                 }
-                org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev181019.lldp.container.lldp.@Nullable NbrList
-                    nbr221List = protocol221Object.get().augmentation(org.opendaylight.yang.gen.v1.http
-                        .org.openroadm.lldp.rev181019.Protocols1.class).getLldp().getNbrList();
+                var nbr221List = protocol221Object.orElseThrow().augmentation(
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev181019.Protocols1.class)
+                    .getLldp().getNbrList();
                 LOG.info("LLDP subtree is present. Device has {} neighbours", nbr221List.getIfName().size());
                 return rdm2rdmLinkCreatev221(nodeId, tapiTopoUuid, nbr221List);
             case 3:
@@ -111,6 +114,27 @@ public class R2RTapiLinkDiscovery {
         }
     }
 
+    private boolean hasNoNeighbor121(Optional<Protocols> protocol121Object) {
+        return protocol121Object.isEmpty()
+                || protocol121Object.orElseThrow().augmentation(Protocols1.class) == null
+                || protocol121Object.orElseThrow().augmentation(Protocols1.class).getLldp() == null
+                || protocol121Object.orElseThrow().augmentation(Protocols1.class).getLldp().getNbrList() == null;
+    }
+
+    private boolean hasNoNeighbor221(Optional<
+            org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev181019.org.openroadm.device.container.org
+                    .openroadm.device.Protocols> protocol221Object) {
+        return protocol221Object.isEmpty()
+                || protocol221Object.orElseThrow().augmentation(
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev181019.Protocols1.class) == null
+                || protocol221Object.orElseThrow().augmentation(
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev181019.Protocols1.class)
+                    .getLldp() == null
+                || protocol221Object.orElseThrow().augmentation(
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev181019.Protocols1.class)
+                    .getLldp().getNbrList() == null;
+    }
+
     private Map<LinkKey, Link> rdm2rdmLinkCreatev221(NodeId nodeId, Uuid tapiTopoUuid,
             org.opendaylight.yang.gen.v1.http.org.openroadm.lldp.rev181019.lldp.container.lldp.NbrList nbrList) {
         Map<LinkKey, Link> linkMap = new HashMap<>();
@@ -225,11 +249,14 @@ public class R2RTapiLinkDiscovery {
             + "DestDegId: {}, DestTPId: {}", nodeId.getValue(), srcDegId, srcTpTx, destNodeId, destDegId, destTpRx);
         Link omsLink = this.tapiLink.createTapiLink(nodeId.getValue(), srcTpTx, destNodeId.getValue(), destTpTx,
             TapiStringConstants.OMS_RDM_RDM_LINK, TapiStringConstants.PHTNC_MEDIA, TapiStringConstants.PHTNC_MEDIA,
-            TapiStringConstants.PHTNC_MEDIA, TapiStringConstants.PHTNC_MEDIA,
+            TapiStringConstants.PHTNC_MEDIA_OTS, TapiStringConstants.PHTNC_MEDIA_OTS,
             this.tapiLink.getAdminState(nodeId.getValue(), destNodeId.getValue(), srcTpTx, destTpTx),
             this.tapiLink.getOperState(nodeId.getValue(), destNodeId.getValue(), srcTpTx, destTpTx),
-            List.of(LayerProtocolName.PHOTONICMEDIA), List.of(LayerProtocolName.PHOTONICMEDIA.getName()), tapiTopoUuid);
+            Set.of(LayerProtocolName.PHOTONICMEDIA), Set.of(LayerProtocolName.PHOTONICMEDIA.getName()), tapiTopoUuid);
         LOG.info("Tapi R2R Link OMS link created = {}", omsLink);
+        LOG.debug("inputAdminstate= {}, inputoperstate = {}",
+            this.tapiLink.getAdminState(nodeId.getValue(), destNodeId.getValue(), srcTpTx, destTpTx),
+            this.tapiLink.getOperState(nodeId.getValue(), destNodeId.getValue(), srcTpTx, destTpTx));
         return omsLink;
     }
 
@@ -240,22 +267,22 @@ public class R2RTapiLinkDiscovery {
 
             Optional<Nodes> nodesObject = this.networkTransactionService.read(LogicalDatastoreType.CONFIGURATION,
                 nodesIID).get();
-            if (nodesObject.isEmpty() || (nodesObject.get().getCpToDegree() == null)) {
+            if (nodesObject.isEmpty() || (nodesObject.orElseThrow().getCpToDegree() == null)) {
                 LOG.warn("Could not find mapping for Interface {} for nodeId {}", interfaceName,
                     nodeId.getValue());
                 return null;
             }
-            Collection<CpToDegree> cpToDeg = nodesObject.get().nonnullCpToDegree().values();
+            Collection<CpToDegree> cpToDeg = nodesObject.orElseThrow().nonnullCpToDegree().values();
             Stream<CpToDegree> cpToDegStream = cpToDeg.stream().filter(cp -> cp.getInterfaceName() != null)
                 .filter(cp -> cp.getInterfaceName().equals(interfaceName));
             if (cpToDegStream != null) {
-                @SuppressWarnings("unchecked") Optional<CpToDegree> firstCpToDegree = cpToDegStream.findFirst();
+                Optional<CpToDegree> firstCpToDegree = cpToDegStream.findFirst();
                 if (firstCpToDegree.isEmpty() || (firstCpToDegree == null)) {
                     LOG.debug("Not found so returning nothing");
                     return null;
                 }
-                LOG.debug("Found and returning {}",firstCpToDegree.get().getDegreeNumber().intValue());
-                return firstCpToDegree.get().getDegreeNumber().intValue();
+                LOG.debug("Found and returning {}",firstCpToDegree.orElseThrow().getDegreeNumber().intValue());
+                return firstCpToDegree.orElseThrow().getDegreeNumber().intValue();
             } else {
                 LOG.warn("CircuitPack stream couldnt find anything for nodeId: {} and interfaceName: {}",
                     nodeId.getValue(),interfaceName);
@@ -272,8 +299,8 @@ public class R2RTapiLinkDiscovery {
         try {
             Optional<Nodes> nodesObject = this.networkTransactionService.read(LogicalDatastoreType.CONFIGURATION,
                 nodesIID).get();
-            if (nodesObject.isPresent() && (nodesObject.get().getMapping() != null)) {
-                Collection<Mapping> mappingList = nodesObject.get().nonnullMapping().values();
+            if (nodesObject.isPresent() && (nodesObject.orElseThrow().getMapping() != null)) {
+                Collection<Mapping> mappingList = nodesObject.orElseThrow().nonnullMapping().values();
                 mappingList = mappingList.stream().filter(mp -> mp.getLogicalConnectionPoint().contains("DEG"
                     + degreeCounter)).collect(Collectors.toList());
                 if (mappingList.size() == 1) {
index 4db66c3d379ce494e21bb9efbc0124ed9a29a228..0efaaccaea27cb6cd8cca1c6496b4afbcd612241 100644 (file)
@@ -13,8 +13,19 @@ public final class TapiStringConstants {
     public static final String OMS_RDM_RDM_LINK = "tapi-rdm-rdm-link";
     public static final String OMS_XPDR_RDM_LINK = "tapi-xpdr-rdm-link";
     public static final String OTN_XPDR_XPDR_LINK = "tapi-otn-xpdr-xpdr-link";
+    public static final String VALUE_NAME_OTN_XPDR_XPDR_LINK = "otn link name";
+    public static final String VALUE_NAME_OTS_XPDR_RDM_LINK = "Xpdr to roadm link";
+    public static final String VALUE_NAME_OMS_RDM_RDM_LINK = "OMS link name";
+    public static final String VALUE_NAME_ROADM_NODE = "roadm node name";
+    public static final String VALUE_NAME_XPDR_NODE = "dsr/odu node name";
     public static final String T0_MULTILAYER = "T0 - Multi-layer topology";
+    public static final String T0_TAPI_MULTILAYER = "T0 - Tapi-Multi-layer Abstracted topology";
     public static final String T0_FULL_MULTILAYER = "T0 - Full Multi-layer topology";
+    // TODO: these hardcoded UUID are here for debugging purpose.
+    // They allow to have a reference somewhere of the UUID to be used when testing.
+    public static final String T0_MULTILAYER_UUID = "747c670e-7a07-3dab-b379-5b1cd17402a3";
+    public static final String T0_TAPI_MULTILAYER_UUID = "a6c5aed1-dc75-333a-b3a3-b6b70534eae8";
+    public static final String T0_FULL_MULTILAYER_UUID = "393f09a4-0a0b-3d82-a4f6-1fbbc14ca1a8";
     public static final String TPDR_100G = "Transponder 100GE";
     public static final String DSR = "DSR";
     public static final String ODU = "ODU";
@@ -24,18 +35,29 @@ public final class TapiStringConstants {
     public static final String E_OTSI = "eOTSi";
     public static final String I_OTSI = "iOTSi";
     public static final String PHTNC_MEDIA = "PHOTONIC_MEDIA";
+    public static final String PHTNC_MEDIA_OTS = "PHOTONIC_MEDIA_OTS";
+    public static final String PHTNC_MEDIA_OMS = "PHOTONIC_MEDIA_OMS";
     public static final String MC = "MEDIA_CHANNEL";
     public static final String OTSI_MC = "OTSi_MEDIA_CHANNEL";
     public static final String RDM_INFRA = "ROADM-infra";
     public static final String CLIENT = "-CLIENT";
     public static final String NETWORK = "-NETWORK";
-    public static final String XPDR = "-XPDR";
+    public static final String XPDR = "XPONDER";
+    public static final String XXPDR = "-XPDR";
     public static final String TP = "TerminationPoint";
     public static final String NODE = "Node";
     public static final String LGX_PORT_NAME = "Some lgx-port-name";
     public static final String PORT_TYPE = "some port type";
     public static final String LGX_DEVICE_NAME = "Some lgx-device-name";
+    // TODO: static values until they are implemented
     public static final String PORT_RACK_VALUE = "000000.00";
+    public static final String FIXED_LATENCY_VALUE = "12345678";
+    public static final String COST_HOP_VALUE = "12345678";
+    public static final String JITTER_VALUE = "12345678";
+    public static final String WANDER_VALUE = "12345678";
+    public static final String QUEING_LATENCY_VALUE = "12345678";
+    public static final String TAPI_CONNECTION_UPDATE_ERROR = "Could not update TAPI connections";
+    public static final String TAPI_CONNECTION_READ_ERROR = "Could not read TAPI connection data";
 
     private TapiStringConstants() {
         // hiding the default constructor
index 392ae6d60736019cd6486a7e43d0a68a824c9b63..fe1e2eb2de021f37924a871951ca5b75db7c5217 100644 (file)
@@ -7,7 +7,9 @@
  */
 package org.opendaylight.transportpce.tapi.connectivity;
 
+import java.math.BigDecimal;
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Comparator;
@@ -25,90 +27,97 @@ import org.opendaylight.transportpce.tapi.TapiStringConstants;
 import org.opendaylight.transportpce.tapi.utils.GenericServiceEndpoint;
 import org.opendaylight.transportpce.tapi.utils.ServiceEndpointType;
 import org.opendaylight.transportpce.tapi.utils.TapiContext;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.Network;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesKey;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.equipment.types.rev191129.OpticTypes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ConnectionType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.RpcActions;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.Service;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ethernet.subrate.attributes.grp.EthernetAttributesBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.sdnc.request.header.SdncRequestHeaderBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.RxDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.RxDirectionKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.TxDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.TxDirectionKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.lgx.LgxBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.port.PortBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.subrate.eth.sla.SubrateEthSlaBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ConnectionType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.Service;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ethernet.subrate.attributes.grp.EthernetAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.sdnc.request.header.SdncRequestHeaderBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.RxDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.RxDirectionKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.TxDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.TxDirectionKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.lgx.LgxBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.port.PortBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.subrate.eth.sla.SubrateEthSlaBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODU4;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OTU4;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input.ServiceAEnd;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input.ServiceAEndBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input.ServiceZEnd;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input.ServiceZEndBuilder;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.PathDescription;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZ;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZKey;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToA;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.ztoa.direction.ZToAKey;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.Node;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.TerminationPoint;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.create.input.ServiceAEnd;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.create.input.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.create.input.ServiceZEnd;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.create.input.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.PathDescription;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZ;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.atoz.direction.AToZKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToA;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.path.description.ztoa.direction.ZToAKey;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.Node;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev230501.pce.resource.resource.resource.TerminationPoint;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.servicepath.rev171017.service.path.list.ServicePaths;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.AdministrativeState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.CapacityUnit;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Context;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.ForwardingDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LifecycleState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.OperationalState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortRole;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.BandwidthProfileBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.TotalSizeBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.CreateConnectivityServiceInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.ProtectionRole;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.ServiceType;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connection.LowerConnection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connection.LowerConnectionBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connection.LowerConnectionKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connection.end.point.ClientNodeEdgePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connection.end.point.ClientNodeEdgePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityService;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityServiceBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.Connection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.ConnectionBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.ConnectionKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.EndPoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.EndPointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.EndPointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.end.point.CapacityBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.end.point.ServiceInterfacePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.input.ConnectivityConstraint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.context.TopologyContext;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.Topology;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.TopologyKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.CAPACITYUNITGBPS;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Context;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Direction;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.ForwardingDirection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.PortRole;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.capacity.TotalSizeBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CreateConnectivityServiceInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.ProtectionRole;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.ServiceType;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.cep.list.ConnectionEndPoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.cep.list.ConnectionEndPointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connection.LowerConnection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connection.LowerConnectionBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connection.LowerConnectionKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connection.end.point.ClientNodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connection.end.point.ClientNodeEdgePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connection.end.point.ParentNodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connection.end.point.ParentNodeEdgePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.Connection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.ConnectionBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.ConnectionKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.ConnectivityConstraint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.ConnectivityConstraintBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.end.point.CapacityBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.end.point.ServiceInterfacePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIERMC;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTSiMC;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.context.TopologyContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.MappedServiceInterfacePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstancesBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.Uint16;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.opendaylight.yangtools.yang.common.Uint64;
@@ -118,18 +127,22 @@ import org.slf4j.LoggerFactory;
 
 public final class ConnectivityUtils {
 
-    private final Uuid tapiTopoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
-        .getBytes(Charset.forName("UTF-8"))).toString());
+    private final Uuid tapiTopoUuid = new Uuid(
+            UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER.getBytes(StandardCharsets.UTF_8)).toString());
     private static final Logger LOG = LoggerFactory.getLogger(ConnectivityUtils.class);
 
     private final ServiceDataStoreOperations serviceDataStoreOperations;
     private final TapiContext tapiContext;
     private Map<ServiceInterfacePointKey, ServiceInterfacePoint> sipMap;
-    private final Map<org.opendaylight.yang.gen.v1.urn
-        .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectionKey,
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection>
-        connectionFullMap; // this variable is for complete connection objects
+    // this variable is for complete connection objects
+    private final Map<
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectionKey,
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.Connection>
+            connectionFullMap;
     private final NetworkTransactionService networkTransactionService;
+    private Connection topConnRdmRdm;
+    private Connection topConnXpdrXpdrPhtn;
+    private Connection topConnXpdrXpdrOdu;
 
     // TODO -> handle cases for which node id is ROADM-A1 and not ROADMA01 or XPDR-A1 and not XPDRA01
     public ConnectivityUtils(ServiceDataStoreOperations serviceDataStoreOperations,
@@ -140,6 +153,9 @@ public final class ConnectivityUtils {
         this.sipMap = sipMap;
         this.connectionFullMap = new HashMap<>();
         this.networkTransactionService = networkTransactionService;
+        this.topConnRdmRdm = null;
+        this.topConnXpdrXpdrPhtn = null;
+        this.topConnXpdrXpdrOdu = null;
     }
 
     public static ServiceCreateInput buildServiceCreateInput(GenericServiceEndpoint sepA, GenericServiceEndpoint sepZ) {
@@ -156,56 +172,65 @@ public final class ConnectivityUtils {
             .setServiceName("service test")
             .setServiceAEnd(serviceAEnd)
             .setServiceZEnd(serviceZEnd)
-            .setSdncRequestHeader(new SdncRequestHeaderBuilder().setRequestId("request-1")
-                .setRpcAction(RpcActions.ServiceCreate).setNotificationUrl("notification url").setRequestSystemId(
-                    "appname")
-                .build())
+            .setSdncRequestHeader(
+                new SdncRequestHeaderBuilder()
+                    .setRequestId("request-1")
+                    .setRpcAction(RpcActions.ServiceCreate)
+                    .setNotificationUrl("notification url")
+                    .setRequestSystemId("appname")
+                    .build())
             .build();
     }
 
-    public static ServiceAEnd buildServiceAEnd(String nodeid, String clli, String txPortDeviceName,
-                                               String txPortName, String rxPortDeviceName, String rxPortName) {
+    public static ServiceAEnd buildServiceAEnd(
+            String nodeid, String clli, String txPortDeviceName,
+            String txPortName, String rxPortDeviceName, String rxPortName) {
         return new ServiceAEndBuilder()
             .setClli(clli)
             .setNodeId(new NodeIdType(nodeid))
             .setOpticType(OpticTypes.Gray)
             .setServiceFormat(ServiceFormat.Ethernet)
             .setServiceRate(Uint32.valueOf(100))
-            .setTxDirection(Map.of(new TxDirectionKey(Uint8.ZERO), new TxDirectionBuilder()
-                .setPort(new PortBuilder()
-                    .setPortDeviceName(txPortDeviceName)
-                    .setPortName(txPortName)
-                    .setPortRack(TapiStringConstants.PORT_RACK_VALUE)
-                    .setPortShelf("00")
-                    .setPortType(TapiStringConstants.PORT_TYPE)
-                    .build())
-                .setLgx(new LgxBuilder()
-                    .setLgxDeviceName(TapiStringConstants.LGX_DEVICE_NAME)
-                    .setLgxPortName(TapiStringConstants.LGX_PORT_NAME)
-                    .setLgxPortRack(TapiStringConstants.PORT_RACK_VALUE)
-                    .setLgxPortShelf("00")
-                    .build())
-                .build()))
-            .setRxDirection(Map.of(new RxDirectionKey(Uint8.ZERO), new RxDirectionBuilder()
-                .setPort(new PortBuilder()
-                    .setPortDeviceName(rxPortDeviceName)
-                    .setPortName(rxPortName)
-                    .setPortRack(TapiStringConstants.PORT_RACK_VALUE)
-                    .setPortShelf("00")
-                    .setPortType(TapiStringConstants.PORT_TYPE)
-                    .build())
-                .setLgx(new LgxBuilder()
-                    .setLgxDeviceName(TapiStringConstants.LGX_DEVICE_NAME)
-                    .setLgxPortName(TapiStringConstants.LGX_PORT_NAME)
-                    .setLgxPortRack(TapiStringConstants.PORT_RACK_VALUE)
-                    .setLgxPortShelf("00")
-                    .build())
-                .build()))
+            .setTxDirection(Map.of(
+                new TxDirectionKey(Uint8.ZERO),
+                new TxDirectionBuilder()
+                    .setPort(new PortBuilder()
+                        .setPortDeviceName(txPortDeviceName)
+                        .setPortName(txPortName)
+                        .setPortRack(TapiStringConstants.PORT_RACK_VALUE)
+                        .setPortShelf("00")
+                        .setPortType(TapiStringConstants.PORT_TYPE)
+                        .build())
+                    .setLgx(new LgxBuilder()
+                        .setLgxDeviceName(TapiStringConstants.LGX_DEVICE_NAME)
+                        .setLgxPortName(TapiStringConstants.LGX_PORT_NAME)
+                        .setLgxPortRack(TapiStringConstants.PORT_RACK_VALUE)
+                        .setLgxPortShelf("00")
+                        .build())
+                    .build()))
+            .setRxDirection(Map.of(
+                new RxDirectionKey(Uint8.ZERO),
+                new RxDirectionBuilder()
+                    .setPort(new PortBuilder()
+                        .setPortDeviceName(rxPortDeviceName)
+                        .setPortName(rxPortName)
+                        .setPortRack(TapiStringConstants.PORT_RACK_VALUE)
+                        .setPortShelf("00")
+                        .setPortType(TapiStringConstants.PORT_TYPE)
+                        .build())
+                    .setLgx(new LgxBuilder()
+                        .setLgxDeviceName(TapiStringConstants.LGX_DEVICE_NAME)
+                        .setLgxPortName(TapiStringConstants.LGX_PORT_NAME)
+                        .setLgxPortRack(TapiStringConstants.PORT_RACK_VALUE)
+                        .setLgxPortShelf("00")
+                        .build())
+                    .build()))
             .build();
     }
 
-    public static ServiceZEnd buildServiceZEnd(String nodeid, String clli, String txPortDeviceName,
-                                               String txPortName, String rxPortDeviceName, String rxPortName) {
+    public static ServiceZEnd buildServiceZEnd(
+            String nodeid, String clli, String txPortDeviceName,
+            String txPortName, String rxPortDeviceName, String rxPortName) {
         return  new ServiceZEndBuilder().setClli(clli).setNodeId(new NodeIdType(nodeid))
             .setOpticType(OpticTypes.Gray)
             .setServiceFormat(ServiceFormat.Ethernet)
@@ -243,26 +268,6 @@ public final class ConnectivityUtils {
             .build();
     }
 
-    private static ServiceAEnd getServiceAEnd(GenericServiceEndpoint sepA, GenericServiceEndpoint sepZ) {
-        if (sepA.getType().equals(ServiceEndpointType.SERVICEAEND)) {
-            return new ServiceAEndBuilder(sepA.getValue()).build();
-        } else if (sepZ.getType().equals(ServiceEndpointType.SERVICEAEND)) {
-            return new ServiceAEndBuilder(sepZ.getValue()).build();
-        } else {
-            return null;
-        }
-    }
-
-    private static ServiceZEnd getServiceZEnd(GenericServiceEndpoint sepA, GenericServiceEndpoint sepZ) {
-        if (sepA.getType().equals(ServiceEndpointType.SERVICEZEND)) {
-            return new ServiceZEndBuilder(sepA.getValue()).build();
-        } else if (sepZ.getType().equals(ServiceEndpointType.SERVICEZEND)) {
-            return new ServiceZEndBuilder(sepZ.getValue()).build();
-        } else {
-            return null;
-        }
-    }
-
     public void setSipMap(Map<ServiceInterfacePointKey, ServiceInterfacePoint> sips) {
         this.sipMap = sips;
     }
@@ -272,86 +277,48 @@ public final class ConnectivityUtils {
         LOG.info("Service = {}", service);
         Optional<ServicePaths> optServicePaths =
             this.serviceDataStoreOperations.getServicePath(service.getServiceName());
-        if (!optServicePaths.isPresent()) {
+        if (optServicePaths.isEmpty()) {
             LOG.error("No service path found for service {}", service.getServiceName());
             return null;
         }
-        ServicePaths servicePaths = optServicePaths.get();
-        PathDescription pathDescription = servicePaths.getPathDescription();
+        PathDescription pathDescription = optServicePaths.orElseThrow().getPathDescription();
         LOG.info("Path description of service = {}", pathDescription);
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceAEnd serviceAEnd
-            service.getServiceAEnd();
+        org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.ServiceAEnd serviceAEnd =
+            service.getServiceAEnd();
         // Endpoint creation
         EndPoint endPoint1 = mapServiceAEndPoint(serviceAEnd, pathDescription);
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceZEnd serviceZEnd
-            = service.getServiceZEnd();
-        EndPoint endPoint2 = mapServiceZEndPoint(serviceZEnd, pathDescription);
-        Map<EndPointKey, EndPoint> endPointMap = new HashMap<>();
-        endPointMap.put(endPoint1.key(), endPoint1);
-        endPointMap.put(endPoint2.key(), endPoint2);
+        EndPoint endPoint2 = mapServiceZEndPoint(service.getServiceZEnd(), pathDescription);
+        Map<EndPointKey, EndPoint> endPointMap = new HashMap<>(Map.of(
+                endPoint1.key(), endPoint1,
+                endPoint2.key(), endPoint2));
         LOG.info("EndPoints of connectivity services = {}", endPointMap);
         // Services Names
-        Name name = new NameBuilder().setValueName("Connectivity Service Name").setValue(service.getServiceName())
-            .build();
+        Name name =
+            new NameBuilder().setValueName("Connectivity Service Name").setValue(service.getServiceName()).build();
         // Connection creation
         Map<ConnectionKey, Connection> connMap =
-            createConnectionsFromService(serviceAEnd, serviceZEnd, pathDescription);
+            createConnectionsFromService(pathDescription, mapServiceLayerToAend(serviceAEnd));
+        LOG.debug("connectionMap for service {} = {} ", name, connMap);
+        ConnectivityConstraint conConstr =
+            new ConnectivityConstraintBuilder().setServiceType(ServiceType.POINTTOPOINTCONNECTIVITY).build();
         // TODO: full connectivity service?? With constraints and the rest of fields...
         return new ConnectivityServiceBuilder()
             .setAdministrativeState(AdministrativeState.UNLOCKED)
             .setOperationalState(OperationalState.ENABLED)
             .setLifecycleState(LifecycleState.INSTALLED)
-            .setUuid(new Uuid(UUID.nameUUIDFromBytes(service.getServiceName().getBytes(Charset.forName("UTF-8")))
-                .toString()))
-            .setServiceLayer(mapServiceLayer(serviceAEnd.getServiceFormat(), endPoint1, endPoint2))
-            .setServiceType(ServiceType.POINTTOPOINTCONNECTIVITY)
-            .setConnectivityDirection(ForwardingDirection.BIDIRECTIONAL)
+            .setUuid(new Uuid(
+                UUID.nameUUIDFromBytes(service.getServiceName().getBytes(StandardCharsets.UTF_8)).toString()))
+            .setLayerProtocolName(mapServiceLayer(serviceAEnd.getServiceFormat(), endPoint1, endPoint2))
+            .setConnectivityConstraint(conConstr)
+            .setDirection(ForwardingDirection.BIDIRECTIONAL)
             .setName(Map.of(name.key(), name))
             .setConnection(connMap)
             .setEndPoint(endPointMap)
             .build();
     }
 
-    private LayerProtocolName mapServiceLayer(ServiceFormat serviceFormat, EndPoint endPoint1, EndPoint endPoint2) {
-        switch (serviceFormat) {
-            case OC:
-            case OTU:
-                return LayerProtocolName.PHOTONICMEDIA;
-            case ODU:
-                return LayerProtocolName.ODU;
-            case Ethernet:
-                String node1 = endPoint1.getLocalId();
-                String node2 = endPoint2.getLocalId();
-                if (getOpenroadmType(node1).equals(OpenroadmNodeType.TPDR)
-                        && getOpenroadmType(node2).equals(OpenroadmNodeType.TPDR)) {
-                    return LayerProtocolName.ETH;
-                }
-                return LayerProtocolName.DSR;
-            default:
-                LOG.info("Service layer mapping not supported for {}", serviceFormat.getName());
-        }
-        return null;
-    }
-
-    private OpenroadmNodeType getOpenroadmType(String nodeName) {
-        LOG.info("Node name = {}", nodeName);
-        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+",nodeName, TapiStringConstants.DSR))
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node tapiNode
-            = this.tapiContext.getTapiNode(this.tapiTopoUuid, nodeUuid);
-        if (tapiNode != null) {
-            return OpenroadmNodeType.forName(tapiNode.getName().get(new NameKey("Node Type"))
-                .getValue()).get();
-        }
-        return null;
-    }
-
-    private Map<ConnectionKey, Connection> createConnectionsFromService(
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceAEnd
-                serviceAEnd,
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceZEnd
-                serviceZEnd,
-        PathDescription pathDescription) {
+    public Map<ConnectionKey, Connection> createConnectionsFromService(
+            PathDescription pathDescription, LayerProtocolName lpn) {
         Map<ConnectionKey, Connection> connectionServMap = new HashMap<>();
         // build lists with ROADM nodes, XPDR/MUX/SWITCH nodes, ROADM DEG TTPs, ROADM SRG TTPs, XPDR CLIENT TTPs
         //  and XPDR NETWORK TTPs (if any). From the path description. This will help to build the uuid of the CEPs
@@ -364,7 +331,7 @@ public final class ConnectivityUtils {
         List<String> rdmNodelist = new ArrayList<>();
         List<String> xpdrNodelist = new ArrayList<>();
         for (AToZ elem:pathDescription.getAToZDirection().getAToZ().values().stream()
-            .sorted(Comparator.comparing(AToZ::getId)).collect(Collectors.toList())) {
+                .sorted((Comparator.comparing(atoz -> Integer.valueOf(atoz.getId())))).collect(Collectors.toList())) {
             resourceType = elem.getResource().getResource().implementedInterface().getSimpleName();
             switch (resourceType) {
                 case TapiStringConstants.TP:
@@ -438,75 +405,270 @@ public final class ConnectivityUtils {
         }
         // create corresponding CEPs and Connections. Connections should be added to the corresponding context
         // CEPs must be included in the topology context as an augmentation for each ONEP!!
-        ServiceFormat serviceFormat = serviceAEnd.getServiceFormat(); // should be equal to serviceZEnd
         // TODO -> Maybe we dont need to create the connections and ceps if the previous service doesnt exist??
         //  As mentioned above, for 100GbE service creation there are ROADMs in the path description.
         //  What are the configurations needed here? No OTU, ODU... what kind of cross connections is needed?
         //  this needs to be changed
         // TODO: OpenROADM getNodeType from the NamesList to verify what needs to be created
         OpenroadmNodeType openroadmNodeType = getOpenRoadmNodeType(xpdrNodelist);
-        switch (serviceFormat) {
-            case OC:
+        switch (lpn) {
+            case PHOTONICMEDIA:
                 // Identify number of ROADMs
                 // - XC Connection between MC CEPs mapped from MC NEPs (within a roadm)
                 // - XC Connection between OTSiMC CEPs mapped from OTSiMC NEPs (within a roadm)
                 // - Top Connection MC betwwen MC CEPs of different roadms
                 // - Top Connection OTSiMC betwwen OTSiMC CEPs of extreme roadms
-                connectionServMap.putAll(createRoadmCepsAndConnections(rdmAddDropTplist, rdmDegTplist, rdmNodelist,
-                    edgeRoadm1, edgeRoadm2));
-                break;
-            case OTU:
-                // Identify number of ROADMs between XPDRs and check if OC is created
-                // - XC Connection between MC CEPs mapped from MC NEPs (within a roadm)
-                // - Top Connection MC betwwen MC CEPs of different roadms
-                // - XC Connection between OTSiMC CEPs mapped from OTSiMC NEPs (within a roadm)
-                // - Top Connection OTSiMC betwwen OTSiMC CEPs of different roadms
-                connectionServMap.putAll(createRoadmCepsAndConnections(rdmAddDropTplist, rdmDegTplist, rdmNodelist,
-                    edgeRoadm1, edgeRoadm2));
-                // - XC Connection OTSi betwwen iOTSi y eOTSi of xpdr
-                // - Top connection OTSi between network ports of xpdrs in the Photonic media layer -> i_OTSi
-                connectionServMap.putAll(createXpdrCepsAndConnectionsPht(xpdrNetworkTplist, xpdrNodelist));
+                connectionServMap.putAll(
+                    createRoadmCepsAndConnections(rdmAddDropTplist, rdmDegTplist, rdmNodelist, edgeRoadm1, edgeRoadm2));
+                if (!pathDescription.getAToZDirection().getAToZ().values().stream().findFirst().orElseThrow().getId()
+                        .contains("ROADM")) {
+                    // - XC Connection OTSi betwwen iOTSi y eOTSi of xpdr
+                    // - Top connection OTSi between network ports of xpdrs in the Photonic media layer -> i_OTSi
+                    connectionServMap.putAll(createXpdrCepsAndConnectionsPht(xpdrNetworkTplist, xpdrNodelist));
+                }
+                this.topConnRdmRdm = null;
                 break;
             case ODU:
+                // TODO: verify if this is correct
                 // - XC Connection OTSi betwwen iODU and eODU of xpdr
                 // - Top connection in the ODU layer, between xpdr eODU ports (?)
-                connectionServMap.putAll(createXpdrCepsAndConnectionsOdu(xpdrNetworkTplist, xpdrNodelist));
+                if (openroadmNodeType.equals(OpenroadmNodeType.MUXPDR)) {
+                    connectionServMap.putAll(createXpdrCepsAndConnectionsOdu(xpdrNetworkTplist, xpdrNodelist));
+                    this.topConnXpdrXpdrPhtn = null;
+                }
                 break;
-            case Ethernet:
+            case ETH:
                 // Check if OC, OTU and ODU are created
                 if (openroadmNodeType.equals(OpenroadmNodeType.TPDR)) {
                     LOG.info("WDM ETH service");
-                    connectionServMap.putAll(createRoadmCepsAndConnections(rdmAddDropTplist, rdmDegTplist, rdmNodelist,
-                        edgeRoadm1, edgeRoadm2));
+                    connectionServMap.putAll(
+                        createRoadmCepsAndConnections(
+                            rdmAddDropTplist, rdmDegTplist, rdmNodelist, edgeRoadm1, edgeRoadm2));
                     connectionServMap.putAll(createXpdrCepsAndConnectionsPht(xpdrNetworkTplist, xpdrNodelist));
+                    this.topConnRdmRdm = null;
                     xpdrClientTplist = getAssociatedClientsPort(xpdrNetworkTplist);
                     LOG.info("Associated client ports = {}", xpdrClientTplist);
-                    connectionServMap.putAll(createXpdrCepsAndConnectionsEth(xpdrClientTplist, xpdrNodelist,
-                        connectionServMap));
+                    connectionServMap.putAll(
+                        createXpdrCepsAndConnectionsEth(xpdrClientTplist, xpdrNodelist, connectionServMap));
+                    this.topConnXpdrXpdrPhtn = null;
                 }
+                break;
+            case DSR:
+                LOG.info("OTN XGE/ODUe service");
+                // - XC connection between iODU and eODU
+                // - Top connection between eODU ports
+                // - Top connection between DSR ports
                 if (openroadmNodeType.equals(OpenroadmNodeType.SWITCH)) {
                     // TODO: We create both ODU and DSR because there is no ODU service creation for the switch
-                    // - XC Connection OTSi betwwen iODU and eODU of xpdr
+                    // - XC Connection OTSi between iODU and eODU of xpdr
                     // - Top connection in the ODU layer, between xpdr eODU ports (?)
-                    connectionServMap.putAll(createXpdrCepsAndConnectionsOdu(xpdrNetworkTplist, xpdrNodelist));
-                    connectionServMap.putAll(createXpdrCepsAndConnectionsDsr(xpdrClientTplist, xpdrNetworkTplist,
-                        xpdrNodelist));
+                    connectionServMap.putAll(
+                        createXpdrCepsAndConnectionsDsr(xpdrClientTplist, xpdrNetworkTplist, xpdrNodelist));
+                    this.topConnXpdrXpdrPhtn = null;
                 }
                 if (openroadmNodeType.equals(OpenroadmNodeType.MUXPDR)) {
                     // TODO: OTN service but mux has 3 steps at rendering. Verify that things exist
-                    connectionServMap.putAll(createXpdrCepsAndConnectionsDsr(xpdrClientTplist, xpdrNetworkTplist,
-                        xpdrNodelist));
+                    connectionServMap.putAll(
+                        createXpdrCepsAndConnectionsDsr(xpdrClientTplist, xpdrNetworkTplist, xpdrNodelist));
+                    this.topConnXpdrXpdrOdu = null;
                 }
                 break;
             default:
                 LOG.error("Service type format not supported");
         }
+        LOG.debug("CONNSERVERMAP = {}", connectionServMap);
         return connectionServMap;
     }
 
-    private Map<ConnectionKey, Connection> createXpdrCepsAndConnectionsEth(List<String> xpdrClientTplist,
-                                                                           List<String> xpdrNodelist,
-                                                                           Map<ConnectionKey, Connection> lowerConn) {
+    public void updateTopologyWithNep(Uuid topoUuid, Uuid nodeUuid, Uuid nepUuid, OwnedNodeEdgePoint onep) {
+        // TODO: verify this is correct. Should we identify the context IID with the context UUID??
+        InstanceIdentifier<OwnedNodeEdgePoint> onepIID = InstanceIdentifier.builder(Context.class)
+            .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1.class)
+            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.context.TopologyContext.class)
+            .child(Topology.class, new TopologyKey(topoUuid))
+            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node.class,
+                new NodeKey(nodeUuid))
+            .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nepUuid))
+            .build();
+        try {
+            Optional<OwnedNodeEdgePoint> optionalOnep =
+                this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, onepIID).get();
+            if (optionalOnep.isPresent()) {
+                LOG.error("ONEP is already present in datastore");
+                return;
+            }
+            // merge in datastore
+            this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, onepIID, onep);
+            this.networkTransactionService.commit().get();
+            LOG.info("NEP {} added successfully.", onep.getName());
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Couldnt put NEP {} in topology, error = ", onep.getName(), e);
+        }
+    }
+
+    public Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .connectivity.context.ConnectionKey,
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .connectivity.context.Connection> getConnectionFullMap() {
+        return this.connectionFullMap;
+    }
+
+    public ServiceCreateInput createORServiceInput(CreateConnectivityServiceInput input, Uuid serviceUuid) {
+        // TODO: not taking into account all the constraints. Only using EndPoints and Connectivity Constraint.
+        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .create.connectivity.service.input.EndPointKey,
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .create.connectivity.service.input.EndPoint> endPointMap = input.getEndPoint();
+        ConnectionType connType = null;
+        ServiceFormat serviceFormat = null;
+        String nodeAid = String.join("+",
+            endPointMap.values().stream().findFirst().orElseThrow().getLocalId(),
+            TapiStringConstants.XPDR);
+        String nodeZid = String.join("+",
+            endPointMap.values().stream().skip(1).findFirst().orElseThrow().getLocalId(),
+            TapiStringConstants.XPDR);
+        LOG.info("NodeAid = {}", nodeAid);
+        LOG.info("NodeZid = {}", nodeZid);
+        //switch (constraint.getServiceLayer().getIntValue()) {
+        switch (input.getLayerProtocolName().getIntValue()) {
+            case 0:
+                LOG.info("ODU");
+                connType = ConnectionType.Infrastructure;
+                serviceFormat = ServiceFormat.ODU;
+                break;
+            case 1:
+                LOG.info("ETH, no need to create OTU and ODU");
+                connType = ConnectionType.Service;
+                serviceFormat = ServiceFormat.Ethernet;
+                break;
+            case 2:
+                LOG.info("DSR, need to create OTU and ODU");
+                connType = ConnectionType.Service;
+                serviceFormat = ServiceFormat.Ethernet;
+                break;
+            case 3:
+                LOG.info("PHOTONIC");
+                connType = getConnectionTypePhtnc(endPointMap.values());
+                serviceFormat = getServiceFormatPhtnc(endPointMap.values());
+                LOG.debug("Node a photonic = {}", nodeAid);
+                LOG.debug("Node z photonic = {}", nodeZid);
+                break;
+            default:
+                LOG.info("Service type {} not supported", input.getLayerProtocolName().getName());
+        }
+        // Requested Capacity for connectivity service
+        Uint64 capacity = Uint64.valueOf(Math.abs(
+            input.getConnectivityConstraint().getRequestedCapacity().getTotalSize().getValue().intValue()));
+        // map endpoints into service end points. Map the type of service from TAPI to OR
+        ServiceAEnd serviceAEnd = tapiEndPointToServiceAPoint(
+            endPointMap.values().stream().findFirst().orElseThrow(),
+            serviceFormat, nodeAid, capacity, input.getLayerProtocolName());
+        ServiceZEnd serviceZEnd = tapiEndPointToServiceZPoint(
+            endPointMap.values().stream().skip(1).findFirst().orElseThrow(),
+            serviceFormat, nodeZid, capacity, input.getLayerProtocolName());
+        if (serviceAEnd == null || serviceZEnd == null) {
+            LOG.error("Couldnt map endpoints to service end");
+            return null;
+        }
+        LOG.info("Service a end = {}", serviceAEnd);
+        LOG.info("Service z end = {}", serviceZEnd);
+        return new ServiceCreateInputBuilder()
+            .setServiceAEnd(serviceAEnd)
+            .setServiceZEnd(serviceZEnd)
+            .setConnectionType(connType)
+            .setServiceName(serviceUuid.getValue())
+            .setCommonId("common id")
+            .setSdncRequestHeader(new SdncRequestHeaderBuilder().setRequestId("request-1")
+                .setRpcAction(RpcActions.ServiceCreate).setNotificationUrl("notification url")
+                .setRequestSystemId("appname")
+                .build())
+            .setCustomer("customer")
+            .setDueDate(DateAndTime.getDefaultInstance("2018-06-15T00:00:01Z"))
+            .setOperatorContact("pw1234")
+            .build();
+    }
+
+    private static ServiceAEnd getServiceAEnd(GenericServiceEndpoint sepA, GenericServiceEndpoint sepZ) {
+        if (sepA.getType().equals(ServiceEndpointType.SERVICEAEND)) {
+            return new ServiceAEndBuilder(sepA.getValue()).build();
+        }
+        if (sepZ.getType().equals(ServiceEndpointType.SERVICEAEND)) {
+            return new ServiceAEndBuilder(sepZ.getValue()).build();
+        }
+        return null;
+    }
+
+    private static ServiceZEnd getServiceZEnd(GenericServiceEndpoint sepA, GenericServiceEndpoint sepZ) {
+        if (sepA.getType().equals(ServiceEndpointType.SERVICEZEND)) {
+            return new ServiceZEndBuilder(sepA.getValue()).build();
+        }
+        if (sepZ.getType().equals(ServiceEndpointType.SERVICEZEND)) {
+            return new ServiceZEndBuilder(sepZ.getValue()).build();
+        }
+        return null;
+    }
+
+    private LayerProtocolName mapServiceLayerToAend(
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
+                .service.ServiceAEnd serviceAEnd) {
+        ServiceFormat serviceFormat = serviceAEnd.getServiceFormat();
+        switch (serviceFormat) {
+            case OC:
+            case OTU:
+                return LayerProtocolName.PHOTONICMEDIA;
+            case ODU:
+                return LayerProtocolName.ODU;
+            case Ethernet:
+                if (getOpenroadmType(
+                            serviceAEnd.getTxDirection().values().stream().findFirst().orElseThrow()
+                                .getPort().getPortDeviceName())
+                        .equals(OpenroadmNodeType.TPDR)) {
+                    return LayerProtocolName.ETH;
+                }
+                return LayerProtocolName.DSR;
+            default:
+                LOG.info("Service layer mapping not supported for {}", serviceFormat.getName());
+        }
+        return null;
+    }
+
+    private LayerProtocolName mapServiceLayer(ServiceFormat serviceFormat, EndPoint endPoint1, EndPoint endPoint2) {
+        switch (serviceFormat) {
+            case OC:
+            case OTU:
+                return LayerProtocolName.PHOTONICMEDIA;
+            case ODU:
+                return LayerProtocolName.ODU;
+            case Ethernet:
+                String node1 = endPoint1.getLocalId();
+                String node2 = endPoint2.getLocalId();
+                if (getOpenroadmType(node1).equals(OpenroadmNodeType.TPDR)
+                        && getOpenroadmType(node2).equals(OpenroadmNodeType.TPDR)) {
+                    return LayerProtocolName.ETH;
+                }
+                return LayerProtocolName.DSR;
+            default:
+                LOG.info("Service layer mapping not supported for {}", serviceFormat.getName());
+        }
+        return null;
+    }
+    //TODO factorize these two similar methods
+
+    private OpenroadmNodeType getOpenroadmType(String nodeName) {
+        LOG.info("Node name = {}", nodeName);
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node tapiNode =
+            this.tapiContext.getTapiNode(
+                this.tapiTopoUuid,
+                new Uuid(UUID.nameUUIDFromBytes(
+                        (String.join("+",nodeName, TapiStringConstants.XPDR)).getBytes(StandardCharsets.UTF_8))
+                    .toString()));
+        return tapiNode == null
+            ? null
+            : OpenroadmNodeType.forName(tapiNode.getName().get(new NameKey("Node Type")).getValue());
+    }
+
+    private Map<ConnectionKey, Connection> createXpdrCepsAndConnectionsEth(
+            List<String> xpdrClientTplist, List<String> xpdrNodelist, Map<ConnectionKey, Connection> lowerConn) {
         // TODO: do we need to create cross connection between iODU and eODU??
         // add the lower connections of the previous steps for this kind of service
         Map<LowerConnectionKey, LowerConnection> xcMap = new HashMap<>();
@@ -514,47 +676,44 @@ public final class ConnectivityUtils {
             LowerConnection conn = new LowerConnectionBuilder().setConnectionUuid(lowConn.getConnectionUuid()).build();
             xcMap.put(conn.key(), conn);
         }
-        Map<ConnectionKey, Connection> connServMap = new HashMap<>();
-        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey,
-            ConnectionEndPoint> cepMapDsr = new HashMap<>();
+        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .cep.list.ConnectionEndPointKey, ConnectionEndPoint> cepMapDsr = new HashMap<>();
         // Create 1 cep per Xpdr in the CLIENT
         // 1 top connection DSR between the CLIENT xpdrs
         for (String xpdr:xpdrNodelist) {
             LOG.info("Creating ceps and xc for xpdr {}", xpdr);
-            String spcXpdrClient = xpdrClientTplist.stream().filter(netp -> netp.contains(xpdr)).findFirst().get();
-
-            ConnectionEndPoint netCep1 = createCepXpdr(spcXpdrClient, TapiStringConstants.DSR, TapiStringConstants.DSR,
-                LayerProtocolName.DSR);
-            putXpdrCepInTopologyContext(xpdr, spcXpdrClient, TapiStringConstants.DSR, TapiStringConstants.DSR, netCep1);
-
+            String spcXpdrClient =
+                xpdrClientTplist.stream().filter(netp -> netp.contains(xpdr)).findFirst().orElseThrow();
+            ConnectionEndPoint netCep1 =
+                createCepXpdr(spcXpdrClient, TapiStringConstants.DSR, TapiStringConstants.XPDR, LayerProtocolName.DSR);
+            putXpdrCepInTopologyContext(
+                xpdr, spcXpdrClient, TapiStringConstants.DSR, TapiStringConstants.XPDR, netCep1);
             cepMapDsr.put(netCep1.key(), netCep1);
         }
-        String spcXpdr1 = xpdrClientTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(0))).findFirst().get();
-        String spcXpdr2 = xpdrClientTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(xpdrNodelist.size() - 1))).findFirst().get();
-
         // DSR top connection between edge xpdr CLIENT DSR
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-            connectionDsr = createTopConnection(spcXpdr1, spcXpdr2, cepMapDsr, TapiStringConstants.DSR,
-            LayerProtocolName.DSR, xcMap);
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .connectivity.context.Connection connectionDsr =
+            createTopConnection(
+                //spcXpdr1,
+                xpdrClientTplist.stream().filter(adp -> adp.contains(xpdrNodelist.get(0)))
+                    .findFirst().orElseThrow(),
+                //spcXpdr2,
+                xpdrClientTplist.stream().filter(adp -> adp.contains(xpdrNodelist.get(xpdrNodelist.size() - 1)))
+                    .findFirst().orElseThrow(),
+                cepMapDsr, TapiStringConstants.DSR, LayerProtocolName.DSR, xcMap, this.topConnXpdrXpdrPhtn);
         this.connectionFullMap.put(connectionDsr.key(), connectionDsr);
-
         // DSR top connection that will be added to the service object
         Connection conn1 = new ConnectionBuilder().setConnectionUuid(connectionDsr.getUuid()).build();
-        connServMap.put(conn1.key(), conn1);
-
-        return connServMap;
+        return new HashMap<>(Map.of(conn1.key(), conn1));
     }
 
-    private Map<ConnectionKey,Connection> createXpdrCepsAndConnectionsDsr(List<String> xpdrClientTplist,
-                                                                          List<String> xpdrNetworkTplist,
-                                                                          List<String> xpdrNodelist) {
+    private Map<ConnectionKey,Connection> createXpdrCepsAndConnectionsDsr(
+            List<String> xpdrClientTplist, List<String> xpdrNetworkTplist, List<String> xpdrNodelist) {
         Map<ConnectionKey, Connection> connServMap = new HashMap<>();
-        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey,
-            ConnectionEndPoint> cepMapDsr = new HashMap<>();
-        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey,
-            ConnectionEndPoint> cepMapOdu = new HashMap<>();
+        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .cep.list.ConnectionEndPointKey, ConnectionEndPoint> cepMapDsr = new HashMap<>();
+        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .cep.list.ConnectionEndPointKey, ConnectionEndPoint> cepMapOdu = new HashMap<>();
         // TODO: when upgrading the models to 2.1.3, get the connection inclusion because those connections will
         //  be added to the lower connection of a top connection
         Map<LowerConnectionKey, LowerConnection> xcMap = new HashMap<>();
@@ -563,26 +722,26 @@ public final class ConnectivityUtils {
         // 1 top connection between eODU and a top connection DSR between the CLIENT xpdrs
         for (String xpdr:xpdrNodelist) {
             LOG.info("Creating ceps and xc for xpdr {}", xpdr);
-            String spcXpdrClient = xpdrClientTplist.stream().filter(netp -> netp.contains(xpdr)).findFirst().get();
-
-            ConnectionEndPoint netCep1 = createCepXpdr(spcXpdrClient, TapiStringConstants.DSR, TapiStringConstants.DSR,
-                LayerProtocolName.DSR);
-            putXpdrCepInTopologyContext(xpdr, spcXpdrClient, TapiStringConstants.DSR, TapiStringConstants.DSR, netCep1);
-
-            ConnectionEndPoint netCep2 = createCepXpdr(spcXpdrClient, TapiStringConstants.E_ODU,
-                TapiStringConstants.DSR, LayerProtocolName.ODU);
-            putXpdrCepInTopologyContext(xpdr, spcXpdrClient, TapiStringConstants.E_ODU, TapiStringConstants.DSR,
-                netCep2);
+            String spcXpdrClient =
+                xpdrClientTplist.stream().filter(netp -> netp.contains(xpdr)).findFirst().orElseThrow();
+            ConnectionEndPoint clientCep1 =
+                createCepXpdr(spcXpdrClient, TapiStringConstants.DSR, TapiStringConstants.XPDR, LayerProtocolName.DSR);
+            putXpdrCepInTopologyContext(
+                xpdr, spcXpdrClient, TapiStringConstants.DSR, TapiStringConstants.XPDR, clientCep1);
+            ConnectionEndPoint clientCep2 = createCepXpdr(
+                    spcXpdrClient, TapiStringConstants.E_ODU, TapiStringConstants.XPDR, LayerProtocolName.ODU);
+            putXpdrCepInTopologyContext(
+                xpdr, spcXpdrClient, TapiStringConstants.E_ODU, TapiStringConstants.XPDR, clientCep2);
+            cepMapDsr.put(clientCep1.key(), clientCep1);
+            cepMapOdu.put(clientCep2.key(), clientCep2);
 
             String spcXpdrNetwork = getAssociatedNetworkPort(spcXpdrClient, xpdrNetworkTplist);
-            ConnectionEndPoint netCep3 = getAssociatediODUCep(spcXpdrNetwork);
-
-            cepMapDsr.put(netCep1.key(), netCep1);
-            cepMapOdu.put(netCep2.key(), netCep2);
             // Create x connection between I_ODU and E_ODU within xpdr
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-                connection = createXCBetweenCeps(netCep2, netCep3, spcXpdrClient, spcXpdrNetwork,
-                TapiStringConstants.ODU, LayerProtocolName.ODU);
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                    .connectivity.context.Connection connection =
+                createXCBetweenCeps(
+                    clientCep2, getAssociatediODUCep(spcXpdrNetwork),
+                     spcXpdrClient, spcXpdrNetwork, TapiStringConstants.ODU, LayerProtocolName.ODU);
             this.connectionFullMap.put(connection.key(), connection);
 
             // Create X connection that will be added to the service object
@@ -591,14 +750,18 @@ public final class ConnectivityUtils {
         }
 
         // DSR top connection between edge xpdr CLIENT DSR
-        String spcXpdr1 = xpdrClientTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(0))).findFirst().get();
-        String spcXpdr2 = xpdrClientTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(xpdrNodelist.size() - 1))).findFirst().get();
-
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-            connectionOdu = createTopConnection(spcXpdr1, spcXpdr2, cepMapOdu, TapiStringConstants.E_ODU,
-            LayerProtocolName.ODU, xcMap);
+        String spcXpdr1 =
+            xpdrClientTplist.stream().filter(adp -> adp.contains(xpdrNodelist.get(0)))
+                .findFirst().orElseThrow();
+        String spcXpdr2 =
+            xpdrClientTplist.stream().filter(adp -> adp.contains(xpdrNodelist.get(xpdrNodelist.size() - 1)))
+                .findFirst().orElseThrow();
+
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .connectivity.context.Connection connectionOdu =
+            createTopConnection(
+                spcXpdr1, spcXpdr2, cepMapOdu, TapiStringConstants.E_ODU,
+                LayerProtocolName.ODU, xcMap, this.topConnXpdrXpdrOdu);
         this.connectionFullMap.put(connectionOdu.key(), connectionOdu);
 
         // ODU top connection that will be added to the service object
@@ -607,287 +770,331 @@ public final class ConnectivityUtils {
         LowerConnection lowerConn = new LowerConnectionBuilder().setConnectionUuid(connectionOdu.getUuid()).build();
         xcMap.put(lowerConn.key(), lowerConn);
 
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-            connectionDsr = createTopConnection(spcXpdr1, spcXpdr2, cepMapDsr, TapiStringConstants.DSR,
-                LayerProtocolName.DSR, xcMap);
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .connectivity.context.Connection connectionDsr =
+            createTopConnection(
+                spcXpdr1, spcXpdr2, cepMapDsr, TapiStringConstants.DSR,
+                LayerProtocolName.DSR, xcMap, this.topConnXpdrXpdrPhtn);
         this.connectionFullMap.put(connectionDsr.key(), connectionDsr);
-
         // DSR top connection that will be added to the service object
         Connection conn1 = new ConnectionBuilder().setConnectionUuid(connectionDsr.getUuid()).build();
         connServMap.put(conn1.key(), conn1);
-
         return connServMap;
     }
 
-    private Map<ConnectionKey, Connection> createXpdrCepsAndConnectionsOdu(List<String> xpdrNetworkTplist,
-                                                                           List<String> xpdrNodelist) {
+    private Map<ConnectionKey, Connection> createXpdrCepsAndConnectionsOdu(
+            List<String> xpdrNetworkTplist, List<String> xpdrNodelist) {
         Map<ConnectionKey, Connection> connServMap = new HashMap<>();
-        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey,
-            ConnectionEndPoint> cepMap = new HashMap<>();
+        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .cep.list.ConnectionEndPointKey, ConnectionEndPoint> cepMap = new HashMap<>();
         // TODO: when upgrading the models to 2.1.3, get the connection inclusion because those connections will
         //  be added to the lower connection of a top connection
-        Map<LowerConnectionKey, LowerConnection> xcMap = new HashMap<>();
-
         // Create 1 cep per Xpdr in the I_ODU and a top
         // connection iODU between the xpdrs
         for (String xpdr:xpdrNodelist) {
             LOG.info("Creating ceps and xc for xpdr {}", xpdr);
-            String spcXpdrNetwork = xpdrNetworkTplist.stream().filter(netp -> netp.contains(xpdr)).findFirst().get();
-
-            ConnectionEndPoint netCep1 = createCepXpdr(spcXpdrNetwork, TapiStringConstants.I_ODU,
-                TapiStringConstants.DSR, LayerProtocolName.ODU);
-            putXpdrCepInTopologyContext(xpdr, spcXpdrNetwork, TapiStringConstants.I_ODU, TapiStringConstants.DSR,
-                netCep1);
-
+            String spcXpdrNetwork =
+                xpdrNetworkTplist.stream().filter(netp -> netp.contains(xpdr)).findFirst().orElseThrow();
+            ConnectionEndPoint netCep1 =
+                createCepXpdr(
+                    spcXpdrNetwork, TapiStringConstants.I_ODU, TapiStringConstants.XPDR, LayerProtocolName.ODU);
+            putXpdrCepInTopologyContext(
+                xpdr, spcXpdrNetwork, TapiStringConstants.I_ODU, TapiStringConstants.XPDR, netCep1);
             cepMap.put(netCep1.key(), netCep1);
         }
-
         // ODU top connection between edge xpdr i_ODU
-        String spcXpdr1 = xpdrNetworkTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(0))).findFirst().get();
-        String spcXpdr2 = xpdrNetworkTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(xpdrNodelist.size() - 1))).findFirst().get();
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-            connection = createTopConnection(spcXpdr1, spcXpdr2, cepMap, TapiStringConstants.I_ODU,
-            LayerProtocolName.ODU, xcMap);
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .connectivity.context.Connection connection =
+            createTopConnection(
+                //spcXpdr1,
+                xpdrNetworkTplist.stream().filter(adp -> adp.contains(xpdrNodelist.get(0)))
+                    .findFirst().orElseThrow(),
+                //spcXpdr2,
+                xpdrNetworkTplist.stream().filter(adp -> adp.contains(xpdrNodelist.get(xpdrNodelist.size() - 1)))
+                    .findFirst().orElseThrow(),
+                cepMap, TapiStringConstants.I_ODU,
+                LayerProtocolName.ODU, new HashMap<>(), this.topConnXpdrXpdrPhtn);
         this.connectionFullMap.put(connection.key(), connection);
-
         // ODU top connection that will be added to the service object
         Connection conn = new ConnectionBuilder().setConnectionUuid(connection.getUuid()).build();
         connServMap.put(conn.key(), conn);
-
+        this.topConnXpdrXpdrOdu = conn;
         return connServMap;
     }
 
-    private Map<ConnectionKey, Connection> createXpdrCepsAndConnectionsPht(List<String> xpdrNetworkTplist,
-                                                                           List<String> xpdrNodelist) {
-        Map<ConnectionKey, Connection> connServMap = new HashMap<>();
-        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey,
-            ConnectionEndPoint> cepMap = new HashMap<>();
+    private Map<ConnectionKey, Connection> createXpdrCepsAndConnectionsPht(
+                List<String> xpdrNetworkTplist, List<String> xpdrNodelist) {
         // TODO: when upgrading the models to 2.1.3, get the connection inclusion because those connections will
         //  be added to the lower connection of a top connection
-        Map<LowerConnectionKey, LowerConnection> xcMap = new HashMap<>();
-
+        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.cep.list.ConnectionEndPointKey,
+            ConnectionEndPoint> cepMap = new HashMap<>();
         // create ceps and x connections within xpdr
         for (String xpdr:xpdrNodelist) {
             LOG.info("Creating ceps and xc for xpdr {}", xpdr);
-            String spcXpdrNetwork = xpdrNetworkTplist.stream().filter(netp -> netp.contains(xpdr)).findFirst().get();
+            String spcXpdrNetwork =
+                xpdrNetworkTplist.stream().filter(netp -> netp.contains(xpdr)).findFirst().orElseThrow();
             // There should be 1 network tp per xpdr
-            // TODO photonic media model should be updated to have the corresponding CEPs. I will just create
-            //  3 different MC CEPs giving different IDs to show that they are different
-            // Create 3 CEPs for each xpdr otsi node and the corresponding cross connection matchin the NEPs
-            ConnectionEndPoint netCep1 = createCepXpdr(spcXpdrNetwork, TapiStringConstants.PHTNC_MEDIA,
-                TapiStringConstants.OTSI, LayerProtocolName.PHOTONICMEDIA);
-            putXpdrCepInTopologyContext(xpdr, spcXpdrNetwork, TapiStringConstants.PHTNC_MEDIA, TapiStringConstants.OTSI,
-                netCep1);
-            ConnectionEndPoint netCep2 = createCepXpdr(spcXpdrNetwork, TapiStringConstants.E_OTSI,
-                TapiStringConstants.OTSI, LayerProtocolName.PHOTONICMEDIA);
-            putXpdrCepInTopologyContext(xpdr, spcXpdrNetwork, TapiStringConstants.E_OTSI, TapiStringConstants.OTSI,
-                netCep2);
-            ConnectionEndPoint netCep3 = createCepXpdr(spcXpdrNetwork, TapiStringConstants.I_OTSI,
-                TapiStringConstants.OTSI, LayerProtocolName.PHOTONICMEDIA);
-            putXpdrCepInTopologyContext(xpdr, spcXpdrNetwork, TapiStringConstants.I_OTSI, TapiStringConstants.OTSI,
-                netCep3);
+            //   Just create 2 different CEPs (1 OTS + 1 OTSI_MC)
+            ConnectionEndPoint netCep1 = createCepXpdr(
+                    spcXpdrNetwork, TapiStringConstants.PHTNC_MEDIA_OTS,
+                    TapiStringConstants.XPDR, LayerProtocolName.PHOTONICMEDIA);
+            putXpdrCepInTopologyContext(
+                xpdr, spcXpdrNetwork, TapiStringConstants.PHTNC_MEDIA_OTS, TapiStringConstants.XPDR, netCep1);
+            ConnectionEndPoint netCep2 = createCepXpdr(
+                    spcXpdrNetwork, TapiStringConstants.OTSI_MC,
+                    TapiStringConstants.XPDR, LayerProtocolName.PHOTONICMEDIA);
+            putXpdrCepInTopologyContext(
+                xpdr, spcXpdrNetwork, TapiStringConstants.OTSI_MC, TapiStringConstants.XPDR, netCep2);
+//            ConnectionEndPoint netCep3 = createCepXpdr(spcXpdrNetwork, TapiStringConstants.I_OTSI,
+//                TapiStringConstants.XPDR, LayerProtocolName.PHOTONICMEDIA);
+//            putXpdrCepInTopologyContext(xpdr, spcXpdrNetwork, TapiStringConstants.I_OTSI, TapiStringConstants.OTSI,
+//                netCep3);
             cepMap.put(netCep1.key(), netCep1);
             cepMap.put(netCep2.key(), netCep2);
-            cepMap.put(netCep3.key(), netCep3);
-
-            // Create x connection between I_OTSi and E_OTSi within xpdr
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-                connection = createXCBetweenCeps(netCep2, netCep3, spcXpdrNetwork, spcXpdrNetwork,
-                TapiStringConstants.OTSI, LayerProtocolName.PHOTONICMEDIA);
-            this.connectionFullMap.put(connection.key(), connection);
+//            cepMap.put(netCep3.key(), netCep3);
 
-            // Create X connection that will be added to the service object
-            LowerConnection conn = new LowerConnectionBuilder().setConnectionUuid(connection.getUuid()).build();
-            xcMap.put(conn.key(), conn);
         }
-        // OTSi top connection between edge I_OTSI Xpdr
-        String spcXpdr1 = xpdrNetworkTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(0))).findFirst().get();
-        String spcXpdr2 = xpdrNetworkTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(xpdrNodelist.size() - 1))).findFirst().get();
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-            connection = createTopConnection(spcXpdr1, spcXpdr2, cepMap, TapiStringConstants.I_OTSI,
-            LayerProtocolName.PHOTONICMEDIA, xcMap);
+        // OTSi top connection between edge OTSI_MC Xpdr
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .connectivity.context.Connection connection =
+            createTopConnection(
+                //spcXpdr1,
+                xpdrNetworkTplist.stream().filter(adp -> adp.contains(xpdrNodelist.get(0)))
+                    .findFirst().orElseThrow(),
+                //spcXpdr2,
+                xpdrNetworkTplist.stream().filter(adp -> adp.contains(xpdrNodelist.get(xpdrNodelist.size() - 1)))
+                    .findFirst().orElseThrow(),
+                cepMap, TapiStringConstants.OTSI_MC,
+                LayerProtocolName.PHOTONICMEDIA, new HashMap<>(), this.topConnRdmRdm);
         this.connectionFullMap.put(connection.key(), connection);
-
         // OTSi top connection that will be added to the service object
         Connection conn = new ConnectionBuilder().setConnectionUuid(connection.getUuid()).build();
-        connServMap.put(conn.key(), conn);
-
-
-        return connServMap;
+        this.topConnXpdrXpdrPhtn = conn;
+        return new HashMap<>(Map.of(conn.key(), conn));
     }
 
-    private Map<ConnectionKey, Connection> createRoadmCepsAndConnections(List<String> rdmAddDropTplist,
-                                                                         List<String> rdmDegTplist,
-                                                                         List<String> rdmNodelist,
-                                                                         String edgeRoadm1, String edgeRoadm2) {
-        // TODO: when the number of roadms between 2 SPDR/XPDR is more thatn 1, we need to refine this code
-        Map<ConnectionKey, Connection> connServMap = new HashMap<>();
-        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey,
-            ConnectionEndPoint> cepMap = new HashMap<>();
-        Map<LowerConnectionKey, LowerConnection> xcMap = new HashMap<>();
+    private Map<ConnectionKey, Connection> createRoadmCepsAndConnections(
+            List<String> rdmAddDropTplist, List<String> rdmDegTplist, List<String> rdmNodelist,
+            String edgeRoadm1, String edgeRoadm2) {
+        // TODO: will need to check if things exist already or not
+        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .cep.list.ConnectionEndPointKey, ConnectionEndPoint> cepMap = new HashMap<>();
         // create ceps and x connections within roadm
+        Map<LowerConnectionKey, LowerConnection> xcLowerMap = new HashMap<>();
         for (String roadm : rdmNodelist) {
             LOG.info("Creating ceps and xc for roadm {}", roadm);
-            String spcRdmAD = rdmAddDropTplist.stream().filter(adp -> adp.contains(roadm)).findFirst().get();
-            LOG.info("AD port of ROADm {} = {}", roadm, spcRdmAD);
-            // There should be only 1 AD and 1 DEG per roadm
-            // TODO photonic media model should be updated to have the corresponding CEPs. I will just create
-            //  3 different MC CEPs giving different IDs to show that they are different
-            // Create 3 CEPs for each AD and DEG and the corresponding cross connections, matching the NEPs
-            // created in the topology creation
-            // add CEPs to the topology to the corresponding ONEP
-            ConnectionEndPoint adCep1 = createCepRoadm(spcRdmAD, TapiStringConstants.PHTNC_MEDIA);
-            putRdmCepInTopologyContext(roadm, spcRdmAD, TapiStringConstants.PHTNC_MEDIA, adCep1);
-            ConnectionEndPoint adCep2 = createCepRoadm(spcRdmAD, TapiStringConstants.MC);
-            putRdmCepInTopologyContext(roadm, spcRdmAD, TapiStringConstants.MC, adCep2);
-            ConnectionEndPoint adCep3 = createCepRoadm(spcRdmAD, TapiStringConstants.OTSI_MC);
-            putRdmCepInTopologyContext(roadm, spcRdmAD, TapiStringConstants.OTSI_MC, adCep3);
-            cepMap.put(adCep1.key(), adCep1);
-            cepMap.put(adCep2.key(), adCep2);
-            cepMap.put(adCep3.key(), adCep3);
-
-            String spcRdmDEG = rdmDegTplist.stream().filter(adp -> adp.contains(roadm)).findFirst().get();
-            LOG.info("Degree port of ROADm {} = {}", roadm, spcRdmDEG);
-
-            ConnectionEndPoint degCep1 = createCepRoadm(spcRdmDEG, TapiStringConstants.PHTNC_MEDIA);
-            putRdmCepInTopologyContext(roadm, spcRdmDEG, TapiStringConstants.PHTNC_MEDIA, degCep1);
-            ConnectionEndPoint degCep2 = createCepRoadm(spcRdmDEG, TapiStringConstants.MC);
-            putRdmCepInTopologyContext(roadm, spcRdmDEG, TapiStringConstants.MC, degCep2);
-            ConnectionEndPoint degCep3 = createCepRoadm(spcRdmDEG, TapiStringConstants.OTSI_MC);
-            putRdmCepInTopologyContext(roadm, spcRdmDEG, TapiStringConstants.OTSI_MC, degCep3);
-            cepMap.put(degCep1.key(), degCep1);
-            cepMap.put(degCep2.key(), degCep2);
-            cepMap.put(degCep3.key(), degCep3);
-
-            LOG.info("Going to create cross connections for ROADM {}", roadm);
-            // Create X connections between MC and OTSi_MC for full map
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-                connection1 = createXCBetweenCeps(adCep2, degCep2, spcRdmAD, spcRdmDEG, TapiStringConstants.MC,
-                LayerProtocolName.PHOTONICMEDIA);
-            LOG.info("Cross connection 1 created = {}", connection1);
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-                connection2 = createXCBetweenCeps(adCep3, degCep3, spcRdmAD, spcRdmDEG, TapiStringConstants.OTSI_MC,
-                LayerProtocolName.PHOTONICMEDIA);
-            LOG.info("Cross connection 2 created = {}", connection2);
-            this.connectionFullMap.put(connection1.key(), connection1);
-            this.connectionFullMap.put(connection2.key(), connection2);
-
-            // Create X connections that will be added to the service object
-            LowerConnection conn1 = new LowerConnectionBuilder().setConnectionUuid(connection1.getUuid()).build();
-            LowerConnection conn2 = new LowerConnectionBuilder().setConnectionUuid(connection2.getUuid()).build();
-
-            xcMap.put(conn1.key(), conn1);
-            xcMap.put(conn2.key(), conn2);
-        }
-        LOG.info("Going to create top connections betwee roadms");
-        // create top connections between roadms: MC connections between AD MC CEPs of roadms
-        for (int i = 0; i < rdmNodelist.size(); i++) {
-            if (rdmNodelist.size() <= (i + 1)) {
-                LOG.info("Reached last roadm. No more MC connections");
-                break;
+            if (roadm.equals(edgeRoadm1) || roadm.equals(edgeRoadm2)) {
+                LOG.info("EDGE ROADM, cross connections needed between SRG and DEG");
+                String spcRdmAD = rdmAddDropTplist.stream().filter(adp -> adp.contains(roadm))
+                    .findFirst().orElseThrow();
+                LOG.info("AD port of ROADm {} = {}", roadm, spcRdmAD);
+                // There should be only 1 AD and 1 DEG per roadm
+                // TODO photonic media model should be updated to have the corresponding CEPs. I will just create
+                //  3 different MC CEPs giving different IDs to show that they are different
+                // Create 3 CEPs for each AD and DEG and the corresponding cross connections, matching the NEPs
+                // created in the topology creation
+                // add CEPs to the topology to the corresponding ONEP
+                ConnectionEndPoint adCep1 = createCepRoadm(spcRdmAD, TapiStringConstants.PHTNC_MEDIA_OTS);
+                putRdmCepInTopologyContext(roadm, spcRdmAD, TapiStringConstants.PHTNC_MEDIA_OTS, adCep1);
+                ConnectionEndPoint adCep2 = createCepRoadm(spcRdmAD, TapiStringConstants.MC);
+                putRdmCepInTopologyContext(roadm, spcRdmAD, TapiStringConstants.MC, adCep2);
+                ConnectionEndPoint adCep3 = createCepRoadm(spcRdmAD, TapiStringConstants.OTSI_MC);
+                putRdmCepInTopologyContext(roadm, spcRdmAD, TapiStringConstants.OTSI_MC, adCep3);
+                cepMap.put(adCep1.key(), adCep1);
+                cepMap.put(adCep2.key(), adCep2);
+                cepMap.put(adCep3.key(), adCep3);
+
+                String spcRdmDEG = rdmDegTplist.stream().filter(adp -> adp.contains(roadm)).findFirst().orElseThrow();
+                LOG.info("Degree port of ROADm {} = {}", roadm, spcRdmDEG);
+
+                ConnectionEndPoint degCep0 = createCepRoadm(spcRdmDEG, TapiStringConstants.PHTNC_MEDIA_OTS);
+                putRdmCepInTopologyContext(roadm, spcRdmDEG, TapiStringConstants.PHTNC_MEDIA_OTS, degCep0);
+                ConnectionEndPoint degCep1 = createCepRoadm(spcRdmDEG, TapiStringConstants.PHTNC_MEDIA_OMS);
+                putRdmCepInTopologyContext(roadm, spcRdmDEG, TapiStringConstants.PHTNC_MEDIA_OMS, degCep1);
+                ConnectionEndPoint degCep2 = createCepRoadm(spcRdmDEG, TapiStringConstants.MC);
+                putRdmCepInTopologyContext(roadm, spcRdmDEG, TapiStringConstants.MC, degCep2);
+                ConnectionEndPoint degCep3 = createCepRoadm(spcRdmDEG, TapiStringConstants.OTSI_MC);
+                putRdmCepInTopologyContext(roadm, spcRdmDEG, TapiStringConstants.OTSI_MC, degCep3);
+                cepMap.put(degCep0.key(), degCep0);
+                cepMap.put(degCep1.key(), degCep1);
+                cepMap.put(degCep2.key(), degCep2);
+                cepMap.put(degCep3.key(), degCep3);
+
+                LOG.info("Going to create cross connections for ROADM {}", roadm);
+                // Create X connections between MC and OTSi_MC for full map
+                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                        .connectivity.context.Connection connection1 =
+                    createXCBetweenCeps(
+                        adCep2, degCep2, spcRdmAD, spcRdmDEG, TapiStringConstants.MC,
+                        LayerProtocolName.PHOTONICMEDIA);
+                LOG.info("Cross connection 1 created = {}", connection1);
+                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                        .connectivity.context.Connection connection2 =
+                    createXCBetweenCeps(
+                        adCep3, degCep3, spcRdmAD, spcRdmDEG, TapiStringConstants.OTSI_MC,
+                        LayerProtocolName.PHOTONICMEDIA);
+                LOG.info("Cross connection 2 created = {}", connection2);
+                this.connectionFullMap.put(connection1.key(), connection1);
+                this.connectionFullMap.put(connection2.key(), connection2);
+
+                // Create X connections that will be added to the service object
+                LowerConnection conn1 = new LowerConnectionBuilder().setConnectionUuid(connection1.getUuid()).build();
+                LowerConnection conn2 = new LowerConnectionBuilder().setConnectionUuid(connection2.getUuid()).build();
+
+                xcLowerMap.put(conn1.key(), conn1);
+                xcLowerMap.put(conn2.key(), conn2);
+            } else {
+                LOG.info("MIDDLE ROADM, cross connections needed between DEG and DEG");
+                String spcRdmDEG1 = rdmDegTplist.stream().filter(adp -> adp.contains(roadm)).findFirst().orElseThrow();
+                LOG.info("Degree 1 port of ROADm {} = {}", roadm, spcRdmDEG1);
+
+                ConnectionEndPoint deg1Cep0 = createCepRoadm(spcRdmDEG1, TapiStringConstants.PHTNC_MEDIA_OTS);
+                putRdmCepInTopologyContext(roadm, spcRdmDEG1, TapiStringConstants.PHTNC_MEDIA_OTS, deg1Cep0);
+                ConnectionEndPoint deg1Cep1 = createCepRoadm(spcRdmDEG1, TapiStringConstants.PHTNC_MEDIA_OMS);
+                putRdmCepInTopologyContext(roadm, spcRdmDEG1, TapiStringConstants.PHTNC_MEDIA_OMS, deg1Cep1);
+                ConnectionEndPoint deg1Cep2 = createCepRoadm(spcRdmDEG1, TapiStringConstants.MC);
+                putRdmCepInTopologyContext(roadm, spcRdmDEG1, TapiStringConstants.MC, deg1Cep2);
+                ConnectionEndPoint deg1Cep3 = createCepRoadm(spcRdmDEG1, TapiStringConstants.OTSI_MC);
+                putRdmCepInTopologyContext(roadm, spcRdmDEG1, TapiStringConstants.OTSI_MC, deg1Cep3);
+                cepMap.put(deg1Cep0.key(), deg1Cep0);
+                cepMap.put(deg1Cep1.key(), deg1Cep1);
+                cepMap.put(deg1Cep2.key(), deg1Cep2);
+                cepMap.put(deg1Cep3.key(), deg1Cep3);
+
+                String spcRdmDEG2 =
+                    rdmDegTplist.stream().filter(adp -> adp.contains(roadm)).skip(1).findFirst().orElseThrow();
+                LOG.info("Degree 2 port of ROADm {} = {}", roadm, spcRdmDEG2);
+
+                ConnectionEndPoint deg2Cep0 = createCepRoadm(spcRdmDEG2, TapiStringConstants.PHTNC_MEDIA_OTS);
+                putRdmCepInTopologyContext(roadm, spcRdmDEG2, TapiStringConstants.PHTNC_MEDIA_OTS, deg2Cep0);
+                ConnectionEndPoint deg2Cep1 = createCepRoadm(spcRdmDEG2, TapiStringConstants.PHTNC_MEDIA_OMS);
+                putRdmCepInTopologyContext(roadm, spcRdmDEG2, TapiStringConstants.PHTNC_MEDIA_OMS, deg2Cep1);
+                ConnectionEndPoint deg2Cep2 = createCepRoadm(spcRdmDEG2, TapiStringConstants.MC);
+                putRdmCepInTopologyContext(roadm, spcRdmDEG2, TapiStringConstants.MC, deg2Cep2);
+                ConnectionEndPoint deg2Cep3 = createCepRoadm(spcRdmDEG2, TapiStringConstants.OTSI_MC);
+                putRdmCepInTopologyContext(roadm, spcRdmDEG2, TapiStringConstants.OTSI_MC, deg2Cep3);
+                cepMap.put(deg2Cep0.key(), deg2Cep0);
+                cepMap.put(deg2Cep1.key(), deg2Cep1);
+                cepMap.put(deg2Cep2.key(), deg2Cep2);
+                cepMap.put(deg2Cep3.key(), deg2Cep3);
+
+                LOG.info("Going to create cross connections for ROADM {}", roadm);
+                // Create X connections between MC and OTSi_MC for full map
+                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                        .connectivity.context.Connection connection1 =
+                    createXCBetweenCeps(
+                        deg1Cep2, deg2Cep2, spcRdmDEG1, spcRdmDEG2,
+                        TapiStringConstants.MC, LayerProtocolName.PHOTONICMEDIA);
+                LOG.info("Cross connection 1 created = {}", connection1);
+                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                        .connectivity.context.Connection connection2 =
+                    createXCBetweenCeps(
+                        deg1Cep3, deg2Cep3, spcRdmDEG1, spcRdmDEG2,
+                        TapiStringConstants.OTSI_MC, LayerProtocolName.PHOTONICMEDIA);
+                LOG.info("Cross connection 2 created = {}", connection2.toString());
+                this.connectionFullMap.put(connection1.key(), connection1);
+                this.connectionFullMap.put(connection2.key(), connection2);
+
+                // Create X connections that will be added to the service object
+                LowerConnection conn1 = new LowerConnectionBuilder().setConnectionUuid(connection1.getUuid()).build();
+                xcLowerMap.put(conn1.key(), conn1);
+                LowerConnection conn2 = new LowerConnectionBuilder().setConnectionUuid(connection2.getUuid()).build();
+                xcLowerMap.put(conn2.key(), conn2);
             }
-            // Current roadm with roadm i + 1 --> MC
-            String roadm1 = rdmNodelist.get(i);
-            String spcRdmAD1 = rdmAddDropTplist.stream().filter(adp -> adp.contains(roadm1)).findFirst().get();
-            String roadm2 = rdmNodelist.get(i + 1);
-            String spcRdmAD2 = rdmAddDropTplist.stream().filter(adp -> adp.contains(roadm2)).findFirst().get();
-            LOG.info("Creating top connection from {} to {} between tps: {}-{}", roadm1, roadm2, spcRdmAD1, spcRdmAD2);
-
-            // Create top connections between MC for full map
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-                connection = createTopConnection(spcRdmAD1, spcRdmAD2, cepMap, TapiStringConstants.MC,
-                LayerProtocolName.PHOTONICMEDIA, xcMap);
-            this.connectionFullMap.put(connection.key(), connection);
-            LOG.info("Top connection created = {}", connection);
-
-            // Create top connections that will be added to the service object
-            Connection conn = new ConnectionBuilder().setConnectionUuid(connection.getUuid()).build();
-            connServMap.put(conn.key(), conn);
-            LowerConnection conn1 = new LowerConnectionBuilder().setConnectionUuid(connection.getUuid()).build();
-            xcMap.put(conn1.key(), conn1);
         }
+        LOG.info("Going to create top connections between roadms");
+        String spcRdmAD1 = rdmAddDropTplist.stream().filter(adp -> adp.contains(edgeRoadm1)).findFirst().orElseThrow();
+        String spcRdmAD2 = rdmAddDropTplist.stream().filter(adp -> adp.contains(edgeRoadm2)).findFirst().orElseThrow();
+        // MC top connection between edge roadms
+        LOG.info("Going to created top connection between MC");
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .connectivity.context.Connection connection =
+            createTopConnection(
+                spcRdmAD1, spcRdmAD2, cepMap, TapiStringConstants.MC,
+                LayerProtocolName.PHOTONICMEDIA, xcLowerMap, null);
+        this.connectionFullMap.put(connection.key(), connection);
+        LOG.info("Top connection created = {}", connection);
 
+        LowerConnection conn1 = new LowerConnectionBuilder().setConnectionUuid(connection.getUuid()).build();
         // OTSiMC top connection between edge roadms
         LOG.info("Going to created top connection between OTSiMC");
-        String spcRdmAD1 = rdmAddDropTplist.stream().filter(adp -> adp.contains(edgeRoadm1)).findFirst().get();
-        String spcRdmAD2 = rdmAddDropTplist.stream().filter(adp -> adp.contains(edgeRoadm2)).findFirst().get();
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-            connection = createTopConnection(spcRdmAD1, spcRdmAD2, cepMap, TapiStringConstants.OTSI_MC,
-            LayerProtocolName.PHOTONICMEDIA, xcMap);
-        this.connectionFullMap.put(connection.key(), connection);
-        LOG.info("Top connection created = {}", connection);
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .connectivity.context.Connection connection1 =
+            createTopConnection(
+                spcRdmAD1, spcRdmAD2, cepMap, TapiStringConstants.OTSI_MC,
+                LayerProtocolName.PHOTONICMEDIA,
+                //topLowerMap,
+                new HashMap<>(Map.of(conn1.key(), conn1)),
+                null);
+        this.connectionFullMap.put(connection1.key(), connection1);
+        LOG.info("Top connection created = {}", connection1);
 
         // OTSiMC top connections that will be added to the service object
         Connection conn = new ConnectionBuilder().setConnectionUuid(connection.getUuid()).build();
-        connServMap.put(conn.key(), conn);
-        return connServMap;
+        Connection conn2 = new ConnectionBuilder().setConnectionUuid(connection1.getUuid()).build();
+        this.topConnRdmRdm = conn2;
+        return new HashMap<>(Map.of(conn.key(), conn, conn2.key(), conn2));
     }
 
-    private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-            createTopConnection(String tp1, String tp2,
-                        Map<org.opendaylight.yang.gen.v1.urn
-                            .onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey,
-                            ConnectionEndPoint> cepMap, String qual, LayerProtocolName topPortocol,
-                                Map<LowerConnectionKey, LowerConnection> xcMap) {
+    private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .connectivity.context.Connection createTopConnection(
+            String tp1,
+            String tp2,
+            Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                    .cep.list.ConnectionEndPointKey, ConnectionEndPoint> cepMap,
+            String qual, LayerProtocolName topPortocol,
+            Map<LowerConnectionKey, LowerConnection> xcMap,
+            Connection additionalLowerConn) {
         // find cep for each AD MC of roadm 1 and 2
-        LOG.info("Top connection name = {}", String.join("+", "TOP", tp1, tp2, qual));
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.ConnectionEndPoint adCep1 =
-            cepMap.get(new org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey(
-                new Uuid(UUID.nameUUIDFromBytes((String.join("+", "CEP", tp1.split("\\+")[0],
-                    qual, tp1.split("\\+")[1])).getBytes(Charset.forName("UTF-8")))
-                    .toString())));
+        String topConnName = String.join("+", "TOP", tp1, tp2, qual);
+        LOG.info("Top connection name = {}", topConnName);
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.ConnectionEndPoint adCep1 =
+            cepMap.get(
+                new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                        .cep.list.ConnectionEndPointKey(new Uuid(UUID.nameUUIDFromBytes(
+                    (String.join("+", "CEP", tp1.split("\\+")[0], qual, tp1.split("\\+")[1]))
+                        .getBytes(StandardCharsets.UTF_8)).toString())));
         LOG.info("ADCEP1 = {}", adCep1);
-        org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPoint cep1 =
-            new org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPointBuilder()
-                .setNodeEdgePointUuid(adCep1.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeEdgePointUuid())
-                .setTopologyUuid(adCep1.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getTopologyUuid())
-                .setNodeUuid(adCep1.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeUuid())
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .connection.ConnectionEndPoint cep1 =
+            new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                    .connection.ConnectionEndPointBuilder()
+                .setNodeEdgePointUuid(adCep1.getParentNodeEdgePoint().getNodeEdgePointUuid())
+                .setNodeUuid(adCep1.getParentNodeEdgePoint().getNodeUuid())
+                .setTopologyUuid(adCep1.getParentNodeEdgePoint().getTopologyUuid())
                 .setConnectionEndPointUuid(adCep1.getUuid())
                 .build();
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.ConnectionEndPoint adCep2 =
-            cepMap.get(new org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey(
-                new Uuid(UUID.nameUUIDFromBytes((String.join("+", "CEP", tp2.split("\\+")[0],
-                    qual, tp2.split("\\+")[1])).getBytes(Charset.forName("UTF-8")))
-                    .toString())));
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.ConnectionEndPoint adCep2 =
+            cepMap.get(
+                new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                        .cep.list.ConnectionEndPointKey(
+                    new Uuid(UUID.nameUUIDFromBytes(
+                        (String.join("+", "CEP", tp2.split("\\+")[0], qual, tp2.split("\\+")[1]))
+                            .getBytes(StandardCharsets.UTF_8)).toString())));
         LOG.info("ADCEP2 = {}", adCep2);
-        org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPoint cep2 =
-            new org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPointBuilder()
-                .setNodeEdgePointUuid(adCep2.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeEdgePointUuid())
-                .setTopologyUuid(adCep2.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getTopologyUuid())
-                .setNodeUuid(adCep2.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeUuid())
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .connection.ConnectionEndPoint cep2 =
+            new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                    .connection.ConnectionEndPointBuilder()
+                .setNodeEdgePointUuid(adCep2.getParentNodeEdgePoint().getNodeEdgePointUuid())
+                .setNodeUuid(adCep2.getParentNodeEdgePoint().getNodeUuid())
+                .setTopologyUuid(adCep2.getParentNodeEdgePoint().getTopologyUuid())
                 .setConnectionEndPointUuid(adCep1.getUuid())
                 .build();
-        Map<ConnectionEndPointKey, org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPoint> ceps = new HashMap<>();
-        ceps.put(cep1.key(), cep1);
-        ceps.put(cep2.key(), cep2);
         Name connName = new NameBuilder()
             .setValueName("Connection name")
-            .setValue(String.join("+", "TOP", tp1, tp2, qual))
+            .setValue(topConnName)
             .build();
         // TODO: lower connection, supported link.......
-        return new org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectionBuilder()
-            .setUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", "TOP", tp1, tp2, qual))
-                .getBytes(Charset.forName("UTF-8"))).toString()))
+        if (additionalLowerConn != null) {
+            xcMap.putIfAbsent(new LowerConnectionKey(additionalLowerConn.getConnectionUuid()),
+                new LowerConnectionBuilder().setConnectionUuid(additionalLowerConn.getConnectionUuid()).build());
+        }
+        return new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .connectivity.context.ConnectionBuilder()
+            .setUuid(new Uuid(UUID.nameUUIDFromBytes(topConnName.getBytes(StandardCharsets.UTF_8)).toString()))
             .setName(Map.of(connName.key(), connName))
-            .setConnectionEndPoint(ceps)
+            .setConnectionEndPoint(new HashMap<>(Map.of(cep1.key(), cep1, cep2.key(), cep2)))
             .setOperationalState(OperationalState.ENABLED)
             .setLayerProtocolName(topPortocol)
             .setLifecycleState(LifecycleState.INSTALLED)
@@ -896,52 +1103,43 @@ public final class ConnectivityUtils {
             .build();
     }
 
-    private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-            createXCBetweenCeps(ConnectionEndPoint cep1, ConnectionEndPoint cep2, String tp1, String tp2, String qual,
-                        LayerProtocolName xcProtocol) {
+    private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .connectivity.context.Connection createXCBetweenCeps(
+            ConnectionEndPoint cep1, ConnectionEndPoint cep2,
+            String tp1, String tp2, String qual, LayerProtocolName xcProtocol) {
+        String crossConnName = String.join("+", "XC", tp1, tp2, qual);
         LOG.info("Creation cross connection between: {} and {}", tp1, tp2);
-        LOG.info("Cross connection name = {}", String.join("+", "XC", tp1, tp2, qual));
-        LOG.info("CEP1 = {}", cep1.getClientNodeEdgePoint());
-        LOG.info("CEP2 = {}", cep2.getClientNodeEdgePoint());
-        org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPoint cepServ1 =
-            new org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPointBuilder()
-                .setNodeEdgePointUuid(cep1.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeEdgePointUuid())
-                .setTopologyUuid(cep1.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getTopologyUuid())
-                .setNodeUuid(cep1.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeUuid())
+        LOG.info("Cross connection name = {}", crossConnName);
+        LOG.debug("Parent NEP of CEP1 = {}", cep1.getParentNodeEdgePoint());
+        LOG.debug("Parent NEP CEP2 = {}", cep2.getParentNodeEdgePoint());
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .connection.ConnectionEndPoint cepServ1 =
+            new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                    .connection.ConnectionEndPointBuilder()
+                .setNodeEdgePointUuid(cep1.getParentNodeEdgePoint().getNodeEdgePointUuid())
+                .setNodeUuid(cep1.getParentNodeEdgePoint().getNodeUuid())
+                .setTopologyUuid(cep1.getParentNodeEdgePoint().getTopologyUuid())
                 .setConnectionEndPointUuid(cep1.getUuid())
                 .build();
-        org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPoint cepServ2 =
-            new org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPointBuilder()
-                .setNodeEdgePointUuid(cep2.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeEdgePointUuid())
-                .setTopologyUuid(cep2.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getTopologyUuid())
-                .setNodeUuid(cep2.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeUuid())
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .connection.ConnectionEndPoint cepServ2 =
+            new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                    .connection.ConnectionEndPointBuilder()
+                .setNodeEdgePointUuid(cep2.getParentNodeEdgePoint().getNodeEdgePointUuid())
+                .setNodeUuid(cep2.getParentNodeEdgePoint().getNodeUuid())
+                .setTopologyUuid(cep2.getParentNodeEdgePoint().getTopologyUuid())
                 .setConnectionEndPointUuid(cep2.getUuid())
                 .build();
-        Map<ConnectionEndPointKey, org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPoint> ceps = new HashMap<>();
-        ceps.put(cepServ1.key(), cepServ1);
-        ceps.put(cepServ2.key(), cepServ2);
         Name connName = new NameBuilder()
             .setValueName("Connection name")
-            .setValue(String.join("+", "XC", tp1, tp2, qual))
+            .setValue(crossConnName)
             .build();
         // TODO: lower connection, supported link.......
-        return new org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectionBuilder()
-            .setUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", "XC", tp1, tp2, qual))
-                .getBytes(Charset.forName("UTF-8"))).toString()))
+        return new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .connectivity.context.ConnectionBuilder()
+            .setUuid(new Uuid(UUID.nameUUIDFromBytes(crossConnName.getBytes(StandardCharsets.UTF_8)).toString()))
             .setName(Map.of(connName.key(), connName))
-            .setConnectionEndPoint(ceps)
+            .setConnectionEndPoint(new HashMap<>(Map.of(cepServ1.key(), cepServ1, cepServ2.key(), cepServ2)))
             .setOperationalState(OperationalState.ENABLED)
             .setLayerProtocolName(xcProtocol)
             .setLifecycleState(LifecycleState.INSTALLED)
@@ -950,74 +1148,143 @@ public final class ConnectivityUtils {
     }
 
     private ConnectionEndPoint createCepRoadm(String id, String qualifier) {
-        LOG.info("NEP = {}", String.join("+", id.split("\\+")[0], qualifier, id.split("\\+")[1]));
+        String nepId = String.join("+", id.split("\\+")[0], qualifier, id.split("\\+")[1]);
+        String nodeNepId = String.join("+",id.split("\\+")[0], TapiStringConstants.PHTNC_MEDIA);
+        LOG.info("NEP = {}", nepId);
         Name cepName = new NameBuilder()
             .setValueName("ConnectionEndPoint name")
-            .setValue(String.join("+", id.split("\\+")[0], qualifier,
-                id.split("\\+")[1]))
+            .setValue(nepId)
+            .build();
+        ParentNodeEdgePoint pnep = new ParentNodeEdgePointBuilder()
+            .setNodeEdgePointUuid(new Uuid(UUID.nameUUIDFromBytes(
+                    nepId.getBytes(StandardCharsets.UTF_8))
+                .toString()))
+            .setNodeUuid(new Uuid(UUID.nameUUIDFromBytes(
+                    nodeNepId.getBytes(StandardCharsets.UTF_8))
+                .toString()))
+            .setTopologyUuid(new Uuid(UUID.nameUUIDFromBytes(
+                    TapiStringConstants.T0_FULL_MULTILAYER.getBytes(StandardCharsets.UTF_8))
+                .toString()))
             .build();
+        String clientQualifier = "";
+        switch (qualifier) {
+            case TapiStringConstants.PHTNC_MEDIA_OTS:
+                clientQualifier = TapiStringConstants.PHTNC_MEDIA_OMS;
+                break;
+            case TapiStringConstants.PHTNC_MEDIA_OMS:
+                clientQualifier = TapiStringConstants.MC;
+                OwnedNodeEdgePoint onepMC = createRoadmNep(id.split("\\+")[0], id.split("\\+")[1],
+                    false, OperationalState.ENABLED, AdministrativeState.UNLOCKED, clientQualifier);
+                putRdmNepInTopologyContext(id.split("\\+")[0], id.split("\\+")[1], TapiStringConstants.MC, onepMC);
+                break;
+            case TapiStringConstants.MC:
+                clientQualifier = TapiStringConstants.OTSI_MC;
+                OwnedNodeEdgePoint onepOTSiMC = createRoadmNep(id.split("\\+")[0], id.split("\\+")[1],
+                    false, OperationalState.ENABLED, AdministrativeState.UNLOCKED, clientQualifier);
+                putRdmNepInTopologyContext(id.split("\\+")[0], id.split("\\+")[1],
+                    TapiStringConstants.OTSI_MC, onepOTSiMC);
+                break;
+            default:
+                LOG.debug("not currently handling client NEP for OTSiMC CEP {}", nepId);
+                break;
+        }
         ClientNodeEdgePoint cnep = new ClientNodeEdgePointBuilder()
-            .setNodeEdgePointUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", id.split("\\+")[0],
-                qualifier, id.split("\\+")[1])).getBytes(Charset.forName("UTF-8")))
+            .setNodeEdgePointUuid(new Uuid(UUID.nameUUIDFromBytes(
+                    (String.join("+", id.split("\\+")[0], clientQualifier, id.split("\\+")[1]))
+                        .getBytes(StandardCharsets.UTF_8))
                 .toString()))
-            .setNodeUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+",id.split("\\+")[0],
-                qualifier)).getBytes(Charset.forName("UTF-8")))
+            .setNodeUuid(new Uuid(UUID.nameUUIDFromBytes(
+                    nodeNepId.getBytes(StandardCharsets.UTF_8))
+                .toString()))
+            .setTopologyUuid(new Uuid(UUID.nameUUIDFromBytes(
+                    TapiStringConstants.T0_FULL_MULTILAYER.getBytes(StandardCharsets.UTF_8))
                 .toString()))
-            .setTopologyUuid(new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
-                .getBytes(Charset.forName("UTF-8"))).toString()))
             .build();
         // TODO: add augmentation with the corresponding cep-spec (i.e. MC, OTSiMC...)
         // TODO: add parent ONEP??
         ConnectionEndPointBuilder cepBldr = new ConnectionEndPointBuilder()
-            .setUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", "CEP", id.split("\\+")[0],
-                qualifier, id.split("\\+")[1])).getBytes(Charset.forName("UTF-8")))
+            .setUuid(new Uuid(UUID.nameUUIDFromBytes(
+                    (String.join("+", "CEP", id.split("\\+")[0], qualifier, id.split("\\+")[1]))
+                        .getBytes(StandardCharsets.UTF_8))
                 .toString()))
-            .setClientNodeEdgePoint(Map.of(cnep.key(), cnep))
+            .setParentNodeEdgePoint(pnep)
             .setName(Map.of(cepName.key(), cepName))
             .setConnectionPortRole(PortRole.SYMMETRIC)
-            .setConnectionPortDirection(PortDirection.BIDIRECTIONAL)
+            .setDirection(Direction.BIDIRECTIONAL)
             .setOperationalState(OperationalState.ENABLED)
             .setLifecycleState(LifecycleState.INSTALLED)
             .setLayerProtocolName(LayerProtocolName.PHOTONICMEDIA);
-        return cepBldr.build();
+        return TapiStringConstants.OTSI_MC.equals(qualifier)
+            ? cepBldr.build()
+            : cepBldr.setClientNodeEdgePoint(Map.of(cnep.key(), cnep)).build();
     }
 
-    private ConnectionEndPoint createCepXpdr(String id, String qualifier, String nodeLayer,
-                                             LayerProtocolName cepProtocol) {
+    private ConnectionEndPoint createCepXpdr(
+            String id, String qualifier, String nodeLayer, LayerProtocolName cepProtocol) {
+        String nepId = String.join("+", id.split("\\+")[0], qualifier, id.split("\\+")[1]);
+        String nepNodeId = String.join("+",id.split("\\+")[0], TapiStringConstants.XPDR);
         Name cepName = new NameBuilder()
             .setValueName("ConnectionEndPoint name")
-            .setValue(String.join("+", id.split("\\+")[0], qualifier,
-                id.split("\\+")[1]))
+            .setValue(nepId)
+            .build();
+        ParentNodeEdgePoint pnep = new ParentNodeEdgePointBuilder()
+            .setNodeEdgePointUuid(new Uuid(UUID.nameUUIDFromBytes(
+                    nepId.getBytes(StandardCharsets.UTF_8)).toString()))
+            .setNodeUuid(new Uuid(UUID.nameUUIDFromBytes(
+                    nepNodeId.getBytes(StandardCharsets.UTF_8)).toString()))
+            .setTopologyUuid(new Uuid(UUID.nameUUIDFromBytes(
+                TapiStringConstants.T0_FULL_MULTILAYER
+                    .getBytes(StandardCharsets.UTF_8)).toString()))
             .build();
+        String clientQualifier = "";
+        String clientNodeLayer = TapiStringConstants.PHTNC_MEDIA;
+        switch (qualifier) {
+            case TapiStringConstants.PHTNC_MEDIA_OTS:
+                clientQualifier = TapiStringConstants.OTSI_MC;
+                break;
+            case TapiStringConstants.OTSI_MC:
+                clientQualifier = TapiStringConstants.E_ODU;
+                clientNodeLayer = TapiStringConstants.ODU;
+                break;
+            case TapiStringConstants.E_ODU:
+                clientQualifier = TapiStringConstants.DSR;
+                clientNodeLayer = TapiStringConstants.DSR;
+                break;
+            default :
+                LOG.debug("no client CEP for DSR NEP {}", nepId);
+                break;
+        }
         ClientNodeEdgePoint cnep = new ClientNodeEdgePointBuilder()
-            .setNodeEdgePointUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", id.split("\\+")[0],
-                qualifier, id.split("\\+")[1])).getBytes(Charset.forName("UTF-8")))
-                .toString()))
-            .setNodeUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+",id.split("\\+")[0],
-                nodeLayer)).getBytes(Charset.forName("UTF-8")))
-                .toString()))
-            .setTopologyUuid(new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
-                .getBytes(Charset.forName("UTF-8"))).toString()))
+            .setNodeEdgePointUuid(new Uuid(UUID.nameUUIDFromBytes(
+                (String.join("+", id.split("\\+")[0], clientQualifier, id.split("\\+")[1]))
+                    .getBytes(StandardCharsets.UTF_8)).toString()))
+            .setNodeUuid(new Uuid(UUID.nameUUIDFromBytes(
+                    nepNodeId.getBytes(StandardCharsets.UTF_8)).toString()))
+            .setTopologyUuid(new Uuid(UUID.nameUUIDFromBytes(
+                TapiStringConstants.T0_FULL_MULTILAYER
+                    .getBytes(StandardCharsets.UTF_8)).toString()))
             .build();
         // TODO: add augmentation with the corresponding cep-spec (i.e. MC, OTSiMC...)
         // TODO: add parent ONEP??
         ConnectionEndPointBuilder cepBldr = new ConnectionEndPointBuilder()
-            .setUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", "CEP", id.split("\\+")[0],
-                qualifier, id.split("\\+")[1])).getBytes(Charset.forName("UTF-8")))
-                .toString()))
-            .setClientNodeEdgePoint(Map.of(cnep.key(), cnep))
+            .setUuid(new Uuid(UUID.nameUUIDFromBytes(
+                (String.join("+", "CEP", id.split("\\+")[0], qualifier, id.split("\\+")[1]))
+                    .getBytes(StandardCharsets.UTF_8)).toString()))
+            .setParentNodeEdgePoint(pnep)
             .setName(Map.of(cepName.key(), cepName))
             .setConnectionPortRole(PortRole.SYMMETRIC)
-            .setConnectionPortDirection(PortDirection.BIDIRECTIONAL)
+            .setDirection(Direction.BIDIRECTIONAL)
             .setOperationalState(OperationalState.ENABLED)
             .setLifecycleState(LifecycleState.INSTALLED)
             .setLayerProtocolName(cepProtocol);
-        return cepBldr.build();
+        return TapiStringConstants.DSR.equals(qualifier)
+            ? cepBldr.build()
+            : cepBldr.setClientNodeEdgePoint(Map.of(cnep.key(), cnep)).build();
     }
 
     private EndPoint mapServiceZEndPoint(
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceZEnd
-                serviceZEnd, PathDescription pathDescription) {
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
+                .service.ServiceZEnd serviceZEnd, PathDescription pathDescription) {
         EndPointBuilder endPointBuilder = new EndPointBuilder();
         // 1. Service Format: ODU, OTU, ETH
         ServiceFormat serviceFormat = serviceZEnd.getServiceFormat();
@@ -1041,12 +1308,11 @@ public final class ConnectivityUtils {
             default:
                 LOG.error("Service Format not supported");
         }
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.local._class.Name name =
-            new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.local._class.NameBuilder()
+        var portZEnd = serviceZEnd.getTxDirection().values().stream().findFirst().orElseThrow().getPort();
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.local._class.Name name =
+            new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.local._class.NameBuilder()
                 .setValueName("OpenROADM info")
-                .setValue(String.join("-", serviceZEnd.getClli(),
-                    serviceZEnd.getTxDirection().values().stream().findFirst().get().getPort().getPortDeviceName(),
-                    serviceZEnd.getTxDirection().values().stream().findFirst().get().getPort().getPortName()))
+                .setValue(String.join("-", serviceZEnd.getClli(), portZEnd.getPortDeviceName(), portZEnd.getPortName()))
                 .build();
         return endPointBuilder
             .setServiceInterfacePoint(new ServiceInterfacePointBuilder()
@@ -1054,27 +1320,26 @@ public final class ConnectivityUtils {
                 .build())
             .setName(Map.of(name.key(), name))
             .setAdministrativeState(AdministrativeState.UNLOCKED)
-            .setDirection(PortDirection.BIDIRECTIONAL)
+            .setDirection(Direction.BIDIRECTIONAL)
             .setLifecycleState(LifecycleState.INSTALLED)
             .setOperationalState(OperationalState.ENABLED)
             .setLayerProtocolName(layerProtocols)
             .setCapacity(new CapacityBuilder()
                 .setTotalSize(new TotalSizeBuilder()
-                    .setValue(Uint64.valueOf(serviceZEnd.getServiceRate()))
-                    .setUnit(CapacityUnit.GBPS)
+                    .setValue(Decimal64.valueOf(BigDecimal.valueOf(serviceZEnd.getServiceRate().doubleValue())))
+                    .setUnit(CAPACITYUNITGBPS.VALUE)
                     .build())
-                .setBandwidthProfile(new BandwidthProfileBuilder().build()) // TODO: implement bandwidth profile
+//                .setBandwidthProfile(new BandwidthProfileBuilder().build()) // TODO: implement bandwidth profile
                 .build())
             .setProtectionRole(ProtectionRole.WORK)
             .setRole(PortRole.SYMMETRIC)
-            .setLocalId(serviceZEnd.getTxDirection().values().stream().findFirst().get()
-                .getPort().getPortDeviceName())
+            .setLocalId(portZEnd.getPortDeviceName())
             .build();
     }
 
     private EndPoint mapServiceAEndPoint(
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceAEnd
-                serviceAEnd, PathDescription pathDescription) {
+        org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.ServiceAEnd
+            serviceAEnd, PathDescription pathDescription) {
         EndPointBuilder endPointBuilder = new EndPointBuilder();
         // 1. Service Format: ODU, OTU, ETH
         ServiceFormat serviceFormat = serviceAEnd.getServiceFormat();
@@ -1098,12 +1363,11 @@ public final class ConnectivityUtils {
             default:
                 LOG.error("Service Format not supported");
         }
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.local._class.Name name =
-            new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.local._class.NameBuilder()
+        var portAEnd = serviceAEnd.getTxDirection().values().stream().findFirst().orElseThrow().getPort();
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.local._class.Name name =
+            new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.local._class.NameBuilder()
                 .setValueName("OpenROADM info")
-                .setValue(String.join("-", serviceAEnd.getClli(),
-                    serviceAEnd.getTxDirection().values().stream().findFirst().get().getPort().getPortDeviceName(),
-                    serviceAEnd.getTxDirection().values().stream().findFirst().get().getPort().getPortName()))
+                .setValue(String.join("-", serviceAEnd.getClli(), portAEnd.getPortDeviceName(), portAEnd.getPortName()))
                 .build();
         return endPointBuilder
             .setServiceInterfacePoint(new ServiceInterfacePointBuilder()
@@ -1111,301 +1375,243 @@ public final class ConnectivityUtils {
                 .build())
             .setName(Map.of(name.key(), name))
             .setAdministrativeState(AdministrativeState.UNLOCKED)
-            .setDirection(PortDirection.BIDIRECTIONAL)
+            .setDirection(Direction.BIDIRECTIONAL)
             .setLifecycleState(LifecycleState.INSTALLED)
             .setOperationalState(OperationalState.ENABLED)
             .setLayerProtocolName(layerProtocols)
             .setCapacity(new CapacityBuilder()
                 .setTotalSize(new TotalSizeBuilder()
-                    .setValue(Uint64.valueOf(serviceAEnd.getServiceRate()))
-                    .setUnit(CapacityUnit.GBPS)
+                    .setValue(Decimal64.valueOf(BigDecimal.valueOf(serviceAEnd.getServiceRate().doubleValue())))
+                    .setUnit(CAPACITYUNITGBPS.VALUE)
                     .build())
-                .setBandwidthProfile(new BandwidthProfileBuilder().build()) // TODO: implement bandwidth profile
+//                .setBandwidthProfile(new BandwidthProfileBuilder().build()) // TODO: implement bandwidth profile
                 .build())
             .setProtectionRole(ProtectionRole.WORK)
             .setRole(PortRole.SYMMETRIC)
-            .setLocalId(serviceAEnd.getTxDirection().values().stream().findFirst().get().getPort().getPortDeviceName())
+            .setLocalId(serviceAEnd.getTxDirection().values().stream().findFirst().orElseThrow().getPort()
+                    .getPortDeviceName())
             .build();
     }
 
     private Uuid getSipIdFromZend(Map<ZToAKey, ZToA> mapztoa, String serviceNodeId, ServiceFormat serviceFormat) {
-        Uuid zendUuid = null;
         if (serviceNodeId.contains("ROADM")) {
             // Service from ROADM to ROADM
             // AddDrop-AddDrop ports --> MC layer SIPs
-            ZToA firstElement = mapztoa.values().stream().filter(ztoa -> ztoa.getId().equals("0")).findFirst().get();
+            ZToA firstElement =
+                mapztoa.values().stream().filter(ztoa -> ztoa.getId().equals("0")).findFirst().orElseThrow();
             TerminationPoint tp = (TerminationPoint) firstElement.getResource().getResource();
-            Uuid sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP",
-                tp.getTpNodeId(), TapiStringConstants.MC, tp.getTpId())).getBytes(Charset.forName("UTF-8")))
-                .toString());
+            Uuid sipUuid = new Uuid(UUID.nameUUIDFromBytes(
+                (String.join("+", "SIP", tp.getTpNodeId(), TapiStringConstants.MC, tp.getTpId()))
+                    .getBytes(StandardCharsets.UTF_8)).toString());
             LOG.info("SIP name = {}", String.join("+", tp.getTpNodeId(), TapiStringConstants.MC, tp.getTpId()));
             for (ServiceInterfacePoint sip:this.sipMap.values()) {
-                if (!sip.getUuid().equals(sipUuid)) {
-                    LOG.info("SIP {} doesn match sipname {}", sip.getUuid().getValue(), sipUuid.getValue());
-                    continue;
+                if (sip.getUuid().equals(sipUuid)) {
+                    return sip.getUuid();
                 }
-                zendUuid = sip.getUuid();
-                break;
+                LOG.debug("SIP {} does not match sipname {}", sip.getUuid().getValue(), sipUuid.getValue());
             }
-        } else {
-            // Service from XPDR to XPDR
-            ZToA firstElement;
-            TerminationPoint tp;
-            Uuid sipUuid;
-            switch (serviceFormat) {
-                case ODU:
-                    firstElement = mapztoa.values().stream().filter(ztoa -> ztoa.getId().equals("2")).findFirst().get();
-                    tp = (TerminationPoint) firstElement.getResource().getResource();
-                    // Network-Network ports --> iODU layer SIPs TODO --> updated to E_ODU
-                    sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP",
-                        tp.getTpNodeId(), TapiStringConstants.I_ODU, tp.getTpId())).getBytes(Charset.forName("UTF-8")))
-                        .toString());
-                    LOG.info("SIP name = {}", String.join("+", tp.getTpNodeId(), TapiStringConstants.I_ODU,
-                        tp.getTpId()));
-                    break;
-                case OTU:
-                    firstElement = mapztoa.values().stream().filter(ztoa -> ztoa.getId().equals("2")).findFirst().get();
-                    tp = (TerminationPoint) firstElement.getResource().getResource();
-                    // Network-Network ports --> iOTSi layer SIPs
-                    sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP",
-                        tp.getTpNodeId(), TapiStringConstants.I_OTSI, tp.getTpId())).getBytes(Charset.forName("UTF-8")))
-                        .toString());
-                    LOG.info("SIP name = {}", String.join("+", tp.getTpNodeId(), TapiStringConstants.I_OTSI,
-                        tp.getTpId()));
-                    break;
-                case Ethernet:
-                    LOG.info("Elements ZA = {}", mapztoa.values().toString());
-                    firstElement = mapztoa.values().stream().filter(ztoa -> ztoa.getId().equals("0")).findFirst().get();
-                    tp = (TerminationPoint) firstElement.getResource().getResource();
-                    // Client-client ports --> DSR layer SIPs
-                    sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP",
-                        tp.getTpNodeId(), TapiStringConstants.DSR, tp.getTpId())).getBytes(Charset.forName("UTF-8")))
-                        .toString());
-                    LOG.info("SIP name = {}", String.join("+", tp.getTpNodeId(), TapiStringConstants.DSR,
-                        tp.getTpId()));
-                    break;
-                default:
-                    sipUuid = null;
-                    LOG.warn("Service format {} not supported (?)", serviceFormat.getName());
-            }
-            for (ServiceInterfacePoint sip:this.sipMap.values()) {
-                if (!sip.getUuid().equals(sipUuid)) {
-                    LOG.info("SIP {} doesn match sipname {}", sip.getUuid().getValue(), sipUuid.getValue());
-                    continue;
-                }
-                zendUuid = sip.getUuid();
+            return null;
+        }
+        // Service from XPDR to XPDR
+        ZToA firstElement;
+        TerminationPoint tp;
+        Uuid sipUuid;
+        switch (serviceFormat) {
+            case ODU:
+                firstElement =
+                    mapztoa.values().stream().filter(ztoa -> ztoa.getId().equals("2")).findFirst().orElseThrow();
+                tp = (TerminationPoint) firstElement.getResource().getResource();
+                // Network-Network ports --> iODU layer SIPs TODO --> updated to E_ODU
+                sipUuid = new Uuid(UUID.nameUUIDFromBytes(
+                    (String.join("+", "SIP", tp.getTpNodeId(), TapiStringConstants.I_ODU, tp.getTpId()))
+                        .getBytes(StandardCharsets.UTF_8)).toString());
+                LOG.info("SIP name = {}", String.join("+", tp.getTpNodeId(), TapiStringConstants.I_ODU, tp.getTpId()));
+                break;
+            case OTU:
+                firstElement =
+                    mapztoa.values().stream().filter(ztoa -> ztoa.getId().equals("2")).findFirst().orElseThrow();
+                tp = (TerminationPoint) firstElement.getResource().getResource();
+                // Network-Network ports --> iOTSi layer SIPs
+                sipUuid = new Uuid(UUID.nameUUIDFromBytes(
+                    (String.join("+", "SIP", tp.getTpNodeId(), TapiStringConstants.I_OTSI, tp.getTpId()))
+                        .getBytes(StandardCharsets.UTF_8)).toString());
+                LOG.info("SIP name = {}", String.join("+", tp.getTpNodeId(), TapiStringConstants.I_OTSI, tp.getTpId()));
+                break;
+            case Ethernet:
+                LOG.info("Elements ZA = {}", mapztoa.values());
+                firstElement =
+                    mapztoa.values().stream().filter(ztoa -> ztoa.getId().equals("0")).findFirst().orElseThrow();
+                tp = (TerminationPoint) firstElement.getResource().getResource();
+                // Client-client ports --> DSR layer SIPs
+                sipUuid = new Uuid(UUID.nameUUIDFromBytes(
+                    (String.join("+", "SIP", tp.getTpNodeId(), TapiStringConstants.DSR, tp.getTpId()))
+                        .getBytes(StandardCharsets.UTF_8)).toString());
+                LOG.info("SIP name = {}", String.join("+", tp.getTpNodeId(), TapiStringConstants.DSR, tp.getTpId()));
                 break;
+            default:
+                sipUuid = null;
+                LOG.warn("Service format {} not supported (?)", serviceFormat.getName());
+        }
+        for (ServiceInterfacePoint sip:this.sipMap.values()) {
+            if (sip.getUuid().equals(sipUuid)) {
+                return sip.getUuid();
             }
+            LOG.debug("SIP {} does not match sipname {}", sip.getUuid().getValue(), sipUuid.getValue());
         }
-        return zendUuid;
+        return null;
     }
 
     private Uuid getSipIdFromAend(Map<AToZKey, AToZ> mapatoz, String serviceNodeId, ServiceFormat serviceFormat) {
-        Uuid aendUuid = null;
         LOG.info("ServiceNode = {} and ServiceFormat = {}", serviceNodeId, serviceFormat.getName());
         LOG.info("Map a to z = {}", mapatoz);
         if (serviceNodeId.contains("ROADM")) {
             // Service from ROADM to ROADM
             // AddDrop-AddDrop ports --> MC layer SIPs
-            AToZ firstElement = mapatoz.values().stream().filter(atoz -> atoz.getId().equals("0")).findFirst().get();
+            AToZ firstElement =
+                mapatoz.values().stream().filter(atoz -> atoz.getId().equals("0")).findFirst().orElseThrow();
             LOG.info("First element of service path = {}", firstElement.getResource().getResource());
             TerminationPoint tp = (TerminationPoint) firstElement.getResource().getResource();
-            Uuid sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP",
-                tp.getTpNodeId(), TapiStringConstants.MC, tp.getTpId())).getBytes(Charset.forName("UTF-8")))
-                .toString());
-            LOG.info("ROADM SIP name = {}", String.join("+", tp.getTpNodeId(), TapiStringConstants.MC,
-                tp.getTpId()));
+            Uuid sipUuid = new Uuid(UUID.nameUUIDFromBytes(
+                (String.join("+", "SIP", tp.getTpNodeId(), TapiStringConstants.MC, tp.getTpId()))
+                    .getBytes(StandardCharsets.UTF_8)).toString());
+            LOG.info("ROADM SIP name = {}",
+                String.join("+", tp.getTpNodeId(), TapiStringConstants.MC, tp.getTpId()));
             for (ServiceInterfacePoint sip:this.sipMap.values()) {
-                if (!sip.getUuid().equals(sipUuid)) {
-                    LOG.info("SIP {} doesn match sipname {}", sip.getUuid().getValue(), sipUuid.getValue());
-                    continue;
+                if (sip.getUuid().equals(sipUuid)) {
+                    return sip.getUuid();
                 }
-                aendUuid = sip.getUuid();
-                break;
+                LOG.debug("SIP {} does not match sipname {}", sip.getUuid().getValue(), sipUuid.getValue());
             }
-        } else {
-            // Service from XPDR to XPDR
-            AToZ firstElement;
-            TerminationPoint tp;
-            Uuid sipUuid;
-            switch (serviceFormat) {
-                case ODU:
-                    firstElement = mapatoz.values().stream().filter(atoz -> atoz.getId().equals("2")).findFirst().get();
-                    tp = (TerminationPoint) firstElement.getResource().getResource();
-                    // Network-Network ports --> iODU layer SIPs. TODO -> updated to eODU
-                    sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP",
-                        tp.getTpNodeId(), TapiStringConstants.I_ODU, tp.getTpId())).getBytes(Charset.forName("UTF-8")))
-                        .toString());
-                    LOG.info("ODU XPDR SIP name = {}", String.join("+", tp.getTpNodeId(),
-                        TapiStringConstants.I_ODU, tp.getTpId()));
-                    break;
-                case OTU:
-                    firstElement = mapatoz.values().stream().filter(atoz -> atoz.getId().equals("2")).findFirst().get();
-                    tp = (TerminationPoint) firstElement.getResource().getResource();
-                    // Network-Network ports --> iOTSi layer SIPs
-                    sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP",
-                        tp.getTpNodeId(), TapiStringConstants.I_OTSI, tp.getTpId())).getBytes(Charset.forName("UTF-8")))
-                        .toString());
-                    LOG.info("OTU XPDR SIP name = {}", String.join("+", tp.getTpNodeId(),
-                        TapiStringConstants.I_OTSI, tp.getTpId()));
-                    break;
-                case Ethernet:
-                    LOG.info("Elements AZ = {}", mapatoz.values().toString());
-                    firstElement = mapatoz.values().stream().filter(atoz -> atoz.getId().equals("0")).findFirst().get();
-                    tp = (TerminationPoint) firstElement.getResource().getResource();
-                    // Client-client ports --> DSR layer SIPs
-                    sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP",
-                        tp.getTpNodeId(), TapiStringConstants.DSR, tp.getTpId())).getBytes(Charset.forName("UTF-8")))
-                        .toString());
-                    LOG.info("DSR XPDR SIP name = {}", String.join("+", tp.getTpNodeId(),
-                        TapiStringConstants.DSR, tp.getTpId()));
-                    break;
-                default:
-                    sipUuid = null;
-                    LOG.warn("Service format {} not supported (?)", serviceFormat.getName());
-            }
-            for (ServiceInterfacePoint sip:this.sipMap.values()) {
-                if (!sip.getUuid().equals(sipUuid)) {
-                    LOG.info("SIP {} doesn match sipname {}", sip.getUuid().getValue(), sipUuid.getValue());
-                    continue;
-                }
-                aendUuid = sip.getUuid();
+            return null;
+        }
+        // Service from XPDR to XPDR
+        AToZ firstElement;
+        TerminationPoint tp;
+        Uuid sipUuid;
+        switch (serviceFormat) {
+            case ODU:
+                firstElement =
+                    mapatoz.values().stream().filter(atoz -> atoz.getId().equals("2")).findFirst().orElseThrow();
+                tp = (TerminationPoint) firstElement.getResource().getResource();
+                // Network-Network ports --> iODU layer SIPs. TODO -> updated to eODU
+                sipUuid = new Uuid(UUID.nameUUIDFromBytes(
+                    (String.join("+", "SIP", tp.getTpNodeId(), TapiStringConstants.I_ODU, tp.getTpId()))
+                        .getBytes(StandardCharsets.UTF_8)).toString());
+                LOG.info("ODU XPDR SIP name = {}",
+                    String.join("+", tp.getTpNodeId(), TapiStringConstants.I_ODU, tp.getTpId()));
+                break;
+            case OTU:
+                firstElement =
+                    mapatoz.values().stream().filter(atoz -> atoz.getId().equals("2")).findFirst().orElseThrow();
+                tp = (TerminationPoint) firstElement.getResource().getResource();
+                // Network-Network ports --> iOTSi layer SIPs
+                sipUuid = new Uuid(UUID.nameUUIDFromBytes(
+                    (String.join("+", "SIP", tp.getTpNodeId(), TapiStringConstants.I_OTSI, tp.getTpId()))
+                        .getBytes(StandardCharsets.UTF_8)).toString());
+                LOG.info("OTU XPDR SIP name = {}",
+                    String.join("+", tp.getTpNodeId(), TapiStringConstants.I_OTSI, tp.getTpId()));
+                break;
+            case Ethernet:
+                LOG.info("Elements AZ = {}", mapatoz.values());
+                firstElement =
+                    mapatoz.values().stream().filter(atoz -> atoz.getId().equals("0")).findFirst().orElseThrow();
+                tp = (TerminationPoint) firstElement.getResource().getResource();
+                // Client-client ports --> DSR layer SIPs
+                sipUuid = new Uuid(UUID.nameUUIDFromBytes(
+                    (String.join("+", "SIP", tp.getTpNodeId(), TapiStringConstants.DSR, tp.getTpId()))
+                        .getBytes(StandardCharsets.UTF_8)).toString());
+                LOG.info("DSR XPDR SIP name = {}",
+                    String.join("+", tp.getTpNodeId(), TapiStringConstants.DSR, tp.getTpId()));
                 break;
+            default:
+                sipUuid = null;
+                LOG.warn("Service format {} not supported (?)", serviceFormat.getName());
+        }
+        for (ServiceInterfacePoint sip:this.sipMap.values()) {
+            if (sip.getUuid().equals(sipUuid)) {
+                return sip.getUuid();
             }
+            LOG.debug("SIP {} does not match sipname {}", sip.getUuid().getValue(), sipUuid.getValue());
         }
-        return aendUuid;
+        return null;
     }
 
     private void putRdmCepInTopologyContext(String node, String spcRdmAD, String qual, ConnectionEndPoint cep) {
-        LOG.info("NEP id before Merge = {}", String.join("+", node, qual, spcRdmAD.split("\\+")[1]));
-        LOG.info("Node of NEP id before Merge = {}", String.join("+", node, TapiStringConstants.PHTNC_MEDIA));
+        String nepId = String.join("+", node, qual, spcRdmAD.split("\\+")[1]);
+        String nodeNepId = String.join("+", node, TapiStringConstants.PHTNC_MEDIA);
+        LOG.info("NEP id before Merge = {}", nepId);
+        LOG.info("Node of NEP id before Merge = {}", nodeNepId);
         // Give uuids so that it is easier to look for things: topology uuid, node uuid, nep uuid, cep
-        Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", node, TapiStringConstants.PHTNC_MEDIA)
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", node, qual, spcRdmAD.split("\\+")[1])
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        this.tapiContext.updateTopologyWithCep(topoUuid, nodeUuid, nepUuid, cep);
+        this.tapiContext.updateTopologyWithCep(
+            //topoUuid,
+            new Uuid(UUID.nameUUIDFromBytes(
+                    TapiStringConstants.T0_FULL_MULTILAYER.getBytes(StandardCharsets.UTF_8)).toString()),
+            //nodeUuid,
+            new Uuid(UUID.nameUUIDFromBytes(nodeNepId.getBytes(StandardCharsets.UTF_8)).toString()),
+            //nepUuid,
+            new Uuid(UUID.nameUUIDFromBytes(nepId.getBytes(StandardCharsets.UTF_8)).toString()),
+            cep);
     }
 
-    private void putXpdrCepInTopologyContext(String node, String spcXpdrNet, String qual, String nodeLayer,
-                                             ConnectionEndPoint cep) {
+    private void putXpdrCepInTopologyContext(
+            String node, String spcXpdrNet, String qual, String nodeLayer, ConnectionEndPoint cep) {
         // Give uuids so that it is easier to look for things: topology uuid, node uuid, nep uuid, cep
-        Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", node, nodeLayer)
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", node, qual, spcXpdrNet.split("\\+")[1])
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        this.tapiContext.updateTopologyWithCep(topoUuid, nodeUuid, nepUuid, cep);
+        this.tapiContext.updateTopologyWithCep(
+            //topoUuid,
+            new Uuid(UUID.nameUUIDFromBytes(
+                    TapiStringConstants.T0_FULL_MULTILAYER.getBytes(StandardCharsets.UTF_8))
+                .toString()),
+            //nodeUuid,
+            new Uuid(UUID.nameUUIDFromBytes(
+                    String.join("+", node, nodeLayer).getBytes(StandardCharsets.UTF_8))
+                .toString()),
+            //nepUuid,
+            new Uuid(UUID.nameUUIDFromBytes(
+                    String.join("+", node, qual, spcXpdrNet.split("\\+")[1]).getBytes(StandardCharsets.UTF_8))
+                .toString()),
+            cep);
     }
 
-    public Map<org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectionKey,
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection>
-            getConnectionFullMap() {
-        return this.connectionFullMap;
-    }
 
-    private String getIdBasedOnModelVersion(String nodeid) {
-        return nodeid.matches("[A-Z]{5}-[A-Z0-9]{2}-.*") ? String.join("-", nodeid.split("-")[0],
-            nodeid.split("-")[1]) : nodeid.split("-")[0];
+    private void putRdmNepInTopologyContext(String orNodeId, String orTpId, String qual, OwnedNodeEdgePoint onep) {
+        String nepId = String.join("+", orNodeId, qual, orTpId);
+        String nepNodeId = String.join("+", orNodeId, TapiStringConstants.PHTNC_MEDIA);
+        LOG.info("NEP id before Merge = {}", nepId);
+        LOG.info("Node of NEP id before Merge = {}", nepNodeId);
+        // Give uuids so that it is easier to look for things: topology uuid, node uuid, nep uuid, cep
+        updateTopologyWithNep(
+            //topoUuid,
+             new Uuid(UUID.nameUUIDFromBytes(
+                    TapiStringConstants.T0_FULL_MULTILAYER.getBytes(Charset.forName("UTF-8")))
+                 .toString()),
+            //nodeUuid,
+            new Uuid(UUID.nameUUIDFromBytes(
+                    nepNodeId.getBytes(Charset.forName("UTF-8")))
+                .toString()),
+            //nepUuid,
+            new Uuid(UUID.nameUUIDFromBytes(
+                    nepId.getBytes(Charset.forName("UTF-8")))
+                .toString()),
+            onep);
     }
 
-    public ServiceCreateInput createORServiceInput(CreateConnectivityServiceInput input, Uuid serviceUuid) {
-        // TODO: not taking into account all the constraints. Only using EndPoints and Connectivity Constraint.
-        Map<org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.input.EndPointKey,
-            org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.input.EndPoint>
-            endPointMap = input.getEndPoint();
-        ConnectivityConstraint constraint = input.getConnectivityConstraint();
-        ConnectionType connType = null;
-        ServiceFormat serviceFormat = null;
-        String nodeAid = String.join("+", endPointMap.values().stream().findFirst().get().getLocalId(),
-            TapiStringConstants.DSR);
-        String nodeZid = String.join("+", endPointMap.values().stream().skip(1).findFirst().get().getLocalId(),
-            TapiStringConstants.DSR);
-        LOG.debug("Node a = {}", nodeAid);
-        LOG.debug("Node z = {}", nodeZid);
-        switch (constraint.getServiceLayer().getIntValue()) {
-            case 0:
-                LOG.info("ODU");
-                connType = ConnectionType.Infrastructure;
-                serviceFormat = ServiceFormat.ODU;
-                break;
-            case 1:
-                LOG.info("ETH, no need to create OTU and ODU");
-                connType = ConnectionType.Service;
-                serviceFormat = ServiceFormat.Ethernet;
-                break;
-            case 2:
-                LOG.info("DSR, need to create OTU and ODU");
-                connType = ConnectionType.Service;
-                serviceFormat = ServiceFormat.Ethernet;
-                break;
-            case 3:
-                LOG.info("PHOTONIC");
-                connType = getConnectionTypePhtnc(endPointMap.values());
-                serviceFormat = getServiceFormatPhtnc(endPointMap.values());
-                if (serviceFormat.equals(ServiceFormat.OC)) {
-                    nodeAid = String.join("+", endPointMap.values().stream().findFirst().get().getLocalId(),
-                        TapiStringConstants.PHTNC_MEDIA);
-                    nodeZid = String.join("+", endPointMap.values().stream().skip(1).findFirst().get().getLocalId(),
-                        TapiStringConstants.PHTNC_MEDIA);
-                } else {
-                    nodeAid = String.join("+", endPointMap.values().stream().findFirst().get().getLocalId(),
-                        TapiStringConstants.OTSI);
-                    nodeZid = String.join("+", endPointMap.values().stream().skip(1).findFirst().get().getLocalId(),
-                        TapiStringConstants.OTSI);
-                }
-                LOG.debug("Node a photonic = {}", nodeAid);
-                LOG.debug("Node z photonic = {}", nodeZid);
-                break;
-            default:
-                LOG.info("Service type {} not supported", constraint.getServiceLayer().getName());
-        }
-        // Requested Capacity for connectivity service
-        Uint64 capacity = input.getConnectivityConstraint().getRequestedCapacity().getTotalSize().getValue();
-        // map endpoints into service end points. Map the type of service from TAPI to OR
-        ServiceAEnd serviceAEnd = tapiEndPointToServiceAPoint(endPointMap.values().stream().findFirst().get(),
-            serviceFormat, nodeAid, capacity, constraint.getServiceLayer());
-        ServiceZEnd serviceZEnd = tapiEndPointToServiceZPoint(endPointMap.values().stream().skip(1).findFirst().get(),
-            serviceFormat, nodeZid, capacity, constraint.getServiceLayer());
-        if (serviceAEnd == null || serviceZEnd == null) {
-            LOG.error("Couldnt map endpoints to service end");
-            return null;
-        }
-        LOG.info("Service a end = {}", serviceAEnd);
-        LOG.info("Service z end = {}", serviceZEnd);
-        return new ServiceCreateInputBuilder()
-            .setServiceAEnd(serviceAEnd)
-            .setServiceZEnd(serviceZEnd)
-            .setConnectionType(connType)
-            .setServiceName(serviceUuid.getValue())
-            .setCommonId("common id")
-            .setSdncRequestHeader(new SdncRequestHeaderBuilder().setRequestId("request-1")
-                .setRpcAction(RpcActions.ServiceCreate).setNotificationUrl("notification url")
-                .setRequestSystemId("appname")
-                .build())
-            .setCustomer("customer")
-            .setDueDate(DateAndTime.getDefaultInstance("2018-06-15T00:00:01Z"))
-            .setOperatorContact("pw1234")
-            .build();
+    private String getIdBasedOnModelVersion(String nodeid) {
+        return nodeid.matches("[A-Z]{5}-[A-Z0-9]{2}-.*")
+            ? String.join("-", nodeid.split("-")[0], nodeid.split("-")[1])
+            : nodeid.split("-")[0];
     }
 
     private ServiceZEnd tapiEndPointToServiceZPoint(
-        org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.input.EndPoint endPoint,
-        ServiceFormat serviceFormat, String nodeZid, Uint64 capacity, LayerProtocolName serviceLayer) {
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .create.connectivity.service.input.EndPoint endPoint,
+            ServiceFormat serviceFormat, String nodeZid, Uint64 capacity, LayerProtocolName serviceLayer) {
         // TODO -> change way this is being created. The name includes only SPDR-SA1-XPDR1.
         //  Not the rest which is needed in the txPortDeviceName.
         //  It could be obtained from the SIP which has the NEP and includes all the OR name.
         Uuid sipUuid = endPoint.getServiceInterfacePoint().getServiceInterfacePointUuid();
         // Todo -> need to find the NEP associated to that SIP
-        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(nodeZid.getBytes(Charset.forName("UTF-8"))).toString());
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node node =
+        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(nodeZid.getBytes(StandardCharsets.UTF_8)).toString());
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node node =
             this.tapiContext.getTapiNode(this.tapiTopoUuid, nodeUuid);
         if (node == null) {
             LOG.error("Node not found in datastore");
@@ -1415,10 +1621,8 @@ public final class ConnectivityUtils {
         //  connection is between 2 CLIENT ports. Otherwise it will not work...
         OwnedNodeEdgePoint nep = null;
         for (OwnedNodeEdgePoint onep : node.getOwnedNodeEdgePoint().values()) {
-            if (onep.getMappedServiceInterfacePoint() == null) {
-                continue;
-            }
-            if (onep.getMappedServiceInterfacePoint().containsKey(new MappedServiceInterfacePointKey(sipUuid))) {
+            if (onep.getMappedServiceInterfacePoint() != null
+                    && onep.getMappedServiceInterfacePoint().containsKey(new MappedServiceInterfacePointKey(sipUuid))) {
                 nep = onep;
                 break;
             }
@@ -1427,9 +1631,18 @@ public final class ConnectivityUtils {
             LOG.error("Nep not found in datastore");
             return null;
         }
-        String nodeName = endPoint.getName().values().stream().findFirst().get().getValue();
+        String nodeName = "";
+        for (Map.Entry<
+                    org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.local._class.NameKey,
+                    org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.local._class.Name> entry:
+                endPoint.getName().entrySet()) {
+            if (!("Node Type").equals(entry.getValue().getValueName())) {
+                nodeName = entry.getValue().getValue();
+            }
+        }
+//        String nodeName = endPoint.getName().values().stream().findFirst().orElseThrow().getValue();
         String nodeid = String.join("-", nodeName.split("-")[0], nodeName.split("-")[1]);
-        String nepName = nep.getName().values().stream().findFirst().get().getValue();
+        String nepName = nep.getName().values().stream().findFirst().orElseThrow().getValue();
         String txPortDeviceName = nepName.split("\\+")[0];
         String txPortName = nepName.split("\\+")[2];
         String rxPortDeviceName = txPortDeviceName;
@@ -1484,33 +1697,35 @@ public final class ConnectivityUtils {
                 .setIndex(Uint8.ZERO)
                 .build()));
         if (serviceFormat.equals(ServiceFormat.ODU)) {
-            serviceZEndBuilder.setOduServiceRate(ODU4.class);
+            serviceZEndBuilder.setOduServiceRate(ODU4.VALUE);
         }
         if (serviceFormat.equals(ServiceFormat.OTU)) {
-            serviceZEndBuilder.setOtuServiceRate(OTU4.class);
+            serviceZEndBuilder.setOtuServiceRate(OTU4.VALUE);
         }
-        if (!serviceLayer.equals(LayerProtocolName.ETH)) {
-            serviceZEndBuilder
-                .setEthernetAttributes(new EthernetAttributesBuilder().setSubrateEthSla(new SubrateEthSlaBuilder()
-                    .setCommittedBurstSize(Uint16.valueOf(64))
-                    .setCommittedInfoRate(Uint32.valueOf(100000))
+        return serviceLayer.equals(LayerProtocolName.ETH)
+            ? serviceZEndBuilder.build()
+            : serviceZEndBuilder
+                .setEthernetAttributes(new EthernetAttributesBuilder()
+                    .setSubrateEthSla(new SubrateEthSlaBuilder()
+                        .setCommittedBurstSize(Uint16.valueOf(64))
+                        .setCommittedInfoRate(Uint32.valueOf(100000))
+                        .build())
                     .build())
-                .build());
-        }
-        return serviceZEndBuilder.build();
+                .build();
     }
 
     private ServiceAEnd tapiEndPointToServiceAPoint(
-        org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.input.EndPoint endPoint,
-        ServiceFormat serviceFormat, String nodeAid, Uint64 capacity, LayerProtocolName serviceLayer) {
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .create.connectivity.service.input.EndPoint endPoint,
+            ServiceFormat serviceFormat, String nodeAid, Uint64 capacity, LayerProtocolName serviceLayer) {
         // TODO -> change way this is being created. The name includes only SPDR-SA1-XPDR1.
         //  Not the rest which is needed in the txPortDeviceName.
         //  It could be obtained from the SIP which has the NEP and includes all the OR name.
         Uuid sipUuid = endPoint.getServiceInterfacePoint().getServiceInterfacePointUuid();
         // Todo -> need to find the NEP associated to that SIP
-        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(nodeAid.getBytes(Charset.forName("UTF-8"))).toString());
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node node =
+        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(nodeAid.getBytes(StandardCharsets.UTF_8)).toString());
+        LOG.info("NodeA {} Uuid is {}", nodeAid, nodeUuid);
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node node =
             this.tapiContext.getTapiNode(this.tapiTopoUuid, nodeUuid);
         if (node == null) {
             LOG.error("Node not found in datastore");
@@ -1520,10 +1735,8 @@ public final class ConnectivityUtils {
         //  connection is between 2 CLIENT ports. Otherwise it will not work...
         OwnedNodeEdgePoint nep = null;
         for (OwnedNodeEdgePoint onep : node.getOwnedNodeEdgePoint().values()) {
-            if (onep.getMappedServiceInterfacePoint() == null) {
-                continue;
-            }
-            if (onep.getMappedServiceInterfacePoint().containsKey(new MappedServiceInterfacePointKey(sipUuid))) {
+            if (onep.getMappedServiceInterfacePoint() != null
+                    && onep.getMappedServiceInterfacePoint().containsKey(new MappedServiceInterfacePointKey(sipUuid))) {
                 nep = onep;
                 break;
             }
@@ -1532,9 +1745,18 @@ public final class ConnectivityUtils {
             LOG.error("Nep not found in datastore");
             return null;
         }
-        String nodeName = endPoint.getName().values().stream().findFirst().get().getValue();
+        String nodeName = "";
+        for (Map.Entry<
+                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.local._class.NameKey,
+                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.local._class.Name> entry:
+                    endPoint.getName().entrySet()) {
+            if (!("Node Type").equals(entry.getValue().getValueName())) {
+                nodeName = entry.getValue().getValue();
+            }
+        }
+//        String nodeName = endPoint.getName().values().stream().findFirst().orElseThrow().getValue();
         String nodeid = String.join("-", nodeName.split("-")[0], nodeName.split("-")[1]);
-        String nepName = nep.getName().values().stream().findFirst().get().getValue();
+        String nepName = nep.getName().values().stream().findFirst().orElseThrow().getValue();
         String txPortDeviceName = nepName.split("\\+")[0];
         String txPortName = nepName.split("\\+")[2];
         String rxPortDeviceName = txPortDeviceName;
@@ -1552,11 +1774,11 @@ public final class ConnectivityUtils {
             .setServiceFormat(serviceFormat)
             .setServiceRate(Uint32.valueOf(capacity))
             .setEthernetAttributes(new EthernetAttributesBuilder().setSubrateEthSla(
-                        new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.subrate.eth
-                            .sla.SubrateEthSlaBuilder()
-                    .setCommittedBurstSize(Uint16.valueOf(64))
-                    .setCommittedInfoRate(Uint32.valueOf(100000))
-                    .build())
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526
+                            .subrate.eth.sla.SubrateEthSlaBuilder()
+                        .setCommittedBurstSize(Uint16.valueOf(64))
+                        .setCommittedInfoRate(Uint32.valueOf(100000))
+                        .build())
                 .build())
             .setTxDirection(Map.of(new TxDirectionKey(Uint8.ZERO), new TxDirectionBuilder()
                 .setPort(new PortBuilder()
@@ -1591,54 +1813,68 @@ public final class ConnectivityUtils {
                 .setIndex(Uint8.ZERO)
                 .build()));
         if (serviceFormat.equals(ServiceFormat.ODU)) {
-            serviceAEndBuilder.setOduServiceRate(ODU4.class);
+            serviceAEndBuilder.setOduServiceRate(ODU4.VALUE);
+        } else if (serviceFormat.equals(ServiceFormat.OTU)) {
+            serviceAEndBuilder.setOtuServiceRate(OTU4.VALUE);
         }
-        if (serviceFormat.equals(ServiceFormat.OTU)) {
-            serviceAEndBuilder.setOtuServiceRate(OTU4.class);
-        }
-        if (!serviceLayer.equals(LayerProtocolName.ETH)) {
-            serviceAEndBuilder
-                .setEthernetAttributes(new EthernetAttributesBuilder().setSubrateEthSla(new SubrateEthSlaBuilder()
-                    .setCommittedBurstSize(Uint16.valueOf(64))
-                    .setCommittedInfoRate(Uint32.valueOf(100000))
+        return serviceLayer.equals(LayerProtocolName.ETH)
+            ? serviceAEndBuilder.build()
+            : serviceAEndBuilder
+                .setEthernetAttributes(new EthernetAttributesBuilder()
+                    .setSubrateEthSla(new SubrateEthSlaBuilder()
+                        .setCommittedBurstSize(Uint16.valueOf(64))
+                        .setCommittedInfoRate(Uint32.valueOf(100000))
+                        .build())
                     .build())
-                .build());
-        }
-        return serviceAEndBuilder.build();
+                .build();
     }
 
-    private ConnectionType getConnectionTypePhtnc(Collection<org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.input.EndPoint> endPoints) {
-        if (endPoints.stream().anyMatch(ep -> ep.getName().values().stream()
-                .anyMatch(name -> name.getValue().contains("ROADM")))) {
+    private ConnectionType getConnectionTypePhtnc(
+            Collection<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .create.connectivity.service.input.EndPoint> endPoints) {
+        return endPoints.stream()
+                .anyMatch(ep -> ep.getName().values().stream().anyMatch(name -> name.getValue().contains("ROADM")))
             // EndPoints are ROADMs
-            return ConnectionType.RoadmLine;
-        }
-        // EndPoints ar not ROADMs -> XPDR, MUXPDR, SWTICHPDR
-        return ConnectionType.Infrastructure;
+            ? ConnectionType.RoadmLine
+            // EndPoints are not ROADMs -> XPDR, MUXPDR, SWTICHPDR
+            : ConnectionType.Infrastructure;
     }
 
-    private ServiceFormat getServiceFormatPhtnc(Collection<org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.input.EndPoint> endPoints) {
-        if (endPoints.stream().anyMatch(ep -> ep.getName().values().stream()
-                .anyMatch(name -> name.getValue().contains("ROADM")))) {
+    private ServiceFormat getServiceFormatPhtnc(
+            Collection<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .create.connectivity.service.input.EndPoint> endPoints) {
+        return endPoints.stream()
+                .anyMatch(ep -> ep.getName().values().stream().anyMatch(name -> name.getValue().contains("ROADM")))
             // EndPoints are ROADMs
-            return ServiceFormat.OC;
-        }
-        // EndPoints ar not ROADMs -> XPDR, MUXPDR, SWTICHPDR
-        return ServiceFormat.OTU;
+            ? ServiceFormat.OC
+            // EndPoints ar not ROADMs -> XPDR, MUXPDR, SWTICHPDR
+            : ServiceFormat.OTU;
     }
 
     private ConnectionEndPoint getAssociatediODUCep(String spcXpdrNetwork) {
-        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", spcXpdrNetwork.split("\\+")[0],
-            TapiStringConstants.DSR).getBytes(Charset.forName("UTF-8")))).toString());
-        Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", spcXpdrNetwork.split("\\+")[0],
-                TapiStringConstants.I_ODU, spcXpdrNetwork.split("\\+")[1]).getBytes(Charset.forName("UTF-8"))))
-            .toString());
-        Uuid cepUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "CEP",
-            spcXpdrNetwork.split("\\+")[0], TapiStringConstants.I_ODU, spcXpdrNetwork.split("\\+")[1]))
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        return this.tapiContext.getTapiCEP(this.tapiTopoUuid, nodeUuid, nepUuid, cepUuid);
+        return this.tapiContext.getTapiCEP(
+            this.tapiTopoUuid,
+            //nodeUuid,
+            new Uuid(UUID.nameUUIDFromBytes(
+                (String.join("+",
+                        spcXpdrNetwork.split("\\+")[0],
+                        TapiStringConstants.XPDR)
+                    .getBytes(StandardCharsets.UTF_8))).toString()),
+            //nepUuid,
+            new Uuid(UUID.nameUUIDFromBytes(
+                (String.join("+",
+                        spcXpdrNetwork.split("\\+")[0],
+                        TapiStringConstants.I_ODU,
+                        spcXpdrNetwork.split("\\+")[1])
+                    .getBytes(StandardCharsets.UTF_8))).toString()),
+            //cepUuid,
+            new Uuid(UUID.nameUUIDFromBytes(
+                (String.join("+",
+                        "CEP",
+                        spcXpdrNetwork.split("\\+")[0],
+                        TapiStringConstants.I_ODU,
+                        spcXpdrNetwork.split("\\+")[1]))
+                    .getBytes(StandardCharsets.UTF_8)).toString()));
     }
 
     private String getAssociatedNetworkPort(String spcXpdrClient, List<String> xpdrNetworkTplist) {
@@ -1653,21 +1889,23 @@ public final class ConnectivityUtils {
     private List<String> getAssociatedClientsPort(List<String> xpdrNetworkTplist) {
         List<String> clientPortList = new ArrayList<>();
         for (String networkPort:xpdrNetworkTplist) {
-            String nodeId = String.join("-", networkPort.split("\\+")[0].split("-")[0],
+            String nodeId = String.join("-",
+                networkPort.split("\\+")[0].split("-")[0],
                 networkPort.split("\\+")[0].split("-")[1]);
             String tpId = networkPort.split("\\+")[1];
             InstanceIdentifier<Mapping> mapIID = InstanceIdentifier.builder(Network.class)
                 .child(Nodes.class, new NodesKey(nodeId))
                 .child(Mapping.class, new MappingKey(tpId)).build();
             try {
-                Optional<Mapping> optMapping = this.networkTransactionService.read(LogicalDatastoreType.CONFIGURATION,
-                    mapIID).get();
-                if (!optMapping.isPresent()) {
+                Optional<Mapping> optMapping =
+                    this.networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, mapIID).get();
+                if (optMapping.isEmpty()) {
                     LOG.error("Couldnt find mapping for port {} of node {}", tpId, nodeId);
                 }
-                Mapping mapping = optMapping.get();
+                Mapping mapping = optMapping.orElseThrow();
                 LOG.info("Mapping for node+port {}+{} = {}", nodeId, tpId, mapping);
-                String key = String.join("+", String.join("-", nodeId, tpId.split("\\-")[0]),
+                String key = String.join("+",
+                    String.join("-", nodeId, tpId.split("\\-")[0]),
                     mapping.getConnectionMapLcp());
                 LOG.info("Key to be added to list = {}", key);
                 if (!clientPortList.contains(key)) {
@@ -1685,23 +1923,28 @@ public final class ConnectivityUtils {
     private OpenroadmNodeType getOpenRoadmNodeType(List<String> xpdrNodelist) {
         List<OpenroadmNodeType> openroadmNodeTypeList = new ArrayList<>();
         for (String xpdrNode:xpdrNodelist) {
-            Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+",xpdrNode, TapiStringConstants.DSR))
-                .getBytes(Charset.forName("UTF-8"))).toString());
-            InstanceIdentifier<org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.topology.rev181210.topology.Node> nodeIID = InstanceIdentifier.builder(
-                    Context.class).augmentation(org.opendaylight.yang.gen.v1.urn
-                    .onf.otcc.yang.tapi.topology.rev181210.Context1.class).child(TopologyContext.class)
-                .child(Topology.class, new TopologyKey(this.tapiTopoUuid))
-                .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node.class,
-                    new NodeKey(nodeUuid)).build();
+            InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
+                    .topology.Node> nodeIID =
+                InstanceIdentifier.builder(Context.class)
+                    .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1.class)
+                    .child(TopologyContext.class)
+                    .child(Topology.class, new TopologyKey(this.tapiTopoUuid))
+                    .child(
+                        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node.class,
+                        new NodeKey(
+                            //nodeUUID
+                            new Uuid(UUID.nameUUIDFromBytes(
+                                (String.join("+",xpdrNode, TapiStringConstants.XPDR))
+                                    .getBytes(StandardCharsets.UTF_8)).toString())))
+                    .build();
             try {
-                Optional<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> optNode
-                    this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, nodeIID).get();
-                if (!optNode.isPresent()) {
+                Optional<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> optNode =
+                    this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, nodeIID).get();
+                if (optNode.isEmpty()) {
                     return null;
                 }
-                OpenroadmNodeType openroadmNodeType = OpenroadmNodeType.forName(optNode.get().getName().get(
-                    new NameKey("Node Type")).getValue()).get();
+                OpenroadmNodeType openroadmNodeType =
+                    OpenroadmNodeType.forName(optNode.orElseThrow().getName().get(new NameKey("Node Type")).getValue());
                 if (!openroadmNodeTypeList.contains(openroadmNodeType)) {
                     openroadmNodeTypeList.add(openroadmNodeType);
                 }
@@ -1711,10 +1954,41 @@ public final class ConnectivityUtils {
             }
         }
         // TODO for now check that there is only one type, otherwise error
-        if (openroadmNodeTypeList.size() != 1) {
-            LOG.error("More than one xpdr type. List = {}", openroadmNodeTypeList);
-            return null;
+        if (openroadmNodeTypeList.size() == 1) {
+            return openroadmNodeTypeList.get(0);
         }
-        return openroadmNodeTypeList.get(0);
+        LOG.error("More than one xpdr type. List = {}", openroadmNodeTypeList);
+        return null;
+    }
+
+    private OwnedNodeEdgePoint createRoadmNep(
+            String orNodeId, String tpId, boolean withSip,
+            OperationalState operState, AdministrativeState adminState, String nepPhotonicSublayer) {
+        //TODO : complete implementation with SIP
+        Name nepName = new NameBuilder()
+                .setValueName(TapiStringConstants.PHTNC_MEDIA + "NodeEdgePoint")
+                .setValue(String.join("+", orNodeId, nepPhotonicSublayer, tpId))
+                .build();
+        return new OwnedNodeEdgePointBuilder()
+            .setUuid(
+                new Uuid(UUID.nameUUIDFromBytes(
+                        (String.join("+", orNodeId, nepPhotonicSublayer,tpId)).getBytes(StandardCharsets.UTF_8))
+                    .toString()))
+            .setLayerProtocolName(LayerProtocolName.PHOTONICMEDIA)
+            .setName(Map.of(nepName.key(), nepName))
+            .setSupportedCepLayerProtocolQualifierInstances(
+                new ArrayList<>(List.of(
+                    new SupportedCepLayerProtocolQualifierInstancesBuilder()
+                        .setLayerProtocolQualifier(
+                            TapiStringConstants.MC.equals(nepPhotonicSublayer)
+                                ? PHOTONICLAYERQUALIFIERMC.VALUE
+                                : PHOTONICLAYERQUALIFIEROTSiMC.VALUE)
+                        .setNumberOfCepInstances(Uint64.valueOf(1))
+                        .build())))
+            .setDirection(Direction.BIDIRECTIONAL)
+            .setLinkPortRole(PortRole.SYMMETRIC)
+            .setAdministrativeState(adminState).setOperationalState(operState)
+            .setLifecycleState(LifecycleState.INSTALLED)
+            .build();
     }
 }
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/connectivity/TapiConnectivityImpl.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/connectivity/TapiConnectivityImpl.java
deleted file mode 100644 (file)
index 8b01b32..0000000
+++ /dev/null
@@ -1,356 +0,0 @@
-/*
- * Copyright © 2018 Orange, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.transportpce.tapi.connectivity;
-
-import com.google.common.util.concurrent.ListenableFuture;
-import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.UUID;
-import java.util.concurrent.ExecutionException;
-import org.opendaylight.transportpce.common.OperationResult;
-import org.opendaylight.transportpce.common.ResponseCodes;
-import org.opendaylight.transportpce.tapi.listeners.TapiPceListenerImpl;
-import org.opendaylight.transportpce.tapi.listeners.TapiRendererListenerImpl;
-import org.opendaylight.transportpce.tapi.listeners.TapiServiceHandlerListenerImpl;
-import org.opendaylight.transportpce.tapi.utils.TapiContext;
-import org.opendaylight.transportpce.tapi.validation.CreateConnectivityServiceValidation;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.RpcActions;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.sdnc.request.header.SdncRequestHeaderBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OrgOpenroadmServiceService;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceDeleteOutput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.delete.input.ServiceDeleteReqInfo;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.delete.input.ServiceDeleteReqInfoBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.AdministrativeState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.ForwardingDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LifecycleState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.OperationalState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.BandwidthProfileBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.TotalSizeBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.CreateConnectivityServiceInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.CreateConnectivityServiceOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.CreateConnectivityServiceOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.DeleteConnectivityServiceInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.DeleteConnectivityServiceOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.DeleteConnectivityServiceOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectionDetailsInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectionDetailsOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectionDetailsOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectionEndPointDetailsInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectionEndPointDetailsOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectionEndPointDetailsOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectivityServiceDetailsInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectivityServiceDetailsOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectivityServiceDetailsOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectivityServiceListInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectivityServiceListOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.GetConnectivityServiceListOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.ServiceType;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.TapiConnectivityService;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.UpdateConnectivityServiceInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.UpdateConnectivityServiceOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityService;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityServiceBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityServiceKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.EndPoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.EndPointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.EndPointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.end.point.CapacityBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.end.point.ServiceInterfacePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.output.ServiceBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.get.connection.details.output.ConnectionBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.get.connection.end.point.details.output.ConnectionEndPointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.get.connectivity.service.list.output.Service;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.get.connectivity.service.list.output.ServiceKey;
-import org.opendaylight.yangtools.yang.common.RpcError;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Top level service interface providing main TAPI Connectivity services.
- */
-public class TapiConnectivityImpl implements TapiConnectivityService {
-
-    private static final Logger LOG = LoggerFactory.getLogger(TapiConnectivityImpl.class);
-
-    private OrgOpenroadmServiceService serviceHandler;
-    private final TapiContext tapiContext;
-    private final ConnectivityUtils connectivityUtils;
-    private TapiPceListenerImpl pceListenerImpl;
-    private TapiRendererListenerImpl rendererListenerImpl;
-    private TapiServiceHandlerListenerImpl serviceHandlerListenerImpl;
-
-    public TapiConnectivityImpl(OrgOpenroadmServiceService serviceHandler, TapiContext tapiContext,
-                                ConnectivityUtils connectivityUtils, TapiPceListenerImpl pceListenerImpl,
-                                TapiRendererListenerImpl rendererListenerImpl,
-                                TapiServiceHandlerListenerImpl serviceHandlerListenerImpl) {
-        LOG.info("inside TapiImpl constructor");
-        this.serviceHandler = serviceHandler;
-        this.tapiContext = tapiContext;
-        this.connectivityUtils = connectivityUtils;
-        this.pceListenerImpl = pceListenerImpl;
-        this.rendererListenerImpl = rendererListenerImpl;
-        this.serviceHandlerListenerImpl = serviceHandlerListenerImpl;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<CreateConnectivityServiceOutput>> createConnectivityService(
-            CreateConnectivityServiceInput input) {
-        // TODO: later version of TAPI models include Name as an input parameter in connectivity.yang
-        LOG.info("RPC create-connectivity received: {}", input.getEndPoint());
-        Uuid serviceUuid = new Uuid(UUID.randomUUID().toString());
-        this.pceListenerImpl.setInput(input);
-        this.pceListenerImpl.setServiceUuid(serviceUuid);
-        this.rendererListenerImpl.setServiceUuid(serviceUuid);
-        ListenableFuture<RpcResult<ServiceCreateOutput>> output = null;
-        OperationResult validationResult = CreateConnectivityServiceValidation.validateCreateConnectivityServiceRequest(
-                input);
-        if (validationResult.isSuccess()) {
-            LOG.info("input parameter of RPC create-connectivity are being handled");
-            // check uuid of SIP in tapi context
-            Map<ServiceInterfacePointKey, ServiceInterfacePoint> sipMap = this.tapiContext.getTapiContext()
-                    .getServiceInterfacePoint();
-            if (sipMap == null) {
-                return RpcResultBuilder.<CreateConnectivityServiceOutput>failed().withError(RpcError.ErrorType.RPC,
-                    "SIP list is empty").buildFuture();
-            }
-            if (sipMap.containsKey(new ServiceInterfacePointKey(input.getEndPoint().values().stream().findFirst().get()
-                    .getServiceInterfacePoint().getServiceInterfacePointUuid()))
-                    && sipMap.containsKey(new ServiceInterfacePointKey(input.getEndPoint().values().stream().skip(1)
-                    .findFirst().get().getServiceInterfacePoint().getServiceInterfacePointUuid()))) {
-                LOG.info("SIPs found in sipMap");
-                // TODO: differentiate between OTN service and GbE service in TAPI
-                ServiceCreateInput sci = this.connectivityUtils.createORServiceInput(input, serviceUuid);
-                if (sci == null) {
-                    return RpcResultBuilder.<CreateConnectivityServiceOutput>failed().withError(RpcError.ErrorType.RPC,
-                        "Couldnt map Service create input").buildFuture();
-                }
-                LOG.info("Service Create input = {}", sci);
-                output = this.serviceHandler.serviceCreate(sci);
-                if (!output.isDone()) {
-                    return RpcResultBuilder.<CreateConnectivityServiceOutput>failed().withError(RpcError.ErrorType.RPC,
-                        "Service create RPC failed").buildFuture();
-                }
-            } else {
-                LOG.error("Unknown UUID");
-                return RpcResultBuilder.<CreateConnectivityServiceOutput>failed().withError(RpcError.ErrorType.RPC,
-                    "SIPs do not exist in tapi context").buildFuture();
-            }
-        }
-        try {
-            if (output == null) {
-                return RpcResultBuilder.<CreateConnectivityServiceOutput>failed().withError(RpcError.ErrorType.RPC,
-                    "Failed to create service").buildFuture();
-            }
-            LOG.info("Service create request was successful");
-            if (output.get().getResult().getConfigurationResponseCommon().getResponseCode()
-                    .equals(ResponseCodes.RESPONSE_FAILED)) {
-                return RpcResultBuilder.<CreateConnectivityServiceOutput>failed().withError(RpcError.ErrorType.RPC,
-                    "Failed to create service").buildFuture();
-            }
-            LOG.info("Output of service request = {}", output.get().getResult());
-        } catch (InterruptedException | ExecutionException e) {
-            LOG.error("Error checking response code of service create", e);
-        }
-        // Connections and states should be created/updated when the pce and renderer are done :)
-        Map<EndPointKey, EndPoint> endPointList = createEndPoints(input.getEndPoint());
-        Name name = new NameBuilder()
-            .setValueName("Connectivity Service Name")
-            .setValue(serviceUuid.getValue())
-            .build();
-        ConnectivityService service = new ConnectivityServiceBuilder()
-            .setUuid(serviceUuid)
-            .setAdministrativeState(AdministrativeState.LOCKED)
-            .setOperationalState(OperationalState.DISABLED)
-            .setLifecycleState(LifecycleState.PLANNED)
-            .setServiceLayer(input.getConnectivityConstraint().getServiceLayer())
-            .setServiceType(ServiceType.POINTTOPOINTCONNECTIVITY)
-            .setConnectivityDirection(ForwardingDirection.BIDIRECTIONAL)
-            .setName(Map.of(name.key(), name))
-            .setConnection(new HashMap<>())
-            .setEndPoint(endPointList)
-            .build();
-        // add to tapi context
-        this.tapiContext.updateConnectivityContext(Map.of(service.key(), service), new HashMap<>());
-        LOG.info("Created locked service in Datastore. Waiting for PCE and Renderer to complete tasks...");
-        // return ConnectivityServiceCreateOutput
-        return RpcResultBuilder.success(new CreateConnectivityServiceOutputBuilder()
-            .setService(new ServiceBuilder(service).build()).build()).buildFuture();
-    }
-
-    private Map<EndPointKey, EndPoint> createEndPoints(
-            Map<org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.input.EndPointKey,
-                org.opendaylight.yang.gen.v1.urn
-                    .onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.input.EndPoint> endPoints) {
-        Map<EndPointKey, EndPoint> endPointMap = new HashMap<>();
-        for (org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.input.EndPoint ep:
-                endPoints.values()) {
-            EndPoint endpoint = new EndPointBuilder()
-                .setServiceInterfacePoint(new ServiceInterfacePointBuilder()
-                    .setServiceInterfacePointUuid(ep.getServiceInterfacePoint().getServiceInterfacePointUuid())
-                    .build())
-                .setName(ep.getName())
-                .setAdministrativeState(ep.getAdministrativeState())
-                .setDirection(ep.getDirection())
-                .setLifecycleState(ep.getLifecycleState())
-                .setOperationalState(ep.getOperationalState())
-                .setLayerProtocolName(ep.getLayerProtocolName())
-                .setCapacity(new CapacityBuilder()
-                    .setTotalSize(new TotalSizeBuilder().build())
-                    .setBandwidthProfile(new BandwidthProfileBuilder().build()) // TODO: implement bandwidth profile
-                    .build())
-                .setProtectionRole(ep.getProtectionRole())
-                .setRole(ep.getRole())
-                .setLocalId(ep.getLocalId())
-                .build();
-            endPointMap.put(endpoint.key(), endpoint);
-        }
-        return endPointMap;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<GetConnectivityServiceDetailsOutput>> getConnectivityServiceDetails(
-            GetConnectivityServiceDetailsInput input) {
-        // TODO Auto-generated method stub
-        Uuid serviceUuid = getUuidFromIput(input.getServiceIdOrName());
-        ConnectivityService service = this.tapiContext.getConnectivityService(serviceUuid);
-        if (service == null) {
-            LOG.error("Service {} doesnt exist in tapi context", input.getServiceIdOrName());
-            return RpcResultBuilder.<GetConnectivityServiceDetailsOutput>failed().withError(RpcError.ErrorType.RPC,
-                    "Service doesnt exist in datastore").buildFuture();
-        }
-        return RpcResultBuilder.success(new GetConnectivityServiceDetailsOutputBuilder().setService(
-            new org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.get.connectivity.service.details.output.ServiceBuilder(
-                    service).build()).build()).buildFuture();
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<UpdateConnectivityServiceOutput>> updateConnectivityService(
-            UpdateConnectivityServiceInput input) {
-        // TODO Auto-generated method stub. More complicated as it depends on what needs to be updated... left aside
-        return null;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<GetConnectionDetailsOutput>> getConnectionDetails(
-            GetConnectionDetailsInput input) {
-        // TODO Auto-generated method stub
-        Uuid connectionUuid = getUuidFromIput(input.getConnectionIdOrName());
-        Connection connection = this.tapiContext.getConnection(connectionUuid);
-        if (connection == null) {
-            LOG.error("Connection {} doesnt exist in tapi context", input.getConnectionIdOrName());
-            return RpcResultBuilder.<GetConnectionDetailsOutput>failed().withError(RpcError.ErrorType.RPC,
-                    "Connection doesnt exist in datastore").buildFuture();
-        }
-        return RpcResultBuilder.success(new GetConnectionDetailsOutputBuilder().setConnection(
-                new ConnectionBuilder(connection).build()).build()).buildFuture();
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<DeleteConnectivityServiceOutput>> deleteConnectivityService(
-            DeleteConnectivityServiceInput input) {
-        //TODO Auto-generated method stub
-        // TODO add try
-        if (input.getServiceIdOrName() != null) {
-            try {
-                Uuid serviceUuid = getUuidFromIput(input.getServiceIdOrName());
-                this.tapiContext.deleteConnectivityService(serviceUuid);
-                ListenableFuture<RpcResult<ServiceDeleteOutput>> output =
-                    this.serviceHandler.serviceDelete(new ServiceDeleteInputBuilder()
-                        .setServiceDeleteReqInfo(new ServiceDeleteReqInfoBuilder()
-                            .setServiceName(input.getServiceIdOrName())
-                            .setTailRetention(ServiceDeleteReqInfo.TailRetention.No)
-                            .build())
-                        .setSdncRequestHeader(new SdncRequestHeaderBuilder()
-                            .setRequestId("request-1")
-                            .setNotificationUrl("notification url")
-                            .setRequestSystemId("appname")
-                            .setRpcAction(RpcActions.ServiceDelete)
-                            .build())
-                        .build());
-                RpcResult<ServiceDeleteOutput> rpcResult = output.get();
-                if (!rpcResult.getResult().getConfigurationResponseCommon().getResponseCode()
-                        .equals(ResponseCodes.RESPONSE_FAILED)) {
-                    LOG.info("Service is being deleted and devices are being rolled back");
-                    return RpcResultBuilder.success(new DeleteConnectivityServiceOutputBuilder().build()).buildFuture();
-                }
-                LOG.error("Failed to delete service. Deletion process failed");
-            } catch (InterruptedException | ExecutionException e) {
-                LOG.error("Failed to delete service.", e);
-            }
-        }
-        return RpcResultBuilder.<DeleteConnectivityServiceOutput>failed().withError(RpcError.ErrorType.RPC,
-            "Failed to delete Service").buildFuture();
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<GetConnectivityServiceListOutput>> getConnectivityServiceList(
-            GetConnectivityServiceListInput input) {
-        // TODO Auto-generated method stub
-        Map<ConnectivityServiceKey, ConnectivityService> connMap = this.tapiContext.getConnectivityServices();
-        if (connMap == null) {
-            LOG.error("No services in tapi context");
-            return RpcResultBuilder.<GetConnectivityServiceListOutput>failed().withError(RpcError.ErrorType.RPC,
-                    "No services exist in datastore").buildFuture();
-        }
-
-        Map<ServiceKey, Service> serviceMap = new HashMap<>();
-        for (ConnectivityService connectivityService: connMap.values()) {
-            Service service = new org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.get.connectivity.service.list.output.ServiceBuilder(
-                    connectivityService).build();
-            serviceMap.put(service.key(), service);
-        }
-        return RpcResultBuilder.success(new GetConnectivityServiceListOutputBuilder().setService(serviceMap)
-            .build()).buildFuture();
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<GetConnectionEndPointDetailsOutput>> getConnectionEndPointDetails(
-            GetConnectionEndPointDetailsInput input) {
-        // TODO Auto-generated method stub
-        Uuid topoUuid = getUuidFromIput(input.getTopologyIdOrName());
-        Uuid nodeUuid = getUuidFromIput(input.getNodeIdOrName());
-        Uuid nepUuid = getUuidFromIput(input.getNepIdOrName());
-        Uuid cepUuid = getUuidFromIput(input.getCepIdOrName());
-        ConnectionEndPoint cep = this.tapiContext.getTapiCEP(topoUuid, nodeUuid, nepUuid, cepUuid);
-        if (cep == null) {
-            LOG.error("Cep doesnt exist in tapi context");
-            return RpcResultBuilder.<GetConnectionEndPointDetailsOutput>failed().withError(RpcError.ErrorType.RPC,
-                    "No cep with given Uuid exists in datastore").buildFuture();
-        }
-        return RpcResultBuilder.success(new GetConnectionEndPointDetailsOutputBuilder().setConnectionEndPoint(
-            new ConnectionEndPointBuilder(cep).build()).build()).buildFuture();
-    }
-
-    private Uuid getUuidFromIput(String serviceIdOrName) {
-        try {
-            UUID.fromString(serviceIdOrName);
-            LOG.info("Given attribute {} is a UUID", serviceIdOrName);
-            return new Uuid(serviceIdOrName);
-        } catch (IllegalArgumentException e) {
-            LOG.info("Given attribute {} is not a UUID", serviceIdOrName);
-            return new Uuid(UUID.nameUUIDFromBytes(serviceIdOrName.getBytes(StandardCharsets.UTF_8)).toString());
-        }
-    }
-}
index b84c3a1561ba99e9d21677211f88d5fc3734810c..f5cb9dd76c2efdc07011114fa9ab90c3d83f30fb 100644 (file)
@@ -7,51 +7,62 @@
  */
 package org.opendaylight.transportpce.tapi.impl;
 
+import java.util.ArrayList;
 import java.util.HashMap;
-import org.eclipse.jdt.annotation.NonNull;
+import java.util.List;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
 import org.opendaylight.mdsal.binding.api.NotificationService;
 import org.opendaylight.mdsal.binding.api.RpcProviderService;
+import org.opendaylight.mdsal.binding.api.RpcService;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.InstanceIdentifiers;
 import org.opendaylight.transportpce.common.NetworkUtils;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
 import org.opendaylight.transportpce.tapi.connectivity.ConnectivityUtils;
-import org.opendaylight.transportpce.tapi.connectivity.TapiConnectivityImpl;
-import org.opendaylight.transportpce.tapi.listeners.TapiPceListenerImpl;
-import org.opendaylight.transportpce.tapi.listeners.TapiRendererListenerImpl;
-import org.opendaylight.transportpce.tapi.listeners.TapiServiceHandlerListenerImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.CreateConnectivityServiceImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.DeleteConnectivityServiceImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetConnectionDetailsImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetConnectivityServiceDetailsImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetConnectivityServiceListImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetLinkDetailsImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetNodeDetailsImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetNodeEdgePointDetailsImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetServiceInterfacePointDetailsImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetServiceInterfacePointListImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetTopologyDetailsImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetTopologyListImpl;
+import org.opendaylight.transportpce.tapi.listeners.TapiNetworkModelNotificationHandler;
+import org.opendaylight.transportpce.tapi.listeners.TapiPceNotificationHandler;
+import org.opendaylight.transportpce.tapi.listeners.TapiRendererNotificationHandler;
+import org.opendaylight.transportpce.tapi.listeners.TapiServiceNotificationHandler;
 import org.opendaylight.transportpce.tapi.topology.TapiNetconfTopologyListener;
+import org.opendaylight.transportpce.tapi.topology.TapiNetworkModelService;
 import org.opendaylight.transportpce.tapi.topology.TapiOrLinkListener;
 import org.opendaylight.transportpce.tapi.topology.TapiPortMappingListener;
-import org.opendaylight.transportpce.tapi.topology.TapiTopologyImpl;
 import org.opendaylight.transportpce.tapi.topology.TopologyUtils;
 import org.opendaylight.transportpce.tapi.utils.TapiContext;
 import org.opendaylight.transportpce.tapi.utils.TapiInitialORMapping;
 import org.opendaylight.transportpce.tapi.utils.TapiLink;
+import org.opendaylight.transportpce.tapi.utils.TapiLinkImpl;
 import org.opendaylight.transportpce.tapi.utils.TapiListener;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.TransportpcePceListener;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.TransportpceRendererListener;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.TransportpceServicehandlerListener;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev210408.TransportpceTapinetworkutilsService;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OrgOpenroadmServiceService;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.Network;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TapiCommonService;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.TapiConnectivityService;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.TapiTopologyService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.tapi.rev180928.ServiceInterfacePoints;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.tapi.rev230728.ServiceInterfacePoints;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.concepts.ObjectRegistration;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -61,71 +72,45 @@ import org.slf4j.LoggerFactory;
  * @author Gilles Thouenon (gilles.thouenon@orange.com) on behalf of Orange
  *
  */
+@Component
 public class TapiProvider {
 
     private static final Logger LOG = LoggerFactory.getLogger(TapiProvider.class);
 
     private static final InstanceIdentifier<Nodes> MAPPING_II = InstanceIdentifier.create(Network.class)
         .child(org.opendaylight.yang.gen.v1.http
-            .org.opendaylight.transportpce.portmapping.rev220316.network.Nodes.class);
+            .org.opendaylight.transportpce.portmapping.rev231221.network.Nodes.class);
     private static final InstanceIdentifier<Link> LINK_II = InstanceIdentifier.create(Networks.class).child(
         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network.class,
             new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID))).augmentation(Network1.class)
         .child(Link.class);
     private final DataBroker dataBroker;
-    private final RpcProviderService rpcProviderService;
-    private ObjectRegistration<TapiConnectivityService> rpcRegistration;
-    private ObjectRegistration<TransportpceTapinetworkutilsService> tapiNetworkutilsServiceRpcRegistration;
-    private ListenerRegistration<TapiNetconfTopologyListener> dataTreeChangeListenerRegistration;
-    private ListenerRegistration<TapiOrLinkListener> dataTreeChangeListenerRegistration1;
-    private ListenerRegistration<TapiPortMappingListener> mappingListenerListenerRegistration;
-    private ListenerRegistration<TransportpcePceListener> pcelistenerRegistration;
-    private ListenerRegistration<TransportpceRendererListener> rendererlistenerRegistration;
-    private ListenerRegistration<TransportpceServicehandlerListener> servicehandlerlistenerRegistration;
-    private final OrgOpenroadmServiceService serviceHandler;
-    private final ServiceDataStoreOperations serviceDataStoreOperations;
-    private final TapiListener tapiListener;
-    private final TapiNetconfTopologyListener topologyListener;
-    private final TapiOrLinkListener orLinkListener;
-    private TapiPortMappingListener tapiPortMappingListener;
     private final NetworkTransactionService networkTransactionService;
-    private final TransportpceTapinetworkutilsService tapiNetworkUtils;
-    private TapiPceListenerImpl pceListenerImpl;
-    private TapiRendererListenerImpl rendererListenerImpl;
-    private TapiServiceHandlerListenerImpl serviceHandlerListenerImpl;
-    private final NotificationService notificationService;
+    private final ServiceDataStoreOperations serviceDataStoreOperations;
+    private List<Registration> listeners;
+    private Registration rpcRegistration;
+    private Registration pcelistenerRegistration;
+    private Registration rendererlistenerRegistration;
+    private Registration servicehandlerlistenerRegistration;
+    private Registration tapinetworkmodellistenerRegistration;
 
-    public TapiProvider(DataBroker dataBroker, RpcProviderService rpcProviderService,
-            OrgOpenroadmServiceService serviceHandler, ServiceDataStoreOperations serviceDataStoreOperations,
-            TapiListener tapiListener, NetworkTransactionService networkTransactionService,
-            TapiNetconfTopologyListener topologyListener, TapiPortMappingListener tapiPortMappingListener,
-            TransportpceTapinetworkutilsService tapiNetworkUtils, TapiPceListenerImpl pceListenerImpl,
-            TapiRendererListenerImpl rendererListenerImpl, TapiServiceHandlerListenerImpl serviceHandlerListenerImpl,
-            NotificationService notificationService, TapiOrLinkListener orLinkListener) {
+    @Activate
+    public TapiProvider(@Reference DataBroker dataBroker,
+            @Reference RpcProviderService rpcProviderService,
+            @Reference RpcService rpcService,
+            @Reference NotificationService notificationService,
+            @Reference NotificationPublishService notificationPublishService,
+            @Reference NetworkTransactionService networkTransactionService,
+            @Reference ServiceDataStoreOperations serviceDataStoreOperations,
+            @Reference TapiNetworkModelNotificationHandler tapiNetworkModelNotificationHandler,
+            @Reference TapiNetworkModelService tapiNetworkModelServiceImpl) {
         this.dataBroker = dataBroker;
-        this.rpcProviderService = rpcProviderService;
-        this.serviceHandler = serviceHandler;
-        this.serviceDataStoreOperations = serviceDataStoreOperations;
-        this.tapiListener = tapiListener;
         this.networkTransactionService = networkTransactionService;
-        this.topologyListener = topologyListener;
-        this.tapiPortMappingListener = tapiPortMappingListener;
-        this.tapiNetworkUtils = tapiNetworkUtils;
-        this.pceListenerImpl = pceListenerImpl;
-        this.rendererListenerImpl = rendererListenerImpl;
-        this.serviceHandlerListenerImpl = serviceHandlerListenerImpl;
-        this.notificationService = notificationService;
-        this.orLinkListener = orLinkListener;
-    }
-
-    /**
-     * Method called when the blueprint container is created.
-     */
-    public void init() {
+        this.serviceDataStoreOperations = serviceDataStoreOperations;
         LOG.info("TapiProvider Session Initiated");
         TapiContext tapiContext = new TapiContext(this.networkTransactionService);
         LOG.info("Empty TAPI context created: {}", tapiContext.getTapiContext());
-        TapiLink tapiLink = new TapiLink(this.networkTransactionService);
+        TapiLink tapiLink = new TapiLinkImpl(this.networkTransactionService);
         TopologyUtils topologyUtils = new TopologyUtils(this.networkTransactionService, this.dataBroker, tapiLink);
         ConnectivityUtils connectivityUtils = new ConnectivityUtils(this.serviceDataStoreOperations, new HashMap<>(),
                 tapiContext, this.networkTransactionService);
@@ -133,56 +118,71 @@ public class TapiProvider {
                 tapiContext, this.serviceDataStoreOperations);
         tapiInitialORMapping.performTopoInitialMapping();
         tapiInitialORMapping.performServInitialMapping();
+        TapiPceNotificationHandler pceListenerImpl = new TapiPceNotificationHandler(dataBroker, connectivityUtils);
+        TapiRendererNotificationHandler rendererListenerImpl = new TapiRendererNotificationHandler(dataBroker,
+                notificationPublishService);
+
+        rpcRegistration = rpcProviderService.registerRpcImplementations(
+                new CreateConnectivityServiceImpl(rpcService, tapiContext, connectivityUtils, pceListenerImpl,
+                        rendererListenerImpl),
+                new GetConnectivityServiceDetailsImpl(tapiContext),
+                new GetConnectionDetailsImpl(tapiContext),
+                new DeleteConnectivityServiceImpl(rpcService, tapiContext, networkTransactionService),
+                new GetConnectivityServiceListImpl(tapiContext),
+                new GetNodeDetailsImpl(tapiContext),
+                new GetTopologyDetailsImpl(tapiContext, topologyUtils, tapiLink, networkTransactionService),
+                new GetNodeEdgePointDetailsImpl(tapiContext),
+                new GetLinkDetailsImpl(tapiContext),
+                new GetTopologyListImpl(tapiContext),
+                new GetServiceInterfacePointDetailsImpl(tapiContext),
+                new GetServiceInterfacePointListImpl(tapiContext));
 
-        TapiConnectivityImpl tapi = new TapiConnectivityImpl(this.serviceHandler, tapiContext, connectivityUtils,
-                pceListenerImpl, rendererListenerImpl, serviceHandlerListenerImpl);
-        TapiTopologyImpl topo = new TapiTopologyImpl(this.dataBroker, tapiContext, topologyUtils, tapiLink);
-        rpcRegistration = rpcProviderService.registerRpcImplementation(TapiConnectivityService.class, tapi);
-        rpcProviderService.registerRpcImplementation(TapiTopologyService.class, topo);
-        rpcProviderService.registerRpcImplementation(TapiCommonService.class, topo);
-        dataTreeChangeListenerRegistration1 =
-            dataBroker.registerDataTreeChangeListener(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
-                LINK_II), orLinkListener);
-        dataTreeChangeListenerRegistration =
-            dataBroker.registerDataTreeChangeListener(DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL,
-                InstanceIdentifiers.NETCONF_TOPOLOGY_II.child(Node.class)), topologyListener);
-        mappingListenerListenerRegistration =
-            dataBroker.registerDataTreeChangeListener(DataTreeIdentifier.create(LogicalDatastoreType.CONFIGURATION,
-                MAPPING_II), tapiPortMappingListener);
-        tapiNetworkutilsServiceRpcRegistration =
-                rpcProviderService.registerRpcImplementation(TransportpceTapinetworkutilsService.class,
-                        this.tapiNetworkUtils);
-        @NonNull
-        InstanceIdentifier<ServiceInterfacePoints> sipIID = InstanceIdentifier.create(ServiceInterfacePoints.class);
-        dataBroker.registerDataTreeChangeListener(DataTreeIdentifier.create(
-            LogicalDatastoreType.CONFIGURATION, sipIID), tapiListener);
+        this.listeners = new ArrayList<>();
+        TapiNetconfTopologyListener topologyListener = new TapiNetconfTopologyListener(tapiNetworkModelServiceImpl);
+        TapiOrLinkListener orLinkListener = new TapiOrLinkListener(tapiLink, networkTransactionService);
+        TapiPortMappingListener tapiPortMappingListener = new TapiPortMappingListener(tapiNetworkModelServiceImpl);
+        listeners.add(dataBroker.registerTreeChangeListener(
+                DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, LINK_II), orLinkListener));
+        listeners.add(dataBroker.registerTreeChangeListener(
+                DataTreeIdentifier.of(LogicalDatastoreType.OPERATIONAL, InstanceIdentifiers.NETCONF_TOPOLOGY_II
+                    .child(Node.class)),
+                topologyListener));
+        listeners.add(dataBroker.registerTreeChangeListener(
+                DataTreeIdentifier.of(LogicalDatastoreType.CONFIGURATION, MAPPING_II), tapiPortMappingListener));
+        TapiListener tapiListener = new TapiListener();
+        listeners.add(dataBroker.registerTreeChangeListener(
+                DataTreeIdentifier.of(
+                        LogicalDatastoreType.CONFIGURATION,
+                        InstanceIdentifier.create(ServiceInterfacePoints.class)),
+                tapiListener));
         // Notification Listener
-        pcelistenerRegistration = notificationService.registerNotificationListener(pceListenerImpl);
-        rendererlistenerRegistration = notificationService.registerNotificationListener(rendererListenerImpl);
-        servicehandlerlistenerRegistration =
-                notificationService.registerNotificationListener(serviceHandlerListenerImpl);
+        pcelistenerRegistration = notificationService.registerCompositeListener(pceListenerImpl.getCompositeListener());
+        rendererlistenerRegistration = notificationService
+            .registerCompositeListener(rendererListenerImpl.getCompositeListener());
+        TapiServiceNotificationHandler serviceHandlerListenerImpl = new TapiServiceNotificationHandler(dataBroker);
+        servicehandlerlistenerRegistration = notificationService
+            .registerCompositeListener(serviceHandlerListenerImpl.getCompositeListener());
+        tapinetworkmodellistenerRegistration = notificationService
+            .registerCompositeListener(tapiNetworkModelNotificationHandler.getCompositeListener());
     }
 
     /**
      * Method called when the blueprint container is destroyed.
      */
+    @Deactivate
     public void close() {
-        LOG.info("TapiProvider Session Closed");
-        if (dataTreeChangeListenerRegistration != null) {
-            dataTreeChangeListenerRegistration.close();
-        }
-        if (mappingListenerListenerRegistration != null) {
-            mappingListenerListenerRegistration.close();
-        }
-        if (dataTreeChangeListenerRegistration1 != null) {
-            dataTreeChangeListenerRegistration1.close();
-        }
-        if (tapiNetworkutilsServiceRpcRegistration != null) {
-            tapiNetworkutilsServiceRpcRegistration.close();
-        }
+        listeners.forEach(lis -> lis.close());
+        listeners.clear();
         pcelistenerRegistration.close();
         rendererlistenerRegistration.close();
         servicehandlerlistenerRegistration.close();
+        tapinetworkmodellistenerRegistration.close();
         rpcRegistration.close();
+        LOG.info("TapiProvider Session Closed");
     }
+
+    public Registration getRegisteredRpcs() {
+        return rpcRegistration;
+    }
+
 }
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/CreateConnectivityServiceImpl.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/CreateConnectivityServiceImpl.java
new file mode 100644 (file)
index 0000000..317a079
--- /dev/null
@@ -0,0 +1,200 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.tapi.impl.rpc;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+import org.opendaylight.mdsal.binding.api.RpcService;
+import org.opendaylight.transportpce.common.OperationResult;
+import org.opendaylight.transportpce.common.ResponseCodes;
+import org.opendaylight.transportpce.tapi.connectivity.ConnectivityUtils;
+import org.opendaylight.transportpce.tapi.listeners.TapiPceNotificationHandler;
+import org.opendaylight.transportpce.tapi.listeners.TapiRendererNotificationHandler;
+import org.opendaylight.transportpce.tapi.utils.TapiContext;
+import org.opendaylight.transportpce.tapi.validation.CreateConnectivityServiceValidation;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreate;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.ForwardingDirection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.capacity.TotalSizeBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CreateConnectivityService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CreateConnectivityServiceInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CreateConnectivityServiceOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CreateConnectivityServiceOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.ServiceType;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.ConnectivityConstraintBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.end.point.CapacityBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.end.point.ServiceInterfacePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.create.connectivity.service.output.ServiceBuilder;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class CreateConnectivityServiceImpl implements CreateConnectivityService {
+    private static final Logger LOG = LoggerFactory.getLogger(CreateConnectivityServiceImpl.class);
+
+    private final RpcService rpcService;
+    private final TapiContext tapiContext;
+    private final ConnectivityUtils connectivityUtils;
+    private TapiPceNotificationHandler pceListenerImpl;
+    private TapiRendererNotificationHandler rendererListenerImpl;
+
+    public CreateConnectivityServiceImpl(RpcService rpcService, TapiContext tapiContext,
+            ConnectivityUtils connectivityUtils, TapiPceNotificationHandler pceListenerImpl,
+            TapiRendererNotificationHandler rendererListenerImpl) {
+        this.rpcService = rpcService;
+        this.tapiContext = tapiContext;
+        this.connectivityUtils = connectivityUtils;
+        this.pceListenerImpl = pceListenerImpl;
+        this.rendererListenerImpl = rendererListenerImpl;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<CreateConnectivityServiceOutput>> invoke(CreateConnectivityServiceInput input) {
+        // TODO: later version of TAPI models include Name as an input parameter in connectivity.yang
+        LOG.info("RPC create-connectivity received: {}", input.getEndPoint());
+        Uuid serviceUuid = new Uuid(UUID.randomUUID().toString());
+        this.pceListenerImpl.setInput(input);
+        this.pceListenerImpl.setServiceUuid(serviceUuid);
+        this.rendererListenerImpl.setServiceUuid(serviceUuid);
+        OperationResult validationResult =
+            CreateConnectivityServiceValidation.validateCreateConnectivityServiceRequest(input);
+        if (!validationResult.isSuccess()) {
+            return RpcResultBuilder.<CreateConnectivityServiceOutput>failed()
+                .withError(ErrorType.RPC, "Failed to create service")
+                .buildFuture();
+        }
+        LOG.info("input parameter of RPC create-connectivity are being handled");
+        // check uuid of SIP in tapi context
+        Map<ServiceInterfacePointKey, ServiceInterfacePoint> sipMap =
+                this.tapiContext.getTapiContext().getServiceInterfacePoint();
+        if (sipMap == null) {
+            return RpcResultBuilder.<CreateConnectivityServiceOutput>failed()
+                .withError(ErrorType.RPC, "SIP list is empty")
+                .buildFuture();
+        }
+        if (!sipMap.containsKey(new ServiceInterfacePointKey(input.getEndPoint().values().stream().findFirst()
+                    .orElseThrow().getServiceInterfacePoint().getServiceInterfacePointUuid()))
+                || !sipMap.containsKey(new ServiceInterfacePointKey(input.getEndPoint().values().stream().skip(1)
+                    .findFirst().orElseThrow().getServiceInterfacePoint().getServiceInterfacePointUuid()))) {
+            LOG.error("Unknown UUID");
+            return RpcResultBuilder.<CreateConnectivityServiceOutput>failed()
+                .withError(ErrorType.RPC, "SIPs do not exist in tapi context")
+                .buildFuture();
+        }
+        LOG.info("SIPs found in sipMap");
+        // TODO: differentiate between OTN service and GbE service in TAPI
+        ServiceCreateInput sci = this.connectivityUtils.createORServiceInput(input, serviceUuid);
+        if (sci == null) {
+            return RpcResultBuilder.<CreateConnectivityServiceOutput>failed()
+                .withError(ErrorType.RPC, "Couldnt map Service create input")
+                .buildFuture();
+        }
+        LOG.info("Service Create input = {}", sci);
+        ListenableFuture<RpcResult<ServiceCreateOutput>> output = rpcService.getRpc(ServiceCreate.class).invoke(sci);
+        if (!output.isDone()) {
+            return RpcResultBuilder.<CreateConnectivityServiceOutput>failed()
+                .withError(ErrorType.RPC, "Service create RPC failed")
+                .buildFuture();
+        }
+        LOG.info("Service create request was successful");
+        try {
+            if (output.get().getResult().getConfigurationResponseCommon().getResponseCode()
+                    .equals(ResponseCodes.RESPONSE_FAILED)) {
+                return RpcResultBuilder.<CreateConnectivityServiceOutput>failed()
+                    .withError(ErrorType.RPC, "Failed to create service")
+                    .buildFuture();
+            }
+            LOG.info("Output of service request = {}", output.get().getResult());
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Error checking response code of service create", e);
+        }
+        // Connections and states should be created/updated when the pce and renderer are done :)
+        Name name = new NameBuilder()
+            .setValueName("Connectivity Service Name")
+            .setValue(serviceUuid.getValue())
+            .build();
+        ConnectivityService service = new ConnectivityServiceBuilder()
+            .setUuid(serviceUuid)
+            .setAdministrativeState(AdministrativeState.LOCKED)
+            .setOperationalState(OperationalState.DISABLED)
+            .setLifecycleState(LifecycleState.PLANNED)
+            .setLayerProtocolName(input.getLayerProtocolName())
+            .setConnectivityConstraint(
+                new ConnectivityConstraintBuilder()
+                    .setServiceType(ServiceType.POINTTOPOINTCONNECTIVITY)
+                    .setServiceLevel(input.getConnectivityConstraint().getServiceLevel())
+                    .build())
+            .setDirection(ForwardingDirection.BIDIRECTIONAL)
+            .setName(Map.of(name.key(), name))
+            .setConnection(new HashMap<>())
+            .setEndPoint(createEndPoints(input.getEndPoint()))
+            .build();
+        // add to tapi context
+        this.tapiContext.updateConnectivityContext(Map.of(service.key(), service), new HashMap<>());
+        LOG.info("Created locked service in Datastore. Waiting for PCE and Renderer to complete tasks...");
+        // return ConnectivityServiceCreateOutput
+        return RpcResultBuilder.success(
+                new CreateConnectivityServiceOutputBuilder()
+                    .setService(new ServiceBuilder(service).build())
+                    .build())
+            .buildFuture();
+    }
+
+    private Map<EndPointKey, EndPoint> createEndPoints(
+            Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                    .create.connectivity.service.input.EndPointKey,
+                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                    .create.connectivity.service.input.EndPoint> endPoints) {
+        Map<EndPointKey, EndPoint> endPointMap = new HashMap<>();
+        for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .create.connectivity.service.input.EndPoint ep: endPoints.values()) {
+            EndPoint endpoint = new EndPointBuilder()
+                .setServiceInterfacePoint(
+                    new ServiceInterfacePointBuilder()
+                        .setServiceInterfacePointUuid(ep.getServiceInterfacePoint().getServiceInterfacePointUuid())
+                        .build())
+                .setName(ep.getName())
+                .setAdministrativeState(ep.getAdministrativeState())
+                .setDirection(ep.getDirection())
+                .setLifecycleState(ep.getLifecycleState())
+                .setOperationalState(ep.getOperationalState())
+                .setLayerProtocolName(ep.getLayerProtocolName())
+                .setCapacity(new CapacityBuilder()
+                    .setTotalSize(new TotalSizeBuilder().build())
+                // TODO: implement bandwidth profile //.setBandwidthProfile(new BandwidthProfileBuilder().build())
+                    .build())
+                .setProtectionRole(ep.getProtectionRole())
+                .setRole(ep.getRole())
+                .setLocalId(ep.getLocalId())
+                .build();
+            endPointMap.put(endpoint.key(), endpoint);
+        }
+        return endPointMap;
+    }
+
+}
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/DeleteConnectivityServiceImpl.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/DeleteConnectivityServiceImpl.java
new file mode 100644 (file)
index 0000000..34f7fbf
--- /dev/null
@@ -0,0 +1,148 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.tapi.impl.rpc;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.concurrent.ExecutionException;
+import org.opendaylight.mdsal.binding.api.RpcService;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.transportpce.common.ResponseCodes;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
+import org.opendaylight.transportpce.tapi.utils.TapiContext;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.sdnc.request.header.SdncRequestHeaderBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDelete;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDeleteOutput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.delete.input.ServiceDeleteReqInfo;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.delete.input.ServiceDeleteReqInfoBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Context;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.Context1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.DeleteConnectivityService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.DeleteConnectivityServiceInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.DeleteConnectivityServiceOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.DeleteConnectivityServiceOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DeleteConnectivityServiceImpl implements DeleteConnectivityService {
+    private static final Logger LOG = LoggerFactory.getLogger(DeleteConnectivityServiceImpl.class);
+
+    private final RpcService rpcService;
+    private final TapiContext tapiContext;
+    private final NetworkTransactionService networkTransactionService;
+
+    public DeleteConnectivityServiceImpl(RpcService rpcService, TapiContext tapiContext,
+            NetworkTransactionService networkTransactionService) {
+        this.rpcService = rpcService;
+        this.tapiContext = tapiContext;
+        this.networkTransactionService = networkTransactionService;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<DeleteConnectivityServiceOutput>> invoke(DeleteConnectivityServiceInput input) {
+        if (input.getUuid() == null) {
+            return RpcResultBuilder.<DeleteConnectivityServiceOutput>failed()
+                .withError(ErrorType.RPC, "Failed to delete Service, service uuid in input is null")
+                .buildFuture();
+        }
+        Uuid serviceUuid = input.getUuid();
+        List<String> serviceName;
+        try {
+            serviceName = getNameFromUuid(serviceUuid, "Service");
+        } catch (ExecutionException | NoSuchElementException e) {
+            LOG.error("Service {} to be deleted not found in the DataStore", serviceUuid, e);
+            return RpcResultBuilder.<DeleteConnectivityServiceOutput>failed()
+                    .withError(ErrorType.RPC, "Failed to delete Service")
+                    .buildFuture();
+        }
+        LOG.debug("The service {}, of name {} has been found in the DS", serviceUuid, serviceName);
+        try {
+            this.tapiContext.deleteConnectivityService(serviceUuid);
+            RpcResult<ServiceDeleteOutput> rpcResult =
+                rpcService.getRpc(ServiceDelete.class)
+                    .invoke(new ServiceDeleteInputBuilder()
+                            .setServiceDeleteReqInfo(new ServiceDeleteReqInfoBuilder()
+                                    .setServiceName(input.getUuid().getValue())
+                                    .setTailRetention(ServiceDeleteReqInfo.TailRetention.No)
+                                    .build())
+                            .setSdncRequestHeader(new SdncRequestHeaderBuilder()
+                                    .setRequestId("request-1")
+                                    .setNotificationUrl("notification url")
+                                    .setRequestSystemId("appname")
+                                    .setRpcAction(RpcActions.ServiceDelete)
+                                    .build())
+                            .build())
+                    .get();
+            if (rpcResult.getResult().getConfigurationResponseCommon().getResponseCode()
+                    .equals(ResponseCodes.RESPONSE_FAILED)) {
+                LOG.error("Failed to delete service. Deletion process failed");
+                return RpcResultBuilder.<DeleteConnectivityServiceOutput>failed()
+                    .withError(ErrorType.RPC, "Failed to delete Service, service uuid in input is null")
+                    .buildFuture();
+            }
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Failed to delete service.", e);
+            return RpcResultBuilder.<DeleteConnectivityServiceOutput>failed()
+                    .withError(ErrorType.RPC, "Failed to delete Service")
+                    .buildFuture();
+        }
+        LOG.info("Service is being deleted and devices are being rolled back");
+        return RpcResultBuilder.success(new DeleteConnectivityServiceOutputBuilder().build()).buildFuture();
+    }
+
+    public List<String> getNameFromUuid(Uuid uuid, String typeOfNode)
+            throws ExecutionException, NoSuchElementException {
+        if (!typeOfNode.equals("Service")) {
+            return new ArrayList<>();
+        }
+        InstanceIdentifier<ConnectivityService> nodeIID = InstanceIdentifier.builder(Context.class)
+                .augmentation(Context1.class)
+                .child(ConnectivityContext.class)
+                .child(ConnectivityService.class, new ConnectivityServiceKey(uuid))
+                .build();
+        List<String> nameList = new ArrayList<>();
+        try {
+            Map<NameKey, Name> nameMap = this.networkTransactionService
+                .read(LogicalDatastoreType.OPERATIONAL, nodeIID)
+                .get().orElseThrow().getName();
+            for (Map.Entry<NameKey, Name> entry : nameMap.entrySet()) {
+                nameList.add(entry.getValue().getValue());
+            }
+            //TODO another structure (stream ?) might be more indicated here
+        } catch (InterruptedException e) {
+            LOG.error("GetNamefromUuid Interrupt exception: Service not in Datastore, Interruption of the process");
+            Thread.currentThread().interrupt();
+            // TODO: investigate on how to throw Interrupted exception (generate a check
+            // violation error)
+        } catch (ExecutionException e) {
+            throw new ExecutionException("Unable to get from mdsal service: "
+                    + nodeIID.firstKeyOf(ConnectivityService.class).getUuid().getValue(), e);
+        } catch (NoSuchElementException e) {
+            throw new NoSuchElementException("Unable to get from mdsal service: "
+                    + nodeIID.firstKeyOf(ConnectivityService.class).getUuid().getValue(), e);
+        }
+        LOG.debug("The service name of service {}, is {}", uuid, nameList);
+        return nameList;
+    }
+
+}
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/DeleteTapiLinkImpl.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/DeleteTapiLinkImpl.java
new file mode 100644 (file)
index 0000000..42b73e9
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.tapi.impl.rpc;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.concurrent.ExecutionException;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
+import org.opendaylight.transportpce.tapi.topology.TapiNetworkUtilsImpl;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev230728.DeleteTapiLink;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev230728.DeleteTapiLinkInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev230728.DeleteTapiLinkOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev230728.DeleteTapiLinkOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Context;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.context.TopologyContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyKey;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class DeleteTapiLinkImpl implements DeleteTapiLink {
+    private static final Logger LOG = LoggerFactory.getLogger(DeleteTapiLinkImpl.class);
+
+    private TapiNetworkUtilsImpl tapiNetworkUtilsImpl;
+    private NetworkTransactionService networkTransactionService;
+
+    public DeleteTapiLinkImpl(TapiNetworkUtilsImpl tapiNetworkUtilsImpl,
+            NetworkTransactionService networkTransactionService) {
+        this.tapiNetworkUtilsImpl = tapiNetworkUtilsImpl;
+        this.networkTransactionService = networkTransactionService;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<DeleteTapiLinkOutput>> invoke(DeleteTapiLinkInput input) {
+        // TODO: check if this IID is correct
+        // TODO --> need to check if the link exists in the topology
+        try {
+            InstanceIdentifier<Link> linkIID = InstanceIdentifier.builder(Context.class)
+                .augmentation(Context1.class)
+                .child(TopologyContext.class)
+                .child(Topology.class, new TopologyKey(tapiNetworkUtilsImpl.getTapiTopoUuid()))
+                .child(Link.class, new LinkKey(input.getUuid()))
+                .build();
+            this.networkTransactionService.delete(LogicalDatastoreType.OPERATIONAL, linkIID);
+            this.networkTransactionService.commit().get();
+            LOG.info("TAPI link deleted successfully.");
+            return RpcResultBuilder.success(new DeleteTapiLinkOutputBuilder()
+                .setResult("Link successfully deleted from tapi topology").build()).buildFuture();
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Failed to delete TAPI link", e);
+            return RpcResultBuilder.<DeleteTapiLinkOutput>failed()
+                .withError(ErrorType.RPC, "Failed to delete link from topology")
+                .buildFuture();
+        }
+    }
+
+}
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetConnectionDetailsImpl.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetConnectionDetailsImpl.java
new file mode 100644 (file)
index 0000000..27c3bd4
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.tapi.impl.rpc;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.transportpce.tapi.utils.TapiContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectionDetails;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectionDetailsInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectionDetailsOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectionDetailsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.Connection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.get.connection.details.output.ConnectionBuilder;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class GetConnectionDetailsImpl implements GetConnectionDetails {
+    private static final Logger LOG = LoggerFactory.getLogger(GetConnectionDetailsImpl.class);
+
+    private final TapiContext tapiContext;
+
+    public GetConnectionDetailsImpl(TapiContext tapiContext) {
+        this.tapiContext = tapiContext;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<GetConnectionDetailsOutput>> invoke(GetConnectionDetailsInput input) {
+        // TODO Auto-generated method stub
+        Uuid connectionUuid = input.getUuid();
+        Connection connection = this.tapiContext.getConnection(connectionUuid);
+        if (connection == null) {
+            LOG.error("Connection {} doesnt exist in tapi context", input.getUuid());
+            return RpcResultBuilder.<GetConnectionDetailsOutput>failed()
+                .withError(ErrorType.RPC, "Connection doesnt exist in datastore")
+                .buildFuture();
+        }
+        return RpcResultBuilder.success(new GetConnectionDetailsOutputBuilder().setConnection(
+                new ConnectionBuilder(connection).build()).build()).buildFuture();
+    }
+
+}
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetConnectivityServiceDetailsImpl.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetConnectivityServiceDetailsImpl.java
new file mode 100644 (file)
index 0000000..6d5066b
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.tapi.impl.rpc;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.transportpce.tapi.utils.TapiContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectivityServiceDetails;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectivityServiceDetailsInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectivityServiceDetailsOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectivityServiceDetailsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityService;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class GetConnectivityServiceDetailsImpl implements GetConnectivityServiceDetails {
+    private static final Logger LOG = LoggerFactory.getLogger(GetConnectivityServiceDetailsImpl.class);
+
+    private final TapiContext tapiContext;
+
+    public GetConnectivityServiceDetailsImpl(TapiContext tapiContext) {
+        this.tapiContext = tapiContext;
+    }
+
+
+    @Override
+    public ListenableFuture<RpcResult<GetConnectivityServiceDetailsOutput>> invoke(
+            GetConnectivityServiceDetailsInput input) {
+        // TODO Auto-generated method stub
+        Uuid serviceUuid = input.getUuid();
+        ConnectivityService service = this.tapiContext.getConnectivityService(serviceUuid);
+        if (service == null) {
+            LOG.error("Service {} doesnt exist in tapi context", input.getUuid());
+            return RpcResultBuilder.<GetConnectivityServiceDetailsOutput>failed()
+                .withError(ErrorType.RPC, "Service doesnt exist in datastore")
+                .buildFuture();
+        }
+        return RpcResultBuilder.success(new GetConnectivityServiceDetailsOutputBuilder().setService(
+            new org.opendaylight.yang.gen.v1.urn
+                .onf.otcc.yang.tapi.connectivity.rev221121.get.connectivity.service.details.output.ServiceBuilder(
+                    service).build()).build()).buildFuture();
+    }
+
+}
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetConnectivityServiceListImpl.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetConnectivityServiceListImpl.java
new file mode 100644 (file)
index 0000000..724cae4
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.tapi.impl.rpc;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.HashMap;
+import java.util.Map;
+import org.opendaylight.transportpce.tapi.utils.TapiContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectivityServiceList;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectivityServiceListInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectivityServiceListOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.GetConnectivityServiceListOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.get.connectivity.service.list.output.Service;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.get.connectivity.service.list.output.ServiceBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.get.connectivity.service.list.output.ServiceKey;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class GetConnectivityServiceListImpl implements GetConnectivityServiceList {
+    private static final Logger LOG = LoggerFactory.getLogger(GetConnectivityServiceListImpl.class);
+
+    private final TapiContext tapiContext;
+
+    public GetConnectivityServiceListImpl(TapiContext tapiContext) {
+        this.tapiContext = tapiContext;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<GetConnectivityServiceListOutput>> invoke(GetConnectivityServiceListInput input) {
+        // TODO Auto-generated method stub
+        Map<ConnectivityServiceKey, ConnectivityService> connMap = this.tapiContext.getConnectivityServices();
+        if (connMap == null) {
+            LOG.error("No services in tapi context");
+            return RpcResultBuilder.<GetConnectivityServiceListOutput>failed()
+                .withError(ErrorType.RPC, "No services exist in datastore")
+                .buildFuture();
+        }
+
+        Map<ServiceKey, Service> serviceMap = new HashMap<>();
+        for (ConnectivityService connectivityService: connMap.values()) {
+            Service service = new ServiceBuilder(connectivityService).build();
+            serviceMap.put(service.key(), service);
+        }
+        return RpcResultBuilder
+            .success(new GetConnectivityServiceListOutputBuilder().setService(serviceMap).build())
+            .buildFuture();
+    }
+
+}
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetLinkDetailsImpl.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetLinkDetailsImpl.java
new file mode 100644 (file)
index 0000000..ba2240b
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.tapi.impl.rpc;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.transportpce.tapi.utils.TapiContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetLinkDetails;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetLinkDetailsInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetLinkDetailsOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetLinkDetailsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.get.link.details.output.LinkBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class GetLinkDetailsImpl implements GetLinkDetails {
+    private static final Logger LOG = LoggerFactory.getLogger(GetLinkDetailsImpl.class);
+    private final TapiContext tapiContext;
+
+    public GetLinkDetailsImpl(TapiContext tapiContext) {
+        this.tapiContext = tapiContext;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<GetLinkDetailsOutput>> invoke(GetLinkDetailsInput input) {
+        // TODO Auto-generated method stub
+        // Link id: same as OR link id
+        Link link = this.tapiContext.getTapiLink(input.getTopologyId(), input.getLinkId());
+        if (link == null) {
+            LOG.error("Invalid TAPI link name");
+            return RpcResultBuilder.<GetLinkDetailsOutput>failed()
+                .withError(ErrorType.RPC, "Invalid Link name")
+                .buildFuture();
+        }
+        LOG.info("debug link is : {}", link.getName());
+        return RpcResultBuilder
+                .success(new GetLinkDetailsOutputBuilder().setLink(new LinkBuilder(link).build()).build())
+                .buildFuture();
+    }
+
+}
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetNodeDetailsImpl.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetNodeDetailsImpl.java
new file mode 100644 (file)
index 0000000..80cf31d
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.tapi.impl.rpc;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.transportpce.tapi.utils.TapiContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetNodeDetails;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetNodeDetailsInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetNodeDetailsOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetNodeDetailsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.get.node.details.output.NodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class GetNodeDetailsImpl implements GetNodeDetails {
+    private static final Logger LOG = LoggerFactory.getLogger(GetNodeDetailsImpl.class);
+    private final TapiContext tapiContext;
+
+    public GetNodeDetailsImpl(TapiContext tapiContext) {
+        this.tapiContext = tapiContext;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<GetNodeDetailsOutput>> invoke(GetNodeDetailsInput input) {
+        // TODO Auto-generated method stub
+        // TODO -> maybe we get errors when having CEPs?
+        // Node id: if roadm -> ROADM+PHOTONIC_MEDIA. if xpdr -> XPDR-XPDR+DSR/OTSi
+        Node node = this.tapiContext.getTapiNode(input.getTopologyId(), input.getNodeId());
+        if (node == null) {
+            LOG.error("Invalid TAPI node name");
+            return RpcResultBuilder.<GetNodeDetailsOutput>failed()
+                .withError(ErrorType.RPC, "Invalid Tapi Node name")
+                .buildFuture();
+        }
+        return RpcResultBuilder
+            .success(new GetNodeDetailsOutputBuilder()
+                .setNode(new NodeBuilder(node).build())
+                .build())
+            .buildFuture();
+    }
+
+}
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetNodeEdgePointDetailsImpl.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetNodeEdgePointDetailsImpl.java
new file mode 100644 (file)
index 0000000..f26606f
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.tapi.impl.rpc;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import org.opendaylight.transportpce.tapi.utils.TapiContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetNodeEdgePointDetails;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetNodeEdgePointDetailsInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetNodeEdgePointDetailsOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetNodeEdgePointDetailsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.get.node.edge.point.details.output.NodeEdgePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class GetNodeEdgePointDetailsImpl implements GetNodeEdgePointDetails {
+    private static final Logger LOG = LoggerFactory.getLogger(GetNodeEdgePointDetailsImpl.class);
+    private final TapiContext tapiContext;
+
+    public GetNodeEdgePointDetailsImpl(TapiContext tapiContext) {
+        this.tapiContext = tapiContext;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<GetNodeEdgePointDetailsOutput>> invoke(GetNodeEdgePointDetailsInput input) {
+        // TODO Auto-generated method stub
+        // TODO -> maybe we get errors when having CEPs?
+        // Node id: if roadm -> ROADMid+PHOTONIC_MEDIA. if xpdr -> XPDRid-XPDRnbr+DSR/OTSi
+        // NEP id: if roadm -> ROADMid+PHOTONIC_MEDIA/MC/OTSiMC+TPid.
+        // if xpdr -> XPDRid-XPDRnbr+DSR/eODU/iODU/iOTSi/eOTSi/PHOTONIC_MEDIA+TPid
+        OwnedNodeEdgePoint nep =
+            this.tapiContext.getTapiNEP(input.getTopologyId(), input.getNodeId(), input.getNodeEdgePointId());
+        if (nep == null) {
+            LOG.error("Invalid TAPI nep name");
+            return RpcResultBuilder.<GetNodeEdgePointDetailsOutput>failed()
+                .withError(ErrorType.RPC, "Invalid NEP name")
+                .buildFuture();
+        }
+        return RpcResultBuilder
+                .success(new GetNodeEdgePointDetailsOutputBuilder()
+                        .setNodeEdgePoint(new NodeEdgePointBuilder(nep).build())
+                        .build())
+                .buildFuture();
+    }
+
+}
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetServiceInterfacePointDetailsImpl.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetServiceInterfacePointDetailsImpl.java
new file mode 100644 (file)
index 0000000..fc10f05
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.tapi.impl.rpc;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.Map;
+import org.opendaylight.transportpce.tapi.utils.TapiContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.GetServiceInterfacePointDetails;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.GetServiceInterfacePointDetailsInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.GetServiceInterfacePointDetailsOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.GetServiceInterfacePointDetailsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.get.service._interface.point.details.output.SipBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class GetServiceInterfacePointDetailsImpl implements GetServiceInterfacePointDetails {
+    private static final Logger LOG = LoggerFactory.getLogger(GetServiceInterfacePointDetailsImpl.class);
+    private final TapiContext tapiContext;
+
+    public GetServiceInterfacePointDetailsImpl(TapiContext tapiContext) {
+        this.tapiContext = tapiContext;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<GetServiceInterfacePointDetailsOutput>> invoke(
+            GetServiceInterfacePointDetailsInput input) {
+        Map<ServiceInterfacePointKey, ServiceInterfacePoint> sips =
+            this.tapiContext.getTapiContext().getServiceInterfacePoint();
+        if (sips == null || sips.isEmpty()) {
+            return RpcResultBuilder.<GetServiceInterfacePointDetailsOutput>failed()
+                .withError(ErrorType.RPC, "No sips in datastore")
+                .buildFuture();
+        }
+        var sipKey = new ServiceInterfacePointKey(input.getUuid());
+        if (!sips.containsKey(sipKey)) {
+            return RpcResultBuilder.<GetServiceInterfacePointDetailsOutput>failed()
+                .withError(ErrorType.RPC, "Sip doesnt exist in datastore")
+                .buildFuture();
+        }
+        return RpcResultBuilder
+                .success(new GetServiceInterfacePointDetailsOutputBuilder()
+                    .setSip(new SipBuilder(sips.get(sipKey)).build())
+                    .build())
+                .buildFuture();
+    }
+
+}
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetServiceInterfacePointListImpl.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetServiceInterfacePointListImpl.java
new file mode 100644 (file)
index 0000000..5cfe7f1
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.tapi.impl.rpc;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.HashMap;
+import java.util.Map;
+import org.opendaylight.transportpce.tapi.utils.TapiContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.GetServiceInterfacePointList;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.GetServiceInterfacePointListInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.GetServiceInterfacePointListOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.GetServiceInterfacePointListOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.get.service._interface.point.list.output.Sip;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.get.service._interface.point.list.output.SipBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.get.service._interface.point.list.output.SipKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class GetServiceInterfacePointListImpl implements GetServiceInterfacePointList {
+    private static final Logger LOG = LoggerFactory.getLogger(GetServiceInterfacePointListImpl.class);
+    private final TapiContext tapiContext;
+
+    public GetServiceInterfacePointListImpl(TapiContext tapiContext) {
+        this.tapiContext = tapiContext;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<GetServiceInterfacePointListOutput>> invoke(
+            GetServiceInterfacePointListInput input) {
+        Map<ServiceInterfacePointKey, ServiceInterfacePoint> sips =
+                this.tapiContext.getTapiContext().getServiceInterfacePoint();
+        if (sips == null || sips.isEmpty()) {
+            return RpcResultBuilder.<GetServiceInterfacePointListOutput>failed()
+                .withError(ErrorType.RPC, "No sips in datastore")
+                .buildFuture();
+        }
+        Map<SipKey, Sip> outSipMap = new HashMap<>();
+        for (ServiceInterfacePoint sip : sips.values()) {
+            Sip si = new SipBuilder(sip).build();
+            outSipMap.put(si.key(), si);
+        }
+        return RpcResultBuilder
+            .success(new GetServiceInterfacePointListOutputBuilder().setSip(outSipMap).build())
+            .buildFuture();
+    }
+
+}
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetTopologyDetailsImpl.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetTopologyDetailsImpl.java
new file mode 100644 (file)
index 0000000..7395f96
--- /dev/null
@@ -0,0 +1,459 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.tapi.impl.rpc;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+import java.util.stream.Collectors;
+import org.eclipse.jdt.annotation.Nullable;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.transportpce.common.InstanceIdentifiers;
+import org.opendaylight.transportpce.common.NetworkUtils;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
+import org.opendaylight.transportpce.tapi.TapiStringConstants;
+import org.opendaylight.transportpce.tapi.topology.ConvertORToTapiTopology;
+import org.opendaylight.transportpce.tapi.topology.ConvertORTopoToTapiTopo;
+import org.opendaylight.transportpce.tapi.topology.ConvertTapiTopoToAbstracted;
+import org.opendaylight.transportpce.tapi.topology.TapiTopologyException;
+import org.opendaylight.transportpce.tapi.topology.TopologyUtils;
+import org.opendaylight.transportpce.tapi.utils.TapiContext;
+import org.opendaylight.transportpce.tapi.utils.TapiLink;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.FORWARDINGRULEMAYFORWARDACROSSGROUP;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetTopologyDetails;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetTopologyDetailsInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetTopologyDetailsOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetTopologyDetailsOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.RuleType;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroup;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.Rule;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.RuleBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.RuleKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyKey;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class GetTopologyDetailsImpl implements GetTopologyDetails {
+    private static final Logger LOG = LoggerFactory.getLogger(GetTopologyDetailsImpl.class);
+
+    private final TapiContext tapiContext;
+    private final TopologyUtils topologyUtils;
+    private final TapiLink tapiLink;
+    private final NetworkTransactionService networkTransactionService;
+    private Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSips;
+
+    public GetTopologyDetailsImpl(TapiContext tapiContext, TopologyUtils topologyUtils, TapiLink tapiLink,
+            NetworkTransactionService networkTransactionService) {
+        this.tapiContext = tapiContext;
+        this.topologyUtils = topologyUtils;
+        this.tapiLink = tapiLink;
+        this.tapiSips = new HashMap<>();
+        this.networkTransactionService = networkTransactionService;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<GetTopologyDetailsOutput>> invoke(GetTopologyDetailsInput input) {
+        var topoId = input.getTopologyId();
+        Uuid topologyUuidFull = new Uuid(UUID.nameUUIDFromBytes(
+                TapiStringConstants.T0_FULL_MULTILAYER.getBytes(Charset.forName("UTF-8")))
+            .toString());
+        if (topologyUuidFull.equals(topoId)) {
+            Map<TopologyKey, Topology> topologyMap =
+                this.tapiContext.getTapiContext().augmentation(Context1.class).getTopologyContext().getTopology();
+            if (topologyMap == null || !topologyMap.containsKey(new TopologyKey(topologyUuidFull))) {
+                LOG.error("Topology {} not found in datastore", topoId);
+                return RpcResultBuilder.<GetTopologyDetailsOutput>failed()
+                    .withError(ErrorType.RPC, "Invalid Topology name")
+                    .buildFuture();
+            }
+            return RpcResultBuilder
+                .success(
+                    new GetTopologyDetailsOutputBuilder()
+                        .setTopology(
+                            this.topologyUtils.transformTopology(
+                                topologyMap.get(new TopologyKey(topoId))))
+                        .build())
+                .buildFuture();
+        }
+        if (new Uuid(UUID.nameUUIDFromBytes(
+                        TapiStringConstants.T0_TAPI_MULTILAYER.getBytes(Charset.forName("UTF-8")))
+                    .toString())
+                .equals(topoId)) {
+            try {
+                LOG.info("Building TAPI Topology abstraction for {}", topoId);
+                return RpcResultBuilder
+                    .success(
+                        new GetTopologyDetailsOutputBuilder()
+                            .setTopology(this.topologyUtils.transformTopology(createAbsTopologyFromTapiTopo()))
+                            .build())
+                    .buildFuture();
+            } catch (TapiTopologyException e) {
+                LOG.error("error building TAPI topology");
+                return RpcResultBuilder.<GetTopologyDetailsOutput>failed()
+                    .withError(ErrorType.RPC, "Error building topology")
+                    .buildFuture();
+            }
+        }
+        try {
+            if (new Uuid(UUID.nameUUIDFromBytes(
+                            TapiStringConstants.T0_MULTILAYER.getBytes(Charset.forName("UTF-8")))
+                        .toString())
+                    .equals(topoId)) {
+                LOG.info("Building TAPI Topology abstraction for {}", topoId);
+                return RpcResultBuilder
+                    .success(
+                        new GetTopologyDetailsOutputBuilder()
+                            .setTopology(this.topologyUtils.transformTopology(createAbstractedOtnTopology()))
+                            .build())
+                    .buildFuture();
+            }
+            if (new Uuid(UUID.nameUUIDFromBytes(
+                            TapiStringConstants.TPDR_100G.getBytes(Charset.forName("UTF-8")))
+                        .toString())
+                    .equals(topoId)) {
+                LOG.info("Building TAPI Topology abstraction for {}", topoId);
+                return RpcResultBuilder
+                    .success(
+                        new GetTopologyDetailsOutputBuilder()
+                            .setTopology(
+                                this.topologyUtils.transformTopology(
+                                    createAbstracted100GTpdrTopology(createAbstractedOtnTopology())))
+                            .build())
+                    .buildFuture();
+            }
+            return RpcResultBuilder.<GetTopologyDetailsOutput>failed()
+                .withError(ErrorType.RPC, "Invalid Topology name")
+                .buildFuture();
+        } catch (TapiTopologyException e) {
+            LOG.error("error building TAPI topology");
+            return RpcResultBuilder.<GetTopologyDetailsOutput>failed()
+                .withError(ErrorType.RPC, "Error building topology")
+                .buildFuture();
+        }
+    }
+
+    public Topology createAbstracted100GTpdrTopology(Topology topology) {
+        List<OwnedNodeEdgePoint> nep100GTpdrList = new ArrayList<>();
+        for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node node2 :
+                topology.nonnullNode().values().stream()
+                    .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR))
+                    .collect(Collectors.toList())) {
+            List<OwnedNodeEdgePoint> nepList = node2.getOwnedNodeEdgePoint().values().stream()
+                    .filter(nep -> nep.getName().containsKey(new NameKey("100G-tpdr")))
+                    .collect(Collectors.toList());
+            nep100GTpdrList.addAll(nepList);
+        }
+        Name topoName = new NameBuilder()
+                .setValue(TapiStringConstants.TPDR_100G)
+                .setValueName("TAPI Topology Name")
+                .build();
+        Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(
+                TapiStringConstants.TPDR_100G.getBytes(Charset.forName("UTF-8")))
+            .toString());
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node node =
+            createTapiNode(nep100GTpdrList, topoUuid);
+        return new TopologyBuilder()
+            .setName(Map.of(topoName.key(), topoName))
+            .setUuid(topoUuid)
+            .setNode(Map.of(node.key(), node))
+            .setLayerProtocolName(Set.of(LayerProtocolName.DSR, LayerProtocolName.ETH))
+            .build();
+    }
+
+    public Topology createAbstractedOtnTopology() throws TapiTopologyException {
+        // read openroadm-topology
+        Network openroadmTopo = readTopology(InstanceIdentifiers.OVERLAY_NETWORK_II);
+        List<Link> linkList = new ArrayList<>();
+        if (openroadmTopo.augmentation(Network1.class) != null) {
+            linkList.addAll(openroadmTopo.augmentation(Network1.class).getLink().values());
+        }
+        List<Link> xponderOutLinkList = linkList.stream()
+                .filter(lk -> lk.augmentation(Link1.class).getLinkType().equals(OpenroadmLinkType.XPONDEROUTPUT))
+                .collect(Collectors.toList());
+        List<Link> xponderInLinkList = linkList.stream()
+                .filter(lk -> lk.augmentation(Link1.class).getLinkType().equals(OpenroadmLinkType.XPONDERINPUT))
+                .collect(Collectors.toList());
+        // read otn-topology
+        Network otnTopo = readTopology(InstanceIdentifiers.OTN_NETWORK_II);
+        Map<NodeId, Node> otnNodeMap = otnTopo.nonnullNode().values().stream()
+                .collect(Collectors.toMap(Node::getNodeId, node -> node));
+
+        Map<String, List<String>> networkPortMap = new HashMap<>();
+        Iterator<Entry<NodeId, Node>> itOtnNodeMap = otnNodeMap.entrySet().iterator();
+        while (itOtnNodeMap.hasNext()) {
+            Entry<NodeId, Node> entry = itOtnNodeMap.next();
+            String portMappingNodeId = entry.getValue().getSupportingNode().values().stream()
+                    .filter(sn -> sn.getNetworkRef().getValue().equals(NetworkUtils.UNDERLAY_NETWORK_ID))
+                    .findFirst()
+                    .orElseThrow().getNodeRef().getValue();
+            List<String> networkPortList = new ArrayList<>();
+            for (TerminationPoint tp : entry.getValue().augmentation(Node1.class).getTerminationPoint().values()) {
+                if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)
+                        && checkTp(entry.getKey().getValue(), portMappingNodeId, tp, xponderOutLinkList,
+                                xponderInLinkList)) {
+                    networkPortList.add(tp.getTpId().getValue());
+                }
+            }
+            if (!networkPortList.isEmpty()) {
+                networkPortMap.put(entry.getKey().getValue(), networkPortList);
+            }
+        }
+        Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> tapiNodeList
+                = new HashMap<>();
+        Map<LinkKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link> tapiLinkList
+                = new HashMap<>();
+        Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(
+                TapiStringConstants.T0_MULTILAYER.getBytes(Charset.forName("UTF-8")))
+            .toString());
+        ConvertORTopoToTapiTopo tapiAbstractFactory = new ConvertORTopoToTapiTopo(topoUuid, this.tapiLink);
+        ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(topoUuid);
+        Iterator<Entry<String, List<String>>> it = networkPortMap.entrySet().iterator();
+        while (it.hasNext()) {
+            String nodeId = it.next().getKey();
+            tapiFactory.convertNode(otnNodeMap.get(new NodeId(nodeId)), networkPortMap.get(nodeId));
+            tapiAbstractFactory.setTapiNodes(tapiFactory.getTapiNodes());
+            tapiAbstractFactory.setTapiSips(tapiFactory.getTapiSips());
+            tapiNodeList.putAll(tapiAbstractFactory.getTapiNodes());
+            tapiLinkList.putAll(tapiAbstractFactory.getTapiLinks());
+        }
+        if (openroadmTopo.nonnullNode().values().stream().filter(nt -> nt
+                .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class)
+                .getNodeType().equals(OpenroadmNodeType.SRG)).count() > 0) {
+            tapiAbstractFactory.convertRoadmInfrastructure();
+            tapiNodeList.putAll(tapiAbstractFactory.getTapiNodes());
+            tapiLinkList.putAll(tapiAbstractFactory.getTapiLinks());
+        } else {
+            LOG.warn("Unable to abstract an ROADM infrasctructure from openroadm-topology");
+        }
+        if (otnTopo.augmentation(Network1.class) != null) {
+            tapiAbstractFactory.convertLinks(otnTopo.augmentation(Network1.class).getLink());
+            tapiLinkList.putAll(tapiAbstractFactory.getTapiLinks());
+        }
+        Name name = new NameBuilder().setValue(
+                TapiStringConstants.T0_MULTILAYER).setValueName("TAPI Topology Name")
+            .build();
+        LOG.info("TOPOABSTRACTED : the list of node is as follows {}", tapiNodeList);
+        this.tapiSips.putAll(tapiAbstractFactory.getTapiSips());
+        return new TopologyBuilder()
+            .setName(Map.of(name.key(), name))
+            .setUuid(topoUuid)
+            .setNode(tapiNodeList)
+            .setLayerProtocolName(Set.of(LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.DIGITALOTN))
+            .setLink(tapiLinkList)
+            .build();
+    }
+
+    public Topology createAbsTopologyFromTapiTopo() throws TapiTopologyException {
+        Uuid refTopoUuid = new Uuid(UUID.nameUUIDFromBytes(
+                    TapiStringConstants.T0_FULL_MULTILAYER.getBytes(Charset.forName("UTF-8")))
+            .toString());
+        Topology tapiFullTopo =
+            this.tapiContext
+                .getTopologyContext().entrySet().stream().filter(topo -> topo.getKey().getUuid().equals(refTopoUuid))
+                .findAny().orElseThrow().getValue();
+        ConvertTapiTopoToAbstracted absTapiTopo = new ConvertTapiTopoToAbstracted(refTopoUuid);
+        absTapiTopo.setTapiLinks(tapiFullTopo.getLink());
+        absTapiTopo.setTapiNodes(tapiFullTopo.getNode());
+        absTapiTopo.convertRoadmInfrastructure();
+
+        Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
+            tapiNodeList = new HashMap<>(absTapiTopo.getTapiNodes());
+        LOG.info("ABSTRACTED TAPI TOPOLOGY : the list of node is as follows {}", tapiNodeList);
+        Name name = new NameBuilder()
+            .setValue(TapiStringConstants.T0_MULTILAYER)
+            .setValueName("TAPI Topology Name")
+            .build();
+        return new TopologyBuilder()
+            .setName(Map.of(name.key(), name))
+            .setUuid(
+                new Uuid(UUID.nameUUIDFromBytes(
+                        TapiStringConstants.T0_TAPI_MULTILAYER.getBytes(Charset.forName("UTF-8")))
+                    .toString()))
+            .setNode(tapiNodeList)
+            .setLayerProtocolName(Set.of(LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.DIGITALOTN))
+            .setLink(new HashMap<>(absTapiTopo.getTapiLinks()))
+            .build();
+    }
+
+    private Network readTopology(InstanceIdentifier<Network> networkIID) throws TapiTopologyException {
+        Network topology = null;
+        ListenableFuture<Optional<Network>> topologyFuture = networkTransactionService
+                .read(LogicalDatastoreType.CONFIGURATION, networkIID);
+        try {
+            topology = topologyFuture.get().orElseThrow();
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            throw new TapiTopologyException("Unable to get from mdsal topology: "
+                    + networkIID.firstKeyOf(Network.class).getNetworkId().getValue(), e);
+        } catch (ExecutionException e) {
+            throw new TapiTopologyException("Unable to get from mdsal topology: "
+                    + networkIID.firstKeyOf(Network.class).getNetworkId().getValue(), e);
+        }
+        return topology;
+    }
+
+    private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node createTapiNode(
+            List<OwnedNodeEdgePoint> nepList, Uuid topoUuid) {
+        Name name = new NameBuilder().setValueName("Tpdr100g node name").setValue("Tpdr100g over WDM node").build();
+        Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
+        for (OwnedNodeEdgePoint ownedNodeEdgePoint : nepList) {
+            onepMap.put(ownedNodeEdgePoint.key(), ownedNodeEdgePoint);
+        }
+        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(name.getValue().getBytes(Charset.forName("UTF-8"))).toString());
+        return new NodeBuilder()
+                .setUuid(nodeUuid)
+                .setName(Map.of(name.key(), name))
+                .setLayerProtocolName(Set.of(LayerProtocolName.ETH))
+                .setAdministrativeState(AdministrativeState.UNLOCKED)
+                .setOperationalState(OperationalState.ENABLED)
+                .setLifecycleState(LifecycleState.INSTALLED)
+                .setOwnedNodeEdgePoint(onepMap)
+                .setNodeRuleGroup(createNodeRuleGroupFor100gTpdrNode(topoUuid, nodeUuid, nepList))
+                .build();
+    }
+
+    private boolean checkTp(
+            String nodeIdTopo, String nodeIdPortMap, TerminationPoint tp, List<Link> xpdOut, List<Link> xpdIn) {
+        String networkLcp =
+            tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERCLIENT)
+                ? tp.augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1.class)
+                    .getAssociatedConnectionMapTp().iterator().next().getValue()
+                : tp.getTpId().getValue();
+        ListenableFuture<Optional<Mapping>> mappingOpt =
+            networkTransactionService.read(
+                LogicalDatastoreType.CONFIGURATION,
+                InstanceIdentifier.create(
+                    org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.Network.class)
+                        .child(Nodes.class, new NodesKey(nodeIdPortMap))
+                        .child(Mapping.class, new MappingKey(networkLcp)));
+        if (!mappingOpt.isDone()) {
+            LOG.error("Impossible to get mapping of associated network port {} of tp {}",
+                    networkLcp, tp.getTpId().getValue());
+            return false;
+        }
+        Mapping mapping;
+        try {
+            mapping = mappingOpt.get().orElseThrow();
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Error getting mapping for {}", networkLcp, e);
+            return false;
+        }
+        long count = 0;
+        switch (mapping.getPortDirection()) {
+            case "bidirectional":
+                count += xpdOut.stream().filter(lk -> lk.getSource().getSourceNode().getValue().equals(nodeIdTopo)
+                        && lk.getSource().getSourceTp().getValue().equals(networkLcp)).count();
+                count += xpdIn.stream().filter(lk -> lk.getDestination().getDestNode().getValue().equals(nodeIdTopo)
+                        && lk.getDestination().getDestTp().getValue().equals(networkLcp)).count();
+                return count == 2;
+            case "tx":
+            case "rx":
+                @Nullable
+                String partnerLcp = mapping.getPartnerLcp();
+                if (mapping.getPortQual().equals("tx")) {
+                    count += xpdOut.stream().filter(lk -> lk.getSource().getSourceNode().getValue().equals(nodeIdTopo)
+                            && lk.getSource().getSourceTp().getValue().equals(networkLcp)).count();
+                    count += xpdIn.stream().filter(lk -> lk.getDestination().getDestNode().getValue().equals(nodeIdTopo)
+                            && lk.getDestination().getDestTp().getValue().equals(partnerLcp)).count();
+                }
+                if (mapping.getPortQual().equals("rx")) {
+                    count += xpdIn.stream().filter(lk -> lk.getDestination().getDestNode().getValue().equals(nodeIdTopo)
+                            && lk.getDestination().getDestTp().getValue().equals(networkLcp)).count();
+                    count += xpdOut.stream().filter(lk -> lk.getSource().getSourceNode().getValue().equals(nodeIdTopo)
+                            && lk.getSource().getSourceTp().getValue().equals(partnerLcp)).count();
+                }
+                return count == 2;
+            default:
+                LOG.error("Invalid port direction for {}", networkLcp);
+                return false;
+        }
+    }
+
+    private Map<NodeRuleGroupKey, NodeRuleGroup> createNodeRuleGroupFor100gTpdrNode(
+            Uuid topoUuid, Uuid nodeUuid, Collection<OwnedNodeEdgePoint> onepl) {
+        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointKey,
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint> nepMap
+            = new HashMap<>();
+        for (OwnedNodeEdgePoint onep : onepl) {
+            var nep = new NodeEdgePointBuilder()
+                .setTopologyUuid(topoUuid)
+                .setNodeUuid(nodeUuid)
+                .setNodeEdgePointUuid(onep.key().getUuid())
+                .build();
+            nepMap.put(nep.key(), nep);
+        }
+        Rule rule = new RuleBuilder()
+                .setLocalId("forward")
+                .setForwardingRule(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE)
+                .setRuleType(new HashSet<RuleType>(Set.of(RuleType.FORWARDING)))
+                .build();
+        NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
+                .setUuid(new Uuid(UUID.nameUUIDFromBytes(
+                        ("rdm infra node rule group").getBytes(Charset.forName("UTF-8")))
+                    .toString()))
+                .setRule(new HashMap<RuleKey, Rule>(Map.of(rule.key(), rule)))
+                .setNodeEdgePoint(nepMap)
+                .build();
+        return new HashMap<NodeRuleGroupKey, NodeRuleGroup>(Map.of(nodeRuleGroup.key(), nodeRuleGroup));
+    }
+
+}
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetTopologyListImpl.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/GetTopologyListImpl.java
new file mode 100644 (file)
index 0000000..9ebc6a5
--- /dev/null
@@ -0,0 +1,60 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.tapi.impl.rpc;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.HashMap;
+import java.util.Map;
+import org.opendaylight.transportpce.tapi.utils.TapiContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetTopologyList;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetTopologyListInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetTopologyListOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetTopologyListOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.get.topology.list.output.TopologyBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyKey;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class GetTopologyListImpl implements GetTopologyList {
+    private static final Logger LOG = LoggerFactory.getLogger(GetTopologyListImpl.class);
+    private final TapiContext tapiContext;
+
+    public GetTopologyListImpl(TapiContext tapiContext) {
+        this.tapiContext = tapiContext;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<GetTopologyListOutput>> invoke(GetTopologyListInput input) {
+        // TODO Auto-generated method stub
+        // TODO -> maybe we get errors when having CEPs?
+        Map<TopologyKey, Topology> topologyMap = this.tapiContext.getTopologyContext();
+        if (topologyMap.isEmpty()) {
+            LOG.error("No topologies exist in tapi context");
+            return RpcResultBuilder.<GetTopologyListOutput>failed()
+                .withError(ErrorType.APPLICATION, "No topologies exist in tapi context")
+                .buildFuture();
+        }
+        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.get.topology.list.output.TopologyKey,
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.get.topology.list.output.Topology>
+                newTopoMap = new HashMap<>();
+        for (Topology topo : topologyMap.values()) {
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.get.topology.list.output.Topology
+                    newTopo = new TopologyBuilder(topo).build();
+            newTopoMap.put(newTopo.key(), newTopo);
+        }
+        return RpcResultBuilder
+                .success(new GetTopologyListOutputBuilder().setTopology(newTopoMap).build())
+                .buildFuture();
+    }
+
+}
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/InitRoadmRoadmTapiLinkImpl.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/InitRoadmRoadmTapiLinkImpl.java
new file mode 100644 (file)
index 0000000..d46075e
--- /dev/null
@@ -0,0 +1,65 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.tapi.impl.rpc;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.Set;
+import org.opendaylight.transportpce.tapi.TapiStringConstants;
+import org.opendaylight.transportpce.tapi.topology.TapiNetworkUtilsImpl;
+import org.opendaylight.transportpce.tapi.utils.TapiLink;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev230728.InitRoadmRoadmTapiLink;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev230728.InitRoadmRoadmTapiLinkInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev230728.InitRoadmRoadmTapiLinkOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev230728.InitRoadmRoadmTapiLinkOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class InitRoadmRoadmTapiLinkImpl implements InitRoadmRoadmTapiLink {
+    private static final Logger LOG = LoggerFactory.getLogger(InitRoadmRoadmTapiLinkImpl.class);
+
+    private TapiLink tapiLink;
+    private TapiNetworkUtilsImpl tapiNetworkUtilsImpl;
+
+    public InitRoadmRoadmTapiLinkImpl(TapiLink tapiLink, TapiNetworkUtilsImpl tapiNetworkUtilsImpl) {
+        this.tapiLink = tapiLink;
+        this.tapiNetworkUtilsImpl = tapiNetworkUtilsImpl;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<InitRoadmRoadmTapiLinkOutput>> invoke(InitRoadmRoadmTapiLinkInput input) {
+        // TODO --> need to check if the nodes and neps exist in the topology
+        String sourceNode = input.getRdmANode();
+        String sourceTp = input.getDegATp();
+        String destNode = input.getRdmZNode();
+        String destTp = input.getDegZTp();
+        Link link = this.tapiLink.createTapiLink(sourceNode, sourceTp, destNode, destTp,
+            TapiStringConstants.OMS_RDM_RDM_LINK, TapiStringConstants.PHTNC_MEDIA, TapiStringConstants.PHTNC_MEDIA,
+            TapiStringConstants.PHTNC_MEDIA_OTS, TapiStringConstants.PHTNC_MEDIA_OTS,
+            this.tapiLink.getAdminState(sourceNode, sourceTp, destNode, destTp),
+            this.tapiLink.getOperState(sourceNode, sourceTp, destNode, destTp),
+            Set.of(LayerProtocolName.PHOTONICMEDIA), Set.of(LayerProtocolName.PHOTONICMEDIA.getName()),
+            tapiNetworkUtilsImpl.getTapiTopoUuid());
+        if (link == null) {
+            LOG.error("Error creating link object");
+            return RpcResultBuilder.<InitRoadmRoadmTapiLinkOutput>failed()
+                .withError(ErrorType.RPC, "Failed to create link in topology")
+                .buildFuture();
+        }
+        InitRoadmRoadmTapiLinkOutputBuilder output = new InitRoadmRoadmTapiLinkOutputBuilder();
+        if (tapiNetworkUtilsImpl.putLinkInTopology(link)) {
+            output.setResult("Link created in tapi topology. Link-uuid = " + link.getUuid());
+        }
+        return RpcResultBuilder.success(output.build()).buildFuture();
+    }
+}
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/InitXpdrRdmTapiLinkImpl.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/impl/rpc/InitXpdrRdmTapiLinkImpl.java
new file mode 100644 (file)
index 0000000..90c3d61
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.tapi.impl.rpc;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.Set;
+import org.opendaylight.transportpce.tapi.TapiStringConstants;
+import org.opendaylight.transportpce.tapi.topology.TapiNetworkUtilsImpl;
+import org.opendaylight.transportpce.tapi.utils.TapiLink;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev230728.InitXpdrRdmTapiLink;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev230728.InitXpdrRdmTapiLinkInput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev230728.InitXpdrRdmTapiLinkOutput;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev230728.InitXpdrRdmTapiLinkOutputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
+import org.opendaylight.yangtools.yang.common.ErrorType;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class InitXpdrRdmTapiLinkImpl implements InitXpdrRdmTapiLink {
+    private static final Logger LOG = LoggerFactory.getLogger(InitXpdrRdmTapiLinkImpl.class);
+
+    private TapiLink tapiLink;
+    private TapiNetworkUtilsImpl tapiNetworkUtilsImpl;
+
+    public InitXpdrRdmTapiLinkImpl(TapiLink tapiLink, TapiNetworkUtilsImpl tapiNetworkUtilsImpl) {
+        this.tapiLink = tapiLink;
+        this.tapiNetworkUtilsImpl = tapiNetworkUtilsImpl;
+    }
+
+    @Override
+    public ListenableFuture<RpcResult<InitXpdrRdmTapiLinkOutput>> invoke(InitXpdrRdmTapiLinkInput input) {
+        // TODO --> need to check if the nodes and neps exist in the topology
+        String destNode = input.getRdmNode();
+        String destTp = input.getAddDropTp();
+        String sourceNode = input.getXpdrNode();
+        String sourceTp = input.getNetworkTp();
+        Link link = this.tapiLink.createTapiLink(sourceNode, sourceTp, destNode, destTp,
+            TapiStringConstants.OMS_XPDR_RDM_LINK, TapiStringConstants.OTSI, TapiStringConstants.PHTNC_MEDIA,
+            TapiStringConstants.PHTNC_MEDIA_OTS, TapiStringConstants.PHTNC_MEDIA_OTS,
+            this.tapiLink.getAdminState(sourceNode, sourceTp, destNode, destTp),
+            this.tapiLink.getOperState(sourceNode, sourceTp, destNode, destTp),
+            Set.of(LayerProtocolName.PHOTONICMEDIA), Set.of(LayerProtocolName.PHOTONICMEDIA.getName()),
+            tapiNetworkUtilsImpl.getTapiTopoUuid());
+        if (link == null) {
+            LOG.error("Error creating link object");
+            return RpcResultBuilder.<InitXpdrRdmTapiLinkOutput>failed()
+                .withError(ErrorType.RPC, "Failed to create link in topology")
+                .buildFuture();
+        }
+        InitXpdrRdmTapiLinkOutputBuilder output = new InitXpdrRdmTapiLinkOutputBuilder();
+        if (tapiNetworkUtilsImpl.putLinkInTopology(link)) {
+            output.setResult("Link created in tapi topology. Link-uuid = " + link.getUuid());
+        }
+        return RpcResultBuilder.success(output.build()).buildFuture();
+    }
+
+}
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/listeners/TapiNetworkModelNotificationHandler.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/listeners/TapiNetworkModelNotificationHandler.java
new file mode 100644 (file)
index 0000000..b312517
--- /dev/null
@@ -0,0 +1,576 @@
+/*
+ * Copyright © 2021 Nokia, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.tapi.listeners;
+
+import java.nio.charset.StandardCharsets;
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+import java.util.stream.Collectors;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.mdsal.binding.api.NotificationService.CompositeListener;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
+import org.opendaylight.transportpce.tapi.TapiStringConstants;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishTapiNotificationService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishTapiNotificationServiceBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Context;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.DateAndTime;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CONNECTIVITYOBJECTTYPECONNECTIVITYSERVICE;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.OwnedNodeEdgePoint1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connection.LowerConnection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.Connection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectionBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectionKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.NOTIFICATIONTYPEATTRIBUTEVALUECHANGE;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.NameAndValueChange;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.Notification;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.ChangedAttributes;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.ChangedAttributesBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.ChangedAttributesKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.TargetObjectName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.TargetObjectNameBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.TargetObjectNameKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.NodeEdgePointRef;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.TOPOLOGYOBJECTTYPENODEEDGEPOINT;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.context.TopologyContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyKey;
+import org.opendaylight.yangtools.yang.binding.EnumTypeObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Component(service = TapiNetworkModelNotificationHandler.class)
+public class TapiNetworkModelNotificationHandler {
+
+    private static final Logger LOG = LoggerFactory.getLogger(TapiNetworkModelNotificationHandler.class);
+    private final NetworkTransactionService networkTransactionService;
+    private final NotificationPublishService notificationPublishService;
+    private final List<ConnectivityService> connectivityServiceChanges = new ArrayList<>();
+    private final Uuid tapiTopoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
+            .getBytes(StandardCharsets.UTF_8)).toString());
+    private final List<LayerProtocolName> orderedServiceLayerList;
+
+    @Activate
+    public TapiNetworkModelNotificationHandler(@Reference NetworkTransactionService networkTransactionService,
+            @Reference NotificationPublishService notificationPublishService) {
+        this.networkTransactionService = networkTransactionService;
+        this.notificationPublishService = notificationPublishService;
+        this.orderedServiceLayerList = List.of(LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.ODU,
+            LayerProtocolName.DSR, LayerProtocolName.ETH);
+        LOG.debug("TapiNetworkModelListenerImpl instantiated");
+    }
+
+    public CompositeListener getCompositeListener() {
+        return new CompositeListener(Set.of(
+            new CompositeListener.Component<>(Notification.class, this::onNotification)));
+    }
+
+    private void onNotification(Notification notification) {
+        LOG.info("Received network model notification {}", notification);
+        if (notification.getNotificationType().equals(NOTIFICATIONTYPEATTRIBUTEVALUECHANGE.VALUE)
+                && notification.getTargetObjectType().equals(TOPOLOGYOBJECTTYPENODEEDGEPOINT.VALUE)) {
+            if (notification.getChangedAttributes() == null) {
+                return;
+            }
+            // TODO: need to re-think this to update first the connections from roadm to roadm and then the others
+            updateConnections(notification.getChangedAttributes().keySet().stream()
+                    .map(changedAttributesKey -> new Uuid(changedAttributesKey.getValueName()))
+                    .collect(Collectors.toList()), notification.getChangedAttributes().values().stream()
+                    .map(NameAndValueChange::getNewValue)
+                    .collect(Collectors.toList()));
+            updateConnectivityServices();
+            // todo set attributes
+            for (ConnectivityService connService : this.connectivityServiceChanges) {
+                sendNbiNotification(createNbiNotification(connService));
+            }
+        }
+    }
+
+//    @Override
+//    public void onEventNotification(EventNotification notification) {
+//        LOG.info("Received network model notification {}", notification);
+//        //TODO: see if implementation needed and if in TAPI2.4, something supersedes this method
+//    }
+
+    private PublishTapiNotificationService createNbiNotification(ConnectivityService connService) {
+        if (connService == null) {
+            LOG.error("ConnService is null");
+            return null;
+        }
+        Map<ChangedAttributesKey, ChangedAttributes> changedStates = new HashMap<>();
+        changedStates.put(new ChangedAttributesKey("administrativeState"),
+            new ChangedAttributesBuilder()
+                .setNewValue(connService.getAdministrativeState().getName())
+                .setOldValue(connService.getAdministrativeState().equals(AdministrativeState.UNLOCKED)
+                    ? AdministrativeState.LOCKED.getName() : AdministrativeState.UNLOCKED.getName())
+                .setValueName("administrativeState").build());
+        changedStates.put(new ChangedAttributesKey("operationalState"),
+            new ChangedAttributesBuilder()
+                .setNewValue(connService.getOperationalState().getName())
+                .setOldValue(connService.getOperationalState().equals(OperationalState.ENABLED)
+                    ? OperationalState.DISABLED.getName() : OperationalState.ENABLED.getName())
+                .setValueName("operationalState").build());
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx");
+        OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneOffset.UTC);
+        DateAndTime datetime = new DateAndTime(dtf.format(offsetDateTime));
+        Map<TargetObjectNameKey, TargetObjectName> targetObjectNames = new HashMap<>();
+        if (connService.getName() != null) {
+            for (Map.Entry<NameKey, Name> entry : connService.getName().entrySet()) {
+                targetObjectNames.put(new TargetObjectNameKey(entry.getKey().getValueName()),
+                    new TargetObjectNameBuilder()
+                        .setValueName(entry.getValue().getValueName())
+                        .setValue(entry.getValue().getValue())
+                        .build());
+            }
+        }
+
+        return new PublishTapiNotificationServiceBuilder()
+            .setUuid(new Uuid(UUID.randomUUID().toString()))
+            .setTopic(connService.getUuid().getValue())
+            .setTargetObjectIdentifier(connService.getUuid())
+            .setNotificationType(NOTIFICATIONTYPEATTRIBUTEVALUECHANGE.VALUE)
+            .setChangedAttributes(changedStates)
+            .setEventTimeStamp(datetime)
+            .setTargetObjectName(targetObjectNames)
+            .setTargetObjectType(CONNECTIVITYOBJECTTYPECONNECTIVITYSERVICE.VALUE)
+            .setLayerProtocolName(connService.getLayerProtocolName())
+            .build();
+    }
+
+    private void sendNbiNotification(PublishTapiNotificationService service) {
+        try {
+            this.notificationPublishService.putNotification(service);
+        } catch (InterruptedException e) {
+            LOG.warn("Cannot send notification to nbi", e);
+            Thread.currentThread().interrupt();
+        }
+    }
+
+    private void updateConnectivityServices() {
+        try {
+            this.connectivityServiceChanges.clear();
+            InstanceIdentifier<ConnectivityContext> connectivityContextIID =
+                InstanceIdentifier.builder(Context.class).augmentation(
+                        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.Context1.class)
+                    .child(ConnectivityContext.class)
+                    .build();
+            Optional<ConnectivityContext> optConnContext =
+                this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, connectivityContextIID).get();
+            if (optConnContext.isEmpty()) {
+                LOG.error("Could not update TAPI connectivity services");
+                return;
+            }
+            ConnectivityContext connContext = optConnContext.orElseThrow();
+            Map<Uuid, EnumTypeObject[]> states = new HashMap<>();
+            if (connContext.getConnectivityService() == null) {
+                return;
+            }
+            for (ConnectivityService connService : connContext.getConnectivityService().values()) {
+                LOG.info("Connectivity service = {}", connService);
+                // TODO: maybe we need to check lower connections if my new code doesnt work
+                states.put(connService.getUuid(), getStates(connService));
+                AdministrativeState adminState = (AdministrativeState) states.get(connService.getUuid())[0];
+                OperationalState operState = (OperationalState) states.get(connService.getUuid())[1];
+
+                InstanceIdentifier<ConnectivityService> connServIID = InstanceIdentifier
+                    .builder(Context.class).augmentation(org.opendaylight.yang.gen.v1
+                                .urn.onf.otcc.yang.tapi.connectivity.rev221121.Context1.class)
+                    .child(ConnectivityContext.class)
+                    .child(ConnectivityService.class, new ConnectivityServiceKey(connService.getUuid()))
+                    .build();
+                ConnectivityService changedConnServ = new ConnectivityServiceBuilder()
+                    .setUuid(connService.getUuid())
+                    .setAdministrativeState(adminState)
+                    .setOperationalState(operState)
+                    .build();
+                this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, connServIID,
+                    changedConnServ);
+                this.networkTransactionService.commit().get();
+
+                if (connService.getAdministrativeState() != adminState
+                    || connService.getOperationalState() != operState) {
+                    this.connectivityServiceChanges.add(changedConnServ);
+                }
+            }
+            // TODO: this last function may need some refactoring... if the PHOT_MEDIA goes down,
+            //  then ODU goes down and then DSR should also go down
+            for (ConnectivityService connService : connContext.getConnectivityService().values()) {
+                AdministrativeState adminState = (AdministrativeState) states.get(connService.getUuid())[0];
+                OperationalState operState = (OperationalState) states.get(connService.getUuid())[1];
+                this.connectivityServiceChanges.addAll(updateSupportedConnectivityServices(
+                    connContext.getConnectivityService().values(), connService.getUuid(), adminState, operState,
+                    LayerProtocolName.ODU));
+            }
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Could not update TAPI connectivity services");
+        }
+    }
+
+    private EnumTypeObject[] getStates(ConnectivityService connService)
+            throws InterruptedException, ExecutionException {
+        OperationalState operState = OperationalState.ENABLED;
+        AdministrativeState adminState = AdministrativeState.UNLOCKED;
+        if (connService.getConnection() == null) {
+            LOG.info("No connections on service = {}", connService);
+            return new EnumTypeObject[]{null, null};
+        }
+        for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                .connectivity.service.Connection connection : connService.getConnection().values()) {
+            InstanceIdentifier<Connection> connIID =
+                InstanceIdentifier.builder(Context.class).augmentation(org.opendaylight.yang.gen.v1.urn
+                        .onf.otcc.yang.tapi.connectivity.rev221121.Context1.class)
+                    .child(ConnectivityContext.class)
+                    .child(Connection.class, new ConnectionKey(connection.getConnectionUuid()))
+                    .build();
+            Optional<Connection> optConn = this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL,
+                connIID).get();
+            if (optConn.isEmpty()) {
+                LOG.error("Could not get state for a TAPI connection");
+                continue;
+            }
+            LOG.info("State of connection {} of connectivity service {} = {}", optConn.orElseThrow().getUuid()
+                .getValue(), connService.getUuid().getValue(), optConn.orElseThrow().getOperationalState().getName());
+            if (optConn.orElseThrow().getOperationalState() == OperationalState.DISABLED) {
+                adminState = AdministrativeState.LOCKED;
+                operState = OperationalState.DISABLED;
+            }
+        }
+        return new EnumTypeObject[]{adminState, operState};
+    }
+
+    private void updateConnections(List<Uuid> changedOneps, List<String> onepStates) {
+        LOG.info("Updating TAPI connections");
+        LOG.info("Change in oneps = {}, new states = {}", changedOneps, onepStates);
+        try {
+            //should it return a list of connections?
+            InstanceIdentifier<org.opendaylight.yang.gen.v1.urn
+                    .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext> connectivityContextIID =
+                InstanceIdentifier.builder(Context.class).augmentation(
+                            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.Context1.class)
+                        .child(org.opendaylight.yang.gen.v1.urn
+                                .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext.class)
+                        .build();
+            Optional<org.opendaylight.yang.gen.v1.urn
+                    .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext> optConnContext =
+                this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, connectivityContextIID).get();
+            if (optConnContext.isEmpty()) {
+                LOG.error(TapiStringConstants.TAPI_CONNECTION_UPDATE_ERROR);
+                return;
+            }
+            if (optConnContext.orElseThrow().getConnectivityService() == null) {
+                LOG.info("No TAPI connectivity service to update");
+                return;
+            }
+            // TODO: order services from lower layer to upper layer
+            Map<ConnectivityServiceKey, ConnectivityService> connServMap
+                    = optConnContext.orElseThrow().getConnectivityService();
+            if (connServMap == null) {
+                LOG.info("No connections to update");
+                return;
+            }
+            connServMap = orderConnServiceMap(connServMap);
+            for (ConnectivityService connService : connServMap.values()) {
+                LOG.info("Looping through connectivity service = {}", connService.getUuid().getValue());
+                if (connService.getConnection() == null) {
+                    continue;
+                }
+                for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                        .connectivity.service.Connection connection : connService.getConnection().values()) {
+                    InstanceIdentifier<Connection> connIID =
+                        InstanceIdentifier.builder(Context.class).augmentation(org.opendaylight.yang.gen.v1.urn
+                            .onf.otcc.yang.tapi.connectivity.rev221121.Context1.class)
+                                .child(org.opendaylight.yang.gen.v1.urn
+                                        .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext.class)
+                                .child(Connection.class, new ConnectionKey(connection.getConnectionUuid()))
+                                .build();
+                    Optional<Connection> optConn =
+                        this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, connIID).get();
+                    if (optConn.isEmpty()) {
+                        LOG.error(TapiStringConstants.TAPI_CONNECTION_READ_ERROR);
+                        continue;
+                    }
+                    Connection newConn = optConn.orElseThrow();
+                    // Check LowerConnection states and if any of the lower connection is disabled then we can put
+                    // the connection out of service. And based on the connection previous state we decide
+                    // the update necessary
+                    OperationalState newConnState = newConn.getOperationalState();
+                    if (newConn.getLowerConnection() != null) {
+                        newConnState = updateLowerConnections(changedOneps, onepStates,
+                                newConn.getLowerConnection().values(), newConn.getOperationalState());
+                    }
+                    if (newConnState.equals(newConn.getOperationalState())) {
+                        // To check if the oneps are from the original Top connection
+                        newConnState = getConnectionState(changedOneps, onepStates, newConn);
+                    }
+                    LOG.debug("Analysing connection = {} ", newConn.getName().toString());
+                    LOG.info("Previous connection state = {} & New connection state = {}",
+                            newConn.getOperationalState().getName(), newConnState.getName());
+                    Connection changedConn = new ConnectionBuilder(newConn).setOperationalState(newConnState).build();
+                    // TODO: the changed NEP is a DEG port which is not in any connection,
+                    //  therefore we also need to change the cross connections,
+                    //  the lower connections uuid and check the states.
+                    //  If any of the lower connections of a connection is DISABLED then the top connection is DISABLED
+                    this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, connIID, changedConn);
+                    this.networkTransactionService.commit().get();
+                }
+            }
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error(TapiStringConstants.TAPI_CONNECTION_UPDATE_ERROR);
+        }
+    }
+
+    private Map<ConnectivityServiceKey, ConnectivityService> orderConnServiceMap(
+            Map<ConnectivityServiceKey, ConnectivityService> connServMap) {
+        Map<ConnectivityServiceKey, ConnectivityService> orderedServiceMap = new HashMap<>();
+        for (LayerProtocolName lpn:this.orderedServiceLayerList) {
+            for (ConnectivityService connServ:connServMap.values()) {
+                if (connServ.getLayerProtocolName().equals(lpn)) {
+                    LOG.info("Layer of service is equal to entry of lpn = {}", lpn);
+                    orderedServiceMap.put(connServ.key(), connServ);
+                }
+            }
+        }
+        LOG.info("Ordered map of services = {}", orderedServiceMap);
+        return orderedServiceMap;
+    }
+
+    private OperationalState updateLowerConnections(List<Uuid> changedOneps, List<String> onepStates,
+                                                    Collection<LowerConnection> lowerConnections,
+                                                    OperationalState uppConnState) {
+        LOG.info("Updating lower connections");
+        OperationalState topConnectionState = uppConnState;
+        Boolean allLowerConnEna = true;
+        try {
+            for (LowerConnection lowerConn:lowerConnections) {
+                InstanceIdentifier<Connection> connIID =
+                    InstanceIdentifier.builder(Context.class).augmentation(org.opendaylight.yang.gen.v1.urn
+                        .onf.otcc.yang.tapi.connectivity.rev221121.Context1.class)
+                            .child(org.opendaylight.yang.gen.v1.urn
+                                    .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext.class)
+                            .child(Connection.class, new ConnectionKey(lowerConn.getConnectionUuid()))
+                            .build();
+                Optional<Connection> optConn =
+                        this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, connIID).get();
+                if (optConn.isEmpty()) {
+                    LOG.error(TapiStringConstants.TAPI_CONNECTION_READ_ERROR);
+                    continue;
+                }
+                Connection newConn = optConn.orElseThrow(); // Current state of connection
+                if (newConn.getLowerConnection() != null) {
+                    // TODO: we can receive disable here because the lower connection haven been yet looped through and
+                    //  therefore it is disabled but it has to be changed to enable before returning disable.
+                    //  We need to recall the update Lower Connections with the lower connection we are checking now
+                    //  and all its lower connections, until no lower connections are found in the connection
+                    updateLowerConnections(changedOneps, onepStates, newConn.getLowerConnection().values(),
+                            newConn.getOperationalState());
+                }
+                OperationalState newConnState = getConnectionState(changedOneps, onepStates, newConn);
+                // updated connection state if it contains a nep that has changed
+                if (!newConn.getOperationalState().equals(newConnState)) {
+                    Connection changedConn = new ConnectionBuilder(newConn).setOperationalState(newConnState).build();
+                    this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, connIID, changedConn);
+                    this.networkTransactionService.commit().get();
+                }
+                if (newConnState.equals(OperationalState.DISABLED)) {
+                    LOG.info("LowerConnection state is disable");
+                    allLowerConnEna = false;
+                    topConnectionState = OperationalState.DISABLED;
+                }
+            }
+            if (allLowerConnEna) {
+                return OperationalState.ENABLED;
+            }
+            return OperationalState.DISABLED;
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error(TapiStringConstants.TAPI_CONNECTION_UPDATE_ERROR);
+            return topConnectionState;
+        }
+    }
+
+    private OperationalState getConnectionState(List<Uuid> changedOneps, List<String> operState, Connection conn)
+            throws InterruptedException, ExecutionException {
+        LOG.info("Getting TAPI connectionState");
+        List<Uuid> connectionNeps = Objects.requireNonNull(conn.getConnectionEndPoint()).values().stream()
+            .map(NodeEdgePointRef::getNodeEdgePointUuid).collect(Collectors.toList());
+        LOG.info("Changed neps = {}", changedOneps);
+        LOG.info("Connection NEPs = {}", connectionNeps);
+        if (!Collections.disjoint(changedOneps, connectionNeps)) {
+            LOG.info("Connection neps {} are included in changed oneps {}", connectionNeps, changedOneps);
+            if ((changedOneps.contains(connectionNeps.get(0)) ? transformOperState(operState.get(
+                    changedOneps.indexOf(connectionNeps.get(0)))) : null) == OperationalState.DISABLED
+                        || (changedOneps.contains(connectionNeps.get(1)) ? transformOperState(operState.get(
+                                changedOneps.indexOf(connectionNeps.get(1)))) : null) == OperationalState.DISABLED) {
+                return OperationalState.DISABLED;
+            }
+            LOG.info("Didnt transform correctly the states");
+            for (Uuid connectionNep : connectionNeps) {
+                Optional<org.opendaylight.yang.gen.v1.urn
+                        .onf.otcc.yang.tapi.connectivity.rev221121.connection.ConnectionEndPoint> ocep
+                    = conn.getConnectionEndPoint().values().stream()
+                        .filter(connectionEndPoint -> connectionEndPoint.getNodeEdgePointUuid() == connectionNep)
+                        .findFirst();
+                if (ocep.isEmpty()) {
+                    continue;
+                }
+                InstanceIdentifier<OwnedNodeEdgePoint> onepIID = InstanceIdentifier.builder(Context.class)
+                    .augmentation(Context1.class).child(TopologyContext.class)
+                    .child(Topology.class, new TopologyKey(tapiTopoUuid))
+                    .child(Node.class, new NodeKey(ocep.orElseThrow().getNodeUuid()))
+                    .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(connectionNep))
+                    .build();
+                Optional<OwnedNodeEdgePoint> onep =
+                    this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, onepIID).get();
+                if (onep.isEmpty() || onep.orElseThrow().augmentation(OwnedNodeEdgePoint1.class) == null
+                        || onep.orElseThrow().augmentation(OwnedNodeEdgePoint1.class).getCepList() == null) {
+                    continue;
+                }
+                if (onep.orElseThrow().getOperationalState() == OperationalState.DISABLED
+                        && !changedOneps.contains(onep.orElseThrow().getUuid())) {
+                    return OperationalState.DISABLED;
+                }
+            }
+            return OperationalState.ENABLED;
+        }
+        LOG.info("Connection state = {}. Going to check lower connections", conn.getOperationalState());
+        // TODO --> check all lower connections state and if all of them are enabled we return enable, otherwise disable
+        if (conn.getLowerConnection() != null && allLowerConEnabled(conn.getLowerConnection().values())) {
+            return OperationalState.ENABLED;
+        }
+        return conn.getOperationalState();
+    }
+
+    private boolean allLowerConEnabled(Collection<LowerConnection> lowerConnections) {
+        try {
+            for (LowerConnection lowerConn:lowerConnections) {
+                InstanceIdentifier<Connection> connIID =
+                    InstanceIdentifier.builder(Context.class).augmentation(org.opendaylight.yang.gen.v1.urn
+                            .onf.otcc.yang.tapi.connectivity.rev221121.Context1.class)
+                        .child(org.opendaylight.yang.gen.v1.urn
+                            .onf.otcc.yang.tapi.connectivity.rev221121.context
+                            .ConnectivityContext.class)
+                        .child(Connection.class, new ConnectionKey(lowerConn.getConnectionUuid()))
+                        .build();
+                Optional<Connection> optConn =
+                    this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, connIID).get();
+                if (optConn.isEmpty()) {
+                    LOG.error(TapiStringConstants.TAPI_CONNECTION_READ_ERROR);
+                    continue;
+                }
+                Connection newConn = optConn.orElseThrow(); // Current state of connection
+                // updated connection state if it contains a nep that has changed
+                if (newConn.getOperationalState().equals(OperationalState.DISABLED)) {
+                    LOG.info("LowerConnection state is disable");
+                    return false;
+                }
+            }
+            return true;
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error(TapiStringConstants.TAPI_CONNECTION_UPDATE_ERROR);
+            return false;
+        }
+    }
+
+    private List<ConnectivityService> updateSupportedConnectivityServices(Collection<ConnectivityService> connServices,
+                                                                          Uuid supportingConnService,
+                                                                          AdministrativeState adminState,
+                                                                          OperationalState operState,
+                                                                          LayerProtocolName layer) {
+        // TODO we need to check this function
+        List<ConnectivityService> changedServices = new ArrayList<>();
+        if (adminState != AdministrativeState.LOCKED && operState != OperationalState.DISABLED) {
+            return changedServices;
+        }
+        try {
+            for (ConnectivityService supportedConnService : connServices) {
+                // TODO currently supporting service uuid is saved in service layer, replace with name as soon
+                // as name is implemented
+                if (supportedConnService.getLayerProtocolName() != layer) {
+                    continue;
+                }
+                InstanceIdentifier<ConnectivityService> supportedConnServIID = InstanceIdentifier
+                    .builder(Context.class).augmentation(org.opendaylight.yang.gen.v1
+                        .urn.onf.otcc.yang.tapi.connectivity.rev221121.Context1.class)
+                    .child(org.opendaylight.yang.gen.v1
+                        .urn.onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext.class)
+                    .child(ConnectivityService.class, new ConnectivityServiceKey(supportedConnService.getUuid()))
+                    .build();
+                Optional<ConnectivityService> optNewConnService = this.networkTransactionService.read(
+                    LogicalDatastoreType.OPERATIONAL, supportedConnServIID).get();
+                if (optNewConnService.isEmpty()) {
+                    LOG.error("Could not update TAPI connectivity service");
+                    continue;
+                }
+                ConnectivityService newConnService = optNewConnService.orElseThrow();
+                if (supportedConnService.getConnectivityConstraint().getServiceLevel() != null
+                        && supportedConnService.getConnectivityConstraint().getServiceLevel()
+                            .equals(supportingConnService.getValue())
+                        && newConnService.getAdministrativeState() != AdministrativeState.LOCKED
+                        && newConnService.getOperationalState() != OperationalState.DISABLED) {
+
+                    ConnectivityService changedSupportedConnServ = new ConnectivityServiceBuilder()
+                        .setUuid(supportedConnService.getUuid())
+                        .setAdministrativeState(adminState)
+                        .setOperationalState(operState)
+                        .build();
+                    // TODO: may need to update connections...
+                    this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, supportedConnServIID,
+                        changedSupportedConnServ);
+                    this.networkTransactionService.commit().get();
+                    changedServices.add(changedSupportedConnServ);
+                    if (layer == LayerProtocolName.ODU) {
+                        changedServices.addAll(updateSupportedConnectivityServices(connServices,
+                            supportedConnService.getUuid(), adminState, operState, LayerProtocolName.DSR));
+                    }
+                }
+            }
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Could not update TAPI connectivity service");
+        }
+        return changedServices;
+    }
+
+    private OperationalState transformOperState(String operString) {
+        LOG.debug("Operstring to be converted = {}", operString);
+        State operState = org.opendaylight.transportpce.networkmodel.util.TopologyUtils.setNetworkOperState(operString);
+        LOG.debug("State received from topologyutils = {}", operState);
+        return operState.equals(State.InService) ? OperationalState.ENABLED : OperationalState.DISABLED;
+    }
+
+}
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/listeners/TapiPceListenerImpl.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/listeners/TapiPceListenerImpl.java
deleted file mode 100644 (file)
index c770927..0000000
+++ /dev/null
@@ -1,1186 +0,0 @@
-/*
- * Copyright © 2021 Nokia, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.transportpce.tapi.listeners;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-import java.nio.charset.Charset;
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.UUID;
-import java.util.concurrent.ExecutionException;
-import java.util.stream.Collectors;
-import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
-import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
-import org.opendaylight.transportpce.common.network.NetworkTransactionService;
-import org.opendaylight.transportpce.common.network.RequestProcessor;
-import org.opendaylight.transportpce.tapi.TapiStringConstants;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.ServicePathRpcResult;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.TransportpcePceListener;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.service.path.rpc.result.PathDescription;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev220118.service.path.rpc.result.PathDescriptionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZ;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.Node;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.pce.resource.resource.resource.TerminationPoint;
-import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.RpcStatusEx;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Context;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.ForwardingDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LifecycleState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.OperationalState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortRole;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.Context1;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.CreateConnectivityServiceInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.OwnedNodeEdgePoint1;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.OwnedNodeEdgePoint1Builder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connection.LowerConnection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connection.LowerConnectionBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connection.LowerConnectionKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connection.end.point.ClientNodeEdgePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connection.end.point.ClientNodeEdgePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityService;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityServiceBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityServiceKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.Connection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.ConnectionBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.ConnectionKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContextBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.context.topology.context.topology.node.owned.node.edge.point.CepList;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.context.topology.context.topology.node.owned.node.edge.point.CepListBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.context.TopologyContext;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.Topology;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.TopologyKey;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class TapiPceListenerImpl implements TransportpcePceListener {
-
-    private static final Logger LOG = LoggerFactory.getLogger(TapiPceListenerImpl.class);
-
-    private final Uuid tapiTopoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
-        .getBytes(Charset.forName("UTF-8"))).toString());
-    private ServicePathRpcResult servicePathRpcResult;
-    private CreateConnectivityServiceInput input;
-    private Uuid serviceUuid;
-    private final DataBroker dataBroker;
-    private final NetworkTransactionService networkTransactionService;
-    private final Map<org.opendaylight.yang.gen.v1.urn
-        .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectionKey,
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection>
-        connectionFullMap; // this variable is for complete connection objects
-
-    public TapiPceListenerImpl(DataBroker dataBroker) {
-        this.connectionFullMap = new HashMap<>();
-        this.dataBroker = dataBroker;
-        this.networkTransactionService = new NetworkTransactionImpl(new RequestProcessor(this.dataBroker));
-    }
-
-    @Override
-    public void onServicePathRpcResult(ServicePathRpcResult notification) {
-        if (compareServicePathRpcResult(notification)) {
-            LOG.warn("ServicePathRpcResult already wired !");
-            return;
-        }
-        servicePathRpcResult = notification;
-        switch (servicePathRpcResult.getNotificationType().getIntValue()) {
-            /* path-computation-request. */
-            case 1:
-                onPathComputationResult(notification);
-                break;
-            /* cancel-resource-reserve. */
-            case 2:
-                onCancelResourceResult(notification.getServiceName());
-                break;
-            default:
-                break;
-        }
-    }
-
-    /**
-     * Process path computation request result.
-     * @param notification the result notification.
-     */
-    private void onPathComputationResult(ServicePathRpcResult notification) {
-        this.connectionFullMap.clear();
-        LOG.info("PCE '{}' Notification received : {}",servicePathRpcResult.getNotificationType().getName(),
-                notification);
-        if (servicePathRpcResult.getStatus() == RpcStatusEx.Failed) {
-            LOG.error("PCE path computation failed !");
-            return;
-        } else if (servicePathRpcResult.getStatus() == RpcStatusEx.Pending) {
-            LOG.warn("PCE path computation returned a Penging RpcStatusEx code!");
-            return;
-        } else if (servicePathRpcResult.getStatus() != RpcStatusEx.Successful) {
-            LOG.error("PCE path computation returned an unknown RpcStatusEx code!");
-            return;
-        }
-
-        LOG.info("PCE calculation done OK !");
-        if (servicePathRpcResult.getPathDescription() == null) {
-            LOG.error("'PathDescription' parameter is null ");
-            return;
-        }
-        PathDescription pathDescription = new PathDescriptionBuilder()
-            .setAToZDirection(servicePathRpcResult.getPathDescription().getAToZDirection())
-            .setZToADirection(servicePathRpcResult.getPathDescription().getZToADirection())
-            .build();
-        LOG.info("PathDescription for TAPI gets : {}", pathDescription);
-        if (input == null) {
-            LOG.error("Input is null !");
-            return;
-        }
-        // TODO: check kind of service: based on the device Id of the input,
-        //  verify the type of XPDR and the capacity and determine if it is an OTN service or pure WDM service
-        // Create connections and ceps for the connectivity service.
-        //  Connections must be with a locked stated. As the renderer hasnt implemented yet the oc's
-        Map<ConnectionKey, Connection> connectionMap = createConnectionsAndCepsForService(pathDescription,
-                input.getConnectivityConstraint().getServiceLayer());
-        // add connections to connection context and to connectivity context
-        updateConnectionContextWithConn(this.connectionFullMap, connectionMap, serviceUuid);
-    }
-
-    private Map<ConnectionKey, Connection> createConnectionsAndCepsForService(PathDescription pathDescription,
-                                                                              LayerProtocolName serviceProtName) {
-        Map<ConnectionKey, Connection> connectionServMap = new HashMap<>();
-        // build lists with ROADM nodes, XPDR/MUX/SWITCH nodes, ROADM DEG TTPs, ROADM SRG TTPs, XPDR CLIENT TTPs
-        //  and XPDR NETWORK TTPs (if any). From the path description. This will help to build the uuid of the CEPs
-        //  and the connections
-        String resourceType;
-        List<String> xpdrClientTplist = new ArrayList<>();
-        List<String> xpdrNetworkTplist = new ArrayList<>();
-        List<String> rdmAddDropTplist = new ArrayList<>();
-        List<String> rdmDegTplist = new ArrayList<>();
-        List<String> rdmNodelist = new ArrayList<>();
-        List<String> xpdrNodelist = new ArrayList<>();
-        for (AToZ elem:pathDescription.getAToZDirection().getAToZ().values().stream()
-                .sorted(Comparator.comparing(AToZ::getId)).collect(Collectors.toList())) {
-            resourceType = elem.getResource().getResource().implementedInterface().getSimpleName();
-            switch (resourceType) {
-                case TapiStringConstants.TP:
-                    TerminationPoint tp = (TerminationPoint) elem.getResource().getResource();
-                    String tpID = tp.getTpId();
-                    String tpNode;
-                    if (tpID.contains("CLIENT")) {
-                        tpNode = tp.getTpNodeId();
-                        if (!xpdrClientTplist.contains(String.join("+", tpNode, tpID))) {
-                            xpdrClientTplist.add(String.join("+", tpNode, tpID));
-                        }
-                    }
-                    if (tpID.contains("NETWORK")) {
-                        tpNode = tp.getTpNodeId();
-                        if (!xpdrNetworkTplist.contains(String.join("+", tpNode, tpID))) {
-                            xpdrNetworkTplist.add(String.join("+", tpNode, tpID));
-                        }
-                    }
-                    if (tpID.contains("PP")) {
-                        tpNode = getIdBasedOnModelVersion(tp.getTpNodeId());
-                        LOG.info("ROADM Node of tp = {}", tpNode);
-                        if (!rdmAddDropTplist.contains(String.join("+", tpNode, tpID))) {
-                            rdmAddDropTplist.add(String.join("+", tpNode, tpID));
-                        }
-                    }
-                    if (tpID.contains("TTP")) {
-                        tpNode = getIdBasedOnModelVersion(tp.getTpNodeId());
-                        LOG.info("ROADM Node of tp = {}", tpNode);
-                        if (!rdmDegTplist.contains(String.join("+", tpNode, tpID))) {
-                            rdmDegTplist.add(String.join("+", tpNode, tpID));
-                        }
-                    }
-                    break;
-                case TapiStringConstants.NODE:
-                    Node node = (Node) elem.getResource().getResource();
-                    String nodeId = node.getNodeId();
-                    if (nodeId.contains("XPDR") || nodeId.contains("SPDR") || nodeId.contains("MXPDR")) {
-                        LOG.info("Node id = {}", nodeId);
-                        if (!xpdrNodelist.contains(nodeId)) {
-                            xpdrNodelist.add(nodeId); // should contain only 2
-                        }
-                    }
-                    if (nodeId.contains("ROADM")) {
-                        nodeId = getIdBasedOnModelVersion(nodeId);
-                        LOG.info("Node id = {}", nodeId);
-                        if (!rdmNodelist.contains(nodeId)) {
-                            rdmNodelist.add(nodeId);
-                        }
-                    }
-                    break;
-                default:
-                    LOG.warn("Resource is a {}", resourceType);
-            }
-        }
-        LOG.info("ROADM node list = {}", rdmNodelist.toString());
-        LOG.info("ROADM degree list = {}", rdmDegTplist.toString());
-        LOG.info("ROADM addrop list = {}", rdmAddDropTplist.toString());
-        LOG.info("XPDR node list = {}", xpdrNodelist.toString());
-        LOG.info("XPDR network list = {}", xpdrNetworkTplist.toString());
-        LOG.info("XPDR client list = {}", xpdrClientTplist.toString());
-        // TODO -> for 10GB eth and ODU services there are no ROADMs in path description as they use the OTU link,
-        //  but for 100GB eth all is created at once. Check if the roadm list is empty to determine whether we need
-        //  to trigger all the steps or not
-        String edgeRoadm1 = "";
-        String edgeRoadm2 = "";
-        if (!rdmNodelist.isEmpty()) {
-            edgeRoadm1 = rdmNodelist.get(0);
-            edgeRoadm2 = rdmNodelist.get(rdmNodelist.size() - 1);
-            LOG.info("edgeRoadm1 = {}", edgeRoadm1);
-            LOG.info("edgeRoadm2 = {}", edgeRoadm2);
-        }
-        // create corresponding CEPs and Connections. Connections should be added to the corresponding context
-        // CEPs must be included in the topology context as an augmentation for each ONEP!!
-        // TODO -> Maybe we dont need to create the connections and ceps if the previous service doesnt exist??
-        //  As mentioned above, for 100GbE service creation there are ROADMs in the path description.
-        //  What are the configurations needed here? No OTU, ODU... what kind of cross connections is needed?
-        //  this needs to be changed
-
-        // TODO: OpenROADM getNodeType from the NamesList to verify what needs to be created
-        OpenroadmNodeType openroadmNodeType = getOpenRoadmNodeType(xpdrNodelist);
-        switch (serviceProtName) {
-            case PHOTONICMEDIA:
-                // Identify number of ROADMs
-                // - XC Connection between MC CEPs mapped from MC NEPs (within a roadm)
-                // - XC Connection between OTSiMC CEPs mapped from OTSiMC NEPs (within a roadm)
-                // - Top Connection MC betwwen MC CEPs of different roadms
-                // - Top Connection OTSiMC betwwen OTSiMC CEPs of extreme roadms
-                connectionServMap.putAll(createRoadmCepsAndConnections(rdmAddDropTplist, rdmDegTplist, rdmNodelist,
-                        edgeRoadm1, edgeRoadm2));
-                if (!pathDescription.getAToZDirection().getAToZ().values().stream().findFirst().get().getId()
-                        .contains("ROADM")) {
-                    // - XC Connection OTSi betwwen iOTSi y eOTSi of xpdr
-                    // - Top connection OTSi between network ports of xpdrs in the Photonic media layer -> i_OTSi
-                    connectionServMap.putAll(createXpdrCepsAndConnectionsPht(xpdrNetworkTplist, xpdrNodelist));
-                }
-                break;
-            case ODU:
-                LOG.info("OTN ODU service");
-                // - XC Connection OTSi between iODU and eODU of xpdr
-                // - Top connection in the ODU layer, between xpdr iODU ports
-                connectionServMap.putAll(createXpdrCepsAndConnectionsOdu(xpdrNetworkTplist, xpdrNodelist));
-                break;
-            case ETH:
-                LOG.info("WDM service");
-                if (openroadmNodeType.equals(OpenroadmNodeType.TPDR)) {
-                    // TODO: WDM service. Only och/otu4 needed and then directly DSR top connection.
-                    //  Need to find the associated client ports of the network port
-                    // - Same as for PHOTONIC MEDIA service
-                    // - Do we nedd cross connection in the ODU layer??
-                    // - Top connection DSR between client ports of the transponder
-                    connectionServMap.putAll(createRoadmCepsAndConnections(rdmAddDropTplist, rdmDegTplist, rdmNodelist,
-                        edgeRoadm1, edgeRoadm2));
-                    connectionServMap.putAll(createXpdrCepsAndConnectionsPht(xpdrNetworkTplist, xpdrNodelist));
-                    xpdrClientTplist = getAssociatedClientsPort(xpdrNetworkTplist);
-                    LOG.info("Associated client ports = {}", xpdrClientTplist);
-                    connectionServMap.putAll(createXpdrCepsAndConnectionsEth(xpdrClientTplist, xpdrNodelist,
-                        connectionServMap));
-                }
-                break;
-            case DSR:
-                LOG.info("OTN XGE/ODUe service");
-                // - XC connection between iODU and eODU
-                // - Top connection between eODU ports
-                // - Top connection between DSR ports
-                if (openroadmNodeType.equals(OpenroadmNodeType.SWITCH)) {
-                    // TODO: We create both ODU and DSR because there is no ODU service creation for the switch
-                    // - XC Connection OTSi betwwen iODU and eODU of xpdr
-                    // - Top connection in the ODU layer, between xpdr eODU ports (?)
-                    connectionServMap.putAll(createXpdrCepsAndConnectionsOdu(xpdrNetworkTplist, xpdrNodelist));
-                    connectionServMap.putAll(createXpdrCepsAndConnectionsDsr(xpdrClientTplist, xpdrNetworkTplist,
-                        xpdrNodelist));
-                }
-                if (openroadmNodeType.equals(OpenroadmNodeType.MUXPDR)) {
-                    // TODO: OTN service but mux has 3 steps at rendering. Verify that things exist
-                    connectionServMap.putAll(createXpdrCepsAndConnectionsDsr(xpdrClientTplist, xpdrNetworkTplist,
-                        xpdrNodelist));
-                }
-                break;
-            default:
-                LOG.error("Service type format {} not supported", serviceProtName.getName());
-        }
-        return connectionServMap;
-    }
-
-    /**
-     * Process cancel resource result.
-     * @param serviceName Service name to build uuid.
-     */
-    private void onCancelResourceResult(String serviceName) {
-        if (servicePathRpcResult.getStatus() == RpcStatusEx.Failed) {
-            LOG.info("PCE cancel resource failed !");
-            return;
-        } else if (servicePathRpcResult.getStatus() == RpcStatusEx.Pending) {
-            LOG.warn("PCE cancel returned a Penging RpcStatusEx code!");
-            return;
-        } else if (servicePathRpcResult.getStatus() != RpcStatusEx.Successful) {
-            LOG.error("PCE cancel returned an unknown RpcStatusEx code!");
-            return;
-        }
-        LOG.info("PCE cancel resource done OK !");
-        Uuid suuid = new Uuid(UUID.nameUUIDFromBytes(serviceName.getBytes(Charset.forName("UTF-8")))
-                .toString());
-        // get connections of connectivity service and remove them from tapi context and then remove
-        //  service from context. The CEPs are maintained as they could be reused by another service
-        ConnectivityService connService = getConnectivityService(suuid);
-        if (connService == null) {
-            LOG.error("Service doesnt exist in tapi context");
-            return;
-        }
-        for (Connection connection:connService.getConnection().values()) {
-            deleteConnection(connection.getConnectionUuid());
-        }
-        deleteConnectivityService(suuid);
-    }
-
-    @SuppressFBWarnings(
-            value = "ES_COMPARING_STRINGS_WITH_EQ",
-            justification = "false positives, not strings but real object references comparisons")
-    private Boolean compareServicePathRpcResult(ServicePathRpcResult notification) {
-        if (servicePathRpcResult == null) {
-            return false;
-        }
-        if (servicePathRpcResult.getNotificationType() != notification.getNotificationType()) {
-            return false;
-        }
-        if (servicePathRpcResult.getServiceName() != notification.getServiceName()) {
-            return false;
-        }
-        if (servicePathRpcResult.getStatus() != notification.getStatus()) {
-            return false;
-        }
-        if (servicePathRpcResult.getStatusMessage() != notification.getStatusMessage()) {
-            return false;
-        }
-        return true;
-    }
-
-    private Map<ConnectionKey, Connection> createXpdrCepsAndConnectionsEth(List<String> xpdrClientTplist,
-                                                                           List<String> xpdrNodelist,
-                                                                           Map<ConnectionKey, Connection> lowerConn) {
-        // TODO: do we need to create cross connection between iODU and eODU??
-        // add the lower connections of the previous steps for this kind of service
-        Map<LowerConnectionKey, LowerConnection> xcMap = new HashMap<>();
-        for (Connection lowConn: lowerConn.values()) {
-            LowerConnection conn = new LowerConnectionBuilder().setConnectionUuid(lowConn.getConnectionUuid()).build();
-            xcMap.put(conn.key(), conn);
-        }
-        Map<ConnectionKey, Connection> connServMap = new HashMap<>();
-        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey,
-            ConnectionEndPoint> cepMapDsr = new HashMap<>();
-        // Create 1 cep per Xpdr in the CLIENT
-        // 1 top connection DSR between the CLIENT xpdrs
-        for (String xpdr:xpdrNodelist) {
-            LOG.info("Creating ceps and xc for xpdr {}", xpdr);
-            String spcXpdrClient = xpdrClientTplist.stream().filter(netp -> netp.contains(xpdr)).findFirst().get();
-
-            ConnectionEndPoint netCep1 = createCepXpdr(spcXpdrClient, TapiStringConstants.DSR, TapiStringConstants.DSR,
-                LayerProtocolName.DSR);
-            putXpdrCepInTopologyContext(xpdr, spcXpdrClient, TapiStringConstants.DSR, TapiStringConstants.DSR, netCep1);
-
-            cepMapDsr.put(netCep1.key(), netCep1);
-        }
-        String spcXpdr1 = xpdrClientTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(0))).findFirst().get();
-        String spcXpdr2 = xpdrClientTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(xpdrNodelist.size() - 1))).findFirst().get();
-
-        // DSR top connection between edge xpdr CLIENT DSR
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-            connectionDsr = createTopConnection(spcXpdr1, spcXpdr2, cepMapDsr, TapiStringConstants.DSR,
-            LayerProtocolName.DSR, xcMap);
-        this.connectionFullMap.put(connectionDsr.key(), connectionDsr);
-
-        // DSR top connection that will be added to the service object
-        Connection conn1 = new ConnectionBuilder().setConnectionUuid(connectionDsr.getUuid()).build();
-        connServMap.put(conn1.key(), conn1);
-
-        return connServMap;
-    }
-
-    private Map<ConnectionKey,Connection> createXpdrCepsAndConnectionsDsr(List<String> xpdrClientTplist,
-                                                                          List<String> xpdrNetworkTplist,
-                                                                          List<String> xpdrNodelist) {
-        Map<ConnectionKey, Connection> connServMap = new HashMap<>();
-        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey,
-            ConnectionEndPoint> cepMapDsr = new HashMap<>();
-        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey,
-            ConnectionEndPoint> cepMapOdu = new HashMap<>();
-        // TODO: when upgrading the models to 2.1.3, get the connection inclusion because those connections will
-        //  be added to the lower connection of a top connection
-        Map<LowerConnectionKey, LowerConnection> xcMap = new HashMap<>();
-
-        // Create 1 cep per Xpdr in the CLIENT, 1 cep per Xpdr eODU, 1 XC between eODU and iODE,
-        // 1 top connection between eODU and a top connection DSR between the CLIENT xpdrs
-        for (String xpdr:xpdrNodelist) {
-            LOG.info("Creating ceps and xc for xpdr {}", xpdr);
-            String spcXpdrClient = xpdrClientTplist.stream().filter(netp -> netp.contains(xpdr)).findFirst().get();
-
-            ConnectionEndPoint netCep1 = createCepXpdr(spcXpdrClient, TapiStringConstants.DSR, TapiStringConstants.DSR,
-                LayerProtocolName.DSR);
-            putXpdrCepInTopologyContext(xpdr, spcXpdrClient, TapiStringConstants.DSR, TapiStringConstants.DSR, netCep1);
-
-            ConnectionEndPoint netCep2 = createCepXpdr(spcXpdrClient, TapiStringConstants.E_ODU,
-                TapiStringConstants.DSR, LayerProtocolName.ODU);
-            putXpdrCepInTopologyContext(xpdr, spcXpdrClient, TapiStringConstants.E_ODU, TapiStringConstants.DSR,
-                netCep2);
-
-            String spcXpdrNetwork = getAssociatedNetworkPort(spcXpdrClient, xpdrNetworkTplist);
-            ConnectionEndPoint netCep3 = getAssociatediODUCep(spcXpdrNetwork);
-
-            cepMapDsr.put(netCep1.key(), netCep1);
-            cepMapOdu.put(netCep2.key(), netCep2);
-            // Create x connection between I_ODU and E_ODU within xpdr
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-                connection = createXCBetweenCeps(netCep2, netCep3, spcXpdrClient, spcXpdrNetwork,
-                TapiStringConstants.ODU, LayerProtocolName.ODU);
-            this.connectionFullMap.put(connection.key(), connection);
-
-            // Create X connection that will be added to the service object
-            LowerConnection conn = new LowerConnectionBuilder().setConnectionUuid(connection.getUuid()).build();
-            xcMap.put(conn.key(), conn);
-        }
-
-        String spcXpdr1 = xpdrClientTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(0))).findFirst().get();
-        String spcXpdr2 = xpdrClientTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(xpdrNodelist.size() - 1))).findFirst().get();
-
-        // eODU top connection between edge xpdr CLIENT eODU
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-            connectionOdu = createTopConnection(spcXpdr1, spcXpdr2, cepMapOdu, TapiStringConstants.E_ODU,
-            LayerProtocolName.ODU, xcMap);
-        this.connectionFullMap.put(connectionOdu.key(), connectionOdu);
-
-        // ODU top connection that will be added to the service object and also lower connection
-        Connection conn = new ConnectionBuilder().setConnectionUuid(connectionOdu.getUuid()).build();
-        connServMap.put(conn.key(), conn);
-        LowerConnection lowerConn = new LowerConnectionBuilder().setConnectionUuid(connectionOdu.getUuid()).build();
-        xcMap.put(lowerConn.key(), lowerConn);
-
-        // DSR top connection between edge xpdr CLIENT DSR
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-            connectionDsr = createTopConnection(spcXpdr1, spcXpdr2, cepMapDsr, TapiStringConstants.DSR,
-            LayerProtocolName.DSR, xcMap);
-        this.connectionFullMap.put(connectionDsr.key(), connectionDsr);
-
-        // DSR top connection that will be added to the service object
-        Connection conn1 = new ConnectionBuilder().setConnectionUuid(connectionDsr.getUuid()).build();
-        connServMap.put(conn1.key(), conn1);
-
-        return connServMap;
-    }
-
-    private Map<ConnectionKey, Connection> createXpdrCepsAndConnectionsOdu(List<String> xpdrNetworkTplist,
-                                                                           List<String> xpdrNodelist) {
-        Map<ConnectionKey, Connection> connServMap = new HashMap<>();
-        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey,
-            ConnectionEndPoint> cepMap = new HashMap<>();
-        // TODO: when upgrading the models to 2.1.3, get the connection inclusion because those connections will
-        //  be added to the lower connection of a top connection
-        Map<LowerConnectionKey, LowerConnection> xcMap = new HashMap<>();
-        // Create 1 cep per Xpdr in the I_ODU and a top
-        // connection iODU between the xpdrs
-        for (String xpdr:xpdrNodelist) {
-            LOG.info("Creating ceps and xc for xpdr {}", xpdr);
-            String spcXpdrNetwork = xpdrNetworkTplist.stream().filter(netp -> netp.contains(xpdr)).findFirst().get();
-
-            ConnectionEndPoint netCep1 = createCepXpdr(spcXpdrNetwork, TapiStringConstants.I_ODU,
-                TapiStringConstants.DSR, LayerProtocolName.ODU);
-            putXpdrCepInTopologyContext(xpdr, spcXpdrNetwork, TapiStringConstants.I_ODU, TapiStringConstants.DSR,
-                netCep1);
-
-            cepMap.put(netCep1.key(), netCep1);
-        }
-
-        // ODU top connection between edge xpdr i_ODU
-        String spcXpdr1 = xpdrNetworkTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(0))).findFirst().get();
-        String spcXpdr2 = xpdrNetworkTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(xpdrNodelist.size() - 1))).findFirst().get();
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-            connection = createTopConnection(spcXpdr1, spcXpdr2, cepMap, TapiStringConstants.I_ODU,
-            LayerProtocolName.ODU, xcMap);
-        this.connectionFullMap.put(connection.key(), connection);
-
-        // ODU top connection that will be added to the service object
-        Connection conn = new ConnectionBuilder().setConnectionUuid(connection.getUuid()).build();
-        connServMap.put(conn.key(), conn);
-
-        return connServMap;
-    }
-
-    private Map<ConnectionKey, Connection> createXpdrCepsAndConnectionsPht(List<String> xpdrNetworkTplist,
-                                                                           List<String> xpdrNodelist) {
-        Map<ConnectionKey, Connection> connServMap = new HashMap<>();
-        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey,
-            ConnectionEndPoint> cepMap = new HashMap<>();
-        // TODO: when upgrading the models to 2.1.3, get the connection inclusion because those connections will
-        //  be added to the lower connection of a top connection
-        Map<LowerConnectionKey, LowerConnection> xcMap = new HashMap<>();
-
-        // create ceps and x connections within xpdr
-        for (String xpdr:xpdrNodelist) {
-            LOG.info("Creating ceps and xc for xpdr {}", xpdr);
-            String spcXpdrNetwork = xpdrNetworkTplist.stream().filter(netp -> netp.contains(xpdr)).findFirst().get();
-            // There should be 1 network tp per xpdr
-            // TODO photonic media model should be updated to have the corresponding CEPs. I will just create
-            //  3 different MC CEPs giving different IDs to show that they are different
-            // Create 3 CEPs for each xpdr otsi node and the corresponding cross connection matchin the NEPs
-            ConnectionEndPoint netCep1 = createCepXpdr(spcXpdrNetwork, TapiStringConstants.PHTNC_MEDIA,
-                TapiStringConstants.OTSI, LayerProtocolName.PHOTONICMEDIA);
-            putXpdrCepInTopologyContext(xpdr, spcXpdrNetwork, TapiStringConstants.PHTNC_MEDIA, TapiStringConstants.OTSI,
-                netCep1);
-            ConnectionEndPoint netCep2 = createCepXpdr(spcXpdrNetwork, TapiStringConstants.E_OTSI,
-                TapiStringConstants.OTSI, LayerProtocolName.PHOTONICMEDIA);
-            putXpdrCepInTopologyContext(xpdr, spcXpdrNetwork, TapiStringConstants.E_OTSI, TapiStringConstants.OTSI,
-                netCep2);
-            ConnectionEndPoint netCep3 = createCepXpdr(spcXpdrNetwork, TapiStringConstants.I_OTSI,
-                TapiStringConstants.OTSI, LayerProtocolName.PHOTONICMEDIA);
-            putXpdrCepInTopologyContext(xpdr, spcXpdrNetwork, TapiStringConstants.I_OTSI, TapiStringConstants.OTSI,
-                netCep3);
-            cepMap.put(netCep1.key(), netCep1);
-            cepMap.put(netCep2.key(), netCep2);
-            cepMap.put(netCep3.key(), netCep3);
-
-            // Create x connection between I_OTSi and E_OTSi within xpdr
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-                connection = createXCBetweenCeps(netCep2, netCep3, spcXpdrNetwork, spcXpdrNetwork,
-                TapiStringConstants.OTSI, LayerProtocolName.PHOTONICMEDIA);
-            this.connectionFullMap.put(connection.key(), connection);
-
-            // Create X connection that will be added to the service object
-            LowerConnection conn = new LowerConnectionBuilder().setConnectionUuid(connection.getUuid()).build();
-            xcMap.put(conn.key(), conn);
-        }
-        // OTSi top connection between edge I_OTSI Xpdr
-        String spcXpdr1 = xpdrNetworkTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(0))).findFirst().get();
-        String spcXpdr2 = xpdrNetworkTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(xpdrNodelist.size() - 1))).findFirst().get();
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-            connection = createTopConnection(spcXpdr1, spcXpdr2, cepMap, TapiStringConstants.I_OTSI,
-            LayerProtocolName.PHOTONICMEDIA, xcMap);
-        this.connectionFullMap.put(connection.key(), connection);
-
-        // OTSi top connection that will be added to the service object
-        Connection conn = new ConnectionBuilder().setConnectionUuid(connection.getUuid()).build();
-        connServMap.put(conn.key(), conn);
-
-
-        return connServMap;
-    }
-
-    private Map<ConnectionKey, Connection> createRoadmCepsAndConnections(List<String> rdmAddDropTplist,
-                                                                         List<String> rdmDegTplist,
-                                                                         List<String> rdmNodelist,
-                                                                         String edgeRoadm1, String edgeRoadm2) {
-        // TODO: will need to check if things exist already or not
-        Map<ConnectionKey, Connection> connServMap = new HashMap<>();
-        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey,
-            ConnectionEndPoint> cepMap = new HashMap<>();
-        // create ceps and x connections within roadm
-        Map<LowerConnectionKey, LowerConnection> xcMap = new HashMap<>();
-        for (String roadm : rdmNodelist) {
-            LOG.info("Creating ceps and xc for roadm {}", roadm);
-            String spcRdmAD = rdmAddDropTplist.stream().filter(adp -> adp.contains(roadm)).findFirst().get();
-            LOG.info("AD port of ROADm {} = {}", roadm, spcRdmAD);
-            // There should be only 1 AD and 1 DEG per roadm
-            // TODO photonic media model should be updated to have the corresponding CEPs. I will just create
-            //  3 different MC CEPs giving different IDs to show that they are different
-            // Create 3 CEPs for each AD and DEG and the corresponding cross connections, matching the NEPs
-            // created in the topology creation
-            // add CEPs to the topology to the corresponding ONEP
-            ConnectionEndPoint adCep1 = createCepRoadm(spcRdmAD, TapiStringConstants.PHTNC_MEDIA);
-            putRdmCepInTopologyContext(roadm, spcRdmAD, TapiStringConstants.PHTNC_MEDIA, adCep1);
-            ConnectionEndPoint adCep2 = createCepRoadm(spcRdmAD, TapiStringConstants.MC);
-            putRdmCepInTopologyContext(roadm, spcRdmAD, TapiStringConstants.MC, adCep2);
-            ConnectionEndPoint adCep3 = createCepRoadm(spcRdmAD, TapiStringConstants.OTSI_MC);
-            putRdmCepInTopologyContext(roadm, spcRdmAD, TapiStringConstants.OTSI_MC, adCep3);
-            cepMap.put(adCep1.key(), adCep1);
-            cepMap.put(adCep2.key(), adCep2);
-            cepMap.put(adCep3.key(), adCep3);
-
-            String spcRdmDEG = rdmDegTplist.stream().filter(adp -> adp.contains(roadm)).findFirst().get();
-            LOG.info("Degree port of ROADm {} = {}", roadm, spcRdmDEG);
-
-            ConnectionEndPoint degCep1 = createCepRoadm(spcRdmDEG, TapiStringConstants.PHTNC_MEDIA);
-            putRdmCepInTopologyContext(roadm, spcRdmDEG, TapiStringConstants.PHTNC_MEDIA, degCep1);
-            ConnectionEndPoint degCep2 = createCepRoadm(spcRdmDEG, TapiStringConstants.MC);
-            putRdmCepInTopologyContext(roadm, spcRdmDEG, TapiStringConstants.MC, degCep2);
-            ConnectionEndPoint degCep3 = createCepRoadm(spcRdmDEG, TapiStringConstants.OTSI_MC);
-            putRdmCepInTopologyContext(roadm, spcRdmDEG, TapiStringConstants.OTSI_MC, degCep3);
-            cepMap.put(degCep1.key(), degCep1);
-            cepMap.put(degCep2.key(), degCep2);
-            cepMap.put(degCep3.key(), degCep3);
-
-            LOG.info("Going to create cross connections for ROADM {}", roadm);
-            // Create X connections between MC and OTSi_MC for full map
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-                connection1 = createXCBetweenCeps(adCep2, degCep2, spcRdmAD, spcRdmDEG, TapiStringConstants.MC,
-                LayerProtocolName.PHOTONICMEDIA);
-            LOG.info("Cross connection 1 created = {}", connection1.toString());
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-                connection2 = createXCBetweenCeps(adCep3, degCep3, spcRdmAD, spcRdmDEG, TapiStringConstants.OTSI_MC,
-                LayerProtocolName.PHOTONICMEDIA);
-            LOG.info("Cross connection 2 created = {}", connection2.toString());
-            this.connectionFullMap.put(connection1.key(), connection1);
-            this.connectionFullMap.put(connection2.key(), connection2);
-
-            // Create X connections that will be added to the service object
-            LowerConnection conn1 = new LowerConnectionBuilder().setConnectionUuid(connection1.getUuid()).build();
-            LowerConnection conn2 = new LowerConnectionBuilder().setConnectionUuid(connection2.getUuid()).build();
-
-            xcMap.put(conn1.key(), conn1);
-            xcMap.put(conn2.key(), conn2);
-        }
-        LOG.info("Going to create top connections between roadms");
-        // create top connections between roadms: MC connections between AD MC CEPs of roadms
-        for (int i = 0; i < rdmNodelist.size(); i++) {
-            if (rdmNodelist.size() <= (i + 1)) {
-                LOG.info("Reached last roadm. No more MC connections");
-                break;
-            }
-            // Current roadm with roadm i + 1 --> MC
-            String roadm1 = rdmNodelist.get(i);
-            String spcRdmAD1 = rdmAddDropTplist.stream().filter(adp -> adp.contains(roadm1)).findFirst().get();
-            String roadm2 = rdmNodelist.get(i + 1);
-            String spcRdmAD2 = rdmAddDropTplist.stream().filter(adp -> adp.contains(roadm2)).findFirst().get();
-            LOG.info("Creating top connection from {} to {} between tps: {}-{}", roadm1, roadm2, spcRdmAD1, spcRdmAD2);
-
-            // Create top connections between MC for full map
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-                connection = createTopConnection(spcRdmAD1, spcRdmAD2, cepMap, TapiStringConstants.MC,
-                LayerProtocolName.PHOTONICMEDIA, xcMap);
-            this.connectionFullMap.put(connection.key(), connection);
-            LOG.info("Top connection created = {}", connection.toString());
-
-            // Create top connections that will be added to the service object and lower
-            // connection to the next top connection
-            Connection conn = new ConnectionBuilder().setConnectionUuid(connection.getUuid()).build();
-            connServMap.put(conn.key(), conn);
-            LowerConnection conn1 = new LowerConnectionBuilder().setConnectionUuid(connection.getUuid()).build();
-            xcMap.put(conn1.key(), conn1);
-        }
-
-        // OTSiMC top connection between edge roadms
-        LOG.info("Going to created top connection between OTSiMC");
-        String spcRdmAD1 = rdmAddDropTplist.stream().filter(adp -> adp.contains(edgeRoadm1)).findFirst().get();
-        String spcRdmAD2 = rdmAddDropTplist.stream().filter(adp -> adp.contains(edgeRoadm2)).findFirst().get();
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-            connection = createTopConnection(spcRdmAD1, spcRdmAD2, cepMap, TapiStringConstants.OTSI_MC,
-            LayerProtocolName.PHOTONICMEDIA, xcMap);
-        this.connectionFullMap.put(connection.key(), connection);
-        LOG.info("Top connection created = {}", connection.toString());
-
-        // OTSiMC top connections that will be added to the service object
-        Connection conn = new ConnectionBuilder().setConnectionUuid(connection.getUuid()).build();
-        connServMap.put(conn.key(), conn);
-        return connServMap;
-    }
-
-    private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-            createTopConnection(String tp1, String tp2,
-                        Map<org.opendaylight.yang.gen.v1.urn
-                                .onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey,
-                                ConnectionEndPoint> cepMap, String qual, LayerProtocolName topPortocol,
-                                Map<LowerConnectionKey, LowerConnection> xcMap) {
-        // find cep for each AD MC of roadm 1 and 2
-        LOG.info("Top connection name = {}", String.join("+", "TOP", tp1, tp2, qual));
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.ConnectionEndPoint adCep1 =
-            cepMap.get(new org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey(
-                new Uuid(UUID.nameUUIDFromBytes((String.join("+", "CEP", tp1.split("\\+")[0],
-                    qual, tp1.split("\\+")[1])).getBytes(Charset.forName("UTF-8")))
-                    .toString())));
-        LOG.info("ADCEP1 = {}", adCep1.toString());
-        org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPoint cep1 =
-            new org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPointBuilder()
-                .setNodeEdgePointUuid(adCep1.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeEdgePointUuid())
-                .setTopologyUuid(adCep1.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getTopologyUuid())
-                .setNodeUuid(adCep1.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeUuid())
-                .setConnectionEndPointUuid(adCep1.getUuid())
-                .build();
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.ConnectionEndPoint adCep2 =
-            cepMap.get(new org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey(
-                new Uuid(UUID.nameUUIDFromBytes((String.join("+", "CEP", tp2.split("\\+")[0],
-                    qual, tp2.split("\\+")[1])).getBytes(Charset.forName("UTF-8")))
-                    .toString())));
-        LOG.info("ADCEP2 = {}", adCep2.toString());
-        org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPoint cep2 =
-            new org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPointBuilder()
-                .setNodeEdgePointUuid(adCep2.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeEdgePointUuid())
-                .setTopologyUuid(adCep2.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getTopologyUuid())
-                .setNodeUuid(adCep2.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeUuid())
-                .setConnectionEndPointUuid(adCep1.getUuid())
-                .build();
-        Map<ConnectionEndPointKey, org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPoint> ceps = new HashMap<>();
-        ceps.put(cep1.key(), cep1);
-        ceps.put(cep2.key(), cep2);
-        Name connName = new NameBuilder()
-            .setValueName("Connection name")
-            .setValue(String.join("+", "TOP", tp1, tp2, qual))
-            .build();
-        // TODO: lower connection, supported link.......
-        return new org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectionBuilder()
-            .setUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", "TOP", tp1, tp2, qual))
-                .getBytes(Charset.forName("UTF-8"))).toString()))
-            .setName(Map.of(connName.key(), connName))
-            .setConnectionEndPoint(ceps)
-            .setOperationalState(OperationalState.DISABLED)
-            .setLayerProtocolName(topPortocol)
-            .setLifecycleState(LifecycleState.POTENTIALAVAILABLE)
-            .setDirection(ForwardingDirection.BIDIRECTIONAL)
-            .setLowerConnection(xcMap)
-            .build();
-    }
-
-    private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-            createXCBetweenCeps(ConnectionEndPoint cep1, ConnectionEndPoint cep2, String tp1, String tp2, String qual,
-                        LayerProtocolName xcProtocol) {
-        LOG.info("Creation cross connection between: {} and {}", tp1, tp2);
-        LOG.info("Cross connection name = {}", String.join("+", "XC", tp1, tp2, qual));
-        LOG.info("CEP1 = {}", cep1.getClientNodeEdgePoint().toString());
-        LOG.info("CEP2 = {}", cep2.getClientNodeEdgePoint().toString());
-        org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPoint cepServ1 =
-            new org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPointBuilder()
-                .setNodeEdgePointUuid(cep1.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeEdgePointUuid())
-                .setTopologyUuid(cep1.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getTopologyUuid())
-                .setNodeUuid(cep1.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeUuid())
-                .setConnectionEndPointUuid(cep1.getUuid())
-                .build();
-        org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPoint cepServ2 =
-            new org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPointBuilder()
-                .setNodeEdgePointUuid(cep2.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeEdgePointUuid())
-                .setTopologyUuid(cep2.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getTopologyUuid())
-                .setNodeUuid(cep2.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeUuid())
-                .setConnectionEndPointUuid(cep2.getUuid())
-                .build();
-        Map<ConnectionEndPointKey, org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPoint> ceps = new HashMap<>();
-        ceps.put(cepServ1.key(), cepServ1);
-        ceps.put(cepServ2.key(), cepServ2);
-        Name connName = new NameBuilder()
-            .setValueName("Connection name")
-            .setValue(String.join("+", "XC", tp1, tp2, qual))
-            .build();
-        // TODO: lower connection, supported link.......
-        return new org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectionBuilder()
-            .setUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", "XC", tp1, tp2, qual))
-                .getBytes(Charset.forName("UTF-8"))).toString()))
-            .setName(Map.of(connName.key(), connName))
-            .setConnectionEndPoint(ceps)
-            .setOperationalState(OperationalState.ENABLED)
-            .setLayerProtocolName(xcProtocol)
-            .setLifecycleState(LifecycleState.INSTALLED)
-            .setDirection(ForwardingDirection.BIDIRECTIONAL)
-            .build();
-    }
-
-    private ConnectionEndPoint createCepRoadm(String id, String qualifier) {
-        LOG.info("NEP = {}", String.join("+", id.split("\\+")[0], qualifier, id.split("\\+")[1]));
-        Name cepName = new NameBuilder()
-            .setValueName("ConnectionEndPoint name")
-            .setValue(String.join("+", id.split("\\+")[0], qualifier,
-                id.split("\\+")[1]))
-            .build();
-        ClientNodeEdgePoint cnep = new ClientNodeEdgePointBuilder()
-            .setNodeEdgePointUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", id.split("\\+")[0],
-                qualifier, id.split("\\+")[1])).getBytes(Charset.forName("UTF-8")))
-                .toString()))
-            .setNodeUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+",id.split("\\+")[0],
-                qualifier)).getBytes(Charset.forName("UTF-8")))
-                .toString()))
-            .setTopologyUuid(new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
-                .getBytes(Charset.forName("UTF-8"))).toString()))
-            .build();
-        // TODO: add augmentation with the corresponding cep-spec (i.e. MC, OTSiMC...)
-        // TODO: add parent ONEP??
-        ConnectionEndPointBuilder cepBldr = new ConnectionEndPointBuilder()
-            .setUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", "CEP", id.split("\\+")[0],
-                qualifier, id.split("\\+")[1])).getBytes(Charset.forName("UTF-8")))
-                .toString()))
-            .setClientNodeEdgePoint(Map.of(cnep.key(), cnep))
-            .setName(Map.of(cepName.key(), cepName))
-            .setConnectionPortRole(PortRole.SYMMETRIC)
-            .setConnectionPortDirection(PortDirection.BIDIRECTIONAL)
-            .setOperationalState(OperationalState.ENABLED)
-            .setLifecycleState(LifecycleState.INSTALLED)
-            .setLayerProtocolName(LayerProtocolName.PHOTONICMEDIA);
-        return cepBldr.build();
-    }
-
-    private ConnectionEndPoint createCepXpdr(String id, String qualifier, String nodeLayer,
-                                             LayerProtocolName cepProtocol) {
-        Name cepName = new NameBuilder()
-            .setValueName("ConnectionEndPoint name")
-            .setValue(String.join("+", id.split("\\+")[0], qualifier,
-                id.split("\\+")[1]))
-            .build();
-        ClientNodeEdgePoint cnep = new ClientNodeEdgePointBuilder()
-            .setNodeEdgePointUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", id.split("\\+")[0],
-                qualifier, id.split("\\+")[1])).getBytes(Charset.forName("UTF-8")))
-                .toString()))
-            .setNodeUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+",id.split("\\+")[0],
-                nodeLayer)).getBytes(Charset.forName("UTF-8")))
-                .toString()))
-            .setTopologyUuid(new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
-                .getBytes(Charset.forName("UTF-8"))).toString()))
-            .build();
-        // TODO: add augmentation with the corresponding cep-spec (i.e. MC, OTSiMC...)
-        // TODO: add parent ONEP??
-        ConnectionEndPointBuilder cepBldr = new ConnectionEndPointBuilder()
-            .setUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", "CEP", id.split("\\+")[0],
-                qualifier, id.split("\\+")[1])).getBytes(Charset.forName("UTF-8")))
-                .toString()))
-            .setClientNodeEdgePoint(Map.of(cnep.key(), cnep))
-            .setName(Map.of(cepName.key(), cepName))
-            .setConnectionPortRole(PortRole.SYMMETRIC)
-            .setConnectionPortDirection(PortDirection.BIDIRECTIONAL)
-            .setOperationalState(OperationalState.ENABLED)
-            .setLifecycleState(LifecycleState.INSTALLED)
-            .setLayerProtocolName(cepProtocol);
-        return cepBldr.build();
-    }
-
-    private void putRdmCepInTopologyContext(String node, String spcRdmAD, String qual, ConnectionEndPoint cep) {
-        LOG.info("NEP id before Merge = {}", String.join("+", node, qual, spcRdmAD.split("\\+")[1]));
-        LOG.info("Node of NEP id before Merge = {}", String.join("+", node, TapiStringConstants.PHTNC_MEDIA));
-        // Give uuids so that it is easier to look for things: topology uuid, node uuid, nep uuid, cep
-        Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", node, TapiStringConstants.PHTNC_MEDIA)
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", node, qual, spcRdmAD.split("\\+")[1])
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        updateTopologyWithCep(topoUuid, nodeUuid, nepUuid, cep);
-    }
-
-    private void putXpdrCepInTopologyContext(String node, String spcXpdrNet, String qual, String nodeLayer,
-                                             ConnectionEndPoint cep) {
-        // Give uuids so that it is easier to look for things: topology uuid, node uuid, nep uuid, cep
-        Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", node, nodeLayer)
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", node, qual, spcXpdrNet.split("\\+")[1])
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        updateTopologyWithCep(topoUuid, nodeUuid, nepUuid, cep);
-    }
-
-    public void updateTopologyWithCep(Uuid topoUuid, Uuid nodeUuid, Uuid nepUuid, ConnectionEndPoint cep) {
-        // TODO: verify this is correct. Should we identify the context IID with the context UUID??
-        InstanceIdentifier<OwnedNodeEdgePoint> onepIID = InstanceIdentifier.builder(Context.class)
-            .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.Context1.class)
-            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.context.TopologyContext.class)
-            .child(Topology.class, new TopologyKey(topoUuid))
-            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node.class,
-                new NodeKey(nodeUuid))
-            .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nepUuid))
-            .build();
-        try {
-            Optional<OwnedNodeEdgePoint> optionalOnep = this.networkTransactionService.read(
-                LogicalDatastoreType.OPERATIONAL, onepIID).get();
-            if (!optionalOnep.isPresent()) {
-                LOG.error("ONEP is not present in datastore");
-                return;
-            }
-            OwnedNodeEdgePoint onep = optionalOnep.get();
-            LOG.info("ONEP found = {}", onep.toString());
-            // TODO -> If cep exists -> skip merging to datasore
-            OwnedNodeEdgePoint1 onep1 = onep.augmentation(OwnedNodeEdgePoint1.class);
-            if (onep1 != null && onep1.getCepList() != null && onep1.getCepList().getConnectionEndPoint() != null) {
-                if (onep1.getCepList().getConnectionEndPoint().containsKey(
-                    new org.opendaylight.yang.gen.v1
-                        .urn.onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey(cep.key()))) {
-                    LOG.info("CEP already in topology, skipping merge");
-                    return;
-                }
-            }
-            // Updated ONEP
-            CepList cepList = new CepListBuilder().setConnectionEndPoint(Map.of(cep.key(), cep)).build();
-            OwnedNodeEdgePoint1 onep1Bldr = new OwnedNodeEdgePoint1Builder().setCepList(cepList).build();
-            OwnedNodeEdgePoint newOnep = new OwnedNodeEdgePointBuilder(onep)
-                .addAugmentation(onep1Bldr)
-                .build();
-            LOG.info("New ONEP is {}", newOnep.toString());
-            // merge in datastore
-            this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, onepIID,
-                newOnep);
-            this.networkTransactionService.commit().get();
-            LOG.info("CEP added successfully.");
-        } catch (InterruptedException | ExecutionException e) {
-            LOG.error("Couldnt update cep in topology", e);
-        }
-    }
-
-    private void updateConnectionContextWithConn(
-            Map<org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectionKey,
-                org.opendaylight.yang.gen.v1.urn
-                    .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection> connFullMap,
-            Map<ConnectionKey, Connection> connMap, Uuid suuid) {
-        // TODO: verify this is correct. Should we identify the context IID with the context UUID??
-        try {
-            ConnectivityService connServ = getConnectivityService(suuid);
-            ConnectivityService updtConnServ = new ConnectivityServiceBuilder(connServ)
-                    .setConnection(connMap)
-                    .build();
-
-            // Perform the merge operation with the new conn service and the connection context updated
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContext
-                    connectivityContext = new ConnectivityContextBuilder()
-                    .setConnectivityService(Map.of(updtConnServ.key(), updtConnServ))
-                    .setConnection(connFullMap)
-                    .build();
-            InstanceIdentifier<org.opendaylight.yang.gen.v1.urn
-                    .onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContext> connectivitycontextIID =
-                    InstanceIdentifier.builder(Context.class).augmentation(Context1.class)
-                            .child(org.opendaylight.yang.gen.v1.urn
-                                    .onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContext.class)
-                            .build();
-            // merge in datastore
-            this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, connectivitycontextIID,
-                    connectivityContext);
-            this.networkTransactionService.commit().get();
-            LOG.info("TAPI connectivity merged successfully.");
-        } catch (InterruptedException | ExecutionException e) {
-            LOG.error("Failed to merge TAPI connectivity", e);
-        }
-    }
-
-    private ConnectivityService getConnectivityService(Uuid suuid) {
-        try {
-        // First read connectivity service with service uuid and update info
-            InstanceIdentifier<ConnectivityService> connectivityServIID =
-                InstanceIdentifier.builder(Context.class).augmentation(Context1.class)
-                        .child(org.opendaylight.yang.gen.v1.urn
-                                .onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContext.class)
-                        .child(ConnectivityService.class, new ConnectivityServiceKey(suuid))
-                        .build();
-
-            Optional<ConnectivityService> optConnServ =
-                this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, connectivityServIID).get();
-            if (!optConnServ.isPresent()) {
-                LOG.error("Connectivity service not found in tapi context");
-                return null;
-            }
-            return optConnServ.get();
-        } catch (InterruptedException | ExecutionException e) {
-            LOG.error("Connectivity service not found in tapi context. Error:", e);
-            return null;
-        }
-    }
-
-    private void deleteConnectivityService(Uuid suuid) {
-        // First read connectivity service with service uuid and update info
-        InstanceIdentifier<ConnectivityService> connectivityServIID =
-                InstanceIdentifier.builder(Context.class).augmentation(Context1.class)
-                        .child(org.opendaylight.yang.gen.v1.urn
-                                .onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContext.class)
-                        .child(ConnectivityService.class, new ConnectivityServiceKey(suuid))
-                        .build();
-        try {
-            this.networkTransactionService.delete(LogicalDatastoreType.OPERATIONAL, connectivityServIID);
-            this.networkTransactionService.commit().get();
-        } catch (InterruptedException | ExecutionException e) {
-            LOG.error("Failed to delete TAPI connectivity service", e);
-        }
-    }
-
-    private void deleteConnection(Uuid connectionUuid) {
-        // First read connectivity service with service uuid and update info
-        InstanceIdentifier<org.opendaylight.yang.gen.v1
-                .urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection> connectionIID =
-                InstanceIdentifier.builder(Context.class).augmentation(Context1.class)
-                        .child(org.opendaylight.yang.gen.v1.urn
-                                .onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContext.class)
-                        .child(org.opendaylight.yang.gen.v1.urn
-                                .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection.class,
-                                new org.opendaylight.yang.gen.v1.urn
-                                        .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectionKey(
-                                                connectionUuid))
-                        .build();
-        try {
-            this.networkTransactionService.delete(LogicalDatastoreType.OPERATIONAL, connectionIID);
-            this.networkTransactionService.commit().get();
-        } catch (InterruptedException | ExecutionException e) {
-            LOG.error("Failed to delete TAPI connection", e);
-        }
-    }
-
-    private String getIdBasedOnModelVersion(String nodeid) {
-        return nodeid.matches("[A-Z]{5}-[A-Z0-9]{2}-.*")
-            ? String.join("-", nodeid.split("-")[0], nodeid.split("-")[1]) : nodeid.split("-")[0];
-    }
-
-    private ConnectionEndPoint getAssociatediODUCep(String spcXpdrNetwork) {
-        Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", spcXpdrNetwork.split("\\+")[0],
-            TapiStringConstants.DSR).getBytes(Charset.forName("UTF-8")))).toString());
-        Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", spcXpdrNetwork.split("\\+")[0],
-                TapiStringConstants.I_ODU, spcXpdrNetwork.split("\\+")[1]).getBytes(Charset.forName("UTF-8"))))
-            .toString());
-        Uuid cepUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "CEP",
-            spcXpdrNetwork.split("\\+")[0], TapiStringConstants.I_ODU, spcXpdrNetwork.split("\\+")[1]))
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        InstanceIdentifier<OwnedNodeEdgePoint> nepIID = InstanceIdentifier.builder(Context.class)
-            .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.Context1.class)
-            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.context.TopologyContext.class)
-            .child(Topology.class, new TopologyKey(topoUuid))
-            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node.class,
-                new NodeKey(nodeUuid)).child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nepUuid)).build();
-        try {
-            Optional<OwnedNodeEdgePoint> optNode = this.networkTransactionService
-                .read(LogicalDatastoreType.OPERATIONAL, nepIID).get();
-            if (!optNode.isPresent()) {
-                LOG.error("Node is not present in datastore");
-                return null;
-            }
-            if (optNode.get().augmentation(OwnedNodeEdgePoint1.class) == null) {
-                LOG.error("Node doesnt have ceps");
-                return null;
-            }
-            return optNode.get().augmentation(OwnedNodeEdgePoint1.class).getCepList().getConnectionEndPoint()
-                .get(new org.opendaylight.yang.gen.v1.urn
-                    .onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey(cepUuid));
-        } catch (InterruptedException | ExecutionException e) {
-            LOG.error("Couldnt read node in topology", e);
-            return null;
-        }
-    }
-
-    private String getAssociatedNetworkPort(String spcXpdrClient, List<String> xpdrNetworkTplist) {
-        for (String networkPort:xpdrNetworkTplist) {
-            if (networkPort.split("\\+")[0].equals(spcXpdrClient.split("\\+")[0])) {
-                return networkPort;
-            }
-        }
-        return null;
-    }
-
-    private OpenroadmNodeType getOpenRoadmNodeType(List<String> xpdrNodelist) {
-        List<OpenroadmNodeType> openroadmNodeTypeList = new ArrayList<>();
-        for (String xpdrNode:xpdrNodelist) {
-            Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+",xpdrNode, TapiStringConstants.DSR))
-                .getBytes(Charset.forName("UTF-8"))).toString());
-            InstanceIdentifier<org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.topology.rev181210.topology.Node> nodeIID = InstanceIdentifier.builder(
-                    Context.class).augmentation(org.opendaylight.yang.gen.v1.urn
-                    .onf.otcc.yang.tapi.topology.rev181210.Context1.class).child(TopologyContext.class)
-                .child(Topology.class, new TopologyKey(this.tapiTopoUuid))
-                .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node.class,
-                    new NodeKey(nodeUuid)).build();
-            try {
-                Optional<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> optNode
-                    = this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, nodeIID).get();
-                if (!optNode.isPresent()) {
-                    return null;
-                }
-                OpenroadmNodeType openroadmNodeType = OpenroadmNodeType.forName(optNode.get().getName().get(
-                    new NameKey("Node Type")).getValue()).get();
-                if (!openroadmNodeTypeList.contains(openroadmNodeType)) {
-                    openroadmNodeTypeList.add(openroadmNodeType);
-                }
-            } catch (InterruptedException | ExecutionException e) {
-                LOG.error("Couldnt read node in topology", e);
-                return null;
-            }
-        }
-        // TODO for now check that there is only one type, otherwise error
-        if (openroadmNodeTypeList.size() != 1) {
-            LOG.error("More than one xpdr type. List = {}", openroadmNodeTypeList);
-            return null;
-        }
-        return openroadmNodeTypeList.get(0);
-    }
-
-    private List<String> getAssociatedClientsPort(List<String> xpdrNetworkTplist) {
-        List<String> clientPortList = new ArrayList<>();
-        for (String networkPort:xpdrNetworkTplist) {
-            String nodeId = String.join("-", networkPort.split("\\+")[0].split("-")[0],
-                networkPort.split("\\+")[0].split("-")[1]);
-            String tpId = networkPort.split("\\+")[1];
-            InstanceIdentifier<Mapping> mapIID = InstanceIdentifier.builder(Network.class)
-                .child(Nodes.class, new NodesKey(nodeId))
-                .child(Mapping.class, new MappingKey(tpId)).build();
-            try {
-                Optional<Mapping> optMapping = this.networkTransactionService.read(LogicalDatastoreType.CONFIGURATION,
-                    mapIID).get();
-                if (!optMapping.isPresent()) {
-                    LOG.error("Couldnt find mapping for port {} of node {}", tpId, nodeId);
-                }
-                Mapping mapping = optMapping.get();
-                LOG.info("Mapping for node+port {}+{} = {}", nodeId, tpId, mapping);
-                String key = String.join("+", String.join("-", nodeId, tpId.split("\\-")[0]),
-                    mapping.getConnectionMapLcp());
-                LOG.info("Key to be added to list = {}", key);
-                if (!clientPortList.contains(key)) {
-                    clientPortList.add(key);
-                }
-            } catch (InterruptedException | ExecutionException e) {
-                LOG.error("Couldnt read mapping from datastore", e);
-                return null;
-            }
-
-        }
-        return clientPortList;
-    }
-
-    public void setInput(CreateConnectivityServiceInput input) {
-        this.input = input;
-    }
-
-    public void setServiceUuid(Uuid serviceUuid) {
-        this.serviceUuid = serviceUuid;
-    }
-}
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/listeners/TapiPceNotificationHandler.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/listeners/TapiPceNotificationHandler.java
new file mode 100644 (file)
index 0000000..3137fab
--- /dev/null
@@ -0,0 +1,376 @@
+/*
+ * Copyright © 2021 Nokia, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.tapi.listeners;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import java.nio.charset.Charset;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.NotificationService.CompositeListener;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
+import org.opendaylight.transportpce.tapi.connectivity.ConnectivityUtils;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.ServicePathRpcResult;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.service.path.rpc.result.PathDescription;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.pce.rev240205.service.path.rpc.result.PathDescriptionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.service.types.rev220118.RpcStatusEx;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Context;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.Context1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CreateConnectivityServiceInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.OwnedNodeEdgePoint1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.OwnedNodeEdgePoint1Builder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.cep.list.ConnectionEndPoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.Connection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.ConnectionKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContextBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.context.topology.context.topology.node.owned.node.edge.point.CepList;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.context.topology.context.topology.node.owned.node.edge.point.CepListBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyKey;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TapiPceNotificationHandler {
+
+    private static final Logger LOG = LoggerFactory.getLogger(TapiPceNotificationHandler.class);
+
+    private ServicePathRpcResult servicePathRpcResult;
+    private CreateConnectivityServiceInput input;
+    private Uuid serviceUuid;
+    private final DataBroker dataBroker;
+    private final NetworkTransactionService networkTransactionService;
+    private final ConnectivityUtils connectivityUtils;
+    private final Map<org.opendaylight.yang.gen.v1.urn
+        .onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectionKey,
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.Connection>
+        connectionFullMap; // this variable is for complete connection objects
+
+    public TapiPceNotificationHandler(DataBroker dataBroker, ConnectivityUtils connecUtil) {
+        this.connectionFullMap = new HashMap<>();
+        this.dataBroker = dataBroker;
+        this.networkTransactionService = new NetworkTransactionImpl(this.dataBroker);
+        this.connectivityUtils = connecUtil;
+    }
+
+    public CompositeListener getCompositeListener() {
+        return new CompositeListener(Set.of(
+            new CompositeListener.Component<>(ServicePathRpcResult.class, this::onServicePathRpcResult)));
+    }
+
+    private void onServicePathRpcResult(ServicePathRpcResult notification) {
+        if (compareServicePathRpcResult(notification)) {
+            LOG.warn("ServicePathRpcResult already wired !");
+            return;
+        }
+        servicePathRpcResult = notification;
+        switch (servicePathRpcResult.getNotificationType().getIntValue()) {
+            /* path-computation-request. */
+            case 1:
+                onPathComputationResult(notification);
+                break;
+            /* cancel-resource-reserve. */
+            case 2:
+                onCancelResourceResult(notification.getServiceName());
+                break;
+            default:
+                break;
+        }
+    }
+
+    /**
+     * Process path computation request result.
+     * @param notification the result notification.
+     */
+    private void onPathComputationResult(ServicePathRpcResult notification) {
+        this.connectionFullMap.clear();
+        LOG.info("PCE '{}' Notification received : {}",servicePathRpcResult.getNotificationType().getName(),
+            notification);
+        if (servicePathRpcResult.getStatus() == RpcStatusEx.Failed) {
+            LOG.error("PCE path computation failed !");
+            return;
+        } else if (servicePathRpcResult.getStatus() == RpcStatusEx.Pending) {
+            LOG.warn("PCE path computation returned a Penging RpcStatusEx code!");
+            return;
+        } else if (servicePathRpcResult.getStatus() != RpcStatusEx.Successful) {
+            LOG.error("PCE path computation returned an unknown RpcStatusEx code!");
+            return;
+        }
+
+        LOG.info("PCE calculation done OK !");
+        if (servicePathRpcResult.getPathDescription() == null) {
+            LOG.error("'PathDescription' parameter is null ");
+            return;
+        }
+        PathDescription pathDescription = new PathDescriptionBuilder()
+            .setAToZDirection(servicePathRpcResult.getPathDescription().getAToZDirection())
+            .setZToADirection(servicePathRpcResult.getPathDescription().getZToADirection())
+            .build();
+        LOG.info("PathDescription for TAPI gets : {}", pathDescription);
+        if (input == null) {
+            LOG.error("Input is null !");
+            return;
+        }
+        // TODO: check kind of service: based on the device Id of the input,
+        //  verify the type of XPDR and the capacity and determine if it is an OTN service or pure WDM service
+        // Create connections and ceps for the connectivity service.
+        //  Connections must be with a locked stated. As the renderer hasnt implemented yet the oc's
+        Map<ConnectionKey, Connection> connectionMap = connectivityUtils.createConnectionsFromService(
+                pathDescription, input.getLayerProtocolName());
+        this.connectionFullMap.putAll(connectivityUtils.getConnectionFullMap());
+        LOG.debug("Connection Map from createConnectionsAndCepsForService is {}, LAYERPROTOCOL of service is {} ",
+            connectionMap.toString(), input.getLayerProtocolName());
+        // add connections to connection context and to connectivity context
+        updateConnectionContextWithConn(this.connectionFullMap, connectionMap, serviceUuid);
+    }
+
+    /**
+     * Process cancel resource result.
+     * @param serviceName Service name to build uuid.
+     */
+    private void onCancelResourceResult(String serviceName) {
+        if (servicePathRpcResult.getStatus() == RpcStatusEx.Failed) {
+            LOG.info("PCE cancel resource failed !");
+            return;
+        } else if (servicePathRpcResult.getStatus() == RpcStatusEx.Pending) {
+            LOG.warn("PCE cancel returned a Penging RpcStatusEx code!");
+            return;
+        } else if (servicePathRpcResult.getStatus() != RpcStatusEx.Successful) {
+            LOG.error("PCE cancel returned an unknown RpcStatusEx code!");
+            return;
+        }
+        LOG.info("PCE cancel resource done OK !");
+        Uuid suuid = new Uuid(UUID.nameUUIDFromBytes(serviceName.getBytes(Charset.forName("UTF-8")))
+            .toString());
+        // get connections of connectivity service and remove them from tapi context and then remove
+        //  service from context. The CEPs are maintained as they could be reused by another service
+        ConnectivityService connService = getConnectivityService(suuid);
+        if (connService == null) {
+            LOG.error("Service doesnt exist in tapi context");
+            return;
+        }
+        for (Connection connection:connService.getConnection().values()) {
+            deleteConnection(connection.getConnectionUuid());
+        }
+        deleteConnectivityService(suuid);
+    }
+
+    @SuppressFBWarnings(
+        value = "ES_COMPARING_STRINGS_WITH_EQ",
+        justification = "false positives, not strings but real object references comparisons")
+    private Boolean compareServicePathRpcResult(ServicePathRpcResult notification) {
+        if (servicePathRpcResult == null) {
+            return false;
+        }
+        if (servicePathRpcResult.getNotificationType() != notification.getNotificationType()) {
+            return false;
+        }
+        if (servicePathRpcResult.getServiceName() != notification.getServiceName()) {
+            return false;
+        }
+        if (servicePathRpcResult.getStatus() != notification.getStatus()) {
+            return false;
+        }
+        if (servicePathRpcResult.getStatusMessage() != notification.getStatusMessage()) {
+            return false;
+        }
+        return true;
+    }
+
+
+    public void updateTopologyWithCep(Uuid topoUuid, Uuid nodeUuid, Uuid nepUuid, ConnectionEndPoint cep) {
+        // TODO: verify this is correct. Should we identify the context IID with the context UUID??
+        InstanceIdentifier<OwnedNodeEdgePoint> onepIID = InstanceIdentifier.builder(Context.class)
+            .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1.class)
+            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.context.TopologyContext.class)
+            .child(Topology.class, new TopologyKey(topoUuid))
+            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node.class,
+                new NodeKey(nodeUuid))
+            .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nepUuid))
+            .build();
+        try {
+            Optional<OwnedNodeEdgePoint> optionalOnep = this.networkTransactionService.read(
+                LogicalDatastoreType.OPERATIONAL, onepIID).get();
+            if (!optionalOnep.isPresent()) {
+                LOG.error("ONEP is not present in datastore");
+                return;
+            }
+            OwnedNodeEdgePoint onep = optionalOnep.orElseThrow();
+            LOG.info("ONEP found = {}", onep.toString());
+            // TODO -> If cep exists -> skip merging to datasore
+            OwnedNodeEdgePoint1 onep1 = onep.augmentation(OwnedNodeEdgePoint1.class);
+            if (onep1 != null && onep1.getCepList() != null && onep1.getCepList().getConnectionEndPoint() != null) {
+                if (onep1.getCepList().getConnectionEndPoint().containsKey(
+                        new org.opendaylight.yang.gen.v1
+                            .urn.onf.otcc.yang.tapi.connectivity.rev221121.cep.list.ConnectionEndPointKey(cep.key()))) {
+                    LOG.info("CEP already in topology, skipping merge");
+                    return;
+                }
+            }
+            // Updated ONEP
+            CepList cepList = new CepListBuilder().setConnectionEndPoint(Map.of(cep.key(), cep)).build();
+            OwnedNodeEdgePoint1 onep1Bldr = new OwnedNodeEdgePoint1Builder().setCepList(cepList).build();
+            OwnedNodeEdgePoint newOnep = new OwnedNodeEdgePointBuilder(onep)
+                .addAugmentation(onep1Bldr)
+                .build();
+            LOG.info("New ONEP is {}", newOnep.toString());
+            // merge in datastore
+            this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, onepIID,
+                newOnep);
+            this.networkTransactionService.commit().get();
+            LOG.info("CEP added successfully.");
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Couldnt update cep in topology", e);
+        }
+    }
+
+    public void updateTopologyWithNep(Uuid topoUuid, Uuid nodeUuid, Uuid nepUuid, OwnedNodeEdgePoint onep) {
+        // TODO: verify this is correct. Should we identify the context IID with the context UUID??
+        InstanceIdentifier<OwnedNodeEdgePoint> onepIID = InstanceIdentifier.builder(Context.class)
+            .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1.class)
+            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.context.TopologyContext.class)
+            .child(Topology.class, new TopologyKey(topoUuid))
+            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node.class,
+                new NodeKey(nodeUuid))
+            .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nepUuid))
+            .build();
+        try {
+            Optional<OwnedNodeEdgePoint> optionalOnep = this.networkTransactionService.read(
+                LogicalDatastoreType.OPERATIONAL, onepIID).get();
+            if (optionalOnep.isPresent()) {
+                LOG.error("ONEP is already present in datastore");
+                return;
+            }
+            // merge in datastore
+            this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, onepIID,
+                onep);
+            this.networkTransactionService.commit().get();
+            LOG.info("NEP {} added successfully.", onep.getName().toString());
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Couldnt put NEP {} in topology, error = ", onep.getName().toString(), e);
+        }
+    }
+
+
+    private void updateConnectionContextWithConn(
+            Map<org.opendaylight.yang.gen.v1.urn
+                    .onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectionKey,
+                org.opendaylight.yang.gen.v1.urn
+                    .onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.Connection> connFullMap,
+            Map<ConnectionKey, Connection> connMap, Uuid suuid) {
+        // TODO: verify this is correct. Should we identify the context IID with the context UUID??
+        try {
+            ConnectivityService connServ = getConnectivityService(suuid);
+            ConnectivityService updtConnServ = new ConnectivityServiceBuilder(connServ)
+                .setConnection(connMap)
+                .build();
+
+            // Perform the merge operation with the new conn service and the connection context updated
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext
+                connectivityContext = new ConnectivityContextBuilder()
+                    .setConnectivityService(Map.of(updtConnServ.key(), updtConnServ))
+                    .setConnection(connFullMap)
+                    .build();
+            InstanceIdentifier<org.opendaylight.yang.gen.v1.urn
+                    .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext> connectivitycontextIID =
+                InstanceIdentifier.builder(Context.class).augmentation(Context1.class)
+                    .child(org.opendaylight.yang.gen.v1.urn
+                        .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext.class)
+                    .build();
+            // merge in datastore
+            this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, connectivitycontextIID,
+                connectivityContext);
+            this.networkTransactionService.commit().get();
+            LOG.info("TAPI connectivity merged successfully.");
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Failed to merge TAPI connectivity", e);
+        }
+    }
+
+    private ConnectivityService getConnectivityService(Uuid suuid) {
+        try {
+            // First read connectivity service with service uuid and update info
+            InstanceIdentifier<ConnectivityService> connectivityServIID =
+                InstanceIdentifier.builder(Context.class).augmentation(Context1.class)
+                    .child(org.opendaylight.yang.gen.v1.urn
+                        .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext.class)
+                    .child(ConnectivityService.class, new ConnectivityServiceKey(suuid))
+                    .build();
+
+            Optional<ConnectivityService> optConnServ =
+                this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, connectivityServIID).get();
+            if (optConnServ.isEmpty()) {
+                LOG.error("Connectivity service not found in tapi context");
+                return null;
+            }
+            return optConnServ.orElseThrow();
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Connectivity service not found in tapi context. Error:", e);
+            return null;
+        }
+    }
+
+    private void deleteConnectivityService(Uuid suuid) {
+        // First read connectivity service with service uuid and update info
+        InstanceIdentifier<ConnectivityService> connectivityServIID =
+            InstanceIdentifier.builder(Context.class).augmentation(Context1.class)
+                .child(org.opendaylight.yang.gen.v1.urn
+                    .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext.class)
+                .child(ConnectivityService.class, new ConnectivityServiceKey(suuid))
+                .build();
+        try {
+            this.networkTransactionService.delete(LogicalDatastoreType.OPERATIONAL, connectivityServIID);
+            this.networkTransactionService.commit().get();
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Failed to delete TAPI connectivity service", e);
+        }
+    }
+
+    private void deleteConnection(Uuid connectionUuid) {
+        // First read connectivity service with service uuid and update info
+        InstanceIdentifier<org.opendaylight.yang.gen.v1
+                .urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.Connection> connectionIID =
+            InstanceIdentifier.builder(Context.class).augmentation(Context1.class)
+                .child(org.opendaylight.yang.gen.v1.urn
+                    .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext.class)
+                .child(org.opendaylight.yang.gen.v1.urn
+                        .onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.Connection.class,
+                    new org.opendaylight.yang.gen.v1.urn
+                            .onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectionKey(
+                        connectionUuid))
+                .build();
+        try {
+            this.networkTransactionService.delete(LogicalDatastoreType.OPERATIONAL, connectionIID);
+            this.networkTransactionService.commit().get();
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Failed to delete TAPI connection", e);
+        }
+    }
+
+    public void setInput(CreateConnectivityServiceInput input) {
+        this.input = input;
+    }
+
+    public void setServiceUuid(Uuid serviceUuid) {
+        this.serviceUuid = serviceUuid;
+    }
+}
\ No newline at end of file
similarity index 63%
rename from tapi/src/main/java/org/opendaylight/transportpce/tapi/listeners/TapiRendererListenerImpl.java
rename to tapi/src/main/java/org/opendaylight/transportpce/tapi/listeners/TapiRendererNotificationHandler.java
index 24d5e30975a166e9a45e1c3492b8ffe4a879e26d..f65f35808cd2ef6484bafa54b51cae4e4a61d7b9 100644 (file)
@@ -8,48 +8,74 @@
 package org.opendaylight.transportpce.tapi.listeners;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Optional;
+import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.ExecutionException;
 import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.mdsal.binding.api.NotificationService.CompositeListener;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
-import org.opendaylight.transportpce.common.network.RequestProcessor;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.RendererRpcResultSp;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.renderer.rev210915.TransportpceRendererListener;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.AdministrativeState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Context;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LifecycleState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.OperationalState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.Context1;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectionBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectionKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityService;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityServiceBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityServiceKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.Connection;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishTapiNotificationService;
+import org.opendaylight.yang.gen.v1.nbi.notifications.rev230728.PublishTapiNotificationServiceBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Context;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.DateAndTime;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CONNECTIVITYOBJECTTYPECONNECTIVITYSERVICE;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.Context1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectionBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectionKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.Connection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.NOTIFICATIONTYPEATTRIBUTEVALUECHANGE;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.ChangedAttributes;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.ChangedAttributesBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.ChangedAttributesKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.TargetObjectName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.TargetObjectNameBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.TargetObjectNameKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class TapiRendererListenerImpl implements TransportpceRendererListener {
+public class TapiRendererNotificationHandler {
 
-    private static final Logger LOG = LoggerFactory.getLogger(TapiRendererListenerImpl.class);
+    private static final Logger LOG = LoggerFactory.getLogger(TapiRendererNotificationHandler.class);
     private final DataBroker dataBroker;
     private Uuid serviceUuid;
     private RendererRpcResultSp serviceRpcResultSp;
     private final NetworkTransactionService networkTransactionService;
+    private final NotificationPublishService notificationPublishService;
 
-    public TapiRendererListenerImpl(DataBroker dataBroker) {
+    public TapiRendererNotificationHandler(DataBroker dataBroker,
+            NotificationPublishService notificationPublishService) {
         this.dataBroker = dataBroker;
-        this.networkTransactionService = new NetworkTransactionImpl(new RequestProcessor(this.dataBroker));
+        this.networkTransactionService = new NetworkTransactionImpl(this.dataBroker);
+        this.notificationPublishService = notificationPublishService;
     }
 
-    @Override
-    public void onRendererRpcResultSp(RendererRpcResultSp notification) {
+    public CompositeListener getCompositeListener() {
+        return new CompositeListener(Set.of(
+            new CompositeListener.Component<>(RendererRpcResultSp.class, this::onRendererRpcResultSp)));
+    }
+
+    private void onRendererRpcResultSp(RendererRpcResultSp notification) {
         if (compareServiceRpcResultSp(notification)) {
             LOG.warn("ServiceRpcResultSp already wired !");
             return;
@@ -98,7 +124,7 @@ public class TapiRendererListenerImpl implements TransportpceRendererListener {
             LOG.error("Couldnt retrieve service from datastore");
             return;
         }
-        LOG.info("Connectivity service = {}", connectivityService.toString());
+        LOG.info("Connectivity service = {}", connectivityService);
         // TODO --> this throws error because the renderer goes really fast. Is this normal??
         ConnectivityService updtConnServ = new ConnectivityServiceBuilder(connectivityService)
             .setAdministrativeState(AdministrativeState.UNLOCKED)
@@ -109,6 +135,8 @@ public class TapiRendererListenerImpl implements TransportpceRendererListener {
             updateConnectionState(connection.getConnectionUuid());
         }
         updateConnectivityService(updtConnServ);
+        // TODO: need to send notification to kafka in case the topic exists!!
+        sendNbiNotification(createNbiNotification(updtConnServ));
     }
 
     /**
@@ -118,7 +146,7 @@ public class TapiRendererListenerImpl implements TransportpceRendererListener {
     private void onFailedServiceImplementation(String serviceName) {
         LOG.error("Renderer implementation failed !");
         LOG.info("PCE cancel resource done OK !");
-        Uuid suuid = new Uuid(UUID.nameUUIDFromBytes(serviceName.getBytes(Charset.forName("UTF-8")))
+        Uuid suuid = new Uuid(UUID.nameUUIDFromBytes(serviceName.getBytes(StandardCharsets.UTF_8))
                 .toString());
         // get connections of connectivity service and remove them from tapi context and then remove
         //  service from context. The CEPs are maintained as they could be reused by another service
@@ -162,7 +190,7 @@ public class TapiRendererListenerImpl implements TransportpceRendererListener {
             InstanceIdentifier<ConnectivityService> connectivityServIID =
                 InstanceIdentifier.builder(Context.class).augmentation(Context1.class)
                     .child(org.opendaylight.yang.gen.v1.urn
-                        .onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContext.class)
+                        .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext.class)
                     .child(ConnectivityService.class, new ConnectivityServiceKey(suuid))
                     .build();
 
@@ -172,7 +200,7 @@ public class TapiRendererListenerImpl implements TransportpceRendererListener {
                 LOG.error("Connectivity service not found in tapi context");
                 return null;
             }
-            return optConnServ.get();
+            return optConnServ.orElseThrow();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Failed to merge TAPI connectivity", e);
             return null;
@@ -184,24 +212,24 @@ public class TapiRendererListenerImpl implements TransportpceRendererListener {
         try {
             // First read connection with connection uuid and update info
             InstanceIdentifier<org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection> connectionIID =
+                .onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.Connection> connectionIID =
                 InstanceIdentifier.builder(Context.class).augmentation(Context1.class)
                     .child(org.opendaylight.yang.gen.v1.urn
-                        .onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContext.class)
+                        .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext.class)
                     .child(org.opendaylight.yang.gen.v1.urn
-                            .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection.class,
+                            .onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.Connection.class,
                         new ConnectionKey(connectionUuid))
                     .build();
 
             Optional<org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection> optConn =
+                .onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.Connection> optConn =
                 this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, connectionIID).get();
             if (!optConn.isPresent()) {
                 LOG.error("Connection not found in tapi context");
                 return;
             }
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-                newConnection = new ConnectionBuilder(optConn.get()).setLifecycleState(LifecycleState.INSTALLED)
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.Connection
+                newConnection = new ConnectionBuilder(optConn.orElseThrow()).setLifecycleState(LifecycleState.INSTALLED)
                     .setOperationalState(OperationalState.ENABLED).build();
             // merge in datastore
             this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, connectionIID,
@@ -220,7 +248,7 @@ public class TapiRendererListenerImpl implements TransportpceRendererListener {
             InstanceIdentifier<ConnectivityService> connServIID =
                 InstanceIdentifier.builder(Context.class).augmentation(Context1.class)
                     .child(org.opendaylight.yang.gen.v1.urn
-                        .onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContext.class)
+                        .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext.class)
                     .child(ConnectivityService.class, new ConnectivityServiceKey(updtConnServ.getUuid()))
                     .build();
 
@@ -246,7 +274,7 @@ public class TapiRendererListenerImpl implements TransportpceRendererListener {
         InstanceIdentifier<ConnectivityService> connectivityServIID =
             InstanceIdentifier.builder(Context.class).augmentation(Context1.class)
                 .child(org.opendaylight.yang.gen.v1.urn
-                    .onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContext.class)
+                    .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext.class)
                 .child(ConnectivityService.class, new ConnectivityServiceKey(suuid))
                 .build();
         try {
@@ -260,14 +288,14 @@ public class TapiRendererListenerImpl implements TransportpceRendererListener {
     private void deleteConnection(Uuid connectionUuid) {
         // First read connectivity service with service uuid and update info
         InstanceIdentifier<org.opendaylight.yang.gen.v1
-            .urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection> connectionIID =
+            .urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.Connection> connectionIID =
             InstanceIdentifier.builder(Context.class).augmentation(Context1.class)
                 .child(org.opendaylight.yang.gen.v1.urn
-                    .onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContext.class)
+                    .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext.class)
                 .child(org.opendaylight.yang.gen.v1.urn
-                        .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection.class,
+                        .onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.Connection.class,
                     new org.opendaylight.yang.gen.v1.urn
-                        .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectionKey(
+                        .onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectionKey(
                             connectionUuid))
                 .build();
         try {
@@ -278,6 +306,66 @@ public class TapiRendererListenerImpl implements TransportpceRendererListener {
         }
     }
 
+    private void sendNbiNotification(PublishTapiNotificationService service) {
+        try {
+            this.notificationPublishService.putNotification(service);
+        } catch (InterruptedException e) {
+            LOG.warn("Cannot send notification to nbi", e);
+            Thread.currentThread().interrupt();
+        }
+    }
+
+    private PublishTapiNotificationService createNbiNotification(ConnectivityService connService) {
+        if (connService == null) {
+            LOG.error("ConnService is null");
+            return null;
+        }
+        /*
+        Map<ChangedAttributesKey, ChangedAttributes> changedStates = changedAttributesMap.entrySet()
+                .stream()
+                .filter(e -> e.getKey().getValueName().equals("administrative")
+                        || e.getKey().getValueName().equals("operational"))
+                .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue()));
+
+         */
+        Map<ChangedAttributesKey, ChangedAttributes> changedStates = new HashMap<>();
+        changedStates.put(new ChangedAttributesKey("administrativeState"),
+            new ChangedAttributesBuilder()
+                .setNewValue(connService.getAdministrativeState().getName())
+                .setOldValue(AdministrativeState.LOCKED.getName())
+                .setValueName("administrativeState").build());
+        changedStates.put(new ChangedAttributesKey("operationalState"),
+            new ChangedAttributesBuilder()
+                .setNewValue(connService.getOperationalState().getName())
+                .setOldValue(OperationalState.DISABLED.getName())
+                .setValueName("operationalState").build());
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssxxx");
+        OffsetDateTime offsetDateTime = OffsetDateTime.now(ZoneOffset.UTC);
+        DateAndTime datetime = new DateAndTime(dtf.format(offsetDateTime));
+        Map<TargetObjectNameKey, TargetObjectName> targetObjectNames = new HashMap<>();
+        if (connService.getName() != null) {
+            for (Map.Entry<NameKey, Name> entry : connService.getName().entrySet()) {
+                targetObjectNames.put(new TargetObjectNameKey(entry.getKey().getValueName()),
+                    new TargetObjectNameBuilder()
+                        .setValueName(entry.getValue().getValueName())
+                        .setValue(entry.getValue().getValue())
+                        .build());
+            }
+        }
+
+        return new PublishTapiNotificationServiceBuilder()
+            .setUuid(new Uuid(UUID.randomUUID().toString()))
+            .setTopic(connService.getUuid().getValue())
+            .setTargetObjectIdentifier(connService.getUuid())
+            .setNotificationType(NOTIFICATIONTYPEATTRIBUTEVALUECHANGE.VALUE)
+            .setChangedAttributes(changedStates)
+            .setEventTimeStamp(datetime)
+            .setTargetObjectName(targetObjectNames)
+            .setTargetObjectType(CONNECTIVITYOBJECTTYPECONNECTIVITYSERVICE.VALUE)
+            .setLayerProtocolName(connService.getLayerProtocolName())
+            .build();
+    }
+
     public void setServiceUuid(Uuid serviceUuid) {
         this.serviceUuid = serviceUuid;
     }
similarity index 61%
rename from tapi/src/main/java/org/opendaylight/transportpce/tapi/listeners/TapiServiceHandlerListenerImpl.java
rename to tapi/src/main/java/org/opendaylight/transportpce/tapi/listeners/TapiServiceNotificationHandler.java
index 03ad2e5e397630f1f8a30d9557c4d4e77b862ff6..b1930d8726d13e2da6982a9092cec7e811080ae6 100644 (file)
@@ -7,24 +7,28 @@
  */
 package org.opendaylight.transportpce.tapi.listeners;
 
+import java.util.Set;
 import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.NotificationService.CompositeListener;
 import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.ServiceRpcResultSh;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.servicehandler.rev201125.TransportpceServicehandlerListener;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class TapiServiceHandlerListenerImpl implements TransportpceServicehandlerListener {
+public class TapiServiceNotificationHandler {
 
-    private static final Logger LOG = LoggerFactory.getLogger(TapiServiceHandlerListenerImpl.class);
+    private static final Logger LOG = LoggerFactory.getLogger(TapiServiceNotificationHandler.class);
     private final DataBroker dataBroker;
 
-    public TapiServiceHandlerListenerImpl(DataBroker dataBroker) {
+    public TapiServiceNotificationHandler(DataBroker dataBroker) {
         this.dataBroker = dataBroker;
+    }
 
+    public CompositeListener getCompositeListener() {
+        return new CompositeListener(Set.of(
+            new CompositeListener.Component<>(ServiceRpcResultSh.class, this::onServiceRpcResultSh)));
     }
 
-    @Override
-    public void onServiceRpcResultSh(ServiceRpcResultSh notification) {
+    private void onServiceRpcResultSh(ServiceRpcResultSh notification) {
         LOG.info("Avoid dataBroker error {}", dataBroker.getClass().getCanonicalName());
     }
 }
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/ConvertORToTapiTopology.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/ConvertORToTapiTopology.java
new file mode 100644 (file)
index 0000000..7d188bb
--- /dev/null
@@ -0,0 +1,1358 @@
+/*
+ * Copyright © 2023 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.tapi.topology;
+
+import java.math.RoundingMode;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeMap;
+import java.util.UUID;
+import java.util.stream.Collectors;
+import org.opendaylight.transportpce.common.fixedflex.GridConstant;
+import org.opendaylight.transportpce.common.fixedflex.GridUtils;
+import org.opendaylight.transportpce.tapi.TapiStringConstants;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev230526.degree.used.wavelengths.UsedWavelengths;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.degree.rev230526.degree.used.wavelengths.UsedWavelengthsKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.PpAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.TxTtpAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.networks.network.node.termination.point.XpdrNetworkAttributes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.OduSwitchingPools;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.OduSwitchingPoolsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.Node1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev230526.xpdr.mode.attributes.supported.operational.modes.OperationalModeKey;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.CAPACITYUNITGBPS;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Direction;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LAYERPROTOCOLQUALIFIER;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.PortRole;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.capacity.pac.AvailableCapacityBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.capacity.pac.TotalPotentialCapacityBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.payload.structure.CapacityBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU0;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU2;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU2E;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU4;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODUCN;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.OTUTYPEOTUCN;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev221121.DIGITALSIGNALTYPE100GigE;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev221121.DIGITALSIGNALTYPE10GigELAN;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev221121.DIGITALSIGNALTYPEGigE;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTS;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTSi;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTSiMC;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.context.topology.context.topology.node.owned.node.edge.point.PhotonicMediaNodeEdgePointSpecBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.photonic.media.node.edge.point.spec.SpectrumCapabilityPacBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.AvailableSpectrum;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.AvailableSpectrumBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.AvailableSpectrumKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.OccupiedSpectrum;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.OccupiedSpectrumBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.OccupiedSpectrumKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.SupportableSpectrum;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.SupportableSpectrumBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.spectrum.capability.pac.SupportableSpectrumKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.FORWARDINGRULE;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.FORWARDINGRULECANNOTFORWARDACROSSGROUP;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.FORWARDINGRULEMAYFORWARDACROSSGROUP;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.RuleType;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.inter.rule.group.AssociatedNodeRuleGroup;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.inter.rule.group.AssociatedNodeRuleGroupBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.inter.rule.group.AssociatedNodeRuleGroupKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.InterRuleGroup;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.InterRuleGroupBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.InterRuleGroupKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroup;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.RiskParameterPacBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.AvailablePayloadStructure;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.AvailablePayloadStructureBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.MappedServiceInterfacePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.MappedServiceInterfacePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.MappedServiceInterfacePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstances;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstancesBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedPayloadStructure;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedPayloadStructureBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.Rule;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.RuleBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.RuleKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristic;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristicBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristic;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristicBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristic;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristicBuilder;
+import org.opendaylight.yangtools.yang.common.Decimal64;
+import org.opendaylight.yangtools.yang.common.Uint16;
+import org.opendaylight.yangtools.yang.common.Uint64;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class ConvertORToTapiTopology {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ConvertORToTapiTopology.class);
+    private static final TreeMap<Integer, String> OPMODE_LOOPRATE_MAP;
+    private static final int OPMODE_LOOPRATE_MAX;
+    private static final Map<String, Map<String, Map<LAYERPROTOCOLQUALIFIER, Uint64>>> LPN_MAP;
+    private String ietfNodeId;
+    private OpenroadmNodeType ietfNodeType;
+    private AdminStates ietfNodeAdminState;
+    private State ietfNodeOperState;
+    private List<TerminationPoint> oorClientPortList;
+    private List<TerminationPoint> oorNetworkPortList;
+    private OduSwitchingPools oorOduSwitchingPool;
+    private Uuid tapiTopoUuid;
+    private Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
+        tapiNodes;
+    private Map<LinkKey, Link> tapiLinks;
+    private Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSips;
+    private Map<String, Uuid> uuidMap;
+
+    static {
+        OPMODE_LOOPRATE_MAP = new TreeMap<>(Comparator.reverseOrder());
+        OPMODE_LOOPRATE_MAP.putAll(Map.of(8, "800G", 6, "600G" , 4, "400G" , 3, "300G" , 2, "200G" , 1, "100G"));
+        OPMODE_LOOPRATE_MAX = Collections.max(OPMODE_LOOPRATE_MAP.keySet());
+        LPN_MAP = new HashMap<>(Map.of(
+            "ETH", new HashMap<>(Map.of(
+                "If1GEODU0", Map.of(
+                    ODUTYPEODU0.VALUE, Uint64.valueOf(0), DIGITALSIGNALTYPEGigE.VALUE, Uint64.valueOf(0)),
+                "If10GEODU2e", Map.of(
+                    ODUTYPEODU2E.VALUE, Uint64.valueOf(0), DIGITALSIGNALTYPE10GigELAN.VALUE, Uint64.valueOf(0)),
+                "If10GEODU2", Map.of(
+                    ODUTYPEODU2.VALUE, Uint64.valueOf(0), DIGITALSIGNALTYPE10GigELAN.VALUE, Uint64.valueOf(0)),
+                "If10GE", Map.of(DIGITALSIGNALTYPE10GigELAN.VALUE, Uint64.valueOf(0)),
+                "If100GEODU4", Map.of(
+                    ODUTYPEODU4.VALUE, Uint64.valueOf(0), DIGITALSIGNALTYPE100GigE.VALUE, Uint64.valueOf(0)),
+                "If100GE", Map.of(DIGITALSIGNALTYPE100GigE.VALUE, Uint64.valueOf(0)),
+                "IfOCH", Map.of(ODUTYPEODU4.VALUE, Uint64.valueOf(0)))),
+            "ODU", new HashMap<>(Map.of(
+                "If1GEODU0", Map.of(ODUTYPEODU0.VALUE, Uint64.valueOf(0)),
+                "If10GEODU2e", Map.of(ODUTYPEODU2E.VALUE, Uint64.valueOf(0)),
+                "If10GEODU2", Map.of(ODUTYPEODU2.VALUE, Uint64.valueOf(0)),
+                "If100GEODU4", Map.of(ODUTYPEODU4.VALUE, Uint64.valueOf(0)))),
+            "PHOTONIC_MEDIA", new HashMap<>(Map.of(
+                "IfOCHOTUCnODUCn",
+                    Map.of(ODUTYPEODUCN.VALUE, Uint64.valueOf(1), OTUTYPEOTUCN.VALUE, Uint64.valueOf(1)),
+                "IfOCH",
+                    Map.of(ODUTYPEODUCN.VALUE, Uint64.valueOf(1), OTUTYPEOTUCN.VALUE, Uint64.valueOf(1),
+                        PHOTONICLAYERQUALIFIEROTSiMC.VALUE, Uint64.valueOf(1),
+                        PHOTONICLAYERQUALIFIEROTS.VALUE, Uint64.valueOf(1))))));
+        LPN_MAP.get("ETH").put("IfOCHOTU4ODU4", LPN_MAP.get("ETH").get("IfOCH"));
+        LPN_MAP.put("DSR", LPN_MAP.get("ETH"));
+        LPN_MAP.get("ODU").put("If10GE", LPN_MAP.get("ODU").get("If10GEODU2"));
+        LPN_MAP.get("ODU").put("If100GE", LPN_MAP.get("ODU").get("If100GEODU4"));
+        LPN_MAP.get("ODU").put("IfOCHOTU4ODU4", LPN_MAP.get("ODU").get("If100GEODU4"));
+        LPN_MAP.get("ODU").put("IfOCH", LPN_MAP.get("ODU").get("If100GEODU4"));
+        LPN_MAP.get("PHOTONIC_MEDIA").put("IfOtsiOtucnOducn", LPN_MAP.get("PHOTONIC_MEDIA").get("IfOCHOTUCnODUCn"));
+        LPN_MAP.get("PHOTONIC_MEDIA").put("IfOCHOTUCnODUCnRegen", LPN_MAP.get("PHOTONIC_MEDIA").get("IfOCHOTUCnODUCn"));
+        LPN_MAP
+            .get("PHOTONIC_MEDIA").put("IfOCHOTUCnODUCnUniregen", LPN_MAP.get("PHOTONIC_MEDIA").get("IfOCHOTUCnODUCn"));
+        LPN_MAP.get("PHOTONIC_MEDIA").put("IfOCHOTU4ODU4", LPN_MAP.get("PHOTONIC_MEDIA").get("IfOCH"));
+        LPN_MAP.get("PHOTONIC_MEDIA").put("IfOCHOTU4ODU4Regen", LPN_MAP.get("PHOTONIC_MEDIA").get("IfOCH"));
+        LPN_MAP.get("PHOTONIC_MEDIA").put("IfOCHOTU4ODU4Uniregen", LPN_MAP.get("PHOTONIC_MEDIA").get("IfOCH"));
+    }
+
+
+    public ConvertORToTapiTopology(Uuid tapiTopoUuid) {
+        this.tapiTopoUuid = tapiTopoUuid;
+        this.tapiNodes = new HashMap<>();
+        this.tapiLinks = new HashMap<>();
+        this.uuidMap = new HashMap<>();
+        this.tapiSips = new HashMap<>();
+    }
+
+    public void convertNode(Node ietfNode, List<String> networkPorts) {
+        this.ietfNodeId = ietfNode.getNodeId().getValue();
+        var ietfAug =
+            ietfNode.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class);
+        if (ietfAug == null) {
+            return;
+        }
+        this.ietfNodeType = ietfAug.getNodeType();
+        this.ietfNodeAdminState = ietfAug.getAdministrativeState();
+        this.ietfNodeOperState = ietfAug.getOperationalState();
+        var ietfAugTopo =
+            ietfNode.augmentation(
+                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class);
+        this.oorNetworkPortList = ietfAugTopo.getTerminationPoint().values().stream()
+            .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
+                    == OpenroadmTpType.XPONDERNETWORK.getIntValue()
+                && networkPorts.contains(tp.getTpId().getValue()))
+            .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
+            .collect(Collectors.toList());
+        if (this.ietfNodeType.equals(OpenroadmNodeType.TPDR)) {
+            this.oorOduSwitchingPool = createOduSwitchingPoolForTp100G();
+            List<TpId> tpList = this.oorOduSwitchingPool.getNonBlockingList().values().stream()
+                .flatMap(nbl -> nbl.getTpList().stream())
+                .collect(Collectors.toList());
+            this.oorClientPortList = ietfAugTopo.getTerminationPoint().values().stream()
+                .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
+                        == OpenroadmTpType.XPONDERCLIENT.getIntValue()
+                    && tpList.contains(tp.getTpId()))
+                .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
+                .collect(Collectors.toList());
+            this.oorClientPortList.forEach(tp -> LOG.info("tp = {}", tp.getTpId()));
+        } else {
+            this.oorOduSwitchingPool = ietfNode.augmentation(Node1.class).getSwitchingPools().getOduSwitchingPools()
+                .values().stream().findFirst().orElseThrow();
+            this.oorClientPortList = ietfAugTopo.getTerminationPoint().values().stream()
+                .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
+                    == OpenroadmTpType.XPONDERCLIENT.getIntValue())
+                .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
+                .collect(Collectors.toList());
+        }
+
+        // node creation [DSR/ODU] ([DSR/ODU] and OTSI merged in R 2.4.X)
+        LOG.info("creation of a DSR/ODU node for {}", this.ietfNodeId);
+        String nodeIdXpdr = String.join("+", this.ietfNodeId, TapiStringConstants.XPDR);
+        this.uuidMap.put(nodeIdXpdr,
+                //nodeUuid
+                new Uuid(UUID.nameUUIDFromBytes(nodeIdXpdr.getBytes(Charset.forName("UTF-8"))).toString()));
+        Name nameDsr = new NameBuilder().setValueName("dsr/odu node name").setValue(nodeIdXpdr).build();
+        Name namePhot = new NameBuilder().setValueName("otsi node name").setValue(nodeIdXpdr).build();
+        Name nameNodeType = new NameBuilder().setValueName("Node Type").setValue(this.ietfNodeType.getName()).build();
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node dsrNode =
+            createTapiNode(
+                Map.of(nameDsr.key(), nameDsr, namePhot.key(), namePhot, nameNodeType.key(), nameNodeType),
+                //dsrLayerProtocols
+                Set.of(LayerProtocolName.DSR, LayerProtocolName.ODU,
+                       LayerProtocolName.DIGITALOTN, LayerProtocolName.PHOTONICMEDIA));
+        LOG.debug("XPDR Node {} should have {} NEPs and SIPs",
+            this.ietfNodeId, this.oorClientPortList.size() + this.oorNetworkPortList.size());
+        LOG.info("XPDR Node {} has {} NEPs and {} SIPs",
+            this.ietfNodeId,
+            dsrNode.getOwnedNodeEdgePoint().values().size(),
+            dsrNode.getOwnedNodeEdgePoint().values().stream()
+                .filter(nep -> nep.getMappedServiceInterfacePoint() != null).count());
+        tapiNodes.put(dsrNode.key(), dsrNode);
+    }
+
+    public Map<NodeRuleGroupKey, NodeRuleGroup> createNodeRuleGroupForRdmNode(String topoType, Uuid nodeUuid,
+            String subNodeName, List<OwnedNodeEdgePointKey> onepl, FORWARDINGRULE forwardingRule, int index) {
+        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointKey,
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint>
+                nepMap = new HashMap<>();
+        for (OwnedNodeEdgePointKey onepKey : onepl) {
+            var nep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
+                    .node.rule.group.NodeEdgePointBuilder()
+                .setTopologyUuid(tapiTopoUuid)
+                .setNodeUuid(nodeUuid)
+                .setNodeEdgePointUuid(onepKey.getUuid())
+                .build();
+            nepMap.put(nep.key(), nep);
+        }
+        String nrgNameValue = String.join("-", subNodeName, "node-rule-group-" + index);
+        Rule rule = new RuleBuilder()
+            .setLocalId("forward")
+            .setForwardingRule(forwardingRule)
+            .setRuleType(new HashSet<RuleType>(Set.of(RuleType.FORWARDING)))
+            .build();
+        Name nrgName = new NameBuilder().setValueName("nrg name").setValue(nrgNameValue).build();
+        NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
+            .setName(Map.of(nrgName.key(), nrgName))
+            .setUuid(new Uuid(UUID.nameUUIDFromBytes((nrgNameValue).getBytes(Charset.forName("UTF-8"))).toString()))
+            .setRule(new HashMap<RuleKey, Rule>(Map.of(rule.key(), rule)))
+            .setNodeEdgePoint(nepMap)
+            .build();
+        return new HashMap<>(Map.of(nodeRuleGroup.key(), nodeRuleGroup));
+    }
+
+    public Map<NodeRuleGroupKey, NodeRuleGroup> createAllNodeRuleGroupForRdmNode(
+            String topoType, Uuid nodeUuid, String orNodeId, Collection<OwnedNodeEdgePoint> onepl) {
+        List<OwnedNodeEdgePoint> otsNepList = topoType.equals("T0ML") ? onepl.stream().collect(Collectors.toList())
+                : onepl.stream()
+                    .filter(onep -> onep.getName().keySet().contains(new NameKey("PHOTONIC_MEDIA_OTSNodeEdgePoint")))
+                    .collect(Collectors.toList());
+        LOG.info("Creating NRG for {} {}", topoType, otsNepList);
+        List<OwnedNodeEdgePointKey> degOnepKeyList = new ArrayList<>();
+        List<String> srgNames = new ArrayList<>();
+        Map<OwnedNodeEdgePointKey,String> srgMap = new HashMap<>();
+        for (OwnedNodeEdgePoint onep : otsNepList) {
+            String onepName = onep.getName()
+                .get(new NameKey(topoType.equals("T0ML") ? "NodeEdgePoint name" : "PHOTONIC_MEDIA_OTSNodeEdgePoint"))
+                .getValue();
+            String subNodeName = topoType.equals("T0ML") ? "ROADMINFRA-SRG-PP"
+                : String.join("-", onepName.split("\\+")[0], onepName.split("\\+")[2]);
+            if (subNodeName.contains("DEG")) {
+                subNodeName = subNodeName.split("\\-TTP")[0];
+                degOnepKeyList.add(onep.key());
+            } else if (subNodeName.contains("SRG")) {
+                subNodeName = subNodeName.split("\\-PP")[0];
+                srgMap.put(onep.key(), subNodeName);
+                if (!srgNames.contains(subNodeName)) {
+                    srgNames.add(subNodeName);
+                }
+            }
+        }
+        int index = 0;
+        Map<NodeRuleGroupKey, NodeRuleGroup> globalNrgMap = new  HashMap<>();
+        if (topoType.equals("Full")) {
+            globalNrgMap.putAll(createNodeRuleGroupForRdmNode(
+                    topoType, nodeUuid, String.join("-", orNodeId, "DEG"),
+                    degOnepKeyList, FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE, index));
+            index++;
+        }
+        for (String srgName : srgNames) {
+            globalNrgMap.putAll(createNodeRuleGroupForRdmNode(
+                topoType,
+                nodeUuid,
+                srgName,
+                srgMap.entrySet().stream()
+                    .filter(item -> item.getValue().equals(srgName))
+                    .map(item -> item.getKey())
+                    .collect(Collectors.toList()),
+                // For T0ML we consider any port of ROADM INFRA can connect to potentially any other port
+                //topoType.equals("T0ML") ? FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE
+                topoType.equals("T0ML") ? FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE
+                    : FORWARDINGRULECANNOTFORWARDACROSSGROUP.VALUE,
+                // Whereas for Abstracted or Full Topology we consider any port of the same SRG can not forward to
+                // another port of the same SRG. Connectivity between SRGS will be defined through inter-rule-group
+                index));
+            index++;
+            LOG.debug("AllNodeRuleGroup : creating a NRG for {}", srgName);
+        }
+        return globalNrgMap;
+    }
+
+    public Map<InterRuleGroupKey, InterRuleGroup> createInterRuleGroupForRdmNode(
+            String topoType, Uuid nodeUuid,String orNodeId, List<NodeRuleGroupKey> nrgList) {
+        Map<AssociatedNodeRuleGroupKey, AssociatedNodeRuleGroup> associatedNrgMap = new HashMap<>();
+        for (NodeRuleGroupKey nrgKey : nrgList) {
+            AssociatedNodeRuleGroup associatedNrg = new AssociatedNodeRuleGroupBuilder()
+                .setTopologyUuid(tapiTopoUuid)
+                .setNodeUuid(nodeUuid)
+                .setNodeRuleGroupUuid(nrgKey.getUuid())
+                .build();
+            associatedNrgMap.put(associatedNrg.key(), associatedNrg);
+        }
+        var rule = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
+                .inter.rule.group.RuleBuilder()
+            .setLocalId("forward")
+            .setForwardingRule(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE)
+            .setRuleType(new HashSet<RuleType>(Set.of(RuleType.FORWARDING)))
+            .build();
+        String irgNameValue = topoType.equals("Full") ? orNodeId + " inter rule group-" : "rdm infra inter rule group-";
+        Name irgName = new NameBuilder().setValueName("irg name").setValue(irgNameValue).build();
+        InterRuleGroup interRuleGroup = new InterRuleGroupBuilder()
+            .setUuid(new Uuid(UUID.nameUUIDFromBytes((irgNameValue).getBytes(Charset.forName("UTF-8"))).toString()))
+            .setName(Map.of(irgName.key(), irgName))
+            .setRule(new HashMap<>(Map.of(rule.key(), rule)))
+            .setAssociatedNodeRuleGroup(associatedNrgMap)
+            .build();
+        return new HashMap<>(Map.of(new InterRuleGroupKey(interRuleGroup.getUuid()), interRuleGroup));
+    }
+
+    public Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint> createMSIP(
+            int nb, LayerProtocolName layerProtocol, String tpId, String nodeid,
+            Collection<SupportedInterfaceCapability> supportedInterfaceCapability,
+            OperationalState operState, AdministrativeState adminState) {
+        // add them to SIP context
+        Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint> msipl = new HashMap<>();
+        for (int i = 0; i < nb; i++) {
+            String sipName = nb == 1 ? String.join("+", "SIP", nodeid, tpId)
+                    : String.join("+", "SIP", nodeid, tpId, "Nber", String.valueOf(i));
+            LOG.info("SIP = {}", sipName);
+            Uuid sipUuid = new Uuid(UUID.nameUUIDFromBytes(sipName.getBytes(Charset.forName("UTF-8"))).toString());
+            MappedServiceInterfacePoint msip =
+                new MappedServiceInterfacePointBuilder().setServiceInterfacePointUuid(sipUuid).build();
+            ServiceInterfacePoint sip =
+                createSIP(sipUuid, layerProtocol, tpId, nodeid, supportedInterfaceCapability, operState, adminState);
+            this.tapiSips.put(sip.key(), sip);
+            msipl.put(msip.key(), msip);
+            LOG.debug("SIP created {}", sip.getUuid());
+            LOG.debug("This SIP corresponds to SIP+nodeId {} + TpId {}", nodeid, tpId);
+        }
+        return msipl;
+    }
+
+    public List<AvailablePayloadStructure> createAvailablePayloadStructureForPhtncMedia(
+            Boolean otsiProvisioned,
+            Collection<SupportedInterfaceCapability> sicList,
+            List<OperationalModeKey> supportedOpModes) {
+        if (supportedOpModes == null || supportedOpModes.isEmpty()) {
+            return null;
+        }
+        Integer nepRate = 0;
+        Integer loopRate = 0;
+        for (OperationalModeKey operationalMode : supportedOpModes) {
+            for (Map.Entry<Integer, String> entry: OPMODE_LOOPRATE_MAP.entrySet()) {
+                if (operationalMode.toString().contains(entry.getValue())) {
+                    loopRate = entry.getKey();
+                    break;
+                }
+            }
+            if (loopRate > nepRate) {
+                nepRate = loopRate;
+                if (nepRate >= OPMODE_LOOPRATE_MAX) {
+                    break;
+                }
+            }
+        }
+        List<AvailablePayloadStructure> aps = new ArrayList<>();
+        Integer cepInstanceNber = otsiProvisioned ? 0 : 1;
+        for (SupportedInterfaceCapability sic : sicList) {
+            switch (sic.getIfCapType().toString().split("\\{")[0]) {
+                case "IfOCHOTU4ODU4":
+                case "IfOCHOTU4ODU4Regen":
+                case "IfOCHOTU4ODU4Uniregen":
+                    aps.add(new AvailablePayloadStructureBuilder()
+                        .setMultiplexingSequence(Set.of(PHOTONICLAYERQUALIFIEROTSi.VALUE, ODUTYPEODU4.VALUE))
+                        .setNumberOfCepInstances(Uint64.valueOf(cepInstanceNber))
+                        .setCapacity(
+                            new CapacityBuilder()
+                                .setUnit(CAPACITYUNITGBPS.VALUE)
+                                .setValue(Decimal64.valueOf(100.0 * cepInstanceNber, RoundingMode.DOWN))
+                                .build())
+                        .build());
+                    break;
+                case "IfOCHOTUCnODUCn":
+                case "IfOtsiOtucnOducn":
+                case "IfOCHOTUCnODUCnRegen":
+                case "IfOCHOTUCnODUCnUniregen":
+                    aps.add(new AvailablePayloadStructureBuilder()
+                        .setMultiplexingSequence(Set.of(PHOTONICLAYERQUALIFIEROTSi.VALUE, OTUTYPEOTUCN.VALUE,
+                            ODUTYPEODUCN.VALUE, ODUTYPEODU4.VALUE))
+                        .setNumberOfCepInstances(Uint64.valueOf(nepRate * cepInstanceNber))
+                        .setCapacity(
+                            new CapacityBuilder()
+                                .setUnit(CAPACITYUNITGBPS.VALUE)
+                                .setValue(Decimal64.valueOf(nepRate * 100.0 * cepInstanceNber, RoundingMode.DOWN))
+                                .build())
+                        .build());
+                    break;
+                default:
+                    break;
+            }
+        }
+        return aps.stream().distinct().toList();
+    }
+
+    public List<SupportedPayloadStructure> createSupportedPayloadStructureForPhtncMedia(
+            Collection<SupportedInterfaceCapability> sicList, List<OperationalModeKey> supportedOpModes) {
+        if (supportedOpModes == null || supportedOpModes.isEmpty()) {
+            return null;
+        }
+        Integer nepRate = 0;
+        Integer loopRate = 0;
+        for (OperationalModeKey operationalMode : supportedOpModes) {
+            for (Map.Entry<Integer, String> entry: OPMODE_LOOPRATE_MAP.entrySet()) {
+                if (operationalMode.toString().contains(entry.getValue())) {
+                    loopRate = entry.getKey();
+                    break;
+                }
+            }
+            if (loopRate > nepRate) {
+                nepRate = loopRate;
+                if (nepRate >= OPMODE_LOOPRATE_MAX) {
+                    break;
+                }
+            }
+        }
+        List<SupportedPayloadStructure> sps = new ArrayList<>();
+        for (SupportedInterfaceCapability sic : sicList) {
+            String ifCapType = sic.getIfCapType().toString().split("\\{")[0];
+            switch (ifCapType) {
+                case "IfOCHOTU4ODU4":
+                case "IfOCHOTU4ODU4Regen":
+                case "IfOCHOTU4ODU4Uniregen":
+                    sps.add(new SupportedPayloadStructureBuilder()
+                        .setMultiplexingSequence(Set.of(PHOTONICLAYERQUALIFIEROTSi.VALUE, ODUTYPEODU4.VALUE))
+                        .setNumberOfCepInstances(Uint64.valueOf(1))
+                        .setCapacity(
+                            new CapacityBuilder()
+                                .setUnit(CAPACITYUNITGBPS.VALUE)
+                                .setValue(Decimal64.valueOf(100.0, RoundingMode.DOWN))
+                                .build())
+                        .build());
+                    break;
+                case "IfOCHOTUCnODUCn":
+                case "IfOtsiOtucnOducn":
+                case "IfOCHOTUCnODUCnRegen":
+                case "IfOCHOTUCnODUCnUniregen":
+                    sps.add(new SupportedPayloadStructureBuilder()
+                        .setMultiplexingSequence(Set.of(
+                            PHOTONICLAYERQUALIFIEROTSi.VALUE, OTUTYPEOTUCN.VALUE,
+                            ODUTYPEODUCN.VALUE, ODUTYPEODU4.VALUE))
+                        .setNumberOfCepInstances(Uint64.valueOf(nepRate))
+                        .setCapacity(
+                            new CapacityBuilder()
+                                .setUnit(CAPACITYUNITGBPS.VALUE)
+                                .setValue(Decimal64.valueOf(nepRate * 100.0, RoundingMode.DOWN))
+                                .build())
+                        .build());
+                    break;
+                default:
+                    break;
+            }
+        }
+        return sps.stream().distinct().toList();
+    }
+
+    public List<SupportedCepLayerProtocolQualifierInstances> createSupportedCepLayerProtocolQualifier(
+            Collection<SupportedInterfaceCapability> sicList, LayerProtocolName lpn) {
+        if (sicList == null) {
+            return new ArrayList<>(List.of(
+                new SupportedCepLayerProtocolQualifierInstancesBuilder()
+                    .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
+                    .setNumberOfCepInstances(Uint64.valueOf(1))
+                    .build()));
+        }
+        LOG.debug("SIC list = {}", sicList);
+        List<SupportedCepLayerProtocolQualifierInstances> sclpqiList = new ArrayList<>();
+        String lpnName = lpn.getName();
+        for (SupportedInterfaceCapability sic : sicList) {
+            String ifCapType = sic.getIfCapType().toString().split("\\{")[0];
+            if (!LPN_MAP.containsKey(lpnName)) {
+                LOG.error("Layer Protocol Name is unknown {}", lpnName);
+                break;
+            }
+            var ifCapTypeMap = LPN_MAP.get(lpnName);
+            if (!ifCapTypeMap.containsKey(ifCapType)) {
+                LOG.error("IfCapability type {} not managed", ifCapType);
+                break;
+            }
+            for (LAYERPROTOCOLQUALIFIER qualifier: ifCapTypeMap.get(ifCapType).keySet()) {
+                sclpqiList.add(new SupportedCepLayerProtocolQualifierInstancesBuilder()
+                    .setLayerProtocolQualifier(qualifier)
+                    .setNumberOfCepInstances(Uint64.valueOf(1))
+                    .build());
+            }
+        }
+        return sclpqiList.stream().distinct().toList();
+    }
+
+    public Map<Double, Double> getXpdrUsedWavelength(TerminationPoint tp) {
+        var tpAug = tp.augmentation(
+            org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1.class);
+        if (tpAug == null) {
+            return null;
+        }
+        XpdrNetworkAttributes xnatt = tpAug.getXpdrNetworkAttributes();
+        if (xnatt == null) {
+            return null;
+        }
+        var xnattWvlgth = xnatt.getWavelength();
+        if (xnattWvlgth == null) {
+            return null;
+        }
+        var freq = xnattWvlgth.getFrequency();
+        if (freq == null) {
+            return null;
+        }
+        var width = xnattWvlgth.getWidth();
+        if (width == null) {
+            return null;
+        }
+        Double freqValue = freq.getValue().doubleValue();
+        Double widthValue = width.getValue().doubleValue();
+        return new HashMap<>(Map.of(freqValue - widthValue * 0.001 / 2, freqValue + widthValue * 0.001 / 2));
+    }
+
+    public Map<Double, Double> getPPUsedWavelength(TerminationPoint tp) {
+        var tpAug = tp.augmentation(
+            org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1.class);
+        if (tpAug == null) {
+            return null;
+        }
+        PpAttributes ppAtt = tpAug.getPpAttributes();
+        if (ppAtt == null) {
+            return null;
+        }
+        var usedWvl = ppAtt.getUsedWavelength();
+        if (usedWvl == null || usedWvl.isEmpty()) {
+            return null;
+        }
+        var usedWvlfirstValue = usedWvl.entrySet().iterator().next().getValue();
+        Double centFreq = usedWvlfirstValue.getFrequency().getValue().doubleValue();
+        Double width = usedWvlfirstValue.getWidth().getValue().doubleValue();
+        return  new HashMap<>(Map.of(centFreq - width * 0.001 / 2, centFreq + width * 0.001 / 2));
+    }
+
+    public Map<Double, Double> getTTPUsedFreqMap(TerminationPoint tp) {
+        byte[] byteArray = new byte[GridConstant.NB_OCTECTS];
+        Arrays.fill(byteArray, (byte) GridConstant.AVAILABLE_SLOT_VALUE);
+        var termPoint1 = tp.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526
+            .TerminationPoint1.class);
+        if (termPoint1 == null) {
+            return null;
+        }
+        TxTtpAttributes txttpAtt = termPoint1.getTxTtpAttributes();
+        if (txttpAtt  == null) {
+            return null;
+        }
+        var txttpAttUsedWvl = txttpAtt.getUsedWavelengths();
+        if (txttpAttUsedWvl == null || txttpAttUsedWvl.isEmpty()) {
+            var txttpAttAvlFreqMaps = txttpAtt.getAvailFreqMaps();
+            if (txttpAttAvlFreqMaps == null || !txttpAttAvlFreqMaps.keySet().toString().contains(GridConstant.C_BAND)) {
+                return null;
+            }
+            byte[] freqBitSet = new byte[GridConstant.NB_OCTECTS];
+            LOG.debug("Creation of Bitset {}", freqBitSet);
+            freqBitSet = txttpAttAvlFreqMaps.entrySet().stream()
+                .filter(afm -> afm.getKey().toString().equals(GridConstant.C_BAND))
+                .findFirst().orElseThrow().getValue().getFreqMap();
+            for (int i = 0; i < GridConstant.EFFECTIVE_BITS; i++) {
+                if (freqBitSet[i] == 0) {
+                    freqBitSet[i] = 1;
+                } else {
+                    freqBitSet[i] = 0;
+                }
+            }
+            return getFreqMapFromBitSet(freqBitSet);
+        }
+        Map<Double,Double> freqMap = new HashMap<>();
+        for (Map.Entry<UsedWavelengthsKey, UsedWavelengths> usedLambdas : txttpAttUsedWvl.entrySet()) {
+            Double centFreq = usedLambdas.getValue().getFrequency().getValue().doubleValue();
+            Double width = usedLambdas.getValue().getWidth().getValue().doubleValue();
+            freqMap.put(centFreq - width * 0.001 / 2, centFreq + width * 0.001 / 2);
+        }
+        return freqMap;
+    }
+
+    public Map<Double, Double> getTTPAvailableFreqMap(TerminationPoint tp) {
+        var termPoint1 = tp.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526
+            .TerminationPoint1.class);
+        if (termPoint1 == null) {
+            return null;
+        }
+        TxTtpAttributes txttpAtt = termPoint1.getTxTtpAttributes();
+        if (txttpAtt == null) {
+            return null;
+        }
+        var avlFreqMaps = txttpAtt.getAvailFreqMaps();
+        if (avlFreqMaps == null || !avlFreqMaps.keySet().toString().contains(GridConstant.C_BAND)) {
+            return null;
+        }
+        byte[] byteArray = new byte[GridConstant.NB_OCTECTS];
+        LOG.debug("Creation of Bitset {}", byteArray);
+        return getFreqMapFromBitSet(
+            avlFreqMaps.entrySet().stream()
+                .filter(afm -> afm.getKey().toString().equals(GridConstant.C_BAND))
+                .findFirst().orElseThrow().getValue().getFreqMap());
+    }
+
+    public Map<Double, Double> getTTP11AvailableFreqMap(
+            org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1 tp) {
+        if (tp == null) {
+            return null;
+        }
+        TxTtpAttributes txttpAtt = tp.getTxTtpAttributes();
+        if (txttpAtt == null) {
+            return null;
+        }
+        var avlFreqMaps = txttpAtt.getAvailFreqMaps();
+        if (avlFreqMaps == null || !avlFreqMaps.keySet().toString().contains(GridConstant.C_BAND)) {
+            return null;
+        }
+        byte[] byteArray = new byte[GridConstant.NB_OCTECTS];
+        LOG.debug("Creation of Bitset {}", byteArray);
+        return getFreqMapFromBitSet(
+            avlFreqMaps.entrySet().stream()
+                .filter(afm -> afm.getKey().toString().equals(GridConstant.C_BAND))
+                .findFirst().orElseThrow().getValue().getFreqMap());
+    }
+
+    public Map<Double, Double> getPP11UsedWavelength(
+            org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1 tp) {
+        if (tp == null) {
+            return null;
+        }
+        PpAttributes ppAtt = tp.getPpAttributes();
+        if (ppAtt == null) {
+            return null;
+        }
+        var usedWvl = ppAtt.getUsedWavelength();
+        if (usedWvl == null || usedWvl.isEmpty()) {
+            return null;
+        }
+        var usedWvlFirstValue = usedWvl.entrySet().iterator().next().getValue();
+        Double centFreq = usedWvlFirstValue.getFrequency().getValue().doubleValue();
+        Double width = usedWvlFirstValue.getWidth().getValue().doubleValue();
+        return new HashMap<>(Map.of(centFreq - width * 0.001 / 2, centFreq + width * 0.001 / 2));
+    }
+
+    public Map<Double, Double> getTTP11UsedFreqMap(
+            org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1 tp) {
+        byte[] byteArray = new byte[GridConstant.NB_OCTECTS];
+        Arrays.fill(byteArray, (byte) GridConstant.AVAILABLE_SLOT_VALUE);
+        if (tp == null) {
+            return null;
+        }
+        TxTtpAttributes txttpAtt = tp.getTxTtpAttributes();
+        if (txttpAtt == null) {
+            return null;
+        }
+        var txttpAttUsedWvl = txttpAtt.getUsedWavelengths();
+        if (txttpAttUsedWvl == null || txttpAttUsedWvl.isEmpty()) {
+            var txttpAttAvlFreqMaps = txttpAtt.getAvailFreqMaps();
+            if (txttpAttAvlFreqMaps == null || !txttpAttAvlFreqMaps.keySet().toString().contains(GridConstant.C_BAND)) {
+                return null;
+            }
+            byte[] freqBitSet = new byte[GridConstant.NB_OCTECTS];
+            LOG.debug("Creation of Bitset {}", freqBitSet);
+            freqBitSet = txttpAttAvlFreqMaps.entrySet().stream()
+                .filter(afm -> afm.getKey().toString().equals(GridConstant.C_BAND))
+                .findFirst().orElseThrow().getValue().getFreqMap();
+            for (int i = 0; i < GridConstant.EFFECTIVE_BITS; i++) {
+                if (freqBitSet[i] == 0) {
+                    freqBitSet[i] = 1;
+                } else {
+                    freqBitSet[i] = 0;
+                }
+            }
+            return getFreqMapFromBitSet(freqBitSet);
+        }
+        Map<Double,Double> freqMap = new HashMap<>();
+        for (Map.Entry<UsedWavelengthsKey, UsedWavelengths> usedLambdas : txttpAttUsedWvl.entrySet()) {
+            var usedLambdasValue = usedLambdas.getValue();
+            Double centFreq = usedLambdasValue.getFrequency().getValue().doubleValue();
+            Double width = usedLambdasValue.getWidth().getValue().doubleValue();
+            freqMap.put(centFreq - width * 0.001 / 2, centFreq + width * 0.001 / 2);
+        }
+        return freqMap;
+    }
+
+    public Map<Double, Double> getFreqMapFromBitSet(byte[] byteArray) {
+        // Provides a Map <LowerFreq, HigherFreq> describing start and stop frequencies of all slots that are available
+        // in the ByteArray describing the spectrum : bit sets initially sets to 1/true
+        // In case the byte array has been inverted before calling this method, it provides respectively a map
+        // describing all occupied slots!
+        Map<Double,Double> freqMap = new HashMap<>();
+        Double startFreq = GridConstant.START_EDGE_FREQUENCY;
+        Double stopFreq = 0.0;
+        boolean occupied = false;
+        if (byteArray[0] == 0) {
+            occupied = true;
+        }
+        for (int index = 0 ; index < GridConstant.EFFECTIVE_BITS ; index++) {
+            if (occupied) {
+                if (byteArray[index] == 1) {
+                    startFreq = GridUtils.getStartFrequencyFromIndex(index).doubleValue();
+                    stopFreq = GridUtils.getStartFrequencyFromIndex(index).doubleValue();
+                    occupied = false;
+                }
+            } else {
+                if (byteArray[index] == 0) {
+                    stopFreq = GridUtils.getStartFrequencyFromIndex(index).doubleValue();
+                    occupied = true;
+                }
+            }
+            if (occupied) {
+                if (stopFreq.doubleValue() > startFreq.doubleValue()) {
+                    freqMap.put(startFreq, stopFreq);
+                    startFreq = stopFreq;
+                }
+            } else {
+                if (index == GridConstant.EFFECTIVE_BITS - 1 && startFreq.doubleValue() == stopFreq.doubleValue()) {
+                    stopFreq = GridUtils.getStopFrequencyFromIndex(index).doubleValue();
+                    freqMap.put(startFreq, stopFreq);
+                }
+            }
+        }
+        return freqMap;
+    }
+
+    public OwnedNodeEdgePointBuilder addPayloadStructureAndPhotSpecToOnep(String nodeId,
+            Map<Double, Double> freqMap, List<OperationalModeKey> operModeList,
+            Collection<SupportedInterfaceCapability> sicColl, OwnedNodeEdgePointBuilder onepBldr, String keyword) {
+        if (!String.join("+", nodeId, TapiStringConstants.OTSI_MC).equals(keyword)
+                && !String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA_OTS).equals(keyword)) {
+            return onepBldr;
+        }
+        LOG.debug("Entering LOOP Step1");
+        double naz = 0.01;
+        Double lowSupFreq = GridConstant.START_EDGE_FREQUENCY * 1E09 ;
+        Double upSupFreq = lowSupFreq + GridConstant.GRANULARITY * GridConstant.EFFECTIVE_BITS * 1E06 + naz;
+        lowSupFreq += naz;
+        // Creating OTS & OTSI_MC NEP specific attributes
+        onepBldr.setSupportedPayloadStructure(
+            createSupportedPayloadStructureForPhtncMedia(sicColl,operModeList));
+        SpectrumCapabilityPacBuilder spectrumPac = new SpectrumCapabilityPacBuilder();
+        OccupiedSpectrumBuilder ospecBd = new OccupiedSpectrumBuilder();
+        if (freqMap == null || freqMap.isEmpty()) {
+//                TODO: verify if we need to fill OcupiedSpectrum as follows when no lambda provisioned
+//                ospecBd
+//                    .setUpperFrequency(Uint64.valueOf(0))
+//                    .setLowerFrequency(Uint64.valueOf(0));
+            onepBldr.setAvailablePayloadStructure(
+                createAvailablePayloadStructureForPhtncMedia(false, sicColl,operModeList));
+            AvailableSpectrum  aspec = new AvailableSpectrumBuilder()
+                .setLowerFrequency(Uint64.valueOf(Math.round(lowSupFreq)))
+                .setUpperFrequency(Uint64.valueOf(Math.round(upSupFreq)))
+                .build();
+            spectrumPac.setAvailableSpectrum(
+                new HashMap<AvailableSpectrumKey, AvailableSpectrum>(Map.of(
+                    new AvailableSpectrumKey(aspec.getLowerFrequency(), aspec.getUpperFrequency()), aspec)));
+        } else {
+            LOG.debug("Entering LOOP Step2");
+            onepBldr.setAvailablePayloadStructure(
+                createAvailablePayloadStructureForPhtncMedia(true, sicColl,operModeList));
+            for (Map.Entry<Double, Double> frequency : freqMap.entrySet()) {
+                ospecBd
+                    .setLowerFrequency(Uint64.valueOf(Math.round(frequency.getKey().doubleValue() * 1E09)))
+                    .setUpperFrequency(Uint64.valueOf(Math.round(frequency.getValue().doubleValue() * 1E09)));
+            }
+            OccupiedSpectrum ospec = ospecBd.build();
+            spectrumPac.setOccupiedSpectrum(
+                new HashMap<OccupiedSpectrumKey, OccupiedSpectrum>(Map.of(
+                    new OccupiedSpectrumKey(ospec.getLowerFrequency(), ospec.getUpperFrequency()), ospec)));
+        }
+        LOG.debug("Entering LOOP Step3");
+        SupportableSpectrum  sspec = new SupportableSpectrumBuilder()
+            .setLowerFrequency(Uint64.valueOf(Math.round(lowSupFreq)))
+            .setUpperFrequency(Uint64.valueOf(Math.round(upSupFreq)))
+            .build();
+        spectrumPac.setSupportableSpectrum(
+            new HashMap<SupportableSpectrumKey, SupportableSpectrum>(Map.of(
+                new SupportableSpectrumKey(sspec.getLowerFrequency(), sspec.getUpperFrequency()), sspec)));
+        LOG.debug("Entering LOOP Step4");
+        var onep1 = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121
+                .OwnedNodeEdgePoint1Builder()
+            .setPhotonicMediaNodeEdgePointSpec(
+                new PhotonicMediaNodeEdgePointSpecBuilder().setSpectrumCapabilityPac(spectrumPac.build()).build())
+            .build();
+        LOG.debug("creating Photonic NEP SPEC for node {} and nep {}", nodeId, onep1);
+        onepBldr.addAugmentation(onep1);
+        LOG.debug("Entering LOOP Step5");
+        return onepBldr;
+    }
+
+
+    public OwnedNodeEdgePointBuilder addPhotSpecToRoadmOnep(String nodeId,
+            Map<Double, Double> usedFreqMap, Map<Double, Double> availableFreqMap,
+            OwnedNodeEdgePointBuilder onepBldr, String keyword) {
+        if (!String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA_OTS).equals(keyword)
+                && !String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA_OMS).equals(keyword)) {
+            return onepBldr;
+        }
+        // Creating OTS/OMS NEP specific attributes
+        double naz = 0.01;
+        Double lowSupFreq = GridConstant.START_EDGE_FREQUENCY * 1E09 ;
+        Double upSupFreq = lowSupFreq + GridConstant.GRANULARITY * GridConstant.EFFECTIVE_BITS * 1E06 + naz;
+        lowSupFreq += naz;
+        SpectrumCapabilityPacBuilder spectrumPac = new SpectrumCapabilityPacBuilder();
+        Map<Double, Double> freqMap = null;
+        if (usedFreqMap == null || usedFreqMap.isEmpty()) {
+            freqMap = Map.of(lowSupFreq, upSupFreq);
+        } else {
+            Map<OccupiedSpectrumKey, OccupiedSpectrum> ospecMap = new HashMap<>();
+            OccupiedSpectrumBuilder ospecBd = new OccupiedSpectrumBuilder();
+            for (Map.Entry<Double, Double> frequency : usedFreqMap.entrySet()) {
+                ospecBd
+                    .setLowerFrequency(Uint64.valueOf(Math.round(frequency.getKey().doubleValue() * 1E09)))
+                    .setUpperFrequency(Uint64.valueOf(Math.round(frequency.getValue().doubleValue() * 1E09)));
+                OccupiedSpectrum ospec = ospecBd.build();
+                ospecMap.put(new OccupiedSpectrumKey(ospec.getLowerFrequency(), ospec.getUpperFrequency()), ospec);
+            }
+            spectrumPac.setOccupiedSpectrum(ospecMap);
+        }
+        if (availableFreqMap != null && !availableFreqMap.isEmpty()) {
+            freqMap = availableFreqMap;
+        }
+        if (freqMap != null) {
+            Map<AvailableSpectrumKey, AvailableSpectrum> aspecMap = new HashMap<>();
+            AvailableSpectrumBuilder aspecBd = new AvailableSpectrumBuilder();
+            for (Map.Entry<Double, Double> frequency : availableFreqMap.entrySet()) {
+                aspecBd
+                    .setLowerFrequency(Uint64.valueOf(Math.round(frequency.getKey().doubleValue() * 1E09)))
+                    .setUpperFrequency(Uint64.valueOf(Math.round(frequency.getValue().doubleValue() * 1E09)));
+                AvailableSpectrum aspec = aspecBd.build();
+                aspecMap.put(new AvailableSpectrumKey(aspec.getLowerFrequency(), aspec.getUpperFrequency()), aspec);
+            }
+            spectrumPac.setAvailableSpectrum(aspecMap);
+        }
+        SupportableSpectrum  sspec = new SupportableSpectrumBuilder()
+            .setLowerFrequency(Uint64.valueOf(Math.round(lowSupFreq)))
+            .setUpperFrequency(Uint64.valueOf(Math.round(upSupFreq)))
+            .build();
+        spectrumPac.setSupportableSpectrum(
+            new HashMap<SupportableSpectrumKey, SupportableSpectrum>(Map.of(
+                new SupportableSpectrumKey(sspec.getLowerFrequency(), sspec.getUpperFrequency()), sspec)));
+        var onep1 = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121
+                .OwnedNodeEdgePoint1Builder()
+            .setPhotonicMediaNodeEdgePointSpec(
+                new PhotonicMediaNodeEdgePointSpecBuilder().setSpectrumCapabilityPac(spectrumPac.build()).build())
+            .build();
+        onepBldr.addAugmentation(onep1);
+        LOG.debug("Add Photonic Node Edge point Spec to {} including available Spectrum {} = ",
+            onepBldr.getName(),
+            onep1.getPhotonicMediaNodeEdgePointSpec().getSpectrumCapabilityPac().getAvailableSpectrum());
+        return onepBldr;
+    }
+
+    private OduSwitchingPools createOduSwitchingPoolForTp100G() {
+        Map<NonBlockingListKey, NonBlockingList> nblMap = new HashMap<>();
+        int count = 1;
+        for (TerminationPoint tp : this.oorNetworkPortList) {
+            NonBlockingList nbl = new NonBlockingListBuilder()
+                .setNblNumber(Uint16.valueOf(count))
+                .setTpList(new HashSet<>(Set.of(
+                    tp.getTpId(),
+                    tp.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
+                            .TerminationPoint1.class)
+                        .getAssociatedConnectionMapTp().iterator().next())))
+                .build();
+            nblMap.put(nbl.key(), nbl);
+            count++;
+        }
+        return new OduSwitchingPoolsBuilder()
+            .setNonBlockingList(nblMap)
+            .setSwitchingPoolNumber(Uint16.valueOf(1))
+            .build();
+    }
+
+    private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node createTapiNode(
+            Map<NameKey, Name> nodeNames, Set<LayerProtocolName> layerProtocols) {
+        Uuid nodeUuid = null;
+        Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl = new HashMap<>();
+        Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList = new HashMap<>();
+        if (layerProtocols.contains(LayerProtocolName.DSR)
+                || layerProtocols.contains(LayerProtocolName.PHOTONICMEDIA)) {
+            Rule rule = new RuleBuilder()
+                .setLocalId("forward")
+                .setForwardingRule(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE)
+                .setRuleType(new HashSet<>(Set.of(RuleType.FORWARDING)))
+                .build();
+            nodeUuid = getNodeUuid4Dsr(onepl, nodeRuleGroupList, new HashMap<>(Map.of(rule.key(), rule)));
+        } else {
+            var nodeName = nodeNames.get(nodeNames.keySet().iterator().next());
+            LOG.error("Undefined LayerProtocolName for {} node {}", nodeName.getValueName(), nodeName.getValue());
+        }
+     // Empty random creation of mandatory fields for avoiding errors....
+        CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
+            .setCostAlgorithm("Restricted Shortest Path - RSP")
+            .setCostName("HOP_COUNT")
+            .setCostValue(TapiStringConstants.COST_HOP_VALUE)
+            .build();
+        LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
+            .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
+            .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
+            .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
+            .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
+            .setTrafficPropertyName("FIXED_LATENCY")
+            .build();
+        RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
+            .setRiskCharacteristicName("risk characteristic")
+            .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
+            .build();
+        return new NodeBuilder()
+            .setUuid(nodeUuid)
+            .setName(nodeNames)
+            .setLayerProtocolName(layerProtocols)
+            .setAdministrativeState(transformAsToTapiAdminState(this.ietfNodeAdminState.getName()))
+            .setOperationalState(transformOsToTapiOperationalState(this.ietfNodeOperState.getName()))
+            .setLifecycleState(LifecycleState.INSTALLED)
+            .setOwnedNodeEdgePoint(onepl)
+            .setNodeRuleGroup(nodeRuleGroupList)
+            .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
+            .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
+            .setRiskParameterPac(
+                new RiskParameterPacBuilder()
+                    .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
+                    .build())
+            .setErrorCharacteristic("error")
+            .setLossCharacteristic("loss")
+            .setRepeatDeliveryCharacteristic("repeat delivery")
+            .setDeliveryOrderCharacteristic("delivery order")
+            .setUnavailableTimeCharacteristic("unavailable time")
+            .setServerIntegrityProcessCharacteristic("server integrity process")
+            .build();
+    }
+
+    private Uuid getNodeUuid4Dsr(
+            Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl,
+            Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList,
+            Map<RuleKey, Rule> ruleList) {
+        // client NEP DSR creation on DSR/ODU node
+        for (int i = 0; i < oorClientPortList.size(); i++) {
+            String nodeIdDsr = String.join("+",
+                this.ietfNodeId, TapiStringConstants.DSR, oorClientPortList.get(i).getTpId().getValue());
+            Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(nodeIdDsr.getBytes(Charset.forName("UTF-8"))).toString());
+            LOG.info("NEP = {} has Uuid {} ", nodeIdDsr, nepUuid);
+            this.uuidMap.put(nodeIdDsr, nepUuid);
+            Name name = new NameBuilder()
+                .setValue(nodeIdDsr)
+                .setValueName(OpenroadmNodeType.TPDR.equals(this.ietfNodeType) ? "100G-tpdr" : "NodeEdgePoint_C")
+                .build();
+            OwnedNodeEdgePoint onep = createNep(
+                oorClientPortList.get(i),
+                Map.of(name.key(), name),
+                LayerProtocolName.DSR, LayerProtocolName.DSR, true,
+                String.join("+", this.ietfNodeId, TapiStringConstants.DSR));
+            onepl.put(onep.key(), onep);
+        }
+        // CLIENT NEP E_ODU creation on DSR/ODU node
+        for (int i = 0; i < oorClientPortList.size(); i++) {
+            String nodeIdEodu = String.join("+",
+                this.ietfNodeId, TapiStringConstants.E_ODU, oorClientPortList.get(i).getTpId().getValue());
+            Uuid nepUuid1 = new Uuid(UUID.nameUUIDFromBytes(nodeIdEodu.getBytes(Charset.forName("UTF-8"))).toString());
+            LOG.info("NEP = {} has Uuid {} ", nodeIdEodu, nepUuid1);
+            this.uuidMap.put(nodeIdEodu, nepUuid1);
+            Name onedName = new NameBuilder()
+                .setValueName("eNodeEdgePoint_N")
+                .setValue(nodeIdEodu)
+                .build();
+            OwnedNodeEdgePoint onep = createNep(
+                oorClientPortList.get(i),
+                Map.of(onedName.key(), onedName),
+                LayerProtocolName.ODU, LayerProtocolName.DSR, false,
+                String.join("+", this.ietfNodeId, TapiStringConstants.E_ODU));
+            onepl.put(onep.key(), onep);
+        }
+        // NETWORK NEPs I_ODU creation on DSR/ODU node
+        for (int i = 0; i < oorNetworkPortList.size(); i++) {
+            String nodeIdIodu = String.join("+",
+                this.ietfNodeId, TapiStringConstants.I_ODU, oorNetworkPortList.get(i).getTpId().getValue());
+            Uuid nepUuid1 = new Uuid(UUID.nameUUIDFromBytes(nodeIdIodu.getBytes(Charset.forName("UTF-8"))).toString());
+            LOG.info("NEP = {} has Uuid {} ", nodeIdIodu, nepUuid1);
+            this.uuidMap.put(nodeIdIodu, nepUuid1);
+            Name onedName = new NameBuilder()
+                .setValueName("iNodeEdgePoint_N")
+                .setValue(nodeIdIodu)
+                .build();
+            OwnedNodeEdgePoint onep = createNep(
+                oorNetworkPortList.get(i),
+                Map.of(onedName.key(), onedName),
+                LayerProtocolName.ODU, LayerProtocolName.DSR, true,
+                String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU));
+            onepl.put(onep.key(), onep);
+        }
+        // NETWORK NEP OTS network on DSR/ODU node
+        for (int i = 0; i < oorNetworkPortList.size(); i++) {
+            String nodeIdPmOts = String.join("+",
+                this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA_OTS, oorNetworkPortList.get(i).getTpId().getValue());
+            Uuid nepUuid2 = new Uuid(UUID.nameUUIDFromBytes(nodeIdPmOts.getBytes(Charset.forName("UTF-8"))).toString());
+            LOG.info("NEP = {} has Uuid {} ", nodeIdPmOts, nepUuid2);
+            this.uuidMap.put(nodeIdPmOts, nepUuid2);
+            Name onedName = new NameBuilder()
+                .setValueName("eNodeEdgePoint")
+                .setValue(nodeIdPmOts)
+                .build();
+            OwnedNodeEdgePoint onep = createNep(
+                oorNetworkPortList.get(i),
+                Map.of(onedName.key(), onedName),
+                LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true,
+                String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA_OTS));
+            onepl.put(onep.key(), onep);
+        }
+        for (int i = 0; i < oorNetworkPortList.size(); i++) {
+            String nodeIdOtMc = String.join("+",
+                this.ietfNodeId, TapiStringConstants.OTSI_MC, oorNetworkPortList.get(i).getTpId().getValue());
+            Uuid nepUuid3 = new Uuid(UUID.nameUUIDFromBytes(nodeIdOtMc.getBytes(Charset.forName("UTF-8"))).toString());
+            LOG.info("NEP = {} has Uuid {} ", nodeIdOtMc, nepUuid3);
+            this.uuidMap.put(nodeIdOtMc, nepUuid3);
+            Name onedName = new NameBuilder()
+                .setValueName("PhotMedNodeEdgePoint")
+                .setValue(nodeIdOtMc)
+                .build();
+            OwnedNodeEdgePoint onep = createNep(
+                oorNetworkPortList.get(i),
+                Map.of(onedName.key(), onedName),
+                LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true,
+                String.join("+", this.ietfNodeId, TapiStringConstants.OTSI_MC));
+            onepl.put(onep.key(), onep);
+        }
+        // create NodeRuleGroup
+        int count = 1;
+        LOG.debug("ODU switching pool = {}", this.oorOduSwitchingPool.nonnullNonBlockingList().values());
+        String ietfXpdr = String.join("+", this.ietfNodeId, TapiStringConstants.XPDR);
+        for (NonBlockingList nbl : this.oorOduSwitchingPool.nonnullNonBlockingList().values()) {
+            Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointKey,
+                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint>
+                    nepList = new HashMap<>();
+            Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointKey,
+                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint>
+                    oduNepList = new HashMap<>();
+            LOG.debug("UUidMap={}", this.uuidMap.keySet());
+            LOG.debug("TP list = {}", nbl.getTpList());
+            for (TpId tp : nbl.getTpList()) {
+                String tpValue = tp.getValue();
+                LOG.debug("TP={}", tpValue);
+                String ietfEoduTp = String.join("+", this.ietfNodeId, TapiStringConstants.E_ODU, tpValue);
+                LOG.debug("UuidKey={}", ietfEoduTp);
+                String ietfIoduTp = String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU, tpValue);
+                if (this.uuidMap.containsKey(String.join("+", this.ietfNodeId, TapiStringConstants.DSR, tpValue))
+                        || this.uuidMap.containsKey(ietfIoduTp)) {
+                    var nep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
+                                .node.rule.group.NodeEdgePointBuilder()
+                            .setTopologyUuid(tapiTopoUuid)
+                            .setNodeUuid(this.uuidMap.get(ietfXpdr))
+                            .setNodeEdgePointUuid(this.uuidMap.get(
+                                String.join("+",
+                                    this.ietfNodeId,
+                                    tpValue.contains("CLIENT") ? TapiStringConstants.DSR : TapiStringConstants.I_ODU,
+                                    tpValue)))
+                            .build();
+                    nepList.put(nep.key(), nep);
+                }
+                if (this.uuidMap.containsKey(ietfEoduTp)) {
+                    var nep1 = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
+                                .node.rule.group.NodeEdgePointBuilder()
+                            .setTopologyUuid(tapiTopoUuid)
+                            .setNodeUuid(this.uuidMap.get(ietfXpdr))
+                            .setNodeEdgePointUuid(this.uuidMap.get(ietfEoduTp))
+                            .build();
+                    oduNepList.put(nep1.key(), nep1);
+                }
+                if (this.uuidMap.containsKey(ietfIoduTp)) {
+                // TODO already checked with DSR above -> potential factorization ?
+                    var nep2 = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
+                                .node.rule.group.NodeEdgePointBuilder()
+                            .setTopologyUuid(tapiTopoUuid)
+                            .setNodeUuid(this.uuidMap.get(ietfXpdr))
+                            .setNodeEdgePointUuid(this.uuidMap.get(ietfIoduTp))
+                            .build();
+                    oduNepList.put(nep2.key(), nep2);
+                }
+            }
+            LOG.debug("NEPLIST (DSR/I_ODU) of [dsr node rule group] is {}", nepList);
+            LOG.debug("NEPLIST (E_ODU/I_ODU) of [odu node rule group] is {}", nepList);
+            // Empty random creation of mandatory fields for avoiding errors....
+            CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
+                .setCostAlgorithm("Restricted Shortest Path - RSP")
+                .setCostName("HOP_COUNT")
+                .setCostValue(TapiStringConstants.COST_HOP_VALUE)
+                .build();
+            LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
+                .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
+                .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
+                .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
+                .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
+                .setTrafficPropertyName("FIXED_LATENCY")
+                .build();
+            RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
+                .setRiskCharacteristicName("risk characteristic")
+                .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
+                .build();
+            Name nrgName = new NameBuilder()
+                .setValueName("nrg name")
+                .setValue("odu node rule group " + count)
+                .build();
+            NodeRuleGroup nodeRuleGroup1 = new NodeRuleGroupBuilder()
+                .setName(Map.of(nrgName.key(), nrgName))
+                .setUuid(new Uuid(UUID.nameUUIDFromBytes(("dsr node rule group " + count)
+                    .getBytes(Charset.forName("UTF-8"))).toString()))
+                .setRule(ruleList)
+                .setNodeEdgePoint(nepList)
+                .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
+                .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
+                .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
+                .build();
+            nodeRuleGroupList.put(nodeRuleGroup1.key(), nodeRuleGroup1);
+            NodeRuleGroup nodeRuleGroup2 = new NodeRuleGroupBuilder()
+                .setUuid(new Uuid(UUID.nameUUIDFromBytes(("odu node rule group " + count)
+                    .getBytes(Charset.forName("UTF-8"))).toString()))
+                .setRule(ruleList)
+                .setNodeEdgePoint(oduNepList)
+                .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
+                .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
+                .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
+                .build();
+            nodeRuleGroupList.put(nodeRuleGroup2.key(), nodeRuleGroup2);
+            count++;
+        }
+        return this.uuidMap.get(ietfXpdr);
+    }
+
+    private OwnedNodeEdgePoint createNep(TerminationPoint oorTp, Map<NameKey, Name> nepNames,
+            LayerProtocolName nepProtocol, LayerProtocolName nodeProtocol, boolean withSip, String keyword) {
+        var tp1 = oorTp.augmentation(
+            org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.TerminationPoint1.class);
+        var oorTpId = oorTp.getTpId();
+        var oorTpIdValue = oorTpId.getValue();
+        if (tp1.getTpSupportedInterfaces() == null) {
+            LOG.warn("Tp supported interface doesnt exist on TP {}", oorTpIdValue);
+            return null;
+        }
+        TerminationPoint1 oorTpAug = oorTp.augmentation(TerminationPoint1.class);
+        var oorTpAugAdmState = oorTpAug.getAdministrativeState();
+        AdministrativeState adminState =
+            oorTpAugAdmState == null ? null : transformAsToTapiAdminState(oorTpAugAdmState.getName());
+        var oorTpAugOprState = oorTpAug.getOperationalState();
+        OperationalState operState =
+            oorTpAugOprState == null ? null : transformOsToTapiOperationalState(oorTpAugOprState.getName());
+        Collection<SupportedInterfaceCapability> sicColl =
+            tp1.getTpSupportedInterfaces().getSupportedInterfaceCapability().values();
+        OwnedNodeEdgePointBuilder onepBldr = new OwnedNodeEdgePointBuilder()
+            .setUuid(this.uuidMap.get(String.join("+", keyword, oorTpIdValue)))
+            .setLayerProtocolName(nepProtocol)
+            .setName(nepNames)
+            .setSupportedCepLayerProtocolQualifierInstances(
+                createSupportedCepLayerProtocolQualifier(sicColl, nepProtocol))
+            .setDirection(Direction.BIDIRECTIONAL)
+            .setLinkPortRole(PortRole.SYMMETRIC)
+            .setAdministrativeState(adminState)
+            .setOperationalState(operState)
+            .setLifecycleState(LifecycleState.INSTALLED);
+        if (withSip) {
+            onepBldr.setMappedServiceInterfacePoint(
+                createMSIP(1, nepProtocol, oorTpIdValue, keyword, sicColl, operState, adminState));
+        }
+        if (oorTpAug.getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
+            List<OperationalModeKey> opModeList = new ArrayList<>();
+            var tp11 = oorTp.augmentation(
+                org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1.class);
+            if (tp11 == null || tp11.getXpdrNetworkAttributes() == null) {
+                for (SupportedInterfaceCapability sic : sicColl) {
+                    String ifCapType = sic.getIfCapType().toString().split("\\{")[0];
+                    switch (ifCapType) {
+                        case "IfOCHOTUCnODUCn":
+                        case "IfOCHOTUCnODUCnUniregen":
+                        case "IfOCHOTUCnODUCnRegen":
+                            opModeList.add(new OperationalModeKey("400G"));
+                            LOG.warn(TopologyUtils.NOOPMODEDECLARED + "400G rate available", oorTpId);
+                            break;
+                        default:
+                            break;
+                    }
+                }
+                opModeList.add(new OperationalModeKey("100G"));
+                LOG.warn(TopologyUtils.NOOPMODEDECLARED + "100G rate available", oorTpId);
+            } else {
+                opModeList = tp11.getXpdrNetworkAttributes().getSupportedOperationalModes().getOperationalMode()
+                    .keySet().stream().toList();
+            }
+            onepBldr = addPayloadStructureAndPhotSpecToOnep(
+                this.ietfNodeId, getXpdrUsedWavelength(oorTp), opModeList, sicColl, onepBldr, keyword);
+        }
+        OwnedNodeEdgePoint onep = onepBldr.build();
+        LOG.debug("ConvertORToTapiTopology 1360, onep = {}", onep);
+        return onep;
+    }
+
+    private ServiceInterfacePoint createSIP(Uuid sipUuid, LayerProtocolName layerProtocol, String tpId,
+        String nodeid, Collection<SupportedInterfaceCapability> supportedInterfaceCapability,
+        OperationalState operState, AdministrativeState adminState) {
+    // TODO: what value should be set in total capacity and available capacity??
+        LOG.debug("SIP name = {}", String.join("+", nodeid, tpId));
+        Name sipName = new NameBuilder()
+            .setValueName("SIP name")
+            .setValue(String.join("+", nodeid, tpId))
+            .build();
+        return new ServiceInterfacePointBuilder()
+            .setUuid(sipUuid)
+            .setName(Map.of(sipName.key(), sipName))
+            .setLayerProtocolName(layerProtocol)
+            .setAdministrativeState(adminState)
+            .setOperationalState(operState)
+            .setLifecycleState(LifecycleState.INSTALLED)
+            .setAvailableCapacity(new AvailableCapacityBuilder().build())
+            .setTotalPotentialCapacity(new TotalPotentialCapacityBuilder().build())
+            .setSupportedCepLayerProtocolQualifierInstances(createSipSupportedLayerProtocolQualifier(
+                supportedInterfaceCapability, layerProtocol))
+            .build();
+    }
+
+    private List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
+                .service._interface.point.SupportedCepLayerProtocolQualifierInstances>
+             createSipSupportedLayerProtocolQualifier(
+                Collection<SupportedInterfaceCapability> supportedInterfaceCapability, LayerProtocolName lpn) {
+        if (supportedInterfaceCapability == null) {
+            return new ArrayList<>(List.of(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
+                    .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
+                .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
+                .setNumberOfCepInstances(Uint64.valueOf(1))
+                .build()));
+        }
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
+            .service._interface.point.SupportedCepLayerProtocolQualifierInstances> sclpqiList = new ArrayList<>();
+        String lpnName = lpn.getName();
+        for (SupportedInterfaceCapability sic : supportedInterfaceCapability) {
+            String ifCapType = sic.getIfCapType().toString().split("\\{")[0];
+            if (!LPN_MAP.containsKey(lpnName)) {
+                LOG.error("Layer Protocol Name is unknown {}", lpnName);
+                break;
+            }
+            var ifCapTypeMap = LPN_MAP.get(lpnName);
+            if (!ifCapTypeMap.containsKey(ifCapType)) {
+                LOG.error("IfCapability type {} not managed", ifCapType);
+                break;
+            }
+            for (Map.Entry<LAYERPROTOCOLQUALIFIER, Uint64> entry: ifCapTypeMap.get(ifCapType).entrySet()) {
+                sclpqiList.add(
+                    new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121
+                            .service._interface.point.SupportedCepLayerProtocolQualifierInstancesBuilder()
+                        .setLayerProtocolQualifier(entry.getKey())
+                        .setNumberOfCepInstances(entry.getValue())
+                        .build());
+            }
+        }
+        return sclpqiList.stream().distinct().toList();
+    }
+
+    public Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
+            getTapiNodes() {
+        return tapiNodes;
+    }
+
+    public Map<LinkKey, Link> getTapiLinks() {
+        return tapiLinks;
+    }
+
+    public AdministrativeState transformAsToTapiAdminState(String adminState) {
+        return adminState == null ? null
+            : adminState.equals(AdminStates.InService.getName())
+                    || adminState.equals(AdministrativeState.UNLOCKED.getName())
+                ? AdministrativeState.UNLOCKED : AdministrativeState.LOCKED;
+    }
+
+    public OperationalState transformOsToTapiOperationalState(String operState) {
+        return operState == null ? null
+            : operState.equals("inService") || operState.equals(OperationalState.ENABLED.getName())
+                ? OperationalState.ENABLED : OperationalState.DISABLED;
+    }
+
+    public Map<ServiceInterfacePointKey, ServiceInterfacePoint> getTapiSips() {
+        return tapiSips;
+    }
+
+    public void setTapiSips(Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSip) {
+        this.tapiSips.putAll(tapiSip);
+    }
+
+}
index 0961fc58b15f033bb53ed81d09f19e6c836062b6..3ab60048ddeb0d06e5e4830e15fe0ff98cbe3465 100644 (file)
@@ -9,86 +9,59 @@ package org.opendaylight.transportpce.tapi.topology;
 
 import java.nio.charset.Charset;
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 import java.util.stream.Collectors;
+import org.opendaylight.transportpce.common.fixedflex.GridConstant;
 import org.opendaylight.transportpce.tapi.TapiStringConstants;
 import org.opendaylight.transportpce.tapi.utils.TapiLink;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.OduSwitchingPools;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.OduSwitchingPoolsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.Node1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev230526.Node1;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.AdministrativeState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LAYERPROTOCOLQUALIFIER;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LifecycleState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.OperationalState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortRole;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.pac.AvailableCapacityBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.pac.TotalPotentialCapacityBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE100GigE;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE10GigELAN;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPEGigE;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU0;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU2;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU2E;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU4;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROMS;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROTSi;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.ForwardingRule;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.RuleType;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroup;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroupBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroupKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.Rule;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.RuleBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.RuleKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.risk.parameter.pac.RiskCharacteristic;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.risk.parameter.pac.RiskCharacteristicBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.LinkKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.transfer.cost.pac.CostCharacteristic;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.transfer.cost.pac.CostCharacteristicBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.transfer.timing.pac.LatencyCharacteristic;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.transfer.timing.pac.LatencyCharacteristicBuilder;
-import org.opendaylight.yangtools.yang.common.Uint16;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Direction;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.PortRole;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIERMC;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROMS;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTS;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTSiMC;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroup;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.RiskParameterPacBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstancesBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristic;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristicBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristic;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristicBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristic;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristicBuilder;
+import org.opendaylight.yangtools.yang.common.Uint64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -98,173 +71,90 @@ public class ConvertORTopoToTapiFullTopo {
     private static final Logger LOG = LoggerFactory.getLogger(ConvertORTopoToTapiFullTopo.class);
     private String ietfNodeId;
     private OpenroadmNodeType ietfNodeType;
-    private AdminStates ietfNodeAdminState;
-    private State ietfNodeOperState;
-    private List<TerminationPoint> oorClientPortList;
-    private List<TerminationPoint> oorNetworkPortList;
-    private OduSwitchingPools oorOduSwitchingPool;
     private Uuid tapiTopoUuid;
-    private Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node>
+    private Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
         tapiNodes;
     private Map<LinkKey, Link> tapiLinks;
     private Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSips;
-    private Map<String, Uuid> uuidMap;
     private final TapiLink tapiLink;
+    private static String topologicalMode;
 
 
     public ConvertORTopoToTapiFullTopo(Uuid tapiTopoUuid, TapiLink tapiLink) {
         this.tapiTopoUuid = tapiTopoUuid;
         this.tapiNodes = new HashMap<>();
         this.tapiLinks = new HashMap<>();
-        this.uuidMap = new HashMap<>();
         this.tapiSips = new HashMap<>();
         this.tapiLink = tapiLink;
-    }
-
-    public void convertNode(Node ietfNode, List<String> networkPorts) {
-        this.ietfNodeId = ietfNode.getNodeId().getValue();
-        if (ietfNode.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1.class)
-                == null) {
-            return;
-        }
-        this.ietfNodeType = ietfNode.augmentation(
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1.class).getNodeType();
-        this.ietfNodeAdminState = ietfNode.augmentation(
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1.class)
-                .getAdministrativeState();
-        this.ietfNodeOperState = ietfNode.augmentation(
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1.class)
-                .getOperationalState();
-        this.oorNetworkPortList = ietfNode.augmentation(
-            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
-                .getTerminationPoint().values().stream()
-                .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
-                    == OpenroadmTpType.XPONDERNETWORK.getIntValue()
-                    && networkPorts.contains(tp.getTpId().getValue()))
-                .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
-                .collect(Collectors.toList());
-        if (!OpenroadmNodeType.TPDR.equals(this.ietfNodeType)) {
-            this.oorOduSwitchingPool = ietfNode.augmentation(Node1.class).getSwitchingPools().getOduSwitchingPools()
-                .values().stream().findFirst().get();
-            this.oorClientPortList = ietfNode.augmentation(
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
-                    .getTerminationPoint().values().stream()
-                    .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
-                        == OpenroadmTpType.XPONDERCLIENT.getIntValue())
-                    .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
-                    .collect(Collectors.toList());
-        } else {
-            this.oorOduSwitchingPool = createOduSwitchingPoolForTp100G();
-            List<TpId> tpList = this.oorOduSwitchingPool.getNonBlockingList().values().stream()
-                .flatMap(nbl -> nbl.getTpList().stream())
-                .collect(Collectors.toList());
-            this.oorClientPortList = ietfNode.augmentation(
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
-                    .getTerminationPoint().values().stream()
-                    .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
-                        == OpenroadmTpType.XPONDERCLIENT.getIntValue() && tpList.contains(tp.getTpId()))
-                    .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
-                    .collect(Collectors.toList());
-            this.oorClientPortList.forEach(tp -> LOG.info("tp = {}", tp.getTpId()));
+        if (topologicalMode == null) {
+            ConvertORTopoToTapiFullTopo.topologicalMode = "Full";
         }
-
-        // node creation [DSR/ODU]
-        LOG.info("creation of a DSR/ODU node for {}", this.ietfNodeId);
-        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", this.ietfNodeId,
-            TapiStringConstants.DSR)).getBytes(Charset.forName("UTF-8"))).toString());
-        this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.DSR), nodeUuid);
-        Name nameDsrNode = new NameBuilder().setValueName("dsr/odu node name").setValue(
-            String.join("+", this.ietfNodeId, TapiStringConstants.DSR)).build();
-        Name nameNodeType = new NameBuilder().setValueName("Node Type")
-            .setValue(this.ietfNodeType.getName()).build();
-        List<LayerProtocolName> dsrLayerProtocols = Arrays.asList(LayerProtocolName.DSR, LayerProtocolName.ODU);
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
-            .Node dsrNode = createTapiNode(Map.of(nameDsrNode.key(), nameDsrNode, nameNodeType.key(), nameNodeType),
-            dsrLayerProtocols);
-        LOG.info("DSR Node {} should have {} NEPs and {} SIPs", this.ietfNodeId,
-            this.oorClientPortList.size() + 2 * this.oorNetworkPortList.size(),
-            this.oorClientPortList.size() + this.oorNetworkPortList.size());
-        LOG.info("DSR Node {} has {} NEPs and {} SIPs", this.ietfNodeId,
-            dsrNode.getOwnedNodeEdgePoint().values().size(), dsrNode.getOwnedNodeEdgePoint().values().stream()
-                .filter(nep -> nep.getMappedServiceInterfacePoint() != null).count());
-        tapiNodes.put(dsrNode.key(), dsrNode);
-
-        // node creation [otsi]
-        LOG.info("creation of an OTSi node for {}", this.ietfNodeId);
-        nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", this.ietfNodeId, TapiStringConstants.OTSI))
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.OTSI), nodeUuid);
-        Name nameOtsiNode =  new NameBuilder().setValueName("otsi node name").setValue(
-            String.join("+", this.ietfNodeId, TapiStringConstants.OTSI)).build();
-        List<LayerProtocolName> otsiLayerProtocols = Arrays.asList(LayerProtocolName.PHOTONICMEDIA);
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
-            .Node otsiNode = createTapiNode(Map.of(nameOtsiNode.key(), nameOtsiNode, nameNodeType.key(), nameNodeType),
-            otsiLayerProtocols);
-        LOG.info("OTSi Node {} should have {} NEPs and {} SIPs", this.ietfNodeId, 3 * this.oorNetworkPortList.size(),
-            this.oorNetworkPortList.size());
-        LOG.info("OTSi Node {} has {} NEPs and {} SIPs", this.ietfNodeId,
-            otsiNode.getOwnedNodeEdgePoint().values().size(), otsiNode.getOwnedNodeEdgePoint().values().stream()
-                .filter(nep -> nep.getMappedServiceInterfacePoint() != null).count());
-        tapiNodes.put(otsiNode.key(), otsiNode);
-
-        // transitional link cration between network nep of DSR/ODU node and iNep of otsi node
-        LOG.info("creation of transitional links between DSR/ODU and OTSi nodes");
-        createTapiTransitionalLinks();
     }
 
-    public void convertRdmToRdmLinks(List<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
-            .ietf.network.topology.rev180226.networks.network.Link> rdmTordmLinkList) {
+    public void convertRdmToRdmLinks(
+            List<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                .networks.network.Link> rdmTordmLinkList) {
         List<String> linksToNotConvert = new ArrayList<>();
         LOG.info("creation of {} roadm to roadm links", rdmTordmLinkList.size() / 2);
-        for (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
-            .Link link : rdmTordmLinkList) {
-            if (!linksToNotConvert.contains(link.getLinkId().getValue())) {
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
-                        .ietf.network.topology.rev180226.networks.network.Link oppositeLink = rdmTordmLinkList.stream()
-                    .filter(l -> l.getLinkId().equals(link.augmentation(Link1.class).getOppositeLink()))
-                    .findAny().orElse(null);
-
-                AdminStates oppLnkAdmState = null;
-                State oppLnkOpState = null;
-                if (oppositeLink != null) {
-                    oppLnkAdmState = oppositeLink.augmentation(Link1.class).getAdministrativeState();
-                    oppLnkOpState = oppositeLink.augmentation(Link1.class).getOperationalState();
-                }
-                String adminState =
-                    link.augmentation(Link1.class).getAdministrativeState() == null
-                        || oppLnkAdmState == null
-                    ? null
-                    : this.tapiLink.setTapiAdminState(
-                        link.augmentation(Link1.class).getAdministrativeState(), oppLnkAdmState).getName();
-                String operState =
-                    link.augmentation(Link1.class).getOperationalState() == null
-                        || oppLnkOpState == null
-                    ? null
-                    : this.tapiLink.setTapiOperationalState(
-                        link.augmentation(Link1.class).getOperationalState(), oppLnkOpState).getName();
-
-                Link tapLink = this.tapiLink.createTapiLink(String.join("-",
-                        link.getSource().getSourceNode().getValue().split("-")[0],
-                        link.getSource().getSourceNode().getValue().split("-")[1]),
-                    link.getSource().getSourceTp().getValue(), String.join("-",
-                        link.getDestination().getDestNode().getValue().split("-")[0],
-                        link.getDestination().getDestNode().getValue().split("-")[1]),
-                    link.getDestination().getDestTp().getValue(), TapiStringConstants.OMS_RDM_RDM_LINK,
-                    TapiStringConstants.PHTNC_MEDIA, TapiStringConstants.PHTNC_MEDIA, TapiStringConstants.PHTNC_MEDIA,
-                    TapiStringConstants.PHTNC_MEDIA, adminState, operState, List.of(LayerProtocolName.PHOTONICMEDIA),
-                    List.of(LayerProtocolName.PHOTONICMEDIA.getName()), this.tapiTopoUuid);
-                linksToNotConvert.add(link
-                    .augmentation(Link1.class)
-                    .getOppositeLink().getValue());
-                tapiLinks.put(tapLink.key(), tapLink);
+        for (var link : rdmTordmLinkList) {
+            if (linksToNotConvert.contains(link.getLinkId().getValue())) {
+                continue;
+            }
+            var lnk1 = link.augmentation(Link1.class);
+            var lnk1OppLnk = lnk1.getOppositeLink();
+            var oppositeLink = rdmTordmLinkList.stream()
+                .filter(l -> l.getLinkId().equals(lnk1OppLnk))
+                .findAny().orElse(null);
+            AdminStates oppLnkAdmState = null;
+            State oppLnkOpState = null;
+            if (oppositeLink != null) {
+                oppLnkAdmState = oppositeLink.augmentation(Link1.class).getAdministrativeState();
+                oppLnkOpState = oppositeLink.augmentation(Link1.class).getOperationalState();
             }
+            var linkSrc = link.getSource();
+            String linkSrcNodeValue = linkSrc.getSourceNode().getValue();
+            var linkDst = link.getDestination();
+            String linkDstNodeValue = linkDst.getDestNode().getValue();
+            var lnkAdmState = lnk1.getAdministrativeState();
+            var lnkOpState = lnk1.getOperationalState();
+            Link tapLink = this.tapiLink.createTapiLink(
+                String.join("-", linkSrcNodeValue.split("-")[0], linkSrcNodeValue.split("-")[1]),
+                linkSrc.getSourceTp().getValue(),
+                String.join("-", linkDstNodeValue.split("-")[0], linkDstNodeValue.split("-")[1]),
+                linkDst.getDestTp().getValue(),
+                TapiStringConstants.OMS_RDM_RDM_LINK,
+                TapiStringConstants.PHTNC_MEDIA,
+                TapiStringConstants.PHTNC_MEDIA,
+                TapiStringConstants.PHTNC_MEDIA_OTS,
+                TapiStringConstants.PHTNC_MEDIA_OTS,
+                //adminState,
+                lnkAdmState == null || oppLnkAdmState == null
+                    ? null : this.tapiLink.setTapiAdminState(lnkAdmState, oppLnkAdmState).getName(),
+                //operState,
+                lnkOpState == null || oppLnkOpState == null
+                    ? null : this.tapiLink.setTapiOperationalState(lnkOpState, oppLnkOpState).getName(),
+                Set.of(LayerProtocolName.PHOTONICMEDIA),
+                Set.of(LayerProtocolName.PHOTONICMEDIA.getName()),
+                this.tapiTopoUuid);
+            linksToNotConvert.add(lnk1OppLnk.getValue());
+            tapiLinks.put(tapLink.key(), tapLink);
         }
     }
 
-    public void convertRoadmNode(Node roadm, Network openroadmTopo) {
+    public void convertRoadmNode(Node roadm, Network openroadmTopo, String topoMode) {
+        setTopologicalMode(topoMode);
+        if (topoMode.equals("Full")) {
+            convertRoadmNodeFull(roadm, openroadmTopo);
+        } else {
+            convertRoadmNodeAbstracted(openroadmTopo);
+        }
+    }
+
+    private void convertRoadmNodeFull(Node roadm, Network openroadmTopo) {
         this.ietfNodeId = roadm.getNodeId().getValue();
         this.ietfNodeType = roadm.augmentation(
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1.class).getNodeType();
+                org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class)
+            .getNodeType();
         Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> oneplist = new HashMap<>();
         // 1. Get degree and srg nodes to map TPs into NEPs
         if (openroadmTopo.getNode() == null) {
@@ -275,185 +165,200 @@ public class ConvertORTopoToTapiFullTopo {
         int numSips = 0;
         List<Node> nodeList = new ArrayList<Node>(openroadmTopo.getNode().values());
         for (Node node:nodeList) {
-            if (node.getSupportingNode().values().stream().noneMatch(sp -> sp.getNodeRef().getValue()
-                .equals(this.ietfNodeId))) {
-                LOG.warn("Abstracted node {} is not part of {}",
-                    node.getNodeId().getValue(), this.ietfNodeId);
+            String nodeId = node.getNodeId().getValue();
+            if (node.getSupportingNode().values().stream()
+                    .noneMatch(sp -> sp.getNodeRef().getValue().equals(this.ietfNodeId))) {
+                LOG.debug("Abstracted node {} is not part of {}", nodeId, this.ietfNodeId);
                 continue;
             }
-            if (node.augmentation(Node1.class) == null
-                && node.augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
-                .ietf.network.topology.rev180226.Node1.class) == null) {
-                LOG.warn("Abstracted node {} doesnt have type of node or is not disaggregated",
-                    node.getNodeId().getValue());
+            var node1 = node.augmentation(
+                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class);
+            if (node.augmentation(Node1.class) == null && node1 == null) {
+                LOG.warn("Abstracted node {} doesnt have type of node or is not disaggregated", nodeId);
                 continue;
             }
-            OpenroadmNodeType nodeType = node.augmentation(org.opendaylight.yang.gen.v1.http
-                .org.openroadm.common.network.rev211210.Node1.class).getNodeType();
-            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1 node1 =
-                node.augmentation(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
-                    .ietf.network.topology.rev180226.Node1.class);
-            LOG.info("TPs of node: {}", node1.getTerminationPoint().values());
+            OpenroadmNodeType nodeType = node.augmentation(
+                        org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class)
+                .getNodeType();
+            var node1TpValues = node1.getTerminationPoint().values();
+            LOG.info("TPs of node: {}", node1TpValues);
             switch (nodeType.getIntValue()) {
                 case 11:
                     LOG.info("Degree node");
                     // Get only external TPs of the degree
-                    List<TerminationPoint> degPortList = node1.getTerminationPoint().values().stream()
+                    List<TerminationPoint> degPortList = node1TpValues.stream()
                         .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
-                            == OpenroadmTpType.DEGREETXRXTTP.getIntValue()
+                                == OpenroadmTpType.DEGREETXRXTTP.getIntValue()
                             || tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
-                            == OpenroadmTpType.DEGREERXTTP.getIntValue()
+                                == OpenroadmTpType.DEGREERXTTP.getIntValue()
                             || tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
-                            == OpenroadmTpType.DEGREETXTTP.getIntValue())
+                                == OpenroadmTpType.DEGREETXTTP.getIntValue())
                         .collect(Collectors.toList());
                     // Convert TP List in NEPs and put it in onepl
                     LOG.info("Degree port List: {}", degPortList);
                     // TODO: deg port could be sip. e.g. MDONS
-                    oneplist.putAll(populateNepsForRdmNode(degPortList, false));
-                    // oneplist.putAll(populateNepsForRdmNode(node.getNodeId().getValue(), degPortList, false));
-                    numNeps += degPortList.size() * 3;
+                    oneplist.putAll(populateNepsForRdmNode(
+                        nodeId, degPortList, false, TapiStringConstants.PHTNC_MEDIA_OTS));
+                    oneplist.putAll(populateNepsForRdmNode(
+                        nodeId, degPortList, false, TapiStringConstants.PHTNC_MEDIA_OMS));
+                    numNeps += degPortList.size() * 2;
                     break;
                 case 12:
                     LOG.info("SRG node");
                     // Get only external TPs of the srg
-                    List<TerminationPoint> srgPortList = node1.getTerminationPoint().values().stream()
+                    List<TerminationPoint> srgPortList = node1TpValues.stream()
                         .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
-                            == OpenroadmTpType.SRGTXRXPP.getIntValue()
+                                == OpenroadmTpType.SRGTXRXPP.getIntValue()
                             || tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
-                            == OpenroadmTpType.SRGRXPP.getIntValue()
+                                == OpenroadmTpType.SRGRXPP.getIntValue()
                             || tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
-                            == OpenroadmTpType.SRGTXPP.getIntValue())
+                                == OpenroadmTpType.SRGTXPP.getIntValue())
                         .collect(Collectors.toList());
                     // Convert TP List in NEPs and put it in onepl
                     LOG.info("Srg port List: {}", srgPortList);
-                    oneplist.putAll(populateNepsForRdmNode(srgPortList, true));
-                    // oneplist.putAll(populateNepsForRdmNode(node.getNodeId().getValue(), srgPortList, true));
-                    numNeps += srgPortList.size() * 3;
+                    oneplist.putAll(populateNepsForRdmNode(
+                        nodeId, srgPortList, true, TapiStringConstants.PHTNC_MEDIA_OTS));
+                    numNeps += srgPortList.size();
                     numSips += srgPortList.size();
                     break;
                 default:
-                    LOG.error("Node {} tyoe not supported", nodeType.getName());
+                    LOG.error("Node {} type not supported", nodeType.getName());
             }
         }
         // create tapi Node
         // UUID
-        LOG.info("Creation of PHOTONIC node for {}", roadm.getNodeId().getValue());
-        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", roadm.getNodeId().getValue(),
-            TapiStringConstants.PHTNC_MEDIA)).getBytes(Charset.forName("UTF-8"))).toString());
+        String nodeIdPhMed = String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA);
+        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(nodeIdPhMed.getBytes(Charset.forName("UTF-8"))).toString());
+        LOG.info("Creation of PHOTONIC node for {}, of Uuid {}", this.ietfNodeId, nodeUuid);
         // Names
-        Name nodeNames =  new NameBuilder().setValueName("roadm node name")
-            .setValue(String.join("+", roadm.getNodeId().getValue(), TapiStringConstants.PHTNC_MEDIA)).build();
-        Name nameNodeType = new NameBuilder().setValueName("Node Type")
-            .setValue(this.ietfNodeType.getName()).build();
-        // Protocol Layer
-        List<LayerProtocolName> layerProtocols = Arrays.asList(LayerProtocolName.PHOTONICMEDIA);
+        Name nodeNames =  new NameBuilder().setValueName("roadm node name").setValue(nodeIdPhMed).build();
+        Name nameNodeType = new NameBuilder().setValueName("Node Type").setValue(this.ietfNodeType.getName()).build();
         // Build tapi node
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
-            .Node roadmNode = createRoadmTapiNode(nodeUuid,
-            Map.of(nodeNames.key(), nodeNames, nameNodeType.key(), nameNodeType), layerProtocols, oneplist);
+        LOG.debug("CONVERTTOFULL SRG OTSNode of retrieved OnepMap {} ",
+            oneplist.entrySet().stream()
+                .filter(e -> e.getValue().getSupportedCepLayerProtocolQualifierInstances()
+                    .contains(
+                        new SupportedCepLayerProtocolQualifierInstancesBuilder()
+                            .setNumberOfCepInstances(Uint64.valueOf(1))
+                            .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
+                            .build()))
+                .collect(Collectors.toList()));
+        //org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node
+        var roadmNode = createRoadmTapiNode(
+            nodeUuid,
+            Map.of(nodeNames.key(), nodeNames, nameNodeType.key(), nameNodeType),
+            // Protocol Layer
+            Set.of(LayerProtocolName.PHOTONICMEDIA),
+            oneplist,
+            "Full");
         // TODO add states corresponding to device config
-        LOG.info("ROADM node {} should have {} NEPs and {} SIPs", roadm.getNodeId().getValue(), numNeps, numSips);
-        LOG.info("ROADM node {} has {} NEPs and {} SIPs", roadm.getNodeId().getValue(),
-            roadmNode.getOwnedNodeEdgePoint().values().size(),
-            roadmNode.getOwnedNodeEdgePoint().values().stream()
-                .filter(nep -> nep.getMappedServiceInterfacePoint() != null).count());
-
+        LOG.info("ROADM node {} should have {} NEPs and {} SIPs", this.ietfNodeId, numNeps, numSips);
+        LOG.info("ROADM node {} has {} NEPs and {} SIPs",
+            this.ietfNodeId,
+            roadmNode.nonnullOwnedNodeEdgePoint().values().size(),
+            roadmNode.nonnullOwnedNodeEdgePoint().values().stream()
+                .filter(nep -> nep.getMappedServiceInterfacePoint() != null)
+                .count());
         tapiNodes.put(roadmNode.key(), roadmNode);
     }
 
-    private OduSwitchingPools createOduSwitchingPoolForTp100G() {
-        Map<NonBlockingListKey, NonBlockingList> nblMap = new HashMap<>();
-        int count = 1;
-        for (TerminationPoint tp : this.oorNetworkPortList) {
-            TpId tpid1 = tp.getTpId();
-            TpId tpid2 = new TpId(tp.augmentation(
-                org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1.class)
-                .getAssociatedConnectionMapPort());
-            List<TpId> tpList = new ArrayList<>();
-            tpList.add(tpid1);
-            tpList.add(tpid2);
-            NonBlockingList nbl = new NonBlockingListBuilder()
-                .setNblNumber(Uint16.valueOf(count))
-                .setTpList(tpList)
-                .build();
-            nblMap.put(nbl.key(), nbl);
-            count++;
+    private void convertRoadmNodeAbstracted(Network openroadmTopo) {
+        Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> oneMap = new HashMap<>();
+        // 1. Get degree and srg nodes to map TPs into NEPs
+        if (openroadmTopo.getNode() == null) {
+            LOG.warn("Openroadm-topology is null.");
+            return;
         }
-        return new OduSwitchingPoolsBuilder()
-            .setNonBlockingList(nblMap)
-            .setSwitchingPoolNumber(Uint16.valueOf(1))
-            .build();
-    }
-
-    private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node
-            createTapiNode(Map<NameKey, Name> nodeNames, List<LayerProtocolName> layerProtocols) {
-        Uuid nodeUuid = null;
-        Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl = new HashMap<>();
-        Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList = new HashMap<>();
-        Map<RuleKey, Rule> ruleList = new HashMap<>();
-        Rule rule = new RuleBuilder()
-            .setLocalId("forward")
-            .setForwardingRule(ForwardingRule.MAYFORWARDACROSSGROUP)
-            .setRuleType(RuleType.FORWARDING)
-            .build();
-        ruleList.put(rule.key(), rule);
-        if (layerProtocols.contains(LayerProtocolName.DSR)) {
-            nodeUuid = getNodeUuid4Dsr(onepl, nodeRuleGroupList, ruleList);
-        } else if (layerProtocols.contains(LayerProtocolName.PHOTONICMEDIA)) {
-            nodeUuid = getNodeUuid4Photonic(onepl, nodeRuleGroupList, ruleList);
-        } else {
-            LOG.error("Undefined LayerProtocolName for {} node {}", nodeNames.get(nodeNames.keySet().iterator().next())
-                .getValueName(), nodeNames.get(nodeNames.keySet().iterator().next()).getValue());
+        int numNeps = 0;
+        int numSips = 0;
+        List<Node> nodeList = new ArrayList<Node>(openroadmTopo.getNode().values());
+        for (Node node:nodeList) {
+            var node1 = node.augmentation(
+                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class);
+            String nodeId = node.getNodeId().getValue();
+            if (node.augmentation(Node1.class) == null && node1 == null) {
+                LOG.warn("Abstracted node {} doesnt have type of node or is not disaggregated", nodeId);
+                continue;
+            }
+            OpenroadmNodeType nodeType = node.augmentation(
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class)
+                .getNodeType();
+            if (nodeType.getIntValue() != 11) {
+                // Only consider ROADMS SRG Nodes
+                continue;
+            }
+            LOG.debug("Handling SRG node in Topology abstraction {}", nodeId);
+            // Get only external TPs of the srg
+            List<TerminationPoint> srgPortList = node1.getTerminationPoint().values().stream()
+                .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
+                        == OpenroadmTpType.SRGTXRXPP.getIntValue()
+                    || tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
+                        == OpenroadmTpType.SRGRXPP.getIntValue()
+                    || tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
+                        == OpenroadmTpType.SRGTXPP.getIntValue())
+                .collect(Collectors.toList());
+            // Convert TP List in NEPs and put it in onepl
+            LOG.debug("Srg port List: {}", srgPortList);
+            oneMap.putAll(populateNepsForRdmNode(nodeId, srgPortList, true, TapiStringConstants.PHTNC_MEDIA_OTS));
+            numNeps += srgPortList.size();
+            numSips += srgPortList.size();
         }
-        // Empty random creation of mandatory fields for avoiding errors....
-        CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
-            .setCostAlgorithm("Restricted Shortest Path - RSP")
-            .setCostName("HOP_COUNT")
-            .setCostValue("12345678")
-            .build();
-        LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
-            .setFixedLatencyCharacteristic("12345678")
-            .setQueingLatencyCharacteristic("12345678")
-            .setJitterCharacteristic("12345678")
-            .setWanderCharacteristic("12345678")
-            .setTrafficPropertyName("FIXED_LATENCY")
-            .build();
-        return new NodeBuilder()
-            .setUuid(nodeUuid)
-            .setName(nodeNames)
-            .setLayerProtocolName(layerProtocols)
-            .setAdministrativeState(this.tapiLink.setTapiAdminState(this.ietfNodeAdminState.getName()))
-            .setOperationalState(this.tapiLink.setTapiOperationalState(this.ietfNodeOperState.getName()))
-            .setLifecycleState(LifecycleState.INSTALLED)
-            .setOwnedNodeEdgePoint(onepl)
-            .setNodeRuleGroup(nodeRuleGroupList)
-            .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
-            .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
-            .setErrorCharacteristic("error")
-            .setLossCharacteristic("loss")
-            .setRepeatDeliveryCharacteristic("repeat delivery")
-            .setDeliveryOrderCharacteristic("delivery order")
-            .setUnavailableTimeCharacteristic("unavailable time")
-            .setServerIntegrityProcessCharacteristic("server integrity process")
-            .build();
+        // create a unique ROADM tapi Node
+        LOG.info("abstraction of the ROADM infrastructure towards a photonic node");
+        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(
+                    TapiStringConstants.RDM_INFRA.getBytes(Charset.forName("UTF-8")))
+                .toString());
+        Name nodeName =
+            new NameBuilder().setValueName("roadm node name").setValue(TapiStringConstants.RDM_INFRA).build();
+        Name nameNodeType =
+            new NameBuilder().setValueName("Node Type").setValue(OpenroadmNodeType.ROADM.getName()).build();
+        // Build tapi node
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node roadmNode =
+            createRoadmTapiNode(
+                nodeUuid,
+                Map.of(nodeName.key(), nodeName, nameNodeType.key(), nameNodeType),
+                Set.of(LayerProtocolName.PHOTONICMEDIA),
+                oneMap,
+                "Abstracted");
+        // TODO add states corresponding to device config
+        LOG.info("ROADM node {} should have {} NEPs and {} SIPs", TapiStringConstants.RDM_INFRA, numNeps, numSips);
+        LOG.info("ROADM node {} has {} NEPs and {} SIPs",
+            TapiStringConstants.RDM_INFRA,
+            roadmNode.nonnullOwnedNodeEdgePoint().values().size(),
+            roadmNode.nonnullOwnedNodeEdgePoint().values().stream()
+                .filter(nep -> nep.getMappedServiceInterfacePoint() != null)
+                .count());
+        tapiNodes.put(roadmNode.key(), roadmNode);
     }
 
-    private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node
-            createRoadmTapiNode(Uuid nodeUuid, Map<NameKey, Name> nameMap, List<LayerProtocolName> layerProtocols,
-                        Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> oneplist) {
+    private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node createRoadmTapiNode(
+            Uuid nodeUuid, Map<NameKey, Name> nameMap, Set<LayerProtocolName> layerProtocols,
+            Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap, String topoMode) {
         // Empty random creation of mandatory fields for avoiding errors....
-        CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
-            .setCostAlgorithm("Restricted Shortest Path - RSP")
-            .setCostName("HOP_COUNT")
-            .setCostValue("12345678")
-            .build();
-        LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
-            .setFixedLatencyCharacteristic("12345678")
-            .setQueingLatencyCharacteristic("12345678")
-            .setJitterCharacteristic("12345678")
-            .setWanderCharacteristic("12345678")
-            .setTrafficPropertyName("FIXED_LATENCY")
-            .build();
+        CostCharacteristic costCharacteristic =
+            new CostCharacteristicBuilder()
+                .setCostAlgorithm("Restricted Shortest Path - RSP")
+                .setCostName("HOP_COUNT")
+                .setCostValue(TapiStringConstants.COST_HOP_VALUE)
+                .build();
+        LatencyCharacteristic latencyCharacteristic =
+            new LatencyCharacteristicBuilder()
+                .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
+                .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
+                .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
+                .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
+                .setTrafficPropertyName("FIXED_LATENCY")
+                .build();
+        RiskCharacteristic riskCharacteristic =
+            new RiskCharacteristicBuilder()
+                .setRiskCharacteristicName("risk characteristic")
+                .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
+                .build();
+
+        var tapiFactory = new ConvertORToTapiTopology(this.tapiTopoUuid);
+        String choosenMode = topoMode.equals("Full") ? "Full" : "Abstracted";
+        Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap =
+            tapiFactory.createAllNodeRuleGroupForRdmNode(choosenMode, nodeUuid, this.ietfNodeId, onepMap.values());
         return new NodeBuilder()
             .setUuid(nodeUuid)
             .setName(nameMap)
@@ -461,10 +366,18 @@ public class ConvertORTopoToTapiFullTopo {
             .setAdministrativeState(AdministrativeState.UNLOCKED)
             .setOperationalState(OperationalState.ENABLED)
             .setLifecycleState(LifecycleState.INSTALLED)
-            .setOwnedNodeEdgePoint(oneplist)
-            .setNodeRuleGroup(createNodeRuleGroupForRdmNode(nodeUuid, oneplist.values()))
+            .setOwnedNodeEdgePoint(onepMap)
+            .setNodeRuleGroup(nodeRuleGroupMap)
+            .setInterRuleGroup(
+                tapiFactory.createInterRuleGroupForRdmNode(
+                    choosenMode, nodeUuid, this.ietfNodeId,
+                    nodeRuleGroupMap.entrySet().stream().map(e -> e.getKey()).collect(Collectors.toList())))
             .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
             .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
+            .setRiskParameterPac(
+                new RiskParameterPacBuilder()
+                    .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
+                    .build())
             .setErrorCharacteristic("error")
             .setLossCharacteristic("loss")
             .setRepeatDeliveryCharacteristic("repeat delivery")
@@ -474,635 +387,159 @@ public class ConvertORTopoToTapiFullTopo {
             .build();
     }
 
-    private Uuid getNodeUuid4Photonic(Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl,
-                                      Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList,
-                                      Map<RuleKey, Rule> ruleList) {
-        Uuid nodeUuid;
-        nodeUuid = this.uuidMap.get(String.join("+", this.ietfNodeId, TapiStringConstants.OTSI));
-        // iNep creation on otsi node
-        for (int i = 0; i < oorNetworkPortList.size(); i++) {
-            LOG.info("NEP = {}", String.join("+", this.ietfNodeId, TapiStringConstants.I_OTSI,
-                oorNetworkPortList.get(i).getTpId().getValue()));
-            Uuid nepUuid1 = new Uuid(UUID.nameUUIDFromBytes(
-                (String.join("+", this.ietfNodeId, TapiStringConstants.I_OTSI,
-                    oorNetworkPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8")))
-                .toString());
-            this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.I_OTSI,
-                oorNetworkPortList.get(i).getTpId().getValue()), nepUuid1);
-            Name onedName = new NameBuilder()
-                .setValueName("iNodeEdgePoint")
-                .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.I_OTSI,
-                    oorNetworkPortList.get(i).getTpId().getValue()))
-                .build();
-
-            OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
-                LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true,
-                String.join("+", this.ietfNodeId, TapiStringConstants.I_OTSI));
-            onepl.put(onep.key(), onep);
-        }
-        // eNep creation on otsi node
-        for (int i = 0; i < oorNetworkPortList.size(); i++) {
-            LOG.info("NEP = {}", String.join("+", this.ietfNodeId, TapiStringConstants.E_OTSI,
-                oorNetworkPortList.get(i).getTpId().getValue()));
-            Uuid nepUuid2 = new Uuid(UUID.nameUUIDFromBytes(
-                (String.join("+", this.ietfNodeId, TapiStringConstants.E_OTSI,
-                    oorNetworkPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8")))
-                .toString());
-            this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.E_OTSI,
-                oorNetworkPortList.get(i).getTpId().getValue()), nepUuid2);
-            Name onedName = new NameBuilder()
-                .setValueName("eNodeEdgePoint")
-                .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.E_OTSI,
-                    oorNetworkPortList.get(i).getTpId().getValue()))
-                .build();
-
-            OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
-                LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, false,
-                String.join("+", this.ietfNodeId, TapiStringConstants.E_OTSI));
-            onepl.put(onep.key(), onep);
-        }
-        // Photonic Media Nep creation on otsi node
-        for (int i = 0; i < oorNetworkPortList.size(); i++) {
-            LOG.info("NEP = {}", String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA,
-                oorNetworkPortList.get(i).getTpId().getValue()));
-            Uuid nepUuid3 = new Uuid(UUID.nameUUIDFromBytes(
-                (String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA,
-                    oorNetworkPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8")))
-                .toString());
-            this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA,
-                oorNetworkPortList.get(i).getTpId().getValue()), nepUuid3);
-            Name onedName = new NameBuilder()
-                .setValueName("PhotMedNodeEdgePoint")
-                .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA,
-                    oorNetworkPortList.get(i).getTpId().getValue()))
-                .build();
-
-            OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
-                LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, false,
-                String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA));
-            onepl.put(onep.key(), onep);
-        }
-        // create NodeRuleGroup
-        int count = 1;
-        LOG.info("OTSi switching pool = {}", this.oorOduSwitchingPool.nonnullNonBlockingList().values());
-        for (TerminationPoint tp : this.oorNetworkPortList) {
-            Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePointKey,
-                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint>
-                nepList = new HashMap<>();
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
-                .NodeEdgePoint inep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
-                .node.rule.group.NodeEdgePointBuilder()
-                .setTopologyUuid(tapiTopoUuid)
-                .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, TapiStringConstants.OTSI)))
-                .setNodeEdgePointUuid(
-                    this.uuidMap.get(String.join("+", this.ietfNodeId, TapiStringConstants.I_OTSI,
-                        tp.getTpId().getValue())))
-                .build();
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
-                .NodeEdgePoint enep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
-                .node.rule.group.NodeEdgePointBuilder()
-                .setTopologyUuid(tapiTopoUuid)
-                .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, TapiStringConstants.OTSI)))
-                .setNodeEdgePointUuid(
-                    this.uuidMap.get(String.join("+", this.ietfNodeId, TapiStringConstants.E_OTSI,
-                        tp.getTpId().getValue())))
-                .build();
-            nepList.put(inep.key(), inep);
-            nepList.put(enep.key(), enep);
-            // Empty random creation of mandatory fields for avoiding errors....
-            CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
-                .setCostAlgorithm("Restricted Shortest Path - RSP")
-                .setCostName("HOP_COUNT")
-                .setCostValue("12345678")
-                .build();
-            LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
-                .setFixedLatencyCharacteristic("12345678")
-                .setQueingLatencyCharacteristic("12345678")
-                .setJitterCharacteristic("12345678")
-                .setWanderCharacteristic("12345678")
-                .setTrafficPropertyName("FIXED_LATENCY")
-                .build();
-            RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
-                .setRiskCharacteristicName("risk characteristic")
-                .setRiskIdentifierList(List.of("risk identifier1", "risk identifier2"))
-                .build();
-            NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
-                .setUuid(new Uuid(
-                    UUID.nameUUIDFromBytes(("otsi node rule group " + count).getBytes(Charset.forName("UTF-8")))
-                        .toString()))
-                .setRule(ruleList)
-                .setNodeEdgePoint(nepList)
-                .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
-                .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
-                .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
-                .build();
-            nodeRuleGroupList.put(nodeRuleGroup.key(), nodeRuleGroup);
-            count++;
-        }
-        return nodeUuid;
-    }
-
-    private Uuid getNodeUuid4Dsr(Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl,
-                                 Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList, Map<RuleKey, Rule> ruleList) {
-        Uuid nodeUuid;
-        nodeUuid = this.uuidMap.get(String.join("+", this.ietfNodeId, TapiStringConstants.DSR));
-        // client nep creation on DSR node
-        for (int i = 0; i < oorClientPortList.size(); i++) {
-            LOG.info("NEP = {}", String.join("+", this.ietfNodeId, TapiStringConstants.DSR,
-                oorClientPortList.get(i).getTpId().getValue()));
-            Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
-                (String.join("+", this.ietfNodeId, TapiStringConstants.DSR,
-                    oorClientPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8"))).toString());
-            this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.DSR,
-                    oorClientPortList.get(i).getTpId().getValue()), nepUuid);
-            NameBuilder nameBldr = new NameBuilder().setValue(
-                String.join("+", this.ietfNodeId, TapiStringConstants.DSR,
-                    oorClientPortList.get(i).getTpId().getValue()));
-            Name name;
-            if (OpenroadmNodeType.TPDR.equals(this.ietfNodeType)) {
-                name = nameBldr.setValueName("100G-tpdr").build();
-            } else {
-                name = nameBldr.setValueName("NodeEdgePoint_C").build();
-            }
-
-            OwnedNodeEdgePoint onep = createNep(oorClientPortList.get(i), Map.of(name.key(), name),
-                LayerProtocolName.DSR, LayerProtocolName.DSR, true, String.join("+", this.ietfNodeId,
-                    TapiStringConstants.DSR));
-            onepl.put(onep.key(), onep);
-        }
-        // network nep creation on I_ODU node
-        for (int i = 0; i < oorNetworkPortList.size(); i++) {
-            LOG.info("NEP = {}", String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU,
-                oorNetworkPortList.get(i).getTpId().getValue()));
-            Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
-                (String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU,
-                    oorNetworkPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8"))).toString());
-            this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU,
-                oorNetworkPortList.get(i).getTpId().getValue()), nepUuid);
-            Name onedName = new NameBuilder()
-                .setValueName("iNodeEdgePoint_N")
-                .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU,
-                    oorNetworkPortList.get(i).getTpId().getValue()))
-                .build();
-
-            OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
-                LayerProtocolName.ODU, LayerProtocolName.DSR, true, String.join("+", this.ietfNodeId,
-                    TapiStringConstants.I_ODU));
-            onepl.put(onep.key(), onep);
-        }
-        // network nep creation on E_ODU node
-        for (int i = 0; i < oorClientPortList.size(); i++) {
-            LOG.info("NEP = {}", String.join("+", this.ietfNodeId, TapiStringConstants.E_ODU,
-                oorClientPortList.get(i).getTpId().getValue()));
-            Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
-                (String.join("+", this.ietfNodeId, TapiStringConstants.E_ODU,
-                    oorClientPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8"))).toString());
-            this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.E_ODU,
-                oorClientPortList.get(i).getTpId().getValue()), nepUuid);
-            Name onedName = new NameBuilder()
-                .setValueName("eNodeEdgePoint_N")
-                .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.E_ODU,
-                    oorClientPortList.get(i).getTpId().getValue()))
-                .build();
-
-            OwnedNodeEdgePoint onep = createNep(oorClientPortList.get(i), Map.of(onedName.key(), onedName),
-                LayerProtocolName.ODU, LayerProtocolName.DSR, false, String.join("+", this.ietfNodeId,
-                    TapiStringConstants.E_ODU));
-            onepl.put(onep.key(), onep);
-        }
-        // create NodeRuleGroup
-        int count = 1;
-        LOG.info("ODU switching pool = {}", this.oorOduSwitchingPool.nonnullNonBlockingList().values());
-        for (NonBlockingList nbl : this.oorOduSwitchingPool.nonnullNonBlockingList().values()) {
-            Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePointKey,
-                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint>
-                nepList = new HashMap<>();
-            LOG.info("UUidMap={}", this.uuidMap.keySet());
-            LOG.info("TP list = {}", nbl.getTpList());
-            for (TpId tp : nbl.getTpList()) {
-                LOG.info("TP={}", tp.getValue());
-                LOG.info("UuidKey={}", String.join("+", this.ietfNodeId,
-                    TapiStringConstants.E_ODU, tp.getValue()));
-                if (this.uuidMap.containsKey(String.join("+", this.ietfNodeId,
-                            TapiStringConstants.E_ODU, tp.getValue()))
-                        && this.uuidMap.containsKey(String.join("+", this.ietfNodeId,
-                            TapiStringConstants.DSR, tp.getValue()))) {
-                    org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint
-                        nep1 = new org.opendaylight.yang.gen.v1.urn
-                        .onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePointBuilder()
-                        .setTopologyUuid(tapiTopoUuid)
-                        .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId,
-                            TapiStringConstants.DSR)))
-                        .setNodeEdgePointUuid(this.uuidMap.get(String.join(
-                            "+", this.ietfNodeId, TapiStringConstants.DSR, tp.getValue())))
-                        .build();
-                    org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint
-                        nep2 = new org.opendaylight.yang.gen.v1.urn
-                        .onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePointBuilder()
-                        .setTopologyUuid(tapiTopoUuid)
-                        .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId,
-                            TapiStringConstants.DSR)))
-                        .setNodeEdgePointUuid(this.uuidMap.get(String.join(
-                            "+", this.ietfNodeId, TapiStringConstants.E_ODU, tp.getValue())))
-                        .build();
-                    nepList.put(nep1.key(), nep1);
-                    nepList.put(nep2.key(), nep2);
-                }
-            }
-            // Empty random creation of mandatory fields for avoiding errors....
-            CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
-                .setCostAlgorithm("Restricted Shortest Path - RSP")
-                .setCostName("HOP_COUNT")
-                .setCostValue("12345678")
-                .build();
-            LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
-                .setFixedLatencyCharacteristic("12345678")
-                .setQueingLatencyCharacteristic("12345678")
-                .setJitterCharacteristic("12345678")
-                .setWanderCharacteristic("12345678")
-                .setTrafficPropertyName("FIXED_LATENCY")
-                .build();
-            RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
-                .setRiskCharacteristicName("risk characteristic")
-                .setRiskIdentifierList(List.of("risk identifier1", "risk identifier2"))
-                .build();
-            NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
-                .setUuid(new Uuid(UUID.nameUUIDFromBytes(("dsr node rule group " + count)
-                    .getBytes(Charset.forName("UTF-8"))).toString()))
-                .setRule(ruleList)
-                .setNodeEdgePoint(nepList)
-                .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
-                .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
-                .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
-                .build();
-            nodeRuleGroupList.put(nodeRuleGroup.key(), nodeRuleGroup);
-            count++;
-        }
-        return nodeUuid;
-    }
-
-    private OwnedNodeEdgePoint createNep(TerminationPoint oorTp, Map<NameKey, Name> nepNames,
-                                         LayerProtocolName nepProtocol, LayerProtocolName nodeProtocol, boolean withSip,
-                                         String keyword) {
-        String key = String.join("+", keyword, oorTp.getTpId().getValue());
-        OwnedNodeEdgePointBuilder onepBldr = new OwnedNodeEdgePointBuilder()
-            .setUuid(this.uuidMap.get(key))
-            .setLayerProtocolName(nepProtocol)
-            .setName(nepNames);
-        if (withSip) {
-            onepBldr.setMappedServiceInterfacePoint(createMSIP(1, nepProtocol, oorTp, keyword));
-        }
-        AdministrativeState adminState = null;
-        OperationalState operState = null;
-        if (oorTp.augmentation(TerminationPoint1.class).getAdministrativeState() != null) {
-            adminState = this.tapiLink.setTapiAdminState(oorTp.augmentation(TerminationPoint1.class)
-                .getAdministrativeState().getName());
-        }
-        if (oorTp.augmentation(TerminationPoint1.class).getOperationalState() != null) {
-            operState = this.tapiLink.setTapiOperationalState(oorTp.augmentation(TerminationPoint1.class)
-                .getOperationalState().getName());
-        }
-        onepBldr.setSupportedCepLayerProtocolQualifier(createSupportedLayerProtocolQualifier(oorTp, nepProtocol))
-            .setLinkPortDirection(PortDirection.BIDIRECTIONAL)
-            .setLinkPortRole(PortRole.SYMMETRIC)
-            .setAdministrativeState(adminState)
-            .setOperationalState(operState)
-            .setLifecycleState(LifecycleState.INSTALLED)
-            .setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
-            .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL);
-        return onepBldr.build();
-    }
-
-    private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> populateNepsForRdmNode(List<TerminationPoint> tpList,
-                                                                                  boolean withSip) {
-        // create neps for MC and OTSiMC and Photonic Media
+    public Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> populateNepsForRdmNode(
+            String nodeId, List<TerminationPoint> tpList, boolean withSip, String nepPhotonicSublayer) {
+        // create neps for MC and and Photonic Media OTS/OMS
         Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
         for (TerminationPoint tp:tpList) {
+            String tpId = tp.getTpId().getValue();
             // Admin and oper state common for all tps
+            OpenroadmTpType tpType = tp.augmentation(TerminationPoint1.class).getTpType();
+            // PHOTONIC MEDIA nep
+            LOG.debug("PHOTO NEP = {}",
+                String.join("+", this.ietfNodeId, nepPhotonicSublayer, tpId));
+            SupportedCepLayerProtocolQualifierInstancesBuilder sclpqiBd =
+                new SupportedCepLayerProtocolQualifierInstancesBuilder()
+                    .setNumberOfCepInstances(Uint64.valueOf(1));
+            switch (nepPhotonicSublayer) {
+                case TapiStringConstants.PHTNC_MEDIA_OMS:
+                    sclpqiBd.setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROMS.VALUE);
+                    break;
+                case TapiStringConstants.PHTNC_MEDIA_OTS:
+                    sclpqiBd.setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE);
+                    break;
+                case TapiStringConstants.MC:
+                    sclpqiBd.setLayerProtocolQualifier(PHOTONICLAYERQUALIFIERMC.VALUE);
+                    break;
+                case TapiStringConstants.OTSI_MC:
+                    sclpqiBd.setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTSiMC.VALUE);
+                    break;
+                default:
+                    break;
+            }
+            //List<SupportedCepLayerProtocolQualifierInstances> sclpqiList = new ArrayList<>(List.of(sclpqiBd.build()));
+            OwnedNodeEdgePointBuilder onepBd = new OwnedNodeEdgePointBuilder();
+            if (!nepPhotonicSublayer.equals(TapiStringConstants.MC)
+                    && !nepPhotonicSublayer.equals(TapiStringConstants.OTSI_MC)) {
+                ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(this.tapiTopoUuid);
+                Map<Double,Double> usedFreqMap = new HashMap<>();
+                Map<Double,Double> availableFreqMap = new HashMap<>();
+                switch (tpType) {
+                    // Whatever is the TP and its type we consider that it is handled in a bidirectional way :
+                    // same wavelength(s) used in both direction.
+                    case SRGRXPP:
+                    case SRGTXPP:
+                    case SRGTXRXPP:
+                        usedFreqMap = tapiFactory.getPPUsedWavelength(tp);
+                        if (usedFreqMap == null || usedFreqMap.isEmpty()) {
+                            availableFreqMap.put(GridConstant.START_EDGE_FREQUENCY * 1E09,
+                                GridConstant.START_EDGE_FREQUENCY * 1E09
+                                + GridConstant.GRANULARITY * GridConstant.EFFECTIVE_BITS * 1E06);
+                        } else {
+                            LOG.debug("EnteringLOOPcreateOTSiMC & MC with usedFreqMap non empty {} NEP {} for Node {}",
+                                usedFreqMap,
+                                String.join("+", this.ietfNodeId, nepPhotonicSublayer, tpId),
+                                nodeId);
+                            onepMap.putAll(populateNepsForRdmNode(
+                                nodeId, new ArrayList<>(List.of(tp)), true, TapiStringConstants.MC));
+                            onepMap.putAll(populateNepsForRdmNode(
+                                nodeId, new ArrayList<>(List.of(tp)), true, TapiStringConstants.OTSI_MC));
+                        }
+                        break;
+                    case DEGREERXTTP:
+                    case DEGREETXTTP:
+                    case DEGREETXRXTTP:
+                        usedFreqMap = tapiFactory.getTTPUsedFreqMap(tp);
+                        availableFreqMap = tapiFactory.getTTPAvailableFreqMap(tp);
+                        break;
+                    default:
+                        break;
+                }
+                LOG.debug("calling add Photonic NEP spec for Roadm");
+                onepBd = tapiFactory.addPhotSpecToRoadmOnep(
+                    nodeId, usedFreqMap, availableFreqMap, onepBd, nepPhotonicSublayer);
+            }
             AdminStates admin = tp.augmentation(TerminationPoint1.class).getAdministrativeState();
             State oper = tp.augmentation(TerminationPoint1.class).getOperationalState();
-            // PHOTONIC MEDIA nep
-            LOG.info("PHOTO NEP = {}", String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA,
-                tp.getTpId().getValue()));
             Name nepName = new NameBuilder()
-                .setValueName(TapiStringConstants.PHTNC_MEDIA + "NodeEdgePoint")
-                .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.PHTNC_MEDIA,
-                    tp.getTpId().getValue()))
+                .setValueName(nepPhotonicSublayer + "NodeEdgePoint")
+                .setValue(String.join("+", this.ietfNodeId, nepPhotonicSublayer, tpId))
                 .build();
-
-            OwnedNodeEdgePoint onep = new OwnedNodeEdgePointBuilder()
-                .setUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", this.ietfNodeId,
-                    TapiStringConstants.PHTNC_MEDIA, tp.getTpId().getValue()))
-                    .getBytes(Charset.forName("UTF-8"))).toString()))
+            OwnedNodeEdgePoint onep = onepBd
+                .setUuid(new Uuid(UUID.nameUUIDFromBytes(
+                        (String.join("+", this.ietfNodeId, nepPhotonicSublayer, tpId))
+                            .getBytes(Charset.forName("UTF-8")))
+                    .toString()))
                 .setLayerProtocolName(LayerProtocolName.PHOTONICMEDIA)
                 .setName(Map.of(nepName.key(), nepName))
-                .setSupportedCepLayerProtocolQualifier(List.of(PHOTONICLAYERQUALIFIEROMS.class))
-                .setLinkPortDirection(PortDirection.BIDIRECTIONAL)
+                .setSupportedCepLayerProtocolQualifierInstances(
+                    new ArrayList<>(List.of(
+                        new SupportedCepLayerProtocolQualifierInstancesBuilder()
+                            .setLayerProtocolQualifier(
+                                TapiStringConstants.PHTNC_MEDIA_OMS.equals(nepPhotonicSublayer)
+                                    ? PHOTONICLAYERQUALIFIEROMS.VALUE
+                                    : PHOTONICLAYERQUALIFIEROTS.VALUE)
+                            .setNumberOfCepInstances(Uint64.valueOf(1))
+                            .build())))
+                .setDirection(Direction.BIDIRECTIONAL)
                 .setLinkPortRole(PortRole.SYMMETRIC)
                 .setAdministrativeState(this.tapiLink.setTapiAdminState(admin.getName()))
                 .setOperationalState(this.tapiLink.setTapiOperationalState(oper.getName()))
                 .setLifecycleState(LifecycleState.INSTALLED)
-                .setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
-                .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL)
                 .build();
             onepMap.put(onep.key(), onep);
-
-            // MC nep
-            LOG.info("MC NEP = {}", String.join("+", this.ietfNodeId, TapiStringConstants.MC,
-                tp.getTpId().getValue()));
-            Name nepName1 = new NameBuilder()
-                .setValueName(TapiStringConstants.MC + "NodeEdgePoint")
-                .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.MC, tp.getTpId().getValue()))
-                .build();
-            OwnedNodeEdgePointBuilder onepBldr1 = new OwnedNodeEdgePointBuilder()
-                .setUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", this.ietfNodeId,
-                    TapiStringConstants.MC, tp.getTpId().getValue())).getBytes(Charset.forName("UTF-8"))).toString()))
-                .setLayerProtocolName(LayerProtocolName.PHOTONICMEDIA)
-                .setName(Map.of(nepName1.key(), nepName1))
-                .setSupportedCepLayerProtocolQualifier(List.of(PHOTONICLAYERQUALIFIEROMS.class))
-                .setLinkPortDirection(PortDirection.BIDIRECTIONAL)
-                .setLinkPortRole(PortRole.SYMMETRIC)
-                .setAdministrativeState(this.tapiLink.setTapiAdminState(admin.getName()))
-                .setOperationalState(this.tapiLink.setTapiOperationalState(oper.getName()))
-                .setLifecycleState(LifecycleState.INSTALLED)
-                .setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
-                .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL);
-            if (withSip) {
-                onepBldr1.setMappedServiceInterfacePoint(createMSIP(1, LayerProtocolName.PHOTONICMEDIA,
-                    tp, String.join("+", this.ietfNodeId, TapiStringConstants.MC)));
-            }
-            OwnedNodeEdgePoint onep1 = onepBldr1.build();
-            onepMap.put(onep1.key(), onep1);
-
-            // OTSiMC nep
-            LOG.info("OTSi NEP = {}", String.join("+", this.ietfNodeId, TapiStringConstants.OTSI_MC,
-                tp.getTpId().getValue()));
-            Name nepName2 = new NameBuilder()
-                .setValueName(TapiStringConstants.OTSI_MC + "NodeEdgePoint")
-                .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.OTSI_MC,
-                    tp.getTpId().getValue()))
-                .build();
-
-            OwnedNodeEdgePoint onep2 = new OwnedNodeEdgePointBuilder()
-                .setUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", this.ietfNodeId,
-                        TapiStringConstants.OTSI_MC, tp.getTpId().getValue())).getBytes(Charset.forName("UTF-8")))
-                    .toString()))
-                .setLayerProtocolName(LayerProtocolName.PHOTONICMEDIA)
-                .setName(Map.of(nepName2.key(), nepName2))
-                .setSupportedCepLayerProtocolQualifier(List.of(PHOTONICLAYERQUALIFIEROMS.class))
-                .setLinkPortDirection(PortDirection.BIDIRECTIONAL)
-                .setLinkPortRole(PortRole.SYMMETRIC)
-                .setAdministrativeState(this.tapiLink.setTapiAdminState(admin.getName()))
-                .setOperationalState(this.tapiLink.setTapiOperationalState(oper.getName()))
-                .setLifecycleState(LifecycleState.INSTALLED)
-                .setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
-                .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL)
-                .build();
-            onepMap.put(onep2.key(), onep2);
         }
         return onepMap;
     }
 
-    private Map<NodeRuleGroupKey, NodeRuleGroup> createNodeRuleGroupForRdmNode(Uuid nodeUuid,
-                                                                               Collection<OwnedNodeEdgePoint> onepl) {
-        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePointKey,
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint>
-            nepMap = new HashMap<>();
-        for (OwnedNodeEdgePoint onep : onepl) {
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint
-                nep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
-                .NodeEdgePointBuilder()
-                .setTopologyUuid(tapiTopoUuid)
-                .setNodeUuid(nodeUuid)
-                .setNodeEdgePointUuid(onep.key().getUuid())
-                .build();
-            nepMap.put(nep.key(), nep);
-        }
-        Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap = new HashMap<>();
-        Map<RuleKey, Rule> ruleList = new HashMap<>();
-        Rule rule = new RuleBuilder()
-            .setLocalId("forward")
-            .setForwardingRule(ForwardingRule.MAYFORWARDACROSSGROUP)
-            .setRuleType(RuleType.FORWARDING)
-            .build();
-        ruleList.put(rule.key(), rule);
-        NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
-            .setUuid(new Uuid(UUID.nameUUIDFromBytes((this.ietfNodeId + " node rule group")
-                .getBytes(Charset.forName("UTF-8"))).toString()))
-            .setRule(ruleList)
-            .setNodeEdgePoint(nepMap)
-            .build();
-        nodeRuleGroupMap.put(nodeRuleGroup.key(), nodeRuleGroup);
-        return nodeRuleGroupMap;
-    }
-
-    private Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint> createMSIP(int nb,
-                                                                                        LayerProtocolName layerProtocol,
-                                                                                        TerminationPoint tp,
-                                                                                        String nodeid) {
-        // add them to SIP context
-        Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint> msipl = new HashMap<>();
-        for (int i = 0; i < nb; i++) {
-            LOG.info("SIP = {}", String.join("+", "SIP", nodeid, tp.getTpId().getValue()));
-            Uuid sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP", nodeid,
-                tp.getTpId().getValue())).getBytes(Charset.forName("UTF-8"))).toString());
-            MappedServiceInterfacePoint msip = new MappedServiceInterfacePointBuilder()
-                .setServiceInterfacePointUuid(sipUuid).build();
-            ServiceInterfacePoint sip = createSIP(sipUuid, layerProtocol, tp, nodeid);
-            this.tapiSips.put(sip.key(), sip);
-            msipl.put(msip.key(), msip);
-        }
-        return msipl;
-    }
-
-    private ServiceInterfacePoint createSIP(Uuid sipUuid, LayerProtocolName layerProtocol, TerminationPoint tp,
-                                            String nodeid) {
-        // TODO: what value should be set in total capacity and available capacity??
-        // LOG.info("SIP name = {}", String.join("+", nodeid, tp.getTpId().getValue()));
-        Name sipName = new NameBuilder()
-            .setValueName("SIP name")
-            .setValue(String.join("+", nodeid, tp.getTpId().getValue()))
-            .build();
-        AdministrativeState adminState = null;
-        OperationalState operState = null;
-        if (tp.augmentation(TerminationPoint1.class).getAdministrativeState() != null) {
-            adminState = this.tapiLink.setTapiAdminState(tp.augmentation(TerminationPoint1.class)
-                .getAdministrativeState().getName());
-        }
-        if (tp.augmentation(TerminationPoint1.class).getOperationalState() != null) {
-            operState = this.tapiLink.setTapiOperationalState(tp.augmentation(TerminationPoint1.class)
-                .getOperationalState().getName());
-        }
-        return new ServiceInterfacePointBuilder()
-            .setUuid(sipUuid)
-            .setName(Map.of(sipName.key(), sipName))
-            .setLayerProtocolName(layerProtocol)
-            .setAdministrativeState(adminState)
-            .setOperationalState(operState)
-            .setLifecycleState(LifecycleState.INSTALLED)
-            .setAvailableCapacity(new AvailableCapacityBuilder().build())
-            .setTotalPotentialCapacity(new TotalPotentialCapacityBuilder().build())
-            .setSupportedLayerProtocolQualifier(createSupportedLayerProtocolQualifier(tp, layerProtocol))
-            .build();
-    }
-
-    private List<Class<? extends LAYERPROTOCOLQUALIFIER>> createSupportedLayerProtocolQualifier(TerminationPoint tp,
-                                                                                                LayerProtocolName lpn) {
-        Set<Class<? extends LAYERPROTOCOLQUALIFIER>> sclpqSet = new HashSet<>();
-        List<SupportedInterfaceCapability> sicList;
-        org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.TerminationPoint1 tp1 =
-            tp.augmentation(org.opendaylight.yang.gen.v1.http
-                .org.openroadm.otn.network.topology.rev211210.TerminationPoint1.class);
-        if (tp1 == null) {
-            return new ArrayList<>(sclpqSet);
-        }
-        if (tp1.getTpSupportedInterfaces() == null) {
-            LOG.warn("Tp supported interface doesnt exist on TP {}", tp.getTpId().getValue());
-            return new ArrayList<>(sclpqSet);
-        }
-        sicList = new ArrayList<>(tp1.getTpSupportedInterfaces().getSupportedInterfaceCapability().values());
-        for (SupportedInterfaceCapability sic : sicList) {
-            switch (lpn.getName()) {
-                case "DSR":
-                    switch (sic.getIfCapType().getSimpleName()) {
-                        // TODO: it may be needed to add more cases clauses if the interface capabilities of a
-                        //  port are extended in the config file
-                        case "If1GEODU0":
-                            sclpqSet.add(ODUTYPEODU0.class);
-                            sclpqSet.add(DIGITALSIGNALTYPEGigE.class);
-                            break;
-                        case "If10GEODU2e":
-                            sclpqSet.add(ODUTYPEODU2E.class);
-                            sclpqSet.add(DIGITALSIGNALTYPE10GigELAN.class);
-                            break;
-                        case "If10GEODU2":
-                            sclpqSet.add(ODUTYPEODU2.class);
-                            sclpqSet.add(DIGITALSIGNALTYPE10GigELAN.class);
-                            break;
-                        case "If10GE":
-                            sclpqSet.add(DIGITALSIGNALTYPE10GigELAN.class);
-                            break;
-                        case "If100GEODU4":
-                            sclpqSet.add(DIGITALSIGNALTYPE100GigE.class);
-                            sclpqSet.add(ODUTYPEODU4.class);
-                            break;
-                        case "If100GE":
-                            sclpqSet.add(DIGITALSIGNALTYPE100GigE.class);
-                            break;
-                        case "IfOCHOTU4ODU4":
-                        case "IfOCH":
-                            sclpqSet.add(ODUTYPEODU4.class);
-                            break;
-                        default:
-                            LOG.error("IfCapability type not managed");
-                            break;
-                    }
-                    break;
-                case "ODU":
-                    switch (sic.getIfCapType().getSimpleName()) {
-                        // TODO: it may be needed to add more cases clauses if the interface capabilities of a
-                        //  port are extended in the config file
-                        case "If1GEODU0":
-                            sclpqSet.add(ODUTYPEODU0.class);
-                            break;
-                        case "If10GEODU2e":
-                            sclpqSet.add(ODUTYPEODU2E.class);
-                            break;
-                        case "If10GEODU2":
-                        case "If10GE":
-                            sclpqSet.add(ODUTYPEODU2.class);
-                            break;
-                        case "If100GEODU4":
-                        case "If100GE":
-                        case "IfOCHOTU4ODU4":
-                        case "IfOCH":
-                            sclpqSet.add(ODUTYPEODU4.class);
-                            break;
-                        default:
-                            LOG.error("IfCapability type not managed");
-                            break;
-                    }
-                    break;
-                case "PHOTONIC_MEDIA":
-                    if (sic.getIfCapType().getSimpleName().equals("IfOCHOTU4ODU4")
-                            || sic.getIfCapType().getSimpleName().equals("IfOCH")) {
-                        sclpqSet.add(PHOTONICLAYERQUALIFIEROTSi.class);
-                        sclpqSet.add(PHOTONICLAYERQUALIFIEROMS.class);
-                    }
-                    break;
-                default:
-                    LOG.error("Layer Protocol Name is unknown");
-                    break;
-            }
-        }
-        return new ArrayList<>(sclpqSet);
-    }
-
-    private void createTapiTransitionalLinks() {
-        for (TerminationPoint tp : this.oorNetworkPortList) {
-            Link transiLink = tapiLink.createTapiLink(this.ietfNodeId, tp.getTpId().getValue(), this.ietfNodeId,
-                tp.getTpId().getValue(), TapiStringConstants.TRANSITIONAL_LINK, TapiStringConstants.DSR,
-                TapiStringConstants.OTSI, TapiStringConstants.I_ODU, TapiStringConstants.I_OTSI,
-                "inService", "inService", Arrays.asList(LayerProtocolName.ODU,
-                    LayerProtocolName.PHOTONICMEDIA),
-                Arrays.asList(LayerProtocolName.ODU.getName(), LayerProtocolName.PHOTONICMEDIA.getName()),
-                this.tapiTopoUuid);
-            this.tapiLinks.put(transiLink.key(), transiLink);
-        }
-    }
-
-    public void convertXpdrToRdmLinks(List<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
-            .ietf.network.topology.rev180226.networks.network.Link> xpdrRdmLinkList) {
+    public void convertXpdrToRdmLinks(
+            List<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                .networks.network.Link> xpdrRdmLinkList) {
         List<String> linksToNotConvert = new ArrayList<>();
         LOG.info("creation of {} xpdr to roadm links", xpdrRdmLinkList.size() / 2);
-        // LOG.info("Link list = {}", xpdrRdmLinkList.toString());
-        for (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
-            .ietf.network.topology.rev180226.networks.network.Link link:xpdrRdmLinkList) {
-            if (!linksToNotConvert.contains(link.getLinkId().getValue())) {
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
-                    .ietf.network.topology.rev180226.networks.network.Link oppositeLink = xpdrRdmLinkList.stream()
-                    .filter(l -> l.getLinkId().equals(link.augmentation(Link1.class).getOppositeLink())).findAny()
-                    .orElse(null);
-
-                AdminStates oppLnkAdmState = null;
-                State oppLnkOpState = null;
-                if (oppositeLink != null) {
-                    oppLnkAdmState = oppositeLink.augmentation(Link1.class).getAdministrativeState();
-                    oppLnkOpState = oppositeLink.augmentation(Link1.class).getOperationalState();
-                }
-                String adminState =
-                    link.augmentation(Link1.class).getAdministrativeState() == null
-                        || oppLnkAdmState == null
-                    ? null
-                    : this.tapiLink.setTapiAdminState(
-                        link.augmentation(Link1.class).getAdministrativeState(), oppLnkAdmState).getName();
-                String operState =
-                    link.augmentation(Link1.class).getOperationalState() == null
-                        || oppLnkOpState == null
-                    ? null
-                    : this.tapiLink.setTapiOperationalState(
-                        link.augmentation(Link1.class).getOperationalState(), oppLnkOpState).getName();
-
-                String sourceNode = (link.getSource().getSourceNode().getValue().contains("ROADM"))
+        LOG.debug("Link list = {}", xpdrRdmLinkList);
+        for (var link:xpdrRdmLinkList) {
+            if (linksToNotConvert.contains(link.getLinkId().getValue())) {
+                continue;
+            }
+            var oppositeLink = xpdrRdmLinkList.stream()
+                .filter(l -> l.getLinkId().equals(link.augmentation(Link1.class).getOppositeLink()))
+                .findAny().orElse(null);
+            AdminStates oppLnkAdmState = null;
+            State oppLnkOpState = null;
+            if (oppositeLink != null) {
+                oppLnkAdmState = oppositeLink.augmentation(Link1.class).getAdministrativeState();
+                oppLnkOpState = oppositeLink.augmentation(Link1.class).getOperationalState();
+            }
+            String sourceNode =
+                link.getSource().getSourceNode().getValue().contains("ROADM")
                     ? getIdBasedOnModelVersion(link.getSource().getSourceNode().getValue())
                     : link.getSource().getSourceNode().getValue();
-                String sourceTp = link.getSource().getSourceTp().getValue();
-                String sourceNodeQual = sourceNode.contains("ROADM") ? TapiStringConstants.PHTNC_MEDIA
-                    : TapiStringConstants.OTSI;
-                String destNode = (link.getDestination().getDestNode().getValue().contains("ROADM"))
+            String destNode =
+                link.getDestination().getDestNode().getValue().contains("ROADM")
                     ? getIdBasedOnModelVersion(link.getDestination().getDestNode().getValue())
                     : link.getDestination().getDestNode().getValue();
-                String destTp = link.getDestination().getDestTp().getValue();
-                String destNodeQual = destNode.contains("ROADM") ? TapiStringConstants.PHTNC_MEDIA
-                    : TapiStringConstants.OTSI;
-                Link tapLink = this.tapiLink.createTapiLink(sourceNode, sourceTp, destNode, destTp,
-                    TapiStringConstants.OMS_XPDR_RDM_LINK, sourceNodeQual, destNodeQual,
-                    TapiStringConstants.PHTNC_MEDIA, TapiStringConstants.PHTNC_MEDIA, adminState,
-                    operState, List.of(LayerProtocolName.PHOTONICMEDIA),
-                    List.of(LayerProtocolName.PHOTONICMEDIA.getName()), this.tapiTopoUuid);
-                linksToNotConvert.add(link.augmentation(Link1.class).getOppositeLink().getValue());
-                this.tapiLinks.put(tapLink.key(), tapLink);
-            }
+            Link tapLink = this.tapiLink.createTapiLink(
+                sourceNode, link.getSource().getSourceTp().getValue(),
+                destNode, link.getDestination().getDestTp().getValue(),
+                TapiStringConstants.OMS_XPDR_RDM_LINK,
+                sourceNode.contains("ROADM") ? TapiStringConstants.PHTNC_MEDIA : TapiStringConstants.XPDR,
+                destNode.contains("ROADM") ? TapiStringConstants.PHTNC_MEDIA : TapiStringConstants.XPDR,
+                TapiStringConstants.PHTNC_MEDIA_OTS, TapiStringConstants.PHTNC_MEDIA_OTS,
+                //adminState,
+                link.augmentation(Link1.class).getAdministrativeState() == null || oppLnkAdmState == null
+                    ? null
+                    : this.tapiLink.setTapiAdminState(
+                        link.augmentation(Link1.class).getAdministrativeState(), oppLnkAdmState).getName(),
+                //operState,
+                link.augmentation(Link1.class).getOperationalState() == null || oppLnkOpState == null
+                    ? null
+                    : this.tapiLink.setTapiOperationalState(
+                        link.augmentation(Link1.class).getOperationalState(), oppLnkOpState).getName(),
+                Set.of(LayerProtocolName.PHOTONICMEDIA), Set.of(LayerProtocolName.PHOTONICMEDIA.getName()),
+                this.tapiTopoUuid);
+            linksToNotConvert.add(link.augmentation(Link1.class).getOppositeLink().getValue());
+            this.tapiLinks.put(tapLink.key(), tapLink);
         }
     }
 
@@ -1116,7 +553,12 @@ public class ConvertORTopoToTapiFullTopo {
         }
     }
 
-    public Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node>
+    public void setTapiNodes(Map<NodeKey,
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> nodeMap) {
+        this.tapiNodes.putAll(nodeMap);
+    }
+
+    public Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
             getTapiNodes() {
         return tapiNodes;
     }
@@ -1125,7 +567,19 @@ public class ConvertORTopoToTapiFullTopo {
         return tapiLinks;
     }
 
+    public void setTapiSips(Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSip) {
+        this.tapiSips.putAll(tapiSip);
+    }
+
     public Map<ServiceInterfacePointKey, ServiceInterfacePoint> getTapiSips() {
         return tapiSips;
     }
+
+    public static void setTopologicalMode(String topoMode) {
+        ConvertORTopoToTapiFullTopo.topologicalMode = topoMode;
+    }
+
+    public String getTopologicalMode() {
+        return topologicalMode;
+    }
 }
index 0d788c5c82be59739c5765be95bf94593289c5a7..e1cffb7982e1d9f8d10c448378562184530f0403 100644 (file)
@@ -9,11 +9,8 @@ package org.opendaylight.transportpce.tapi.topology;
 
 import java.nio.charset.Charset;
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -23,66 +20,46 @@ import java.util.UUID;
 import java.util.stream.Collectors;
 import org.opendaylight.transportpce.tapi.TapiStringConstants;
 import org.opendaylight.transportpce.tapi.utils.TapiLink;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.OduSwitchingPools;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.OduSwitchingPoolsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.network.topology.rev211210.Node1;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.AdministrativeState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.ForwardingDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LAYERPROTOCOLQUALIFIER;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LifecycleState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.OperationalState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortRole;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE100GigE;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE10GigELAN;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU2;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU2E;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU4;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROMS;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROTSi;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.ForwardingRule;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.RuleType;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.link.NodeEdgePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.link.NodeEdgePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.link.NodeEdgePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroup;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroupBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroupKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.Rule;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.RuleBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.RuleKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.LinkBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.LinkKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey;
-import org.opendaylight.yangtools.yang.common.Uint16;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Direction;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.ForwardingDirection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.PortRole;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTS;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.link.NodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.link.NodeEdgePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.link.NodeEdgePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroup;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.RiskParameterPacBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstancesBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristic;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristicBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristic;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristicBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristic;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristicBuilder;
+import org.opendaylight.yangtools.yang.common.Uint64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -90,18 +67,11 @@ import org.slf4j.LoggerFactory;
 public class ConvertORTopoToTapiTopo {
 
     private static final Logger LOG = LoggerFactory.getLogger(ConvertORTopoToTapiTopo.class);
-    private String ietfNodeId;
-    private OpenroadmNodeType ietfNodeType;
-    private AdminStates ietfNodeAdminState;
-    private State ietfNodeOperState;
-    private List<TerminationPoint> oorClientPortList;
-    private List<TerminationPoint> oorNetworkPortList;
-    private OduSwitchingPools oorOduSwitchingPool;
     private Uuid tapiTopoUuid;
-    private Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node>
+    private Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
         tapiNodes;
     private Map<LinkKey, Link> tapiLinks;
-    private Map<String, Uuid> uuidMap;
+    private Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSips;
     private final TapiLink tapiLink;
 
 
@@ -109,650 +79,253 @@ public class ConvertORTopoToTapiTopo {
         this.tapiTopoUuid = tapiTopoUuid;
         this.tapiNodes = new HashMap<>();
         this.tapiLinks = new HashMap<>();
-        this.uuidMap = new HashMap<>();
+        this.tapiSips = new HashMap<>();
         this.tapiLink = tapiLink;
     }
 
-    public void convertNode(Node ietfNode, List<String> networkPorts) {
-        this.ietfNodeId = ietfNode.getNodeId().getValue();
-        if (ietfNode.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1.class)
-                == null) {
-            return;
-        }
-        this.ietfNodeType = ietfNode.augmentation(
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1.class).getNodeType();
-        this.ietfNodeAdminState = ietfNode.augmentation(
-                org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1.class)
-            .getAdministrativeState();
-        this.ietfNodeOperState = ietfNode.augmentation(
-                org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1.class)
-            .getOperationalState();
-        this.oorNetworkPortList = ietfNode.augmentation(
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
-            .getTerminationPoint().values().stream()
-            .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
-                == OpenroadmTpType.XPONDERNETWORK.getIntValue()
-                && networkPorts.contains(tp.getTpId().getValue()))
-            .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
-            .collect(Collectors.toList());
-        if (!OpenroadmNodeType.TPDR.equals(this.ietfNodeType)) {
-            this.oorOduSwitchingPool = ietfNode.augmentation(Node1.class).getSwitchingPools().getOduSwitchingPools()
-                .values().stream().findFirst().get();
-            this.oorClientPortList = ietfNode.augmentation(
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
-                .getTerminationPoint().values().stream()
-                .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
-                    == OpenroadmTpType.XPONDERCLIENT.getIntValue())
-                .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
-                .collect(Collectors.toList());
-        } else {
-            this.oorOduSwitchingPool = createOduSwitchingPoolForTp100G();
-            List<TpId> tpList = this.oorOduSwitchingPool.getNonBlockingList().values().stream()
-                .flatMap(nbl -> nbl.getTpList().stream())
-                .collect(Collectors.toList());
-            this.oorClientPortList = ietfNode.augmentation(
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1.class)
-                .getTerminationPoint().values().stream()
-                .filter(tp -> tp.augmentation(TerminationPoint1.class).getTpType().getIntValue()
-                    == OpenroadmTpType.XPONDERCLIENT.getIntValue() && tpList.contains(tp.getTpId()))
-                .sorted((tp1, tp2) -> tp1.getTpId().getValue().compareTo(tp2.getTpId().getValue()))
-                .collect(Collectors.toList());
-            this.oorClientPortList.forEach(tp -> LOG.info("tp = {}", tp.getTpId()));
-        }
-
-        // node creation [DSR/ODU]
-        LOG.info("creation of a DSR/ODU node for {}", this.ietfNodeId);
-        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", this.ietfNodeId,
-            TapiStringConstants.DSR)).getBytes(Charset.forName("UTF-8"))).toString());
-        this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.DSR), nodeUuid);
-        Name nameDsr = new NameBuilder().setValueName("dsr/odu node name")
-            .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.DSR)).build();
-        Name nameNodeType = new NameBuilder().setValueName("Node Type")
-            .setValue(this.ietfNodeType.getName()).build();
-        List<LayerProtocolName> dsrLayerProtocols = Arrays.asList(LayerProtocolName.DSR, LayerProtocolName.ODU);
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
-            .Node dsrNode = createTapiNode(Map.of(nameDsr.key(), nameDsr, nameNodeType.key(), nameNodeType),
-            dsrLayerProtocols);
-        tapiNodes.put(dsrNode.key(), dsrNode);
-
-        // node creation [otsi]
-        LOG.info("creation of an OTSi node for {}", this.ietfNodeId);
-        nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", this.ietfNodeId, TapiStringConstants.OTSI))
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.OTSI), nodeUuid);
-        Name nameOtsi =  new NameBuilder().setValueName("otsi node name")
-            .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.OTSI)).build();
-        List<LayerProtocolName> otsiLayerProtocols = Arrays.asList(LayerProtocolName.PHOTONICMEDIA);
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology
-            .Node otsiNode = createTapiNode(Map.of(nameOtsi.key(), nameOtsi, nameNodeType.key(), nameNodeType),
-            otsiLayerProtocols);
-        tapiNodes.put(otsiNode.key(), otsiNode);
-
-        // transitional link cration between network nep of DSR/ODU node and iNep of otsi node
-        LOG.info("creation of transitional links between DSR/ODU and OTSi nodes");
-        createTapiTransitionalLinks();
-    }
-
     public void convertLinks(Map<
-            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
-                .LinkKey,
-            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
-                .Link> otnLinkMap) {
-        List<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
-            .Link> otnLinkList = new ArrayList<>(otnLinkMap.values());
-        Collections.sort(otnLinkList, (l1, l2) -> l1.getLinkId().getValue()
-            .compareTo(l2.getLinkId().getValue()));
+            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                .networks.network.LinkKey,
+            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                .networks.network.Link> otnLinkMap) {
+        List<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                .networks.network.Link> otnLinkList = new ArrayList<>(otnLinkMap.values());
+        Collections.sort(otnLinkList, (l1, l2) -> l1.getLinkId().getValue().compareTo(l2.getLinkId().getValue()));
         List<String> linksToNotConvert = new ArrayList<>();
         LOG.info("creation of {} otn links", otnLinkMap.size() / 2);
-        for (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
-                .Link otnlink : otnLinkList) {
-            if (!linksToNotConvert.contains(otnlink.getLinkId().getValue())) {
-                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks
-                    .network.Link oppositeLink = otnLinkMap.get(new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns
-                        .yang.ietf.network.topology.rev180226.networks.network.LinkKey(otnlink.augmentation(Link1.class)
-                    .getOppositeLink()));
-
-                AdminStates oppLnkAdmState = null;
-                State oppLnkOpState = null;
-                String oppositeLinkId = null;
-                if (oppositeLink != null) {
-                    oppLnkAdmState = oppositeLink.augmentation(Link1.class).getAdministrativeState();
-                    oppLnkOpState = oppositeLink.augmentation(Link1.class).getOperationalState();
-                    oppositeLinkId = oppositeLink.getLinkId().getValue();
-                }
-                String adminState =
-                    otnlink.augmentation(Link1.class).getAdministrativeState() == null
-                        || oppLnkAdmState == null
-                    ? null
+        for (var otnlink : otnLinkList) {
+            String otnlinkId = otnlink.getLinkId().getValue();
+            if (linksToNotConvert.contains(otnlinkId)) {
+                continue;
+            }
+            var otnlinkAug = otnlink.augmentation(Link1.class);
+            var oppositeLink = otnLinkMap.get(
+                new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                    .networks.network.LinkKey(otnlinkAug.getOppositeLink()));
+            AdminStates oppLnkAdmState = null;
+            State oppLnkOpState = null;
+            String oppositeLinkId = null;
+            if (oppositeLink != null) {
+                var oppositeLinkAug = oppositeLink.augmentation(Link1.class);
+                oppLnkAdmState = oppositeLinkAug.getAdministrativeState();
+                oppLnkOpState = oppositeLinkAug.getOperationalState();
+                oppositeLinkId = oppositeLink.getLinkId().getValue();
+            }
+            // TODO: Handle not only OTU4 but also other cases
+            String prefix = otnlinkId.split("-")[0];
+            String tpsQual = prefix.equals("OTU4") ? TapiStringConstants.I_OTSI : TapiStringConstants.E_ODU;
+            LayerProtocolName layerProtocolName =
+                prefix.equals("OTU4") ? LayerProtocolName.PHOTONICMEDIA : LayerProtocolName.ODU;
+            var otnlinkSrc = otnlink.getSource();
+            var otnlinkDst = otnlink.getDestination();
+            Link tapLink = this.tapiLink.createTapiLink(
+                otnlinkSrc.getSourceNode().getValue(),
+                otnlinkSrc.getSourceTp().getValue(),
+                otnlinkDst.getDestNode().getValue(),
+                otnlinkDst.getDestTp().getValue(),
+                TapiStringConstants.OTN_XPDR_XPDR_LINK,
+                // nodesQual, nodesQual,
+                TapiStringConstants.XPDR, TapiStringConstants.XPDR,
+                tpsQual, tpsQual,
+                otnlinkAug.getAdministrativeState() == null || oppLnkAdmState == null ? null
                     : this.tapiLink.setTapiAdminState(
-                        otnlink.augmentation(Link1.class).getAdministrativeState(), oppLnkAdmState).getName();
-                String operState = otnlink.augmentation(Link1.class).getOperationalState() == null
-                        || oppLnkOpState == null
-                    ? null
+                        otnlinkAug.getAdministrativeState(), oppLnkAdmState).getName(),
+                otnlinkAug.getOperationalState() == null || oppLnkOpState == null ? null
                     : this.tapiLink.setTapiOperationalState(
-                        otnlink.augmentation(Link1.class).getOperationalState(), oppLnkOpState).getName();
-
-                String prefix = otnlink.getLinkId().getValue().split("-")[0];
-                String nodesQual = prefix.equals("OTU4") ? TapiStringConstants.OTSI : TapiStringConstants.DSR;
-                String tpsQual = prefix.equals("OTU4") ? TapiStringConstants.I_OTSI : TapiStringConstants.E_ODU;
-                LayerProtocolName layerProtocolName = prefix.equals("OTU4") ? LayerProtocolName.PHOTONICMEDIA
-                    : LayerProtocolName.ODU;
-
-                Link tapLink = this.tapiLink.createTapiLink(otnlink.getSource().getSourceNode().getValue(),
-                    otnlink.getSource().getSourceTp().getValue(), otnlink.getDestination().getDestNode().getValue(),
-                    otnlink.getDestination().getDestTp().getValue(), TapiStringConstants.OTN_XPDR_XPDR_LINK, nodesQual,
-                    nodesQual, tpsQual, tpsQual, adminState, operState, List.of(layerProtocolName),
-                    List.of(layerProtocolName.getName()), this.tapiTopoUuid);
-                linksToNotConvert.add(oppositeLinkId);
-                tapiLinks.put(tapLink.key(), tapLink);
-            }
+                        otnlinkAug.getOperationalState(), oppLnkOpState).getName(),
+                Set.of(layerProtocolName),
+                Set.of(layerProtocolName.getName()),
+                this.tapiTopoUuid);
+            linksToNotConvert.add(oppositeLinkId);
+            tapiLinks.put(tapLink.key(), tapLink);
+            LOG.debug("Links converted are as follow  {}", tapiLinks);
         }
     }
 
     public void convertRoadmInfrastructure() {
         LOG.info("abstraction of the ROADM infrastructure towards a photonic node");
-        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.RDM_INFRA
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        Name nodeName =  new NameBuilder().setValueName("otsi node name").setValue(TapiStringConstants.RDM_INFRA)
-            .build();
-        Name nameNodeType = new NameBuilder().setValueName("Node Type")
-            .setValue(OpenroadmNodeType.ROADM.getName()).build();
-        List<LayerProtocolName> nodeLayerProtocols = Arrays.asList(LayerProtocolName.PHOTONICMEDIA);
-
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> tapiPhotonicNodes
-            = pruneTapiPhotonicNodes();
-        Map<String, String> photonicNepUuisMap = convertListNodeWithListNepToMapForUuidAndName(tapiPhotonicNodes);
+        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(
+                    TapiStringConstants.RDM_INFRA.getBytes(Charset.forName("UTF-8")))
+                .toString());
+        Name nodeName =
+            new NameBuilder().setValueName("otsi node name").setValue(TapiStringConstants.RDM_INFRA).build();
+        Name nodeName2 =
+            new NameBuilder().setValueName("roadm node name").setValue(TapiStringConstants.RDM_INFRA).build();
+        Name nameNodeType =
+            new NameBuilder().setValueName("Node Type").setValue(OpenroadmNodeType.ROADM.getName()).build();
+        Set<LayerProtocolName> nodeLayerProtocols = Set.of(LayerProtocolName.PHOTONICMEDIA);
+        //At that stage, there is no Roadm in the tapiPhotonicNodes Map / only the transponders
+        Map<String, String> photonicNepUuisMap =
+            convertListNodeWithListNepToMapForUuidAndName(pruneTapiPhotonicNodes());
         // nep creation for rdm infra abstraction node
         Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = createNepForRdmNode(photonicNepUuisMap.size());
         // node rule group creation
-        Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList
-            = createNodeRuleGroupForRdmNode(nodeUuid, onepMap.values());
+        var tapiFactory = new ConvertORToTapiTopology(this.tapiTopoUuid);
+        Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap
+            = tapiFactory.createAllNodeRuleGroupForRdmNode("T0ML", nodeUuid, null, onepMap.values());
+        // Empty random creation of mandatory fields for avoiding errors....
+        CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
+            .setCostAlgorithm("Restricted Shortest Path - RSP")
+            .setCostName("HOP_COUNT")
+            .setCostValue(TapiStringConstants.COST_HOP_VALUE)
+            .build();
+        LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
+            .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
+            .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
+            .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
+            .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
+            .setTrafficPropertyName("FIXED_LATENCY")
+            .build();
+        RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
+            .setRiskCharacteristicName("risk characteristic")
+            .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
+            .build();
         // build RDM infra node abstraction
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node rdmNode = new NodeBuilder()
+        var rdmNode = new NodeBuilder()
             .setUuid(nodeUuid)
-            .setName(Map.of(nodeName.key(), nodeName, nameNodeType.key(), nameNodeType))
+            .setName(Map.of(nodeName.key(), nodeName, nodeName2.key(), nodeName2, nameNodeType.key(), nameNodeType))
             .setLayerProtocolName(nodeLayerProtocols)
             .setAdministrativeState(AdministrativeState.UNLOCKED)
             .setOperationalState(OperationalState.ENABLED)
             .setLifecycleState(LifecycleState.INSTALLED)
             .setOwnedNodeEdgePoint(onepMap)
-            .setNodeRuleGroup(nodeRuleGroupList)
+            .setNodeRuleGroup(nodeRuleGroupMap)
+            .setInterRuleGroup(
+                tapiFactory.createInterRuleGroupForRdmNode("T0ML", nodeUuid, null,
+                    nodeRuleGroupMap.entrySet().stream().map(e -> e.getKey()).collect(Collectors.toList())))
+            .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
+            .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
+            .setRiskParameterPac(
+                new RiskParameterPacBuilder()
+                    .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
+                    .build())
             .build();
         tapiNodes.put(rdmNode.key(), rdmNode);
-
-        // OMS link creation between photonoci nodes and RDM infra abstraction node
+    // OTS link creation between photonic nodes and RDM infra abstraction node :
+      //onepMap is a list of nep which Uuid is formed from THE ROADM node name, "nep" and an integer (order of the nep)
+      // It has absolutely no relationship with the real ROADM infrastructure (SRG ports)
+      //rdmInfraNepUuisMap is a Map <ROADMnodeUuuid--NepUuid; ROADMnodeName--nepName> built from onepMap
+      //photonicNepUuisMap is a Map <TSPnodeUuuid--eNepUuid; TSPnodeName--nepName> built from TapiPhotonicNode
         Map<String, String> rdmInfraNepUuisMap = convertListNodeWithListNepToMapForUuidAndName(List.of(rdmNode));
-        if (photonicNepUuisMap.size() != rdmInfraNepUuisMap.size()) {
-            LOG.warn("Unable to build OMS links between photonics nodes and RDM infrasctructure abstraction");
+        if (photonicNepUuisMap.size() == rdmInfraNepUuisMap.size()) {
+            //Tapi OtsLinks are created between Neps corresponding to the eNEPs of transponders (existing network ports)
+            //and Generic NEPS with abstracted names created in the ROADM infrastructure corresponding to tps mirroring
+            //transponders NETWORK PORTs. There is a simplification here considering that any network port of
+            //transponders will have a mirroring SRG client port in the ROADM infrastructure.
+            // TODO: Do not understand that we build OTS link without checking that existing transponder ports
+            //are effectively connected. Need some consolidation
+            createTapiOtsLinks(photonicNepUuisMap, rdmInfraNepUuisMap);
         } else {
-            createTapiOmsLinks(photonicNepUuisMap, rdmInfraNepUuisMap);
+            LOG.warn("Unable to build OTS links between photonics nodes and RDM infrasctructure abstraction");
         }
     }
 
-    private OduSwitchingPools createOduSwitchingPoolForTp100G() {
-        Map<NonBlockingListKey, NonBlockingList> nblMap = new HashMap<>();
-        int count = 1;
-        for (TerminationPoint tp : this.oorNetworkPortList) {
-            TpId tpid1 = tp.getTpId();
-            TpId tpid2 = new TpId(tp.augmentation(
-                    org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1.class)
-                .getAssociatedConnectionMapPort());
-            List<TpId> tpList = new ArrayList<>();
-            tpList.add(tpid1);
-            tpList.add(tpid2);
-            NonBlockingList nbl = new NonBlockingListBuilder()
-                .setNblNumber(Uint16.valueOf(count))
-                .setTpList(tpList)
-                .build();
-            nblMap.put(nbl.key(), nbl);
-            count++;
-        }
-        return new OduSwitchingPoolsBuilder()
-            .setNonBlockingList(nblMap)
-            .setSwitchingPoolNumber(Uint16.valueOf(1))
-            .build();
-    }
-
-    private List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node>
+    private List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
             pruneTapiPhotonicNodes() {
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node>
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
             prunedTapiPhotonicNodes = new ArrayList<>();
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> tapiPhotonicNodes
-            = this.tapiNodes.values().stream()
-            .filter(n -> LayerProtocolName.PHOTONICMEDIA.equals(n.getLayerProtocolName().get(0)))
-            .collect(Collectors.toList());
-        for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node node
-            : tapiPhotonicNodes) {
+        for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node node :
+                this.tapiNodes.values().stream()
+                    .filter(n -> n.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA))
+                    .collect(Collectors.toList())) {
             Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepM = new HashMap<>();
             for (Map.Entry<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> entry : node.getOwnedNodeEdgePoint().entrySet()) {
                 if (entry.getValue().getName().values().stream()
-                    .filter(name -> name.getValueName().startsWith("eNodeEdgePoint")).count() > 0) {
+                    .filter(name -> name.getValueName().equals("eNodeEdgePoint")).count() > 0) {
                     onepM.put(entry.getKey(), entry.getValue());
                 }
             }
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node prunedNode
-                = new NodeBuilder(node).setOwnedNodeEdgePoint(onepM).build();
-            prunedTapiPhotonicNodes.add(prunedNode);
+            prunedTapiPhotonicNodes.add(new NodeBuilder(node).setOwnedNodeEdgePoint(onepM).build());
         }
         return prunedTapiPhotonicNodes;
     }
 
     private Map<String, String> convertListNodeWithListNepToMapForUuidAndName(
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> nodes) {
+            List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> nodes) {
         Map<String, String> uuidNameMap = new HashMap<>();
-        for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node node : nodes) {
+        for (var node : nodes) {
+            String nodeName = node.getName().get(new NameKey("otsi node name")).getValue();
+            String nodeUuid = node.getUuid().getValue();
             for (OwnedNodeEdgePoint nep : node.nonnullOwnedNodeEdgePoint().values()) {
-                String nodeUuid = node.getUuid().getValue();
-                String nepUuid = nep.getUuid().getValue();
-                String nodeName = node.getName().get(new NameKey("otsi node name")).getValue();
-                String nepName = nep.getName().get(new NameKey(nep.getName().keySet().stream().findFirst().get()))
-                    .getValue();
-                uuidNameMap.put(String.join("--", nodeUuid, nepUuid), String.join("--", nodeName, nepName));
+                uuidNameMap.put(
+                    String.join("--", nodeUuid, nep.getUuid().getValue()),
+                    String.join("--", nodeName,
+                        nep.getName().get(new NameKey(nep.getName().keySet().stream().findFirst().orElseThrow()))
+                            .getValue()));
             }
         }
         return uuidNameMap;
     }
 
-    private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node
-            createTapiNode(Map<NameKey, Name> nodeNames, List<LayerProtocolName> layerProtocols) {
-        Uuid nodeUuid = null;
-        Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl = new HashMap<>();
-        Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList = new HashMap<>();
-        Map<RuleKey, Rule> ruleList = new HashMap<>();
-        Rule rule = new RuleBuilder()
-            .setLocalId("forward")
-            .setForwardingRule(ForwardingRule.MAYFORWARDACROSSGROUP)
-            .setRuleType(RuleType.FORWARDING)
-            .build();
-        ruleList.put(rule.key(), rule);
-        if (layerProtocols.contains(LayerProtocolName.DSR)) {
-            nodeUuid = getNodeUuid4Dsr(onepl, nodeRuleGroupList, ruleList);
-        } else if (layerProtocols.contains(LayerProtocolName.PHOTONICMEDIA)) {
-            nodeUuid = getNodeUuid4Photonic(onepl, nodeRuleGroupList, ruleList);
-        } else {
-            LOG.error("Undefined LayerProtocolName for {} node {}", nodeNames.get(nodeNames.keySet().iterator().next())
-                .getValueName(), nodeNames.get(nodeNames.keySet().iterator().next()).getValue());
-        }
-        return new NodeBuilder()
-            .setUuid(nodeUuid)
-            .setName(nodeNames)
-            .setLayerProtocolName(layerProtocols)
-            .setAdministrativeState(this.tapiLink.setTapiAdminState(this.ietfNodeAdminState.getName()))
-            .setOperationalState(this.tapiLink.setTapiOperationalState(this.ietfNodeOperState.getName()))
-            .setLifecycleState(LifecycleState.INSTALLED)
-            .setOwnedNodeEdgePoint(onepl)
-            .setNodeRuleGroup(nodeRuleGroupList)
-            .build();
-    }
-
-    private Uuid getNodeUuid4Photonic(Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl,
-                                      Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList,
-                                      Map<RuleKey, Rule> ruleList) {
-        Uuid nodeUuid;
-        nodeUuid = this.uuidMap.get(String.join("+", this.ietfNodeId, TapiStringConstants.OTSI));
-        // iNep creation on otsi node
-        for (int i = 0; i < oorNetworkPortList.size(); i++) {
-            Uuid nepUuid1 = new Uuid(UUID.nameUUIDFromBytes(
-                    (String.join("+", this.ietfNodeId, TapiStringConstants.I_OTSI,
-                        oorNetworkPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8")))
-                .toString());
-            this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.I_OTSI,
-                oorNetworkPortList.get(i).getTpId().getValue()), nepUuid1);
-            Name onedName = new NameBuilder()
-                .setValueName("iNodeEdgePoint")
-                .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.I_OTSI,
-                    oorNetworkPortList.get(i).getTpId().getValue()))
-                .build();
-
-            OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
-                LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true,
-                String.join("+", this.ietfNodeId, TapiStringConstants.I_OTSI));
-            onepl.put(onep.key(), onep);
-        }
-        // eNep creation on otsi node
-        for (int i = 0; i < oorNetworkPortList.size(); i++) {
-            Uuid nepUuid2 = new Uuid(UUID.nameUUIDFromBytes(
-                    (String.join("+", this.ietfNodeId, TapiStringConstants.E_OTSI,
-                        oorNetworkPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8")))
-                .toString());
-            this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.E_OTSI,
-                oorNetworkPortList.get(i).getTpId().getValue()), nepUuid2);
-            Name onedName = new NameBuilder()
-                .setValueName("eNodeEdgePoint")
-                .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.E_OTSI,
-                    oorNetworkPortList.get(i).getTpId().getValue()))
-                .build();
-
-            OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
-                LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA, true,
-                String.join("+", this.ietfNodeId, TapiStringConstants.E_OTSI));
-            onepl.put(onep.key(), onep);
-        }
-        // create NodeRuleGroup
-        int count = 1;
-        for (TerminationPoint tp : this.oorNetworkPortList) {
-            Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePointKey,
-                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint>
-                nepList = new HashMap<>();
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
-                .NodeEdgePoint inep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
-                .node.rule.group.NodeEdgePointBuilder()
-                .setTopologyUuid(tapiTopoUuid)
-                .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, TapiStringConstants.OTSI)))
-                .setNodeEdgePointUuid(
-                    this.uuidMap.get(String.join("+", this.ietfNodeId, TapiStringConstants.I_OTSI,
-                        tp.getTpId().getValue()))).build();
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
-                .NodeEdgePoint enep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
-                .node.rule.group.NodeEdgePointBuilder()
-                .setTopologyUuid(tapiTopoUuid)
-                .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId, TapiStringConstants.OTSI)))
-                .setNodeEdgePointUuid(
-                    this.uuidMap.get(String.join("+", this.ietfNodeId, TapiStringConstants.E_OTSI,
-                        tp.getTpId().getValue())))
-                .build();
-            nepList.put(inep.key(), inep);
-            nepList.put(enep.key(), enep);
-            NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
-                .setUuid(new Uuid(
-                    UUID.nameUUIDFromBytes(("otsi node rule group " + count).getBytes(Charset.forName("UTF-8")))
-                        .toString()))
-                .setRule(ruleList)
-                .setNodeEdgePoint(nepList)
-                .build();
-            nodeRuleGroupList.put(nodeRuleGroup.key(), nodeRuleGroup);
-            count++;
-        }
-        return nodeUuid;
-    }
-
-    private Uuid getNodeUuid4Dsr(Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl,
-                                 Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList, Map<RuleKey, Rule> ruleList) {
-        Uuid nodeUuid;
-        nodeUuid = this.uuidMap.get(String.join("+", this.ietfNodeId, TapiStringConstants.DSR));
-        // client nep creation on DSR/ODU node
-        for (int i = 0; i < oorClientPortList.size(); i++) {
-            Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
-                (String.join("+", this.ietfNodeId, TapiStringConstants.DSR,
-                    oorClientPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8"))).toString());
-            this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.DSR,
-                oorClientPortList.get(i).getTpId().getValue()), nepUuid);
-            NameBuilder nameBldr = new NameBuilder().setValue(String.join("+", this.ietfNodeId, TapiStringConstants.DSR,
-                oorClientPortList.get(i).getTpId().getValue()));
-            Name name;
-            if (OpenroadmNodeType.TPDR.equals(this.ietfNodeType)) {
-                name = nameBldr.setValueName("100G-tpdr").build();
-            } else {
-                name = nameBldr.setValueName("NodeEdgePoint_C").build();
-            }
-
-            OwnedNodeEdgePoint onep = createNep(oorClientPortList.get(i), Map.of(name.key(), name),
-                LayerProtocolName.ETH, LayerProtocolName.DSR, true, String.join("+", this.ietfNodeId,
-                    TapiStringConstants.DSR));
-            onepl.put(onep.key(), onep);
-        }
-        // network nep creation on DSR/ODU node
-        for (int i = 0; i < oorNetworkPortList.size(); i++) {
-            Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
-                (String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU,
-                    oorNetworkPortList.get(i).getTpId().getValue())).getBytes(Charset.forName("UTF-8"))).toString());
-            this.uuidMap.put(String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU,
-                oorNetworkPortList.get(i).getTpId().getValue()), nepUuid);
-            Name onedName = new NameBuilder()
-                .setValueName("iNodeEdgePoint_N")
-                .setValue(String.join("+", this.ietfNodeId, TapiStringConstants.I_ODU,
-                    oorNetworkPortList.get(i).getTpId().getValue()))
-                .build();
-
-            OwnedNodeEdgePoint onep = createNep(oorNetworkPortList.get(i), Map.of(onedName.key(), onedName),
-                LayerProtocolName.ODU, LayerProtocolName.DSR, true, String.join("+", this.ietfNodeId,
-                    TapiStringConstants.I_ODU));
-            onepl.put(onep.key(), onep);
-        }
-        // create NodeRuleGroup
-        int count = 1;
-        for (NonBlockingList nbl : this.oorOduSwitchingPool.nonnullNonBlockingList().values()) {
-            Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePointKey,
-                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint>
-                nepList = new HashMap<>();
-            for (TpId tp : nbl.getTpList()) {
-                if (this.uuidMap.containsKey(String.join("+", this.ietfNodeId, TapiStringConstants.DSR,
-                        tp.getValue())) || this.uuidMap.containsKey(String.join(
-                    "+", this.ietfNodeId, TapiStringConstants.I_ODU, tp.getValue()))) {
-                    String qual = tp.getValue().contains("CLIENT") ? TapiStringConstants.DSR
-                        : TapiStringConstants.I_ODU;
-                    org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint
-                        nep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
-                        .NodeEdgePointBuilder()
-                        .setTopologyUuid(tapiTopoUuid)
-                        .setNodeUuid(this.uuidMap.get(String.join("+", this.ietfNodeId,
-                            TapiStringConstants.DSR)))
-                        .setNodeEdgePointUuid(this.uuidMap.get(String.join("+", this.ietfNodeId,
-                            qual, tp.getValue())))
-                        .build();
-                    nepList.put(nep.key(), nep);
-                }
-            }
-            NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
-                .setUuid(new Uuid(
-                    UUID.nameUUIDFromBytes(("dsr node rule group " + count).getBytes(Charset.forName("UTF-8")))
-                        .toString()))
-                .setRule(ruleList)
-                .setNodeEdgePoint(nepList)
-                .build();
-            nodeRuleGroupList.put(nodeRuleGroup.key(), nodeRuleGroup);
-            count++;
-        }
-        return nodeUuid;
-    }
-
-    private OwnedNodeEdgePoint createNep(TerminationPoint oorTp, Map<NameKey, Name> nepNames,
-                                         LayerProtocolName nepProtocol, LayerProtocolName nodeProtocol,
-                                         boolean withSip, String keyword) {
-        String key = String.join("+", keyword, oorTp.getTpId().getValue());
-        AdministrativeState adminState = (oorTp.augmentation(TerminationPoint1.class).getAdministrativeState() != null)
-            ? this.tapiLink.setTapiAdminState(oorTp.augmentation(TerminationPoint1.class).getAdministrativeState()
-                .getName())
-            : null;
-        OperationalState operState = (oorTp.augmentation(TerminationPoint1.class).getOperationalState() != null)
-            ? this.tapiLink.setTapiOperationalState(oorTp.augmentation(TerminationPoint1.class).getOperationalState()
-                .getName())
-            : null;
-        OwnedNodeEdgePointBuilder onepBldr = new OwnedNodeEdgePointBuilder()
-            .setUuid(this.uuidMap.get(key))
-            .setLayerProtocolName(nepProtocol)
-            .setName(nepNames)
-            .setSupportedCepLayerProtocolQualifier(createSupportedCepLayerProtocolQualifier(oorTp, nodeProtocol))
-            .setLinkPortDirection(PortDirection.BIDIRECTIONAL)
-            .setLinkPortRole(PortRole.SYMMETRIC)
-            .setAdministrativeState(adminState)
-            .setOperationalState(operState)
-            .setLifecycleState(LifecycleState.INSTALLED)
-            .setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
-            .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL);
-        if (withSip) {
-            onepBldr.setMappedServiceInterfacePoint(createSIP(1, oorTp, keyword));
-        }
-        return onepBldr.build();
-    }
-
     private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> createNepForRdmNode(int nbNep) {
         Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
         for (int i = 1; i <= nbNep; i++) {
-            Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "roadm node", "nep", String.valueOf(i)))
-                .getBytes(Charset.forName("UTF-8"))).toString());
             Name nepName = new NameBuilder()
                 .setValueName("NodeEdgePoint name")
                 .setValue(new StringBuilder("NodeEdgePoint_").append(i).toString())
                 .build();
             OwnedNodeEdgePoint onep = new OwnedNodeEdgePointBuilder()
-                .setUuid(nepUuid)
+                .setUuid(new Uuid(UUID.nameUUIDFromBytes(
+                        (String.join("+", "roadm node", "nep", String.valueOf(i))).getBytes(Charset.forName("UTF-8")))
+                    .toString()))
                 .setLayerProtocolName(LayerProtocolName.PHOTONICMEDIA)
                 .setName(Map.of(nepName.key(), nepName))
-                .setSupportedCepLayerProtocolQualifier(List.of(PHOTONICLAYERQUALIFIEROMS.class))
-                .setLinkPortDirection(PortDirection.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC)
+                .setSupportedCepLayerProtocolQualifierInstances(
+                    new ArrayList<>(List.of(
+                        new SupportedCepLayerProtocolQualifierInstancesBuilder()
+                            .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
+                            .setNumberOfCepInstances(Uint64.valueOf(1))
+                            .build())))
+                .setDirection(Direction.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC)
                 .setAdministrativeState(AdministrativeState.UNLOCKED).setOperationalState(OperationalState.ENABLED)
-                .setLifecycleState(LifecycleState.INSTALLED).setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
-                .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL)
+                .setLifecycleState(LifecycleState.INSTALLED)
                 .build();
             onepMap.put(onep.key(), onep);
         }
         return onepMap;
     }
 
-    private Map<NodeRuleGroupKey, NodeRuleGroup> createNodeRuleGroupForRdmNode(Uuid nodeUuid,
-                                                                               Collection<OwnedNodeEdgePoint> onepl) {
-        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePointKey,
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint>
-            nepMap = new HashMap<>();
-        for (OwnedNodeEdgePoint onep : onepl) {
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint
-                nep = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
-                    .NodeEdgePointBuilder()
-                .setTopologyUuid(tapiTopoUuid)
-                .setNodeUuid(nodeUuid)
-                .setNodeEdgePointUuid(onep.key().getUuid())
-                .build();
-            nepMap.put(nep.key(), nep);
-        }
-        Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap = new HashMap<>();
-        Map<RuleKey, Rule> ruleList = new HashMap<>();
-        Rule rule = new RuleBuilder()
-            .setLocalId("forward")
-            .setForwardingRule(ForwardingRule.MAYFORWARDACROSSGROUP)
-            .setRuleType(RuleType.FORWARDING)
-            .build();
-        ruleList.put(rule.key(), rule);
-        NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
-            .setUuid(new Uuid(UUID.nameUUIDFromBytes(("rdm infra node rule group").getBytes(Charset.forName("UTF-8")))
-                .toString()))
-            .setRule(ruleList)
-            .setNodeEdgePoint(nepMap)
-            .build();
-        nodeRuleGroupMap.put(nodeRuleGroup.key(), nodeRuleGroup);
-        return nodeRuleGroupMap;
-    }
-
-    private Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint> createSIP(int nb, TerminationPoint tp,
-                                                                                       String nodeId) {
-        Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint> msipl = new HashMap<>();
-        for (int i = 0; i < nb; i++) {
-            MappedServiceInterfacePoint msip = new MappedServiceInterfacePointBuilder()
-                .setServiceInterfacePointUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP", nodeId,
-                    tp.getTpId().getValue())).getBytes(Charset.forName("UTF-8"))).toString()))
-                .build();
-            msipl.put(msip.key(), msip);
-        }
-        return msipl;
-    }
-
-    private List<Class<? extends LAYERPROTOCOLQUALIFIER>>
-            createSupportedCepLayerProtocolQualifier(TerminationPoint tp, LayerProtocolName lpn) {
-        Set<Class<? extends LAYERPROTOCOLQUALIFIER>> sclpqSet = new HashSet<>();
-        List<SupportedInterfaceCapability> sicList = new ArrayList<>(
-            tp.augmentation(org.opendaylight.yang.gen.v1.http
-                    .org.openroadm.otn.network.topology.rev211210.TerminationPoint1.class).getTpSupportedInterfaces()
-                .getSupportedInterfaceCapability().values());
-        for (SupportedInterfaceCapability sic : sicList) {
-            switch (lpn.getName()) {
-                case "DSR":
-                    switch (sic.getIfCapType().getSimpleName()) {
-                        case "If10GEODU2e":
-                            sclpqSet.add(ODUTYPEODU2E.class);
-                            sclpqSet.add(DIGITALSIGNALTYPE10GigELAN.class);
-                            break;
-                        case "If10GEODU2":
-                            sclpqSet.add(ODUTYPEODU2.class);
-                            sclpqSet.add(DIGITALSIGNALTYPE10GigELAN.class);
-                            break;
-                        case "If10GE":
-                            sclpqSet.add(DIGITALSIGNALTYPE10GigELAN.class);
-                            break;
-                        case "If100GEODU4":
-                            sclpqSet.add(DIGITALSIGNALTYPE100GigE.class);
-                            sclpqSet.add(ODUTYPEODU4.class);
-                            break;
-                        case "If100GE":
-                            sclpqSet.add(DIGITALSIGNALTYPE100GigE.class);
-                            break;
-                        case "IfOCHOTU4ODU4":
-                        case "IfOCH":
-                            sclpqSet.add(ODUTYPEODU4.class);
-                            break;
-                        default:
-                            LOG.error("IfCapability type not managed");
-                            break;
-                    }
-                    break;
-                case "PHOTONIC_MEDIA":
-                    if (sic.getIfCapType().getSimpleName().equals("IfOCHOTU4ODU4")
-                            || sic.getIfCapType().getSimpleName().equals("IfOCH")) {
-                        sclpqSet.add(PHOTONICLAYERQUALIFIEROTSi.class);
-                        sclpqSet.add(PHOTONICLAYERQUALIFIEROMS.class);
-                    }
-                    break;
-                default:
-                    LOG.error("Layer Protocol Name is unknown");
-                    break;
-            }
-        }
-        return new ArrayList<>(sclpqSet);
-    }
-
-    private void createTapiTransitionalLinks() {
-        for (TerminationPoint tp : this.oorNetworkPortList) {
-            Link transiLink = tapiLink.createTapiLink(this.ietfNodeId, tp.getTpId().getValue(), this.ietfNodeId,
-                tp.getTpId().getValue(), TapiStringConstants.TRANSITIONAL_LINK, TapiStringConstants.DSR,
-                TapiStringConstants.OTSI, TapiStringConstants.I_ODU, TapiStringConstants.I_OTSI,
-                "inService", "inService", Arrays.asList(LayerProtocolName.ODU,
-                    LayerProtocolName.PHOTONICMEDIA),
-                Arrays.asList(LayerProtocolName.ODU.getName(), LayerProtocolName.PHOTONICMEDIA.getName()),
-                this.tapiTopoUuid);
-            this.tapiLinks.put(transiLink.key(), transiLink);
-        }
-    }
-
-    private void createTapiOmsLinks(Map<String, String> photonicNepUuisMap, Map<String, String> rdmInfraNepUuisMap) {
-        Iterator<Entry<String, String>> it1 = photonicNepUuisMap.entrySet().iterator();
+    private void createTapiOtsLinks(Map<String, String> photonicNepUuisMap, Map<String, String> rdmInfraNepUuisMap) {
         Iterator<Entry<String, String>> it2 = rdmInfraNepUuisMap.entrySet().iterator();
-        while (it1.hasNext()) {
-            Map<NodeEdgePointKey, NodeEdgePoint> nepMap = new HashMap<>();
-            Map.Entry<String, String> photonicEntry = it1.next();
+        for (Map.Entry<String, String> photonicEntry : photonicNepUuisMap.entrySet()) {
             Map.Entry<String, String> rdmEntry = it2.next();
-            Uuid sourceUuidTp = new Uuid(photonicEntry.getKey().split("--")[1]);
-            Uuid sourceUuidNode = new Uuid(photonicEntry.getKey().split("--")[0]);
-            Uuid destUuidTp = new Uuid(rdmEntry.getKey().split("--")[1]);
-            Uuid destUuidNode = new Uuid(rdmEntry.getKey().split("--")[0]);
+            String photonicEntryKey = photonicEntry.getKey();
             NodeEdgePoint sourceNep = new NodeEdgePointBuilder()
                 .setTopologyUuid(this.tapiTopoUuid)
-                .setNodeUuid(sourceUuidNode)
-                .setNodeEdgePointUuid(sourceUuidTp)
+                .setNodeUuid(new Uuid(photonicEntryKey.split("--")[0]))
+                .setNodeEdgePointUuid(new Uuid(photonicEntryKey.split("--")[1]))
                 .build();
-            nepMap.put(sourceNep.key(), sourceNep);
+            String rdmEntryKey = rdmEntry.getKey();
             NodeEdgePoint destNep = new NodeEdgePointBuilder()
                 .setTopologyUuid(this.tapiTopoUuid)
-                .setNodeUuid(destUuidNode)
-                .setNodeEdgePointUuid(destUuidTp)
+                .setNodeUuid(new Uuid(rdmEntryKey.split("--")[0]))
+                .setNodeEdgePointUuid(new Uuid(rdmEntryKey.split("--")[1]))
                 .build();
-            nepMap.put(destNep.key(), destNep);
-            Name linkName = new NameBuilder().setValueName("OMS link name")
-                .setValue(String.join(" and ", photonicEntry.getValue(), rdmEntry.getValue()))
+            String linkNameValue = String.join(" and ", photonicEntry.getValue(), rdmEntry.getValue());
+            Name linkName = new NameBuilder()
+                .setValueName("OTS link name")
+                .setValue(linkNameValue)
                 .build();
-            Link omsLink = new LinkBuilder()
-                .setUuid(new Uuid(
-                    UUID.nameUUIDFromBytes((String.join(" and ", photonicEntry.getValue(), rdmEntry.getValue()))
-                            .getBytes(Charset.forName("UTF-8")))
-                        .toString()))
+            Link otsLink = new LinkBuilder()
+                .setUuid(new Uuid(UUID.nameUUIDFromBytes(linkNameValue.getBytes(Charset.forName("UTF-8")))
+                    .toString()))
                 .setName(Map.of(linkName.key(), linkName))
-                .setLayerProtocolName(List.of(LayerProtocolName.PHOTONICMEDIA))
-                .setNodeEdgePoint(nepMap)
+                .setLayerProtocolName(Set.of(LayerProtocolName.PHOTONICMEDIA))
+                .setNodeEdgePoint(
+                    new HashMap<NodeEdgePointKey, NodeEdgePoint>(Map.of(
+                        sourceNep.key(), sourceNep, destNep.key(), destNep)))
                 .setDirection(ForwardingDirection.BIDIRECTIONAL)
                 .build();
-            this.tapiLinks.put(omsLink.key(), omsLink);
+            this.tapiLinks.put(otsLink.key(), otsLink);
         }
     }
 
-    public Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node>
+    public void setTapiNodes(Map<NodeKey,
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> nodeMap) {
+        this.tapiNodes.putAll(nodeMap);
+    }
+
+    public Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
             getTapiNodes() {
         return tapiNodes;
     }
@@ -760,4 +333,12 @@ public class ConvertORTopoToTapiTopo {
     public Map<LinkKey, Link> getTapiLinks() {
         return tapiLinks;
     }
-}
\ No newline at end of file
+
+    public Map<ServiceInterfacePointKey, ServiceInterfacePoint> getTapiSips() {
+        return tapiSips;
+    }
+
+    public void setTapiSips(Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSip) {
+        this.tapiSips.putAll(tapiSip);
+    }
+}
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/ConvertTapiTopoToAbstracted.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/ConvertTapiTopoToAbstracted.java
new file mode 100644 (file)
index 0000000..e9bc55a
--- /dev/null
@@ -0,0 +1,194 @@
+/*
+ * Copyright © 2024 Orange, Inc. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.tapi.topology;
+
+import java.nio.charset.Charset;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.stream.Collectors;
+import org.opendaylight.transportpce.tapi.TapiStringConstants;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.InterRuleGroup;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.InterRuleGroupKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroup;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.RiskParameterPac;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.RiskParameterPacBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristic;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristicBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristic;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristicBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristic;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristicBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class ConvertTapiTopoToAbstracted {
+
+    private static final Logger LOG = LoggerFactory.getLogger(ConvertTapiTopoToAbstracted.class);
+    private Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
+        tapiNodes;
+    private Map<LinkKey, Link> tapiLinks;
+    private Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSips;
+    private Uuid refTopoUuid;
+
+    public ConvertTapiTopoToAbstracted(Uuid reftopoUuid) {
+        this.tapiNodes = new HashMap<>();
+        this.tapiLinks = new HashMap<>();
+        this.tapiSips = new HashMap<>();
+        this.refTopoUuid = reftopoUuid;
+    }
+
+    public void convertRoadmInfrastructure() {
+        LOG.info("abstraction of the ROADM infrastructure towards a photonic node");
+        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.RDM_INFRA
+            .getBytes(Charset.forName("UTF-8"))).toString());
+        Name nodeName =  new NameBuilder().setValueName("otsi node name").setValue(TapiStringConstants.RDM_INFRA)
+            .build();
+        Name nameNodeType = new NameBuilder().setValueName("Node Type")
+            .setValue(OpenroadmNodeType.ROADM.getName()).build();
+        Set<LayerProtocolName> nodeLayerProtocols = Set.of(LayerProtocolName.PHOTONICMEDIA);
+        Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = pruneTapiRoadmNeps();
+        var tapiFactory = new ConvertORToTapiTopology(this.refTopoUuid);
+        Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap
+            = tapiFactory.createAllNodeRuleGroupForRdmNode("Abstracted", nodeUuid, null, onepMap.values());
+        Map<InterRuleGroupKey, InterRuleGroup> interRuleGroupMap
+            = tapiFactory.createInterRuleGroupForRdmNode("Abstracted", nodeUuid, null,
+                nodeRuleGroupMap.entrySet().stream().map(e -> e.getKey()).collect(Collectors.toList()));
+        // Empty random creation of mandatory fields for avoiding errors....
+        CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
+            .setCostAlgorithm("Restricted Shortest Path - RSP")
+            .setCostName("HOP_COUNT")
+            .setCostValue(TapiStringConstants.COST_HOP_VALUE)
+            .build();
+        LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
+            .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
+            .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
+            .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
+            .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
+            .setTrafficPropertyName("FIXED_LATENCY")
+            .build();
+        RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
+            .setRiskCharacteristicName("risk characteristic")
+            .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
+            .build();
+        RiskParameterPac riskParamPac = new RiskParameterPacBuilder()
+            .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
+            .build();
+        // build RDM infra node abstraction
+        Node rdmNode = new NodeBuilder()
+            .setUuid(nodeUuid)
+            .setName(Map.of(nodeName.key(), nodeName, nameNodeType.key(), nameNodeType))
+            .setLayerProtocolName(nodeLayerProtocols)
+            .setAdministrativeState(AdministrativeState.UNLOCKED)
+            .setOperationalState(OperationalState.ENABLED)
+            .setLifecycleState(LifecycleState.INSTALLED)
+            .setOwnedNodeEdgePoint(onepMap)
+            .setNodeRuleGroup(nodeRuleGroupMap)
+            .setInterRuleGroup(interRuleGroupMap)
+            .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
+            .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
+            .setRiskParameterPac(riskParamPac)
+            .build();
+        purgeTapiNodes();
+        tapiNodes.put(rdmNode.key(), rdmNode);
+        purgeTapiLinks();
+    }
+
+    private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> pruneTapiRoadmNeps() {
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> tapiPhotonicNodes
+            = this.tapiNodes.values().stream()
+                .filter(n -> n.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA)
+                    && !n.getLayerProtocolName().contains(LayerProtocolName.DIGITALOTN)
+                    && !n.getLayerProtocolName().contains(LayerProtocolName.DSR)
+                    && !n.getLayerProtocolName().contains(LayerProtocolName.ODU))
+                .collect(Collectors.toList());
+        Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
+        for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node node
+            : tapiPhotonicNodes) {
+            for (Map.Entry<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> entry : node.getOwnedNodeEdgePoint().entrySet()) {
+                if (entry.getValue().getName().values().stream()
+                            .filter(name -> name.getValueName().equals("PHOTONIC_MEDIA_OTSNodeEdgePoint")).count() > 0
+                        && !(entry.getValue().getName().values().stream()
+                            .filter(name -> name.getValue().contains("DEG")).count() > 0)) {
+                    onepMap.put(entry.getKey(), entry.getValue());
+                }
+                if (entry.getValue().getName().values().stream()
+                        .filter(name -> name.getValueName().equals("OTSI_MCNodeEdgePoint")).count() > 0
+                    && !(entry.getValue().getName().values().stream()
+                        .filter(name -> name.getValue().contains("DEG")).count() > 0)) {
+                    onepMap.put(entry.getKey(), entry.getValue());
+                }
+            }
+        }
+        return onepMap;
+    }
+
+    private void purgeTapiLinks() {
+        this.tapiLinks = this.tapiLinks.values().stream()
+            .filter(l -> l.getName().containsKey(new NameKey(TapiStringConstants.VALUE_NAME_OTS_XPDR_RDM_LINK))
+                || l.getName().containsKey(new NameKey(TapiStringConstants.VALUE_NAME_OTN_XPDR_XPDR_LINK)))
+            .collect(Collectors.toMap(Link::key, link -> link));
+    }
+
+    private void purgeTapiNodes() {
+        this.tapiNodes = this.tapiNodes.values().stream()
+            .filter(n -> !n.getName().containsKey(new NameKey(TapiStringConstants.VALUE_NAME_ROADM_NODE)))
+            .collect(Collectors.toMap(Node::key, node -> node));
+    }
+
+
+    public void setTapiNodes(Map<NodeKey,
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> nodeMap) {
+        this.tapiNodes.putAll(nodeMap);
+    }
+
+    public Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
+            getTapiNodes() {
+        return tapiNodes;
+    }
+
+    public void setTapiLinks(Map<LinkKey,
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link> linkMap) {
+        this.tapiLinks.putAll(linkMap);
+    }
+
+    public Map<LinkKey, Link> getTapiLinks() {
+        return tapiLinks;
+    }
+
+    public Map<ServiceInterfacePointKey, ServiceInterfacePoint> getTapiSips() {
+        return tapiSips;
+    }
+
+    public void setTapiSips(Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSip) {
+        this.tapiSips.putAll(tapiSip);
+    }
+}
+
index 85c3e0a4d784775aad08bdcd24678df69936bc3b..8a44695f6261c25d7d3621f28e96d096015d1876 100644 (file)
@@ -7,16 +7,15 @@
  */
 package org.opendaylight.transportpce.tapi.topology;
 
-import java.util.Collection;
+import java.util.List;
 import java.util.Optional;
-import javax.annotation.Nonnull;
 import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
 import org.opendaylight.transportpce.common.StringConstants;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNode;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.NetconfNodeConnectionStatus.ConnectionStatus;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev150114.netconf.node.connection.status.available.capabilities.AvailableCapability;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.ConnectionOper.ConnectionStatus;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.device.rev240120.connection.oper.available.capabilities.AvailableCapability;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netconf.node.topology.rev231121.NetconfNode;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,16 +29,17 @@ public class TapiNetconfTopologyListener implements DataTreeChangeListener<Node>
         this.tapiNetworkModelService = tapiNetworkModelService;
     }
 
-    public void onDataTreeChanged(@Nonnull Collection<DataTreeModification<Node>> changes) {
+    @Override
+    public void onDataTreeChanged(List<DataTreeModification<Node>> changes) {
         LOG.info("onDataTreeChanged - {}", this.getClass().getSimpleName());
         for (DataTreeModification<Node> change : changes) {
             DataObjectModification<Node> rootNode = change.getRootNode();
-            if (rootNode.getDataBefore() == null) {
+            if (rootNode.dataBefore() == null) {
                 continue;
             }
-            String nodeId = rootNode.getDataBefore().key().getNodeId().getValue();
-            NetconfNode netconfNodeBefore = rootNode.getDataBefore().augmentation(NetconfNode.class);
-            switch (rootNode.getModificationType()) {
+            String nodeId = rootNode.dataBefore().key().getNodeId().getValue();
+            NetconfNode netconfNodeBefore = rootNode.dataBefore().augmentation(NetconfNode.class);
+            switch (rootNode.modificationType()) {
                 case DELETE:
                     this.tapiNetworkModelService.deleteTapinode(nodeId);
                     // TODO -> unregistration to NETCONF stream not yet supported
@@ -47,7 +47,7 @@ public class TapiNetconfTopologyListener implements DataTreeChangeListener<Node>
                     LOG.info("Device {} correctly disconnected from controller", nodeId);
                     break;
                 case WRITE:
-                    NetconfNode netconfNodeAfter = rootNode.getDataAfter().augmentation(NetconfNode.class);
+                    NetconfNode netconfNodeAfter = rootNode.dataAfter().augmentation(NetconfNode.class);
                     if (ConnectionStatus.Connecting.equals(netconfNodeBefore.getConnectionStatus())
                             && ConnectionStatus.Connected.equals(netconfNodeAfter.getConnectionStatus())) {
                         LOG.info("Connecting Node: {}", nodeId);
@@ -70,7 +70,7 @@ public class TapiNetconfTopologyListener implements DataTreeChangeListener<Node>
                     }
                     break;
                 default:
-                    LOG.debug("Unknown modification type {}", rootNode.getModificationType().name());
+                    LOG.debug("Unknown modification type {}", rootNode.modificationType().name());
                     break;
             }
         }
index 10559b7cc8e1f4d9e19ac77478f51cc3e5502829..0019f72f5d30aea73291493099f9d6a879e35cb7 100644 (file)
@@ -7,7 +7,8 @@
  */
 package org.opendaylight.transportpce.tapi.topology;
 
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
 
 public interface TapiNetworkModelService {
 
@@ -31,4 +32,16 @@ public interface TapiNetworkModelService {
      *
      */
     void deleteTapinode(String nodeId);
+
+    /**
+     * Update termination point, and if need, be associated links, of
+     * openroadm-topology and otn-topology after a change on a given mapping.
+     *
+     * @param nodeId
+     *            unique node ID of OpenROADM node at the origin of the NETCONF
+     *            notification change.
+     * @param mapping
+     *            updated mapping following the device notification change.
+     */
+    void updateTapiTopology(String nodeId, Mapping mapping);
 }
index 15263b06ba32c9650dc214c0de643696756965ad..8706dc301dc4fea8194387c18ee171fce8a4a2d0 100644 (file)
 package org.opendaylight.transportpce.tapi.topology;
 
 import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Optional;
+import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.transportpce.common.NetworkUtils;
+import org.opendaylight.transportpce.common.device.DeviceTransactionManager;
+import org.opendaylight.transportpce.common.fixedflex.GridConstant;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.tapi.R2RTapiLinkDiscovery;
 import org.opendaylight.transportpce.tapi.TapiStringConstants;
 import org.opendaylight.transportpce.tapi.utils.TapiLink;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev181019.NodeTypes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.device.types.rev191129.XpdrNodeTypes;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.OduSwitchingPools;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.OduSwitchingPoolsBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev201211.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If100GE;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If100GEODU4;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If10GE;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If10GEODU2;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If10GEODU2e;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If1GE;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.If1GEODU0;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOCH;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.IfOCHOTU4ODU4;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev201211.SupportedIfCapability;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.OduSwitchingPools;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.OduSwitchingPoolsBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingList;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.types.rev230526.xpdr.odu.switching.pools.odu.switching.pools.NonBlockingListKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapability;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.xpdr.tp.supported.interfaces.SupportedInterfaceCapabilityKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.port.types.rev230526.SupportedIfCapability;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.switching.pool.types.rev191129.SwitchingPoolTypes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.xponder.rev230526.xpdr.mode.attributes.supported.operational.modes.OperationalModeKey;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.NetworkKey;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.TpId;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.AdministrativeState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Context;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.ContextBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LAYERPROTOCOLQUALIFIER;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LifecycleState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.OperationalState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortRole;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.pac.AvailableCapacityBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.pac.TotalPotentialCapacityBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectionBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectionKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityService;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityServiceBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityServiceKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.EndPoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.EndPointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContext;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE100GigE;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE10GigELAN;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPEGigE;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU0;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU2;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU2E;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU4;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROMS;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROTSi;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.Context1;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.ForwardingRule;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.RuleType;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.context.TopologyContext;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroup;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroupBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroupKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.Rule;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.RuleBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.RuleKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.risk.parameter.pac.RiskCharacteristic;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.risk.parameter.pac.RiskCharacteristicBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.LinkKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.Topology;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.TopologyBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.TopologyKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.transfer.cost.pac.CostCharacteristic;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.transfer.cost.pac.CostCharacteristicBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.transfer.timing.pac.LatencyCharacteristic;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.transfer.timing.pac.LatencyCharacteristicBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Context;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.ContextBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Direction;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.PortRole;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.OwnedNodeEdgePoint1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.OwnedNodeEdgePoint1Builder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.cep.list.ConnectionEndPoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.cep.list.ConnectionEndPointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.cep.list.ConnectionEndPointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.Connection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectionBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectionKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.context.topology.context.topology.node.owned.node.edge.point.CepList;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.context.topology.context.topology.node.owned.node.edge.point.CepListBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.NOTIFICATIONTYPEATTRIBUTEVALUECHANGE;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.NotificationBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.ChangedAttributes;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.ChangedAttributesBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.notification.ChangedAttributesKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIERMC;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROMS;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTS;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTSiMC;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.context.topology.context.topology.node.owned.node.edge.point.PhotonicMediaNodeEdgePointSpec;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.FORWARDINGRULEMAYFORWARDACROSSGROUP;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.NodeEdgePointRef;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.RuleType;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.TOPOLOGYOBJECTTYPENODEEDGEPOINT;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.context.TopologyContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.InterRuleGroup;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.InterRuleGroupKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroup;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroupKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.RiskParameterPac;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.RiskParameterPacBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.MappedServiceInterfacePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstances;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstancesBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.Rule;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.RuleBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.RuleKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristic;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristicBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristic;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristicBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristic;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristicBuilder;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.Notification;
 import org.opendaylight.yangtools.yang.common.Uint16;
 import org.opendaylight.yangtools.yang.common.Uint32;
+import org.opendaylight.yangtools.yang.common.Uint64;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+
+@Component
 public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
 
     private static final Logger LOG = LoggerFactory.getLogger(TapiNetworkModelServiceImpl.class);
+
     private final Uuid tapiTopoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
-            .getBytes(Charset.forName("UTF-8"))).toString());
+            .getBytes(StandardCharsets.UTF_8)).toString());
     private final NetworkTransactionService networkTransactionService;
-    private Map<ServiceInterfacePointKey, ServiceInterfacePoint> sipMap;
     private final R2RTapiLinkDiscovery linkDiscovery;
     private final TapiLink tapiLink;
-
-    public TapiNetworkModelServiceImpl(final R2RTapiLinkDiscovery linkDiscovery,
-                                       NetworkTransactionService networkTransactionService, TapiLink tapiLink) {
+    private final ConvertORToTapiTopology tapiFactory;
+    private String topologicalMode;
+    private final ConvertORTopoToTapiFullTopo tapiFullFactory;
+    private final NotificationPublishService notificationPublishService;
+    private Map<ServiceInterfacePointKey, ServiceInterfacePoint> sipMap = new HashMap<>();
+
+    @Activate
+    public TapiNetworkModelServiceImpl(@Reference NetworkTransactionService networkTransactionService,
+            @Reference DeviceTransactionManager deviceTransactionManager,
+            @Reference TapiLink tapiLink,
+            @Reference final NotificationPublishService notificationPublishService) {
         this.networkTransactionService = networkTransactionService;
-        this.sipMap = new HashMap<>();
-        this.linkDiscovery = linkDiscovery;
+        this.linkDiscovery = new R2RTapiLinkDiscovery(networkTransactionService, deviceTransactionManager, tapiLink);
+        this.notificationPublishService = notificationPublishService;
+        this.tapiFactory = new ConvertORToTapiTopology(tapiTopoUuid);
         this.tapiLink = tapiLink;
+        this.tapiFullFactory = new ConvertORTopoToTapiFullTopo(tapiTopoUuid, tapiLink);
+        this.topologicalMode = tapiFullFactory.getTopologicalMode();
     }
 
     @Override
@@ -183,23 +219,51 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
             }
             // Transform LCPs into ONEP
             Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap =
-                new HashMap<>(transformDegToOnep(orNodeId, mapDeg));
-            onepMap.putAll(transformSrgToOnep(orNodeId, mapSrg));
-
-            // create tapi Node
-            Node roadmNode = createRoadmTapiNode(orNodeId, onepMap);
-            mergeNodeinTopology(Map.of(roadmNode.key(), roadmNode));
-            mergeSipsinContext(this.sipMap);
-            // TODO add states corresponding to device config -> based on mapping.
-            //  This should be possible after Gilles work is merged
-
-            // rdm to rdm link creation if neighbour roadm is mounted
-            LOG.info("checking if neighbor roadm exists");
-            Map<LinkKey, Link> rdm2rdmLinks = this.linkDiscovery.readLLDP(new NodeId(orNodeId), orNodeVersion,
-                this.tapiTopoUuid);
-            if (!rdm2rdmLinks.isEmpty()) {
-                mergeLinkinTopology(rdm2rdmLinks);
+                new HashMap<>(transformSrgToOnep(orNodeId, mapSrg));
+            LOG.debug("CreateTapiNode NetworkModelServiceImpl, TopologicalMode = {}", topologicalMode);
+            LOG.debug("TAPINETWORKMODELSERVICEIMPL call transformSRGtoONEP (OrNodeId {} ", orNodeId);
+            LOG.debug("TAPINETWORKMODELSERVICEIMPL SRG OTSNode of retrieved OnepMap {} ",
+                onepMap.entrySet().stream().filter(e -> e.getValue()
+                    .getSupportedCepLayerProtocolQualifierInstances()
+                        .contains(new SupportedCepLayerProtocolQualifierInstancesBuilder()
+                            .setNumberOfCepInstances(Uint64.valueOf(1))
+                            .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
+                        .build()))
+                .collect(Collectors.toList()));
+            if (topologicalMode.equals("Full")) {
+                onepMap.putAll(transformDegToOnep(orNodeId, mapDeg));
+                LOG.debug("TAPINETWORKMODELSERVICEIMPL DEG+SRG OTSNode of retrieved OnepMap {} ",
+                    onepMap.entrySet().stream().filter(e -> e.getValue()
+                        .getSupportedCepLayerProtocolQualifierInstances()
+                            .contains(new SupportedCepLayerProtocolQualifierInstancesBuilder()
+                                .setNumberOfCepInstances(Uint64.valueOf(1))
+                                .setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE)
+                            .build()))
+                    .collect(Collectors.toList()));
+                LOG.debug("TAPINETWORKMODELSERVICEIMPL DEG+SRG complete retrieved OnepMap {} ", onepMap);
+                // create tapi Node
+                Node roadmNode = createRoadmTapiNode(orNodeId, onepMap);
+                mergeNodeinTopology(Map.of(roadmNode.key(), roadmNode));
+                mergeSipsinContext(this.sipMap);
+                // TODO add states corresponding to device config -> based on mapping.
+                //  This should be possible after Gilles work is merged
+
+                // rdm to rdm link creation if neighbour roadm is mounted
+                LOG.info("checking if neighbor roadm exists");
+                Map<LinkKey, Link> rdm2rdmLinks = this.linkDiscovery.readLLDP(new NodeId(orNodeId), orNodeVersion,
+                    this.tapiTopoUuid);
+                if (!rdm2rdmLinks.isEmpty()) {
+                    mergeLinkinTopology(rdm2rdmLinks);
+                }
+            } else {
+                // create tapi Node
+                Node roadmNode = createRoadmTapiNode("ROADMINFRA", onepMap);
+                mergeNodeinTopology(Map.of(roadmNode.key(), roadmNode));
+                mergeSipsinContext(this.sipMap);
+                // TODO add states corresponding to device config -> based on mapping.
+                //  This should be possible after Gilles work is merged
             }
+
             LOG.info("TAPI node for or node {} successfully merged", orNodeId);
         } else if (NodeTypes.Xpdr.getIntValue() ==  node.getNodeInfo().getNodeType().getIntValue()) {
             List<Mapping> networkMappings = node.nonnullMapping().values()
@@ -208,7 +272,7 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
             Map<Integer, String> xpdrMap = new HashMap<>();
             for (Mapping mapping : networkMappings) {
                 Integer xpdrNb = Integer.parseInt(mapping.getLogicalConnectionPoint().split("XPDR")[1].split("-")[0]);
-                String nodeId = node.getNodeId() + TapiStringConstants.XPDR + xpdrNb;
+                String nodeId = node.getNodeId() + TapiStringConstants.XXPDR + xpdrNb;
                 if (!xpdrMap.containsKey(xpdrNb)) {
                     List<Mapping> xpdrNetMaps = node.nonnullMapping().values()
                         .stream().filter(k -> k.getLogicalConnectionPoint()
@@ -220,11 +284,11 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
 
                     // create switching pool
                     OduSwitchingPools oorOduSwitchingPool = createSwitchPoolForXpdr(
-                        mapping.getXponderType().getIntValue(), xpdrClMaps, xpdrNetMaps, xpdrNb);
+                        mapping.getXpdrType().getIntValue(), xpdrClMaps, xpdrNetMaps, xpdrNb);
 
                     // node transformation
                     Map<NodeKey, Node> nodeMap = new HashMap<>(transformXpdrToTapiNode(
-                        nodeId, xpdrClMaps, xpdrNetMaps, mapping.getXponderType(), oorOduSwitchingPool));
+                        nodeId, xpdrClMaps, xpdrNetMaps, mapping.getXpdrType(), oorOduSwitchingPool));
                     // add nodes and sips to tapi context
                     mergeNodeinTopology(nodeMap);
                     mergeSipsinContext(this.sipMap);
@@ -235,42 +299,200 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
         // Device not managed yet
     }
 
+    @Override
+    public void updateTapiTopology(String nodeId, Mapping mapping) {
+        List<Uuid> uuids = getChangedNodeUuids(nodeId, mapping);
+
+        List<Uuid> changedOneps = updateNeps(mapping, uuids);
+        updateLinks(changedOneps, mapping);
+        sendNotification(changedOneps, mapping);
+
+        LOG.info("Updated TAPI topology successfully.");
+    }
+
+    @SuppressWarnings("rawtypes")
+    private void sendNotification(List<Uuid> changedOneps, Mapping mapping) {
+        Notification notification = new NotificationBuilder()
+            .setNotificationType(NOTIFICATIONTYPEATTRIBUTEVALUECHANGE.VALUE)
+//            .setTargetObjectType(ObjectType.NODEEDGEPOINT)
+            //TODO: Change this : modification in Models 2.4 does not provide for Object type Node EdgePoint
+            .setTargetObjectType(TOPOLOGYOBJECTTYPENODEEDGEPOINT.VALUE)
+            .setChangedAttributes(getChangedAttributes(changedOneps, mapping))
+            .setUuid(tapiTopoUuid)
+            .build();
+        try {
+            notificationPublishService.putNotification(notification);
+        } catch (InterruptedException e) {
+            LOG.error("Could not send notification");
+        }
+    }
+
+    private Map<ChangedAttributesKey, ChangedAttributes> getChangedAttributes(List<Uuid> changedOneps,
+                                                                              Mapping mapping) {
+        Map<ChangedAttributesKey, ChangedAttributes> changedAttributes = new HashMap<>();
+        for (Uuid nep : changedOneps) {
+            changedAttributes.put(new ChangedAttributesKey(nep.getValue()),
+                new ChangedAttributesBuilder().setValueName(nep.getValue())
+                    .setOldValue(mapping.getPortOperState().equals("InService") ? "OutOfService" : "InService")
+                    .setNewValue(mapping.getPortOperState())
+                    .build());
+        }
+        return changedAttributes;
+    }
+
+    private void updateLinks(List<Uuid> changedOneps, Mapping mapping) {
+        try {
+            InstanceIdentifier<Topology> topoIID = InstanceIdentifier.builder(Context.class)
+                    .augmentation(Context1.class).child(TopologyContext.class)
+                    .child(Topology.class, new TopologyKey(tapiTopoUuid))
+                    .build();
+            Optional<Topology> optTopology = this.networkTransactionService
+                    .read(LogicalDatastoreType.OPERATIONAL, topoIID).get();
+            if (optTopology.isEmpty()) {
+                LOG.error("Could not update TAPI links");
+                return;
+            }
+            int nbAffectedLinks = 0;
+            LOG.info("UUIDofAffectedONEPS = {} ", changedOneps.toString());
+            for (Link link : optTopology.orElseThrow().nonnullLink().values()) {
+                List<Uuid> linkNeps = Objects.requireNonNull(link.getNodeEdgePoint()).values().stream()
+                        .map(NodeEdgePointRef::getNodeEdgePointUuid).collect(Collectors.toList());
+                LOG.info("LinkEndPointsUUID = {} for link Name {}", linkNeps.toString(), link.getName().toString());
+                if (!Collections.disjoint(changedOneps, linkNeps)) {
+                    InstanceIdentifier<Link> linkIID = InstanceIdentifier.builder(Context.class)
+                            .augmentation(Context1.class).child(TopologyContext.class)
+                            .child(Topology.class, new TopologyKey(tapiTopoUuid))
+                            .child(Link.class, new LinkKey(link.getUuid())).build();
+                    Link linkblr = new LinkBuilder().setUuid(link.getUuid())
+                            .setAdministrativeState(transformAdminState(mapping.getPortAdminState()))
+                            .setOperationalState(transformOperState(mapping.getPortOperState())).build();
+                    this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, linkIID, linkblr);
+                    nbAffectedLinks++ ;
+                }
+            }
+            LOG.info("AffectedLinksNb = {} ", nbAffectedLinks);
+            this.networkTransactionService.commit().get();
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Could not update TAPI links");
+        }
+    }
+
+    private List<Uuid> updateNeps(Mapping mapping, List<Uuid> uuids) {
+        List<Uuid> changedOneps = new ArrayList<>();
+        for (Uuid nodeUuid : uuids) {
+            try {
+                InstanceIdentifier<Node> nodeIID = InstanceIdentifier.builder(Context.class)
+                        .augmentation(Context1.class).child(TopologyContext.class)
+                        .child(Topology.class, new TopologyKey(tapiTopoUuid)).child(Node.class, new NodeKey(nodeUuid))
+                        .build();
+                Optional<Node> optionalNode = this.networkTransactionService.read(
+                        LogicalDatastoreType.OPERATIONAL, nodeIID).get();
+                if (optionalNode.isPresent()) {
+                    Node node = optionalNode.orElseThrow();
+                    List<OwnedNodeEdgePoint> oneps = node.getOwnedNodeEdgePoint().values().stream()
+                            .filter(onep -> ((Name) onep.getName().values().toArray()[0]).getValue()
+                                    .contains(mapping.getLogicalConnectionPoint())).collect(Collectors.toList());
+                    for (OwnedNodeEdgePoint onep : oneps) {
+                        changedOneps.add(onep.getUuid());
+                        updateSips(mapping, onep);
+                        CepList cepList = getUpdatedCeps(mapping, onep);
+                        InstanceIdentifier<OwnedNodeEdgePoint> onepIID = InstanceIdentifier.builder(Context.class)
+                                .augmentation(Context1.class).child(TopologyContext.class)
+                                .child(Topology.class, new TopologyKey(tapiTopoUuid))
+                                .child(Node.class, new NodeKey(nodeUuid))
+                                .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(onep.getUuid()))
+                                .build();
+                        OwnedNodeEdgePoint onepblr = new OwnedNodeEdgePointBuilder().setUuid(onep.getUuid())
+                                .addAugmentation(new OwnedNodeEdgePoint1Builder().setCepList(cepList).build())
+                                .setAdministrativeState(transformAdminState(mapping.getPortAdminState()))
+                                .setOperationalState(transformOperState(mapping.getPortOperState())).build();
+                        this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, onepIID, onepblr);
+                        LOG.info("UpdatedNEP {} of UUID {} to ADMIN {} OPER {}",
+                            onep.getName().toString(), onep.getUuid(),
+                            transformAdminState(mapping.getPortAdminState()),
+                            transformOperState(mapping.getPortOperState()));
+                    }
+                    this.networkTransactionService.commit().get();
+                }
+            } catch (InterruptedException | ExecutionException e) {
+                LOG.error("Could not update TAPI NEP");
+            }
+        }
+        return changedOneps;
+    }
+
+    private CepList getUpdatedCeps(Mapping mapping, OwnedNodeEdgePoint onep) {
+        OwnedNodeEdgePoint1 onep1 = onep.augmentation(OwnedNodeEdgePoint1.class);
+        Map<ConnectionEndPointKey, ConnectionEndPoint> cepMap = new HashMap<>();
+        if (onep1 != null && onep1.getCepList() != null && onep1.getCepList().getConnectionEndPoint() != null) {
+            for (Map.Entry<ConnectionEndPointKey, ConnectionEndPoint> entry : onep1.getCepList().getConnectionEndPoint()
+                    .entrySet()) {
+                ConnectionEndPoint cep = new ConnectionEndPointBuilder(entry.getValue())
+                        .setOperationalState(transformOperState(mapping.getPortOperState())).build();
+                cepMap.put(entry.getKey(), cep);
+            }
+        }
+        return new CepListBuilder().setConnectionEndPoint(cepMap).build();
+    }
+
+    private List<Uuid> getChangedNodeUuids(String nodeId, Mapping mapping) {
+        List<Uuid> uuids = new ArrayList<>();
+        if (nodeId.contains("ROADM")) {
+            uuids.add(new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA))
+                    .getBytes(StandardCharsets.UTF_8)).toString()));
+        } else if (nodeId.contains("PDR")) {
+            LOG.debug("ANALYSING change in {}", nodeId);
+            int xpdrNb = Integer.parseInt(mapping.getLogicalConnectionPoint().split("XPDR")[1].split("-")[0]);
+            String xpdrNodeId = nodeId + TapiStringConstants.XXPDR + xpdrNb;
+            uuids.add(new Uuid(UUID.nameUUIDFromBytes((String.join("+", xpdrNodeId, TapiStringConstants.XPDR))
+                    .getBytes(StandardCharsets.UTF_8)).toString()));
+        } else {
+            LOG.error("Updating this device is currently not supported");
+            return uuids;
+        }
+        return uuids;
+    }
+
+    private void updateSips(Mapping mapping, OwnedNodeEdgePoint onep) {
+        if (onep.getMappedServiceInterfacePoint() == null
+                || onep.getMappedServiceInterfacePoint().size() == 0) {
+            return;
+        }
+        for (MappedServiceInterfacePoint msip : onep.getMappedServiceInterfacePoint().values()) {
+            InstanceIdentifier<ServiceInterfacePoint> sipIID = InstanceIdentifier
+                    .builder(Context.class)
+                    .child(ServiceInterfacePoint.class,
+                            new ServiceInterfacePointKey(msip.getServiceInterfacePointUuid()))
+                    .build();
+            ServiceInterfacePoint sipblr = new ServiceInterfacePointBuilder()
+                    .setUuid(msip.getServiceInterfacePointUuid())
+                    .setAdministrativeState(transformAdminState(mapping.getPortAdminState()))
+                    .setOperationalState(transformOperState(mapping.getPortOperState())).build();
+            this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, sipIID, sipblr);
+        }
+
+    }
+
     private Map<NodeKey, Node> transformXpdrToTapiNode(String nodeId, List<Mapping> xpdrClMaps,
                                                        List<Mapping> xpdrNetMaps, XpdrNodeTypes xponderType,
                                                        OduSwitchingPools oorOduSwitchingPool) {
         Map<NodeKey, Node> nodeMap = new HashMap<>();
         LOG.info("creation of a DSR/ODU node for {}", nodeId);
-        Uuid nodeUuidDsr = new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId, TapiStringConstants.DSR))
-            .getBytes(Charset.forName("UTF-8"))).toString());
+        Uuid nodeUuidDsr = new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId, TapiStringConstants.XPDR))
+            .getBytes(StandardCharsets.UTF_8)).toString());
         Name nameDsr = new NameBuilder().setValueName("dsr/odu node name").setValue(
-            String.join("+", nodeId, TapiStringConstants.DSR)).build();
+            String.join("+", nodeId, TapiStringConstants.XPDR)).build();
+        Name nameOtsi =  new NameBuilder().setValueName("otsi node name").setValue(
+            String.join("+", nodeId, TapiStringConstants.XPDR)).build();
         Name nameNodeType = new NameBuilder().setValueName("Node Type")
             .setValue(getNodeType(xponderType)).build();
-        List<LayerProtocolName> dsrLayerProtocols = Arrays.asList(LayerProtocolName.DSR,
-            LayerProtocolName.ODU);
-        Node dsrNode = createTapiXpdrNode(Map.of(nameDsr.key(), nameDsr, nameNodeType.key(), nameNodeType),
-            dsrLayerProtocols, nodeId, nodeUuidDsr, xpdrClMaps, xpdrNetMaps, xponderType, oorOduSwitchingPool);
+        Set<LayerProtocolName> dsrLayerProtocols = Set.of(LayerProtocolName.DSR, LayerProtocolName.ODU,
+            LayerProtocolName.DIGITALOTN, LayerProtocolName.PHOTONICMEDIA);
+        Node dsrNode = createTapiXpdrNode(Map.of(nameDsr.key(), nameDsr, nameOtsi.key(), nameOtsi, nameNodeType.key(),
+            nameNodeType), dsrLayerProtocols, nodeId, nodeUuidDsr, xpdrClMaps, xpdrNetMaps, xponderType,
+            oorOduSwitchingPool);
 
         nodeMap.put(dsrNode.key(), dsrNode);
-
-        // node creation [otsi]
-        LOG.info("creation of an OTSi node for {}", nodeId);
-        Uuid nodeUuidOtsi = new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId, TapiStringConstants.OTSI))
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        Name nameOtsi =  new NameBuilder().setValueName("otsi node name").setValue(
-            String.join("+", nodeId, TapiStringConstants.OTSI)).build();
-        List<LayerProtocolName> otsiLayerProtocols = Arrays.asList(LayerProtocolName.PHOTONICMEDIA);
-        Node otsiNode = createTapiXpdrNode(Map.of(nameOtsi.key(), nameOtsi, nameNodeType.key(), nameNodeType),
-            otsiLayerProtocols, nodeId, nodeUuidOtsi, xpdrClMaps, xpdrNetMaps, xponderType, null);
-
-        nodeMap.put(otsiNode.key(), otsiNode);
-
-        // transitional link cration between network nep of DSR/ODU node and iNep of otsi node
-        LOG.info("creation of transitional links between DSR/ODU and OTSi nodes");
-        Map<LinkKey, Link> linkMap = createTapiTransitionalLinks(nodeId, xpdrNetMaps, nodeUuidDsr,
-            nodeUuidOtsi);
-        mergeLinkinTopology(linkMap);
-
         return nodeMap;
     }
 
@@ -294,41 +516,79 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
     }
 
     private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> transformSrgToOnep(String orNodeId,
-                                                                              Map<String, List<Mapping>> mapSrg) {
-        Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
+                Map<String, List<Mapping>> mapSrg) {
+        LOG.debug("CREATENEP transformSrgToOnep, ListOfMapping {}, of NodeId {} ", mapSrg, orNodeId);
+        Map<String, TerminationPoint1> tpMap = new HashMap<>();
+        //List<TerminationPoint> tpList = new ArrayList<>();
         for (Map.Entry<String, List<Mapping>> entry : mapSrg.entrySet()) {
             // For each srg node. Loop through the LCPs and create neps and sips for PP
             for (Mapping m:entry.getValue()) {
-                if (!m.getLogicalConnectionPoint().contains("PP")) {
-                    LOG.info("LCP {} is not an external TP of SRG node", m.getLogicalConnectionPoint());
+                String tpId = m.getLogicalConnectionPoint();
+                String overlayNodeId = String.join("-", orNodeId, tpId.split("\\-")[0]);
+                if (!tpId.contains("PP")) {
+                    LOG.info("LCP {} is not an external TP of SRG node", tpId);
                     continue;
                 }
-                Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> srgNeps =
-                    createRoadmNeps(orNodeId, m.getLogicalConnectionPoint(), true,
-                            transformOperState(m.getPortOperState()), transformAdminState(m.getPortAdminState()));
-                onepMap.putAll(srgNeps);
+                int counter = 50;
+                do {
+                    counter--;
+                    try {
+                        Thread.sleep(1);
+                    } catch (InterruptedException e) {
+                        // TODO Auto-generated catch block
+                        LOG.debug("Waiting until PP is backported in Topology, Exception raised", e);
+                    }
+                } while (getNetworkTerminationPoint1FromDatastore(overlayNodeId, tpId) == null && counter != 0);
+                if (getNetworkTerminationPoint1FromDatastore(overlayNodeId, tpId) != null) {
+                    //tpList.add(getNetworkTerminationPointFromDatastore(overlayNodeId, tpId));
+                    tpMap.put(tpId, getNetworkTerminationPoint1FromDatastore(overlayNodeId, tpId));
+                    LOG.debug("LCP {} is not empty for augmentation TP1", tpId);
+                } else {
+                    LOG.error("CREATENEP transformSrgToOnep, No Tp1 found in topology for LCP {}, of NodeId {} ",
+                        tpId, overlayNodeId);
+                }
+                if (getNetworkTerminationPoint11FromDatastore(overlayNodeId, tpId) != null) {
+                    LOG.info("LCP {} is not empty for augmentation TP11", tpId);
+                } else {
+                    LOG.error("CREATENEP transformSrgToOnep, No Tp11 found in topology for LCP {}, of NodeId {} ",
+                        tpId, overlayNodeId);
+                }
             }
         }
-        return onepMap;
+        LOG.debug("TransformSRGToONep for tps {}, of NodeId {} ",
+            tpMap.entrySet().stream().map(tp -> tp.getKey()).collect(Collectors.toList()).toString(), orNodeId);
+        return populateNepsForRdmNode(orNodeId, tpMap, false, TapiStringConstants.PHTNC_MEDIA_OTS);
     }
 
     private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> transformDegToOnep(String orNodeId,
-                                                                              Map<String, List<Mapping>> mapDeg) {
-        Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
+                Map<String, List<Mapping>> mapDeg) {
+        LOG.debug("CREATENEP transformDegToOnep, ListOfMapping {}, of NodeId {} ",
+            mapDeg.toString(), orNodeId);
+        Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> degOnepMap = new HashMap<>();
+        Map<String, TerminationPoint1> tpMap = new HashMap<>();
+        //List<TerminationPoint> tpList = new ArrayList<>();
         for (Map.Entry<String, List<Mapping>> entry : mapDeg.entrySet()) {
             // For each degree node. Loop through the LCPs and create neps and sips for TTP
             for (Mapping m:entry.getValue()) {
-                if (!m.getLogicalConnectionPoint().contains("TTP")) {
-                    LOG.info("LCP {} is not an external TP of DEGREE node", m.getLogicalConnectionPoint());
+                String tpId = m.getLogicalConnectionPoint();
+                String overlayNodeId = String.join("-", orNodeId, tpId.split("\\-")[0]);
+                if (!tpId.contains("TTP")) {
+                    LOG.info("LCP {} is not an external TP of DEGREE node", tpId);
                     continue;
                 }
-                Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> degNeps =
-                    createRoadmNeps(orNodeId, m.getLogicalConnectionPoint(), false,
-                            transformOperState(m.getPortOperState()), transformAdminState(m.getPortAdminState()));
-                onepMap.putAll(degNeps);
+                if (getNetworkTerminationPoint1FromDatastore(overlayNodeId, tpId) != null) {
+                    //tpList.add(getNetworkTerminationPointFromDatastore(overlayNodeId, tpId));
+                    tpMap.put(tpId, getNetworkTerminationPoint1FromDatastore(overlayNodeId, tpId));
+                    LOG.info("LCP {} is not empty for augmentation TP1", tpId);
+                } else {
+                    LOG.error("CREATENEP transformDegToOnep, No Tp found in topology for LCP {}, of NodeId {} ",
+                        tpId, overlayNodeId);
+                }
             }
         }
-        return onepMap;
+        degOnepMap.putAll(populateNepsForRdmNode(orNodeId, tpMap, false, TapiStringConstants.PHTNC_MEDIA_OTS));
+        degOnepMap.putAll(populateNepsForRdmNode(orNodeId, tpMap, false, TapiStringConstants.PHTNC_MEDIA_OMS));
+        return degOnepMap;
     }
 
     private List<String> getRoadmNodelist(List<Mapping> mappingList) {
@@ -362,7 +622,7 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
                 LOG.error("No topology object present. Error deleting node {}", nodeId);
                 return;
             }
-            topology = optTopology.get();
+            topology = optTopology.orElseThrow();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Couldnt read tapi topology from datastore", e);
         }
@@ -375,10 +635,15 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
             return;
         }
         if (nodeId.contains("ROADM")) {
-            // Node is in photonic media layer and UUID can be built from nodeId + PHTN_MEDIA
-            Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
-                TapiStringConstants.PHTNC_MEDIA)).getBytes(Charset.forName("UTF-8"))).toString());
-            deleteNodeFromTopo(nodeUuid);
+            if (topologicalMode.equals("Full")) {
+             // Node is in photonic media layer and UUID can be built from nodeId + PHTN_MEDIA
+                Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
+                    TapiStringConstants.PHTNC_MEDIA)).getBytes(StandardCharsets.UTF_8)).toString());
+                deleteNodeFromTopo(nodeUuid);
+            } else {
+                LOG.info("Abstracted Topo Mode in TAPI topology Datastore for OR topology representation. Node"
+                    + " {} is not represented in the abstraction and will not be deleted", nodeId);
+            }
         }
         if (nodeId.contains("XPDR") || nodeId.contains("SPDR") || nodeId.contains("MXPDR")) {
             // Node is either XPDR, MXPDR or SPDR. Retrieve nodes from topology and check names
@@ -408,7 +673,7 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
                 LOG.error("No context object present in datastore.");
                 return;
             }
-            context = optContext.get();
+            context = optContext.orElseThrow();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Couldnt read tapi context from datastore", e);
         }
@@ -428,48 +693,52 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
         }
     }
 
-    private Node createTapiXpdrNode(Map<NameKey, Name> nameMap, List<LayerProtocolName> layerProtocols,
+    private Node createTapiXpdrNode(Map<NameKey, Name> nameMap, Set<LayerProtocolName> layerProtocols,
                                     String nodeId, Uuid nodeUuid, List<Mapping> xpdrClMaps, List<Mapping> xpdrNetMaps,
                                     XpdrNodeTypes xponderType, OduSwitchingPools oorOduSwitchingPool) {
-        Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl = new HashMap<>();
-        Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList = new HashMap<>();
+
         Map<RuleKey, Rule> ruleList = new HashMap<>();
+        Set<RuleType> ruleTypes = new HashSet<>();
+        ruleTypes.add(RuleType.FORWARDING);
         Rule rule = new RuleBuilder()
                 .setLocalId("forward")
-                .setForwardingRule(ForwardingRule.MAYFORWARDACROSSGROUP)
-                .setRuleType(RuleType.FORWARDING)
+                .setForwardingRule(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE)
+                .setRuleType(ruleTypes)
                 .build();
         ruleList.put(rule.key(), rule);
-        if (layerProtocols.contains(LayerProtocolName.DSR)) {
-            // neps for dsr/odu layer
-            Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> dsroduNeps =
-                    createXpdrDsrOduNeps(nodeId, xpdrClMaps, xpdrNetMaps, xponderType);
-            onepl.putAll(dsroduNeps);
-            nodeRuleGroupList = createNodeRuleGroupForDsrNode(nodeId, oorOduSwitchingPool, ruleList, onepl);
-        } else if (layerProtocols.contains(LayerProtocolName.PHOTONICMEDIA)) {
-            // neps for photonic layer
-            Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> phtmdNeps =
-                    createXpdrPhtnMdNeps(nodeId, xpdrNetMaps);
-            onepl.putAll(phtmdNeps);
-            nodeRuleGroupList = createNodeRuleGroupForOtsiNode(nodeId, xpdrNetMaps, ruleList);
-        } else {
+        if (!(layerProtocols.contains(LayerProtocolName.DSR)
+                && layerProtocols.contains(LayerProtocolName.PHOTONICMEDIA))) {
             LOG.error("Undefined LayerProtocolName for {} node {}", nameMap.get(nameMap.keySet().iterator().next())
-                    .getValueName(), nameMap.get(nameMap.keySet().iterator().next()).getValue());
+                .getValueName(), nameMap.get(nameMap.keySet().iterator().next()).getValue());
         }
+        Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl = new HashMap<>();
+        onepl.putAll(createXpdrDsrOduNeps(nodeId, xpdrClMaps, xpdrNetMaps, xponderType));
+        Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupList = createNodeRuleGroupForDsrNode(
+                    nodeId, oorOduSwitchingPool, ruleList, onepl);
+        onepl.putAll(createXpdrPhtnMdNeps(nodeId, xpdrNetMaps));
+        LOG.debug("TapiNetworkModelServiceImpl line 721, total NEP map = {}", onepl.toString());
+
         // Empty random creation of mandatory fields for avoiding errors....
         CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
             .setCostAlgorithm("Restricted Shortest Path - RSP")
             .setCostName("HOP_COUNT")
-            .setCostValue("12345678")
+            .setCostValue(TapiStringConstants.COST_HOP_VALUE)
             .build();
         LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
-            .setFixedLatencyCharacteristic("12345678")
-            .setQueingLatencyCharacteristic("12345678")
-            .setJitterCharacteristic("12345678")
-            .setWanderCharacteristic("12345678")
+            .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
+            .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
+            .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
+            .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
             .setTrafficPropertyName("FIXED_LATENCY")
             .build();
-        return new NodeBuilder()
+        RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
+            .setRiskCharacteristicName("risk characteristic")
+            .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
+            .build();
+        RiskParameterPac riskParamPac = new RiskParameterPacBuilder()
+            .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
+            .build();
+        Node builtNode = new NodeBuilder()
             .setUuid(nodeUuid)
             .setName(nameMap)
             .setLayerProtocolName(layerProtocols)
@@ -486,69 +755,77 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
             .setDeliveryOrderCharacteristic("delivery order")
             .setUnavailableTimeCharacteristic("unavailable time")
             .setServerIntegrityProcessCharacteristic("server integrity process")
+            .setRiskParameterPac(riskParamPac)
             .build();
+        List<PhotonicMediaNodeEdgePointSpec> pmnepspecList = new ArrayList<>();
+        for (Map.Entry<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> entry :
+                builtNode.getOwnedNodeEdgePoint().entrySet()) {
+            if (!entry.getValue().getSupportedCepLayerProtocolQualifierInstances().stream()
+                        .filter(sclpqi -> sclpqi.getLayerProtocolQualifier().equals(PHOTONICLAYERQUALIFIEROTS.VALUE))
+                        .collect(Collectors.toList()).isEmpty()
+                    && entry.getValue().augmentationOrElseThrow(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang
+                        .tapi.photonic.media.rev221121.OwnedNodeEdgePoint1.class) != null
+                    && entry.getValue().augmentationOrElseThrow(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi
+                        .photonic.media.rev221121.OwnedNodeEdgePoint1.class).getPhotonicMediaNodeEdgePointSpec()
+                        != null) {
+                pmnepspecList.add(entry.getValue().augmentationOrElseThrow(org.opendaylight.yang.gen.v1.urn.onf.otcc
+                    .yang.tapi.photonic.media.rev221121.OwnedNodeEdgePoint1.class).getPhotonicMediaNodeEdgePointSpec());
+            }
+        }
+        LOG.debug("TapiNetworkModelServiceImpl line 775, List of non empty PMNEPSEC is = {}", pmnepspecList);
+        return builtNode;
     }
 
     private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> createXpdrPhtnMdNeps(String nodeId,
-                                                                                List<Mapping> xpdrNetMaps) {
+            List<Mapping> xpdrNetMaps) {
         Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl = new HashMap<>();
 
-        // iNep creation on otsi node
-        for (int i = 0; i < xpdrNetMaps.size(); i++) {
-            Uuid nepUuid1 = new Uuid(UUID.nameUUIDFromBytes(
-                (String.join("+", nodeId, TapiStringConstants.I_OTSI,
-                    xpdrNetMaps.get(i).getLogicalConnectionPoint())).getBytes(Charset.forName("UTF-8"))).toString());
-            Name onedName = new NameBuilder()
-                .setValueName("iNodeEdgePoint")
-                .setValue(String.join("+", nodeId, TapiStringConstants.I_OTSI,
-                    xpdrNetMaps.get(i).getLogicalConnectionPoint()))
-                .build();
-
-            ArrayList<Class<? extends SupportedIfCapability>> newSupIfCapList = convertSupIfCapaList(xpdrNetMaps, i);
-
-            OwnedNodeEdgePoint onep = createNep(nepUuid1, xpdrNetMaps.get(i).getLogicalConnectionPoint(),
-                Map.of(onedName.key(), onedName), LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA,
-                true, String.join("+", nodeId, TapiStringConstants.I_OTSI), newSupIfCapList,
-                transformOperState(xpdrNetMaps.get(i).getPortOperState()),
-                transformAdminState(xpdrNetMaps.get(i).getPortAdminState()));
-            onepl.put(onep.key(), onep);
-        }
         // eNep creation on otsi node
         for (int i = 0; i < xpdrNetMaps.size(); i++) {
             Uuid nepUuid2 = new Uuid(UUID.nameUUIDFromBytes(
-                (String.join("+", nodeId, TapiStringConstants.E_OTSI,
-                    xpdrNetMaps.get(i).getLogicalConnectionPoint())).getBytes(Charset.forName("UTF-8"))).toString());
+                (String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA_OTS,
+                    xpdrNetMaps.get(i).getLogicalConnectionPoint())).getBytes(StandardCharsets.UTF_8)).toString());
             Name onedName = new NameBuilder()
                 .setValueName("eNodeEdgePoint")
-                .setValue(String.join("+", nodeId, TapiStringConstants.E_OTSI,
+                .setValue(String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA_OTS,
                     xpdrNetMaps.get(i).getLogicalConnectionPoint()))
                 .build();
 
-            ArrayList<Class<? extends SupportedIfCapability>> newSupIfCapList = convertSupIfCapaList(xpdrNetMaps, i);
+            List<SupportedIfCapability> newSupIfCapList =
+                new ArrayList<>(xpdrNetMaps.get(i).getSupportedInterfaceCapability());
+            List<String> opModeList = new ArrayList<>();
+            if (xpdrNetMaps.get(i).getSupportedOperationalMode() != null) {
+                opModeList.addAll(xpdrNetMaps.get(i).getSupportedOperationalMode());
+            }
 
-            OwnedNodeEdgePoint onep = createNep(nepUuid2, xpdrNetMaps.get(i).getLogicalConnectionPoint(),
+            OwnedNodeEdgePoint onep = createNep(nodeId, nepUuid2, xpdrNetMaps.get(i).getLogicalConnectionPoint(),
                 Map.of(onedName.key(), onedName), LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA,
-                false, String.join("+", nodeId, TapiStringConstants.E_OTSI), newSupIfCapList,
+                true, String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA_OTS), newSupIfCapList, opModeList,
                 transformOperState(xpdrNetMaps.get(i).getPortOperState()),
                 transformAdminState(xpdrNetMaps.get(i).getPortAdminState()));
             onepl.put(onep.key(), onep);
         }
-        // Photonic Media Nep creation on otsi node
+        // OTSi_MC Nep creation on otsi node
         for (int i = 0; i < xpdrNetMaps.size(); i++) {
             Uuid nepUuid3 = new Uuid(UUID.nameUUIDFromBytes(
-                (String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA,
-                    xpdrNetMaps.get(i).getLogicalConnectionPoint())).getBytes(Charset.forName("UTF-8"))).toString());
+                (String.join("+", nodeId, TapiStringConstants.OTSI_MC,
+                    xpdrNetMaps.get(i).getLogicalConnectionPoint())).getBytes(StandardCharsets.UTF_8)).toString());
             Name onedName = new NameBuilder()
                 .setValueName("PhotMedNodeEdgePoint")
-                .setValue(String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA,
+                .setValue(String.join("+", nodeId, TapiStringConstants.OTSI_MC,
                     xpdrNetMaps.get(i).getLogicalConnectionPoint()))
                 .build();
 
-            ArrayList<Class<? extends SupportedIfCapability>> newSupIfCapList = convertSupIfCapaList(xpdrNetMaps, i);
+            List<SupportedIfCapability> newSupIfCapList =
+                    new ArrayList<>(xpdrNetMaps.get(i).getSupportedInterfaceCapability());
+            List<String> opModeList = new ArrayList<>();
+            if (xpdrNetMaps.get(i).getSupportedOperationalMode() != null) {
+                opModeList.addAll(xpdrNetMaps.get(i).getSupportedOperationalMode());
+            }
 
-            OwnedNodeEdgePoint onep = createNep(nepUuid3, xpdrNetMaps.get(i).getLogicalConnectionPoint(),
+            OwnedNodeEdgePoint onep = createNep(nodeId, nepUuid3, xpdrNetMaps.get(i).getLogicalConnectionPoint(),
                 Map.of(onedName.key(), onedName), LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.PHOTONICMEDIA,
-                false, String.join("+", nodeId, TapiStringConstants.PHTNC_MEDIA), newSupIfCapList,
+                false, String.join("+", nodeId, TapiStringConstants.OTSI_MC), newSupIfCapList, opModeList,
                 transformOperState(xpdrNetMaps.get(i).getPortOperState()),
                 transformAdminState(xpdrNetMaps.get(i).getPortAdminState()));
             onepl.put(onep.key(), onep);
@@ -566,7 +843,7 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
                 xpdrClMaps.get(i).getLogicalConnectionPoint()));
             Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
                 (String.join("+", nodeId, TapiStringConstants.DSR,
-                    xpdrClMaps.get(i).getLogicalConnectionPoint())).getBytes(Charset.forName("UTF-8"))).toString());
+                    xpdrClMaps.get(i).getLogicalConnectionPoint())).getBytes(StandardCharsets.UTF_8)).toString());
             NameBuilder nameBldr = new NameBuilder().setValue(String.join("+", nodeId,
                 TapiStringConstants.DSR, xpdrClMaps.get(i).getLogicalConnectionPoint()));
             Name name;
@@ -576,11 +853,12 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
                 name = nameBldr.setValueName("NodeEdgePoint_C").build();
             }
 
-            ArrayList<Class<? extends SupportedIfCapability>> newSupIfCapList = convertSupIfCapaList(xpdrClMaps, i);
+            List<SupportedIfCapability> newSupIfCapList =
+                    new ArrayList<>(xpdrClMaps.get(i).getSupportedInterfaceCapability());
 
-            OwnedNodeEdgePoint onep = createNep(nepUuid, xpdrClMaps.get(i).getLogicalConnectionPoint(),
+            OwnedNodeEdgePoint onep = createNep(nodeId, nepUuid, xpdrClMaps.get(i).getLogicalConnectionPoint(),
                 Map.of(name.key(), name), LayerProtocolName.DSR, LayerProtocolName.DSR, true,
-                String.join("+", nodeId, TapiStringConstants.DSR), newSupIfCapList,
+                String.join("+", nodeId, TapiStringConstants.DSR), newSupIfCapList, null,
                 transformOperState(xpdrClMaps.get(i).getPortOperState()),
                 transformAdminState(xpdrClMaps.get(i).getPortAdminState()));
             onepl.put(onep.key(), onep);
@@ -591,19 +869,19 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
                 xpdrNetMaps.get(i).getLogicalConnectionPoint()));
             Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
                 (String.join("+", nodeId, TapiStringConstants.I_ODU,
-                    xpdrNetMaps.get(i).getLogicalConnectionPoint())).getBytes(Charset.forName("UTF-8"))).toString());
+                    xpdrNetMaps.get(i).getLogicalConnectionPoint())).getBytes(StandardCharsets.UTF_8)).toString());
             Name onedName = new NameBuilder()
                 .setValueName("iNodeEdgePoint_N")
                 .setValue(String.join("+", nodeId, TapiStringConstants.I_ODU,
                     xpdrNetMaps.get(i).getLogicalConnectionPoint()))
                 .build();
 
-            ArrayList<Class<? extends SupportedIfCapability>> newSupIfCapList = convertSupIfCapaList(xpdrNetMaps, i);
-
-            OwnedNodeEdgePoint onep = createNep(nepUuid, xpdrNetMaps.get(i).getLogicalConnectionPoint(),
+            List<SupportedIfCapability> newSupIfCapList =
+                    new ArrayList<>(xpdrNetMaps.get(i).getSupportedInterfaceCapability());
+            OwnedNodeEdgePoint onep = createNep(nodeId, nepUuid, xpdrNetMaps.get(i).getLogicalConnectionPoint(),
                 Map.of(onedName.key(), onedName),
                 LayerProtocolName.ODU, LayerProtocolName.DSR, true,
-                String.join("+", nodeId, TapiStringConstants.I_ODU), newSupIfCapList,
+                String.join("+", nodeId, TapiStringConstants.I_ODU), newSupIfCapList, null,
                 transformOperState(xpdrNetMaps.get(i).getPortOperState()),
                 transformAdminState(xpdrNetMaps.get(i).getPortAdminState()));
             onepl.put(onep.key(), onep);
@@ -614,19 +892,20 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
                 xpdrClMaps.get(i).getLogicalConnectionPoint()));
             Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(
                 (String.join("+", nodeId, TapiStringConstants.E_ODU,
-                    xpdrClMaps.get(i).getLogicalConnectionPoint())).getBytes(Charset.forName("UTF-8"))).toString());
+                    xpdrClMaps.get(i).getLogicalConnectionPoint())).getBytes(StandardCharsets.UTF_8)).toString());
             Name onedName = new NameBuilder()
                 .setValueName("eNodeEdgePoint_N")
                 .setValue(String.join("+", nodeId, TapiStringConstants.E_ODU,
                     xpdrClMaps.get(i).getLogicalConnectionPoint()))
                 .build();
 
-            ArrayList<Class<? extends SupportedIfCapability>> newSupIfCapList = convertSupIfCapaList(xpdrClMaps, i);
+            List<SupportedIfCapability> newSupIfCapList =
+                    new ArrayList<>(xpdrClMaps.get(i).getSupportedInterfaceCapability());
 
-            OwnedNodeEdgePoint onep = createNep(nepUuid, xpdrClMaps.get(i).getLogicalConnectionPoint(),
+            OwnedNodeEdgePoint onep = createNep(nodeId, nepUuid, xpdrClMaps.get(i).getLogicalConnectionPoint(),
                 Map.of(onedName.key(), onedName),
-                LayerProtocolName.ODU, LayerProtocolName.DSR, false,
-                String.join("+", nodeId, TapiStringConstants.E_ODU), newSupIfCapList,
+                LayerProtocolName.ODU, LayerProtocolName.DSR, true,
+                String.join("+", nodeId, TapiStringConstants.E_ODU), newSupIfCapList, null,
                 transformOperState(xpdrClMaps.get(i).getPortOperState()),
                 transformAdminState(xpdrClMaps.get(i).getPortAdminState()));
             onepl.put(onep.key(), onep);
@@ -645,165 +924,110 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
         return adminState.equals(AdminStates.InService) ? AdministrativeState.UNLOCKED : AdministrativeState.LOCKED;
     }
 
-    private OwnedNodeEdgePoint createNep(Uuid nepUuid, String tpid, Map<NameKey, Name> nepNames,
-                                         LayerProtocolName nepProtocol, LayerProtocolName nodeProtocol, boolean withSip,
-                                         String keyword,
-                                         List<Class<? extends SupportedIfCapability>> supportedInterfaceCapability,
-                                         OperationalState operState, AdministrativeState adminState) {
+    private OwnedNodeEdgePoint createNep(String nodeId, Uuid nepUuid, String tpid, Map<NameKey, Name> nepNames,
+            LayerProtocolName nepProtocol, LayerProtocolName nodeProtocol, boolean withSip, String keyword,
+            List<SupportedIfCapability> sicList, List<String> opModeList,
+            OperationalState operState, AdministrativeState adminState) {
+        List<SupportedInterfaceCapability> sicListTemp = new ArrayList<>();
+        List<OperationalModeKey> keyedOpModeList = new ArrayList<>();
+        for (SupportedIfCapability supInterCapa : sicList) {
+            SupportedInterfaceCapability supIfCapa = new SupportedInterfaceCapabilityBuilder()
+                    .withKey(new SupportedInterfaceCapabilityKey(supInterCapa))
+                    .setIfCapType(supInterCapa)
+                    .build();
+            sicListTemp.add(supIfCapa);
+        }
+        Collection<SupportedInterfaceCapability> sicColl = sicListTemp;
         OwnedNodeEdgePointBuilder onepBldr = new OwnedNodeEdgePointBuilder()
                 .setUuid(nepUuid)
                 .setLayerProtocolName(nepProtocol)
                 .setName(nepNames);
         if (withSip) {
-            onepBldr.setMappedServiceInterfacePoint(createMSIP(1, nepProtocol, tpid, keyword,
-                    supportedInterfaceCapability, operState, adminState));
+            onepBldr.setMappedServiceInterfacePoint(this.tapiFactory.createMSIP(1, nepProtocol, tpid, keyword,
+                    sicColl, operState, adminState));
+            this.sipMap.putAll(tapiFactory.getTapiSips());
         }
         LOG.debug("Node layer {}", nodeProtocol.getName());
-        onepBldr.setSupportedCepLayerProtocolQualifier(createSupportedLayerProtocolQualifier(
-                supportedInterfaceCapability, nepProtocol));
-        onepBldr.setLinkPortDirection(PortDirection.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC)
+        onepBldr.setSupportedCepLayerProtocolQualifierInstances(
+                this.tapiFactory.createSupportedCepLayerProtocolQualifier(sicColl, nepProtocol));
+        onepBldr.setDirection(Direction.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC)
                 .setAdministrativeState(adminState).setOperationalState(operState)
-                .setLifecycleState(LifecycleState.INSTALLED).setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
-                .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL);
+                .setLifecycleState(LifecycleState.INSTALLED);
+        if (keyword.contains(TapiStringConstants.OTSI_MC) || keyword.contains(TapiStringConstants.PHTNC_MEDIA_OTS)) {
+            if (opModeList == null || opModeList.isEmpty()) {
+                for (SupportedInterfaceCapability sic : sicColl) {
+                    String ifCapType = sic.getIfCapType().toString().split("\\{")[0];
+                    if (("IfOCHOTUCnODUCn").equals(ifCapType) || ("IfOCHOTUCnODUCnUniregen").equals(ifCapType)
+                            || ("IfOCHOTUCnODUCnRegen").equals(ifCapType)) {
+                        keyedOpModeList.add(new OperationalModeKey("400G"));
+                        LOG.warn(TopologyUtils.NOOPMODEDECLARED + "400G rate available", tpid);
+                        break;
+                    }
+                }
+                keyedOpModeList.add(new OperationalModeKey("100G"));
+                LOG.warn(TopologyUtils.NOOPMODEDECLARED + "100G rate available", tpid);
+            } else {
+                for (String opMode : opModeList) {
+                    keyedOpModeList.add(new OperationalModeKey(opMode));
+                }
+            }
+            Map<Double, Double> freqWidthMap = new HashMap<>();
+            if (getNetworkTerminationPointFromDatastore(nodeId, tpid) != null) {
+                freqWidthMap = tapiFactory.getXpdrUsedWavelength(getNetworkTerminationPointFromDatastore(nodeId, tpid));
+            } else {
+                LOG.error("CREATENEP, No Tp found in topology for LCP {}, of NodeId {} ", tpid, nodeId);
+            }
+            onepBldr = tapiFactory.addPayloadStructureAndPhotSpecToOnep(nodeId, freqWidthMap, keyedOpModeList,
+                sicColl, onepBldr, keyword);
+            LOG.debug("TapiNetworkServiceImpl line982, onep = {}", onepBldr.build());
+        }
         return onepBldr.build();
     }
 
-    private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> createRoadmNeps(String orNodeId, String tpId,
-                                                                           boolean withSip, OperationalState operState,
-                                                                           AdministrativeState adminState) {
-        Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
-        // PHOTONIC MEDIA nep
-        Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", orNodeId,
-                TapiStringConstants.PHTNC_MEDIA, tpId)).getBytes(Charset.forName("UTF-8"))).toString());
-        Name nepName = new NameBuilder()
-                .setValueName(TapiStringConstants.PHTNC_MEDIA + "NodeEdgePoint")
-                .setValue(String.join("+", orNodeId, TapiStringConstants.PHTNC_MEDIA, tpId))
-                .build();
-        OwnedNodeEdgePoint onep = new OwnedNodeEdgePointBuilder()
-            .setUuid(nepUuid)
-            .setLayerProtocolName(LayerProtocolName.PHOTONICMEDIA)
-            .setName(Map.of(nepName.key(), nepName))
-            .setSupportedCepLayerProtocolQualifier(List.of(PHOTONICLAYERQUALIFIEROMS.class))
-            .setLinkPortDirection(PortDirection.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC)
-            .setAdministrativeState(adminState).setOperationalState(operState)
-            .setLifecycleState(LifecycleState.INSTALLED).setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
-            .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL)
-            .build();
-        onepMap.put(onep.key(), onep);
-
-        // MC nep
-        Uuid nepUuid1 = new Uuid(UUID.nameUUIDFromBytes((String.join("+", orNodeId,
-                TapiStringConstants.MC, tpId)).getBytes(Charset.forName("UTF-8"))).toString());
-        Name nepName1 = new NameBuilder()
-                .setValueName(TapiStringConstants.MC + "NodeEdgePoint")
-                .setValue(String.join("+", orNodeId, TapiStringConstants.MC, tpId))
+    private Node createRoadmTapiNode(String orNodeId, Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap) {
+        // UUID and Node Names
+        Uuid nodeUuid;
+        Name nodeNames;
+        if (orNodeId.equals("ROADMINFRA")) {
+            nodeUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.RDM_INFRA
+                .getBytes(Charset.forName("UTF-8"))).toString());
+            nodeNames =  new NameBuilder().setValueName("roadm node name").setValue(TapiStringConstants.RDM_INFRA)
                 .build();
-        OwnedNodeEdgePointBuilder onepBldr1 = new OwnedNodeEdgePointBuilder()
-                .setUuid(nepUuid1)
-                .setLayerProtocolName(LayerProtocolName.PHOTONICMEDIA)
-                .setName(Map.of(nepName1.key(), nepName1))
-                .setSupportedCepLayerProtocolQualifier(List.of(PHOTONICLAYERQUALIFIEROMS.class))
-                .setLinkPortDirection(PortDirection.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC)
-                .setAdministrativeState(adminState).setOperationalState(operState)
-                .setLifecycleState(LifecycleState.INSTALLED).setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
-                .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL);
-        if (withSip) {
-            onepBldr1.setMappedServiceInterfacePoint(createMSIP(1, LayerProtocolName.PHOTONICMEDIA,
-                tpId, String.join("+", orNodeId, TapiStringConstants.MC), null,
-                operState, adminState));
-        }
-        OwnedNodeEdgePoint onep1 = onepBldr1.build();
-        onepMap.put(onep1.key(), onep1);
-
-        // OTSiMC nep
-        Uuid nepUuid2 = new Uuid(UUID.nameUUIDFromBytes((String.join("+", orNodeId, TapiStringConstants.OTSI_MC,
-                tpId)).getBytes(Charset.forName("UTF-8"))).toString());
-        Name nepName2 = new NameBuilder()
-                .setValueName(TapiStringConstants.OTSI_MC + "NodeEdgePoint")
-                .setValue(String.join("+", orNodeId, TapiStringConstants.OTSI_MC, tpId))
-                .build();
-
-        OwnedNodeEdgePoint onep2 = new OwnedNodeEdgePointBuilder()
-            .setUuid(nepUuid2)
-            .setLayerProtocolName(LayerProtocolName.PHOTONICMEDIA)
-            .setName(Map.of(nepName2.key(), nepName2))
-            .setSupportedCepLayerProtocolQualifier(List.of(PHOTONICLAYERQUALIFIEROMS.class))
-            .setLinkPortDirection(PortDirection.BIDIRECTIONAL).setLinkPortRole(PortRole.SYMMETRIC)
-            .setAdministrativeState(adminState).setOperationalState(operState)
-            .setLifecycleState(LifecycleState.INSTALLED).setTerminationDirection(TerminationDirection.BIDIRECTIONAL)
-            .setTerminationState(TerminationState.TERMINATEDBIDIRECTIONAL)
-            .build();
-        onepMap.put(onep2.key(), onep2);
-        return onepMap;
-    }
-
-    private Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint>
-            createMSIP(int nb, LayerProtocolName layerProtocol, String tpid, String nodeid,
-                   List<Class<? extends SupportedIfCapability>> supportedInterfaceCapability,
-                   OperationalState operState, AdministrativeState adminState) {
-        Map<MappedServiceInterfacePointKey, MappedServiceInterfacePoint> msipl = new HashMap<>();
-        for (int i = 0; i < nb; i++) {
-            Uuid sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP", nodeid,
-                    tpid)).getBytes(Charset.forName("UTF-8"))).toString());
-            MappedServiceInterfacePoint msip = new MappedServiceInterfacePointBuilder()
-                    .setServiceInterfacePointUuid(sipUuid).build();
-            ServiceInterfacePoint sip = createSIP(sipUuid, layerProtocol, tpid, nodeid, supportedInterfaceCapability,
-                operState, adminState);
-            this.sipMap.put(sip.key(), sip);
-            LOG.info("SIP created {}", sip.getUuid());
-            // this.tapiSips.put(sip.key(), sip);
-            msipl.put(msip.key(), msip);
+        } else {
+            nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", orNodeId,
+                TapiStringConstants.PHTNC_MEDIA)).getBytes(StandardCharsets.UTF_8)).toString());
+            nodeNames =  new NameBuilder().setValueName("roadm node name")
+                .setValue(String.join("+", orNodeId, TapiStringConstants.PHTNC_MEDIA)).build();
         }
-        return msipl;
-    }
-
-    private ServiceInterfacePoint createSIP(Uuid sipUuid, LayerProtocolName layerProtocol, String tpid, String nodeid,
-                                            List<Class<? extends SupportedIfCapability>> supportedInterfaceCapability,
-                                            OperationalState operState, AdministrativeState adminState) {
-        // TODO: what value should be set in total capacity and available capacity
-        LOG.info("SIP name = {}", String.join("+", nodeid, tpid));
-        Name sipName = new NameBuilder()
-                .setValueName("SIP name")
-                .setValue(String.join("+", nodeid, tpid))
-                .build();
-        return new ServiceInterfacePointBuilder()
-                .setUuid(sipUuid)
-                .setName(Map.of(sipName.key(), sipName))
-                .setLayerProtocolName(layerProtocol)
-                .setAdministrativeState(adminState)
-                .setOperationalState(operState)
-                .setLifecycleState(LifecycleState.INSTALLED)
-                .setAvailableCapacity(new AvailableCapacityBuilder().build())
-                .setTotalPotentialCapacity(new TotalPotentialCapacityBuilder().build())
-                .setSupportedLayerProtocolQualifier(createSupportedLayerProtocolQualifier(supportedInterfaceCapability,
-                        layerProtocol))
-                .build();
-    }
-
-    private Node createRoadmTapiNode(String orNodeId, Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> oneplist) {
-        // UUID
-        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", orNodeId,
-            TapiStringConstants.PHTNC_MEDIA)).getBytes(Charset.forName("UTF-8"))).toString());
-        // Names
-        Name nodeNames =  new NameBuilder().setValueName("roadm node name")
-            .setValue(String.join("+", orNodeId, TapiStringConstants.PHTNC_MEDIA)).build();
         Name nameNodeType = new NameBuilder().setValueName("Node Type")
             .setValue(OpenroadmNodeType.ROADM.getName()).build();
         // Protocol Layer
-        List<LayerProtocolName> layerProtocols = Arrays.asList(LayerProtocolName.PHOTONICMEDIA);
+        Set<LayerProtocolName> layerProtocols = Set.of(LayerProtocolName.PHOTONICMEDIA);
         // Empty random creation of mandatory fields for avoiding errors....
         CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
             .setCostAlgorithm("Restricted Shortest Path - RSP")
             .setCostName("HOP_COUNT")
-            .setCostValue("12345678")
+            .setCostValue(TapiStringConstants.COST_HOP_VALUE)
             .build();
         LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
-            .setFixedLatencyCharacteristic("12345678")
-            .setQueingLatencyCharacteristic("12345678")
-            .setJitterCharacteristic("12345678")
-            .setWanderCharacteristic("12345678")
+            .setFixedLatencyCharacteristic(TapiStringConstants.COST_HOP_VALUE)
+            .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
+            .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
+            .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
             .setTrafficPropertyName("FIXED_LATENCY")
             .build();
+        RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
+            .setRiskCharacteristicName("risk characteristic")
+            .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
+            .build();
+        RiskParameterPac riskParamPac = new RiskParameterPacBuilder()
+            .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
+            .build();
+        Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap
+            = tapiFactory.createAllNodeRuleGroupForRdmNode(topologicalMode, nodeUuid, orNodeId, onepMap.values());
+        Map<InterRuleGroupKey, InterRuleGroup> interRuleGroupMap
+            = tapiFactory.createInterRuleGroupForRdmNode(topologicalMode, nodeUuid, orNodeId,
+                nodeRuleGroupMap.entrySet().stream().map(e -> e.getKey()).collect(Collectors.toList()));
         return new NodeBuilder()
             .setUuid(nodeUuid)
             .setName(Map.of(nodeNames.key(), nodeNames, nameNodeType.key(), nameNodeType))
@@ -811,8 +1035,9 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
             .setAdministrativeState(AdministrativeState.UNLOCKED)
             .setOperationalState(OperationalState.ENABLED)
             .setLifecycleState(LifecycleState.INSTALLED)
-            .setOwnedNodeEdgePoint(oneplist)
-            .setNodeRuleGroup(createNodeRuleGroupForRdmNode(orNodeId, nodeUuid, oneplist.values()))
+            .setOwnedNodeEdgePoint(onepMap)
+            .setNodeRuleGroup(nodeRuleGroupMap)
+            .setInterRuleGroup(interRuleGroupMap)
             .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
             .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
             .setErrorCharacteristic("error")
@@ -821,56 +1046,10 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
             .setDeliveryOrderCharacteristic("delivery order")
             .setUnavailableTimeCharacteristic("unavailable time")
             .setServerIntegrityProcessCharacteristic("server integrity process")
+            .setRiskParameterPac(riskParamPac)
             .build();
     }
 
-    private Map<NodeRuleGroupKey, NodeRuleGroup> createNodeRuleGroupForRdmNode(String orNodeId, Uuid nodeUuid,
-                                                                               Collection<OwnedNodeEdgePoint> onepl) {
-        Map<NodeEdgePointKey, NodeEdgePoint>
-                nepMap = new HashMap<>();
-        for (OwnedNodeEdgePoint onep : onepl) {
-            NodeEdgePoint nep = new NodeEdgePointBuilder()
-                .setTopologyUuid(this.tapiTopoUuid)
-                .setNodeUuid(nodeUuid)
-                .setNodeEdgePointUuid(onep.key().getUuid())
-                .build();
-            nepMap.put(nep.key(), nep);
-        }
-        Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap = new HashMap<>();
-        Map<RuleKey, Rule> ruleList = new HashMap<>();
-        Rule rule = new RuleBuilder()
-                .setLocalId("forward")
-                .setForwardingRule(ForwardingRule.MAYFORWARDACROSSGROUP)
-                .setRuleType(RuleType.FORWARDING)
-                .build();
-        ruleList.put(rule.key(), rule);
-        NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
-                .setUuid(new Uuid(UUID.nameUUIDFromBytes((orNodeId + " node rule group")
-                        .getBytes(Charset.forName("UTF-8"))).toString()))
-                .setRule(ruleList)
-                .setNodeEdgePoint(nepMap)
-                .build();
-        nodeRuleGroupMap.put(nodeRuleGroup.key(), nodeRuleGroup);
-        return nodeRuleGroupMap;
-    }
-
-    private Map<LinkKey, Link> createTapiTransitionalLinks(String nodeId, List<Mapping> xpdrNetMaps, Uuid nodeUuidDsr,
-                                                           Uuid nodeUuidOtsi) {
-        Map<LinkKey, Link> linkMap = new HashMap<>();
-        for (Mapping mapping : xpdrNetMaps) {
-            Link transiLink = tapiLink.createTapiLink(nodeId, mapping.getLogicalConnectionPoint(), nodeId,
-                mapping.getLogicalConnectionPoint(), TapiStringConstants.TRANSITIONAL_LINK, TapiStringConstants.DSR,
-                TapiStringConstants.OTSI, TapiStringConstants.I_ODU, TapiStringConstants.I_OTSI,
-                "inService", "inService", Arrays.asList(LayerProtocolName.ODU,
-                    LayerProtocolName.PHOTONICMEDIA),
-                Arrays.asList(LayerProtocolName.ODU.getName(), LayerProtocolName.PHOTONICMEDIA.getName()),
-                this.tapiTopoUuid);
-            linkMap.put(transiLink.key(), transiLink);
-        }
-        // return a map of links and then we can do merge the corresponding link map into the topology context
-        return linkMap;
-    }
-
     private OduSwitchingPools createTpdrSwitchPool(List<Mapping> xpdrNetMaps) {
         Map<NonBlockingListKey, NonBlockingList> nblMap = new HashMap<>();
         int count = 1;
@@ -879,7 +1058,7 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
             LOG.info("XPDr net associated LCP = {}", xpdrNetMaps.get(i - 1).getConnectionMapLcp());
             TpId tpid1 = new TpId(xpdrNetMaps.get(i - 1).getLogicalConnectionPoint());
             TpId tpid2 = new TpId(xpdrNetMaps.get(i - 1).getConnectionMapLcp());
-            List<TpId> tpList = new ArrayList<>();
+            Set<TpId> tpList = new HashSet<>();
             tpList.add(tpid1);
             tpList.add(tpid2);
             NonBlockingList nbl = new NonBlockingListBuilder()
@@ -897,7 +1076,7 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
 
     private OduSwitchingPools createSwtchSwitchPool(List<Mapping> xpdrClMaps, List<Mapping> xpdrNetMaps,
                                                     Integer xpdrNb) {
-        List<TpId> tpl = new ArrayList<>();
+        Set<TpId> tpl = new HashSet<>();
         TpId tpId = null;
         for (int i = 1; i <= xpdrClMaps.size(); i++) {
             tpId = new TpId("XPDR" + xpdrNb + TapiStringConstants.CLIENT + i);
@@ -924,7 +1103,7 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
     private OduSwitchingPools createMuxSwitchPool(List<Mapping> xpdrClMaps, List<Mapping> xpdrNetMaps, Integer xpdrNb) {
         Map<NonBlockingListKey, NonBlockingList> nbMap = new HashMap<>();
         for (int i = 1; i <= xpdrClMaps.size(); i++) {
-            List<TpId> tpList = new ArrayList<>();
+            Set<TpId> tpList = new HashSet<>();
             TpId tpId = new TpId("XPDR" + xpdrNb + TapiStringConstants.CLIENT + i);
             tpList.add(tpId);
             tpId = new TpId("XPDR" + xpdrNb + "-NETWORK1");
@@ -944,76 +1123,15 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
                 .build();
     }
 
-    private Map<NodeRuleGroupKey, NodeRuleGroup> createNodeRuleGroupForOtsiNode(String nodeId,
-                                                                                List<Mapping> xpdrNetMaps,
-                                                                                Map<RuleKey, Rule> ruleList) {
-        Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap = new HashMap<>();
-        // create NodeRuleGroup
-        int count = 1;
-        for (Mapping tpMapping : xpdrNetMaps) {
-            Map<NodeEdgePointKey, NodeEdgePoint> nepList = new HashMap<>();
-            NodeEdgePoint inep = new NodeEdgePointBuilder()
-                .setTopologyUuid(this.tapiTopoUuid)
-                .setNodeUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
-                        TapiStringConstants.OTSI)).getBytes(Charset.forName("UTF-8"))).toString()))
-                .setNodeEdgePointUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
-                    TapiStringConstants.I_OTSI, tpMapping.getLogicalConnectionPoint()))
-                    .getBytes(Charset.forName("UTF-8"))).toString()))
-                .build();
-            NodeEdgePoint enep = new NodeEdgePointBuilder()
-                .setTopologyUuid(this.tapiTopoUuid)
-                .setNodeUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
-                    TapiStringConstants.OTSI)).getBytes(Charset.forName("UTF-8"))).toString()))
-                .setNodeEdgePointUuid(new Uuid(UUID.nameUUIDFromBytes(
-                    (String.join("+", nodeId, TapiStringConstants.E_OTSI,
-                        tpMapping.getLogicalConnectionPoint())).getBytes(Charset.forName("UTF-8"))).toString()))
-                .build();
-            nepList.put(inep.key(), inep);
-            nepList.put(enep.key(), enep);
-            // Empty random creation of mandatory fields for avoiding errors....
-            CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
-                .setCostAlgorithm("Restricted Shortest Path - RSP")
-                .setCostName("HOP_COUNT")
-                .setCostValue("12345678")
-                .build();
-            LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
-                .setFixedLatencyCharacteristic("12345678")
-                .setQueingLatencyCharacteristic("12345678")
-                .setJitterCharacteristic("12345678")
-                .setWanderCharacteristic("12345678")
-                .setTrafficPropertyName("FIXED_LATENCY")
-                .build();
-            RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
-                .setRiskCharacteristicName("risk characteristic")
-                .setRiskIdentifierList(List.of("risk identifier1", "risk identifier2"))
-                .build();
-            NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
-                .setUuid(new Uuid(
-                    UUID.nameUUIDFromBytes(("otsi node rule group " + count).getBytes(Charset.forName("UTF-8")))
-                        .toString()))
-                .setRule(ruleList)
-                .setNodeEdgePoint(nepList)
-                .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
-                .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
-                .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
-                .build();
-            nodeRuleGroupMap.put(nodeRuleGroup.key(), nodeRuleGroup);
-            count++;
-        }
-        return nodeRuleGroupMap;
-    }
-
     private Map<NodeRuleGroupKey, NodeRuleGroup> createNodeRuleGroupForDsrNode(String nodeId,
-                                                                               OduSwitchingPools oorOduSwitchingPool,
-                                                                               Map<RuleKey, Rule> ruleList,
-                                                                               Map<OwnedNodeEdgePointKey,
-                                                                                       OwnedNodeEdgePoint> onepl) {
+            OduSwitchingPools oorOduSwitchingPool, Map<RuleKey, Rule> ruleList,
+            Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepl) {
         // create NodeRuleGroup
         if (oorOduSwitchingPool == null) {
             LOG.info("No switching pool created for node = {}", nodeId);
             return new HashMap<>();
         }
-        LOG.info("ONEPL = {}", onepl.values());
+        LOG.debug("ONEPL = {}", onepl.values());
         Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap = new HashMap<>();
         int count = 1;
         for (NonBlockingList nbl : oorOduSwitchingPool.nonnullNonBlockingList().values()) {
@@ -1023,23 +1141,23 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
                 LOG.info("EDOU TP = {}", String.join("+", nodeId, TapiStringConstants.E_ODU, tp.getValue()));
                 LOG.info("DSR TP = {}", String.join("+", nodeId, TapiStringConstants.DSR, tp.getValue()));
                 Uuid tpUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
-                    TapiStringConstants.E_ODU, tp.getValue())).getBytes(Charset.forName("UTF-8"))).toString());
+                    TapiStringConstants.E_ODU, tp.getValue())).getBytes(StandardCharsets.UTF_8)).toString());
                 Uuid tp1Uuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
-                    TapiStringConstants.DSR, tp.getValue())).getBytes(Charset.forName("UTF-8"))).toString());
+                    TapiStringConstants.DSR, tp.getValue())).getBytes(StandardCharsets.UTF_8)).toString());
                 if (onepl.containsKey(new OwnedNodeEdgePointKey(tpUuid))
                         && onepl.containsKey(new OwnedNodeEdgePointKey(tp1Uuid))) {
                     NodeEdgePoint nep1 = new NodeEdgePointBuilder()
                         .setTopologyUuid(this.tapiTopoUuid)
                         .setNodeUuid(new Uuid(UUID.nameUUIDFromBytes(
                             (String.join("+", nodeId,TapiStringConstants. DSR))
-                                .getBytes(Charset.forName("UTF-8"))).toString()))
+                                .getBytes(StandardCharsets.UTF_8)).toString()))
                         .setNodeEdgePointUuid(tp1Uuid)
                         .build();
                     NodeEdgePoint nep2 = new NodeEdgePointBuilder()
                         .setTopologyUuid(this.tapiTopoUuid)
                         .setNodeUuid(new Uuid(UUID.nameUUIDFromBytes(
                             (String.join("+", nodeId,TapiStringConstants. DSR))
-                                .getBytes(Charset.forName("UTF-8"))).toString()))
+                                .getBytes(StandardCharsets.UTF_8)).toString()))
                         .setNodeEdgePointUuid(tpUuid)
                         .build();
                     nepList.put(nep1.key(), nep1);
@@ -1050,22 +1168,22 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
             CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
                 .setCostAlgorithm("Restricted Shortest Path - RSP")
                 .setCostName("HOP_COUNT")
-                .setCostValue("12345678")
+                .setCostValue(TapiStringConstants.COST_HOP_VALUE)
                 .build();
             LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
-                .setFixedLatencyCharacteristic("12345678")
-                .setQueingLatencyCharacteristic("12345678")
-                .setJitterCharacteristic("12345678")
-                .setWanderCharacteristic("12345678")
+                .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
+                .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
+                .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
+                .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
                 .setTrafficPropertyName("FIXED_LATENCY")
                 .build();
             RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
                 .setRiskCharacteristicName("risk characteristic")
-                .setRiskIdentifierList(List.of("risk identifier1", "risk identifier2"))
+                .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
                 .build();
             NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
                 .setUuid(new Uuid(
-                    UUID.nameUUIDFromBytes(("dsr node rule group " + count).getBytes(Charset.forName("UTF-8")))
+                    UUID.nameUUIDFromBytes(("dsr node rule group " + count).getBytes(StandardCharsets.UTF_8))
                         .toString()))
                 .setRule(ruleList)
                 .setNodeEdgePoint(nepList)
@@ -1079,125 +1197,6 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
         return nodeRuleGroupMap;
     }
 
-    private List<Class<? extends LAYERPROTOCOLQUALIFIER>> createSupportedLayerProtocolQualifier(
-            List<Class<? extends SupportedIfCapability>> sicList, LayerProtocolName lpn) {
-        if (sicList == null) {
-            return List.of(PHOTONICLAYERQUALIFIEROMS.class);
-        }
-        Map<SupportedInterfaceCapabilityKey, SupportedInterfaceCapability> supIfMap = new HashMap<>();
-        LOG.info("SIC list = {}", sicList);
-        for (Class<? extends SupportedIfCapability> supInterCapa : sicList) {
-            SupportedInterfaceCapability supIfCapa = new SupportedInterfaceCapabilityBuilder()
-                    .withKey(new SupportedInterfaceCapabilityKey(convertSupIfCapa(supInterCapa)))
-                    .setIfCapType(convertSupIfCapa(supInterCapa))
-                    .build();
-            supIfMap.put(supIfCapa.key(), supIfCapa);
-        }
-        List<Class<? extends LAYERPROTOCOLQUALIFIER>> sclpqList = new ArrayList<>();
-        for (SupportedInterfaceCapability sic : supIfMap.values()) {
-            switch (lpn.getName()) {
-                case "DSR":
-                    switch (sic.getIfCapType().getSimpleName()) {
-                        // TODO: it may be needed to add more cases clauses if the interface capabilities of a
-                        //  port are extended in the config file
-                        case "If1GEODU0":
-                            sclpqList.add(ODUTYPEODU0.class);
-                            sclpqList.add(DIGITALSIGNALTYPEGigE.class);
-                            break;
-                        case "If10GEODU2e":
-                            sclpqList.add(ODUTYPEODU2E.class);
-                            sclpqList.add(DIGITALSIGNALTYPE10GigELAN.class);
-                            break;
-                        case "If10GEODU2":
-                            sclpqList.add(ODUTYPEODU2.class);
-                            sclpqList.add(DIGITALSIGNALTYPE10GigELAN.class);
-                            break;
-                        case "If10GE":
-                            sclpqList.add(DIGITALSIGNALTYPE10GigELAN.class);
-                            break;
-                        case "If100GEODU4":
-                            sclpqList.add(DIGITALSIGNALTYPE100GigE.class);
-                            sclpqList.add(ODUTYPEODU4.class);
-                            break;
-                        case "If100GE":
-                            sclpqList.add(DIGITALSIGNALTYPE100GigE.class);
-                            break;
-                        case "IfOCHOTU4ODU4":
-                        case "IfOCH":
-                            sclpqList.add(ODUTYPEODU4.class);
-                            break;
-                        default:
-                            LOG.error("IfCapability type not managed");
-                            break;
-                    }
-                    break;
-                case "ODU":
-                    switch (sic.getIfCapType().getSimpleName()) {
-                        // TODO: it may be needed to add more cases clauses if the interface capabilities of a
-                        //  port are extended in the config file
-                        case "If1GEODU0":
-                            sclpqList.add(ODUTYPEODU0.class);
-                            break;
-                        case "If10GEODU2e":
-                            sclpqList.add(ODUTYPEODU2E.class);
-                            break;
-                        case "If10GEODU2":
-                        case "If10GE":
-                            sclpqList.add(ODUTYPEODU2.class);
-                            break;
-                        case "If100GEODU4":
-                        case "If100GE":
-                        case "IfOCHOTU4ODU4":
-                        case "IfOCH":
-                            sclpqList.add(ODUTYPEODU4.class);
-                            break;
-                        default:
-                            LOG.error("IfCapability type not managed");
-                            break;
-                    }
-                    break;
-                case "PHOTONIC_MEDIA":
-                    if (sic.getIfCapType().getSimpleName().equals("IfOCHOTU4ODU4")
-                            || sic.getIfCapType().getSimpleName().equals("IfOCH")) {
-                        sclpqList.add(PHOTONICLAYERQUALIFIEROTSi.class);
-                        sclpqList.add(PHOTONICLAYERQUALIFIEROMS.class);
-                    }
-                    break;
-                default:
-                    LOG.error("Layer Protocol Name is unknown {}", lpn.getName());
-                    break;
-            }
-        }
-        return sclpqList;
-    }
-
-    private static Class<? extends SupportedIfCapability> convertSupIfCapa(Class<? extends
-            SupportedIfCapability> ifCapType) {
-        LOG.info("Interface Capability type = {}", ifCapType.getSimpleName());
-        switch (ifCapType.getSimpleName()) {
-            case "If100GEODU4":
-                return If100GEODU4.class;
-            case "IfOCHOTU4ODU4":
-                return IfOCHOTU4ODU4.class;
-            case "If1GEODU0":
-                return If1GEODU0.class;
-            case "If10GEODU2e":
-                return If10GEODU2e.class;
-            case "If10GEODU2":
-                return If10GEODU2.class;
-            case "If100GE":
-                return If100GE.class;
-            case "If10GE":
-                return If10GE.class;
-            case "If1GE":
-                return If1GE.class;
-            case "IfOCH":
-                return IfOCH.class;
-            default:
-                return null;
-        }
-    }
-
     private String getNodeType(XpdrNodeTypes xponderType) {
         switch (xponderType.getIntValue()) {
             case 1:
@@ -1318,7 +1317,7 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
     private void updateConnectivityServicesState(Uuid sipUuid, String nodeId) {
         // TODO: check if this IID is correct
         InstanceIdentifier<ConnectivityContext> connectivitycontextIID = InstanceIdentifier.builder(Context.class)
-            .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.Context1.class)
+            .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.Context1.class)
             .child(ConnectivityContext.class)
             .build();
         ConnectivityContext connContext = null;
@@ -1330,7 +1329,7 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
                 LOG.error("Couldnt retrieve connectivity context from datastore");
                 return;
             }
-            connContext = optConnContext.get();
+            connContext = optConnContext.orElseThrow();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Couldnt read connectivity context from datastore", e);
         }
@@ -1374,7 +1373,7 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
     private void updateConnection(Connection updConn) {
         // TODO: check if this IID is correct
         InstanceIdentifier<Connection> connectionIID = InstanceIdentifier.builder(Context.class)
-                .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.Context1.class)
+                .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.Context1.class)
                 .child(ConnectivityContext.class).child(Connection.class,
                         new ConnectionKey(updConn.getUuid())).build();
         this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, connectionIID, updConn);
@@ -1388,7 +1387,7 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
     private void updateConnectivityService(ConnectivityService updService) {
         // TODO: check if this IID is correct
         InstanceIdentifier<ConnectivityService> connectivityserviceIID = InstanceIdentifier.builder(Context.class)
-                .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.Context1.class)
+                .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.Context1.class)
                 .child(ConnectivityContext.class).child(ConnectivityService.class,
                         new ConnectivityServiceKey(updService.getUuid())).build();
         this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, connectivityserviceIID, updService);
@@ -1399,12 +1398,223 @@ public class TapiNetworkModelServiceImpl implements TapiNetworkModelService {
         }
     }
 
-    private ArrayList<Class<? extends SupportedIfCapability>> convertSupIfCapaList(List<Mapping> xpdrNetMaps,
-            int index) {
-        ArrayList<Class<? extends SupportedIfCapability>> newSupIfCapList = new ArrayList<Class<? extends
-            SupportedIfCapability>>();
-        xpdrNetMaps.get(index).getSupportedInterfaceCapability()
-            .forEach(a -> newSupIfCapList.add(xpdrNetMaps.get(index).getSupportedInterfaceCapability().get(0)));
-        return newSupIfCapList;
+    private Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> populateNepsForRdmNode(String nodeId,
+            Map<String, TerminationPoint1> tpMap, boolean withSip, String nepPhotonicSublayer) {
+        // create neps for MC and and Photonic Media OTS/OMS
+        Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
+        for (Map.Entry<String, TerminationPoint1> entry : tpMap.entrySet()) {
+            // Admin and oper state common for all tps
+            OpenroadmTpType tpType = entry.getValue().getTpType();
+            // PHOTONIC MEDIA nep
+            LOG.debug("PHOTO NEP = {}", String.join("+", nodeId, nepPhotonicSublayer,
+                entry.getKey()));
+            SupportedCepLayerProtocolQualifierInstancesBuilder sclpqiBd =
+                new SupportedCepLayerProtocolQualifierInstancesBuilder()
+                    .setNumberOfCepInstances(Uint64.valueOf(1));
+            switch (nepPhotonicSublayer) {
+                case TapiStringConstants.PHTNC_MEDIA_OMS:
+                    sclpqiBd.setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROMS.VALUE);
+                    break;
+                case TapiStringConstants.PHTNC_MEDIA_OTS:
+                    sclpqiBd.setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTS.VALUE);
+                    break;
+                case TapiStringConstants.MC:
+                    sclpqiBd.setLayerProtocolQualifier(PHOTONICLAYERQUALIFIERMC.VALUE);
+                    break;
+                case TapiStringConstants.OTSI_MC:
+                    sclpqiBd.setLayerProtocolQualifier(PHOTONICLAYERQUALIFIEROTSiMC.VALUE);
+                    break;
+                default:
+                    break;
+            }
+
+            List<SupportedCepLayerProtocolQualifierInstances> sclpqiList = new ArrayList<>(List.of(sclpqiBd.build()));
+            OwnedNodeEdgePointBuilder onepBd = new OwnedNodeEdgePointBuilder();
+            if (!nepPhotonicSublayer.equals(TapiStringConstants.MC)
+                    && !nepPhotonicSublayer.equals(TapiStringConstants.OTSI_MC)) {
+                Map<Double,Double> usedFreqMap = new HashMap<>();
+                Map<Double,Double> availableFreqMap = new HashMap<>();
+                switch (tpType) {
+                    // Whatever is the TP and its type we consider that it is handled in a bidirectional way :
+                    // same wavelength(s) used in both direction.
+                    case SRGRXPP:
+                    case SRGTXPP:
+                    case SRGTXRXPP:
+                        usedFreqMap = tapiFactory.getPP11UsedWavelength(
+                            getNetworkTerminationPoint11FromDatastore(nodeId, entry.getKey()));
+                        if (usedFreqMap == null || usedFreqMap.isEmpty()) {
+                            availableFreqMap.put(GridConstant.START_EDGE_FREQUENCY * 1E09,
+                                GridConstant.START_EDGE_FREQUENCY * 1E09
+                                + GridConstant.GRANULARITY * GridConstant.EFFECTIVE_BITS * 1E06);
+                        } else {
+                            LOG.debug("EnteringLOOPcreateOTSiMC & MC with usedFreqMap non empty {} for Node {}, tp {}",
+                                usedFreqMap.toString(), nodeId, tpMap.toString());
+                            onepMap.putAll(populateNepsForRdmNode(nodeId,
+                                new HashMap<>(Map.of(entry.getKey(), entry.getValue())),
+                                true, TapiStringConstants.MC));
+                            onepMap.putAll(populateNepsForRdmNode(nodeId,
+                                new HashMap<>(Map.of(entry.getKey(), entry.getValue())),
+                                true, TapiStringConstants.OTSI_MC));
+                        }
+                        break;
+                    case DEGREERXTTP:
+                    case DEGREETXTTP:
+                    case DEGREETXRXTTP:
+                        usedFreqMap = tapiFactory.getTTP11UsedFreqMap(
+                            getNetworkTerminationPoint11FromDatastore(nodeId, entry.getKey()));
+                        availableFreqMap = tapiFactory.getTTP11AvailableFreqMap(
+                            getNetworkTerminationPoint11FromDatastore(nodeId, entry.getKey()));
+                        break;
+                    default:
+                        break;
+                }
+                LOG.debug("calling add Photonic NEP spec for Roadm");
+                onepBd = tapiFactory.addPhotSpecToRoadmOnep(nodeId, usedFreqMap, availableFreqMap, onepBd,
+                    nepPhotonicSublayer);
+            }
+            AdminStates admin = entry.getValue().getAdministrativeState();
+            State oper = entry.getValue().getOperationalState();
+            Name nepName = new NameBuilder()
+                .setValueName(nepPhotonicSublayer + "NodeEdgePoint")
+                .setValue(String.join("+", nodeId, nepPhotonicSublayer,
+                    entry.getKey()))
+                .build();
+            OwnedNodeEdgePoint onep = onepBd
+                .setUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", nodeId,
+                    nepPhotonicSublayer, entry.getKey()))
+                    .getBytes(Charset.forName("UTF-8"))).toString()))
+                .setLayerProtocolName(LayerProtocolName.PHOTONICMEDIA)
+                .setName(Map.of(nepName.key(), nepName))
+                .setSupportedCepLayerProtocolQualifierInstances(sclpqiList)
+                .setDirection(Direction.BIDIRECTIONAL)
+                .setLinkPortRole(PortRole.SYMMETRIC)
+                .setAdministrativeState(this.tapiLink.setTapiAdminState(admin.getName()))
+                .setOperationalState(this.tapiLink.setTapiOperationalState(oper.getName()))
+                .setLifecycleState(LifecycleState.INSTALLED)
+                .build();
+            LOG.debug("ROADMNEPPopulation TapiNetworkModelServiceImpl populate NEP {} for Node {}",
+                onep.getName().entrySet(), nodeId);
+            onepMap.put(onep.key(), onep);
+        }
+        LOG.debug("ROADMNEPPopulation FINISH for Node {}", nodeId);
+        return onepMap;
+    }
+
+    /**
+     * Get a network termination point for nodeId and tpId.
+     * @param nodeId String
+     * @param tpId String
+     * @return network termination point, null otherwise
+     */
+    private TerminationPoint getNetworkTerminationPointFromDatastore(String nodeId, String tpId) {
+        InstanceIdentifier<TerminationPoint> tpIID = InstanceIdentifier.builder(Networks.class)
+            .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
+            .child(
+                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
+                    .networks.network.Node.class,
+                new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
+                    .networks.network.NodeKey(new NodeId(nodeId)))
+            .augmentation(Node1.class)
+            .child(
+                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                    .networks.network.node.TerminationPoint.class,
+                new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                    .networks.network.node.TerminationPointKey(new TpId(tpId)))
+            .build();
+        try {
+            Optional<TerminationPoint> tpOptional =
+                networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, tpIID).get();
+            if (tpOptional.isEmpty()) {
+                LOG.error("readMdSal: Error reading tp {} , empty list",tpIID);
+                return null;
+            }
+            LOG.debug("SUCCES getting LCP TP for NodeId {} TpId {} while creating NEP in TapiNetworkModelServiceImpl",
+                nodeId, tpId);
+            LOG.debug(" The Tp in Datastore is as follows {}", tpOptional);
+            return tpOptional.orElseThrow();
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.warn("Exception while getting termination {} for node id {} point from {} topology",
+                    tpId, nodeId, NetworkUtils.OVERLAY_NETWORK_ID, e);
+            return null;
+        }
+    }
+
+    /**
+     * Get a network termination point with Common TerminationPoint1 augmentation for nodeId and tpId.
+     * @param nodeId String
+     * @param tpId String
+     * @return network termination point, null otherwise
+     */
+    private TerminationPoint1 getNetworkTerminationPoint1FromDatastore(String nodeId, String tpId) {
+        InstanceIdentifier<TerminationPoint1> tpIID = InstanceIdentifier.builder(Networks.class)
+            .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
+            .child(
+                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
+                    .networks.network.Node.class,
+                new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
+                    .networks.network.NodeKey(new NodeId(nodeId)))
+            .augmentation(Node1.class)
+            .child(
+                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                    .networks.network.node.TerminationPoint.class,
+                new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                    .networks.network.node.TerminationPointKey(new TpId(tpId)))
+            .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526
+                .TerminationPoint1.class)
+            .build();
+        try {
+            Optional<TerminationPoint1> tpOptional =
+                networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, tpIID).get();
+            if (tpOptional.isEmpty()) {
+                LOG.error("readMdSal: Error reading tp {} , empty list",tpIID);
+                return null;
+            }
+            LOG.debug("SUCCES getting LCP TP1 for NodeId {} TpId {} while creating NEP in TapiNetworkModelServiceImpl",
+                nodeId, tpId);
+            LOG.debug(" The Tp in Datastore is as follows {}", tpOptional);
+            return tpOptional.orElseThrow();
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.warn("Exception while getting termination {} for node id {} point from {} topology",
+                    tpId, nodeId, NetworkUtils.OVERLAY_NETWORK_ID, e);
+            return null;
+        }
     }
+
+    private org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1
+        getNetworkTerminationPoint11FromDatastore(String nodeId, String tpId) {
+        InstanceIdentifier<org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1>
+                tpIID = InstanceIdentifier.builder(Networks.class)
+            .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
+            .child(
+                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
+                    .networks.network.Node.class,
+                new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
+                    .networks.network.NodeKey(new NodeId(nodeId)))
+            .augmentation(Node1.class)
+            .child(
+                org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                    .networks.network.node.TerminationPoint.class,
+                new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                    .networks.network.node.TerminationPointKey(new TpId(tpId)))
+            .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1
+                .class)
+            .build();
+        try {
+            Optional<org.opendaylight.yang.gen.v1.http.org.openroadm.network.topology.rev230526.TerminationPoint1>
+                tpOptional = networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, tpIID).get();
+            if (tpOptional.isEmpty()) {
+                LOG.error("readMdSal: Error reading tp {} , empty list",tpIID);
+                return null;
+            }
+            LOG.debug("SUCCESS getting LCP TP11 for NodeId {} TpId {} while creating NEP in TapiNetworkModelServiceImpl"
+                + " The Tp in Datastore is as follows {}",
+                nodeId, tpId, tpOptional.toString());
+            return tpOptional.orElseThrow();
+        } catch (ExecutionException | InterruptedException e) {
+            LOG.warn("Exception while getting termination {} for node id {} point from {} topology",
+                    tpId, nodeId, NetworkUtils.OVERLAY_NETWORK_ID, e);
+            return null;
+        }
+    }
+
 }
index 4cf9ff347c0b657c439ab931afdc0ab18665ff0b..afa28afcf4a52cdbe5ea51b0812ea1de017d0412 100644 (file)
  */
 package org.opendaylight.transportpce.tapi.topology;
 
-import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.collect.ImmutableClassToInstanceMap;
 import java.nio.charset.Charset;
-import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.ExecutionException;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.tapi.TapiStringConstants;
+import org.opendaylight.transportpce.tapi.impl.rpc.DeleteTapiLinkImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.InitRoadmRoadmTapiLinkImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.InitXpdrRdmTapiLinkImpl;
 import org.opendaylight.transportpce.tapi.utils.TapiLink;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev210408.DeleteTapiLinkInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev210408.DeleteTapiLinkOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev210408.DeleteTapiLinkOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev210408.InitRoadmRoadmTapiLinkInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev210408.InitRoadmRoadmTapiLinkOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev210408.InitRoadmRoadmTapiLinkOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev210408.InitXpdrRdmTapiLinkInput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev210408.InitXpdrRdmTapiLinkOutput;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev210408.InitXpdrRdmTapiLinkOutputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev210408.TransportpceTapinetworkutilsService;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Context;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.Context1;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.context.TopologyContext;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.LinkKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.Topology;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.TopologyBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.TopologyKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev230728.DeleteTapiLink;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev230728.InitRoadmRoadmTapiLink;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev230728.InitXpdrRdmTapiLink;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Context;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.context.TopologyContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyKey;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.common.RpcError;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
+import org.opendaylight.yangtools.yang.binding.Rpc;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class TapiNetworkUtilsImpl implements TransportpceTapinetworkutilsService {
+@Component
+public class TapiNetworkUtilsImpl {
 
     private static final Logger LOG = LoggerFactory.getLogger(TapiNetworkUtilsImpl.class);
     private final Uuid tapiTopoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
             .getBytes(Charset.forName("UTF-8"))).toString());
+
     private final NetworkTransactionService networkTransactionService;
-    private final TapiLink tapiLink;
+    private Registration reg;
 
-    public TapiNetworkUtilsImpl(NetworkTransactionService networkTransactionService, TapiLink tapiLink) {
+    @Activate
+    public TapiNetworkUtilsImpl(@Reference RpcProviderService rpcProviderService,
+            @Reference NetworkTransactionService networkTransactionService, @Reference TapiLink tapiLink) {
         this.networkTransactionService = networkTransactionService;
-        this.tapiLink = tapiLink;
+        this.reg = rpcProviderService.registerRpcImplementations(ImmutableClassToInstanceMap.<Rpc<?, ?>>builder()
+            .put(InitRoadmRoadmTapiLink.class, new InitRoadmRoadmTapiLinkImpl(tapiLink, this))
+            .put(InitXpdrRdmTapiLink.class, new InitXpdrRdmTapiLinkImpl(tapiLink, null))
+            .put(DeleteTapiLink.class, new DeleteTapiLinkImpl(this, networkTransactionService))
+            .build());
+        LOG.info("TapiNetworkUtilsImpl instantiated");
     }
 
-    @Override
-    public ListenableFuture<RpcResult<InitRoadmRoadmTapiLinkOutput>> initRoadmRoadmTapiLink(
-            InitRoadmRoadmTapiLinkInput input) {
-        // TODO --> need to check if the nodes and neps exist in the topology
-        String sourceNode = input.getRdmANode();
-        String sourceTp = input.getDegATp();
-        String destNode = input.getRdmZNode();
-        String destTp = input.getDegZTp();
-        Link link = this.tapiLink.createTapiLink(sourceNode, sourceTp, destNode, destTp,
-            TapiStringConstants.OMS_RDM_RDM_LINK, TapiStringConstants.PHTNC_MEDIA, TapiStringConstants.PHTNC_MEDIA,
-            TapiStringConstants.PHTNC_MEDIA, TapiStringConstants.PHTNC_MEDIA,
-            this.tapiLink.getAdminState(sourceNode, sourceTp, destNode, destTp),
-            this.tapiLink.getOperState(sourceNode, sourceTp, destNode, destTp),
-            List.of(LayerProtocolName.PHOTONICMEDIA), List.of(LayerProtocolName.PHOTONICMEDIA.getName()), tapiTopoUuid);
-        InitRoadmRoadmTapiLinkOutputBuilder output = new InitRoadmRoadmTapiLinkOutputBuilder();
-        if (link == null) {
-            LOG.error("Error creating link object");
-            return RpcResultBuilder.<InitRoadmRoadmTapiLinkOutput>failed().withError(RpcError.ErrorType.RPC,
-                "Failed to create link in topology").buildFuture();
-        }
-        if (putLinkInTopology(link)) {
-            output = new InitRoadmRoadmTapiLinkOutputBuilder()
-                .setResult("Link created in tapi topology. Link-uuid = " + link.getUuid());
-        }
-        return RpcResultBuilder.success(output.build()).buildFuture();
+    @Deactivate
+    public void close() {
+        this.reg.close();
+        LOG.info("TapiNetworkUtilsImpl Closed");
     }
 
-    @Override
-    public ListenableFuture<RpcResult<InitXpdrRdmTapiLinkOutput>> initXpdrRdmTapiLink(InitXpdrRdmTapiLinkInput input) {
-        // TODO --> need to check if the nodes and neps exist in the topology
-        String destNode = input.getRdmNode();
-        String destTp = input.getAddDropTp();
-        String sourceNode = input.getXpdrNode();
-        String sourceTp = input.getNetworkTp();
-        Link link = this.tapiLink.createTapiLink(sourceNode, sourceTp, destNode, destTp,
-            TapiStringConstants.OMS_XPDR_RDM_LINK, TapiStringConstants.OTSI, TapiStringConstants.PHTNC_MEDIA,
-            TapiStringConstants.PHTNC_MEDIA, TapiStringConstants.PHTNC_MEDIA,
-            this.tapiLink.getAdminState(sourceNode, sourceTp, destNode, destTp),
-            this.tapiLink.getOperState(sourceNode, sourceTp, destNode, destTp),
-            List.of(LayerProtocolName.PHOTONICMEDIA), List.of(LayerProtocolName.PHOTONICMEDIA.getName()), tapiTopoUuid);
-        InitXpdrRdmTapiLinkOutputBuilder output = new InitXpdrRdmTapiLinkOutputBuilder();
-        if (link == null) {
-            LOG.error("Error creating link object");
-            return RpcResultBuilder.<InitXpdrRdmTapiLinkOutput>failed().withError(RpcError.ErrorType.RPC,
-                "Failed to create link in topology").buildFuture();
-        }
-        if (putLinkInTopology(link)) {
-            output = new InitXpdrRdmTapiLinkOutputBuilder()
-                .setResult("Link created in tapi topology. Link-uuid = " + link.getUuid());
-        }
-        return RpcResultBuilder.success(output.build()).buildFuture();
+
+    public Registration getRegisteredRpc() {
+        return reg;
     }
 
-    @Override
-    public ListenableFuture<RpcResult<DeleteTapiLinkOutput>> deleteTapiLink(DeleteTapiLinkInput input) {
-        // TODO: check if this IID is correct
-        // TODO --> need to check if the link exists in the topology
-        try {
-            InstanceIdentifier<Link> linkIID = InstanceIdentifier.builder(Context.class)
-                    .augmentation(Context1.class).child(TopologyContext.class).child(Topology.class,
-                            new TopologyKey(tapiTopoUuid)).child(Link.class, new LinkKey(input.getUuid())).build();
-            this.networkTransactionService.delete(LogicalDatastoreType.OPERATIONAL, linkIID);
-            this.networkTransactionService.commit().get();
-            LOG.info("TAPI link deleted successfully.");
-            return RpcResultBuilder.success(new DeleteTapiLinkOutputBuilder()
-                .setResult("Link successfully deleted from tapi topology").build()).buildFuture();
-        } catch (InterruptedException | ExecutionException e) {
-            LOG.error("Failed to delete TAPI link", e);
-            return RpcResultBuilder.<DeleteTapiLinkOutput>failed().withError(RpcError.ErrorType.RPC,
-                "Failed to delete link from topology").buildFuture();
-        }
+    public Uuid getTapiTopoUuid() {
+        return tapiTopoUuid;
     }
 
-    private boolean putLinkInTopology(Link tapLink) {
+    public boolean putLinkInTopology(Link tapLink) {
         // TODO is this merge correct? Should we just merge topology by changing the nodes map??
         // TODO: verify this is correct. Should we identify the context IID with the context UUID??
         LOG.info("Creating tapi node in TAPI topology context");
index 56e4128900d3a20d45d787115a5d122111ecf9d1..37d24071f24bb03ea868eeb88f74ea2334f4fc4a 100644 (file)
@@ -8,10 +8,9 @@
 package org.opendaylight.transportpce.tapi.topology;
 
 import java.nio.charset.Charset;
-import java.util.Collection;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
+import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.ExecutionException;
 import org.eclipse.jdt.annotation.NonNull;
@@ -22,8 +21,8 @@ import org.opendaylight.transportpce.common.NetworkUtils;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.tapi.TapiStringConstants;
 import org.opendaylight.transportpce.tapi.utils.TapiLink;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
@@ -32,14 +31,14 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.top
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.LinkKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Context;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.Context1;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.context.TopologyContext;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.Topology;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.TopologyBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.TopologyKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Context;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.context.TopologyContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -49,8 +48,9 @@ public class TapiOrLinkListener implements DataTreeChangeListener<Link> {
     private static final Logger LOG = LoggerFactory.getLogger(TapiOrLinkListener.class);
     private final TapiLink tapiLink;
     private final NetworkTransactionService networkTransactionService;
-    private final Uuid tapiTopoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
-        .getBytes(Charset.forName("UTF-8"))).toString());
+    private final Uuid tapiTopoUuid = new Uuid(UUID.nameUUIDFromBytes(
+                TapiStringConstants.T0_FULL_MULTILAYER.getBytes(Charset.forName("UTF-8")))
+            .toString());
 
     public TapiOrLinkListener(final TapiLink tapiLink, final NetworkTransactionService networkTransactionService) {
         this.tapiLink = tapiLink;
@@ -58,57 +58,61 @@ public class TapiOrLinkListener implements DataTreeChangeListener<Link> {
     }
 
     @Override
-    public void onDataTreeChanged(@NonNull Collection<DataTreeModification<Link>> changes) {
+    public void onDataTreeChanged(@NonNull List<DataTreeModification<Link>> changes) {
         LOG.info("onDataTreeChanged - {}", this.getClass().getSimpleName());
         for (DataTreeModification<Link> change : changes) {
-            if (change.getRootNode().getDataBefore() == null && change.getRootNode().getDataAfter() != null) {
-                LOG.info("New link in openroadm topology");
-                Link link = change.getRootNode().getDataAfter();
-                // Todo: XPDR links are unidirectional, therefore we need to check for the current one and
-                //  the opposite one. But first check the type
-                Link1 link1 = link.augmentation(Link1.class);
-                if (link1 == null) {
-                    LOG.error("No type in link. We cannot trigger the TAPI link creation");
-                    return;
-                }
-                if (!(link1.getLinkType().equals(OpenroadmLinkType.XPONDERINPUT)
-                        || link1.getLinkType().equals(OpenroadmLinkType.XPONDEROUTPUT))) {
-                    LOG.warn("Not triggering creation of link for type = {}", link1.getLinkType().getName());
-                    return;
-                }
-                if (!oppositeLinkExists(link1.getOppositeLink())) {
-                    LOG.warn("Opposite link doest exist. Not creating TAPI link");
-                    return;
-                }
-                LOG.info("Opposite link already in datastore. Creatin TAPI bidirectional link");
-                String srcNode = getRoadmOrXpdr(link.getSource().getSourceNode().getValue());
-                String srcTp = link.getSource().getSourceTp().getValue();
-                String destNode = getRoadmOrXpdr(link.getDestination().getDestNode().getValue());
-                String destTp = link.getDestination().getDestTp().getValue();
-                putTapiLinkInTopology(this.tapiLink.createTapiLink(srcNode, srcTp, destNode, destTp,
-                    TapiStringConstants.OMS_XPDR_RDM_LINK, getQual(srcNode), getQual(destNode),
-                    TapiStringConstants.PHTNC_MEDIA, TapiStringConstants.PHTNC_MEDIA,
-                    link1.getAdministrativeState().getName(), link1.getOperationalState().getName(),
-                    List.of(LayerProtocolName.PHOTONICMEDIA), List.of(LayerProtocolName.PHOTONICMEDIA.getName()),
-                    tapiTopoUuid));
+            if (change.getRootNode().dataBefore() != null) {
+                continue;
             }
+            Link link = change.getRootNode().dataAfter();
+            if (link == null) {
+                continue;
+            }
+            LOG.info("New link in openroadm topology");
+            // Todo: XPDR links are unidirectional, therefore we need to check for the current one and
+            //  the opposite one. But first check the type
+            Link1 link1 = link.augmentation(Link1.class);
+            if (link1 == null) {
+                LOG.error("No type in link. We cannot trigger the TAPI link creation");
+                return;
+            }
+            if (!(link1.getLinkType().equals(OpenroadmLinkType.XPONDERINPUT)
+                    || link1.getLinkType().equals(OpenroadmLinkType.XPONDEROUTPUT))) {
+                LOG.warn("Not triggering creation of link for type = {}", link1.getLinkType().getName());
+                return;
+            }
+            if (!oppositeLinkExists(link1.getOppositeLink())) {
+                LOG.warn("Opposite link doest exist. Not creating TAPI link");
+                return;
+            }
+            LOG.info("Opposite link already in datastore. Creatin TAPI bidirectional link");
+            String srcNode = getRoadmOrXpdr(link.getSource().getSourceNode().getValue());
+            String srcTp = link.getSource().getSourceTp().getValue();
+            String destNode = getRoadmOrXpdr(link.getDestination().getDestNode().getValue());
+            String destTp = link.getDestination().getDestTp().getValue();
+            putTapiLinkInTopology(this.tapiLink.createTapiLink(srcNode, srcTp, destNode, destTp,
+                TapiStringConstants.OMS_XPDR_RDM_LINK, getQual(srcNode), getQual(destNode),
+                TapiStringConstants.PHTNC_MEDIA_OTS, TapiStringConstants.PHTNC_MEDIA_OTS,
+                link1.getAdministrativeState().getName(), link1.getOperationalState().getName(),
+                Set.of(LayerProtocolName.PHOTONICMEDIA), Set.of(LayerProtocolName.PHOTONICMEDIA.getName()),
+                tapiTopoUuid));
         }
     }
 
     private void putTapiLinkInTopology(
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link tapiXpdrLink) {
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link tapiXpdrLink) {
         LOG.info("Creating tapi link in TAPI topology context");
-        InstanceIdentifier<Topology> topoIID = InstanceIdentifier.builder(Context.class)
-            .augmentation(Context1.class).child(TopologyContext.class)
-            .child(Topology.class, new TopologyKey(this.tapiTopoUuid))
-            .build();
-
-        Topology topology = new TopologyBuilder().setUuid(this.tapiTopoUuid)
-            .setLink(Map.of(tapiXpdrLink.key(), tapiXpdrLink)).build();
-
         // merge in datastore
-        this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, topoIID,
-            topology);
+        this.networkTransactionService.merge(
+            LogicalDatastoreType.OPERATIONAL,
+            InstanceIdentifier.builder(Context.class)
+                .augmentation(Context1.class).child(TopologyContext.class)
+                .child(Topology.class, new TopologyKey(this.tapiTopoUuid))
+                .build(),
+            new TopologyBuilder()
+                .setUuid(this.tapiTopoUuid)
+                .setLink(Map.of(tapiXpdrLink.key(), tapiXpdrLink))
+                .build());
         try {
             this.networkTransactionService.commit().get();
         } catch (InterruptedException | ExecutionException e) {
@@ -118,21 +122,21 @@ public class TapiOrLinkListener implements DataTreeChangeListener<Link> {
     }
 
     private String getQual(String node) {
-        if (node.contains("ROADM")) {
-            return TapiStringConstants.PHTNC_MEDIA;
-        }
-        return TapiStringConstants.OTSI;
+        return node.contains("ROADM") ? TapiStringConstants.PHTNC_MEDIA : TapiStringConstants.XPDR;
     }
 
     private boolean oppositeLinkExists(LinkId oppositeLink) {
         try {
-            InstanceIdentifier<Link> linkIID = InstanceIdentifier.builder(Networks.class)
-                .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
-                .augmentation(Network1.class).child(Link.class, new LinkKey(oppositeLink)).build();
-
-            Optional<Link> optLink =
-                this.networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, linkIID).get();
-            if (!optLink.isPresent()) {
+            if (this.networkTransactionService
+                    .read(
+                        LogicalDatastoreType.CONFIGURATION,
+                        InstanceIdentifier.builder(Networks.class)
+                            .child(Network.class, new NetworkKey(new NetworkId(NetworkUtils.OVERLAY_NETWORK_ID)))
+                            .augmentation(Network1.class)
+                            .child(Link.class, new LinkKey(oppositeLink))
+                            .build())
+                    .get()
+                    .isEmpty()) {
                 LOG.error("Opposite link not found in datastore {}", oppositeLink.getValue());
                 return false;
             }
@@ -144,9 +148,8 @@ public class TapiOrLinkListener implements DataTreeChangeListener<Link> {
     }
 
     private String getRoadmOrXpdr(String node) {
-        if (node.contains("ROADM")) {
-            return String.join("-", node.split("-")[0], node.split("-")[1]);
-        }
-        return node;
+        return node.contains("ROADM")
+            ? String.join("-", node.split("-")[0], node.split("-")[1])
+            : node;
     }
 }
index e7668c0076c6a144b157c0ff412486de71c5590e..e90efcdd3144f989fd8c135ed6dc8b7d9157140d 100644 (file)
@@ -7,14 +7,14 @@
  */
 package org.opendaylight.transportpce.tapi.topology;
 
-import java.util.Collection;
+import java.util.List;
 import java.util.Map;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -29,29 +29,51 @@ public class TapiPortMappingListener implements DataTreeChangeListener<Nodes> {
     }
 
     @Override
-    public void onDataTreeChanged(@NonNull Collection<DataTreeModification<Nodes>> changes) {
+    public void onDataTreeChanged(@NonNull List<DataTreeModification<Nodes>> changes) {
         for (DataTreeModification<Nodes> change : changes) {
-            LOG.debug("TAPI module: Change in Node = {}", change.getRootNode());
+            var rootNode = change.getRootNode();
+            LOG.debug("TAPI module: Change in Node = {}", rootNode);
             // Data before needs to be not null
-            if (change.getRootNode().getDataAfter() != null && change.getRootNode().getDataBefore() != null) {
-                Nodes nodesAft = change.getRootNode().getDataAfter();
-                Nodes nodesBef = change.getRootNode().getDataBefore();
-                // TODO -> need to filter out the ones that are not after creation.
-                //  (Mapping before = null & Mapping after != null) is the rule for a first time connected device
-                String nodeId = nodesAft.getNodeId();
-                Map<MappingKey, Mapping> mappingAft = nodesAft.getMapping();
-                Map<MappingKey, Mapping> mappingBef = nodesBef.getMapping();
-                LOG.info("Change in node {} with OR version = {}", nodeId,
-                    nodesAft.getNodeInfo().getOpenroadmVersion().getName());
-                if (mappingAft != null && mappingBef == null) {
-                    LOG.info("New mapping for node {} = {}", nodeId, mappingAft);
-                    LOG.info("As the mapping is now created for the first time, "
-                        + "we can proceed with the creation of the node {} in the TAPI topology", nodeId);
-                    this.tapiNetworkModelService.createTapiNode(nodeId,
-                        nodesAft.getNodeInfo().getOpenroadmVersion().getIntValue(), nodesAft);
-                } else {
-                    LOG.warn("Mapping already existed in the datastore, which means that node {} already existed "
-                        + "in TAPI topology. The action to take will be different", nodeId);
+            Nodes nodesAft = rootNode.dataAfter();
+            if (nodesAft == null) {
+                continue;
+            }
+            Nodes nodesBef = rootNode.dataBefore();
+            if (nodesBef == null) {
+                this.tapiNetworkModelService.createTapiNode(
+                    nodesAft.getNodeId(), nodesAft.getNodeInfo().getOpenroadmVersion().getIntValue(), nodesAft);
+                continue;
+            }
+            // TODO -> need to filter out the ones that are not after creation.
+            //  (Mapping before = null & Mapping after != null) is the rule for a first time connected device
+            String nodeId = nodesAft.getNodeId();
+            Map<MappingKey, Mapping> mappingAft = nodesAft.getMapping();
+            Map<MappingKey, Mapping> mappingBef = nodesBef.getMapping();
+            LOG.info("Change in node {} with OR version = {}",
+                nodeId, nodesAft.getNodeInfo().getOpenroadmVersion().getName());
+            //TODO avoid long message and concatenation in following LOG messages
+            if (mappingAft == null) {
+                LOG.warn("Mapping already existed in the datastore, which means that node {} already existed "
+                    + "in TAPI topology. The action to take will be different", nodeId);
+                continue;
+            }
+            if (mappingBef == null) {
+                LOG.info("New mapping for node {} = {}", nodeId, mappingAft);
+                LOG.info("As the mapping is now created for the first time, "
+                    + "we can proceed with the creation of the node {} in the TAPI topology", nodeId);
+                this.tapiNetworkModelService.createTapiNode(
+                    nodeId, nodesAft.getNodeInfo().getOpenroadmVersion().getIntValue(), nodesAft);
+                continue;
+            }
+            for (Map.Entry<MappingKey, Mapping> entry : mappingAft.entrySet()) {
+                Mapping oldMapping = mappingBef.get(entry.getKey());
+                Mapping newMapping = mappingAft.get(entry.getKey());
+                if (oldMapping == null || newMapping == null) {
+                    continue;
+                }
+                if (!oldMapping.getPortAdminState().equals(newMapping.getPortAdminState())
+                        || !oldMapping.getPortOperState().equals(newMapping.getPortOperState())) {
+                    this.tapiNetworkModelService.updateTapiTopology(nodeId, entry.getValue());
                 }
             }
         }
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TapiTopologyImpl.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/topology/TapiTopologyImpl.java
deleted file mode 100644 (file)
index 0905427..0000000
+++ /dev/null
@@ -1,554 +0,0 @@
-/*
- * Copyright © 2019 Orange, Inc. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.transportpce.tapi.topology;
-
-import com.google.common.util.concurrent.FluentFuture;
-import com.google.common.util.concurrent.ListenableFuture;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Optional;
-import java.util.UUID;
-import java.util.concurrent.ExecutionException;
-import java.util.stream.Collectors;
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.jdt.annotation.Nullable;
-import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
-import org.opendaylight.transportpce.common.InstanceIdentifiers;
-import org.opendaylight.transportpce.common.NetworkUtils;
-import org.opendaylight.transportpce.tapi.TapiStringConstants;
-import org.opendaylight.transportpce.tapi.utils.TapiContext;
-import org.opendaylight.transportpce.tapi.utils.TapiLink;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.network.Node;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.AdministrativeState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Context;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.GetServiceInterfacePointDetailsInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.GetServiceInterfacePointDetailsOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.GetServiceInterfacePointDetailsOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.GetServiceInterfacePointListInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.GetServiceInterfacePointListOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.GetServiceInterfacePointListOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LifecycleState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.OperationalState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TapiCommonService;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.UpdateServiceInterfacePointInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.UpdateServiceInterfacePointOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.get.service._interface.point.list.output.Sip;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.get.service._interface.point.list.output.SipBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.get.service._interface.point.list.output.SipKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.Context1;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.ForwardingRule;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetLinkDetailsInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetLinkDetailsOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetLinkDetailsOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetNodeDetailsInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetNodeDetailsOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetNodeDetailsOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetNodeEdgePointDetailsInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetNodeEdgePointDetailsOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetNodeEdgePointDetailsOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetTopologyDetailsInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetTopologyDetailsOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetTopologyDetailsOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetTopologyListInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetTopologyListOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetTopologyListOutputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.RuleType;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.TapiTopologyService;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.get.link.details.output.LinkBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.get.node.edge.point.details.output.NodeEdgePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.get.topology.details.output.Topology;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.get.topology.details.output.TopologyBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroup;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroupBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroupKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.Rule;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.RuleBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.RuleKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.LinkKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.TopologyKey;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
-import org.opendaylight.yangtools.yang.common.RpcError;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class TapiTopologyImpl implements TapiTopologyService, TapiCommonService {
-
-    private static final Logger LOG = LoggerFactory.getLogger(TapiTopologyImpl.class);
-    private final DataBroker dataBroker;
-    private final TapiContext tapiContext;
-    private final TopologyUtils topologyUtils;
-    private final TapiLink tapiLink;
-
-    public TapiTopologyImpl(DataBroker dataBroker, TapiContext tapiContext, TopologyUtils topologyUtils,
-                            TapiLink tapiLink) {
-        this.dataBroker = dataBroker;
-        this.tapiContext = tapiContext;
-        this.topologyUtils = topologyUtils;
-        this.tapiLink = tapiLink;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<GetNodeDetailsOutput>> getNodeDetails(GetNodeDetailsInput input) {
-        // TODO Auto-generated method stub
-        // TODO -> maybe we get errors when having CEPs?
-        Uuid topoUuid = getUuidFromIput(input.getTopologyIdOrName());
-        // Node id: if roadm -> ROADM+PHOTONIC_MEDIA. if xpdr -> XPDR-XPDR+DSR/OTSi
-        Uuid nodeUuid = getUuidFromIput(input.getNodeIdOrName());
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node node = this.tapiContext
-                .getTapiNode(topoUuid, nodeUuid);
-        if (node == null) {
-            LOG.error("Invalid TAPI node name");
-            return RpcResultBuilder.<GetNodeDetailsOutput>failed().withError(RpcError.ErrorType.RPC,
-                "Invalid Tapi Node name").buildFuture();
-        }
-        return RpcResultBuilder.success(new GetNodeDetailsOutputBuilder()
-                .setNode(new org.opendaylight.yang.gen.v1.urn
-                        .onf.otcc.yang.tapi.topology.rev181210.get.node.details.output.NodeBuilder(node).build())
-                .build()).buildFuture();
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<GetTopologyDetailsOutput>> getTopologyDetails(GetTopologyDetailsInput input) {
-        // TODO -> Add check for Full T0 Multilayer
-        if (!TapiStringConstants.T0_MULTILAYER.equals(input.getTopologyIdOrName())
-            && !TapiStringConstants.TPDR_100G.equals(input.getTopologyIdOrName())) {
-            if (TapiStringConstants.T0_FULL_MULTILAYER.equals(input.getTopologyIdOrName())) {
-                Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(input.getTopologyIdOrName()
-                    .getBytes(Charset.forName("UTF-8"))).toString());
-                Context context = this.tapiContext.getTapiContext();
-                Map<TopologyKey,
-                    org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.Topology>
-                    topologyMap = context.augmentation(Context1.class).getTopologyContext().getTopology();
-                if (!(topologyMap != null && topologyMap.containsKey(new TopologyKey(topoUuid)))) {
-                    LOG.error("Topology {} not found in datastore", input.getTopologyIdOrName());
-                    return RpcResultBuilder.<GetTopologyDetailsOutput>failed()
-                        .withError(RpcError.ErrorType.RPC, "Invalid Topology name").buildFuture();
-                }
-                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.Topology
-                    topology = topologyMap.get(new TopologyKey(topoUuid));
-                return RpcResultBuilder.success(new GetTopologyDetailsOutputBuilder()
-                        .setTopology(this.topologyUtils.transformTopology(topology))
-                        .build())
-                    .buildFuture();
-            }
-            LOG.error("Invalid TAPI topology name");
-            return RpcResultBuilder.<GetTopologyDetailsOutput>failed()
-                .withError(RpcError.ErrorType.RPC, "Invalid Topology name").buildFuture();
-        }
-        try {
-            LOG.info("Building TAPI Topology abstraction for {}", input.getTopologyIdOrName());
-            Topology topology = createAbstractedOtnTopology();
-            if (TapiStringConstants.TPDR_100G.equals(input.getTopologyIdOrName())) {
-                topology = createAbstracted100GTpdrTopology(topology);
-            }
-            return RpcResultBuilder.success(new GetTopologyDetailsOutputBuilder().setTopology(topology).build())
-                .buildFuture();
-        } catch (TapiTopologyException e) {
-            LOG.error("error building TAPI topology");
-            return RpcResultBuilder.<GetTopologyDetailsOutput>failed()
-                .withError(RpcError.ErrorType.RPC, "Error building topology").buildFuture();
-        }
-    }
-
-    private Topology createAbstracted100GTpdrTopology(Topology topology) {
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> dsrNodes =
-            topology.nonnullNode().values().stream()
-                .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR))
-                .collect(Collectors.toList());
-        List<OwnedNodeEdgePoint> nep100GTpdrList = new ArrayList<>();
-        for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node node2: dsrNodes) {
-            List<OwnedNodeEdgePoint> nepList = node2.getOwnedNodeEdgePoint().values().stream()
-                .filter(nep -> nep.getName().containsKey(new NameKey("100G-tpdr"))).collect(Collectors.toList());
-            nep100GTpdrList.addAll(nepList);
-        }
-        Name topoName = new NameBuilder().setValue(TapiStringConstants.TPDR_100G)
-            .setValueName("TAPI Topology Name").build();
-        Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(
-            TapiStringConstants.TPDR_100G.getBytes(Charset.forName("UTF-8"))).toString());
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node node =
-            createTapiNode(nep100GTpdrList, topoUuid);
-        return new TopologyBuilder()
-            .setName(Map.of(topoName.key(), topoName))
-            .setUuid(topoUuid)
-            .setNode(Map.of(node.key(), node))
-            .build();
-    }
-
-    private Network readTopology(InstanceIdentifier<Network> networkIID) throws TapiTopologyException {
-        Network topology = null;
-        FluentFuture<Optional<Network>> topologyFuture = dataBroker.newReadOnlyTransaction()
-            .read(LogicalDatastoreType.CONFIGURATION, networkIID);
-        try {
-            topology = topologyFuture.get().get();
-        } catch (InterruptedException e) {
-            Thread.currentThread().interrupt();
-            throw new TapiTopologyException("Unable to get from mdsal topology: " + networkIID
-                .firstKeyOf(Network.class).getNetworkId().getValue(), e);
-        } catch (ExecutionException e) {
-            throw new TapiTopologyException("Unable to get from mdsal topology: " + networkIID
-                .firstKeyOf(Network.class).getNetworkId().getValue(), e);
-        }
-        return topology;
-    }
-
-    private Topology createAbstractedOtnTopology() throws TapiTopologyException {
-        // read openroadm-topology
-        Network openroadmTopo = readTopology(InstanceIdentifiers.OVERLAY_NETWORK_II);
-        List<Link> linkList = new ArrayList<>();
-        if (openroadmTopo.augmentation(Network1.class) != null) {
-            linkList.addAll(openroadmTopo.augmentation(Network1.class).getLink().values());
-        }
-        List<Link> xponderOutLinkList = linkList.stream()
-                .filter(lk -> lk.augmentation(Link1.class).getLinkType().equals(OpenroadmLinkType.XPONDEROUTPUT))
-                .collect(Collectors.toList());
-        List<Link> xponderInLinkList = linkList.stream()
-                .filter(lk -> lk.augmentation(Link1.class).getLinkType().equals(OpenroadmLinkType.XPONDERINPUT))
-                .collect(Collectors.toList());
-        // read otn-topology
-        Network otnTopo = readTopology(InstanceIdentifiers.OTN_NETWORK_II);
-        Map<NodeId, Node> otnNodeMap = otnTopo.nonnullNode().values().stream()
-            .collect(Collectors.toMap(Node::getNodeId, node -> node));
-
-        Map<String, List<String>> networkPortMap = new HashMap<>();
-        Iterator<Entry<NodeId, Node>> itOtnNodeMap = otnNodeMap.entrySet().iterator();
-        while (itOtnNodeMap.hasNext()) {
-            Entry<NodeId, Node> entry = itOtnNodeMap.next();
-            String portMappingNodeId = entry.getValue().getSupportingNode().values().stream()
-                .filter(sn -> sn.getNetworkRef().getValue().equals(NetworkUtils.UNDERLAY_NETWORK_ID))
-                .findFirst()
-                .get().getNodeRef().getValue();
-            List<String> networkPortList = new ArrayList<>();
-            for (TerminationPoint tp: entry.getValue().augmentation(Node1.class).getTerminationPoint().values()) {
-                if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)
-                        && checkTp(entry.getKey().getValue(), portMappingNodeId, tp, xponderOutLinkList,
-                        xponderInLinkList)) {
-                    networkPortList.add(tp.getTpId().getValue());
-                }
-            }
-            if (!networkPortList.isEmpty()) {
-                networkPortMap.put(entry.getKey().getValue(), networkPortList);
-            }
-        }
-        Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node>
-            tapiNodeList = new HashMap<>();
-        Map<LinkKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link>
-            tapiLinkList = new HashMap<>();
-        Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_MULTILAYER
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topoUuid, this.tapiLink);
-        Iterator<Entry<String, List<String>>> it = networkPortMap.entrySet().iterator();
-        while (it.hasNext()) {
-            String nodeId = it.next().getKey();
-            tapiFactory.convertNode(otnNodeMap.get(new NodeId(nodeId)), networkPortMap.get(nodeId));
-            tapiNodeList.putAll(tapiFactory.getTapiNodes());
-            tapiLinkList.putAll(tapiFactory.getTapiLinks());
-        }
-        if (openroadmTopo.nonnullNode().values().stream().filter(nt ->
-                nt.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1.class)
-                    .getNodeType().equals(OpenroadmNodeType.SRG)).count() > 0) {
-            tapiFactory.convertRoadmInfrastructure();
-            tapiNodeList.putAll(tapiFactory.getTapiNodes());
-            tapiLinkList.putAll(tapiFactory.getTapiLinks());
-        } else {
-            LOG.warn("Unable to abstract an ROADM infrasctructure from openroadm-topology");
-        }
-        if (otnTopo.augmentation(Network1.class) != null) {
-            Map<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
-                    .ietf.network.topology.rev180226.networks.network.LinkKey, Link> otnLinkMap =
-                otnTopo.augmentation(Network1.class).getLink();
-            tapiFactory.convertLinks(otnLinkMap);
-            tapiLinkList.putAll(tapiFactory.getTapiLinks());
-        }
-        Name name = new NameBuilder()
-            .setValue(TapiStringConstants.T0_MULTILAYER)
-            .setValueName("TAPI Topology Name")
-            .build();
-        return new TopologyBuilder()
-                .setName(Map.of(name.key(), name))
-                .setUuid(topoUuid)
-                .setNode(tapiNodeList)
-                .setLink(tapiLinkList).build();
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<GetNodeEdgePointDetailsOutput>> getNodeEdgePointDetails(
-            GetNodeEdgePointDetailsInput input) {
-        // TODO Auto-generated method stub
-        // TODO -> maybe we get errors when having CEPs?
-        Uuid topoUuid = getUuidFromIput(input.getTopologyIdOrName());
-        // Node id: if roadm -> ROADMid+PHOTONIC_MEDIA. if xpdr -> XPDRid-XPDRnbr+DSR/OTSi
-        Uuid nodeUuid = getUuidFromIput(input.getNodeIdOrName());
-        // NEP id: if roadm -> ROADMid+PHOTONIC_MEDIA/MC/OTSiMC+TPid.
-        // if xpdr -> XPDRid-XPDRnbr+DSR/eODU/iODU/iOTSi/eOTSi/PHOTONIC_MEDIA+TPid
-        Uuid nepUuid = getUuidFromIput(input.getEpIdOrName());
-        OwnedNodeEdgePoint nep = this.tapiContext.getTapiNEP(topoUuid, nodeUuid, nepUuid);
-        if (nep == null) {
-            LOG.error("Invalid TAPI nep name");
-            return RpcResultBuilder.<GetNodeEdgePointDetailsOutput>failed().withError(RpcError.ErrorType.RPC,
-                "Invalid NEP name").buildFuture();
-        }
-        return RpcResultBuilder.success(new GetNodeEdgePointDetailsOutputBuilder()
-                .setNodeEdgePoint(new NodeEdgePointBuilder(nep).build()).build()).buildFuture();
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<GetLinkDetailsOutput>> getLinkDetails(GetLinkDetailsInput input) {
-        // TODO Auto-generated method stub
-        Uuid topoUuid = getUuidFromIput(input.getTopologyIdOrName());
-        // Link id: same as OR link id
-        Uuid linkUuid = getUuidFromIput(input.getLinkIdOrName());
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link link = this.tapiContext
-                .getTapiLink(topoUuid, linkUuid);
-        if (link == null) {
-            LOG.error("Invalid TAPI link name");
-            return RpcResultBuilder.<GetLinkDetailsOutput>failed().withError(RpcError.ErrorType.RPC,
-                "Invalid Link name").buildFuture();
-        }
-        return RpcResultBuilder.success(new GetLinkDetailsOutputBuilder().setLink(new LinkBuilder(link).build())
-                .build()).buildFuture();
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<GetTopologyListOutput>> getTopologyList(GetTopologyListInput input) {
-        // TODO Auto-generated method stub
-        // TODO -> maybe we get errors when having CEPs?
-        Map<TopologyKey,
-                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.Topology>
-                topologyMap = this.tapiContext.getTopologyContext();
-        if (topologyMap.isEmpty()) {
-            LOG.error("No topologies exist in tapi context");
-            return RpcResultBuilder.<GetTopologyListOutput>failed().withError(RpcError.ErrorType.APPLICATION,
-                "No topologies exist in tapi context").buildFuture();
-        }
-        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.get.topology.list.output.TopologyKey,
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.get.topology.list.output.Topology>
-                newTopoMap = new HashMap<>();
-        for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.Topology
-                topo:topologyMap.values()) {
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.get.topology.list.output.Topology
-                newTopo = new org.opendaylight.yang.gen.v1.urn
-                    .onf.otcc.yang.tapi.topology.rev181210.get.topology.list.output.TopologyBuilder(topo).build();
-            newTopoMap.put(newTopo.key(), newTopo);
-        }
-        return RpcResultBuilder.success(new GetTopologyListOutputBuilder().setTopology(newTopoMap).build())
-                .buildFuture();
-    }
-
-    private org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node
-            createTapiNode(List<OwnedNodeEdgePoint> nepList, Uuid topoUuid) {
-        Name name = new NameBuilder().setValueName("Tpdr100g node name").setValue("Tpdr100g over WDM node").build();
-        Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
-        for (OwnedNodeEdgePoint ownedNodeEdgePoint: nepList) {
-            onepMap.put(ownedNodeEdgePoint.key(), ownedNodeEdgePoint);
-        }
-        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(name.getValue().getBytes(Charset.forName("UTF-8"))).toString());
-        return new NodeBuilder()
-                .setUuid(nodeUuid)
-                .setName(Map.of(name.key(), name))
-                .setLayerProtocolName(List.of(LayerProtocolName.ETH))
-                .setAdministrativeState(AdministrativeState.UNLOCKED)
-                .setOperationalState(OperationalState.ENABLED)
-                .setLifecycleState(LifecycleState.INSTALLED)
-                .setOwnedNodeEdgePoint(onepMap)
-                .setNodeRuleGroup(createNodeRuleGroupFor100gTpdrNode(topoUuid, nodeUuid, nepList))
-                .build();
-    }
-
-    private boolean checkTp(String nodeIdTopo, String nodeIdPortMap, TerminationPoint tp, List<Link> xpdOut,
-                            List<Link> xpdIn) {
-        String networkLcp;
-        if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERCLIENT)) {
-            networkLcp = tp.augmentation(
-                org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1.class)
-                .getAssociatedConnectionMapPort();
-        } else {
-            networkLcp = tp.getTpId().getValue();
-        }
-        @NonNull
-        KeyedInstanceIdentifier<Mapping, MappingKey> pmIID = InstanceIdentifier.create(
-            org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network.class)
-            .child(Nodes.class, new NodesKey(nodeIdPortMap)).child(Mapping.class, new MappingKey(networkLcp));
-        @NonNull
-        FluentFuture<Optional<Mapping>> mappingOpt = dataBroker.newReadOnlyTransaction().read(
-            LogicalDatastoreType.CONFIGURATION, pmIID);
-        Mapping mapping = null;
-        if (mappingOpt.isDone()) {
-            try {
-                mapping = mappingOpt.get().get();
-            } catch (InterruptedException | ExecutionException e) {
-                LOG.error("Error getting mapping for {}", networkLcp, e);
-                return false;
-            }
-        } else {
-            LOG.error("Impossible to get mapping of associated network port {} of tp {}", networkLcp, tp.getTpId()
-                .getValue());
-            return false;
-        }
-        String networkPortDirection = mapping.getPortDirection();
-        long count = 0;
-        switch (networkPortDirection) {
-            case "bidirectional":
-                count += xpdOut.stream().filter(lk -> lk.getSource().getSourceNode().getValue().equals(nodeIdTopo)
-                    && lk.getSource().getSourceTp().getValue().equals(networkLcp)).count();
-                count += xpdIn.stream().filter(lk -> lk.getDestination().getDestNode().getValue().equals(nodeIdTopo)
-                    && lk.getDestination().getDestTp().getValue().equals(networkLcp)).count();
-                return (count == 2);
-            case "tx":
-            case "rx":
-                @Nullable
-                String partnerLcp = mapping.getPartnerLcp();
-                if (mapping.getPortQual().equals("tx")) {
-                    count += xpdOut.stream().filter(lk -> lk.getSource().getSourceNode().getValue().equals(nodeIdTopo)
-                        && lk.getSource().getSourceTp().getValue().equals(networkLcp)).count();
-                    count += xpdIn.stream().filter(lk -> lk.getDestination().getDestNode().getValue().equals(nodeIdTopo)
-                        && lk.getDestination().getDestTp().getValue().equals(partnerLcp)).count();
-                }
-                if (mapping.getPortQual().equals("rx")) {
-                    count += xpdIn.stream().filter(lk -> lk.getDestination().getDestNode().getValue().equals(nodeIdTopo)
-                        && lk.getDestination().getDestTp().getValue().equals(networkLcp)).count();
-                    count += xpdOut.stream().filter(lk -> lk.getSource().getSourceNode().getValue().equals(nodeIdTopo)
-                        && lk.getSource().getSourceTp().getValue().equals(partnerLcp)).count();
-                }
-                return (count == 2);
-            default:
-                LOG.error("Invalid port direction for {}", networkLcp);
-                return false;
-        }
-    }
-
-    private Map<NodeRuleGroupKey, NodeRuleGroup> createNodeRuleGroupFor100gTpdrNode(
-            Uuid topoUuid, Uuid nodeUuid, Collection<OwnedNodeEdgePoint> onepl) {
-
-        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePointKey,
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint>
-            nepMap = new HashMap<>();
-        for (OwnedNodeEdgePoint onep: onepl) {
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint nep =
-                new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group
-                    .NodeEdgePointBuilder()
-                        .setTopologyUuid(topoUuid)
-                        .setNodeUuid(nodeUuid)
-                        .setNodeEdgePointUuid(onep.key().getUuid())
-                        .build();
-            nepMap.put(nep.key(), nep);
-        }
-        Map<NodeRuleGroupKey, NodeRuleGroup> nodeRuleGroupMap = new HashMap<>();
-        Map<RuleKey, Rule> ruleList = new HashMap<>();
-        Rule rule = new RuleBuilder()
-            .setLocalId("forward")
-            .setForwardingRule(ForwardingRule.MAYFORWARDACROSSGROUP)
-            .setRuleType(RuleType.FORWARDING)
-            .build();
-        ruleList.put(rule.key(), rule);
-        NodeRuleGroup nodeRuleGroup = new NodeRuleGroupBuilder()
-            .setUuid(new Uuid(UUID.nameUUIDFromBytes(("rdm infra node rule group").getBytes(Charset.forName("UTF-8")))
-                .toString()))
-            .setRule(ruleList)
-            .setNodeEdgePoint(nepMap)
-            .build();
-        nodeRuleGroupMap.put(nodeRuleGroup.key(), nodeRuleGroup);
-        return nodeRuleGroupMap;
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<GetServiceInterfacePointDetailsOutput>>
-            getServiceInterfacePointDetails(GetServiceInterfacePointDetailsInput input) {
-        Uuid sipUuid = getUuidFromIput(input.getSipIdOrName());
-        Map<ServiceInterfacePointKey, ServiceInterfacePoint> sips =
-            this.tapiContext.getTapiContext().getServiceInterfacePoint();
-        if (sips == null || sips.isEmpty()) {
-            return RpcResultBuilder.<GetServiceInterfacePointDetailsOutput>failed().withError(RpcError.ErrorType.RPC,
-                "No sips in datastore").buildFuture();
-        }
-        if (!sips.containsKey(new ServiceInterfacePointKey(sipUuid))) {
-            return RpcResultBuilder.<GetServiceInterfacePointDetailsOutput>failed().withError(RpcError.ErrorType.RPC,
-                "Sip doesnt exist in datastore").buildFuture();
-        }
-        org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.common.rev181210.get.service._interface.point.details.output.Sip outSip =
-                new org.opendaylight.yang.gen.v1.urn
-                    .onf.otcc.yang.tapi.common.rev181210.get.service._interface.point.details.output.SipBuilder(
-                        sips.get(new ServiceInterfacePointKey(sipUuid)))
-                    .build();
-        return RpcResultBuilder.success(new GetServiceInterfacePointDetailsOutputBuilder().setSip(outSip).build())
-            .buildFuture();
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<GetServiceInterfacePointListOutput>>
-            getServiceInterfacePointList(GetServiceInterfacePointListInput input) {
-        Map<ServiceInterfacePointKey, ServiceInterfacePoint> sips =
-            this.tapiContext.getTapiContext().getServiceInterfacePoint();
-        if (sips == null || sips.isEmpty()) {
-            return RpcResultBuilder.<GetServiceInterfacePointListOutput>failed().withError(RpcError.ErrorType.RPC,
-                "No sips in datastore").buildFuture();
-        }
-        Map<SipKey, Sip> outSipMap = new HashMap<>();
-        for (ServiceInterfacePoint sip : sips.values()) {
-            Sip si = new SipBuilder(sip).build();
-            outSipMap.put(si.key(), si);
-        }
-        return RpcResultBuilder.success(new GetServiceInterfacePointListOutputBuilder().setSip(outSipMap).build())
-            .buildFuture();
-    }
-
-    @Override
-    public ListenableFuture<RpcResult<UpdateServiceInterfacePointOutput>>
-            updateServiceInterfacePoint(UpdateServiceInterfacePointInput input) {
-        // TODO --> not yet implemented
-        return null;
-    }
-
-    private Uuid getUuidFromIput(String serviceIdOrName) {
-        try {
-            UUID.fromString(serviceIdOrName);
-            LOG.info("Given attribute {} is a UUID", serviceIdOrName);
-            return new Uuid(serviceIdOrName);
-        } catch (IllegalArgumentException e) {
-            LOG.info("Given attribute {} is not a UUID", serviceIdOrName);
-            return new Uuid(UUID.nameUUIDFromBytes(serviceIdOrName.getBytes(StandardCharsets.UTF_8)).toString());
-        }
-    }
-}
index b1f5455d0064b12275c41a42f8d378a183bd7fe0..9eca76d6990f102d839379d905b0fea1e0ce58e3 100644 (file)
@@ -17,6 +17,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
 import java.util.Optional;
+import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
@@ -29,37 +30,41 @@ import org.opendaylight.transportpce.common.NetworkUtils;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.tapi.TapiStringConstants;
 import org.opendaylight.transportpce.tapi.utils.TapiLink;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.NodesKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.mapping.MappingKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.network.NodesKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Network1;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.OwnedNodeEdgePoint1;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.LinkKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.Topology;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.TopologyBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Context;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey;
+//import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.OwnedNodeEdgePoint1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.context.TopologyContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
 import org.slf4j.Logger;
@@ -72,6 +77,8 @@ public final class TopologyUtils {
     private static final Logger LOG = LoggerFactory.getLogger(TopologyUtils.class);
     private Map<ServiceInterfacePointKey, ServiceInterfacePoint> tapiSips;
     private final TapiLink tapiLink;
+    private String topologicalMode;
+    public static final String NOOPMODEDECLARED = "No operational mode declared in Topo for Tp {}, assumes by default ";
 
     public TopologyUtils(NetworkTransactionService networkTransactionService, DataBroker dataBroker,
                          TapiLink tapiLink) {
@@ -79,6 +86,8 @@ public final class TopologyUtils {
         this.dataBroker = dataBroker;
         this.tapiSips = new HashMap<>();
         this.tapiLink = tapiLink;
+        // TODO: Initially set topological mode to Full. Shall be set through the setter at controller initialization
+        this.topologicalMode = "Full";
     }
 
     public Network readTopology(InstanceIdentifier<Network> networkIID) throws TapiTopologyException {
@@ -86,7 +95,7 @@ public final class TopologyUtils {
         ListenableFuture<Optional<Network>> topologyFuture =
                 this.networkTransactionService.read(LogicalDatastoreType.CONFIGURATION, networkIID);
         try {
-            topology = topologyFuture.get().get();
+            topology = topologyFuture.get().orElseThrow();
         } catch (InterruptedException e) {
             Thread.currentThread().interrupt();
             throw new TapiTopologyException("Unable to get from mdsal topology: " + networkIID
@@ -100,13 +109,43 @@ public final class TopologyUtils {
         return topology;
     }
 
+    public List<String> readTopologyName(Uuid topoUuid) throws TapiTopologyException {
+        Topology topology = null;
+        InstanceIdentifier<Topology> topoIID = InstanceIdentifier.builder(
+                Context.class).augmentation(org.opendaylight.yang.gen.v1.urn
+                .onf.otcc.yang.tapi.topology.rev221121.Context1.class).child(TopologyContext.class)
+                .child(Topology.class, new TopologyKey(topoUuid)).build();
+
+        ListenableFuture<Optional<Topology>> topologyFuture =
+                this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, topoIID);
+        try {
+            topology = topologyFuture.get().orElseThrow();
+        } catch (InterruptedException e) {
+            Thread.currentThread().interrupt();
+            throw new TapiTopologyException("Unable to get from mdsal topology: " + topoIID
+                    .firstKeyOf(Topology.class).getUuid().getValue(), e);
+        } catch (ExecutionException e) {
+            throw new TapiTopologyException("Unable to get from mdsal topology: " + topoIID
+                .firstKeyOf(Topology.class).getUuid().getValue(), e);
+        } catch (NoSuchElementException e) {
+            return null;
+        }
+        List<String> nameList = new ArrayList<>();
+        for (Map.Entry<NameKey, Name> entry : topology.getName().entrySet()) {
+            nameList.add(entry.getValue().getValue());
+        }
+        LOG.debug("Topology nameList {} = ", nameList.toString());
+        return nameList;
+    }
+
     public Topology createFullOtnTopology() throws TapiTopologyException {
         // read openroadm-topology
         Network openroadmTopo = readTopology(InstanceIdentifiers.OVERLAY_NETWORK_II);
-        Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
-            .getBytes(Charset.forName("UTF-8"))).toString());
+        String topoType = this.topologicalMode.equals("Full") ? TapiStringConstants.T0_FULL_MULTILAYER
+            : TapiStringConstants.T0_TAPI_MULTILAYER;
+        Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(topoType.getBytes(Charset.forName("UTF-8"))).toString());
         Name name = new NameBuilder()
-            .setValue(TapiStringConstants.T0_FULL_MULTILAYER)
+            .setValue(topoType)
             .setValueName("TAPI Topology Name")
             .build();
         if (openroadmTopo != null) {
@@ -137,7 +176,7 @@ public final class TopologyUtils {
                 String portMappingNodeId = entry.getValue().getSupportingNode().values().stream()
                     .filter(sn -> sn.getNetworkRef().getValue().equals(NetworkUtils.UNDERLAY_NETWORK_ID))
                     .findFirst()
-                    .get().getNodeRef().getValue();
+                    .orElseThrow().getNodeRef().getValue();
                 List<String> networkPortList = new ArrayList<>();
                 for (TerminationPoint tp: entry.getValue().augmentation(Node1.class).getTerminationPoint().values()) {
                     // TODO -> why are we checking with respect to XPDR links?? Is there a real purpose on doing that?
@@ -151,85 +190,102 @@ public final class TopologyUtils {
                     networkPortMap.put(entry.getKey().getValue(), networkPortList);
                 }
             }
-            Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node>
+            Map<NodeKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node>
                 tapiNodeList = new HashMap<>();
-            Map<LinkKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link>
+            Map<LinkKey, org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link>
                 tapiLinkList = new HashMap<>();
-            ConvertORTopoToTapiFullTopo tapiFactory = new ConvertORTopoToTapiFullTopo(topoUuid, this.tapiLink);
+            ConvertORTopoToTapiFullTopo tapiFullFactory = new ConvertORTopoToTapiFullTopo(topoUuid, this.tapiLink);
+            ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(topoUuid);
             Iterator<Map.Entry<String, List<String>>> it = networkPortMap.entrySet().iterator();
             while (it.hasNext()) {
                 String nodeId = it.next().getKey();
                 tapiFactory.convertNode(otnNodeMap.get(new NodeId(nodeId)), networkPortMap.get(nodeId));
+                this.tapiSips.putAll(tapiFactory.getTapiSips());
+                tapiFullFactory.setTapiNodes(tapiFactory.getTapiNodes());
+                tapiFullFactory.setTapiSips(tapiFactory.getTapiSips());
                 tapiNodeList.putAll(tapiFactory.getTapiNodes());
-                tapiLinkList.putAll(tapiFactory.getTapiLinks());
+                tapiLinkList.putAll(tapiFullFactory.getTapiLinks());
             }
             // roadm infrastructure not abstracted
             // read openroadm-network
             Network openroadmNet = readTopology(InstanceIdentifiers.UNDERLAY_NETWORK_II);
-            if (openroadmNet != null && openroadmNet.nonnullNode().values().stream().filter(nt ->
-                nt.augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Node1.class)
-                    .getNodeType().equals(OpenroadmNodeType.ROADM)).count() > 0) {
+            if (openroadmNet != null && openroadmNet.nonnullNode().values().stream()
+                .filter(nt -> nt
+                    .augmentation(org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class)
+                    .getNodeType()
+                    .equals(OpenroadmNodeType.ROADM))
+                .count() > 0) {
                 // map roadm nodes
-                for (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang
-                    .ietf.network.rev180226.networks.network.Node roadm:openroadmNet.nonnullNode().values().stream()
-                    .filter(nt -> nt.augmentation(org.opendaylight.yang.gen.v1.http
-                        .org.openroadm.common.network.rev211210.Node1.class)
-                        .getNodeType().equals(OpenroadmNodeType.ROADM))
-                    .collect(Collectors.toList())) {
-                    tapiFactory.convertRoadmNode(roadm, openroadmTopo);
-                    tapiNodeList.putAll(tapiFactory.getTapiNodes());
+                if (this.topologicalMode.equals("Full")) {
+                    for (org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks
+                        .network.Node roadm:openroadmNet.nonnullNode().values().stream()
+                        .filter(nt -> nt
+                            .augmentation(
+                                org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Node1.class)
+                            .getNodeType()
+                            .equals(OpenroadmNodeType.ROADM))
+                        .collect(Collectors.toList())) {
+                        tapiFullFactory.convertRoadmNode(roadm, openroadmTopo, "Full");
+                        this.tapiSips.putAll(tapiFullFactory.getTapiSips());
+                        tapiNodeList.putAll(tapiFullFactory.getTapiNodes());
+                        tapiLinkList.putAll(tapiFullFactory.getTapiLinks());
+                        // map roadm to roadm link
+                        List<Link> rdmTordmLinkList = linkList.stream()
+                            .filter(lk -> lk.augmentation(Link1.class).getLinkType()
+                                .equals(OpenroadmLinkType.ROADMTOROADM))
+                            .collect(Collectors.toList());
+                        tapiFullFactory.convertRdmToRdmLinks(rdmTordmLinkList);
+                        tapiLinkList.putAll(tapiFullFactory.getTapiLinks());
+                    }
+                } else {
+                    tapiFullFactory.convertRoadmNode(null, openroadmTopo, "Abstracted");
+                    this.tapiSips.putAll(tapiFullFactory.getTapiSips());
+                    tapiNodeList.putAll(tapiFullFactory.getTapiNodes());
+                    tapiLinkList.putAll(tapiFullFactory.getTapiLinks());
                 }
+
             } else {
                 LOG.warn("No roadm nodes exist in the network");
             }
-            // map roadm to roadm link
-            List<Link> rdmTordmLinkList = linkList.stream()
-                .filter(lk -> lk.augmentation(Link1.class).getLinkType().equals(OpenroadmLinkType.ROADMTOROADM))
-                .collect(Collectors.toList());
-            tapiFactory.convertRdmToRdmLinks(rdmTordmLinkList);
-            tapiLinkList.putAll(tapiFactory.getTapiLinks());
+
             // map xpdr_input to roadm and xpdr_output to roadm links.
             xponderInLinkList.addAll(xponderOutLinkList);
-            tapiFactory.convertXpdrToRdmLinks(xponderInLinkList);
-            tapiLinkList.putAll(tapiFactory.getTapiLinks());
+            tapiFullFactory.convertXpdrToRdmLinks(xponderInLinkList);
+            tapiLinkList.putAll(tapiFullFactory.getTapiLinks());
 
             // Retrieve created sips map in TapiFactory when mapping all the nodes
-            this.tapiSips = tapiFactory.getTapiSips();
+            this.tapiSips.putAll(tapiFullFactory.getTapiSips());
             return new TopologyBuilder()
                 .setName(Map.of(name.key(), name))
                 .setUuid(topoUuid)
                 .setNode(tapiNodeList)
-                .setLayerProtocolName(List.of(LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.ODU,
-                    LayerProtocolName.DSR))
+                .setLayerProtocolName(Set.of(LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.ODU,
+                    LayerProtocolName.DSR, LayerProtocolName.DIGITALOTN))
                 .setLink(tapiLinkList).build();
         }
         return new TopologyBuilder()
             .setName(Map.of(name.key(), name))
             .setUuid(topoUuid)
-            .setLayerProtocolName(List.of(LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.ODU,
-                LayerProtocolName.DSR))
+            .setLayerProtocolName(Set.of(LayerProtocolName.PHOTONICMEDIA, LayerProtocolName.ODU,
+                LayerProtocolName.DSR, LayerProtocolName.DIGITALOTN))
             .build();
     }
 
-    public Map<ServiceInterfacePointKey, ServiceInterfacePoint> getSipMap() {
-        return tapiSips;
-    }
-
     public boolean checkTp(String nodeIdTopo, String nodeIdPortMap, TerminationPoint tp, List<Link> xpdOut,
                            List<Link> xpdIn) {
         LOG.info("Inside Checktp for node {}-{}", nodeIdTopo, nodeIdPortMap);
         String networkLcp;
         if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERCLIENT)) {
             networkLcp = tp.augmentation(
-                    org.opendaylight.yang.gen.v1.http.transportpce.topology.rev220123.TerminationPoint1.class)
-                    .getAssociatedConnectionMapPort();
+                    org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1.class)
+                .getAssociatedConnectionMapTp().iterator().next().getValue();
         } else {
             networkLcp = tp.getTpId().getValue();
         }
         LOG.info("Network LCP associated = {}", networkLcp);
         @NonNull
         KeyedInstanceIdentifier<Mapping, MappingKey> pmIID = InstanceIdentifier.create(
-                org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network.class)
+                org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.Network.class)
                 .child(Nodes.class, new NodesKey(nodeIdPortMap)).child(Mapping.class, new MappingKey(networkLcp));
         @NonNull
         FluentFuture<Optional<Mapping>> mappingOpt = this.dataBroker.newReadOnlyTransaction().read(
@@ -237,7 +293,7 @@ public final class TopologyUtils {
         Mapping mapping = null;
         if (mappingOpt.isDone()) {
             try {
-                mapping = mappingOpt.get().get();
+                mapping = mappingOpt.get().orElseThrow();
             } catch (InterruptedException | ExecutionException e) {
                 LOG.error("Error getting mapping for {}", networkLcp,e);
                 return false;
@@ -249,7 +305,6 @@ public final class TopologyUtils {
         }
         LOG.info("Mapping found = {}", mapping);
         String networkPortDirection = mapping.getPortDirection();
-        // long count = 0;
         switch (networkPortDirection) {
             // TODO -> remove the part of counting only if the Network LCP is part of a Link.
             //  We want to have all OTN nodes in the TAPI topology
@@ -267,50 +322,56 @@ public final class TopologyUtils {
         }
     }
 
-    public org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.get.topology.details.output.Topology
+    public org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.get.topology.details.output.Topology
             transformTopology(Topology topology) {
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
             .get.topology.details.output.TopologyBuilder topologyBuilder =
-                new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
+                new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
             .get.topology.details.output.TopologyBuilder()
                 .setUuid(topology.getUuid())
                 .setName(topology.getName())
                 .setLayerProtocolName(topology.getLayerProtocolName())
-                .setNode(topology.getNode())
                 .setLink(topology.getLink());
-        if (topology.getNode() == null) {
-            topologyBuilder.setNode(topology.getNode());
+        if (topology.nonnullNode().isEmpty()) {
             return topologyBuilder.build();
         }
-        // TODO -> Need to remove CEPs from NEPs. If not error from get Topology details output
         Map<NodeKey, Node> mapNode = new HashMap<>();
-        for (Node node: topology.getNode().values()) {
+        for (Node node: topology.nonnullNode().values()) {
             Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
-            for (OwnedNodeEdgePoint onep: node.getOwnedNodeEdgePoint().values()) {
-                OwnedNodeEdgePoint1 onep1 = onep.augmentation(OwnedNodeEdgePoint1.class);
-                if (onep1 == null) {
-                    onepMap.put(onep.key(), onep);
-                    continue;
-                }
-                OwnedNodeEdgePointBuilder newOnepBuilder = new OwnedNodeEdgePointBuilder()
+            for (OwnedNodeEdgePoint onep: node.nonnullOwnedNodeEdgePoint().values()) {
+//                    OwnedNodeEdgePoint1 onep1 = onep.augmentation(OwnedNodeEdgePoint1.class);
+//                    if (onep1 == null) {
+//                        onepMap.put(onep.key(), onep);
+//                        continue;
+//                    }
+                OwnedNodeEdgePoint newOnep = new OwnedNodeEdgePointBuilder()
                         .setUuid(onep.getUuid())
                         .setLayerProtocolName(onep.getLayerProtocolName())
                         .setName(onep.getName())
-                        .setSupportedCepLayerProtocolQualifier(onep.getSupportedCepLayerProtocolQualifier())
+                        .setSupportedCepLayerProtocolQualifierInstances(onep
+                            .getSupportedCepLayerProtocolQualifierInstances())
                         .setAdministrativeState(onep.getAdministrativeState())
                         .setOperationalState(onep.getOperationalState())
                         .setLifecycleState(onep.getLifecycleState())
-                        .setTerminationDirection(onep.getTerminationDirection())
-                        .setTerminationState(onep.getTerminationState())
-                        .setLinkPortDirection(onep.getLinkPortDirection())
-                        .setLinkPortRole(onep.getLinkPortRole());
-                if (onep.getMappedServiceInterfacePoint() != null) {
-                    newOnepBuilder.setMappedServiceInterfacePoint(onep.getMappedServiceInterfacePoint());
-                }
-                OwnedNodeEdgePoint nep = newOnepBuilder.build();
-                onepMap.put(nep.key(), nep);
+//                            .setTerminationDirection(onep.getTerminationDirection())
+//                            .setTerminationState(onep.getTerminationState())
+                        .setDirection(onep.getDirection())
+                        .setSupportedPayloadStructure(onep.getSupportedPayloadStructure())
+                        .setAvailablePayloadStructure(onep.getAvailablePayloadStructure())
+                        .setLinkPortRole(onep.getLinkPortRole())
+                        .setMappedServiceInterfacePoint(onep.nonnullMappedServiceInterfacePoint())
+                        .build();
+                onepMap.put(newOnep.key(), newOnep);
             }
-            Node newNode = new NodeBuilder(node)
+            Node newNode = new NodeBuilder()
+                    .setUuid(node.getUuid())
+                    .setName(node.getName())
+                    .setOperationalState(node.getOperationalState())
+                    .setAdministrativeState(node.getAdministrativeState())
+                    .setLifecycleState(node.getLifecycleState())
+                    .setLayerProtocolName(node.getLayerProtocolName())
+                    .setNodeRuleGroup(node.getNodeRuleGroup())
+                    .setInterRuleGroup(node.getInterRuleGroup())
                     .setOwnedNodeEdgePoint(onepMap)
                     .build();
             mapNode.put(newNode.key(), newNode);
@@ -318,4 +379,17 @@ public final class TopologyUtils {
         topologyBuilder.setNode(mapNode);
         return topologyBuilder.build();
     }
+
+    public Map<ServiceInterfacePointKey, ServiceInterfacePoint> getSipMap() {
+        return tapiSips;
+    }
+
+    public void setTopologicalMode(String topoMode) {
+        this.topologicalMode = topoMode;
+    }
+
+    public String getTopologicalMode() {
+        return topologicalMode;
+    }
+
 }
index 019b745a1b0897965cd7dc0a2e04cac3db1a833b..79d4d19849534c9f5cadc53cd99da8a209047cd5 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.transportpce.tapi.utils;
 
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ServiceEndpoint;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ServiceEndpoint;
 
 public class GenericServiceEndpoint {
     private ServiceEndpoint value;
index 48468d57e104fd185c7db09b8e7557c7f63a14eb..59be16ab51881333b2293cc21844ba5f7929372f 100644 (file)
@@ -12,11 +12,11 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
 import org.opendaylight.transportpce.tapi.connectivity.ConnectivityUtils;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input.ServiceAEnd;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input.ServiceZEnd;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.tapi.rev180928.EndPointType;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.tapi.rev180928.service._interface.points.ServiceEndPoint;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.create.input.ServiceAEnd;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.create.input.ServiceZEnd;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.tapi.rev230728.EndPointType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.tapi.rev230728.service._interface.points.ServiceEndPoint;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -33,22 +33,26 @@ public final class MappingUtils {
         if (sep.getEndPoint().getServiceEndPointType().equals(EndPointType.Aend)) {
             ServiceAEnd sepG = ConnectivityUtils.buildServiceAEnd(sep.getEndPoint().getNodeId().getValue(),
                     sep.getEndPoint().getClli(),
-                    sep.getEndPoint().getTxDirection().values().stream().findFirst().get().getPort()
+                    sep.getEndPoint().getTxDirection().values().stream().findFirst().orElseThrow().getPort()
                         .getPortDeviceName(),
-                    sep.getEndPoint().getTxDirection().values().stream().findFirst().get().getPort().getPortName(),
-                    sep.getEndPoint().getRxDirection().values().stream().findFirst().get().getPort()
+                    sep.getEndPoint().getTxDirection().values().stream().findFirst().orElseThrow().getPort()
+                        .getPortName(),
+                    sep.getEndPoint().getRxDirection().values().stream().findFirst().orElseThrow().getPort()
                         .getPortDeviceName(),
-                    sep.getEndPoint().getRxDirection().values().stream().findFirst().get().getPort().getPortName());
+                    sep.getEndPoint().getRxDirection().values().stream().findFirst().orElseThrow().getPort()
+                        .getPortName());
             return new GenericServiceEndpoint(sepG, ServiceEndpointType.SERVICEAEND);
         } else {
             ServiceZEnd sepG = ConnectivityUtils.buildServiceZEnd(sep.getEndPoint().getNodeId().getValue(),
                     sep.getEndPoint().getClli(),
-                    sep.getEndPoint().getTxDirection().values().stream().findFirst().get().getPort()
+                    sep.getEndPoint().getTxDirection().values().stream().findFirst().orElseThrow().getPort()
                         .getPortDeviceName(),
-                    sep.getEndPoint().getTxDirection().values().stream().findFirst().get().getPort().getPortName(),
-                    sep.getEndPoint().getRxDirection().values().stream().findFirst().get().getPort()
+                    sep.getEndPoint().getTxDirection().values().stream().findFirst().orElseThrow().getPort()
+                        .getPortName(),
+                    sep.getEndPoint().getRxDirection().values().stream().findFirst().orElseThrow().getPort()
                         .getPortDeviceName(),
-                    sep.getEndPoint().getRxDirection().values().stream().findFirst().get().getPort().getPortName());
+                    sep.getEndPoint().getRxDirection().values().stream().findFirst().orElseThrow().getPort()
+                        .getPortName());
             return new GenericServiceEndpoint(sepG, ServiceEndpointType.SERVICEZEND);
         }
     }
index 045577c1fb29fdcf5c54b28af39fe70bd682456a..f2e5b8ddbb2988067a2683da69c5a1b4ad20841a 100644 (file)
@@ -15,39 +15,43 @@ import java.util.UUID;
 import java.util.concurrent.ExecutionException;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Context;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.ContextBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.Context1;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.Context1Builder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.OwnedNodeEdgePoint1;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.OwnedNodeEdgePoint1Builder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectionKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityService;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityServiceKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContextBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.context.topology.context.topology.node.owned.node.edge.point.CepList;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.context.topology.context.topology.node.owned.node.edge.point.CepListBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.context.TopologyContext;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.context.TopologyContextBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.LinkKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.NwTopologyServiceBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.Topology;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.TopologyKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Context;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.ContextBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.Context1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.Context1Builder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.OwnedNodeEdgePoint1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.OwnedNodeEdgePoint1Builder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.cep.list.ConnectionEndPoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.cep.list.ConnectionEndPointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connection.LowerConnection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connection.LowerConnectionKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.Connection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectionKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContextBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.context.topology.context.topology.node.owned.node.edge.point.CepList;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.context.topology.context.topology.node.owned.node.edge.point.CepListBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.context.NotificationContextBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.context.TopologyContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.context.TopologyContextBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.NwTopologyServiceBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -84,8 +88,8 @@ public class TapiContext {
                     .setValueName("Network Topo Service Name")
                     .build();
 
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.Context1 topologyContext
-                = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.Context1Builder()
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1 topologyContext
+                = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1Builder()
                     .setTopologyContext(new TopologyContextBuilder()
                         .setNwTopologyService(new NwTopologyServiceBuilder()
                             .setTopology(new HashMap<>())
@@ -99,13 +103,22 @@ public class TapiContext {
                         .build())
                     .build();
 
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.Context1 notificationContext
+                = new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.notification.rev221121.Context1Builder()
+                    .setNotificationContext(new NotificationContextBuilder()
+                        .setNotification(new HashMap<>())
+                        .setNotifSubscription(new HashMap<>())
+                        .build())
+                    .build();
+
             ContextBuilder contextBuilder = new ContextBuilder()
                     .setName(Map.of(contextName.key(), contextName))
                     .setUuid(
                         new Uuid(UUID.nameUUIDFromBytes(TAPI_CONTEXT.getBytes(Charset.forName("UTF-8"))).toString()))
                     .setServiceInterfacePoint(new HashMap<>())
                     .addAugmentation(connectivityContext)
-                    .addAugmentation(topologyContext);
+                    .addAugmentation(topologyContext)
+                    .addAugmentation(notificationContext);
 
             // todo: add notification context
             InstanceIdentifier<Context> contextIID = InstanceIdentifier.builder(Context.class).build();
@@ -129,7 +142,7 @@ public class TapiContext {
                 LOG.error("Tapi context is not present in datastore");
                 return null;
             }
-            return optionalContext.get();
+            return optionalContext.orElseThrow();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Couldnt read tapi context from datastore", e);
             return null;
@@ -150,7 +163,7 @@ public class TapiContext {
                     .build();
             InstanceIdentifier<TopologyContext> topologycontextIID =
                     InstanceIdentifier.builder(Context.class).augmentation(org.opendaylight.yang.gen.v1.urn
-                            .onf.otcc.yang.tapi.topology.rev181210.Context1.class)
+                            .onf.otcc.yang.tapi.topology.rev221121.Context1.class)
                             .child(TopologyContext.class)
                             .build();
             // merge in datastore
@@ -182,22 +195,24 @@ public class TapiContext {
                                           Map<ConnectionKey, Connection> connectionFullMap) {
         // TODO: verify this is correct. Should we identify the context IID with the context UUID??
         try {
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContext
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext
                 connectivityContext = new ConnectivityContextBuilder()
                 .setConnectivityService(connServMap)
                 .setConnection(connectionFullMap)
                 .build();
             InstanceIdentifier<org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContext> connectivitycontextIID =
+                .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext> connectivitycontextIID =
                     InstanceIdentifier.builder(Context.class).augmentation(Context1.class)
                         .child(org.opendaylight.yang.gen.v1.urn
-                            .onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContext.class)
+                            .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext.class)
                         .build();
             // merge in datastore
             this.networkTransactionService.merge(LogicalDatastoreType.OPERATIONAL, connectivitycontextIID,
                 connectivityContext);
             this.networkTransactionService.commit().get();
             LOG.info("TAPI connectivity merged successfully.");
+            LOG.debug("TAPI connectivity merged successfully for services {}", connServMap.entrySet().iterator()
+                    .next().getKey().toString());
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Failed to merge TAPI connectivity", e);
         }
@@ -206,10 +221,10 @@ public class TapiContext {
     public void updateTopologyWithCep(Uuid topoUuid, Uuid nodeUuid, Uuid nepUuid, ConnectionEndPoint cep) {
         // TODO: verify this is correct. Should we identify the context IID with the context UUID??
         InstanceIdentifier<OwnedNodeEdgePoint> onepIID = InstanceIdentifier.builder(Context.class)
-            .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.Context1.class)
-            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.context.TopologyContext.class)
+            .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1.class)
+            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.context.TopologyContext.class)
             .child(Topology.class, new TopologyKey(topoUuid))
-            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node.class,
+            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node.class,
                     new NodeKey(nodeUuid))
             .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nepUuid))
             .build();
@@ -217,10 +232,10 @@ public class TapiContext {
             Optional<OwnedNodeEdgePoint> optionalOnep = this.networkTransactionService.read(
                     LogicalDatastoreType.OPERATIONAL, onepIID).get();
             if (!optionalOnep.isPresent()) {
-                LOG.error("ONEP is not present in datastore");
+                LOG.error("ONEP is not present in datastore for topoUuid {}, NodeUuid {}", topoUuid, nodeUuid);
                 return;
             }
-            OwnedNodeEdgePoint onep = optionalOnep.get();
+            OwnedNodeEdgePoint onep = optionalOnep.orElseThrow();
             LOG.info("ONEP found = {}", onep);
             // TODO -> If cep exists -> skip merging to datasore
             OwnedNodeEdgePoint1 onep1 = onep.augmentation(OwnedNodeEdgePoint1.class);
@@ -248,10 +263,10 @@ public class TapiContext {
 
     public Node getTapiNode(Uuid topoUuid, Uuid nodeUuid) {
         InstanceIdentifier<Node> nodeIID = InstanceIdentifier.builder(Context.class)
-            .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.Context1.class)
-            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.context.TopologyContext.class)
+            .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1.class)
+            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.context.TopologyContext.class)
             .child(Topology.class, new TopologyKey(topoUuid))
-            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node.class,
+            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node.class,
                         new NodeKey(nodeUuid)).build();
         try {
             Optional<Node> optNode = this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, nodeIID)
@@ -261,7 +276,7 @@ public class TapiContext {
                 return null;
             }
             // TODO -> Need to remove CEPs from NEPs. If not error from get Topology details output
-            Node node = optNode.get();
+            Node node = optNode.orElseThrow();
             LOG.debug("NEPs of node before creating map to be returned to the getTapiNode function = {}",
                 node.getOwnedNodeEdgePoint().size());
             Map<OwnedNodeEdgePointKey, OwnedNodeEdgePoint> onepMap = new HashMap<>();
@@ -274,13 +289,14 @@ public class TapiContext {
                     .setUuid(onep.getUuid())
                     .setLayerProtocolName(onep.getLayerProtocolName())
                     .setName(onep.getName())
-                    .setSupportedCepLayerProtocolQualifier(onep.getSupportedCepLayerProtocolQualifier())
+                    .setSupportedCepLayerProtocolQualifierInstances(
+                        onep.getSupportedCepLayerProtocolQualifierInstances())
                     .setAdministrativeState(onep.getAdministrativeState())
                     .setOperationalState(onep.getOperationalState())
                     .setLifecycleState(onep.getLifecycleState())
-                    .setTerminationDirection(onep.getTerminationDirection())
-                    .setTerminationState(onep.getTerminationState())
-                    .setLinkPortDirection(onep.getLinkPortDirection())
+//                    .setTerminationDirection(onep.getTerminationDirection())
+//                    .setTerminationState(onep.getTerminationState())
+                    .setDirection(onep.getDirection())
                     .setLinkPortRole(onep.getLinkPortRole());
                 if (onep.getMappedServiceInterfacePoint() != null) {
                     newOnepBuilder.setMappedServiceInterfacePoint(onep.getMappedServiceInterfacePoint());
@@ -301,10 +317,10 @@ public class TapiContext {
 
     public OwnedNodeEdgePoint getTapiNEP(Uuid topoUuid, Uuid nodeUuid, Uuid nepUuid) {
         InstanceIdentifier<OwnedNodeEdgePoint> nepIID = InstanceIdentifier.builder(Context.class)
-            .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.Context1.class)
-            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.context.TopologyContext.class)
+            .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1.class)
+            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.context.TopologyContext.class)
             .child(Topology.class, new TopologyKey(topoUuid))
-            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node.class,
+            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node.class,
                 new NodeKey(nodeUuid)).child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nepUuid)).build();
         try {
             Optional<OwnedNodeEdgePoint> optNode = this.networkTransactionService
@@ -314,7 +330,7 @@ public class TapiContext {
                 LOG.error(NODE_NOT_PRESENT);
                 return null;
             }
-            return optNode.get();
+            return optNode.orElseThrow();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Couldnt read NEP in topology", e);
             return null;
@@ -323,8 +339,8 @@ public class TapiContext {
 
     public Link getTapiLink(Uuid topoUuid, Uuid linkUuid) {
         InstanceIdentifier<Link> linkIID = InstanceIdentifier.builder(Context.class)
-            .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.Context1.class)
-            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.context.TopologyContext.class)
+            .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1.class)
+            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.context.TopologyContext.class)
             .child(Topology.class, new TopologyKey(topoUuid))
             .child(Link.class, new LinkKey(linkUuid)).build();
         try {
@@ -334,7 +350,7 @@ public class TapiContext {
                 LOG.error(NODE_NOT_PRESENT);
                 return null;
             }
-            return optLink.get();
+            return optLink.orElseThrow();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Couldnt read link in topology", e);
             return null;
@@ -344,7 +360,7 @@ public class TapiContext {
     public Map<TopologyKey, Topology> getTopologyContext() {
         InstanceIdentifier<TopologyContext> topologycontextIID =
                 InstanceIdentifier.builder(Context.class).augmentation(org.opendaylight.yang.gen.v1.urn
-                        .onf.otcc.yang.tapi.topology.rev181210.Context1.class)
+                        .onf.otcc.yang.tapi.topology.rev221121.Context1.class)
                         .child(TopologyContext.class)
                         .build();
         try {
@@ -354,7 +370,7 @@ public class TapiContext {
                 LOG.error("Topology context is not present in datastore");
                 return null;
             }
-            return optTopoContext.get().getTopology();
+            return optTopoContext.orElseThrow().getTopology();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Couldnt read topology context", e);
             return null;
@@ -367,7 +383,7 @@ public class TapiContext {
             InstanceIdentifier<ConnectivityService> connectivityServIID =
                 InstanceIdentifier.builder(Context.class).augmentation(Context1.class)
                     .child(org.opendaylight.yang.gen.v1.urn
-                        .onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContext.class)
+                        .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext.class)
                     .child(ConnectivityService.class, new ConnectivityServiceKey(serviceUuid))
                     .build();
 
@@ -377,7 +393,7 @@ public class TapiContext {
                 LOG.error("Connectivity service not found in tapi context");
                 return null;
             }
-            return optConnServ.get();
+            return optConnServ.orElseThrow();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Connectivity service not found in tapi context. Error:", e);
             return null;
@@ -385,20 +401,21 @@ public class TapiContext {
     }
 
     public void deleteConnectivityService(Uuid serviceUuid) {
+        // TODO: handle case where the infrastructure service is removed before the top level service?
         ConnectivityService connectivityService = getConnectivityService(serviceUuid);
         if (connectivityService == null) {
             LOG.error("Service doesnt exist in tapi context");
             return;
         }
         for (org.opendaylight.yang.gen.v1
-                .urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.Connection connection:
+                .urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.Connection connection:
                     connectivityService.getConnection().values()) {
-            deleteConnection(connection.getConnectionUuid());
+            deleteConnection(connection.getConnectionUuid(), serviceUuid, connectivityService.getLayerProtocolName());
         }
         InstanceIdentifier<ConnectivityService> connectivityServIID =
                 InstanceIdentifier.builder(Context.class).augmentation(Context1.class)
                         .child(org.opendaylight.yang.gen.v1.urn
-                                .onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContext.class)
+                                .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext.class)
                         .child(ConnectivityService.class, new ConnectivityServiceKey(serviceUuid))
                         .build();
         try {
@@ -410,19 +427,60 @@ public class TapiContext {
         }
     }
 
-    private void deleteConnection(Uuid connectionUuid) {
+    private void deleteConnection(Uuid connectionUuid, Uuid serviceUuid, LayerProtocolName serviceLayer) {
         // First read connectivity service with service uuid and update info
         InstanceIdentifier<org.opendaylight.yang.gen.v1
-            .urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection> connectionIID =
+            .urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.Connection> connectionIID =
             InstanceIdentifier.builder(Context.class).augmentation(Context1.class)
                 .child(org.opendaylight.yang.gen.v1.urn
-                    .onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContext.class)
+                    .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext.class)
                 .child(org.opendaylight.yang.gen.v1.urn
-                        .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection.class,
+                        .onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.Connection.class,
                     new org.opendaylight.yang.gen.v1.urn
-                        .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectionKey(
-                            connectionUuid))
+                        .onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectionKey(
+                        connectionUuid))
                 .build();
+        Connection connection = getConnection(connectionUuid);
+        if (connection != null && isNotUsedByOtherService(connection, serviceUuid)) {
+            Map<LowerConnectionKey, LowerConnection> lowerConnectionMap = connection.getLowerConnection();
+            if (lowerConnectionMap != null) {
+                for (LowerConnection lowerConnection:lowerConnectionMap.values()) {
+                    // check layer of connection, for DSR service we only need to delete DSR layer
+                    // connection and XC at ODU. For ODU, only need to delete ODU connections and for
+                    // photonic media services all the photonic media. And when it is ETH we need to delete
+                    // everything and also without checking the lower connection layer
+                    Connection conn1 = getConnection(lowerConnection.getConnectionUuid());
+                    if (conn1 == null) {
+                        // connection not found in tapi context
+                        continue;
+                    }
+                    LayerProtocolName lowerConnLayer = conn1.getLayerProtocolName();
+                    switch (serviceLayer.getIntValue()) {
+                        case 0:
+                        case 3:
+                            // PHOTONIC & ODU
+                            if (lowerConnLayer.equals(serviceLayer)) {
+                                deleteConnection(lowerConnection.getConnectionUuid(), serviceUuid, serviceLayer);
+                            }
+                            break;
+                        case 1:
+                            // ETH
+                            deleteConnection(lowerConnection.getConnectionUuid(), serviceUuid, serviceLayer);
+                            break;
+                        case 2:
+                            // DSR
+                            if (lowerConnLayer.equals(serviceLayer) || (lowerConnLayer.equals(LayerProtocolName.ODU)
+                                    && conn1.getName().values().stream().anyMatch(
+                                            name -> name.getValue().contains("XC")))) {
+                                deleteConnection(lowerConnection.getConnectionUuid(), serviceUuid, serviceLayer);
+                            }
+                            break;
+                        default:
+                            LOG.info("Unknown service Layer: {}", serviceLayer.getName());
+                    }
+                }
+            }
+        }
         try {
             this.networkTransactionService.delete(LogicalDatastoreType.OPERATIONAL, connectionIID);
             this.networkTransactionService.commit().get();
@@ -431,13 +489,53 @@ public class TapiContext {
         }
     }
 
+    private boolean isNotUsedByOtherService(Connection connection, Uuid serviceUuid) {
+        Map<ConnectivityServiceKey, ConnectivityService> connServicesMap = getConnectivityServices();
+        if (connServicesMap == null) {
+            LOG.info("isNotUsedByOtherService: No service in tapi context!");
+            return true;
+        }
+        for (ConnectivityService connService: connServicesMap.values()) {
+            if (connService.getConnection() == null || connService.getUuid().equals(serviceUuid)) {
+                LOG.info("isNotUsedByOtherService: There are no connections in service {} or service in loop is the "
+                        + "service to be deleted", connService.getUuid().getValue());
+                continue;
+            }
+            if (connService.getConnection().containsKey(
+                    new org.opendaylight.yang.gen.v1
+                        .urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.ConnectionKey(
+                            connection.getUuid()))) {
+                LOG.info("isNotUsedByOtherService: Connection {} is in used by service {}. Cannot remove it from "
+                        + "context", connection.getUuid().getValue(), connService.getUuid().getValue());
+                return false;
+            }
+            LOG.info("isNotUsedByOtherService: Going to check lower connections");
+            for (org.opendaylight.yang.gen.v1.urn
+                        .onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.Connection
+                    conn:connService.getConnection().values()) {
+                Connection connection1 = getConnection(conn.getConnectionUuid());
+                if (connection1 == null || connection1.getLowerConnection() == null) {
+                    continue;
+                }
+                if (connection1.getLowerConnection().containsKey(new LowerConnectionKey(connection.getUuid()))) {
+                    LOG.info("isNotUsedByOtherService: Lower Connection {} is in used by service {}. Cannot remove it "
+                            + "from context", connection.getUuid().getValue(), connService.getUuid().getValue());
+                    return false;
+                }
+            }
+        }
+        LOG.info("isNotUsedByOtherService: No other service uses connection {}, therefore it can be safely deleted",
+                connection.getUuid());
+        return true;
+    }
+
     public Connection getConnection(Uuid connectionUuid) {
         try {
             // First read connectivity service with service uuid and update info
             InstanceIdentifier<Connection> connIID =
                 InstanceIdentifier.builder(Context.class).augmentation(Context1.class)
                     .child(org.opendaylight.yang.gen.v1.urn
-                        .onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContext.class)
+                        .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext.class)
                     .child(Connection.class, new ConnectionKey(connectionUuid))
                     .build();
 
@@ -447,7 +545,7 @@ public class TapiContext {
                 LOG.error("Connection not found in tapi context");
                 return null;
             }
-            return optConn.get();
+            return optConn.orElseThrow();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Connection not found in tapi context. Error:", e);
             return null;
@@ -458,21 +556,21 @@ public class TapiContext {
         try {
             // First read connectivity service with service uuid and update info
             InstanceIdentifier<org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContext> connectivityContextIID =
+                .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext> connectivityContextIID =
                 InstanceIdentifier.builder(Context.class).augmentation(Context1.class)
                     .child(org.opendaylight.yang.gen.v1.urn
-                        .onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContext.class)
+                        .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext.class)
                     .build();
 
             Optional<org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.context.ConnectivityContext> optConnContext =
+                .onf.otcc.yang.tapi.connectivity.rev221121.context.ConnectivityContext> optConnContext =
                     this.networkTransactionService.read(LogicalDatastoreType.OPERATIONAL, connectivityContextIID)
                         .get();
             if (!optConnContext.isPresent()) {
                 LOG.error("Connectivity context not found in tapi context");
                 return null;
             }
-            return optConnContext.get().getConnectivityService();
+            return optConnContext.orElseThrow().getConnectivityService();
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Connectivity context not found in tapi context. Error:", e);
             return null;
@@ -481,23 +579,23 @@ public class TapiContext {
 
     public ConnectionEndPoint getTapiCEP(Uuid topoUuid, Uuid nodeUuid, Uuid nepUuid, Uuid cepUuid) {
         InstanceIdentifier<OwnedNodeEdgePoint> nepIID = InstanceIdentifier.builder(Context.class)
-            .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.Context1.class)
-            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.context.TopologyContext.class)
+            .augmentation(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1.class)
+            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.context.TopologyContext.class)
             .child(Topology.class, new TopologyKey(topoUuid))
-            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node.class,
+            .child(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node.class,
                 new NodeKey(nodeUuid)).child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nepUuid)).build();
         try {
             Optional<OwnedNodeEdgePoint> optNode = this.networkTransactionService
                 .read(LogicalDatastoreType.OPERATIONAL, nepIID).get();
-            if (!optNode.isPresent()) {
+            if (optNode.isEmpty()) {
                 LOG.error(NODE_NOT_PRESENT);
                 return null;
             }
-            if (optNode.get().augmentation(OwnedNodeEdgePoint1.class) == null) {
+            if (optNode.orElseThrow().augmentation(OwnedNodeEdgePoint1.class) == null) {
                 LOG.error("Node doesnt have ceps");
                 return null;
             }
-            return optNode.get().augmentation(OwnedNodeEdgePoint1.class).getCepList().getConnectionEndPoint()
+            return optNode.orElseThrow().augmentation(OwnedNodeEdgePoint1.class).getCepList().getConnectionEndPoint()
                 .get(new ConnectionEndPointKey(cepUuid));
         } catch (InterruptedException | ExecutionException e) {
             LOG.error("Couldnt read node in topology", e);
index 0324ac995875246bf2905ab1fec80d409f6e9c0e..ab23e7c4e60eba762bfdcd5e6a8293a70ccfd306 100644 (file)
@@ -16,16 +16,16 @@ import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOper
 import org.opendaylight.transportpce.tapi.connectivity.ConnectivityUtils;
 import org.opendaylight.transportpce.tapi.topology.TapiTopologyException;
 import org.opendaylight.transportpce.tapi.topology.TopologyUtils;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.Service;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceList;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.Services;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.list.ServicesKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.tapi.context.ServiceInterfacePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityService;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityServiceKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.Topology;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.TopologyKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.Service;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceList;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.Services;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.list.ServicesKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.tapi.context.ServiceInterfacePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyKey;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -67,7 +67,7 @@ public class TapiInitialORMapping {
             LOG.error("Couldnt obtain OR services from datastore");
             return;
         }
-        ServiceList orServices = optOrServices.get();
+        ServiceList orServices = optOrServices.orElseThrow();
         if (orServices.getServices() == null) {
             LOG.info("No services in datastore. No mapping needed");
             return;
index 79aa7ff7a4c0066e060974e5da541bbeddd41cb8..150af47bdb0fee5af10b33cae684f33c4e182d2b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright © 2021 Nokia.  All rights reserved.
+ * Copyright © 2023 Orange, Inc. and others.  All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  */
 package org.opendaylight.transportpce.tapi.utils;
 
-import java.nio.charset.Charset;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.UUID;
-import java.util.concurrent.ExecutionException;
-import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
-import org.opendaylight.transportpce.common.network.NetworkTransactionService;
-import org.opendaylight.transportpce.tapi.TapiStringConstants;
+import java.util.Set;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.AdministrativeState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.CapacityUnit;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Context;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.ForwardingDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LifecycleState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.OperationalState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.TotalSizeBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.pac.AvailableCapacityBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.pac.TotalPotentialCapacityBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.Context1;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.ProtectionType;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.RestorationPolicy;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.context.TopologyContext;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.link.NodeEdgePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.link.NodeEdgePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.link.NodeEdgePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.link.ResilienceTypeBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.risk.parameter.pac.RiskCharacteristic;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.risk.parameter.pac.RiskCharacteristicBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.LinkBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.Topology;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.context.TopologyKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.transfer.cost.pac.CostCharacteristic;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.transfer.cost.pac.CostCharacteristicBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.transfer.timing.pac.LatencyCharacteristic;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.transfer.timing.pac.LatencyCharacteristicBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.validation.pac.ValidationMechanism;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.validation.pac.ValidationMechanismBuilder;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.common.Uint64;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
 
-public class TapiLink {
+public interface TapiLink {
 
-    private static final Logger LOG = LoggerFactory.getLogger(TapiLink.class);
-    private final NetworkTransactionService networkTransactionService;
+    Link createTapiLink(String srcNodeid, String srcTpId, String dstNodeId, String dstTpId, String linkType,
+            String srcNodeQual, String dstNodeQual, String srcTpQual, String dstTpQual,
+            String adminState, String operState, Set<LayerProtocolName> layerProtoNameList,
+            Set<String> transLayerNameList, Uuid tapiTopoUuid);
 
-    public TapiLink(NetworkTransactionService networkTransactionService) {
-        this.networkTransactionService = networkTransactionService;
-    }
+    AdministrativeState setTapiAdminState(String adminState);
 
-    public Link createTapiLink(String srcNodeid, String srcTpId, String dstNodeId, String dstTpId, String linkType,
-                               String srcNodeQual, String dstNodeQual, String srcTpQual, String dstTpQual,
-                               String adminState, String operState, List<LayerProtocolName> layerProtoNameList,
-                               List<String> transLayerNameList, Uuid tapiTopoUuid) {
-        Map<NodeEdgePointKey, NodeEdgePoint> nepList = new HashMap<>();
-        String sourceNodeKey = String.join("+", srcNodeid, srcNodeQual);
-        String sourceNepKey = String.join("+", srcNodeid, srcTpQual, srcTpId);
-        Uuid sourceUuidNode = new Uuid(UUID.nameUUIDFromBytes(sourceNodeKey.getBytes(Charset.forName("UTF-8")))
-            .toString());
-        Uuid sourceUuidTp = new Uuid(UUID.nameUUIDFromBytes(sourceNepKey.getBytes(Charset.forName("UTF-8")))
-            .toString());
-        String destNodeKey = String.join("+", dstNodeId, dstNodeQual);
-        String destNepKey = String.join("+", dstNodeId, dstTpQual, dstTpId);
-        String linkKey = String.join("to", sourceNepKey, destNepKey);
-        Uuid destUuidNode = new Uuid(UUID.nameUUIDFromBytes(destNodeKey.getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid destUuidTp = new Uuid(UUID.nameUUIDFromBytes(destNepKey.getBytes(Charset.forName("UTF-8"))).toString());
-        NodeEdgePoint sourceNep = new NodeEdgePointBuilder()
-            .setTopologyUuid(tapiTopoUuid)
-            .setNodeUuid(sourceUuidNode)
-            .setNodeEdgePointUuid(sourceUuidTp)
-            .build();
-        nepList.put(sourceNep.key(), sourceNep);
-        NodeEdgePoint destNep = new NodeEdgePointBuilder()
-            .setTopologyUuid(tapiTopoUuid)
-            .setNodeUuid(destUuidNode)
-            .setNodeEdgePointUuid(destUuidTp)
-            .build();
-        nepList.put(destNep.key(), destNep);
-        NameBuilder linkName = new NameBuilder();
-        // TODO: variables for each type
-        switch (linkType) {
-            case TapiStringConstants.OMS_RDM_RDM_LINK:
-                LOG.info("Roadm to roadm link");
-                linkName
-                    .setValueName("OMS link name")
-                    .setValue(linkKey);
-                break;
-            case TapiStringConstants.TRANSITIONAL_LINK:
-                LOG.info("Transitional link");
-                linkName
-                    .setValueName("transitional link name")
-                    .setValue(linkKey);
-                break;
-            case TapiStringConstants.OMS_XPDR_RDM_LINK:
-                LOG.info("Xpdr to roadm link");
-                linkName
-                    .setValueName("XPDR-RDM link name")
-                    .setValue(linkKey);
-                break;
-            case TapiStringConstants.OTN_XPDR_XPDR_LINK:
-                LOG.info("OTN Xpdr to roadm link");
-                linkName
-                    .setValueName("otn link name")
-                    .setValue(linkKey);
-                break;
-            default:
-                LOG.warn("Type {} not recognized", linkType);
-                return null;
-        }
-        // Todo: common aspects of links and set all attributes
-        CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
-            .setCostAlgorithm("Restricted Shortest Path - RSP")
-            .setCostName("HOP_COUNT")
-            .setCostValue("12345678")
-            .build();
-        LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
-            .setFixedLatencyCharacteristic("12345678")
-            .setQueingLatencyCharacteristic("12345678")
-            .setJitterCharacteristic("12345678")
-            .setWanderCharacteristic("12345678")
-            .setTrafficPropertyName("FIXED_LATENCY")
-            .build();
-        RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
-            .setRiskCharacteristicName("risk characteristic")
-            .setRiskIdentifierList(List.of("risk identifier1", "risk identifier2"))
-            .build();
-        ValidationMechanism validationMechanism = new ValidationMechanismBuilder()
-            .setValidationMechanism("validation mechanism")
-            .setValidationRobustness("validation robustness")
-            .setLayerProtocolAdjacencyValidated("layer protocol adjacency")
-            .build();
-        return new LinkBuilder()
-            .setUuid(new Uuid(
-                UUID.nameUUIDFromBytes(linkKey.getBytes(Charset.forName("UTF-8"))).toString()))
-            .setName(Map.of(linkName.build().key(), linkName.build()))
-            .setTransitionedLayerProtocolName(transLayerNameList)
-            .setLayerProtocolName(layerProtoNameList)
-            .setNodeEdgePoint(nepList)
-            .setDirection(ForwardingDirection.BIDIRECTIONAL)
-            .setAvailableCapacity(new AvailableCapacityBuilder().setTotalSize(
-                    new TotalSizeBuilder().setUnit(CapacityUnit.GBPS).setValue(Uint64.valueOf(100)).build())
-                .build())
-            .setResilienceType(new ResilienceTypeBuilder().setProtectionType(ProtectionType.NOPROTECTON)
-                .setRestorationPolicy(RestorationPolicy.NA)
-                .build())
-            .setAdministrativeState(setTapiAdminState(adminState))
-            .setOperationalState(setTapiOperationalState(operState))
-            .setLifecycleState(LifecycleState.INSTALLED)
-            .setTotalPotentialCapacity(new TotalPotentialCapacityBuilder().setTotalSize(
-                    new TotalSizeBuilder().setUnit(CapacityUnit.GBPS).setValue(Uint64.valueOf(100)).build())
-                .build())
-            .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
-            .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
-            .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
-            .setErrorCharacteristic("error")
-            .setLossCharacteristic("loss")
-            .setRepeatDeliveryCharacteristic("repeat delivery")
-            .setDeliveryOrderCharacteristic("delivery order")
-            .setUnavailableTimeCharacteristic("unavailable time")
-            .setServerIntegrityProcessCharacteristic("server integrity process")
-            .setValidationMechanism(Map.of(validationMechanism.key(), validationMechanism))
-            .build();
-    }
+    AdministrativeState setTapiAdminState(AdminStates adminState1, AdminStates adminState2);
 
-    public AdministrativeState setTapiAdminState(String adminState) {
-        if (adminState == null) {
-            return null;
-        }
-        return adminState.equals(AdminStates.InService.getName())
-            || adminState.equals(AdministrativeState.UNLOCKED.getName()) ? AdministrativeState.UNLOCKED
-                : AdministrativeState.LOCKED;
-    }
+    OperationalState setTapiOperationalState(String operState);
 
-    public AdministrativeState setTapiAdminState(AdminStates adminState1, AdminStates adminState2) {
-        if (adminState1 == null || adminState2 == null) {
-            return null;
-        }
-        LOG.info("Admin state 1 = {}, andmin state 2 = {}", adminState1.getName(), adminState2.getName());
-        return AdminStates.InService.equals(adminState1) && AdminStates.InService.equals(adminState2)
-            ? AdministrativeState.UNLOCKED : AdministrativeState.LOCKED;
-    }
+    OperationalState setTapiOperationalState(State operState1, State operState2);
 
-    public OperationalState setTapiOperationalState(String operState) {
-        if (operState == null) {
-            return null;
-        }
-        return operState.equals("inService") || operState.equals(OperationalState.ENABLED.getName())
-            ? OperationalState.ENABLED : OperationalState.DISABLED;
-    }
+    String getOperState(String srcNodeId, String destNodeId, String sourceTpId, String destTpId);
 
-    public OperationalState setTapiOperationalState(State operState1, State operState2) {
-        if (operState1 == null || operState2 == null) {
-            return null;
-        }
-        return State.InService.equals(operState1) && State.InService.equals(operState2)
-            ? OperationalState.ENABLED : OperationalState.DISABLED;
-    }
-
-    public String getOperState(String srcNodeId, String destNodeId, String sourceTpId, String destTpId) {
-        Uuid tapiTopoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", srcNodeId,
-            TapiStringConstants.PHTNC_MEDIA).getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", srcNodeId,
-            TapiStringConstants.PHTNC_MEDIA, sourceTpId).getBytes(Charset.forName("UTF-8"))).toString());
-        InstanceIdentifier<OwnedNodeEdgePoint> onepIID = InstanceIdentifier.builder(Context.class)
-            .augmentation(Context1.class).child(TopologyContext.class)
-            .child(Topology.class, new TopologyKey(tapiTopoUuid)).child(Node.class, new NodeKey(nodeUuid))
-            .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nepUuid))
-            .build();
-        Uuid node1Uuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", destNodeId,
-            TapiStringConstants.PHTNC_MEDIA).getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid nep1Uuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", destNodeId,
-            TapiStringConstants.PHTNC_MEDIA, destTpId).getBytes(Charset.forName("UTF-8"))).toString());
-        InstanceIdentifier<OwnedNodeEdgePoint> onep1IID = InstanceIdentifier.builder(Context.class)
-            .augmentation(Context1.class).child(TopologyContext.class)
-            .child(Topology.class, new TopologyKey(tapiTopoUuid)).child(Node.class, new NodeKey(node1Uuid))
-            .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nep1Uuid))
-            .build();
-        try {
-            Optional<OwnedNodeEdgePoint> optionalOnep = this.networkTransactionService.read(
-                LogicalDatastoreType.OPERATIONAL, onepIID).get();
-            Optional<OwnedNodeEdgePoint> optionalOnep1 = this.networkTransactionService.read(
-                LogicalDatastoreType.OPERATIONAL, onep1IID).get();
-            if (!optionalOnep.isPresent() || !optionalOnep1.isPresent()) {
-                LOG.error("One of the 2 neps doesnt exist in the datastore: {} OR {}", nepUuid, nep1Uuid);
-                return null;
-            }
-            return optionalOnep.get().getOperationalState().equals(optionalOnep1.get().getOperationalState())
-                ? optionalOnep.get().getOperationalState().getName() : OperationalState.DISABLED.getName();
-        } catch (InterruptedException | ExecutionException e) {
-            LOG.error("Failed getting Mapping data from portMapping",e);
-            return null;
-        }
-    }
-
-    public String getAdminState(String srcNodeId, String destNodeId, String sourceTpId, String destTpId) {
-        Uuid tapiTopoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", srcNodeId,
-            TapiStringConstants.PHTNC_MEDIA).getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", srcNodeId,
-            TapiStringConstants.PHTNC_MEDIA, sourceTpId).getBytes(Charset.forName("UTF-8"))).toString());
-        InstanceIdentifier<OwnedNodeEdgePoint> onepIID = InstanceIdentifier.builder(Context.class)
-            .augmentation(Context1.class).child(TopologyContext.class)
-            .child(Topology.class, new TopologyKey(tapiTopoUuid)).child(Node.class, new NodeKey(nodeUuid))
-            .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nepUuid))
-            .build();
-        Uuid node1Uuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", destNodeId,
-            TapiStringConstants.PHTNC_MEDIA).getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid nep1Uuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", destNodeId,
-            TapiStringConstants.PHTNC_MEDIA, destTpId).getBytes(Charset.forName("UTF-8"))).toString());
-        InstanceIdentifier<OwnedNodeEdgePoint> onep1IID = InstanceIdentifier.builder(Context.class)
-            .augmentation(Context1.class).child(TopologyContext.class)
-            .child(Topology.class, new TopologyKey(tapiTopoUuid)).child(Node.class, new NodeKey(node1Uuid))
-            .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nep1Uuid))
-            .build();
-        try {
-            Optional<OwnedNodeEdgePoint> optionalOnep = this.networkTransactionService.read(
-                LogicalDatastoreType.OPERATIONAL, onepIID).get();
-            Optional<OwnedNodeEdgePoint> optionalOnep1 = this.networkTransactionService.read(
-                LogicalDatastoreType.OPERATIONAL, onep1IID).get();
-            if (!optionalOnep.isPresent() || !optionalOnep1.isPresent()) {
-                LOG.error("One of the 2 neps doesnt exist in the datastore: {} OR {}", nepUuid, nep1Uuid);
-                return null;
-            }
-            return optionalOnep.get().getAdministrativeState().equals(optionalOnep1.get().getAdministrativeState())
-                ? optionalOnep.get().getAdministrativeState().getName() : AdministrativeState.UNLOCKED.getName();
-        } catch (InterruptedException | ExecutionException e) {
-            LOG.error("Failed getting Mapping data from portMapping",e);
-            return null;
-        }
-    }
+    String getAdminState(String srcNodeId, String destNodeId, String sourceTpId, String destTpId);
 }
diff --git a/tapi/src/main/java/org/opendaylight/transportpce/tapi/utils/TapiLinkImpl.java b/tapi/src/main/java/org/opendaylight/transportpce/tapi/utils/TapiLinkImpl.java
new file mode 100644 (file)
index 0000000..25d0e64
--- /dev/null
@@ -0,0 +1,309 @@
+/*
+ * Copyright © 2021 Nokia.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.transportpce.tapi.utils;
+
+import java.nio.charset.Charset;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.ExecutionException;
+import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.transportpce.common.network.NetworkTransactionService;
+import org.opendaylight.transportpce.tapi.TapiStringConstants;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.CAPACITYUNITGBPS;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Context;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.ForwardingDirection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.capacity.TotalSizeBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.capacity.pac.AvailableCapacityBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.capacity.pac.TotalPotentialCapacityBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Context1;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.ProtectionType;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.RestorationPolicy;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.context.TopologyContext;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.link.NodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.link.NodeEdgePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.link.NodeEdgePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.link.ResilienceTypeBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristic;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.risk.parameter.pac.RiskCharacteristicBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.Topology;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.context.TopologyKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristic;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.cost.pac.CostCharacteristicBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristic;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.transfer.timing.pac.LatencyCharacteristicBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.validation.pac.ValidationMechanism;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.validation.pac.ValidationMechanismBuilder;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Decimal64;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Reference;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@Component
+public class TapiLinkImpl implements TapiLink {
+
+    private static final Logger LOG = LoggerFactory.getLogger(TapiLinkImpl.class);
+    private final NetworkTransactionService networkTransactionService;
+
+    @Activate
+    public TapiLinkImpl(@Reference NetworkTransactionService networkTransactionService) {
+        this.networkTransactionService = networkTransactionService;
+    }
+
+    public Link createTapiLink(String srcNodeid, String srcTpId, String dstNodeId, String dstTpId, String linkType,
+                               String srcNodeQual, String dstNodeQual, String srcTpQual, String dstTpQual,
+                               String adminState, String operState, Set<LayerProtocolName> layerProtoNameList,
+                               Set<String> transLayerNameList, Uuid tapiTopoUuid) {
+        Map<NodeEdgePointKey, NodeEdgePoint> nepList = new HashMap<>();
+        String sourceNodeKey = String.join("+", srcNodeid, srcNodeQual);
+        String sourceNepKey = String.join("+", srcNodeid, srcTpQual, srcTpId);
+        Uuid sourceUuidNode = new Uuid(UUID.nameUUIDFromBytes(sourceNodeKey.getBytes(Charset.forName("UTF-8")))
+            .toString());
+        Uuid sourceUuidTp = new Uuid(UUID.nameUUIDFromBytes(sourceNepKey.getBytes(Charset.forName("UTF-8")))
+            .toString());
+        String destNodeKey = String.join("+", dstNodeId, dstNodeQual);
+        String destNepKey = String.join("+", dstNodeId, dstTpQual, dstTpId);
+        String linkKey = String.join("to", sourceNepKey, destNepKey);
+        Uuid destUuidNode = new Uuid(UUID.nameUUIDFromBytes(destNodeKey.getBytes(Charset.forName("UTF-8"))).toString());
+        Uuid destUuidTp = new Uuid(UUID.nameUUIDFromBytes(destNepKey.getBytes(Charset.forName("UTF-8"))).toString());
+        NodeEdgePoint sourceNep = new NodeEdgePointBuilder()
+            .setTopologyUuid(tapiTopoUuid)
+            .setNodeUuid(sourceUuidNode)
+            .setNodeEdgePointUuid(sourceUuidTp)
+            .build();
+        nepList.put(sourceNep.key(), sourceNep);
+        NodeEdgePoint destNep = new NodeEdgePointBuilder()
+            .setTopologyUuid(tapiTopoUuid)
+            .setNodeUuid(destUuidNode)
+            .setNodeEdgePointUuid(destUuidTp)
+            .build();
+        nepList.put(destNep.key(), destNep);
+        NameBuilder linkName = new NameBuilder();
+        // TODO: variables for each type
+        switch (linkType) {
+            case TapiStringConstants.OMS_RDM_RDM_LINK:
+                LOG.info("Roadm to roadm link");
+                linkName
+                    .setValueName(TapiStringConstants.VALUE_NAME_OMS_RDM_RDM_LINK)
+                    .setValue(linkKey);
+                break;
+            case TapiStringConstants.TRANSITIONAL_LINK:
+                LOG.info("Transitional link");
+                linkName
+                    .setValueName("transitional link name")
+                    .setValue(linkKey);
+                break;
+            case TapiStringConstants.OMS_XPDR_RDM_LINK:
+                LOG.info(TapiStringConstants.VALUE_NAME_OTS_XPDR_RDM_LINK);
+                linkName
+                    .setValueName("XPDR-RDM link name")
+                    .setValue(linkKey);
+                break;
+            case TapiStringConstants.OTN_XPDR_XPDR_LINK:
+                LOG.info("OTN Xpdr to roadm link");
+                linkName
+                    .setValueName(TapiStringConstants.VALUE_NAME_OTN_XPDR_XPDR_LINK)
+                    .setValue(linkKey);
+                break;
+            default:
+                LOG.warn("Type {} not recognized", linkType);
+                return null;
+        }
+        // Todo: common aspects of links and set all attributes
+        CostCharacteristic costCharacteristic = new CostCharacteristicBuilder()
+            .setCostAlgorithm("Restricted Shortest Path - RSP")
+            .setCostName("HOP_COUNT")
+            .setCostValue(TapiStringConstants.COST_HOP_VALUE)
+            .build();
+        LatencyCharacteristic latencyCharacteristic = new LatencyCharacteristicBuilder()
+            .setFixedLatencyCharacteristic(TapiStringConstants.FIXED_LATENCY_VALUE)
+            .setQueuingLatencyCharacteristic(TapiStringConstants.QUEING_LATENCY_VALUE)
+            .setJitterCharacteristic(TapiStringConstants.JITTER_VALUE)
+            .setWanderCharacteristic(TapiStringConstants.WANDER_VALUE)
+            .setTrafficPropertyName("FIXED_LATENCY")
+            .build();
+        RiskCharacteristic riskCharacteristic = new RiskCharacteristicBuilder()
+            .setRiskCharacteristicName("risk characteristic")
+            .setRiskIdentifierList(Set.of("risk identifier1", "risk identifier2"))
+            .build();
+        ValidationMechanism validationMechanism = new ValidationMechanismBuilder()
+            .setValidationMechanism("validation mechanism")
+            .setValidationRobustness("validation robustness")
+            .setLayerProtocolAdjacencyValidated("layer protocol adjacency")
+            .build();
+        return new LinkBuilder()
+            .setUuid(new Uuid(
+                UUID.nameUUIDFromBytes(linkKey.getBytes(Charset.forName("UTF-8"))).toString()))
+            .setName(Map.of(linkName.build().key(), linkName.build()))
+            .setTransitionedLayerProtocolName(transLayerNameList)
+            .setLayerProtocolName(layerProtoNameList)
+            .setNodeEdgePoint(nepList)
+            .setDirection(ForwardingDirection.BIDIRECTIONAL)
+            .setAvailableCapacity(new AvailableCapacityBuilder().setTotalSize(
+                    new TotalSizeBuilder().setUnit(CAPACITYUNITGBPS.VALUE).setValue(Decimal64.valueOf("100")).build())
+                .build())
+            .setResilienceType(new ResilienceTypeBuilder().setProtectionType(ProtectionType.NOPROTECTION)
+                .setRestorationPolicy(RestorationPolicy.NA)
+                .build())
+            .setAdministrativeState(setTapiAdminState(adminState))
+            .setOperationalState(setTapiOperationalState(operState))
+            .setLifecycleState(LifecycleState.INSTALLED)
+            .setTotalPotentialCapacity(new TotalPotentialCapacityBuilder().setTotalSize(
+                    new TotalSizeBuilder().setUnit(CAPACITYUNITGBPS.VALUE).setValue(Decimal64.valueOf("100")).build())
+                .build())
+            .setCostCharacteristic(Map.of(costCharacteristic.key(), costCharacteristic))
+            .setLatencyCharacteristic(Map.of(latencyCharacteristic.key(), latencyCharacteristic))
+            .setRiskCharacteristic(Map.of(riskCharacteristic.key(), riskCharacteristic))
+            .setErrorCharacteristic("error")
+            .setLossCharacteristic("loss")
+            .setRepeatDeliveryCharacteristic("repeat delivery")
+            .setDeliveryOrderCharacteristic("delivery order")
+            .setUnavailableTimeCharacteristic("unavailable time")
+            .setServerIntegrityProcessCharacteristic("server integrity process")
+            .setValidationMechanism(Map.of(validationMechanism.key(), validationMechanism))
+            .build();
+    }
+
+    @Override
+    public AdministrativeState setTapiAdminState(String adminState) {
+        if (adminState == null) {
+            return null;
+        }
+        return adminState.equals(AdminStates.InService.getName())
+            || adminState.equals(AdministrativeState.UNLOCKED.getName()) ? AdministrativeState.UNLOCKED
+                : AdministrativeState.LOCKED;
+    }
+
+    @Override
+    public AdministrativeState setTapiAdminState(AdminStates adminState1, AdminStates adminState2) {
+        if (adminState1 == null || adminState2 == null) {
+            return null;
+        }
+        LOG.info("Admin state 1 = {}, andmin state 2 = {}", adminState1.getName(), adminState2.getName());
+        return AdminStates.InService.equals(adminState1) && AdminStates.InService.equals(adminState2)
+            ? AdministrativeState.UNLOCKED : AdministrativeState.LOCKED;
+    }
+
+    @Override
+    public OperationalState setTapiOperationalState(String operState) {
+        if (operState == null) {
+            return null;
+        }
+        return operState.equals("inService") || operState.equals(OperationalState.ENABLED.getName())
+            ? OperationalState.ENABLED : OperationalState.DISABLED;
+    }
+
+    @Override
+    public OperationalState setTapiOperationalState(State operState1, State operState2) {
+        if (operState1 == null || operState2 == null) {
+            return null;
+        }
+        return State.InService.equals(operState1) && State.InService.equals(operState2)
+            ? OperationalState.ENABLED : OperationalState.DISABLED;
+    }
+
+    @Override
+    public String getOperState(String srcNodeId, String destNodeId, String sourceTpId, String destTpId) {
+        Uuid tapiTopoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
+            .getBytes(Charset.forName("UTF-8"))).toString());
+        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", srcNodeId,
+            TapiStringConstants.PHTNC_MEDIA).getBytes(Charset.forName("UTF-8"))).toString());
+        Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", srcNodeId,
+            TapiStringConstants.PHTNC_MEDIA_OTS, sourceTpId).getBytes(Charset.forName("UTF-8"))).toString());
+        InstanceIdentifier<OwnedNodeEdgePoint> onepIID = InstanceIdentifier.builder(Context.class)
+            .augmentation(Context1.class).child(TopologyContext.class)
+            .child(Topology.class, new TopologyKey(tapiTopoUuid)).child(Node.class, new NodeKey(nodeUuid))
+            .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nepUuid))
+            .build();
+        Uuid node1Uuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", destNodeId,
+            TapiStringConstants.PHTNC_MEDIA).getBytes(Charset.forName("UTF-8"))).toString());
+        Uuid nep1Uuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", destNodeId,
+            TapiStringConstants.PHTNC_MEDIA_OTS, destTpId).getBytes(Charset.forName("UTF-8"))).toString());
+        InstanceIdentifier<OwnedNodeEdgePoint> onep1IID = InstanceIdentifier.builder(Context.class)
+            .augmentation(Context1.class).child(TopologyContext.class)
+            .child(Topology.class, new TopologyKey(tapiTopoUuid)).child(Node.class, new NodeKey(node1Uuid))
+            .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nep1Uuid))
+            .build();
+        try {
+            Optional<OwnedNodeEdgePoint> optionalOnep = this.networkTransactionService.read(
+                LogicalDatastoreType.OPERATIONAL, onepIID).get();
+            Optional<OwnedNodeEdgePoint> optionalOnep1 = this.networkTransactionService.read(
+                LogicalDatastoreType.OPERATIONAL, onep1IID).get();
+            if (!optionalOnep.isPresent() || !optionalOnep1.isPresent()) {
+                LOG.error("One of the 2 neps doesnt exist in the datastore: {} OR {}", nepUuid, nep1Uuid);
+                return null;
+            }
+            return optionalOnep.orElseThrow().getOperationalState().equals(
+                        optionalOnep1.orElseThrow().getOperationalState())
+                ? optionalOnep.orElseThrow().getOperationalState().getName() : OperationalState.DISABLED.getName();
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Failed getting Mapping data from portMapping",e);
+            return null;
+        }
+    }
+
+    @Override
+    public String getAdminState(String srcNodeId, String destNodeId, String sourceTpId, String destTpId) {
+        Uuid tapiTopoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
+            .getBytes(Charset.forName("UTF-8"))).toString());
+        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", srcNodeId,
+            TapiStringConstants.PHTNC_MEDIA).getBytes(Charset.forName("UTF-8"))).toString());
+        Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", srcNodeId,
+            TapiStringConstants.PHTNC_MEDIA_OTS, sourceTpId).getBytes(Charset.forName("UTF-8"))).toString());
+        InstanceIdentifier<OwnedNodeEdgePoint> onepIID = InstanceIdentifier.builder(Context.class)
+            .augmentation(Context1.class).child(TopologyContext.class)
+            .child(Topology.class, new TopologyKey(tapiTopoUuid)).child(Node.class, new NodeKey(nodeUuid))
+            .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nepUuid))
+            .build();
+        Uuid node1Uuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", destNodeId,
+            TapiStringConstants.PHTNC_MEDIA).getBytes(Charset.forName("UTF-8"))).toString());
+        Uuid nep1Uuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", destNodeId,
+            TapiStringConstants.PHTNC_MEDIA_OTS, destTpId).getBytes(Charset.forName("UTF-8"))).toString());
+        InstanceIdentifier<OwnedNodeEdgePoint> onep1IID = InstanceIdentifier.builder(Context.class)
+            .augmentation(Context1.class).child(TopologyContext.class)
+            .child(Topology.class, new TopologyKey(tapiTopoUuid)).child(Node.class, new NodeKey(node1Uuid))
+            .child(OwnedNodeEdgePoint.class, new OwnedNodeEdgePointKey(nep1Uuid))
+            .build();
+        try {
+            Optional<OwnedNodeEdgePoint> optionalOnep = this.networkTransactionService.read(
+                LogicalDatastoreType.OPERATIONAL, onepIID).get();
+            Optional<OwnedNodeEdgePoint> optionalOnep1 = this.networkTransactionService.read(
+                LogicalDatastoreType.OPERATIONAL, onep1IID).get();
+            if (!optionalOnep.isPresent() || !optionalOnep1.isPresent()) {
+                LOG.error("One of the 2 neps doesnt exist in the datastore: {} OR {}", nepUuid, nep1Uuid);
+                return null;
+            }
+            return optionalOnep.orElseThrow().getAdministrativeState().equals(
+                        optionalOnep1.orElseThrow().getAdministrativeState())
+                ? optionalOnep.orElseThrow().getAdministrativeState().getName()
+                : AdministrativeState.UNLOCKED.getName();
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Failed getting Mapping data from portMapping",e);
+            return null;
+        }
+    }
+}
index eee640f42effb7437473c1ab07c52cd2fcbffb47..1a3521661abad576b2c1b64a2323c9da495812e1 100644 (file)
@@ -7,17 +7,13 @@
  */
 package org.opendaylight.transportpce.tapi.utils;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
 import java.util.List;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.api.DataObjectModification;
 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeModification;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.tapi.rev180928.ServiceInterfacePoints;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.tapi.rev180928.service._interface.points.ServiceEndPoint;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.tapi.rev230728.ServiceInterfacePoints;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.tapi.rev230728.service._interface.points.ServiceEndPoint;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -25,53 +21,42 @@ import org.slf4j.LoggerFactory;
 public class TapiListener implements DataTreeChangeListener<ServiceInterfacePoints> {
 
     private static final Logger LOG = LoggerFactory.getLogger(TapiListener.class);
+    private static final String SE_JAVA_INTF =
+        "interface org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.tapi.rev180928"
+            + ".service._interface.points.ServiceEndPoint";
 
     @Override
-    public void onDataTreeChanged(@NonNull Collection<DataTreeModification<ServiceInterfacePoints>> changes) {
+    public void onDataTreeChanged(@NonNull List<DataTreeModification<ServiceInterfacePoints>> changes) {
         LOG.info("onDataTreeChanged in TapiListener");
         for (DataTreeModification<ServiceInterfacePoints> change : changes) {
             DataObjectModification<ServiceInterfacePoints> rootSIP = change.getRootNode();
-            switch (rootSIP.getModificationType()) {
+            switch (rootSIP.modificationType()) {
                 case WRITE:
                     LOG.info("onDataTreeChanged in TapiListener : WRITE");
-                    ServiceInterfacePoints data = rootSIP.getDataAfter();
-                    List<ServiceEndPoint> listSEP = new ArrayList<>(data.getServiceEndPoint().values());
                     MappingUtils.deleteMap();
-                    for (ServiceEndPoint sep : listSEP) {
+                    for (ServiceEndPoint sep : rootSIP.dataAfter().getServiceEndPoint().values()) {
                         MappingUtils.addMapSEP(sep);
                     }
                     MappingUtils.afficheMap();
                     break;
                 case SUBTREE_MODIFIED:
                     LOG.info("onDataTreeChanged in TapiListener : SUBTREE_MODIFIED");
-                    Iterator<? extends DataObjectModification<? extends DataObject>> iterator = rootSIP
-                        .getModifiedChildren().iterator();
-                    while (iterator.hasNext()) {
-                        DataObjectModification<? extends DataObject> dom = iterator.next();
+                    for (DataObjectModification<? extends DataObject> dom :
+                            rootSIP.getModifiedChildren(ServiceEndPoint.class)) {
                         // to delete existing child entry
-                        if (dom.getDataAfter() == null) {
-                            DataObject dataObject = dom.getDataBefore();
-                            ServiceEndPoint sep = null;
-                            sep = (ServiceEndPoint) dataObject;
-                            Uuid uuid = sep.getUuid();
-                            MappingUtils.deleteMapEntry(uuid);
+                        DataObject dataAfter = dom.dataAfter();
+                        if (dataAfter == null) {
+                            MappingUtils.deleteMapEntry(((ServiceEndPoint) dom.dataBefore()).getUuid());
                             MappingUtils.afficheMap();
-                            break;
+                            continue;
                         }
-
                         // to add new child entry
-                        if (dom.getDataType().toString().compareTo("interface org.opendaylight.yang.gen.v1.urn.opendayl"
-                            + "ight.params.xml.ns.yang.tapi.rev180928.service._interface.points.ServiceEndPoint") == 0
-                            && dom.getDataBefore() == null) {
-                            DataObject dataObject = dom.getDataAfter();
-                            ServiceEndPoint sep = null;
-                            sep = (ServiceEndPoint) dataObject;
-                            MappingUtils.addMapSEP(sep);
-                            MappingUtils.afficheMap();
-                        } else {
+                        if (dom.dataBefore() != null || dom.dataType().toString().compareTo(SE_JAVA_INTF) != 0) {
                             LOG.error("data input type is not a valid 'service-end-point'");
+                            continue;
                         }
-                        break;
+                        MappingUtils.addMapSEP((ServiceEndPoint) dataAfter);
+                        MappingUtils.afficheMap();
                     }
                     break;
                 case DELETE:
index c25c8a10477eb286eb7665508b5518b964e3ace5..b36f75c78fe5b57f931b2789a9933ade6974f05f 100644 (file)
@@ -9,17 +9,19 @@ package org.opendaylight.transportpce.tapi.validation;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 import org.opendaylight.transportpce.common.OperationResult;
 import org.opendaylight.transportpce.servicehandler.validation.checks.ComplianceCheckResult;
 import org.opendaylight.transportpce.tapi.validation.checks.ConnConstraintCheck;
 import org.opendaylight.transportpce.tapi.validation.checks.EndPointCheck;
 import org.opendaylight.transportpce.tapi.validation.checks.ResilienceConstraintCheck;
 import org.opendaylight.transportpce.tapi.validation.checks.TopoConstraintCheck;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.CreateConnectivityServiceInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.input.ConnectivityConstraint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.input.EndPoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.input.ResilienceConstraint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.input.TopologyConstraint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CreateConnectivityServiceInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.create.connectivity.service.input.ConnectivityConstraint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.create.connectivity.service.input.EndPoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.create.connectivity.service.input.ResilienceConstraint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.create.connectivity.service.input.TopologyConstraint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.create.connectivity.service.input.TopologyConstraintKey;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -64,14 +66,17 @@ public final class CreateConnectivityServiceValidation {
             return OperationResult.failed(resilienceConstraintCheckResult.getMessage());
         }
 
-        LOG.info("checking TopoConstraint...");
-        TopologyConstraint topoConstraint = input.getTopologyConstraint();
-        ComplianceCheckResult topoConstraintCheckResult = TopoConstraintCheck.check(topoConstraint);
-        if (topoConstraintCheckResult.hasPassed()) {
-            LOG.info("create-connectivity-service topo constraints compliant !");
-        } else {
-            return OperationResult.failed(topoConstraintCheckResult.getMessage());
+        if (input.getTopologyConstraint() != null) {
+            LOG.info("checking TopoConstraint...");
+            Map<TopologyConstraintKey, TopologyConstraint> topoConstraintMap = input.getTopologyConstraint();
+            for (Map.Entry<TopologyConstraintKey, TopologyConstraint> topoConstraint: topoConstraintMap.entrySet()) {
+                ComplianceCheckResult topoConstraintCheckResult = TopoConstraintCheck.check(topoConstraint.getValue());
+                if (!topoConstraintCheckResult.hasPassed()) {
+                    return OperationResult.failed(topoConstraintCheckResult.getMessage());
+                }
+            }
         }
+        LOG.info("create-connectivity-service topo constraints compliant !");
         return OperationResult.ok("Validation successful.");
     }
 
index 490d27c10df2c2288786571367c45623d2b89c0f..247d1de88df0d8be8787618512808a0349e53779 100644 (file)
@@ -8,8 +8,8 @@
 package org.opendaylight.transportpce.tapi.validation.checks;
 
 import org.opendaylight.transportpce.servicehandler.validation.checks.ComplianceCheckResult;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.ServiceType;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.input.ConnectivityConstraint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.ServiceType;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.create.connectivity.service.input.ConnectivityConstraint;
 
 public final class ConnConstraintCheck {
 
index 105889d1bb905dc8b7d98d71bc4761ca2608e526..6ea4ebc8542ff3d7893640e60df04007a2cbc897 100644 (file)
@@ -9,7 +9,7 @@ package org.opendaylight.transportpce.tapi.validation.checks;
 
 import java.util.List;
 import org.opendaylight.transportpce.servicehandler.validation.checks.ComplianceCheckResult;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.input.EndPoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.create.connectivity.service.input.EndPoint;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
index 4f19d6c3c457cf213135ab7d42213c4ba8e92e97..3ca1214938bbd5901ad48861b05009f82f08ded5 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.transportpce.tapi.validation.checks;
 
 import org.opendaylight.transportpce.servicehandler.validation.checks.ComplianceCheckResult;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.input.ResilienceConstraint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.create.connectivity.service.input.ResilienceConstraint;
 
 public final class ResilienceConstraintCheck {
 
index 8a07469702b91dc9f2f8531e02c8b314dd7bced2..7e94a539193b305bdd15d07b04b90963254c2abd 100644 (file)
@@ -8,7 +8,7 @@
 package org.opendaylight.transportpce.tapi.validation.checks;
 
 import org.opendaylight.transportpce.servicehandler.validation.checks.ComplianceCheckResult;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.input.TopologyConstraint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.create.connectivity.service.input.TopologyConstraint;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -23,14 +23,14 @@ public final class TopoConstraintCheck {
         return ((value != null) && (!value.isEmpty()));
     }
 
-    public static ComplianceCheckResult check(TopologyConstraint tc) {
+    public static ComplianceCheckResult check(TopologyConstraint topoConstraint) {
         boolean result = true;
         String message = "";
-        LOG.info("tc = {}", tc);
-        if (checkNull(tc)) {
+        LOG.info("tc = {}", topoConstraint);
+        if (checkNull(topoConstraint)) {
             LOG.info("tc is null");
             message = "Topology constraints are not managet yet";
-        } else if (checkEmpty(tc)) {
+        } else if (checkEmpty(topoConstraint)) {
             result = false;
             message = "Topology constraints are not managet yet";
         }
@@ -42,7 +42,7 @@ public final class TopoConstraintCheck {
         if (tc == null) {
             return true;
         }
-        if (tc.getAvoidTopology() == null) {
+        if (tc.getExcludeTopology() == null) {
             return true;
         }
         if (tc.getExcludeLink() == null) {
@@ -75,7 +75,7 @@ public final class TopoConstraintCheck {
         if (tc == null) {
             return true;
         }
-        if (tc.getAvoidTopology() != null && tc.getAvoidTopology().isEmpty()) {
+        if (tc.getExcludeTopology() != null && tc.getExcludeTopology().isEmpty()) {
             return true;
         }
         if (tc.getExcludeLink() != null && tc.getExcludeLink().isEmpty()) {
@@ -99,7 +99,8 @@ public final class TopoConstraintCheck {
         if (tc.getIncludeTopology() != null && tc.getIncludeTopology().isEmpty()) {
             return true;
         }
-        return tc.getPreferredTransportLayer() != null && tc.getPreferredTransportLayer().isEmpty();
+        //TODO: check this changes : do not understand the rational of this class
+        return tc.getPreferredTransportLayer() != null && tc.getPreferredTransportLayer() == null;
 
     }
 }
diff --git a/tapi/src/main/resources/OSGI-INF/blueprint/tapi-blueprint.xml b/tapi/src/main/resources/OSGI-INF/blueprint/tapi-blueprint.xml
deleted file mode 100644 (file)
index a44df32..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- vi: set et smarttab sw=4 tabstop=4: -->
-<!--
-Copyright © 2018 Orange and others. All rights reserved.
-
-This program and the accompanying materials are made available under the
-terms of the Eclipse Public License v1.0 which accompanies this distribution,
-and is available at http://www.eclipse.org/legal/epl-v10.html
-
-Author: Gilles Thouenon <gilles.thouenon@orange.com>
--->
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
-  xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
-  odl:use-default-for-reference-types="true">
-
-    <reference id="dataBroker"
-          interface="org.opendaylight.mdsal.binding.api.DataBroker"/>
-
-    <reference id="deviceTransactionManager"
-               interface="org.opendaylight.transportpce.common.device.DeviceTransactionManager" />
-
-    <reference id="notificationService"
-               interface="org.opendaylight.mdsal.binding.api.NotificationService"/>
-
-    <reference id="rpcProviderService"
-          interface="org.opendaylight.mdsal.binding.api.RpcProviderService"/>
-
-    <reference id="serviceHandlerService"
-          interface="org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OrgOpenroadmServiceService" />
-
-    <reference id="networkTransactionImpl"
-          interface="org.opendaylight.transportpce.common.network.NetworkTransactionService" />
-
-    <reference id="serviceDatastoreOperation"
-               interface="org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations" />
-
-    <bean id="tapiListener"
-          class="org.opendaylight.transportpce.tapi.utils.TapiListener">
-    </bean>
-
-    <bean id="tapiLink"
-          class="org.opendaylight.transportpce.tapi.utils.TapiLink">
-        <argument ref="networkTransactionImpl" />
-    </bean>
-
-    <bean id="tapiPceListener" class="org.opendaylight.transportpce.tapi.listeners.TapiPceListenerImpl">
-        <argument ref="dataBroker" />
-    </bean>
-
-    <bean id="tapiRendererListener" class="org.opendaylight.transportpce.tapi.listeners.TapiRendererListenerImpl">
-        <argument ref="dataBroker" />
-    </bean>
-
-    <bean id="tapiServiceHandlerListener" class="org.opendaylight.transportpce.tapi.listeners.TapiServiceHandlerListenerImpl">
-        <argument ref="dataBroker" />
-    </bean>
-
-    <bean id="tapiNetworkModelService" class="org.opendaylight.transportpce.tapi.topology.TapiNetworkModelServiceImpl">
-        <argument ref="tapilinkDiscoveryImpl" />
-        <argument ref="networkTransactionImpl" />
-        <argument ref="tapiLink" />
-    </bean>
-
-    <bean id="tapiNetconfTopologyListener" class="org.opendaylight.transportpce.tapi.topology.TapiNetconfTopologyListener">
-        <argument ref="tapiNetworkModelService" />
-    </bean>
-
-    <bean id="tapiOrLinkListener" class="org.opendaylight.transportpce.tapi.topology.TapiOrLinkListener">
-        <argument ref="tapiLink" />
-        <argument ref="networkTransactionImpl" />
-    </bean>
-
-    <bean id="tapiNetworkUtilsImpl" class="org.opendaylight.transportpce.tapi.topology.TapiNetworkUtilsImpl">
-        <argument ref="networkTransactionImpl" />
-        <argument ref="tapiLink" />
-    </bean>
-
-    <bean id="tapiProvider"
-          class="org.opendaylight.transportpce.tapi.impl.TapiProvider"
-          init-method="init" destroy-method="close">
-        <argument ref="dataBroker" />
-        <argument ref="rpcProviderService" />
-        <argument ref="serviceHandlerService" />
-        <argument ref="serviceDatastoreOperation" />
-        <argument ref="tapiListener" />
-        <argument ref="networkTransactionImpl" />
-        <argument ref="tapiNetconfTopologyListener" />
-        <argument ref="tapiPortMappingListener" />
-        <argument ref="tapiNetworkUtilsImpl" />
-        <argument ref="tapiPceListener" />
-        <argument ref="tapiRendererListener" />
-        <argument ref="tapiServiceHandlerListener" />
-        <argument ref="notificationService" />
-        <argument ref="tapiOrLinkListener" />
-    </bean>
-
-    <bean id="tapiPortMappingListener" class="org.opendaylight.transportpce.tapi.topology.TapiPortMappingListener">
-        <argument ref="tapiNetworkModelService" />
-    </bean>
-
-    <bean id="tapilinkDiscoveryImpl" class="org.opendaylight.transportpce.tapi.R2RTapiLinkDiscovery">
-        <argument ref="networkTransactionImpl" />
-        <argument ref="deviceTransactionManager" />
-        <argument ref="tapiLink" />
-    </bean>
-
-    <service ref="tapiNetworkModelService" interface="org.opendaylight.transportpce.tapi.topology.TapiNetworkModelService" />
-
-</blueprint>
index 63ca63eb25b624ec549c1cfa5e16f0cd6274c5f0..8e1313ea9c32e58d7d921ec250771d2d32e29d29 100644 (file)
@@ -7,9 +7,12 @@
  */
 package org.opendaylight.transportpce.tapi.connectivity;
 
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.when;
 
-import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.common.util.concurrent.MoreExecutors;
@@ -17,92 +20,105 @@ import java.util.HashMap;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executors;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.mdsal.binding.api.RpcProviderService;
+import org.opendaylight.mdsal.binding.api.RpcService;
 import org.opendaylight.transportpce.common.InstanceIdentifiers;
 import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
-import org.opendaylight.transportpce.common.network.RequestProcessor;
 import org.opendaylight.transportpce.pce.service.PathComputationService;
 import org.opendaylight.transportpce.renderer.provisiondevice.RendererServiceOperations;
-import org.opendaylight.transportpce.servicehandler.impl.ServicehandlerImpl;
-import org.opendaylight.transportpce.servicehandler.listeners.NetworkModelListenerImpl;
-import org.opendaylight.transportpce.servicehandler.listeners.PceListenerImpl;
-import org.opendaylight.transportpce.servicehandler.listeners.RendererListenerImpl;
+import org.opendaylight.transportpce.servicehandler.catalog.CatalogDataStoreOperations;
+import org.opendaylight.transportpce.servicehandler.listeners.NetworkListener;
+import org.opendaylight.transportpce.servicehandler.listeners.PceListener;
+import org.opendaylight.transportpce.servicehandler.listeners.RendererListener;
 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperationsImpl;
-import org.opendaylight.transportpce.tapi.listeners.TapiPceListenerImpl;
-import org.opendaylight.transportpce.tapi.listeners.TapiRendererListenerImpl;
-import org.opendaylight.transportpce.tapi.listeners.TapiServiceHandlerListenerImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.CreateConnectivityServiceImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.DeleteConnectivityServiceImpl;
+import org.opendaylight.transportpce.tapi.listeners.TapiPceNotificationHandler;
+import org.opendaylight.transportpce.tapi.listeners.TapiRendererNotificationHandler;
+import org.opendaylight.transportpce.tapi.listeners.TapiServiceNotificationHandler;
 import org.opendaylight.transportpce.tapi.topology.TopologyUtils;
 import org.opendaylight.transportpce.tapi.utils.TapiConnectivityDataUtils;
 import org.opendaylight.transportpce.tapi.utils.TapiContext;
 import org.opendaylight.transportpce.tapi.utils.TapiInitialORMapping;
 import org.opendaylight.transportpce.tapi.utils.TapiLink;
+import org.opendaylight.transportpce.tapi.utils.TapiLinkImpl;
 import org.opendaylight.transportpce.tapi.utils.TapiTopologyDataUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
 import org.opendaylight.transportpce.test.utils.TopologyDataUtils;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OrgOpenroadmServiceService;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.CreateConnectivityServiceInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.CreateConnectivityServiceInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.CreateConnectivityServiceOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.DeleteConnectivityServiceInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.DeleteConnectivityServiceInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.DeleteConnectivityServiceOutput;
-import org.opendaylight.yangtools.yang.common.RpcError;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommon;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.configuration.response.common.ConfigurationResponseCommonBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreate;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateOutputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceDelete;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CreateConnectivityService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CreateConnectivityServiceInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CreateConnectivityServiceInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CreateConnectivityServiceOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.DeleteConnectivityService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.DeleteConnectivityServiceInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.DeleteConnectivityServiceInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.DeleteConnectivityServiceOutput;
+import org.opendaylight.yangtools.yang.common.ErrorType;
 import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.opendaylight.yangtools.yang.common.RpcResultBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@ExtendWith(MockitoExtension.class)
 public class TapiConnectivityImplTest extends AbstractTest {
 
     @Mock
     private PathComputationService pathComputationService;
-
     @Mock
     private RendererServiceOperations rendererServiceOperations;
-
     @Mock
     private NotificationPublishService notificationPublishService;
-
     @Mock
-    private TapiPceListenerImpl tapipceListenerImpl;
-
+    private TapiPceNotificationHandler tapipceNotificationHandler;
     @Mock
-    private TapiRendererListenerImpl tapirendererListenerImpl;
-
+    private TapiRendererNotificationHandler tapirendererNotificationHandler;
     @Mock
-    private TapiServiceHandlerListenerImpl tapiserviceHandlerListenerImpl;
-
+    private TapiServiceNotificationHandler tapiserviceNotificationHandler;
     @Mock
-    private PceListenerImpl pceListenerImpl;
-
+    private PceListener pceListenerImpl;
     @Mock
-    private RendererListenerImpl rendererListenerImpl;
-
+    private RendererListener rendererListenerImpl;
+    @Mock
+    private NetworkListener networkModelListenerImpl;
+    @Mock
+    public CatalogDataStoreOperations catalogDataStoreOperations;
+    @Mock
+    private RpcProviderService rpcProviderService;
+    @Mock
+    private RpcService rpcService;
     @Mock
-    private NetworkModelListenerImpl networkModelListenerImpl;
+    private ServiceCreate serviceCreate;
+    @Mock
+    private ServiceDelete serviceDelete;
 
     private static final Logger LOG = LoggerFactory.getLogger(TapiConnectivityImplTest.class);
-    public static ServiceDataStoreOperations serviceDataStoreOperations;
-    public static TapiContext tapiContext;
-    public static TopologyUtils topologyUtils;
-    public static ConnectivityUtils connectivityUtils;
-    public static TapiInitialORMapping tapiInitialORMapping;
-    public static NetworkTransactionService networkTransactionService;
-    public static TapiLink tapilink;
+    private static ServiceDataStoreOperations serviceDataStoreOperations;
+    private static TapiContext tapiContext;
+    private static TopologyUtils topologyUtils;
+    private static ConnectivityUtils connectivityUtils;
+    private static TapiInitialORMapping tapiInitialORMapping;
+    private static NetworkTransactionService networkTransactionService;
+    private static TapiLink tapilink;
     private ListeningExecutorService executorService;
     private CountDownLatch endSignal;
     private static final int NUM_THREADS = 5;
 
-    @Before
-    public void setUp() throws InterruptedException, ExecutionException {
+    @BeforeEach
+    void setUp() throws InterruptedException, ExecutionException {
         executorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(NUM_THREADS));
         endSignal = new CountDownLatch(1);
         // Need to have datastore populated to enable the mapping from TAPI to OR
@@ -115,11 +131,8 @@ public class TapiConnectivityImplTest extends AbstractTest {
         TopologyDataUtils.writePortmappingFromFileToDatastore(getDataStoreContextUtil(),
             TapiTopologyDataUtils.PORTMAPPING_FILE);
 
-        MockitoAnnotations.openMocks(this);
-
-        networkTransactionService = new NetworkTransactionImpl(
-            new RequestProcessor(getDataStoreContextUtil().getDataBroker()));
-        tapilink = new TapiLink(networkTransactionService);
+        networkTransactionService = new NetworkTransactionImpl(getDataBroker());
+        tapilink = new TapiLinkImpl(networkTransactionService);
         serviceDataStoreOperations = new ServiceDataStoreOperationsImpl(getDataStoreContextUtil().getDataBroker());
         tapiContext = new TapiContext(networkTransactionService);
         topologyUtils = new TopologyUtils(networkTransactionService, getDataStoreContextUtil().getDataBroker(),
@@ -133,16 +146,12 @@ public class TapiConnectivityImplTest extends AbstractTest {
     }
 
     @Test
-    public void createConnServiceShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException {
-        OrgOpenroadmServiceService serviceHandler = new ServicehandlerImpl(getNewDataBroker(), pathComputationService,
-            rendererServiceOperations, notificationPublishService, pceListenerImpl, rendererListenerImpl,
-            networkModelListenerImpl, serviceDataStoreOperations);
-
-        TapiConnectivityImpl tapiConnectivity = new TapiConnectivityImpl(serviceHandler, tapiContext, connectivityUtils,
-            tapipceListenerImpl, tapirendererListenerImpl, tapiserviceHandlerListenerImpl);
-
-        ListenableFuture<RpcResult<CreateConnectivityServiceOutput>> result =
-            tapiConnectivity.createConnectivityService(new CreateConnectivityServiceInputBuilder().build());
+    void createConnServiceShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException {
+        when(rpcService.getRpc(any()))
+            .thenReturn(new CreateConnectivityServiceImpl(rpcService, tapiContext, connectivityUtils,
+                    tapipceNotificationHandler, tapirendererNotificationHandler));
+        ListenableFuture<RpcResult<CreateConnectivityServiceOutput>> result = rpcService
+                .getRpc(CreateConnectivityService.class).invoke(new CreateConnectivityServiceInputBuilder().build());
         result.addListener(new Runnable() {
             @Override
             public void run() {
@@ -153,48 +162,40 @@ public class TapiConnectivityImplTest extends AbstractTest {
         endSignal.await();
 
         RpcResult<CreateConnectivityServiceOutput> rpcResult = result.get();
-        Assert.assertEquals(
-            RpcError.ErrorType.RPC, rpcResult.getErrors().get(0).getErrorType());
+        assertEquals(ErrorType.RPC, rpcResult.getErrors().get(0).getErrorType());
     }
 
     @Test
-    public void createConnServiceShouldBeSuccessfulWhenPerformPCESuccessful()
+    void createConnServiceShouldBeSuccessfulWhenPerformPCESuccessful()
             throws ExecutionException, InterruptedException {
-        OrgOpenroadmServiceService serviceHandler = new ServicehandlerImpl(getNewDataBroker(), pathComputationService,
-            rendererServiceOperations, notificationPublishService, pceListenerImpl, rendererListenerImpl,
-            networkModelListenerImpl, serviceDataStoreOperations);
-
+        ConfigurationResponseCommon crc = new ConfigurationResponseCommonBuilder()
+                .setRequestId("request 1")
+                .setResponseCode("OK")
+                .setAckFinalIndicator("requestProcessed").build();
+        when(rpcService.getRpc(any())).thenReturn(serviceCreate);
+        doReturn(RpcResultBuilder
+                .success(new ServiceCreateOutputBuilder()
+                    .setConfigurationResponseCommon(crc)
+                    .build())
+                .buildFuture())
+            .when(serviceCreate).invoke(any());
         CreateConnectivityServiceInput input = TapiConnectivityDataUtils.buildConnServiceCreateInput();
-        Mockito.when(pathComputationService.pathComputationRequest(any())).thenReturn(Futures.immediateFuture(any()));
 
-        TapiConnectivityImpl tapiConnectivity = new TapiConnectivityImpl(serviceHandler, tapiContext, connectivityUtils,
-            tapipceListenerImpl, tapirendererListenerImpl, tapiserviceHandlerListenerImpl);
         ListenableFuture<RpcResult<CreateConnectivityServiceOutput>> result =
-            tapiConnectivity.createConnectivityService(input);
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-
-        endSignal.await();
-
+                    new CreateConnectivityServiceImpl(rpcService, tapiContext, connectivityUtils,
+                        tapipceNotificationHandler, tapirendererNotificationHandler)
+                .invoke(input);
+        LOG.info("INPUT= {}", input.toString());
         RpcResult<CreateConnectivityServiceOutput> rpcResult = result.get();
-        Assert.assertTrue(rpcResult.isSuccessful());
+        assertTrue(rpcResult.isSuccessful());
     }
 
     @Test
-    public void deleteConnServiceShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException {
-        OrgOpenroadmServiceService serviceHandler = new ServicehandlerImpl(getNewDataBroker(), pathComputationService,
-            rendererServiceOperations, notificationPublishService, pceListenerImpl, rendererListenerImpl,
-            networkModelListenerImpl, serviceDataStoreOperations);
-
-        TapiConnectivityImpl tapiConnectivity = new TapiConnectivityImpl(serviceHandler, tapiContext, connectivityUtils,
-            tapipceListenerImpl, tapirendererListenerImpl, tapiserviceHandlerListenerImpl);
-
-        ListenableFuture<RpcResult<DeleteConnectivityServiceOutput>> result =
-            tapiConnectivity.deleteConnectivityService(new DeleteConnectivityServiceInputBuilder().build());
+    void deleteConnServiceShouldBeFailedWithEmptyInput() throws ExecutionException, InterruptedException {
+        when(rpcService.getRpc(any()))
+            .thenReturn(new DeleteConnectivityServiceImpl(rpcService, tapiContext, networkTransactionService));
+        ListenableFuture<RpcResult<DeleteConnectivityServiceOutput>> result = rpcService
+                .getRpc(DeleteConnectivityService.class).invoke(new DeleteConnectivityServiceInputBuilder().build());
         result.addListener(new Runnable() {
             @Override
             public void run() {
@@ -205,21 +206,16 @@ public class TapiConnectivityImplTest extends AbstractTest {
         endSignal.await();
 
         RpcResult<DeleteConnectivityServiceOutput> rpcResult = result.get();
-        Assert.assertEquals(
-            RpcError.ErrorType.RPC, rpcResult.getErrors().get(0).getErrorType());
+        assertEquals(ErrorType.RPC, rpcResult.getErrors().get(0).getErrorType());
     }
 
     @Test
-    public void deleteConnServiceShouldBeFailedWithNonExistService() throws ExecutionException, InterruptedException {
+    void deleteConnServiceShouldBeFailedWithNonExistService() throws ExecutionException, InterruptedException {
+        when(rpcService.getRpc(any()))
+            .thenReturn(new DeleteConnectivityServiceImpl(rpcService, tapiContext, networkTransactionService));
         DeleteConnectivityServiceInput input = TapiConnectivityDataUtils.buildConnServiceDeleteInput1();
-        OrgOpenroadmServiceService serviceHandler = new ServicehandlerImpl(getNewDataBroker(), pathComputationService,
-            rendererServiceOperations, notificationPublishService, pceListenerImpl, rendererListenerImpl,
-            networkModelListenerImpl, serviceDataStoreOperations);
-
-        TapiConnectivityImpl tapiConnectivity = new TapiConnectivityImpl(serviceHandler, tapiContext, connectivityUtils,
-            tapipceListenerImpl, tapirendererListenerImpl, tapiserviceHandlerListenerImpl);
-        ListenableFuture<RpcResult<DeleteConnectivityServiceOutput>> result =
-            tapiConnectivity.deleteConnectivityService(input);
+        ListenableFuture<RpcResult<DeleteConnectivityServiceOutput>> result = rpcService
+                .getRpc(DeleteConnectivityService.class).invoke(input);
         result.addListener(new Runnable() {
             @Override
             public void run() {
@@ -230,38 +226,31 @@ public class TapiConnectivityImplTest extends AbstractTest {
         endSignal.await();
 
         RpcResult<DeleteConnectivityServiceOutput> rpcResult = result.get();
-        Assert.assertEquals(
-            RpcError.ErrorType.RPC, rpcResult.getErrors().get(0).getErrorType());
+        assertEquals(ErrorType.RPC, rpcResult.getErrors().get(0).getErrorType());
     }
 
     @Test
-    public void deleteConnServiceShouldBeSuccessForExistingService() throws ExecutionException, InterruptedException {
-        Mockito.when(rendererServiceOperations.serviceDelete(any(), any())).thenReturn(Futures.immediateFuture(any()));
-
-        OrgOpenroadmServiceService serviceHandler = new ServicehandlerImpl(getNewDataBroker(), pathComputationService,
-            rendererServiceOperations, notificationPublishService, pceListenerImpl, rendererListenerImpl,
-            networkModelListenerImpl, serviceDataStoreOperations);
-
-        TapiConnectivityImpl tapiConnectivity = new TapiConnectivityImpl(serviceHandler, tapiContext, connectivityUtils,
-            tapipceListenerImpl, tapirendererListenerImpl, tapiserviceHandlerListenerImpl);
-
+    void deleteConnServiceShouldBeSuccessForExistingService() throws ExecutionException, InterruptedException {
+        ConfigurationResponseCommon crc = new ConfigurationResponseCommonBuilder()
+            .setRequestId("request 1")
+            .setResponseCode("OK")
+            .setAckFinalIndicator("requestProcessed").build();
+        when(rpcService.getRpc(any())).thenReturn(serviceDelete);
+        doReturn(RpcResultBuilder
+                .success(new org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526
+                        .ServiceDeleteOutputBuilder()
+                    .setConfigurationResponseCommon(crc)
+                    .build())
+                .buildFuture())
+            .when(serviceDelete).invoke(any());
         ServiceCreateInput createInput = TapiConnectivityDataUtils.buildServiceCreateInput();
         serviceDataStoreOperations.createService(createInput);
         tapiContext.updateConnectivityContext(TapiConnectivityDataUtils.createConnService(), new HashMap<>());
-
         DeleteConnectivityServiceInput input = TapiConnectivityDataUtils.buildConnServiceDeleteInput();
         ListenableFuture<RpcResult<DeleteConnectivityServiceOutput>> result =
-            tapiConnectivity.deleteConnectivityService(input);
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-
-        endSignal.await();
-
+                new DeleteConnectivityServiceImpl(rpcService, tapiContext, networkTransactionService).invoke(input);
+        LOG.debug("RESULT = {}", result.toString());
         RpcResult<DeleteConnectivityServiceOutput> rpcResult = result.get();
-        Assert.assertTrue(rpcResult.isSuccessful());
+        assertTrue(rpcResult.isSuccessful());
     }
 }
index 8a575abd6254fb3a4375398bf9ec797957606a2a..4e2a9f22c3e69aad5d6634f1aa0edea5a0c8071f 100644 (file)
 package org.opendaylight.transportpce.tapi.provider;
 
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.opendaylight.mdsal.common.api.CommitInfo.emptyFluentFuture;
 
-import org.junit.After;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import com.google.common.util.concurrent.Futures;
+import java.util.Optional;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.opendaylight.mdsal.binding.api.DataBroker;
+import org.opendaylight.mdsal.binding.api.NotificationPublishService;
+import org.opendaylight.mdsal.binding.api.NotificationService;
 import org.opendaylight.mdsal.binding.api.RpcProviderService;
-import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
+import org.opendaylight.mdsal.binding.api.RpcService;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
-import org.opendaylight.transportpce.common.network.RequestProcessor;
 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
 import org.opendaylight.transportpce.tapi.impl.TapiProvider;
-import org.opendaylight.transportpce.tapi.listeners.TapiPceListenerImpl;
-import org.opendaylight.transportpce.tapi.listeners.TapiRendererListenerImpl;
-import org.opendaylight.transportpce.tapi.listeners.TapiServiceHandlerListenerImpl;
-import org.opendaylight.transportpce.tapi.topology.TapiNetconfTopologyListener;
-import org.opendaylight.transportpce.tapi.topology.TapiOrLinkListener;
-import org.opendaylight.transportpce.tapi.topology.TapiPortMappingListener;
-import org.opendaylight.transportpce.tapi.utils.TapiListener;
-import org.opendaylight.transportpce.test.AbstractTest;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.tapinetworkutils.rev210408.TransportpceTapinetworkutilsService;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.OrgOpenroadmServiceService;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TapiCommonService;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.TapiConnectivityService;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.TapiTopologyService;
-
-public class TapiProviderTest extends AbstractTest {
-    public static NetworkTransactionService networkTransactionService;
+import org.opendaylight.transportpce.tapi.impl.rpc.CreateConnectivityServiceImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.DeleteConnectivityServiceImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetConnectionDetailsImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetConnectivityServiceDetailsImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetConnectivityServiceListImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetLinkDetailsImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetNodeDetailsImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetNodeEdgePointDetailsImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetServiceInterfacePointDetailsImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetServiceInterfacePointListImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetTopologyDetailsImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetTopologyListImpl;
+import org.opendaylight.transportpce.tapi.listeners.TapiNetworkModelNotificationHandler;
+import org.opendaylight.transportpce.tapi.topology.TapiNetworkModelService;
+
+@ExtendWith(MockitoExtension.class)
+public class TapiProviderTest {
 
     @Mock
-    RpcProviderService rpcProviderRegistry;
-
+    private DataBroker dataBroker;
     @Mock
-    OrgOpenroadmServiceService serviceHandler;
-
+    private RpcProviderService rpcProviderService;
     @Mock
-    ServiceDataStoreOperations serviceDataStoreOperations;
-
+    private NotificationService notificationService;
     @Mock
-    TapiListener tapiListener;
-
+    private RpcService rpcService;
     @Mock
-    TransportpceTapinetworkutilsService tapiNetworkUtils;
-
+    private NotificationPublishService notificationPublishService;
     @Mock
-    TapiPortMappingListener tapiPortMappingListener;
-
-    @Mock
-    TapiNetconfTopologyListener topologyListener;
-
-    @Mock
-    TapiOrLinkListener orLinkListener;
-
+    private NetworkTransactionService networkTransactionService;
     @Mock
-    TapiPceListenerImpl pceListenerImpl;
-
+    private ServiceDataStoreOperations serviceDataStoreOperations;
     @Mock
-    TapiRendererListenerImpl rendererListenerImpl;
-
+    private TapiNetworkModelNotificationHandler tapiNetworkModelNotificationHandler;
     @Mock
-    TapiServiceHandlerListenerImpl serviceHandlerListenerImpl;
-
-    private AutoCloseable closeable;
-
-    @Before
-    public void openMocks() {
-        closeable = MockitoAnnotations.openMocks(this);
-    }
-
-    @BeforeClass
-    public static void setUp() {
-        networkTransactionService = new NetworkTransactionImpl(
-            new RequestProcessor(getDataBroker()));
-    }
+    private TapiNetworkModelService tapiNetworkModelServiceImpl;
 
     @Test
-    public void testInitRegisterTapiToRpcRegistry() {
-        TapiProvider provider =  new TapiProvider(getDataBroker(), rpcProviderRegistry, serviceHandler,
-            serviceDataStoreOperations, tapiListener, networkTransactionService, topologyListener,
-            tapiPortMappingListener, tapiNetworkUtils, pceListenerImpl, rendererListenerImpl,
-            serviceHandlerListenerImpl, getNotificationService(), orLinkListener);
-
-        provider.init();
-
-        verify(rpcProviderRegistry, times(1))
-            .registerRpcImplementation(any(), any(TapiConnectivityService.class));
-        verify(rpcProviderRegistry, times(2))
-            .registerRpcImplementation(any(), any(TapiTopologyService.class));
-        verify(rpcProviderRegistry, times(2))
-            .registerRpcImplementation(any(), any(TapiCommonService.class));
-    }
-
-    @After
-    public void releaseMocks() throws Exception {
-        closeable.close();
+    void testInitRegisterTapiToRpcRegistry() {
+        when(networkTransactionService.read(any(), any())).thenReturn(Futures.immediateFuture(Optional.empty()));
+        doReturn(emptyFluentFuture()).when(networkTransactionService).commit();
+        new TapiProvider(dataBroker, rpcProviderService, rpcService, notificationService, notificationPublishService,
+                networkTransactionService, serviceDataStoreOperations,
+                tapiNetworkModelNotificationHandler, tapiNetworkModelServiceImpl);
+
+        verify(rpcProviderService, times(1)).registerRpcImplementations(
+                any(CreateConnectivityServiceImpl.class),
+                any(GetConnectivityServiceDetailsImpl.class),
+                any(GetConnectionDetailsImpl.class),
+                any(DeleteConnectivityServiceImpl.class),
+                any(GetConnectivityServiceListImpl.class),
+                any(GetNodeDetailsImpl.class),
+                any(GetTopologyDetailsImpl.class),
+                any(GetNodeEdgePointDetailsImpl.class),
+                any(GetLinkDetailsImpl.class),
+                any(GetTopologyListImpl.class),
+                any(GetServiceInterfacePointDetailsImpl.class),
+                any(GetServiceInterfacePointListImpl.class));
+        verify(dataBroker, times(4)).registerTreeChangeListener(any(), any());
     }
 }
index 61ae25e91c53ccb3af0eb650db16b42914259594..57e4ba097f17b7dcdac1e6dc6ee8ea69e2f853a5 100644 (file)
@@ -14,10 +14,11 @@ import static org.hamcrest.CoreMatchers.hasItem;
 import static org.hamcrest.CoreMatchers.hasItems;
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import com.google.common.util.concurrent.FluentFuture;
 import java.nio.charset.Charset;
@@ -30,26 +31,26 @@ import java.util.UUID;
 import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
 import org.eclipse.jdt.annotation.Nullable;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.InstanceIdentifiers;
 import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
-import org.opendaylight.transportpce.common.network.RequestProcessor;
 import org.opendaylight.transportpce.tapi.TapiStringConstants;
 import org.opendaylight.transportpce.tapi.utils.TapiLink;
+import org.opendaylight.transportpce.tapi.utils.TapiLinkImpl;
 import org.opendaylight.transportpce.tapi.utils.TapiTopologyDataUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
 import org.opendaylight.transportpce.test.utils.TopologyDataUtils;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1Builder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmLinkType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmLinkType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
@@ -66,37 +67,37 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.top
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.AdministrativeState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.CapacityUnit;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.ForwardingDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LifecycleState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.OperationalState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortRole;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE100GigE;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE10GigELAN;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU0;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU2;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU2E;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU4;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROMS;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROTSi;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.ForwardingRule;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.RuleType;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroup;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.Rule;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Direction;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.ForwardingDirection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LAYERPROTOCOLQUALIFIER;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.PortRole;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU0;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU2;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU2E;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU4;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev221121.DIGITALSIGNALTYPE100GigE;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev221121.DIGITALSIGNALTYPE10GigELAN;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROMS;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTS;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTSi;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.FORWARDINGRULECANNOTFORWARDACROSSGROUP;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.FORWARDINGRULEMAYFORWARDACROSSGROUP;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.RuleType;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroup;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstances;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.Rule;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
-import org.opendaylight.yangtools.yang.common.Uint64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -116,8 +117,8 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
     private static TapiLink tapiLink;
     private static DataBroker dataBroker = getDataBroker();
 
-    @BeforeClass
-    public static void setUp() throws InterruptedException, ExecutionException {
+    @BeforeAll
+    static void setUp() throws InterruptedException, ExecutionException {
         TopologyDataUtils.writeTopologyFromFileToDatastore(getDataStoreContextUtil(),
             TapiTopologyDataUtils.OPENROADM_TOPOLOGY_FILE, InstanceIdentifiers.OVERLAY_NETWORK_II);
         TopologyDataUtils.writeTopologyFromFileToDatastore(getDataStoreContextUtil(),
@@ -133,35 +134,35 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
             .child(Node.class, new NodeKey(new NodeId("SPDR-SA1-XPDR1")));
         FluentFuture<Optional<Node>> muxAFuture = dataBroker.newReadOnlyTransaction()
             .read(LogicalDatastoreType.CONFIGURATION, muxAIID);
-        otnMuxA = muxAFuture.get().get();
+        otnMuxA = muxAFuture.get().orElseThrow();
         KeyedInstanceIdentifier<Node, NodeKey> muxCIID = InstanceIdentifier.create(Networks.class)
             .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network
                 .class, new NetworkKey(new NetworkId("otn-topology")))
             .child(Node.class, new NodeKey(new NodeId("SPDR-SC1-XPDR1")));
         FluentFuture<Optional<Node>> muxCFuture = dataBroker.newReadOnlyTransaction()
             .read(LogicalDatastoreType.CONFIGURATION, muxCIID);
-        muxCFuture.get().get();
+        muxCFuture.get().orElseThrow();
         KeyedInstanceIdentifier<Node, NodeKey> switchIID = InstanceIdentifier.create(Networks.class)
             .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network
                 .class, new NetworkKey(new NetworkId("otn-topology")))
             .child(Node.class, new NodeKey(new NodeId("SPDR-SA1-XPDR2")));
         FluentFuture<Optional<Node>> switchFuture = dataBroker.newReadOnlyTransaction()
             .read(LogicalDatastoreType.CONFIGURATION, switchIID);
-        otnSwitch = switchFuture.get().get();
+        otnSwitch = switchFuture.get().orElseThrow();
         KeyedInstanceIdentifier<Node, NodeKey> roadmaIID = InstanceIdentifier.create(Networks.class)
             .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network
                 .class, new NetworkKey(new NetworkId("openroadm-network")))
             .child(Node.class, new NodeKey(new NodeId("ROADM-A1")));
         FluentFuture<Optional<Node>> roadmaFuture = dataBroker.newReadOnlyTransaction()
             .read(LogicalDatastoreType.CONFIGURATION, roadmaIID);
-        roadmA = roadmaFuture.get().get();
+        roadmA = roadmaFuture.get().orElseThrow();
         KeyedInstanceIdentifier<Node, NodeKey> roadmcIID = InstanceIdentifier.create(Networks.class)
             .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network
                 .class, new NetworkKey(new NetworkId("openroadm-network")))
             .child(Node.class, new NodeKey(new NodeId("ROADM-C1")));
         FluentFuture<Optional<Node>> roadmcFuture = dataBroker.newReadOnlyTransaction()
             .read(LogicalDatastoreType.CONFIGURATION, roadmcIID);
-        roadmC = roadmcFuture.get().get();
+        roadmC = roadmcFuture.get().orElseThrow();
 
         KeyedInstanceIdentifier<Node, NodeKey> tpdrIID = InstanceIdentifier.create(Networks.class)
             .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network
@@ -169,7 +170,7 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
             .child(Node.class, new NodeKey(new NodeId("XPDR-A1-XPDR1")));
         FluentFuture<Optional<Node>> tpdrFuture = dataBroker.newReadOnlyTransaction()
             .read(LogicalDatastoreType.CONFIGURATION, tpdrIID);
-        tpdr100G = tpdrFuture.get().get();
+        tpdr100G = tpdrFuture.get().orElseThrow();
 
         InstanceIdentifier<Network1> linksIID = InstanceIdentifier.create(Networks.class)
             .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network
@@ -177,7 +178,7 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
             .augmentation(Network1.class);
         FluentFuture<Optional<Network1>> linksFuture = dataBroker.newReadOnlyTransaction()
             .read(LogicalDatastoreType.CONFIGURATION, linksIID);
-        linksFuture.get().get().getLink();
+        linksFuture.get().orElseThrow().getLink();
 
         InstanceIdentifier<Network1> links1IID = InstanceIdentifier.create(Networks.class)
             .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network
@@ -185,25 +186,24 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
             .augmentation(Network1.class);
         FluentFuture<Optional<Network1>> links1Future = dataBroker.newReadOnlyTransaction()
             .read(LogicalDatastoreType.CONFIGURATION, links1IID);
-        ortopoLinks = links1Future.get().get().getLink();
+        ortopoLinks = links1Future.get().orElseThrow().getLink();
 
         InstanceIdentifier<Network> ortopo1IID = InstanceIdentifier.create(Networks.class)
             .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network
                 .class, new NetworkKey(new NetworkId("openroadm-topology")));
         FluentFuture<Optional<Network>> ortopoFuture = dataBroker.newReadOnlyTransaction()
             .read(LogicalDatastoreType.CONFIGURATION, ortopo1IID);
-        openroadmNet = ortopoFuture.get().get();
+        openroadmNet = ortopoFuture.get().orElseThrow();
 
         topologyUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER.getBytes(
             Charset.forName("UTF-8"))).toString());
-        networkTransactionService = new NetworkTransactionImpl(
-            new RequestProcessor(getDataStoreContextUtil().getDataBroker()));
-        tapiLink = new TapiLink(networkTransactionService);
+        networkTransactionService = new NetworkTransactionImpl(getDataBroker());
+        tapiLink = new TapiLinkImpl(networkTransactionService);
         LOG.info("TEST SETUP READY");
     }
 
     @Test
-    public void convertNodeWhenNoStates() {
+    void convertNodeWhenNoStates() {
         Node tpdr = changeTerminationPointState(tpdr100G, "XPDR1-NETWORK1", "XPDR1-CLIENT1",  null, null);
         List<String> networkPortList = new ArrayList<>();
         for (TerminationPoint tp : tpdr100G.augmentation(Node1.class).getTerminationPoint().values()) {
@@ -211,14 +211,14 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
                 networkPortList.add(tp.getTpId().getValue());
             }
         }
-        ConvertORTopoToTapiFullTopo tapiFactory = new ConvertORTopoToTapiFullTopo(topologyUuid, tapiLink);
+        ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(topologyUuid);
         tapiFactory.convertNode(tpdr, networkPortList);
 
-        Uuid dsrNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+DSR".getBytes(Charset.forName("UTF-8")))
+        Uuid dsrNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+XPONDER".getBytes(Charset.forName("UTF-8")))
             .toString());
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node dsrNode = tapiFactory
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node dsrNode = tapiFactory
             .getTapiNodes().get(new
-                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey(dsrNodeUuid));
+                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey(dsrNodeUuid));
         Uuid enetworkNepUuid = new Uuid(
             UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+eODU+XPDR1-CLIENT1").getBytes(Charset.forName("UTF-8")))
                 .toString());
@@ -226,42 +226,16 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
             UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+iODU+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
                 .toString());
         OwnedNodeEdgePoint enepN = dsrNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(enetworkNepUuid));
-        assertNull("Administrative State should not be present", enepN.getAdministrativeState());
-        assertNull("Operational State should not be present", enepN.getOperationalState());
+        assertNull(enepN.getAdministrativeState(), "Administrative State should not be present");
+        assertNull(enepN.getOperationalState(), "Operational State should not be present");
 
         OwnedNodeEdgePoint inepN = dsrNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(inetworkNepUuid));
-        assertNull("Administrative State should not be present", inepN.getAdministrativeState());
-        assertNull("Operational State should not be present", inepN.getOperationalState());
-
-        Uuid otsiNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+OTSi".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node otsiNode = tapiFactory
-            .getTapiNodes().get(new
-                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey(otsiNodeUuid));
-        Uuid enepUuid = new Uuid(
-            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+eOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
-                .toString());
-        OwnedNodeEdgePoint enep = otsiNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(enepUuid));
-        assertNull("Administrative State should not be present", enep.getAdministrativeState());
-        assertNull("Operational State should not be present", enep.getOperationalState());
-
-        Uuid inepUuid = new Uuid(
-            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+iOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
-                .toString());
-        OwnedNodeEdgePoint inep = otsiNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(inepUuid));
-        assertNull("Administrative State should not be present", inep.getAdministrativeState());
-        assertNull("Operational State should not be present", inep.getOperationalState());
-
-        Uuid photnepUuid = new Uuid(
-            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+PHOTONIC_MEDIA+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
-                .toString());
-        OwnedNodeEdgePoint photnep = otsiNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(photnepUuid));
-        assertNull("Administrative State should not be present", photnep.getAdministrativeState());
-        assertNull("Operational State should not be present", photnep.getOperationalState());
+        assertNull(inepN.getAdministrativeState(), "Administrative State should not be present");
+        assertNull(inepN.getOperationalState(), "Operational State should not be present");
     }
 
     @Test
-    public void convertNodeWhenBadStates1() {
+    void convertNodeWhenBadStates1() {
         Node tpdr = changeTerminationPointState(tpdr100G, "XPDR1-NETWORK1", "XPDR1-CLIENT1",
             AdminStates.OutOfService, State.OutOfService);
         List<String> networkPortList = new ArrayList<>();
@@ -270,14 +244,14 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
                 networkPortList.add(tp.getTpId().getValue());
             }
         }
-        ConvertORTopoToTapiFullTopo tapiFactory = new ConvertORTopoToTapiFullTopo(topologyUuid, tapiLink);
+        ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(topologyUuid);
         tapiFactory.convertNode(tpdr, networkPortList);
 
-        Uuid dsrNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+DSR".getBytes(Charset.forName("UTF-8")))
+        Uuid dsrNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+XPONDER".getBytes(Charset.forName("UTF-8")))
             .toString());
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node dsrNode = tapiFactory
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node dsrNode = tapiFactory
             .getTapiNodes().get(new
-                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey(dsrNodeUuid));
+                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey(dsrNodeUuid));
         Uuid enetworkNepUuid = new Uuid(
             UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+eODU+XPDR1-CLIENT1").getBytes(Charset.forName("UTF-8")))
                 .toString());
@@ -285,52 +259,18 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
             UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+iODU+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
                 .toString());
         OwnedNodeEdgePoint enepN = dsrNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(enetworkNepUuid));
-        assertEquals("Administrative State should be Locked",
-            AdministrativeState.LOCKED, enepN.getAdministrativeState());
-        assertEquals("Operational State should be Disabled",
-            OperationalState.DISABLED, enepN.getOperationalState());
+        assertEquals(AdministrativeState.LOCKED, enepN.getAdministrativeState(),
+            "Administrative State should be Locked");
+        assertEquals(OperationalState.DISABLED, enepN.getOperationalState(), "Operational State should be Disabled");
 
         OwnedNodeEdgePoint inepN = dsrNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(inetworkNepUuid));
-        assertEquals("Administrative State should be Locked",
-            AdministrativeState.LOCKED, inepN.getAdministrativeState());
-        assertEquals("Operational State should be Disabled",
-            OperationalState.DISABLED, inepN.getOperationalState());
-
-        Uuid otsiNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+OTSi".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node otsiNode = tapiFactory
-            .getTapiNodes().get(new
-                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey(otsiNodeUuid));
-        Uuid enepUuid = new Uuid(
-            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+eOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
-                .toString());
-        OwnedNodeEdgePoint enep = otsiNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(enepUuid));
-        assertEquals("Administrative State should be Locked",
-            AdministrativeState.LOCKED, enep.getAdministrativeState());
-        assertEquals("Operational State should be Disabled",
-            OperationalState.DISABLED, enep.getOperationalState());
-
-        Uuid inepUuid = new Uuid(
-            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+iOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
-                .toString());
-        OwnedNodeEdgePoint inep = otsiNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(inepUuid));
-        assertEquals("Administrative State should be Locked",
-            AdministrativeState.LOCKED, inep.getAdministrativeState());
-        assertEquals("Operational State should be Disabled",
-            OperationalState.DISABLED, inep.getOperationalState());
-
-        Uuid photnepUuid = new Uuid(
-            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+PHOTONIC_MEDIA+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
-                .toString());
-        OwnedNodeEdgePoint photnep = otsiNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(photnepUuid));
-        assertEquals("Administrative State should be Locked",
-            AdministrativeState.LOCKED, photnep.getAdministrativeState());
-        assertEquals("Operational State should be Disabled",
-            OperationalState.DISABLED, photnep.getOperationalState());
+        assertEquals(AdministrativeState.LOCKED, inepN.getAdministrativeState(),
+            "Administrative State should be Locked");
+        assertEquals(OperationalState.DISABLED, inepN.getOperationalState(), "Operational State should be Disabled");
     }
 
     @Test
-    public void convertNodeWhenBadStates2() {
+    void convertNodeWhenBadStates2() {
         Node tpdr = changeTerminationPointState(tpdr100G, "XPDR1-NETWORK1", "XPDR1-CLIENT1",
             AdminStates.Maintenance, State.Degraded);
         List<String> networkPortList = new ArrayList<>();
@@ -339,14 +279,14 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
                 networkPortList.add(tp.getTpId().getValue());
             }
         }
-        ConvertORTopoToTapiFullTopo tapiFactory = new ConvertORTopoToTapiFullTopo(topologyUuid, tapiLink);
+        ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(topologyUuid);
         tapiFactory.convertNode(tpdr, networkPortList);
 
-        Uuid dsrNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+DSR".getBytes(Charset.forName("UTF-8")))
+        Uuid dsrNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+XPONDER".getBytes(Charset.forName("UTF-8")))
             .toString());
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node dsrNode = tapiFactory
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node dsrNode = tapiFactory
             .getTapiNodes().get(new
-                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey(dsrNodeUuid));
+                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey(dsrNodeUuid));
         Uuid enetworkNepUuid = new Uuid(
             UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+eODU+XPDR1-CLIENT1").getBytes(Charset.forName("UTF-8")))
                 .toString());
@@ -354,53 +294,20 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
             UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+iODU+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
                 .toString());
         OwnedNodeEdgePoint enepN = dsrNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(enetworkNepUuid));
-        assertEquals("Administrative State should be Locked",
-            AdministrativeState.LOCKED, enepN.getAdministrativeState());
-        assertEquals("Operational State should be Disabled",
-            OperationalState.DISABLED, enepN.getOperationalState());
+        assertEquals(AdministrativeState.LOCKED, enepN.getAdministrativeState(),
+            "Administrative State should be Locked");
+        assertEquals(OperationalState.DISABLED, enepN.getOperationalState(), "Operational State should be Disabled");
 
         OwnedNodeEdgePoint inepN = dsrNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(inetworkNepUuid));
-        assertEquals("Administrative State should be Locked",
-            AdministrativeState.LOCKED, inepN.getAdministrativeState());
-        assertEquals("Operational State should be Disabled",
-            OperationalState.DISABLED, inepN.getOperationalState());
+        assertEquals(AdministrativeState.LOCKED, inepN.getAdministrativeState(),
+            "Administrative State should be Locked");
+        assertEquals(OperationalState.DISABLED, inepN.getOperationalState(), "Operational State should be Disabled");
 
-        Uuid otsiNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+OTSi".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node otsiNode = tapiFactory
-            .getTapiNodes().get(new
-                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey(otsiNodeUuid));
-        Uuid enepUuid = new Uuid(
-            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+eOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
-                .toString());
-        OwnedNodeEdgePoint enep = otsiNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(enepUuid));
-        assertEquals("Administrative State should be Locked",
-            AdministrativeState.LOCKED, enep.getAdministrativeState());
-        assertEquals("Operational State should be Disabled",
-            OperationalState.DISABLED, enep.getOperationalState());
-
-        Uuid inepUuid = new Uuid(
-            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+iOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
-                .toString());
-        OwnedNodeEdgePoint inep = otsiNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(inepUuid));
-        assertEquals("Administrative State should be Locked",
-            AdministrativeState.LOCKED, inep.getAdministrativeState());
-        assertEquals("Operational State should be Disabled",
-            OperationalState.DISABLED, inep.getOperationalState());
-
-        Uuid photnepUuid = new Uuid(
-            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+PHOTONIC_MEDIA+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
-                .toString());
-        OwnedNodeEdgePoint photnep = otsiNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(photnepUuid));
-        assertEquals("Administrative State should be Locked",
-            AdministrativeState.LOCKED, photnep.getAdministrativeState());
-        assertEquals("Operational State should be Disabled",
-            OperationalState.DISABLED, photnep.getOperationalState());
     }
 
     @Test
-    public void convertNodeForTransponder100G() {
-        ConvertORTopoToTapiFullTopo tapiFactory = new ConvertORTopoToTapiFullTopo(topologyUuid, tapiLink);
+    void convertNodeForTransponder100G() {
+        ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(topologyUuid);
         List<String> networkPortList = new ArrayList<>();
         for (TerminationPoint tp : tpdr100G.augmentation(Node1.class).getTerminationPoint().values()) {
             if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
@@ -408,32 +315,22 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
             }
         }
         tapiFactory.convertNode(tpdr100G, networkPortList);
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> tapiNodes
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> tapiNodes
             = tapiFactory.getTapiNodes().values().stream()
             .sorted((n1, n2) -> n1.getUuid().getValue().compareTo(n2.getUuid().getValue()))
             .collect(Collectors.toList());
 
-        assertEquals("Node list size should be 2", 2, tapiFactory.getTapiNodes().size());
-        assertEquals("Link list size should be 2", 2, tapiFactory.getTapiLinks().size());
+        assertEquals(1, tapiFactory.getTapiNodes().size(), "Node list size should be 1 (DSR-ODU merged)");
+        assertEquals(0, tapiFactory.getTapiLinks().size(), "Link list size should be 0 : no more transitional link");
 
-        Uuid dsrNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+DSR".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        checkDsrNode(tapiNodes.get(1), dsrNodeUuid, "tpdr", "XPDR-A1-XPDR1");
-        Uuid otsiNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+OTSi".getBytes(Charset.forName("UTF-8")))
+        Uuid dsrNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+XPONDER".getBytes(Charset.forName("UTF-8")))
             .toString());
-        checkOtsiNode(tapiNodes.get(0), otsiNodeUuid, "tpdr", "XPDR-A1-XPDR1");
-
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link> tapiLinks
-            = tapiFactory.getTapiLinks().values().stream()
-            .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
-            .collect(Collectors.toList());
-        checkTransitionalLink(tapiLinks.get(1), dsrNodeUuid, otsiNodeUuid,
-            "XPDR-A1-XPDR1+iODU+XPDR1-NETWORK1", "XPDR-A1-XPDR1+iOTSi+XPDR1-NETWORK1", "XPDR-A1-XPDR1");
+        checkDsrNode(tapiNodes.get(0), dsrNodeUuid, "tpdr", "XPDR-A1-XPDR1");
     }
 
     @Test
-    public void convertNodeForOtnMuxponder() {
-        ConvertORTopoToTapiFullTopo tapiFactory = new ConvertORTopoToTapiFullTopo(topologyUuid, tapiLink);
+    void convertNodeForOtnMuxponder() {
+        ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(topologyUuid);
         List<String> networkPortList = new ArrayList<>();
         for (TerminationPoint tp : otnMuxA.augmentation(Node1.class).getTerminationPoint().values()) {
             if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
@@ -441,31 +338,21 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
             }
         }
         tapiFactory.convertNode(otnMuxA, networkPortList);
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> tapiNodes
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> tapiNodes
             = tapiFactory.getTapiNodes().values().stream()
             .sorted((n1, n2) -> n1.getUuid().getValue().compareTo(n2.getUuid().getValue()))
             .collect(Collectors.toList());
 
-        assertEquals("Node list size should be 2", 2, tapiFactory.getTapiNodes().size());
-        assertEquals("Link list size should be 1", 1, tapiFactory.getTapiLinks().size());
-        Uuid dsrNodeUuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+DSR".getBytes(Charset.forName("UTF-8")))
+        assertEquals(1, tapiFactory.getTapiNodes().size(), "Node list size should be 1 (DSR-ODU merged)");
+        assertEquals(0, tapiFactory.getTapiLinks().size(), "Link list size should be 0 : no more transitional link");
+        Uuid dsrNodeUuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+XPONDER".getBytes(Charset.forName("UTF-8")))
             .toString());
         checkDsrNode(tapiNodes.get(0), dsrNodeUuid, "mux", "SPDR-SA1-XPDR1");
-        Uuid otsiNodeUuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+OTSi".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        checkOtsiNode(tapiNodes.get(1), otsiNodeUuid, "mux", "SPDR-SA1-XPDR1");
-
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link> tapiLinks
-            = tapiFactory.getTapiLinks().values().stream()
-            .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
-            .collect(Collectors.toList());
-        checkTransitionalLink(tapiLinks.get(0), dsrNodeUuid, otsiNodeUuid,
-            "SPDR-SA1-XPDR1+iODU+XPDR1-NETWORK1", "SPDR-SA1-XPDR1+iOTSi+XPDR1-NETWORK1", "SPDR-SA1-XPDR1");
     }
 
     @Test
-    public void convertNodeForOtnSwitch() {
-        ConvertORTopoToTapiFullTopo tapiFactory = new ConvertORTopoToTapiFullTopo(topologyUuid, tapiLink);
+    void convertNodeForOtnSwitch() {
+        ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(topologyUuid);
         List<String> networkPortList = new ArrayList<>();
         for (TerminationPoint tp : otnSwitch.augmentation(Node1.class).getTerminationPoint().values()) {
             if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
@@ -473,86 +360,87 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
             }
         }
         tapiFactory.convertNode(otnSwitch, networkPortList);
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> tapiNodes
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> tapiNodes
             = tapiFactory.getTapiNodes().values().stream()
             .sorted((n1, n2) -> n1.getUuid().getValue().compareTo(n2.getUuid().getValue()))
             .collect(Collectors.toList());
 
-        assertEquals("Node list size should be 2", 2, tapiFactory.getTapiNodes().size());
-        assertEquals("Link list size should be 4", 4, tapiFactory.getTapiLinks().size());
+        assertEquals(1, tapiFactory.getTapiNodes().size(), "Node list size should be 1 (DSR-ODU merged)");
+        assertEquals(0, tapiFactory.getTapiLinks().size(), "Link list size should be 0 : no more transitional link");
 
-        Uuid dsrNodeUuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR2+DSR".getBytes(Charset.forName("UTF-8")))
+        Uuid dsrNodeUuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR2+XPONDER".getBytes(Charset.forName("UTF-8")))
             .toString());
         checkDsrNode(tapiNodes.get(0), dsrNodeUuid, "switch", "SPDR-SA1-XPDR2");
-        Uuid otsiNodeUuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR2+OTSi".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        checkOtsiNode(tapiNodes.get(1), otsiNodeUuid, "switch", "SPDR-SA1-XPDR2");
-
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link> tapiLinks
-            = tapiFactory.getTapiLinks().values().stream()
-            .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
-            .collect(Collectors.toList());
-        checkTransitionalLink(tapiLinks.get(2), dsrNodeUuid, otsiNodeUuid,
-            "SPDR-SA1-XPDR2+iODU+XPDR2-NETWORK4", "SPDR-SA1-XPDR2+iOTSi+XPDR2-NETWORK4", "SPDR-SA1-XPDR2");
     }
 
     @Test
-    public void convertNodeForRoadmWhenNoOtnMuxAttached() {
-        ConvertORTopoToTapiFullTopo tapiFactory = new ConvertORTopoToTapiFullTopo(topologyUuid, tapiLink);
-        tapiFactory.convertRoadmNode(roadmA, openroadmNet);
-
-        assertEquals("Node list size should be 1", 1, tapiFactory.getTapiNodes().size());
-        assertEquals("Link list size should be empty", 0, tapiFactory.getTapiLinks().size());
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> tapiNodes
-            = tapiFactory.getTapiNodes().values().stream().collect(Collectors.toList());
+    void convertNodeForRoadmWhenNoOtnMuxAttached() {
+        ConvertORTopoToTapiFullTopo tapiFullFactory = new ConvertORTopoToTapiFullTopo(topologyUuid, tapiLink);
+        tapiFullFactory.convertRoadmNode(roadmA, openroadmNet, "Full");
+
+        assertEquals(1, tapiFullFactory.getTapiNodes().size(), "Node list size should be 1");
+        assertEquals(0, tapiFullFactory.getTapiLinks().size(), "Link list size should be empty");
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> tapiNodes
+            = tapiFullFactory.getTapiNodes().values().stream().collect(Collectors.toList());
         Uuid roadmNodeUuid = new Uuid(UUID.nameUUIDFromBytes((roadmA.getNodeId().getValue() + "+PHOTONIC_MEDIA")
             .getBytes(Charset.forName("UTF-8"))).toString());
-        checkOtsiNode(tapiNodes.get(0), roadmNodeUuid, "roadm", "ROADM-A1");
+        checkOtsiNode(tapiNodes.get(getNodeRank("ROADM-A1", tapiNodes)), roadmNodeUuid, "roadm", "ROADM-A1");
     }
 
     @Test
-    public void convertNodeForRoadmWhenRoadmNeighborAttached() {
-        ConvertORTopoToTapiFullTopo tapiFactory = new ConvertORTopoToTapiFullTopo(topologyUuid, tapiLink);
-        tapiFactory.convertRoadmNode(roadmA, openroadmNet);
-        tapiFactory.convertRoadmNode(roadmC, openroadmNet);
+    void convertNodeForRoadmWhenRoadmNeighborAttached() {
+        ConvertORTopoToTapiFullTopo tapiFullFactory = new ConvertORTopoToTapiFullTopo(topologyUuid, tapiLink);
+        tapiFullFactory.convertRoadmNode(roadmA, openroadmNet, "Full");
+        tapiFullFactory.convertRoadmNode(roadmC, openroadmNet, "Full");
 
         List<Link> rdmTordmLinkList = ortopoLinks.values().stream()
             .filter(lk -> lk.augmentation(Link1.class).getLinkType().equals(OpenroadmLinkType.ROADMTOROADM))
             .collect(Collectors.toList());
-        tapiFactory.convertRdmToRdmLinks(rdmTordmLinkList);
-
-        assertEquals("Node list size should be 2", 2, tapiFactory.getTapiNodes().size());
-        assertEquals("Link list size should be 1", 1, tapiFactory.getTapiLinks().size());
-
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> tapiNodes
-            = tapiFactory.getTapiNodes().values().stream().collect(Collectors.toList());
+        tapiFullFactory.convertRdmToRdmLinks(rdmTordmLinkList);
+
+        assertEquals(2, tapiFullFactory.getTapiNodes().size(), "Node list size should be 2");
+        assertEquals(1, tapiFullFactory.getTapiLinks().size(), "Link list size should be 1");
+
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> tapiNodes
+            = tapiFullFactory.getTapiNodes().values().stream().collect(Collectors.toList());
+        int myInt = 0;
+        for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node node : tapiNodes) {
+            if (node.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA)
+                && !node.getLayerProtocolName().contains(LayerProtocolName.DSR)) {
+                LOG.info("LOOP ROADM node found at rank {}, with Name {} and Uuid {}",
+                    myInt, node.getName().toString(), node.getUuid());
+            }
+            myInt++;
+        }
         Uuid roadmaNodeUuid = new Uuid(UUID.nameUUIDFromBytes((roadmA.getNodeId().getValue() + "+PHOTONIC_MEDIA")
             .getBytes(Charset.forName("UTF-8"))).toString());
-        checkOtsiNode(tapiNodes.get(1), roadmaNodeUuid, "roadm", "ROADM-A1");
+        LOG.info("ROADM node found at rank {} from getrank", getNodeRank("ROADM-A1", tapiNodes));
+        checkOtsiNode(tapiNodes.get(getNodeRank("ROADM-A1", tapiNodes)), roadmaNodeUuid, "roadm", "ROADM-A1");
 
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link> links
-            = tapiFactory.getTapiLinks().values().stream()
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link> links
+            = tapiFullFactory.getTapiLinks().values().stream()
             .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
             .collect(Collectors.toList());
         Uuid node1Uuid = new Uuid(UUID.nameUUIDFromBytes("ROADM-A1+PHOTONIC_MEDIA".getBytes(Charset.forName("UTF-8")))
             .toString());
         Uuid node2Uuid = new Uuid(UUID.nameUUIDFromBytes("ROADM-C1+PHOTONIC_MEDIA".getBytes(Charset.forName("UTF-8")))
             .toString());
-        Uuid tp1Uuid = new Uuid(UUID.nameUUIDFromBytes("ROADM-A1+PHOTONIC_MEDIA+DEG2-TTP-TXRX"
+        Uuid tp1Uuid = new Uuid(UUID.nameUUIDFromBytes("ROADM-A1+PHOTONIC_MEDIA_OTS+DEG2-TTP-TXRX"
             .getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid tp2Uuid = new Uuid(UUID.nameUUIDFromBytes(("ROADM-C1+PHOTONIC_MEDIA+DEG1-TTP-TXRX")
+        Uuid tp2Uuid = new Uuid(UUID.nameUUIDFromBytes(("ROADM-C1+PHOTONIC_MEDIA_OTS+DEG1-TTP-TXRX")
             .getBytes(Charset.forName("UTF-8"))).toString());
         Uuid linkUuid =
             new Uuid(UUID.nameUUIDFromBytes(
-                "ROADM-C1+PHOTONIC_MEDIA+DEG1-TTP-TXRXtoROADM-A1+PHOTONIC_MEDIA+DEG2-TTP-TXRX"
+                "ROADM-C1+PHOTONIC_MEDIA_OTS+DEG1-TTP-TXRXtoROADM-A1+PHOTONIC_MEDIA_OTS+DEG2-TTP-TXRX"
                     .getBytes(Charset.forName("UTF-8"))).toString());
         checkOmsLink(links.get(0), node1Uuid, node2Uuid, tp1Uuid, tp2Uuid, linkUuid,
-            "ROADM-C1+PHOTONIC_MEDIA+DEG1-TTP-TXRXtoROADM-A1+PHOTONIC_MEDIA+DEG2-TTP-TXRX");
+            "ROADM-C1+PHOTONIC_MEDIA_OTS+DEG1-TTP-TXRXtoROADM-A1+PHOTONIC_MEDIA_OTS+DEG2-TTP-TXRX");
     }
 
     @Test
-    public void convertNodeForRoadmWhenOtnMuxAttached() {
-        ConvertORTopoToTapiFullTopo tapiFactory = new ConvertORTopoToTapiFullTopo(topologyUuid, tapiLink);
+    void convertNodeForRoadmWhenOtnMuxAttached() {
+        ConvertORTopoToTapiFullTopo tapiFullFactory = new ConvertORTopoToTapiFullTopo(topologyUuid, tapiLink);
+        ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(topologyUuid);
         List<String> networkPortListA = new ArrayList<>();
         for (TerminationPoint tp : otnMuxA.augmentation(Node1.class).getTerminationPoint().values()) {
             if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
@@ -560,7 +448,8 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
             }
         }
         tapiFactory.convertNode(otnMuxA, networkPortListA);
-        tapiFactory.convertRoadmNode(roadmA, openroadmNet);
+        tapiFullFactory.setTapiNodes(tapiFactory.getTapiNodes());
+        tapiFullFactory.convertRoadmNode(roadmA, openroadmNet, "Full");
         List<Link> xponderOutLinkList = ortopoLinks.values().stream()
             .filter(lk -> lk.augmentation(Link1.class).getLinkType().equals(OpenroadmLinkType.XPONDEROUTPUT))
             .filter(lk1 -> ((lk1.getSource().getSourceNode().equals(otnMuxA.getNodeId())
@@ -576,50 +465,57 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
                     || lk1.getDestination().getDestNode().getValue().contains(roadmA.getNodeId().getValue()))))
             .collect(Collectors.toList());
         xponderInLinkList.addAll(xponderOutLinkList);
-        tapiFactory.convertXpdrToRdmLinks(xponderInLinkList);
-        assertEquals("Node list size should be 3", 3, tapiFactory.getTapiNodes().size());
-        assertEquals("Link list size should be 2", 2, tapiFactory.getTapiLinks().size());
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> tapiNodes
-            = tapiFactory.getTapiNodes().values().stream()
+        tapiFullFactory.convertXpdrToRdmLinks(xponderInLinkList);
+        assertEquals(2, tapiFullFactory.getTapiNodes().size(),
+            "Node list size should be 2 (XPDR, DSR-ODU merged; ROADM)");
+        assertEquals(1, tapiFullFactory.getTapiLinks().size(),
+            "Link list size should be 1 : no more transitional link");
+        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey,
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> nodeMap =
+            tapiFactory.getTapiNodes();
+        nodeMap.putAll(tapiFullFactory.getTapiNodes());
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> tapiNodes
+            = nodeMap.values().stream()
             .sorted((n1, n2) -> n1.getUuid().getValue().compareTo(n2.getUuid().getValue()))
             .collect(Collectors.toList());
         Uuid roadmNodeUuid = new Uuid(UUID.nameUUIDFromBytes((roadmA.getNodeId().getValue() + "+PHOTONIC_MEDIA")
             .getBytes(Charset.forName("UTF-8"))).toString());
-        checkOtsiNode(tapiNodes.get(1), roadmNodeUuid, "roadm", "ROADM-A1");
+        checkOtsiNode(tapiNodes.get(getNodeRank("ROADM-A1", tapiNodes)), roadmNodeUuid, "roadm", "ROADM-A1");
 
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link> links
-            = tapiFactory.getTapiLinks().values().stream()
-            .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
-            .collect(Collectors.toList());
-        Uuid node1Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+OTSi".getBytes(Charset.forName("UTF-8")))
+        Uuid node1Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+XPONDER".getBytes(Charset.forName("UTF-8")))
             .toString());
         Uuid node2Uuid = new Uuid(UUID.nameUUIDFromBytes("ROADM-A1+PHOTONIC_MEDIA".getBytes(Charset.forName("UTF-8")))
             .toString());
-        Uuid tp1Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+PHOTONIC_MEDIA+XPDR1-NETWORK1"
+        LOG.info("ROADM-A1+PHOTONIC_MEDIA UUID is {}", node2Uuid);
+        Uuid tp1Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+PHOTONIC_MEDIA_OTS+XPDR1-NETWORK1"
             .getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid tp2Uuid = new Uuid(UUID.nameUUIDFromBytes(("ROADM-A1+PHOTONIC_MEDIA+SRG1-PP2-TXRX")
+        Uuid tp2Uuid = new Uuid(UUID.nameUUIDFromBytes(("ROADM-A1+PHOTONIC_MEDIA_OTS+SRG1-PP2-TXRX")
             .getBytes(Charset.forName("UTF-8"))).toString());
         Uuid linkUuid =
             new Uuid(UUID.nameUUIDFromBytes(
-                "ROADM-A1+PHOTONIC_MEDIA+SRG1-PP2-TXRXtoSPDR-SA1-XPDR1+PHOTONIC_MEDIA+XPDR1-NETWORK1"
+                "ROADM-A1+PHOTONIC_MEDIA_OTS+SRG1-PP2-TXRXtoSPDR-SA1-XPDR1+PHOTONIC_MEDIA_OTS+XPDR1-NETWORK1"
                     .getBytes(Charset.forName("UTF-8"))).toString());
-        checkXpdrRdmLink(links.get(1), node1Uuid, node2Uuid, tp1Uuid, tp2Uuid, linkUuid,
-            "ROADM-A1+PHOTONIC_MEDIA+SRG1-PP2-TXRXtoSPDR-SA1-XPDR1+PHOTONIC_MEDIA+XPDR1-NETWORK1");
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link> links
+            = tapiFullFactory.getTapiLinks().values().stream()
+            .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
+            .collect(Collectors.toList());
+        checkXpdrRdmLink(links.get(0), node1Uuid, node2Uuid, tp1Uuid, tp2Uuid, linkUuid,
+            "ROADM-A1+PHOTONIC_MEDIA_OTS+SRG1-PP2-TXRXtoSPDR-SA1-XPDR1+PHOTONIC_MEDIA_OTS+XPDR1-NETWORK1");
     }
 
-    private void checkDsrNode(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node node,
-                              Uuid nodeUuid, String dsrNodeType, String nodeId) {
-        assertEquals("incorrect node uuid", nodeUuid, node.getUuid());
-        assertEquals("incorrect node name", nodeId + "+DSR", node.getName().get(
-            new NameKey("dsr/odu node name")).getValue());
-        assertEquals("administrative state should be UNLOCKED",
-            AdministrativeState.UNLOCKED, node.getAdministrativeState());
-        assertEquals("life-cycle state should be INSTALLED", LifecycleState.INSTALLED, node.getLifecycleState());
-        assertEquals("operational state should be ENABLED", OperationalState.ENABLED, node.getOperationalState());
+    private void checkDsrNode(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node node,
+            Uuid node9Uuid, String dsrNodeType, String nodeId) {
+        assertEquals(node9Uuid, node.getUuid(), "incorrect node uuid");
+        assertEquals(nodeId + "+XPONDER", node.getName().get(new NameKey("dsr/odu node name")).getValue(),
+            "incorrect node name");
+        assertEquals(AdministrativeState.UNLOCKED, node.getAdministrativeState(),
+            "administrative state should be UNLOCKED");
+        assertEquals(LifecycleState.INSTALLED, node.getLifecycleState(), "life-cycle state should be INSTALLED");
+        assertEquals(OperationalState.ENABLED, node.getOperationalState(), "operational state should be ENABLED");
         assertThat("one value-name should be 'dsr/odu node name'",
             new ArrayList<>(node.nonnullName().keySet()), hasItem(new NameKey("dsr/odu node name")));
-        assertEquals("dsr node should manage 2 protocol layers : dsr and odu",
-            2, node.getLayerProtocolName().size());
+        assertEquals(4, node.getLayerProtocolName().size(), "dsr node should manage 4 protocol layers : dsr and odu"
+            + " DIGITALOTN, PHOTONICMEDIA");
         assertThat("dsr node should manage 2 protocol layers : dsr and odu",
             node.getLayerProtocolName(), hasItems(LayerProtocolName.DSR, LayerProtocolName.ODU));
         List<OwnedNodeEdgePoint> inepsN = node.nonnullOwnedNodeEdgePoint().values().stream()
@@ -637,9 +533,9 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
                     .filter(n -> n.getName().containsKey(new NameKey("NodeEdgePoint_C")))
                     .sorted((nep1, nep2) -> nep1.getUuid().getValue().compareTo(nep2.getUuid().getValue()))
                     .collect(Collectors.toList());
-                assertEquals("Switch-DSR node should have 4 eNEPs network", 4, enepsN.size());
-                assertEquals("Switch-DSR node should have 4 iNEPs network", 4, inepsN.size());
-                assertEquals("Switch-DSR node should have 4 NEPs client", 4, nepsC.size());
+                assertEquals(4, enepsN.size(), "Switch-DSR node should have 4 eNEPs network");
+                assertEquals(4, inepsN.size(), "Switch-DSR node should have 4 iNEPs network");
+                assertEquals(4, nepsC.size(), "Switch-DSR node should have 4 NEPs client");
                 OwnedNodeEdgePoint nep1 = nepsC.get(2);
                 Uuid client4NepUuid = new Uuid(
                     UUID.nameUUIDFromBytes((nodeId + "+DSR+XPDR2-CLIENT4").getBytes(Charset.forName("UTF-8")))
@@ -658,16 +554,18 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
                 List<NodeRuleGroup> nrgList = node.nonnullNodeRuleGroup().values().stream()
                     .sorted((nrg1, nrg2) -> nrg1.getUuid().getValue().compareTo(nrg2.getUuid().getValue()))
                     .collect(Collectors.toList());
-                checkNodeRuleGroupForSwitchDSR(nrgList, client4NepUuid, enetworkNepUuid, nodeUuid);
+// keep trace of the previous test performed before the structure of the NRG was modified
+//                checkNodeRuleGroupForSwitchDSR(nrgList, client4NepUuid, enetworkNepUuid, node9Uuid);
+                checkNodeRuleGroupForSwitchDSR(nrgList, client4NepUuid, inetworkNepUuid, node9Uuid);
                 break;
             case "mux":
                 nepsC = node.nonnullOwnedNodeEdgePoint().values().stream()
                     .filter(n -> n.getName().containsKey(new NameKey("NodeEdgePoint_C")))
                     .sorted((nep3, nep4) -> nep3.getUuid().getValue().compareTo(nep4.getUuid().getValue()))
                     .collect(Collectors.toList());
-                assertEquals("Mux-DSR node should have 4 eNEP network", 4, enepsN.size());
-                assertEquals("Mux-DSR node should have 1 iNEP network", 1, inepsN.size());
-                assertEquals("Mux-DSR node should have 4 NEPs client", 4, nepsC.size());
+                assertEquals(4, enepsN.size(), "Mux-DSR node should have 4 eNEP network");
+                assertEquals(1, inepsN.size(), "Mux-DSR node should have 1 iNEP network");
+                assertEquals(4, nepsC.size(), "Mux-DSR node should have 4 NEPs client");
                 OwnedNodeEdgePoint nep3 = nepsC.get(2);
                 Uuid client3NepUuid = new Uuid(
                     UUID.nameUUIDFromBytes((nodeId + "+DSR+XPDR1-CLIENT3").getBytes(Charset.forName("UTF-8")))
@@ -675,28 +573,30 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
                 checkNepClient10G(nep3, client3NepUuid, nodeId + "+DSR+XPDR1-CLIENT3", "NodeEdgePoint_C");
                 OwnedNodeEdgePoint enep4 = enepsN.get(3);
                 OwnedNodeEdgePoint inep4 = inepsN.get(0);
-                Uuid enetworkNepUuid2 = new Uuid(
+                Uuid eclientNepUuid2 = new Uuid(
                     UUID.nameUUIDFromBytes((nodeId + "+eODU+XPDR1-CLIENT3").getBytes(Charset.forName("UTF-8")))
                         .toString());
                 Uuid inetworkNepUuid2 = new Uuid(
                     UUID.nameUUIDFromBytes((nodeId + "+iODU+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
                         .toString());
-                checkNepeODU4(enep4, enetworkNepUuid2, nodeId + "+eODU+XPDR1-CLIENT3", "eNodeEdgePoint_N", false);
+                checkNepeODU4(enep4, eclientNepUuid2, nodeId + "+eODU+XPDR1-CLIENT3", "eNodeEdgePoint_N", false);
                 checkNepNetworkODU4(inep4, inetworkNepUuid2, nodeId + "+iODU+XPDR1-NETWORK1", "iNodeEdgePoint_N",
                     true);
                 List<NodeRuleGroup> nrgList2 = node.nonnullNodeRuleGroup().values().stream()
                     .sorted((nrg1, nrg2) -> nrg1.getUuid().getValue().compareTo(nrg2.getUuid().getValue()))
                     .collect(Collectors.toList());
-                checkNodeRuleGroupForMuxDSR(nrgList2, client3NepUuid, enetworkNepUuid2, nodeUuid);
+// keep trace of the previous test performed before the structure of the NRG was modified
+//                checkNodeRuleGroupForMuxDSR(nrgList2, client3NepUuid, eclientNepUuid2, node9Uuid);
+                checkNodeRuleGroupForMuxDSR(nrgList2, client3NepUuid, inetworkNepUuid2, node9Uuid);
                 break;
             case "tpdr":
                 nepsC = node.nonnullOwnedNodeEdgePoint().values().stream()
                     .filter(n -> n.getName().containsKey(new NameKey("100G-tpdr")))
                     .sorted((nep5, nep6) -> nep5.getUuid().getValue().compareTo(nep6.getUuid().getValue()))
                     .collect(Collectors.toList());
-                assertEquals("Tpdr-DSR node should have 2 eNEPs network", 2, enepsN.size());
-                assertEquals("Tpdr-DSR node should have 2 iNEPs network", 2, inepsN.size());
-                assertEquals("Tpdr-DSR node should have 2 NEPs client", 2, nepsC.size());
+                assertEquals(2, enepsN.size(), "Tpdr-DSR node should have 2 eNEPs network");
+                assertEquals(2, inepsN.size(), "Tpdr-DSR node should have 2 iNEPs network");
+                assertEquals(2, nepsC.size(), "Tpdr-DSR node should have 2 NEPs client");
                 OwnedNodeEdgePoint nep5 = nepsC.get(0);
                 Uuid client1NepUuid = new Uuid(
                     UUID.nameUUIDFromBytes((nodeId + "+DSR+XPDR1-CLIENT1").getBytes(Charset.forName("UTF-8")))
@@ -716,7 +616,9 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
                 List<NodeRuleGroup> nrgList3 = node.nonnullNodeRuleGroup().values().stream()
                     .sorted((nrg1, nrg2) -> nrg1.getUuid().getValue().compareTo(nrg2.getUuid().getValue()))
                     .collect(Collectors.toList());
-                checkNodeRuleGroupForTpdrDSR(nrgList3, client1NepUuid, enetworkNepUuid3, nodeUuid);
+// keep trace of the previous test performed before the structure of the NRG was modified
+//                checkNodeRuleGroupForTpdrDSR(nrgList3, client1NepUuid, enetworkNepUuid3, node9Uuid);
+                checkNodeRuleGroupForTpdrDSR(nrgList3, client1NepUuid, inetworkNepUuid3, node9Uuid);
                 break;
             default:
                 fail();
@@ -725,20 +627,24 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
     }
 
     private void checkOtsiNode(
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node node,
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node node,
             Uuid nodeUuid, String otsiNodeType, String nodeId) {
-        assertEquals("incorrect node uuid", nodeUuid, node.getUuid());
+        if (!node.getUuid().equals(nodeUuid)) {
+            LOG.info("ERRORUUID on Node.getNodeId {}, NodeId {}", node.getName().toString(), nodeId);
+            LOG.info("ERRORUUID TapiUuid {}, transmitted Node Uuid {}", node.getUuid(), nodeUuid);
+        }
+        assertEquals(nodeUuid, node.getUuid(), "incorrect node uuid");
         List<OwnedNodeEdgePoint> nepsI = null;
         List<OwnedNodeEdgePoint> nepsE = null;
         List<OwnedNodeEdgePoint> nepsP = null;
-        List<OwnedNodeEdgePoint> nepsMc = null;
-        List<OwnedNodeEdgePoint> nepsOtsimc = null;
+        List<OwnedNodeEdgePoint> nepsOMS = null;
+        List<OwnedNodeEdgePoint> nepsOTS = null;
         List<OwnedNodeEdgePoint> nepsPhot = null;
         if (!otsiNodeType.equals("roadm")) {
-            assertEquals("incorrect node name", nodeId + "+OTSi", node.getName().get(
-                new NameKey("otsi node name")).getValue());
+            assertEquals(nodeId + "+XPONDER", node.getName().get(new NameKey("dsr/odu node name")).getValue(),
+                "incorrect node name");
             assertThat("one value-name should be 'dsr/odu node name'",
-                new ArrayList<>(node.nonnullName().keySet()), hasItem(new NameKey("otsi node name")));
+                new ArrayList<>(node.nonnullName().keySet()), hasItem(new NameKey("dsr/odu node name")));
             nepsI = node.nonnullOwnedNodeEdgePoint().values().stream()
                 .filter(n -> n.getName().containsKey(new NameKey("iNodeEdgePoint")))
                 .sorted((nep1, nep2) -> nep1.getUuid().getValue().compareTo(nep2.getUuid().getValue()))
@@ -752,37 +658,41 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
                 .sorted((nep1, nep2) -> nep1.getUuid().getValue().compareTo(nep2.getUuid().getValue()))
                 .collect(Collectors.toList());
         } else {
-            assertEquals("incorrect node name", nodeId + "+PHOTONIC_MEDIA", node.getName().get(
-                new NameKey("roadm node name")).getValue());
+            assertEquals(nodeId + "+PHOTONIC_MEDIA", node.getName().get(new NameKey("roadm node name")).getValue(),
+                "incorrect node name");
             assertThat("one value-name should be 'dsr/odu node name'",
                 new ArrayList<>(node.nonnullName().keySet()), hasItem(new NameKey("roadm node name")));
-            nepsMc = node.nonnullOwnedNodeEdgePoint().values().stream()
-                .filter(n -> n.getName().containsKey(new NameKey("MEDIA_CHANNELNodeEdgePoint")))
+            nepsOMS = node.nonnullOwnedNodeEdgePoint().values().stream()
+                .filter(n -> n.getName().containsKey(new NameKey("PHOTONIC_MEDIA_OMSNodeEdgePoint")))
                 .sorted((nep1, nep2) -> nep1.getUuid().getValue().compareTo(nep2.getUuid().getValue()))
                 .collect(Collectors.toList());
-            nepsOtsimc = node.nonnullOwnedNodeEdgePoint().values().stream()
-                .filter(n -> n.getName().containsKey(new NameKey("OTSi_MEDIA_CHANNELNodeEdgePoint")))
+            nepsOTS = node.nonnullOwnedNodeEdgePoint().values().stream()
+                .filter(n -> n.getName().containsKey(new NameKey("PHOTONIC_MEDIA_OTSNodeEdgePoint")))
                 .sorted((nep1, nep2) -> nep1.getUuid().getValue().compareTo(nep2.getUuid().getValue()))
                 .collect(Collectors.toList());
             nepsPhot = node.nonnullOwnedNodeEdgePoint().values().stream()
-                .filter(n -> n.getName().containsKey(new NameKey("PHOTONIC_MEDIANodeEdgePoint")))
+                .filter(n -> n.getName().containsKey(new NameKey("PHOTONIC_MEDIA_OMSNodeEdgePoint")))
                 .sorted((nep1, nep2) -> nep1.getUuid().getValue().compareTo(nep2.getUuid().getValue()))
                 .collect(Collectors.toList());
+            nepsPhot.addAll(node.nonnullOwnedNodeEdgePoint().values().stream()
+                .filter(n -> n.getName().containsKey(new NameKey("PHOTONIC_MEDIA_OTSNodeEdgePoint")))
+                .sorted((nep1, nep2) -> nep1.getUuid().getValue().compareTo(nep2.getUuid().getValue()))
+                .collect(Collectors.toList()));
         }
-        assertEquals("administrative state should be UNLOCKED",
-            AdministrativeState.UNLOCKED, node.getAdministrativeState());
-        assertEquals("life-cycle state should be INSTALLED", LifecycleState.INSTALLED, node.getLifecycleState());
-        assertEquals("operational state should be ENABLED", OperationalState.ENABLED, node.getOperationalState());
-        assertEquals("otsi node should manage a single protocol layer : PHOTONIC_MEDIA",
-            1, node.getLayerProtocolName().size());
-        assertEquals("otsi node should manage a single protocol layer : PHOTONIC_MEDIA",
-            LayerProtocolName.PHOTONICMEDIA, node.getLayerProtocolName().get(0));
+        assertEquals(AdministrativeState.UNLOCKED, node.getAdministrativeState(),
+            "administrative state should be UNLOCKED");
+        assertEquals(LifecycleState.INSTALLED, node.getLifecycleState(), "life-cycle state should be INSTALLED");
+        assertEquals(OperationalState.ENABLED, node.getOperationalState(), "operational state should be ENABLED");
+        assertEquals(1, node.getLayerProtocolName().size(),
+            "otsi node should manage a single protocol layer : PHOTONIC_MEDIA");
+        assertEquals(LayerProtocolName.PHOTONICMEDIA, node.getLayerProtocolName().stream().findFirst().orElseThrow(),
+            "otsi node should manage a single protocol layer : PHOTONIC_MEDIA");
 
         switch (otsiNodeType) {
             case "switch":
-                assertEquals("Switch-OTSi node should have 4 eNEPs", 4, nepsE.size());
-                assertEquals("Switch-OTSi node should have 4 iNEPs", 4, nepsI.size());
-                assertEquals("Switch-OTSi node should have 4 photNEPs", 4, nepsP.size());
+                assertEquals(4, nepsE.size(), "Switch-OTSi node should have 4 eNEPs");
+                assertEquals(4, nepsI.size(), "Switch-OTSi node should have 4 iNEPs");
+                assertEquals(4, nepsP.size(), "Switch-OTSi node should have 4 photNEPs");
                 OwnedNodeEdgePoint nep1 = nepsI.get(1);
                 Uuid inepUuid = new Uuid(
                     UUID.nameUUIDFromBytes((nodeId + "+iOTSi+XPDR2-NETWORK2").getBytes(Charset.forName("UTF-8")))
@@ -790,9 +700,11 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
                 checkNepOtsiNode(nep1, inepUuid, nodeId + "+iOTSi+XPDR2-NETWORK2", "iNodeEdgePoint", true);
                 OwnedNodeEdgePoint nep2 = nepsE.get(0);
                 Uuid enepUuid = new Uuid(
-                    UUID.nameUUIDFromBytes((nodeId + "+eOTSi+XPDR2-NETWORK2").getBytes(Charset.forName("UTF-8")))
+                    UUID.nameUUIDFromBytes((nodeId + "+PHOTONIC_MEDIA_OTS+XPDR2-NETWORK2")
+                        .getBytes(Charset.forName("UTF-8")))
                         .toString());
-                checkNepOtsiNode(nep2, enepUuid, nodeId + "+eOTSi+XPDR2-NETWORK2", "eNodeEdgePoint", false);
+                checkNepOtsiNode(nep2, enepUuid, nodeId + "+PHOTONIC_MEDIA_OTS+XPDR2-NETWORK2",
+                    "eNodeEdgePoint", false);
                 OwnedNodeEdgePoint photNep = nepsP.get(1);
                 Uuid pnepUuid = new Uuid(
                     UUID.nameUUIDFromBytes((nodeId + "+PHOTONIC_MEDIA+XPDR2-NETWORK2")
@@ -805,14 +717,16 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
                 checkNodeRuleGroupForSwitchOTSi(nrgList, enepUuid, inepUuid, nodeUuid);
                 break;
             case "mux":
-                assertEquals("Mux-OTSi node should have 1 eNEP", 1, nepsE.size());
-                assertEquals("Mux-OTSi node should have 1 iNEPs", 1, nepsI.size());
-                assertEquals("Mux-OTSi node should have 1 photNEPs", 1, nepsP.size());
+                assertEquals(1, nepsE.size(), "Mux-OTSi node should have 1 eNEP");
+                assertEquals(1, nepsI.size(), "Mux-OTSi node should have 1 iNEPs");
+                assertEquals(1, nepsP.size(), "Mux-OTSi node should have 1 photNEPs");
                 OwnedNodeEdgePoint nep3 = nepsE.get(0);
                 Uuid enepUuid2 = new Uuid(
-                    UUID.nameUUIDFromBytes((nodeId + "+eOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
+                    UUID.nameUUIDFromBytes((nodeId + "+PHOTONIC_MEDIA_OTS+XPDR1-NETWORK1")
+                        .getBytes(Charset.forName("UTF-8")))
                         .toString());
-                checkNepOtsiNode(nep3, enepUuid2, nodeId + "+eOTSi+XPDR1-NETWORK1", "eNodeEdgePoint", false);
+                checkNepOtsiNode(nep3, enepUuid2, nodeId + "+PHOTONIC_MEDIA_OTS+XPDR1-NETWORK1",
+                    "eNodeEdgePoint", false);
                 OwnedNodeEdgePoint nep4 = nepsI.get(0);
                 Uuid inepUuid2 = new Uuid(
                     UUID.nameUUIDFromBytes((nodeId + "+iOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
@@ -830,14 +744,16 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
                 checkNodeRuleGroupForMuxOTSi(nrgList2, enepUuid2, inepUuid2, nodeUuid);
                 break;
             case "tpdr":
-                assertEquals("Tpdr-OTSi node should have 2 eNEPs", 2, nepsE.size());
-                assertEquals("Tpdr-OTSi node should have 2 iNEPs", 2, nepsI.size());
-                assertEquals("Tpdr-OTSi node should have 2 photNEPs", 2, nepsP.size());
+                assertEquals(2, nepsE.size(), "Tpdr-OTSi node should have 2 eNEPs");
+                assertEquals(2, nepsI.size(), "Tpdr-OTSi node should have 2 iNEPs");
+                assertEquals(2, nepsP.size(), "Tpdr-OTSi node should have 2 photNEPs");
                 OwnedNodeEdgePoint nep5 = nepsE.get(0);
                 Uuid enepUuid3 = new Uuid(
-                    UUID.nameUUIDFromBytes((nodeId + "+eOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
+                    UUID.nameUUIDFromBytes((nodeId + "+PHOTONIC_MEDIA_OTS+XPDR1-NETWORK1")
+                        .getBytes(Charset.forName("UTF-8")))
                         .toString());
-                checkNepOtsiNode(nep5, enepUuid3, nodeId + "+eOTSi+XPDR1-NETWORK1", "eNodeEdgePoint", false);
+                checkNepOtsiNode(nep5, enepUuid3, nodeId + "+PHOTONIC_MEDIA_OTS+XPDR1-NETWORK1",
+                    "eNodeEdgePoint", false);
                 OwnedNodeEdgePoint nep6 = nepsI.get(0);
                 Uuid inepUuid3 = new Uuid(
                     UUID.nameUUIDFromBytes((nodeId + "+iOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
@@ -855,47 +771,46 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
                 checkNodeRuleGroupForTpdrOTSi(nrgList3, enepUuid3, inepUuid3, nodeUuid);
                 break;
             case "roadm":
-                assertEquals("Roadm node should have 10 MC NEPs", 10, nepsMc.size());
-                assertEquals("Roadm node should have 10 OTSiMC NEPs", 10, nepsOtsimc.size());
-                assertEquals("Roadm node should have 10 PHOT_MEDIA NEPs", 10, nepsPhot.size());
+// Keep trace of MC NEP test to be restored after the new policy for creating NEP is applied
+//                assertEquals(0, nepsMc.size(), "MC NEP no more configured, Roadm node should have 0 MC NEPs");
+//                assertEquals(0, nepsOtsimc.size(), "Roadm node should have 10 OTSiMC NEPs");
+                assertEquals(12, nepsPhot.size(), "Roadm node should have 12 PHOT_MEDIA NEPs (2x4 OTS +2x(OTS+OMS)");
                 // For Degree node
-                OwnedNodeEdgePoint nep7 = nepsMc.get(6);
+                OwnedNodeEdgePoint nep7 = nepsOMS.get(getRank("DEG1-TTP", nepsOMS));
                 Uuid mcnepUuid3 = new Uuid(
-                    UUID.nameUUIDFromBytes((nodeId + "+MEDIA_CHANNEL+DEG1-TTP-TXRX").getBytes(Charset.forName("UTF-8")))
-                        .toString());
-                checkNepOtsiRdmNode(nep7, mcnepUuid3, nodeId + "+MEDIA_CHANNEL+DEG1-TTP-TXRX",
-                    "MEDIA_CHANNELNodeEdgePoint", false);
-                OwnedNodeEdgePoint nep8 = nepsOtsimc.get(0);
-                Uuid otmcnepUuid3 = new Uuid(UUID.nameUUIDFromBytes((nodeId + "+OTSi_MEDIA_CHANNEL+DEG1-TTP-TXRX")
+                    UUID.nameUUIDFromBytes((nodeId + "+PHOTONIC_MEDIA_OMS+DEG1-TTP-TXRX").getBytes(Charset
+                        .forName("UTF-8"))).toString());
+                checkNepOtsiRdmNode(nep7, mcnepUuid3, nodeId + "+PHOTONIC_MEDIA_OMS+DEG1-TTP-TXRX",
+                    "PHOTONIC_MEDIA_OMSNodeEdgePoint", false);
+                OwnedNodeEdgePoint nep8 = nepsOTS.get(getRank("DEG1-TTP", nepsOTS));
+                Uuid otmcnepUuid3 = new Uuid(UUID.nameUUIDFromBytes((nodeId + "+PHOTONIC_MEDIA_OTS+DEG1-TTP-TXRX")
                     .getBytes(Charset.forName("UTF-8"))).toString());
-                checkNepOtsiRdmNode(nep8, otmcnepUuid3, nodeId + "+OTSi_MEDIA_CHANNEL+DEG1-TTP-TXRX",
-                    "OTSi_MEDIA_CHANNELNodeEdgePoint", false);
-                OwnedNodeEdgePoint photNep3 = nepsPhot.get(3);
-                Uuid pnep3Uuid = new Uuid(
-                    UUID.nameUUIDFromBytes((nodeId + "+PHOTONIC_MEDIA+DEG1-TTP-TXRX")
+                checkNepOtsiRdmNode(nep8, otmcnepUuid3, nodeId + "+PHOTONIC_MEDIA_OTS+DEG1-TTP-TXRX",
+                    "PHOTONIC_MEDIA_OTSNodeEdgePoint", false);
+                OwnedNodeEdgePoint omsNep3 = nepsOMS.get(getRank("DEG1-TTP", nepsOMS));
+                Uuid omsNep3Uuid = new Uuid(
+                    UUID.nameUUIDFromBytes((nodeId + "+PHOTONIC_MEDIA_OMS+DEG1-TTP-TXRX")
                         .getBytes(Charset.forName("UTF-8"))).toString());
-                checkNepOtsiRdmNode(photNep3, pnep3Uuid, nodeId + "+PHOTONIC_MEDIA+DEG1-TTP-TXRX",
-                    "PHOTONIC_MEDIANodeEdgePoint", false);
+                checkNepOtsiRdmNode(omsNep3, omsNep3Uuid, nodeId + "+PHOTONIC_MEDIA_OMS+DEG1-TTP-TXRX",
+                    "PHOTONIC_MEDIA_OMSNodeEdgePoint", false);
                 // For srg node
-                OwnedNodeEdgePoint nep9 = nepsMc.get(0);
-                Uuid mcnepUuid4 = new Uuid(UUID.nameUUIDFromBytes((nodeId + "+MEDIA_CHANNEL+SRG1-PP1-TXRX")
+                OwnedNodeEdgePoint nep10 = nepsOTS.get(getRank("SRG1-PP1", nepsOTS));
+                Uuid otsnepUuid4 = new Uuid(UUID.nameUUIDFromBytes((nodeId + "+PHOTONIC_MEDIA_OTS+SRG1-PP1-TXRX")
                     .getBytes(Charset.forName("UTF-8"))).toString());
-                checkNepOtsiRdmNode(nep9, mcnepUuid4, nodeId + "+MEDIA_CHANNEL+SRG1-PP1-TXRX",
-                    "MEDIA_CHANNELNodeEdgePoint", true);
-                OwnedNodeEdgePoint nep10 = nepsOtsimc.get(9);
-                Uuid otmcnepUuid4 = new Uuid(UUID.nameUUIDFromBytes((nodeId + "+OTSi_MEDIA_CHANNEL+SRG1-PP1-TXRX")
+                checkNepOtsiRdmNode(nep10, otsnepUuid4, nodeId + "+PHOTONIC_MEDIA_OTS+SRG1-PP1-TXRX",
+                    "PHOTONIC_MEDIA_OTSNodeEdgePoint", false);
+                OwnedNodeEdgePoint otsNep4 = nepsOTS.get(getRank("SRG1-PP3", nepsOTS));
+                Uuid otsNep4Uuid = new Uuid(UUID.nameUUIDFromBytes((nodeId + "+PHOTONIC_MEDIA_OTS+SRG1-PP3-TXRX")
                     .getBytes(Charset.forName("UTF-8"))).toString());
-                checkNepOtsiRdmNode(nep10, otmcnepUuid4, nodeId + "+OTSi_MEDIA_CHANNEL+SRG1-PP1-TXRX",
-                    "OTSi_MEDIA_CHANNELNodeEdgePoint", false);
-                OwnedNodeEdgePoint photNep4 = nepsPhot.get(4);
-                Uuid pnep4Uuid = new Uuid(UUID.nameUUIDFromBytes((nodeId + "+PHOTONIC_MEDIA+SRG1-PP1-TXRX")
-                    .getBytes(Charset.forName("UTF-8"))).toString());
-                checkNepOtsiRdmNode(photNep4, pnep4Uuid, nodeId + "+PHOTONIC_MEDIA+SRG1-PP1-TXRX",
-                    "PHOTONIC_MEDIANodeEdgePoint", false);
+                checkNepOtsiRdmNode(otsNep4, otsNep4Uuid, nodeId + "+PHOTONIC_MEDIA_OTS+SRG1-PP3-TXRX",
+                    "PHOTONIC_MEDIA_OTSNodeEdgePoint", false);
                 List<NodeRuleGroup> nrgList4 = node.nonnullNodeRuleGroup().values().stream()
-                    .sorted((nrg1, nrg2) -> nrg1.getUuid().getValue().compareTo(nrg2.getUuid().getValue()))
+                    .sorted((nrg1, nrg2) -> nrg1.getName().entrySet().iterator().next().getValue().toString()
+                        .compareTo(nrg2.getName().entrySet().iterator().next().getValue().toString()))
                     .collect(Collectors.toList());
-                checkNodeRuleGroupForRdm(nrgList4, 30);
+                LOG.info("NODERULEGROUP List nrgLIst4 is as follows {}", nrgList4.toString());
+                List<Integer> nepNumber = new ArrayList<>(List.of(2, 4, 4));
+                checkNodeRuleGroupForRdm(nrgList4, nepNumber);
                 break;
             default:
                 fail();
@@ -904,218 +819,241 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
     }
 
     private void checkNepClient10G(OwnedNodeEdgePoint nep, Uuid nepUuid, String portName, String nepName) {
-        assertEquals("bad uuid for " + portName, nepUuid, nep.getUuid());
+        assertEquals(nepUuid, nep.getUuid(), "bad uuid for " + portName);
         List<Name> nameList = new ArrayList<>(nep.nonnullName().values());
         Name name = nameList.get(0);
-        assertEquals("value of client nep should be '" + portName + "'",
-            portName, name.getValue());
-        assertEquals("value-name of client nep for '" + portName + "' should be '" + nepName + "'",
-            nepName, name.getValueName());
-        assertEquals("Client nep should support 3 kind of cep",
-            3, nep.getSupportedCepLayerProtocolQualifier().size());
+        assertEquals(portName, name.getValue(), "value of client nep should be '" + portName + "'");
+        assertEquals(nepName, name.getValueName(),
+            "value-name of client nep for '" + portName + "' should be '" + nepName + "'");
+        LOG.info("checkNEPClient10G-NEP {} has following supported CEP {}", nepName, nep
+            .getSupportedCepLayerProtocolQualifierInstances().toString());
+        assertEquals(3, nep.getSupportedCepLayerProtocolQualifierInstances()
+            .size(), "Client nep should support 3 kind of cep");
+        List<LAYERPROTOCOLQUALIFIER> lpql = new ArrayList<>();
+        List<SupportedCepLayerProtocolQualifierInstances> lsclpqi = nep
+                .getSupportedCepLayerProtocolQualifierInstances();
+        for (SupportedCepLayerProtocolQualifierInstances entry : lsclpqi) {
+            lpql.add(entry.getLayerProtocolQualifier());
+        }
+        assertEquals(3, lpql.size(), "Client nep should support 3 kind of cep");
         assertThat("client nep should support 3 kind of cep",
-            nep.getSupportedCepLayerProtocolQualifier(),
-            hasItems(ODUTYPEODU2.class, ODUTYPEODU2E.class, DIGITALSIGNALTYPE10GigELAN.class));
-        assertEquals("client nep should be of DSR protocol type", LayerProtocolName.DSR, nep.getLayerProtocolName());
+            lpql, hasItems(ODUTYPEODU2.VALUE, ODUTYPEODU2E.VALUE, DIGITALSIGNALTYPE10GigELAN.VALUE));
+
+        assertEquals(LayerProtocolName.DSR, nep.getLayerProtocolName(), "client nep should be of DSR protocol type");
         checkCommonPartOfNep(nep, false);
     }
 
     private void checkNepeODU4(OwnedNodeEdgePoint nep, Uuid nepUuid, String portName, String nepName,
-                                     boolean withSip) {
-        assertEquals("bad uuid for " + portName, nepUuid, nep.getUuid());
+            boolean withSip) {
+        assertEquals(nepUuid, nep.getUuid(), "bad uuid for " + portName);
         List<Name> nameList = new ArrayList<>(nep.nonnullName().values());
         Name name = nameList.get(0);
-        assertEquals("value of eODU nep should be '" + portName + "'",
-            portName, name.getValue());
-        assertEquals("value-name of eODU nep for '" + portName + "' should be '" + nepName + "'",
-            nepName, name.getValueName());
+        assertEquals(portName, name.getValue(), "value of eODU nep should be '" + portName + "'");
+        assertEquals(nepName, name.getValueName(),
+            "value-name of eODU nep for '" + portName + "' should be '" + nepName + "'");
         // TODO: depending on the type of node there is one type or another
+        List<LAYERPROTOCOLQUALIFIER> lpql = new ArrayList<>();
+        List<SupportedCepLayerProtocolQualifierInstances> lsclpqi = nep
+                .getSupportedCepLayerProtocolQualifierInstances();
+        for (SupportedCepLayerProtocolQualifierInstances entry : lsclpqi) {
+            lpql.add(entry.getLayerProtocolQualifier());
+        }
         assertThat("eODU nep should support 1, 2 or 3 kind of cep, depending on client port",
-            nep.getSupportedCepLayerProtocolQualifier().size(), anyOf(is(1), is(2), is(3)));
-        assertTrue("eODU nep should support 1 kind of cep",
-            nep.getSupportedCepLayerProtocolQualifier().stream().anyMatch(splc -> splc.equals(ODUTYPEODU0.class)
-                || splc.equals(ODUTYPEODU2.class) || splc.equals(ODUTYPEODU2E.class)
-                || splc.equals(ODUTYPEODU4.class)));
-        assertEquals("eODU nep should be of ODU protocol type", LayerProtocolName.ODU, nep.getLayerProtocolName());
+            lpql.size(), anyOf(is(1), is(2), is(3)));
+        assertTrue(
+            lpql.stream().anyMatch(splc -> splc.equals(ODUTYPEODU0.VALUE)
+                || splc.equals(ODUTYPEODU2.VALUE) || splc.equals(ODUTYPEODU2E.VALUE)
+                || splc.equals(ODUTYPEODU4.VALUE)),
+            "eODU nep should support 1 kind of cep");
+        assertEquals(LayerProtocolName.ODU, nep.getLayerProtocolName(), "eODU nep should be of ODU protocol type");
         checkCommonPartOfNep(nep, withSip);
     }
 
     private void checkNepNetworkODU4(OwnedNodeEdgePoint nep, Uuid nepUuid, String portName, String nepName,
-                                     boolean withSip) {
-        assertEquals("bad uuid for " + portName, nepUuid, nep.getUuid());
+            boolean withSip) {
+        assertEquals(nepUuid, nep.getUuid(), "bad uuid for " + portName);
         List<Name> nameList = new ArrayList<>(nep.nonnullName().values());
         Name name = nameList.get(0);
-        assertEquals("value of network nep should be '" + portName + "'",
-            portName, name.getValue());
-        assertEquals("value-name of network nep for '" + portName + "' should be '" + nepName + "'",
-            nepName, name.getValueName());
-        assertEquals("Network nep should support 1 kind of cep",
-            1, nep.getSupportedCepLayerProtocolQualifier().size());
-        assertThat("network nep should support 1 kind of cep",
-            nep.getSupportedCepLayerProtocolQualifier(),
-            hasItem(ODUTYPEODU4.class));
-        assertEquals("network nep should be of ODU protocol type", LayerProtocolName.ODU, nep.getLayerProtocolName());
+        assertEquals(portName, name.getValue(), "value of network nep should be '" + portName + "'");
+        assertEquals(nepName, name.getValueName(),
+            "value-name of network nep for '" + portName + "' should be '" + nepName + "'");
+        List<LAYERPROTOCOLQUALIFIER> lpql = new ArrayList<>();
+        List<SupportedCepLayerProtocolQualifierInstances> lsclpqi = nep
+                .getSupportedCepLayerProtocolQualifierInstances();
+        for (SupportedCepLayerProtocolQualifierInstances entry : lsclpqi) {
+            lpql.add(entry.getLayerProtocolQualifier());
+        }
+        assertEquals(1, lpql.size(), "Network nep should support 1 kind of cep");
+        assertThat("network nep should support 1 kind of cep", lpql, hasItem(ODUTYPEODU4.VALUE));
+        assertEquals(LayerProtocolName.ODU, nep.getLayerProtocolName(), "network nep should be of ODU protocol type");
         checkCommonPartOfNep(nep, withSip);
     }
 
     private void checkNodeRuleGroupForTpdrDSR(List<NodeRuleGroup> nrgList, Uuid clientNepUuid, Uuid networkNepUuid,
-                                              Uuid nodeUuid) {
-        assertEquals("transponder DSR should contain 2 node rule group", 2, nrgList.size());
+            Uuid nodeUuid) {
+        assertEquals(4, nrgList.size(), "transponder DSR should contain 4 node rule group (DSR-I_ODU/I-ODU-E_ODU)");
         for (NodeRuleGroup nodeRuleGroup : nrgList) {
-            assertEquals("each node-rule-group should contain 2 NEP for transponder DSR",
-                2, nodeRuleGroup.getNodeEdgePoint().size());
+            assertEquals(2, nodeRuleGroup.getNodeEdgePoint().size(),
+                "each node-rule-group should contain 2 NEP for transponder DSR");
         }
-        List<NodeEdgePoint> nodeEdgePointList = new ArrayList<>(nrgList.get(0).nonnullNodeEdgePoint().values());
+        Integer indNrg = nrgContainsClientAndNetwork(nrgList, clientNepUuid, networkNepUuid);
+        assertNotNull("One node-rule-group shall contains client and network Neps", indNrg);
+        List<NodeEdgePoint> nodeEdgePointList = new ArrayList<>(nrgList.get(indNrg).nonnullNodeEdgePoint().values());
         assertThat("node-rule-group nb 1 should be between nep-client1 and nep-network1",
             nodeEdgePointList.get(0).getNodeEdgePointUuid().getValue(),
             either(containsString(networkNepUuid.getValue())).or(containsString(clientNepUuid.getValue())));
         assertThat("node-rule-group nb 1 should be between nep-client1 and nep-network1",
             nodeEdgePointList.get(1).getNodeEdgePointUuid().getValue(),
             either(containsString(networkNepUuid.getValue())).or(containsString(clientNepUuid.getValue())));
-        assertEquals("node-rule-group nb 1 should be between nep-client1 and nep-network1 of the same node",
-            nodeEdgePointList.get(0).getNodeUuid(), nodeUuid);
-        assertEquals("node-rule-group nb 1 should be between nep-client1 and nep-network1 of the same node",
-            nodeEdgePointList.get(1).getNodeUuid(), nodeUuid);
+        assertEquals(nodeEdgePointList.get(0).getNodeUuid(), nodeUuid,
+            "node-rule-group nb 1 should be between nep-client1 and nep-network1 of the same node");
+        assertEquals(nodeEdgePointList.get(1).getNodeUuid(), nodeUuid,
+            "node-rule-group nb 1 should be between nep-client1 and nep-network1 of the same node");
         List<Rule> rule = new ArrayList<>(nrgList.get(1).nonnullRule().values());
-        assertEquals("node-rule-group nb 1 should contain a single rule", 1, rule.size());
-        assertEquals("local-id of the rule should be 'forward'",
-            "forward", rule.get(0).getLocalId());
-        assertEquals("the forwarding rule should be 'MAYFORWARDACROSSGROUP'",
-            ForwardingRule.MAYFORWARDACROSSGROUP, rule.get(0).getForwardingRule());
-        assertEquals("the rule type should be 'FORWARDING'",
-            RuleType.FORWARDING, rule.get(0).getRuleType());
+        assertEquals(1, rule.size(), "node-rule-group nb 1 should contain a single rule");
+        assertEquals("forward", rule.get(0).getLocalId(), "local-id of the rule should be 'forward'");
+        assertEquals(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE, rule.get(0).getForwardingRule(),
+            "the forwarding rule should be 'MAYFORWARDACROSSGROUP'");
+        assertEquals(RuleType.FORWARDING, rule.get(0).getRuleType().stream().findFirst().orElseThrow(),
+            "the rule type should be 'FORWARDING'");
     }
 
     private void checkNodeRuleGroupForMuxDSR(List<NodeRuleGroup> nrgList, Uuid clientNepUuid, Uuid networkNepUuid,
-                                             Uuid nodeUuid) {
-        assertEquals("muxponder DSR should contain 4 node rule group", 4, nrgList.size());
-        for (NodeRuleGroup nodeRuleGroup : nrgList) {
-            assertEquals("each node-rule-group should contain 2 NEP for muxponder DSR",
-                2, nodeRuleGroup.getNodeEdgePoint().size());
-        }
-        List<NodeEdgePoint> nodeEdgePointList = new ArrayList<>(nrgList.get(2).nonnullNodeEdgePoint().values());
+            Uuid nodeUuid) {
+        assertEquals(8, nrgList.size(), "muxponder DSR should contain 8 node rule group (DSR-I_ODU/I-ODU-E_ODU)");
+        Integer indNrg = nrgContainsClientAndNetwork(nrgList, clientNepUuid, networkNepUuid);
+        assertNotNull("One node-rule-group shall contains client and network Neps", indNrg);
+        List<NodeEdgePoint> nodeEdgePointList = new ArrayList<>(nrgList.get(indNrg).nonnullNodeEdgePoint().values());
         assertThat("node-rule-group nb 2 should be between nep-client4 and nep-network1",
             nodeEdgePointList.get(1).getNodeEdgePointUuid().getValue(),
             either(containsString(networkNepUuid.getValue())).or(containsString(clientNepUuid.getValue())));
-        assertThat("node-rule-group nb 2 should be between nep-client4 and nep-network1",
-            nodeEdgePointList.get(1).getNodeEdgePointUuid().getValue(),
-            either(containsString(networkNepUuid.getValue())).or(containsString(clientNepUuid.getValue())));
-        assertEquals("node-rule-group nb 2 should be between nep-client4 and nep-network1 of the same node",
-            nodeEdgePointList.get(0).getNodeUuid(), nodeUuid);
-        assertEquals("node-rule-group nb 2 should be between nep-client4 and nep-network1 of the same node",
-            nodeEdgePointList.get(1).getNodeUuid(), nodeUuid);
+        assertEquals(nodeEdgePointList.get(0).getNodeUuid(), nodeUuid,
+            "node-rule-group nb 2 should be between nep-client4 and nep-network1 of the same node");
+        assertEquals(nodeEdgePointList.get(1).getNodeUuid(), nodeUuid,
+            "node-rule-group nb 2 should be between nep-client4 and nep-network1 of the same node");
         List<Rule> rule = new ArrayList<>(nrgList.get(1).nonnullRule().values());
-        assertEquals("node-rule-group nb 2 should contain a single rule", 1, rule.size());
-        assertEquals("local-id of the rule should be 'forward'",
-            "forward", rule.get(0).getLocalId());
-        assertEquals("the forwarding rule should be 'MAYFORWARDACROSSGROUP'",
-            ForwardingRule.MAYFORWARDACROSSGROUP, rule.get(0).getForwardingRule());
-        assertEquals("the rule type should be 'FORWARDING'",
-            RuleType.FORWARDING, rule.get(0).getRuleType());
+        assertEquals(1, rule.size(), "node-rule-group nb 2 should contain a single rule");
+        assertEquals("forward", rule.get(0).getLocalId(), "local-id of the rule should be 'forward'");
+        assertEquals(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE, rule.get(0).getForwardingRule(),
+            "the forwarding rule should be 'MAYFORWARDACROSSGROUP'");
+        assertEquals(RuleType.FORWARDING, rule.get(0).getRuleType().stream().findFirst().orElseThrow(),
+            "the rule type should be 'FORWARDING'");
     }
 
     private void checkNodeRuleGroupForSwitchDSR(List<NodeRuleGroup> nrgList, Uuid clientNepUuid, Uuid networkNepUuid,
-                                                Uuid nodeUuid) {
-        assertEquals("Switch-DSR should contain a single node rule group", 1, nrgList.size());
-        assertEquals("Switch-DSR node-rule-group should contain 8 NEP", 8, nrgList.get(0).getNodeEdgePoint().size());
+            Uuid nodeUuid) {
+        assertEquals(2, nrgList.size(), "Switch-DSR should contain 2 node rule group (DSR-I_ODU/I-ODU-E_ODU)");
+        Integer indNrg = nrgContainsClientAndNetwork(nrgList, clientNepUuid, networkNepUuid);
+        assertNotNull("One node-rule-group shall contains client and network Neps", indNrg);
+        assertEquals(8, nrgList.get(indNrg).getNodeEdgePoint().size(), "Switch-DSR nrg should contain 8 NEP");
         List<NodeEdgePoint> nrg = nrgList.get(0).nonnullNodeEdgePoint().values().stream()
             .sorted((nrg1, nrg2) -> nrg1.getNodeEdgePointUuid().getValue()
                 .compareTo(nrg2.getNodeEdgePointUuid().getValue()))
             .collect(Collectors.toList());
-        assertEquals("in the sorted node-rule-group, nep number 7 should be XPDR2-NETWORK1",
-            networkNepUuid, nrg.get(6).getNodeEdgePointUuid());
-        assertEquals("in the sorted node-rule-group, nep number 4 should be XPDR2-CLIENT4",
-            clientNepUuid, nrg.get(3).getNodeEdgePointUuid());
-        assertEquals("any item of the node-rule-group should have the same nodeUuid",
-            nodeUuid, nrg.get(4).getNodeUuid());
-        assertEquals("any item of the node-rule-group should have the same nodeUuid",
-            nodeUuid, nrg.get(3).getNodeUuid());
+        Integer xxxxx = 0;
+        for (NodeEdgePoint nep : nrg) {
+            LOG.info("nep number {} UUID is {} ", xxxxx, nep.getNodeEdgePointUuid());
+            xxxxx++;
+        }
+        LOG.info("nep SPDR-SA1-XPDR2+iODU+XPDR2-NETWORK1 UUID is {} ", UUID.nameUUIDFromBytes(
+            ("SPDR-SA1-XPDR2" + "+iODU+XPDR2-NETWORK1").getBytes(Charset.forName("UTF-8"))).toString());
+        LOG.info("nep SPDR-SA1-XPDR2+DSR+XPDR2-CLIENT4 UUID is {} ", UUID.nameUUIDFromBytes(
+            ("SPDR-SA1-XPDR2" + "+DSR+XPDR2-CLIENT4").getBytes(Charset.forName("UTF-8"))).toString());
+        assertEquals(networkNepUuid, nrg.get(6).getNodeEdgePointUuid(),
+            "in the sorted node-rule-group, nep number 7 should be XPDR2-NETWORK1");
+        assertEquals(clientNepUuid, nrg.get(5).getNodeEdgePointUuid(),
+            "in the sorted node-rule-group, nep number 4 should be XPDR2-CLIENT4");
+        assertEquals(nodeUuid, nrg.get(4).getNodeUuid(),
+            "any item of the node-rule-group should have the same nodeUuid");
+        assertEquals(nodeUuid, nrg.get(3).getNodeUuid(),
+            "any item of the node-rule-group should have the same nodeUuid");
         @Nullable
         List<Rule> ruleList = new ArrayList<>(nrgList.get(0).nonnullRule().values());
-        assertEquals("node-rule-group should contain a single rule", 1, ruleList.size());
-        assertEquals("local-id of the rule should be 'forward'",
-            "forward", ruleList.get(0).getLocalId());
-        assertEquals("the forwarding rule should be 'MAYFORWARDACROSSGROUP'",
-            ForwardingRule.MAYFORWARDACROSSGROUP, ruleList.get(0).getForwardingRule());
-        assertEquals("the rule type should be 'FORWARDING'",
-            RuleType.FORWARDING, ruleList.get(0).getRuleType());
+        assertEquals(1, ruleList.size(), "node-rule-group should contain a single rule");
+        assertEquals("forward", ruleList.get(0).getLocalId(), "local-id of the rule should be 'forward'");
+        assertEquals(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE, ruleList.get(0).getForwardingRule(),
+            "the forwarding rule should be 'MAYFORWARDACROSSGROUP'");
+        assertEquals(RuleType.FORWARDING, ruleList.get(0).getRuleType().stream().findFirst().orElseThrow(),
+            "the rule type should be 'FORWARDING'");
     }
 
-    private void checkNodeRuleGroupForRdm(List<NodeRuleGroup> nrgList, int nbNeps) {
-        assertEquals("RDM infra node - OTSi should contain a single node rule groups", 1, nrgList.size());
-        if (nbNeps > 0) {
-            List<NodeEdgePoint> nodeEdgePointList = new ArrayList<>(nrgList.get(0).getNodeEdgePoint().values());
-            assertEquals("RDM infra node -rule-group should contain " + nbNeps + " NEP",
-                nbNeps, nodeEdgePointList.size());
-        } else {
-            assertNull("RDM infra node -rule-group should contain no NEP", nrgList.get(0).getNodeEdgePoint());
+    private void checkNodeRuleGroupForRdm(List<NodeRuleGroup> nrgList, List<Integer> nbNeps) {
+        assertEquals(3, nrgList.size(), "RDM infra node - OTS should contain 3 node rule groups");
+        int index = 0;
+        for (NodeRuleGroup nrg : nrgList) {
+            List<NodeEdgePoint> nodeEdgePointList = new ArrayList<>(nrg.getNodeEdgePoint().values());
+            assertEquals(nbNeps.get(index), nodeEdgePointList.size(),
+                "RDM infra node -rule-group should contain " + nbNeps.get(index) + " NEP");
+            List<Rule> ruleList = new ArrayList<>(nrg.nonnullRule().values());
+            assertEquals(1, ruleList.size(), "node-rule-group should contain a single rule");
+            assertEquals("forward", ruleList.get(0).getLocalId(), "local-id of the rule should be 'forward'");
+            assertEquals(RuleType.FORWARDING, ruleList.get(0).getRuleType().stream().findFirst().orElseThrow(),
+                "the rule type should be 'FORWARDING'");
+            if (nrg.getName().entrySet().iterator().next().getValue().toString().contains("DEG")) {
+                assertEquals(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE, ruleList.get(0).getForwardingRule(),
+                    "the forwarding rule should be 'MAYFORWARDACROSSGROUP'");
+            } else {
+                assertEquals(FORWARDINGRULECANNOTFORWARDACROSSGROUP.VALUE, ruleList.get(0).getForwardingRule(),
+                    "the forwarding rule should be 'CANNOTFORWARDACROSSGROUP'");
+            }
+            index++;
         }
-        List<Rule> ruleList = new ArrayList<>(nrgList.get(0).nonnullRule().values());
-        assertEquals("node-rule-group should contain a single rule", 1, ruleList.size());
-        assertEquals("local-id of the rule should be 'forward'",
-            "forward", ruleList.get(0).getLocalId());
-        assertEquals("the forwarding rule should be 'MAYFORWARDACROSSGROUP'",
-            ForwardingRule.MAYFORWARDACROSSGROUP, ruleList.get(0).getForwardingRule());
-        assertEquals("the rule type should be 'FORWARDING'",
-            RuleType.FORWARDING, ruleList.get(0).getRuleType());
     }
 
     private void checkNodeRuleGroupForTpdrOTSi(List<NodeRuleGroup> nrgList, Uuid enepUuid, Uuid inepUuid,
-                                               Uuid nodeUuid) {
-        assertEquals("Tpdr-OTSi should contain two node rule groups", 2, nrgList.size());
+            Uuid nodeUuid) {
+        assertEquals(2, nrgList.size(), "Tpdr-OTSi should contain two node rule groups");
         List<NodeEdgePoint> nodeEdgePointList = new ArrayList<>(nrgList.get(0).getNodeEdgePoint().values());
-        assertEquals("Tpdr-OTSi node-rule-group should contain 2 NEP", 2, nodeEdgePointList.size());
+        assertEquals(2, nodeEdgePointList.size(), "Tpdr-OTSi node-rule-group should contain 2 NEP");
         assertThat("Tpdr-OTSi node-rule-group should be between eNEP and iNEP of XPDR1-NETWORK1",
             nodeEdgePointList.get(0).getNodeEdgePointUuid().getValue(),
             either(containsString(enepUuid.getValue())).or(containsString(inepUuid.getValue())));
         assertThat("Tpdr-OTSi node-rule-group should be between eNEP and iNEP of XPDR1-NETWORK1",
             nodeEdgePointList.get(1).getNodeEdgePointUuid().getValue(),
             either(containsString(enepUuid.getValue())).or(containsString(inepUuid.getValue())));
-        assertEquals("any item of the node-rule-group should have the same nodeUuid",
-            nodeUuid, nodeEdgePointList.get(0).getNodeUuid());
-        assertEquals("any item of the node-rule-group should have the same nodeUuid",
-            nodeUuid, nodeEdgePointList.get(1).getNodeUuid());
+        assertEquals(nodeUuid, nodeEdgePointList.get(0).getNodeUuid(),
+            "any item of the node-rule-group should have the same nodeUuid");
+        assertEquals(nodeUuid, nodeEdgePointList.get(1).getNodeUuid(),
+            "any item of the node-rule-group should have the same nodeUuid");
         List<Rule> ruleList = new ArrayList<>(nrgList.get(0).nonnullRule().values());
-        assertEquals("node-rule-group should contain a single rule", 1, ruleList.size());
-        assertEquals("local-id of the rule should be 'forward'",
-            "forward", ruleList.get(0).getLocalId());
-        assertEquals("the forwarding rule should be 'MAYFORWARDACROSSGROUP'",
-            ForwardingRule.MAYFORWARDACROSSGROUP, ruleList.get(0).getForwardingRule());
-        assertEquals("the rule type should be 'FORWARDING'",
-            RuleType.FORWARDING, ruleList.get(0).getRuleType());
+        assertEquals(1, ruleList.size(), "node-rule-group should contain a single rule");
+        assertEquals("forward", ruleList.get(0).getLocalId(), "local-id of the rule should be 'forward'");
+        assertEquals(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE, ruleList.get(0).getForwardingRule(),
+            "the forwarding rule should be 'MAYFORWARDACROSSGROUP'");
+        assertEquals(RuleType.FORWARDING, ruleList.get(0).getRuleType().stream().findFirst().orElseThrow(),
+            "the rule type should be 'FORWARDING'");
     }
 
     private void checkNodeRuleGroupForMuxOTSi(List<NodeRuleGroup> nrgList, Uuid enepUuid, Uuid inepUuid,
-                                              Uuid nodeUuid) {
-        assertEquals("Mux-OTSi should contain a single node rule group", 1, nrgList.size());
+            Uuid nodeUuid) {
+        assertEquals(1, nrgList.size(), "Mux-OTSi should contain a single node rule group");
         List<NodeEdgePoint> nodeEdgePointList = new ArrayList<>(nrgList.get(0).getNodeEdgePoint().values());
-        assertEquals("Mux-OTSi node-rule-group should contain 2 NEP", 2, nodeEdgePointList.size());
+        assertEquals(2, nodeEdgePointList.size(), "Mux-OTSi node-rule-group should contain 2 NEP");
         assertThat("Mux-OTSi node-rule-group should be between eNEP and iNEP of XPDR1-NETWORK1",
             nodeEdgePointList.get(0).getNodeEdgePointUuid().getValue(),
             either(containsString(enepUuid.getValue())).or(containsString(inepUuid.getValue())));
         assertThat("Mux-OTSi node-rule-group should be between eNEP and iNEP of XPDR1-NETWORK1",
             nodeEdgePointList.get(1).getNodeEdgePointUuid().getValue(),
             either(containsString(enepUuid.getValue())).or(containsString(inepUuid.getValue())));
-        assertEquals("any item of the node-rule-group should have the same nodeUuid",
-            nodeUuid, nodeEdgePointList.get(0).getNodeUuid());
-        assertEquals("any item of the node-rule-group should have the same nodeUuid",
-            nodeUuid, nodeEdgePointList.get(1).getNodeUuid());
+        assertEquals(nodeUuid, nodeEdgePointList.get(0).getNodeUuid(),
+            "any item of the node-rule-group should have the same nodeUuid");
+        assertEquals(nodeUuid, nodeEdgePointList.get(1).getNodeUuid(),
+            "any item of the node-rule-group should have the same nodeUuid");
         List<Rule> ruleList = new ArrayList<>(nrgList.get(0).nonnullRule().values());
-        assertEquals("node-rule-group should contain a single rule", 1, ruleList.size());
-        assertEquals("local-id of the rule should be 'forward'",
-            "forward", ruleList.get(0).getLocalId());
-        assertEquals("the forwarding rule should be 'MAYFORWARDACROSSGROUP'",
-            ForwardingRule.MAYFORWARDACROSSGROUP, ruleList.get(0).getForwardingRule());
-        assertEquals("the rule type should be 'FORWARDING'",
-            RuleType.FORWARDING, ruleList.get(0).getRuleType());
+        assertEquals(1, ruleList.size(), "node-rule-group should contain a single rule");
+        assertEquals("forward", ruleList.get(0).getLocalId(), "local-id of the rule should be 'forward'");
+        assertEquals(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE, ruleList.get(0).getForwardingRule(),
+            "the forwarding rule should be 'MAYFORWARDACROSSGROUP'");
+        assertEquals(RuleType.FORWARDING, ruleList.get(0).getRuleType().stream().findFirst().orElseThrow(),
+            "the rule type should be 'FORWARDING'");
     }
 
     private void checkNodeRuleGroupForSwitchOTSi(List<NodeRuleGroup> nrgList, Uuid enepUuid, Uuid inepUuid,
-                                                 Uuid nodeUuid) {
-        assertEquals("Switch-OTSi should contain 4 node rule group", 4, nrgList.size());
+            Uuid nodeUuid) {
+        assertEquals(4, nrgList.size(), "Switch-OTSi should contain 4 node rule group");
         for (NodeRuleGroup nodeRuleGroup : nrgList) {
-            assertEquals("each node-rule-group should contain 2 NEP for Switch-OTSi",
-                2, nodeRuleGroup.getNodeEdgePoint().size());
+            assertEquals(2, nodeRuleGroup.getNodeEdgePoint().size(),
+                "each node-rule-group should contain 2 NEP for Switch-OTSi");
         }
         List<NodeEdgePoint> nodeEdgePointList1 = new ArrayList<>(nrgList.get(3).nonnullNodeEdgePoint().values());
         assertThat("Switch-OTSi node-rule-group nb 4 should be between eNEP and iNEP of XPDR2-NETWORK2",
@@ -1125,164 +1063,146 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
             nodeEdgePointList1.get(1).getNodeEdgePointUuid().getValue(),
             either(containsString(enepUuid.getValue())).or(containsString(inepUuid.getValue())));
         List<NodeEdgePoint> nodeEdgePointList0 = new ArrayList<>(nrgList.get(0).getNodeEdgePoint().values());
-        assertEquals("any item of the node-rule-group should have the same nodeUuid",
-            nodeUuid, nodeEdgePointList0.get(0).getNodeUuid());
-        assertEquals("any item of the node-rule-group should have the same nodeUuid",
-            nodeUuid, nodeEdgePointList0.get(1).getNodeUuid());
+        assertEquals(nodeUuid, nodeEdgePointList0.get(0).getNodeUuid(),
+            "any item of the node-rule-group should have the same nodeUuid");
+        assertEquals(nodeUuid, nodeEdgePointList0.get(1).getNodeUuid(),
+            "any item of the node-rule-group should have the same nodeUuid");
         List<Rule> ruleList0 = new ArrayList<>(nrgList.get(0).nonnullRule().values());
-        assertEquals("node-rule-group should contain a single rule", 1, ruleList0.size());
-        assertEquals("local-id of the rule should be 'forward'",
-            "forward", ruleList0.get(0).getLocalId());
-        assertEquals("the forwarding rule should be 'MAYFORWARDACROSSGROUP'",
-            ForwardingRule.MAYFORWARDACROSSGROUP, ruleList0.get(0).getForwardingRule());
-        assertEquals("the rule type should be 'FORWARDING'",
-            RuleType.FORWARDING, ruleList0.get(0).getRuleType());
+        assertEquals(1, ruleList0.size(), "node-rule-group should contain a single rule");
+        assertEquals("forward", ruleList0.get(0).getLocalId(), "local-id of the rule should be 'forward'");
+        assertEquals(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE, ruleList0.get(0).getForwardingRule(),
+            "the forwarding rule should be 'MAYFORWARDACROSSGROUP'");
+        assertEquals(RuleType.FORWARDING, ruleList0.get(0).getRuleType().stream().findFirst().orElseThrow(),
+            "the rule type should be 'FORWARDING'");
     }
 
     private void checkNepClient100GSwitch(OwnedNodeEdgePoint nep, Uuid nepUuid, String portName, String nepName) {
-        assertEquals("bad uuid for " + portName, nepUuid, nep.getUuid());
+        assertEquals(nepUuid, nep.getUuid(), "bad uuid for " + portName);
         List<Name> nameList = new ArrayList<>(nep.nonnullName().values());
-        assertEquals("value of client nep should be '" + portName + "'",
-            portName, nameList.get(0).getValue());
-        assertEquals("value-name of client nep for '" + portName + "' should be '" + nepName + "'",
-            nepName, nameList.get(0).getValueName());
-        assertEquals("Client nep should support 2 kind of cep",
-            2, nep.getSupportedCepLayerProtocolQualifier().size());
-        assertThat("client nep should support 2 kind of cep",
-            nep.getSupportedCepLayerProtocolQualifier(),
-            hasItems(ODUTYPEODU4.class, DIGITALSIGNALTYPE100GigE.class));
-        assertEquals("client nep should be of DSR protocol type", LayerProtocolName.DSR, nep.getLayerProtocolName());
+        assertEquals(portName, nameList.get(0).getValue(),
+            "value of client nep should be '" + portName + "'");
+        assertEquals(nepName, nameList.get(0).getValueName(),
+            "value-name of client nep for '" + portName + "' should be '" + nepName + "'");
+        List<LAYERPROTOCOLQUALIFIER> lpql = new ArrayList<>();
+        List<SupportedCepLayerProtocolQualifierInstances> lsclpqi = nep
+                .getSupportedCepLayerProtocolQualifierInstances();
+        for (SupportedCepLayerProtocolQualifierInstances entry : lsclpqi) {
+            lpql.add(entry.getLayerProtocolQualifier());
+        }
+        LOG.info("checkNEPClient100G-NEP {} has following supported CEP {}", nepName, nep
+            .getSupportedCepLayerProtocolQualifierInstances().toString());
+        assertEquals(2, lpql.size(), "Client nep should support 2 kind of cep");
+        assertThat("client nep should support 2 kind of cep", lpql,
+            hasItems(ODUTYPEODU4.VALUE, DIGITALSIGNALTYPE100GigE.VALUE));
+        assertEquals(LayerProtocolName.DSR, nep.getLayerProtocolName(), "client nep should be of DSR protocol type");
         checkCommonPartOfNep(nep, false);
     }
 
     private void checkNepClient100GTpdr(OwnedNodeEdgePoint nep, Uuid nepUuid, String portName, String nepName) {
-        assertEquals("bad uuid for " + portName, nepUuid, nep.getUuid());
+        assertEquals(nepUuid, nep.getUuid(), "bad uuid for " + portName);
         List<Name> nameList = new ArrayList<>(nep.nonnullName().values());
-        assertEquals("value of client nep should be '" + portName + "'",
-            portName, nameList.get(0).getValue());
-        assertEquals("value-name of client nep for '" + portName + "' should be 100G-tpdr'",
-            nepName, nameList.get(0).getValueName());
-        assertEquals("Client nep should support 1 kind of cep",
-            1, nep.getSupportedCepLayerProtocolQualifier().size());
-        assertThat("client nep should support 2 kind of cep",
-            nep.getSupportedCepLayerProtocolQualifier(),
-            hasItems(DIGITALSIGNALTYPE100GigE.class));
-        assertEquals("client nep should be of DSR protocol type", LayerProtocolName.DSR, nep.getLayerProtocolName());
+        assertEquals(portName, nameList.get(0).getValue(), "value of client nep should be '" + portName + "'");
+        assertEquals(nepName, nameList.get(0).getValueName(),
+            "value-name of client nep for '" + portName + "' should be 100G-tpdr'");
+        List<LAYERPROTOCOLQUALIFIER> lpql = new ArrayList<>();
+        List<SupportedCepLayerProtocolQualifierInstances> lsclpqi = nep
+                .getSupportedCepLayerProtocolQualifierInstances();
+        for (SupportedCepLayerProtocolQualifierInstances entry : lsclpqi) {
+            lpql.add(entry.getLayerProtocolQualifier());
+        }
+        assertEquals(1, lpql.size(), "Client nep should support 1 kind of cep");
+        assertThat("client nep should support 2 kind of cep", lpql, hasItems(DIGITALSIGNALTYPE100GigE.VALUE));
+        assertEquals(LayerProtocolName.DSR, nep.getLayerProtocolName(), "client nep should be of DSR protocol type");
         checkCommonPartOfNep(nep, false);
     }
 
     private void checkNepOtsiNode(OwnedNodeEdgePoint nep, Uuid nepUuid, String portName, String nepName,
-                                  boolean withSip) {
-        assertEquals("bad uuid for " + portName, nepUuid, nep.getUuid());
+            boolean withSip) {
+        assertEquals(nepUuid, nep.getUuid(), "bad uuid for " + portName);
         List<Name> nameList = new ArrayList<>(nep.nonnullName().values());
-        assertEquals("value of OTSi nep should be '" + portName + "'",
-            portName, nameList.get(0).getValue());
-        assertEquals("value-name of OTSi nep should be '" + nepName + "'",
-            nepName, nameList.get(0).getValueName());
-        assertEquals("OTSi nep should support 2 kind of cep",
-            2, nep.getSupportedCepLayerProtocolQualifier().size());
+        assertEquals(portName, nameList.get(0).getValue(), "value of OTSi nep should be '" + portName + "'");
+        assertEquals(nepName, nameList.get(0).getValueName(), "value-name of OTSi nep should be '" + nepName + "'");
+        List<LAYERPROTOCOLQUALIFIER> lpql = new ArrayList<>();
+        List<SupportedCepLayerProtocolQualifierInstances> lsclpqi = nep
+                .getSupportedCepLayerProtocolQualifierInstances();
+        for (SupportedCepLayerProtocolQualifierInstances entry : lsclpqi) {
+            lpql.add(entry.getLayerProtocolQualifier());
+        }
+        assertEquals(2, lpql.size(), "OTSi nep should support 2 kind of cep");
         assertThat("OTSi nep should support 2 kind of cep",
-            nep.getSupportedCepLayerProtocolQualifier(),
-            hasItems(PHOTONICLAYERQUALIFIEROMS.class, PHOTONICLAYERQUALIFIEROTSi.class));
-        assertEquals("OTSi nep should be of PHOTONIC_MEDIA protocol type",
-            LayerProtocolName.PHOTONICMEDIA, nep.getLayerProtocolName());
+            lpql, hasItems(PHOTONICLAYERQUALIFIEROMS.VALUE, PHOTONICLAYERQUALIFIEROTSi.VALUE));
+        assertEquals(LayerProtocolName.PHOTONICMEDIA, nep.getLayerProtocolName(),
+            "OTSi nep should be of PHOTONIC_MEDIA protocol type");
         checkCommonPartOfNep(nep, withSip);
     }
 
     private void checkNepOtsiRdmNode(OwnedNodeEdgePoint nep, Uuid nepUuid, String portName, String nepName,
-                                     boolean withSip) {
-        assertEquals("bad uuid for " + portName, nepUuid, nep.getUuid());
+            boolean withSip) {
+        if (!nep.getUuid().equals(nepUuid)) {
+            LOG.info("ERRORUUIDNEP on Nep {}, expected {}", nep.getName().toString(), portName);
+        }
+        assertEquals(nepUuid, nep.getUuid(), "bad uuid for " + portName);
         List<Name> nameList = new ArrayList<>(nep.nonnullName().values());
-        assertEquals("value of OTSi nep should be '" + portName + "'",
-            portName, nameList.get(0).getValue());
-        assertEquals("value-name of OTSi nep should be '" + nepName + "'",
-            nepName, nameList.get(0).getValueName());
-        assertEquals("OTSi nep of RDM infra node should support only 1 kind of cep",
-            1, nep.getSupportedCepLayerProtocolQualifier().size());
-        assertThat("OTSi nep should support 2 kind of cep",
-            nep.getSupportedCepLayerProtocolQualifier(),
-            hasItems(PHOTONICLAYERQUALIFIEROMS.class));
-        assertEquals("OTSi nep should be of PHOTONIC_MEDIA protocol type",
-            LayerProtocolName.PHOTONICMEDIA, nep.getLayerProtocolName());
+        assertEquals(portName, nameList.get(0).getValue(),
+            "value of OTSi nep should be '" + portName + "'");
+        assertEquals(nepName, nameList.get(0).getValueName(),
+            "value-name of OTSi nep should be '" + nepName + "'");
+        List<LAYERPROTOCOLQUALIFIER> lpql = new ArrayList<>();
+        List<SupportedCepLayerProtocolQualifierInstances> lsclpqi = nep
+                .getSupportedCepLayerProtocolQualifierInstances();
+        for (SupportedCepLayerProtocolQualifierInstances entry : lsclpqi) {
+            lpql.add(entry.getLayerProtocolQualifier());
+        }
+        if (nepName.contains("OMS")) {
+            assertEquals(1, lpql.size(), "OTSi nep of RDM infra node should support only 1 kind of cep");
+            assertThat("OTSi nep should support 1 kind of cep", lpql, hasItems(PHOTONICLAYERQUALIFIEROMS.VALUE));
+            assertEquals(LayerProtocolName.PHOTONICMEDIA, nep.getLayerProtocolName(),
+                "OTSi nep should be of PHOTONIC_MEDIA protocol type");
+        } else if (nepName.contains("OTS")) {
+            assertEquals(1, lpql.size(), "OTSi nep of RDM infra node should support only 1 kind of cep");
+            assertThat("OTSi nep should support 1 kind of cep", lpql, hasItems(PHOTONICLAYERQUALIFIEROTS.VALUE));
+            assertEquals(LayerProtocolName.PHOTONICMEDIA, nep.getLayerProtocolName(),
+                "OTSi nep should be of PHOTONIC_MEDIA protocol type");
+        }
         checkCommonPartOfNep(nep, withSip);
     }
 
     private void checkCommonPartOfNep(OwnedNodeEdgePoint nep, boolean withSip) {
-        assertEquals("link port direction should be DIRECTIONAL",
-            PortDirection.BIDIRECTIONAL, nep.getLinkPortDirection());
-        assertEquals("administrative state should be UNLOCKED",
-            AdministrativeState.UNLOCKED, nep.getAdministrativeState());
-        assertEquals("termination state should be TERMINATED BIDIRECTIONAL",
-            TerminationState.TERMINATEDBIDIRECTIONAL, nep.getTerminationState());
-        assertEquals("life-cycle state should be INSTALLED", LifecycleState.INSTALLED, nep.getLifecycleState());
+        assertEquals(Direction.BIDIRECTIONAL, nep.getDirection(), "link port direction should be DIRECTIONAL");
+        assertEquals(AdministrativeState.UNLOCKED, nep.getAdministrativeState(),
+            "administrative state should be UNLOCKED");
+//       TODO: convert this test since terminationState is migrated to CEP attribute in TAPI 2.4
+//        assertEquals(TerminationState.TERMINATEDBIDIRECTIONAL, nep.getTerminationState(),
+//            "termination state should be TERMINATED BIDIRECTIONAL");
+        assertEquals(LifecycleState.INSTALLED, nep.getLifecycleState(), "life-cycle state should be INSTALLED");
         if (withSip) {
-            assertEquals("Given nep should support 1 SIP", 1, nep.getMappedServiceInterfacePoint().size());
+            assertEquals(1, nep.getMappedServiceInterfacePoint().size(), "Given nep should support 1 SIP");
         }
-        assertEquals("termination direction should be BIDIRECTIONAL",
-            TerminationDirection.BIDIRECTIONAL, nep.getTerminationDirection());
-        assertEquals("operational state of client nep should be ENABLED",
-            OperationalState.ENABLED, nep.getOperationalState());
-        assertEquals("link-port-role of client nep should be SYMMETRIC",
-            PortRole.SYMMETRIC, nep.getLinkPortRole());
+//      TODO: convert this test since terminationState is migrated to CEP attribute in TAPI 2.4
+//        assertEquals(TerminationDirection.BIDIRECTIONAL, nep.getTerminationDirection(),
+//            "termination direction should be BIDIRECTIONAL");
+        assertEquals(OperationalState.ENABLED, nep.getOperationalState(),
+            "operational state of client nep should be ENABLED");
+        assertEquals(PortRole.SYMMETRIC, nep.getLinkPortRole(),
+            "link-port-role of client nep should be SYMMETRIC");
     }
 
-    private void checkTransitionalLink(org.opendaylight.yang.gen.v1
-                                           .urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link link,
-                                       Uuid node1Uuid, Uuid node2Uuid, String tp1, String tp2, String ietfNodeId) {
-        Uuid linkUuid = new Uuid(UUID.nameUUIDFromBytes((tp1 + "to" + tp2)
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        assertEquals("bad uuid for link between DSR node " + tp1 + " and iOTSI port " + tp2, linkUuid, link.getUuid());
-        assertEquals("Available capacity unit should be GBPS",
-            CapacityUnit.GBPS, link.getAvailableCapacity().getTotalSize().getUnit());
-        assertEquals("Available capacity -total size value should be 100",
-            Uint64.valueOf(100), link.getAvailableCapacity().getTotalSize().getValue());
-        assertEquals("transitional link should be between 2 nodes of protocol layers ODU and PHOTONIC_MEDIA",
-            2, link.getTransitionedLayerProtocolName().size());
-        assertThat("transitional link should be between 2 nodes of protocol layers ODU and PHOTONIC_MEDIA",
-            link.getTransitionedLayerProtocolName(),
-            hasItems(LayerProtocolName.ODU.getName(), LayerProtocolName.PHOTONICMEDIA.getName()));
-        assertEquals("transitional link should be BIDIRECTIONAL",
-            ForwardingDirection.BIDIRECTIONAL, link.getDirection());
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
+    private void checkOmsLink(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link link,
+            Uuid node1Uuid, Uuid node2Uuid, Uuid tp1Uuid, Uuid tp2Uuid, Uuid linkUuid, String linkName) {
+        assertEquals(linkName, link.getName().get(new NameKey("OMS link name")).getValue(), "bad name for the link");
+        assertEquals(linkUuid, link.getUuid(), "bad uuid for link");
+        assertEquals(
+            LayerProtocolName.PHOTONICMEDIA.getName(),
+            link.getLayerProtocolName().stream().findFirst().orElseThrow().getName(),
+            "oms link should be between 2 nodes of protocol layers PHOTONIC_MEDIA");
+        assertEquals(ForwardingDirection.BIDIRECTIONAL, link.getDirection(),"otn tapi link should be BIDIRECTIONAL");
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
             .link.NodeEdgePoint> nodeEdgePointList = new ArrayList<>(link.nonnullNodeEdgePoint().values());
-        assertEquals("topology uuid should be the same for the two termination point of the link",
-            topologyUuid, nodeEdgePointList.get(0).getTopologyUuid());
-        assertEquals("topology uuid should be the same for the two termination point of the link",
-            topologyUuid, nodeEdgePointList.get(1).getTopologyUuid());
-        assertThat("transitional links should terminate on DSR node and Photonic node",
-            nodeEdgePointList.get(0).getNodeUuid().getValue(),
-            either(containsString(node1Uuid.getValue())).or(containsString(node2Uuid.getValue())));
-        assertThat("transitional links should terminate on DSR node and Photonic node",
-            nodeEdgePointList.get(1).getNodeUuid().getValue(),
-            either(containsString(node1Uuid.getValue())).or(containsString(node2Uuid.getValue())));
-        Uuid nep1Uuid = new Uuid(UUID.nameUUIDFromBytes(tp1.getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid nep2Uuid = new Uuid(UUID.nameUUIDFromBytes(tp2.getBytes(Charset.forName("UTF-8"))).toString());
-        assertThat("transitional links should terminate on " + tp1 + " and " + tp2 + " neps",
-            nodeEdgePointList.get(0).getNodeEdgePointUuid().getValue(),
-            either(containsString(nep1Uuid.getValue())).or(containsString(nep2Uuid.getValue())));
-        assertThat("transitional links should terminate on DSR node and Photonic node",
-            nodeEdgePointList.get(1).getNodeEdgePointUuid().getValue(),
-            either(containsString(nep1Uuid.getValue())).or(containsString(nep2Uuid.getValue())));
-    }
-
-
-    private void checkOmsLink(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link link,
-                              Uuid node1Uuid, Uuid node2Uuid, Uuid tp1Uuid, Uuid tp2Uuid, Uuid linkUuid,
-                              String linkName) {
-        assertEquals("bad name for the link", linkName, link.getName().get(
-            new NameKey("OMS link name")).getValue());
-        assertEquals("bad uuid for link", linkUuid, link.getUuid());
-        assertEquals("oms link should be between 2 nodes of protocol layers PHOTONIC_MEDIA",
-            LayerProtocolName.PHOTONICMEDIA.getName(), link.getLayerProtocolName().get(0).getName());
-        assertEquals("otn tapi link should be BIDIRECTIONAL",
-            ForwardingDirection.BIDIRECTIONAL, link.getDirection());
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
-            .link.NodeEdgePoint> nodeEdgePointList = new ArrayList<>(link.nonnullNodeEdgePoint().values());
-        assertEquals("oms link should be between 2 neps",2 , nodeEdgePointList.size());
-        assertEquals("topology uuid should be the same for the two termination point of the link",
-            topologyUuid, nodeEdgePointList.get(0).getTopologyUuid());
-        assertEquals("topology uuid should be the same for the two termination point of the link",
-            topologyUuid, nodeEdgePointList.get(1).getTopologyUuid());
+        assertEquals(2 , nodeEdgePointList.size(), "oms link should be between 2 neps");
+        assertEquals(topologyUuid, nodeEdgePointList.get(0).getTopologyUuid(),
+            "topology uuid should be the same for the two termination point of the link");
+        assertEquals(topologyUuid, nodeEdgePointList.get(1).getTopologyUuid(),
+            "topology uuid should be the same for the two termination point of the link");
         assertThat("oms links should terminate on two distinct nodes",
             nodeEdgePointList.get(0).getNodeUuid().getValue(),
             either(containsString(node1Uuid.getValue())).or(containsString(node2Uuid.getValue())));
@@ -1297,24 +1217,25 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
             either(containsString(tp1Uuid.getValue())).or(containsString(tp2Uuid.getValue())));
     }
 
-    private void checkXpdrRdmLink(org.opendaylight.yang.gen.v1.urn
-                                      .onf.otcc.yang.tapi.topology.rev181210.topology.Link link,
-                              Uuid node1Uuid, Uuid node2Uuid, Uuid tp1Uuid, Uuid tp2Uuid, Uuid linkUuid,
-                              String linkName) {
-        assertEquals("bad name for the link", linkName, link.getName().get(
-            new NameKey("XPDR-RDM link name")).getValue());
-        assertEquals("bad uuid for link", linkUuid, link.getUuid());
-        assertEquals("oms link should be between 2 nodes of protocol layers PHOTONIC_MEDIA",
-            LayerProtocolName.PHOTONICMEDIA.getName(), link.getLayerProtocolName().get(0).getName());
-        assertEquals("otn tapi link should be BIDIRECTIONAL",
-            ForwardingDirection.BIDIRECTIONAL, link.getDirection());
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
+    private void checkXpdrRdmLink(
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link link, Uuid node1Uuid,
+            Uuid node2Uuid, Uuid tp1Uuid, Uuid tp2Uuid, Uuid linkUuid, String linkName) {
+        assertEquals(linkName, link.getName().get(new NameKey("XPDR-RDM link name")).getValue(),
+            "bad name for the link");
+        assertEquals(linkUuid, link.getUuid(), "bad uuid for link");
+        assertEquals(
+            LayerProtocolName.PHOTONICMEDIA.getName(),
+            link.getLayerProtocolName().stream().findFirst().orElseThrow().getName(),
+            "oms link should be between 2 nodes of protocol layers PHOTONIC_MEDIA");
+        assertEquals(ForwardingDirection.BIDIRECTIONAL, link.getDirection(),
+            "otn tapi link should be BIDIRECTIONAL");
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
             .link.NodeEdgePoint> nodeEdgePointList = new ArrayList<>(link.nonnullNodeEdgePoint().values());
-        assertEquals("oms link should be between 2 neps",2 , nodeEdgePointList.size());
-        assertEquals("topology uuid should be the same for the two termination point of the link",
-            topologyUuid, nodeEdgePointList.get(0).getTopologyUuid());
-        assertEquals("topology uuid should be the same for the two termination point of the link",
-            topologyUuid, nodeEdgePointList.get(1).getTopologyUuid());
+        assertEquals(2 , nodeEdgePointList.size(), "oms link should be between 2 neps");
+        assertEquals(topologyUuid, nodeEdgePointList.get(0).getTopologyUuid(),
+            "topology uuid should be the same for the two termination point of the link");
+        assertEquals(topologyUuid, nodeEdgePointList.get(1).getTopologyUuid(),
+            "topology uuid should be the same for the two termination point of the link");
         assertThat("oms links should terminate on two distinct nodes",
             nodeEdgePointList.get(0).getNodeUuid().getValue(),
             either(containsString(node1Uuid.getValue())).or(containsString(node2Uuid.getValue())));
@@ -1352,4 +1273,54 @@ public class ConvertORTopoToFullTapiTopoTest extends AbstractTest {
         tpdr1Bldr.setTerminationPoint(tps);
         return new NodeBuilder(initialNode).addAugmentation(tpdr1Bldr.build()).build();
     }
+
+    private int getRank(String searchedChar, List<OwnedNodeEdgePoint> onepList) {
+        int foundAtRank = 0;
+        int rank = 0;
+        for (OwnedNodeEdgePoint onep: onepList) {
+            for (Map.Entry<NameKey, Name> entry: onep.getName().entrySet()) {
+                if (entry.getValue().getValue().contains(searchedChar)) {
+                    foundAtRank = rank;
+                }
+            }
+            rank++;
+        }
+        LOG.info("searched Char {} found at rank {}", searchedChar, foundAtRank);
+        return foundAtRank;
+    }
+
+    private int getNodeRank(String searchedChar,
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> nodeList) {
+        int foundAtRank = 0;
+        int rank = 0;
+        for (org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node node: nodeList) {
+            for (Map.Entry<NameKey, Name> entry: node.getName().entrySet()) {
+                if (entry.getValue().getValue().contains(searchedChar)) {
+                    foundAtRank = rank;
+                }
+            }
+            rank++;
+        }
+        LOG.info("searched Char {} found at rank {}", searchedChar, foundAtRank);
+        return foundAtRank;
+    }
+
+    private Integer nrgContainsClientAndNetwork(List<NodeRuleGroup> nrgList, Uuid clientNepUuid, Uuid networkNepUuid) {
+        // 1 NRG should at least contain the NEP of interest in the NEP List
+        Integer indexNrg = 0;
+        for (NodeRuleGroup nrg : nrgList) {
+            Boolean foundClient = false;
+            Boolean foundNetwork = false;
+            for (NodeEdgePoint nep : nrg.nonnullNodeEdgePoint().values()) {
+                foundClient = foundClient || nep.getNodeEdgePointUuid().equals(clientNepUuid);
+                foundNetwork = foundNetwork || nep.getNodeEdgePointUuid().equals(networkNepUuid);
+            }
+            if (foundClient && foundNetwork) {
+                return indexNrg;
+            }
+            indexNrg++;
+        }
+        return null;
+    }
+
 }
index fea176c1658ab92c4c0d9840b3dcbfd4d7accc91..395f9b34fc591f48940d9711660b1faff516de71 100644 (file)
@@ -12,9 +12,10 @@ import static org.hamcrest.CoreMatchers.either;
 import static org.hamcrest.CoreMatchers.hasItem;
 import static org.hamcrest.CoreMatchers.hasItems;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import com.google.common.util.concurrent.FluentFuture;
 import java.nio.charset.Charset;
@@ -28,26 +29,26 @@ import java.util.UUID;
 import java.util.concurrent.ExecutionException;
 import java.util.stream.Collectors;
 import org.eclipse.jdt.annotation.Nullable;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.common.InstanceIdentifiers;
 import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
-import org.opendaylight.transportpce.common.network.RequestProcessor;
 import org.opendaylight.transportpce.tapi.TapiStringConstants;
 import org.opendaylight.transportpce.tapi.utils.TapiLink;
+import org.opendaylight.transportpce.tapi.utils.TapiLinkImpl;
 import org.opendaylight.transportpce.tapi.utils.TapiTopologyDataUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
 import org.opendaylight.transportpce.test.utils.TopologyDataUtils;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.Link1Builder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev211210.TerminationPoint1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.Link1Builder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.network.rev230526.TerminationPoint1Builder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.state.types.rev191129.State;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.equipment.states.types.rev191129.AdminStates;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmTpType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev230526.OpenroadmTpType;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NetworkId;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.NodeId;
@@ -63,41 +64,43 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.top
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPoint;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.node.TerminationPointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.AdministrativeState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.CapacityUnit;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.ForwardingDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LifecycleState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.OperationalState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortRole;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.TerminationState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE100GigE;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev181210.DIGITALSIGNALTYPE10GigELAN;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU2;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU2E;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.odu.rev181210.ODUTYPEODU4;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROMS;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev181210.PHOTONICLAYERQUALIFIEROTSi;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.ForwardingRule;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.RuleType;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroup;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.edge.point.MappedServiceInterfacePointKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.Rule;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.CAPACITYUNITGBPS;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Direction;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.ForwardingDirection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LAYERPROTOCOLQUALIFIER;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.PortRole;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU2;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU2E;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.digital.otn.rev221121.ODUTYPEODU4;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev221121.DIGITALSIGNALTYPE100GigE;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.dsr.rev221121.DIGITALSIGNALTYPE10GigELAN;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROMS;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTS;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.photonic.media.rev221121.PHOTONICLAYERQUALIFIEROTSi;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.FORWARDINGRULEMAYFORWARDACROSSGROUP;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.RuleType;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroup;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.MappedServiceInterfacePointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.edge.point.SupportedCepLayerProtocolQualifierInstances;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.Rule;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.Uint64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+
 public class ConvertORTopoToTapiTopoTest extends AbstractTest {
     private static final Logger LOG = LoggerFactory.getLogger(ConvertORTopoToTapiTopoTest.class);
 
@@ -112,64 +115,73 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
     private static TapiLink tapiLink;
     private static DataBroker dataBroker = getDataBroker();
 
-    @BeforeClass
-    public static void setUp() throws InterruptedException, ExecutionException {
-        TopologyDataUtils.writeTopologyFromFileToDatastore(getDataStoreContextUtil(),
-            TapiTopologyDataUtils.OPENROADM_TOPOLOGY_FILE, InstanceIdentifiers.OVERLAY_NETWORK_II);
-        TopologyDataUtils.writeTopologyFromFileToDatastore(getDataStoreContextUtil(),
-            TapiTopologyDataUtils.OTN_TOPOLOGY_FILE, InstanceIdentifiers.OTN_NETWORK_II);
-        TopologyDataUtils.writePortmappingFromFileToDatastore(getDataStoreContextUtil(),
+    @BeforeAll
+    static void setUp() throws InterruptedException, ExecutionException {
+        TopologyDataUtils.writeTopologyFromFileToDatastore(
+            getDataStoreContextUtil(),
+            TapiTopologyDataUtils.OPENROADM_TOPOLOGY_FILE,
+            InstanceIdentifiers.OVERLAY_NETWORK_II);
+        TopologyDataUtils.writeTopologyFromFileToDatastore(
+            getDataStoreContextUtil(),
+            TapiTopologyDataUtils.OTN_TOPOLOGY_FILE,
+            InstanceIdentifiers.OTN_NETWORK_II);
+        TopologyDataUtils.writePortmappingFromFileToDatastore(
+            getDataStoreContextUtil(),
             TapiTopologyDataUtils.PORTMAPPING_FILE);
-
-        KeyedInstanceIdentifier<Node, NodeKey> muxAIID = InstanceIdentifier.create(Networks.class)
-            .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network
-                .class, new NetworkKey(new NetworkId("otn-topology")))
-            .child(Node.class, new NodeKey(new NodeId("SPDR-SA1-XPDR1")));
         FluentFuture<Optional<Node>> muxAFuture = dataBroker.newReadOnlyTransaction()
-            .read(LogicalDatastoreType.CONFIGURATION, muxAIID);
-        KeyedInstanceIdentifier<Node, NodeKey> muxCIID = InstanceIdentifier.create(Networks.class)
-            .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network
-                .class, new NetworkKey(new NetworkId("otn-topology")))
-            .child(Node.class, new NodeKey(new NodeId("SPDR-SC1-XPDR1")));
-        FluentFuture<Optional<Node>> muxCFuture = dataBroker.newReadOnlyTransaction()
-            .read(LogicalDatastoreType.CONFIGURATION, muxCIID);
-        KeyedInstanceIdentifier<Node, NodeKey> switchIID = InstanceIdentifier.create(Networks.class)
-            .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network
-                .class, new NetworkKey(new NetworkId("otn-topology")))
-            .child(Node.class, new NodeKey(new NodeId("SPDR-SA1-XPDR2")));
-        FluentFuture<Optional<Node>> switchFuture = dataBroker.newReadOnlyTransaction()
-            .read(LogicalDatastoreType.CONFIGURATION, switchIID);
-
-        otnMuxA = muxAFuture.get().get();
-        otnMuxC = muxCFuture.get().get();
-        otnSwitch = switchFuture.get().get();
-
-        KeyedInstanceIdentifier<Node, NodeKey> tpdrIID = InstanceIdentifier.create(Networks.class)
-            .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network
-                .class, new NetworkKey(new NetworkId("otn-topology")))
-            .child(Node.class, new NodeKey(new NodeId("XPDR-A1-XPDR1")));
-        FluentFuture<Optional<Node>> tpdrFuture = dataBroker.newReadOnlyTransaction()
-            .read(LogicalDatastoreType.CONFIGURATION, tpdrIID);
-        tpdr100G = tpdrFuture.get().get();
-
-        InstanceIdentifier<Network1> linksIID = InstanceIdentifier.create(Networks.class)
-            .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.networks.Network
-                .class, new NetworkKey(new NetworkId("otn-topology")))
-            .augmentation(Network1.class);
+            .read(LogicalDatastoreType.CONFIGURATION,
+            //muxAIID
+            InstanceIdentifier.create(Networks.class)
+                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
+                        .networks.Network.class,
+                    new NetworkKey(new NetworkId("otn-topology")))
+                .child(Node.class, new NodeKey(new NodeId("SPDR-SA1-XPDR1"))));
+        FluentFuture<Optional<Node>> muxCFuture =
+            dataBroker.newReadOnlyTransaction().read(LogicalDatastoreType.CONFIGURATION,
+            //muxCIID
+            InstanceIdentifier.create(Networks.class)
+                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
+                        .networks.Network.class,
+                    new NetworkKey(new NetworkId("otn-topology")))
+                .child(Node.class, new NodeKey(new NodeId("SPDR-SC1-XPDR1"))));
+        FluentFuture<Optional<Node>> switchFuture =
+            dataBroker.newReadOnlyTransaction().read(LogicalDatastoreType.CONFIGURATION,
+            //switchIID
+            InstanceIdentifier.create(Networks.class)
+                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
+                        .networks.Network.class,
+                    new NetworkKey(new NetworkId("otn-topology")))
+                .child(Node.class, new NodeKey(new NodeId("SPDR-SA1-XPDR2"))));
+        otnMuxA = muxAFuture.get().orElseThrow();
+        otnMuxC = muxCFuture.get().orElseThrow();
+        otnSwitch = switchFuture.get().orElseThrow();
+        FluentFuture<Optional<Node>> tpdrFuture =
+            dataBroker.newReadOnlyTransaction().read(LogicalDatastoreType.CONFIGURATION,
+            //tpdrIID
+            InstanceIdentifier.create(Networks.class)
+                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
+                        .networks.Network.class,
+                    new NetworkKey(new NetworkId("otn-topology")))
+                .child(Node.class, new NodeKey(new NodeId("XPDR-A1-XPDR1"))));
+        tpdr100G = tpdrFuture.get().orElseThrow();
         FluentFuture<Optional<Network1>> linksFuture = dataBroker.newReadOnlyTransaction()
-            .read(LogicalDatastoreType.CONFIGURATION, linksIID);
-        otnLinks = linksFuture.get().get().getLink();
-
-        topologyUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_MULTILAYER.getBytes(
-            Charset.forName("UTF-8"))).toString());
-        networkTransactionService = new NetworkTransactionImpl(
-            new RequestProcessor(getDataStoreContextUtil().getDataBroker()));
-        tapiLink = new TapiLink(networkTransactionService);
+            .read(LogicalDatastoreType.CONFIGURATION,
+            //linksIID
+            InstanceIdentifier.create(Networks.class)
+                .child(org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226
+                        .networks.Network.class,
+                    new NetworkKey(new NetworkId("otn-topology")))
+                .augmentation(Network1.class));
+        otnLinks = linksFuture.get().orElseThrow().getLink();
+        topologyUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_MULTILAYER
+            .getBytes(Charset.forName("UTF-8"))).toString());
+        networkTransactionService = new NetworkTransactionImpl(getDataBroker());
+        tapiLink = new TapiLinkImpl(networkTransactionService);
         LOG.info("TEST SETUP READY");
     }
 
     @Test
-    public void convertNodeWhenNoStates() {
+    void convertNodeWhenNoStates() {
         Node tpdr = changeTerminationPointState(tpdr100G, "XPDR1-NETWORK1", null, null);
         List<String> networkPortList = new ArrayList<>();
         for (TerminationPoint tp : tpdr100G.augmentation(Node1.class).getTerminationPoint().values()) {
@@ -177,160 +189,97 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
                 networkPortList.add(tp.getTpId().getValue());
             }
         }
-        ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topologyUuid, tapiLink);
+        ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(topologyUuid);
         tapiFactory.convertNode(tpdr, networkPortList);
 
-        Uuid dsrNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+DSR".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node dsrNode = tapiFactory
-            .getTapiNodes().get(new
-                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey(dsrNodeUuid));
+        Uuid dsrNodeUuid = new Uuid(
+            UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+XPONDER".getBytes(Charset.forName("UTF-8"))).toString());
+        var dsrNode = tapiFactory.getTapiNodes()
+            .get(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
+                .topology.NodeKey(dsrNodeUuid));
         Uuid networkNepUuid = new Uuid(
             UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+iODU+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
                 .toString());
         OwnedNodeEdgePoint nepN = dsrNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(networkNepUuid));
-        assertNull("Administrative State should not be present", nepN.getAdministrativeState());
-        assertNull("Operational State should not be present", nepN.getOperationalState());
-
-        Uuid otsiNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+OTSi".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node otsiNode = tapiFactory
-            .getTapiNodes().get(new
-                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey(otsiNodeUuid));
-        Uuid enepUuid = new Uuid(
-            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+eOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
-                .toString());
-        Uuid inepUuid = new Uuid(
-            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+iOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
-                .toString());
-        OwnedNodeEdgePoint enep = otsiNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(enepUuid));
-        assertNull("Administrative State should not be present", enep.getAdministrativeState());
-        assertNull("Operational State should not be present", enep.getOperationalState());
+        assertNull(nepN.getAdministrativeState(), "Administrative State should not be present");
+        assertNull(nepN.getOperationalState(), "Operational State should not be present");
 
-        OwnedNodeEdgePoint inep = otsiNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(inepUuid));
-        assertNull("Administrative State should not be present", inep.getAdministrativeState());
-        assertNull("Operational State should not be present", inep.getOperationalState());
     }
 
     @Test
-    public void convertNodeWhenBadStates1() {
-        Node tpdr = changeTerminationPointState(tpdr100G, "XPDR1-NETWORK1", AdminStates.OutOfService,
-            State.OutOfService);
+    void convertNodeWhenBadStates1() {
+        Node tpdr =
+            changeTerminationPointState(tpdr100G, "XPDR1-NETWORK1", AdminStates.OutOfService, State.OutOfService);
         List<String> networkPortList = new ArrayList<>();
         for (TerminationPoint tp : tpdr100G.augmentation(Node1.class).getTerminationPoint().values()) {
             if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
                 networkPortList.add(tp.getTpId().getValue());
             }
         }
-        ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topologyUuid, tapiLink);
+        ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(topologyUuid);
         tapiFactory.convertNode(tpdr, networkPortList);
 
-        Uuid dsrNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+DSR".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node dsrNode = tapiFactory
-            .getTapiNodes().get(new
-                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey(dsrNodeUuid));
+        Uuid dsrNodeUuid = new Uuid(
+            UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+XPONDER".getBytes(Charset.forName("UTF-8"))).toString());
+        var dsrNode = tapiFactory.getTapiNodes()
+            .get(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
+                    .topology.NodeKey(dsrNodeUuid));
         Uuid networkNepUuid = new Uuid(
             UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+iODU+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
                 .toString());
         OwnedNodeEdgePoint nepN = dsrNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(networkNepUuid));
-        assertEquals("Administrative State should be Locked",
-            AdministrativeState.LOCKED, nepN.getAdministrativeState());
-        assertEquals("Operational State should be Disabled",
-            OperationalState.DISABLED, nepN.getOperationalState());
-
-        Uuid otsiNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+OTSi".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node otsiNode = tapiFactory
-            .getTapiNodes().get(new
-                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey(otsiNodeUuid));
-        Uuid enepUuid = new Uuid(
-            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+eOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
-                .toString());
-        Uuid inepUuid = new Uuid(
-            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+iOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
-                .toString());
-        OwnedNodeEdgePoint enep = otsiNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(enepUuid));
-        assertEquals("Administrative State should be Locked",
-            AdministrativeState.LOCKED, enep.getAdministrativeState());
-        assertEquals("Operational State should be Disabled",
-            OperationalState.DISABLED, enep.getOperationalState());
-
-        OwnedNodeEdgePoint inep = otsiNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(inepUuid));
-        assertEquals("Administrative State should be Locked",
-            AdministrativeState.LOCKED, inep.getAdministrativeState());
-        assertEquals("Operational State should be Disabled",
-            OperationalState.DISABLED, inep.getOperationalState());
+        assertEquals(AdministrativeState.LOCKED, nepN.getAdministrativeState(),
+            "Administrative State should be Locked");
+        assertEquals(OperationalState.DISABLED, nepN.getOperationalState(), "Operational State should be Disabled");
     }
 
     @Test
-    public void convertNodeWhenBadStates2() {
-        Node tpdr = changeTerminationPointState(tpdr100G, "XPDR1-NETWORK1", AdminStates.Maintenance,
-            State.Degraded);
+    void convertNodeWhenBadStates2() {
+        Node tpdr = changeTerminationPointState(tpdr100G, "XPDR1-NETWORK1", AdminStates.Maintenance, State.Degraded);
         List<String> networkPortList = new ArrayList<>();
         for (TerminationPoint tp : tpdr100G.augmentation(Node1.class).getTerminationPoint().values()) {
             if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
                 networkPortList.add(tp.getTpId().getValue());
             }
         }
-        ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topologyUuid, tapiLink);
+        ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(topologyUuid);
         tapiFactory.convertNode(tpdr, networkPortList);
 
-        Uuid dsrNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+DSR".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node dsrNode = tapiFactory
-            .getTapiNodes().get(new
-                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey(dsrNodeUuid));
+        Uuid dsrNodeUuid = new Uuid(
+            UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+XPONDER".getBytes(Charset.forName("UTF-8"))).toString());
+        var dsrNode = tapiFactory.getTapiNodes()
+            .get(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
+                    .topology.NodeKey(dsrNodeUuid));
         Uuid networkNepUuid = new Uuid(
             UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+iODU+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
                 .toString());
         OwnedNodeEdgePoint nepN = dsrNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(networkNepUuid));
-        assertEquals("Administrative State should be Locked",
-            AdministrativeState.LOCKED, nepN.getAdministrativeState());
-        assertEquals("Operational State should be Disabled",
-            OperationalState.DISABLED, nepN.getOperationalState());
-
-        Uuid otsiNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+OTSi".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node otsiNode = tapiFactory
-            .getTapiNodes().get(new
-                org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.NodeKey(otsiNodeUuid));
-        Uuid enepUuid = new Uuid(
-            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+eOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
-                .toString());
-        Uuid inepUuid = new Uuid(
-            UUID.nameUUIDFromBytes(("XPDR-A1-XPDR1+iOTSi+XPDR1-NETWORK1").getBytes(Charset.forName("UTF-8")))
-                .toString());
-        OwnedNodeEdgePoint enep = otsiNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(enepUuid));
-        assertEquals("Administrative State should be Locked",
-            AdministrativeState.LOCKED, enep.getAdministrativeState());
-        assertEquals("Operational State should be Disabled",
-            OperationalState.DISABLED, enep.getOperationalState());
-
-        OwnedNodeEdgePoint inep = otsiNode.nonnullOwnedNodeEdgePoint().get(new OwnedNodeEdgePointKey(inepUuid));
-        assertEquals("Administrative State should be Locked",
-            AdministrativeState.LOCKED, inep.getAdministrativeState());
-        assertEquals("Operational State should be Disabled",
-            OperationalState.DISABLED, inep.getOperationalState());
+        assertEquals(AdministrativeState.LOCKED, nepN.getAdministrativeState(),
+            "Administrative State should be Locked");
+        assertEquals(OperationalState.DISABLED, nepN.getOperationalState(), "Operational State should be Disabled");
     }
 
     @Test
-    public void convertOtnLinkWhenNoState() {
-        HashMap<LinkKey, org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
-            .networks.network.Link> otnLinksAlt = new HashMap<>(otnLinks);
-        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link
-            link = changeOtnLinkState(otnLinks.get(new LinkKey(
+    void convertOtnLinkWhenNoState() {
+        HashMap<LinkKey,
+            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                .networks.network.Link> otnLinksAlt = new HashMap<>(otnLinks);
+        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                .networks.network.Link link =
+            changeOtnLinkState(otnLinks.get(new LinkKey(
                 new LinkId("ODTU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1"))), null, null);
         otnLinksAlt.replace(link.key(), link);
 
-        ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topologyUuid, tapiLink);
         List<String> networkPortListA = new ArrayList<>();
         for (TerminationPoint tp : otnMuxA.augmentation(Node1.class).getTerminationPoint().values()) {
             if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
                 networkPortListA.add(tp.getTpId().getValue());
             }
         }
+        ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(topologyUuid);
+        ConvertORTopoToTapiTopo tapiAbsFactory = new ConvertORTopoToTapiTopo(topologyUuid, tapiLink);
         tapiFactory.convertNode(otnMuxA, networkPortListA);
+        tapiAbsFactory.setTapiNodes(tapiFactory.getTapiNodes());
         List<String> networkPortListC = new ArrayList<>();
         for (TerminationPoint tp : otnMuxC.augmentation(Node1.class).getTerminationPoint().values()) {
             if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
@@ -338,36 +287,41 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
             }
         }
         tapiFactory.convertNode(otnMuxC, networkPortListC);
-        tapiFactory.convertLinks(otnLinksAlt);
+        tapiAbsFactory.setTapiNodes(tapiFactory.getTapiNodes());
+        tapiAbsFactory.convertLinks(otnLinksAlt);
 
-        List<Link> tapiLinks = tapiFactory.getTapiLinks().values().stream()
+        List<Link> tapiLinks = tapiAbsFactory.getTapiLinks().values().stream()
             .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
             .collect(Collectors.toList());
-        assertNull("Administrative State should not be present", tapiLinks.get(3).getAdministrativeState());
-        assertEquals("Administrative state should be UNLOCKED",
-            AdministrativeState.UNLOCKED, tapiLinks.get(0).getAdministrativeState());
-        assertNull("Operational State should not be present", tapiLinks.get(3).getOperationalState());
-        assertEquals("Operational state should be ENABLED",
-            OperationalState.ENABLED, tapiLinks.get(0).getOperationalState());
+        assertNull(tapiLinks.get(1).getAdministrativeState(), "Administrative State should not be present");
+        assertEquals(AdministrativeState.UNLOCKED, tapiLinks.get(0).getAdministrativeState(),
+            "Administrative state should be UNLOCKED");
+        assertNull(tapiLinks.get(1).getOperationalState(), "Operational State should not be present");
+        assertEquals(OperationalState.ENABLED, tapiLinks.get(0).getOperationalState(),
+            "Operational state should be ENABLED");
     }
 
     @Test
-    public void convertOtnLinkWhenNoStateOnOppositeLink() {
-        HashMap<LinkKey, org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
-            .networks.network.Link> otnLinksAlt = new HashMap<>(otnLinks);
-        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link
-            link = changeOtnLinkState(otnLinks.get(new LinkKey(
+    void convertOtnLinkWhenNoStateOnOppositeLink() {
+        HashMap<LinkKey,
+            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                .networks.network.Link> otnLinksAlt = new HashMap<>(otnLinks);
+        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                .networks.network.Link link =
+            changeOtnLinkState(otnLinks.get(new LinkKey(
                 new LinkId("ODTU4-SPDR-SC1-XPDR1-XPDR1-NETWORK1toSPDR-SA1-XPDR1-XPDR1-NETWORK1"))), null, null);
         otnLinksAlt.replace(link.key(), link);
 
-        ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topologyUuid, tapiLink);
         List<String> networkPortListA = new ArrayList<>();
         for (TerminationPoint tp : otnMuxA.augmentation(Node1.class).getTerminationPoint().values()) {
             if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
                 networkPortListA.add(tp.getTpId().getValue());
             }
         }
+        ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(topologyUuid);
+        ConvertORTopoToTapiTopo tapiAbsFactory = new ConvertORTopoToTapiTopo(topologyUuid, tapiLink);
         tapiFactory.convertNode(otnMuxA, networkPortListA);
+        tapiAbsFactory.setTapiNodes(tapiFactory.getTapiNodes());
         List<String> networkPortListC = new ArrayList<>();
         for (TerminationPoint tp : otnMuxC.augmentation(Node1.class).getTerminationPoint().values()) {
             if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
@@ -375,37 +329,41 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
             }
         }
         tapiFactory.convertNode(otnMuxC, networkPortListC);
-        tapiFactory.convertLinks(otnLinksAlt);
+        tapiAbsFactory.setTapiNodes(tapiFactory.getTapiNodes());
+        tapiAbsFactory.convertLinks(otnLinksAlt);
 
-        List<Link> tapiLinks = tapiFactory.getTapiLinks().values().stream()
+        List<Link> tapiLinks = tapiAbsFactory.getTapiLinks().values().stream()
             .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
             .collect(Collectors.toList());
-        assertNull("Administrative State should not be present", tapiLinks.get(3).getAdministrativeState());
-        assertEquals("Administrative state should be UNLOCKED",
-            AdministrativeState.UNLOCKED, tapiLinks.get(0).getAdministrativeState());
-        assertNull("Operational State should not be present", tapiLinks.get(3).getOperationalState());
-        assertEquals("Operational state should be ENABLED",
-            OperationalState.ENABLED, tapiLinks.get(0).getOperationalState());
+        assertNull(tapiLinks.get(1).getAdministrativeState(), "Administrative State should not be present");
+        assertEquals(AdministrativeState.UNLOCKED, tapiLinks.get(0).getAdministrativeState(),
+            "Administrative state should be UNLOCKED");
+        assertNull(tapiLinks.get(1).getOperationalState(), "Operational State should not be present");
+        assertEquals(OperationalState.ENABLED, tapiLinks.get(0).getOperationalState(),
+            "Operational state should be ENABLED");
     }
 
     @Test
-    public void convertOtnLinkWhenBadState1() {
-        HashMap<LinkKey, org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
-            .networks.network.Link> otnLinksAlt = new HashMap<>(otnLinks);
-        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link
-            link = changeOtnLinkState(otnLinks.get(new LinkKey(
+    void convertOtnLinkWhenBadState1() {
+        HashMap<LinkKey,
+            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                .networks.network.Link> otnLinksAlt = new HashMap<>(otnLinks);
+        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                .networks.network.Link link =
+            changeOtnLinkState(otnLinks.get(new LinkKey(
                 new LinkId("ODTU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1"))),
                 AdminStates.OutOfService, State.OutOfService);
         otnLinksAlt.replace(link.key(), link);
-
-        ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topologyUuid, tapiLink);
         List<String> networkPortListA = new ArrayList<>();
         for (TerminationPoint tp : otnMuxA.augmentation(Node1.class).getTerminationPoint().values()) {
             if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
                 networkPortListA.add(tp.getTpId().getValue());
             }
         }
+        ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(topologyUuid);
+        ConvertORTopoToTapiTopo tapiAbsFactory = new ConvertORTopoToTapiTopo(topologyUuid, tapiLink);
         tapiFactory.convertNode(otnMuxA, networkPortListA);
+        tapiAbsFactory.setTapiNodes(tapiFactory.getTapiNodes());
         List<String> networkPortListC = new ArrayList<>();
         for (TerminationPoint tp : otnMuxC.augmentation(Node1.class).getTerminationPoint().values()) {
             if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
@@ -413,39 +371,43 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
             }
         }
         tapiFactory.convertNode(otnMuxC, networkPortListC);
-        tapiFactory.convertLinks(otnLinksAlt);
-
-        List<Link> tapiLinks = tapiFactory.getTapiLinks().values().stream()
+        tapiAbsFactory.setTapiNodes(tapiFactory.getTapiNodes());
+        tapiAbsFactory.convertLinks(otnLinksAlt);
+        List<Link> tapiLinks = tapiAbsFactory.getTapiLinks().values().stream()
             .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
             .collect(Collectors.toList());
-        assertEquals("Administrative state should be LOCKED",
-            AdministrativeState.LOCKED, tapiLinks.get(3).getAdministrativeState());
-        assertEquals("Administrative state should be UNLOCKED",
-            AdministrativeState.UNLOCKED, tapiLinks.get(0).getAdministrativeState());
-        assertEquals("Operational state should be DISABLED",
-            OperationalState.DISABLED, tapiLinks.get(3).getOperationalState());
-        assertEquals("Operational state should be ENABLED",
-            OperationalState.ENABLED, tapiLinks.get(0).getOperationalState());
+        LOG.info("TapiLinks are as follow : {}", tapiLinks);
+        assertEquals(AdministrativeState.LOCKED, tapiLinks.get(1).getAdministrativeState(),
+            "Administrative state should be LOCKED");
+        assertEquals(AdministrativeState.UNLOCKED, tapiLinks.get(0).getAdministrativeState(),
+            "Administrative state should be UNLOCKED");
+        assertEquals(OperationalState.DISABLED, tapiLinks.get(1).getOperationalState(),
+            "Operational state should be DISABLED");
+        assertEquals(OperationalState.ENABLED, tapiLinks.get(0).getOperationalState(),
+            "Operational state should be ENABLED");
     }
 
     @Test
-    public void convertOtnLinkWhenBadState2() {
-        HashMap<LinkKey, org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
-            .networks.network.Link> otnLinksAlt = new HashMap<>(otnLinks);
-        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link
-            link = changeOtnLinkState(otnLinks.get(new LinkKey(
+    void convertOtnLinkWhenBadState2() {
+        HashMap<LinkKey,
+            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                .networks.network.Link> otnLinksAlt = new HashMap<>(otnLinks);
+        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                .networks.network.Link link =
+            changeOtnLinkState(otnLinks.get(new LinkKey(
                 new LinkId("ODTU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1"))),
                 AdminStates.Maintenance, State.Degraded);
         otnLinksAlt.replace(link.key(), link);
-
-        ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topologyUuid, tapiLink);
         List<String> networkPortListA = new ArrayList<>();
         for (TerminationPoint tp : otnMuxA.augmentation(Node1.class).getTerminationPoint().values()) {
             if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
                 networkPortListA.add(tp.getTpId().getValue());
             }
         }
+        ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(topologyUuid);
+        ConvertORTopoToTapiTopo tapiAbsFactory = new ConvertORTopoToTapiTopo(topologyUuid, tapiLink);
         tapiFactory.convertNode(otnMuxA, networkPortListA);
+        tapiAbsFactory.setTapiNodes(tapiFactory.getTapiNodes());
         List<String> networkPortListC = new ArrayList<>();
         for (TerminationPoint tp : otnMuxC.augmentation(Node1.class).getTerminationPoint().values()) {
             if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
@@ -453,39 +415,42 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
             }
         }
         tapiFactory.convertNode(otnMuxC, networkPortListC);
-        tapiFactory.convertLinks(otnLinksAlt);
-
-        List<Link> tapiLinks = tapiFactory.getTapiLinks().values().stream()
+        tapiAbsFactory.setTapiNodes(tapiFactory.getTapiNodes());
+        tapiAbsFactory.convertLinks(otnLinksAlt);
+        List<Link> tapiLinks = tapiAbsFactory.getTapiLinks().values().stream()
             .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
             .collect(Collectors.toList());
-        assertEquals("Administrative state should be LOCKED",
-            AdministrativeState.LOCKED, tapiLinks.get(3).getAdministrativeState());
-        assertEquals("Administrative state should be UNLOCKED",
-            AdministrativeState.UNLOCKED, tapiLinks.get(0).getAdministrativeState());
-        assertEquals("Operational state should be DISABLED",
-            OperationalState.DISABLED, tapiLinks.get(3).getOperationalState());
-        assertEquals("Operational state should be ENABLED",
-            OperationalState.ENABLED, tapiLinks.get(0).getOperationalState());
+        assertEquals(AdministrativeState.LOCKED, tapiLinks.get(1).getAdministrativeState(),
+            "Administrative state should be LOCKED");
+        assertEquals(AdministrativeState.UNLOCKED, tapiLinks.get(0).getAdministrativeState(),
+            "Administrative state should be UNLOCKED");
+        assertEquals(OperationalState.DISABLED, tapiLinks.get(1).getOperationalState(),
+            "Operational state should be DISABLED");
+        assertEquals(OperationalState.ENABLED, tapiLinks.get(0).getOperationalState(),
+            "Operational state should be ENABLED");
     }
 
     @Test
-    public void convertOtnLinkWhenBadStateOnOppositeLink() {
-        HashMap<LinkKey, org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
-            .networks.network.Link> otnLinksAlt = new HashMap<>(otnLinks);
-        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network.Link
-            link = changeOtnLinkState(otnLinks.get(new LinkKey(
+    void convertOtnLinkWhenBadStateOnOppositeLink() {
+        HashMap<LinkKey,
+            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                .networks.network.Link> otnLinksAlt = new HashMap<>(otnLinks);
+        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                .networks.network.Link link =
+            changeOtnLinkState(otnLinks.get(new LinkKey(
                 new LinkId("ODTU4-SPDR-SC1-XPDR1-XPDR1-NETWORK1toSPDR-SA1-XPDR1-XPDR1-NETWORK1"))),
                 AdminStates.OutOfService, State.OutOfService);
         otnLinksAlt.replace(link.key(), link);
-
-        ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topologyUuid, tapiLink);
         List<String> networkPortListA = new ArrayList<>();
         for (TerminationPoint tp : otnMuxA.augmentation(Node1.class).getTerminationPoint().values()) {
             if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
                 networkPortListA.add(tp.getTpId().getValue());
             }
         }
+        ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(topologyUuid);
+        ConvertORTopoToTapiTopo tapiAbsFactory = new ConvertORTopoToTapiTopo(topologyUuid, tapiLink);
         tapiFactory.convertNode(otnMuxA, networkPortListA);
+        tapiAbsFactory.setTapiNodes(tapiFactory.getTapiNodes());
         List<String> networkPortListC = new ArrayList<>();
         for (TerminationPoint tp : otnMuxC.augmentation(Node1.class).getTerminationPoint().values()) {
             if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
@@ -493,24 +458,25 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
             }
         }
         tapiFactory.convertNode(otnMuxC, networkPortListC);
-        tapiFactory.convertLinks(otnLinksAlt);
+        tapiAbsFactory.setTapiNodes(tapiFactory.getTapiNodes());
+        tapiAbsFactory.convertLinks(otnLinksAlt);
 
-        List<Link> tapiLinks = tapiFactory.getTapiLinks().values().stream()
+        List<Link> tapiLinks = tapiAbsFactory.getTapiLinks().values().stream()
             .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
             .collect(Collectors.toList());
-        assertEquals("Administrative state should be LOCKED",
-            AdministrativeState.LOCKED, tapiLinks.get(3).getAdministrativeState());
-        assertEquals("Administrative state should be UNLOCKED",
-            AdministrativeState.UNLOCKED, tapiLinks.get(0).getAdministrativeState());
-        assertEquals("Operational state should be DISABLED",
-            OperationalState.DISABLED, tapiLinks.get(3).getOperationalState());
-        assertEquals("Operational state should be ENABLED",
-            OperationalState.ENABLED, tapiLinks.get(0).getOperationalState());
+        assertEquals(AdministrativeState.LOCKED, tapiLinks.get(1).getAdministrativeState(),
+            "Administrative state should be LOCKED");
+        assertEquals(AdministrativeState.UNLOCKED, tapiLinks.get(0).getAdministrativeState(),
+            "Administrative state should be UNLOCKED");
+        assertEquals(OperationalState.DISABLED, tapiLinks.get(1).getOperationalState(),
+            "Operational state should be DISABLED");
+        assertEquals(OperationalState.ENABLED, tapiLinks.get(0).getOperationalState(),
+            "Operational state should be ENABLED");
     }
 
     @Test
-    public void convertNodeForTransponder100G() {
-        ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topologyUuid, tapiLink);
+    void convertNodeForTransponder100G() {
+        ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(topologyUuid);
         List<String> networkPortList = new ArrayList<>();
         for (TerminationPoint tp : tpdr100G.augmentation(Node1.class).getTerminationPoint().values()) {
             if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
@@ -518,31 +484,22 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
             }
         }
         tapiFactory.convertNode(tpdr100G, networkPortList);
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> tapiNodes
-            = tapiFactory.getTapiNodes().values().stream()
-            .sorted((n1, n2) -> n1.getUuid().getValue().compareTo(n2.getUuid().getValue()))
-            .collect(Collectors.toList());
-
-        assertEquals("Node list size should be 2", 2, tapiFactory.getTapiNodes().size());
-        assertEquals("Link list size should be 2", 2, tapiFactory.getTapiLinks().size());
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> tapiNodes =
+            tapiFactory.getTapiNodes().values().stream()
+                .sorted((n1, n2) -> n1.getUuid().getValue().compareTo(n2.getUuid().getValue()))
+                .collect(Collectors.toList());
 
-        Uuid dsrNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+DSR".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        checkDsrNode(tapiNodes.get(1), dsrNodeUuid, "tpdr", "XPDR-A1-XPDR1+DSR");
-        Uuid otsiNodeUuid = new Uuid(UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+OTSi".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        checkOtsiNode(tapiNodes.get(0), otsiNodeUuid, "tpdr", "XPDR-A1-XPDR1+OTSi");
+        assertEquals(1, tapiFactory.getTapiNodes().size(), "Node list size should be 1 (DSR-ODU merged)");
+        assertEquals(0, tapiFactory.getTapiLinks().size(), "Link list size should be 0 (no more transitional links)");
 
-        List<Link> tapiLinks = tapiFactory.getTapiLinks().values().stream()
-            .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
-            .collect(Collectors.toList());
-        checkTransitionalLink(tapiLinks.get(1), dsrNodeUuid, otsiNodeUuid,
-            "XPDR-A1-XPDR1+iODU+XPDR1-NETWORK1", "XPDR-A1-XPDR1+iOTSi+XPDR1-NETWORK1", "XPDR-A1-XPDR1");
+        Uuid dsrNodeUuid = new Uuid(
+            UUID.nameUUIDFromBytes("XPDR-A1-XPDR1+XPONDER".getBytes(Charset.forName("UTF-8"))).toString());
+        checkDsrNode(tapiNodes.get(getNodeRank("SPDR-SA1", tapiNodes)), dsrNodeUuid, "tpdr", "XPDR-A1-XPDR1+XPONDER");
     }
 
     @Test
-    public void convertNodeForOtnMuxponder() {
-        ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topologyUuid, tapiLink);
+    void convertNodeForOtnMuxponder() {
+        ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(topologyUuid);
         List<String> networkPortList = new ArrayList<>();
         for (TerminationPoint tp : otnMuxA.augmentation(Node1.class).getTerminationPoint().values()) {
             if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
@@ -550,30 +507,21 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
             }
         }
         tapiFactory.convertNode(otnMuxA, networkPortList);
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> tapiNodes
-            = tapiFactory.getTapiNodes().values().stream()
-            .sorted((n1, n2) -> n1.getUuid().getValue().compareTo(n2.getUuid().getValue()))
-            .collect(Collectors.toList());
-
-        assertEquals("Node list size should be 2", 2, tapiFactory.getTapiNodes().size());
-        assertEquals("Link list size should be 1", 1, tapiFactory.getTapiLinks().size());
-        Uuid dsrNodeUuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+DSR".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        checkDsrNode(tapiNodes.get(0), dsrNodeUuid, "mux", "SPDR-SA1-XPDR1+DSR");
-        Uuid otsiNodeUuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+OTSi".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        checkOtsiNode(tapiNodes.get(1), otsiNodeUuid, "mux", "SPDR-SA1-XPDR1+OTSi");
-
-        List<Link> tapiLinks = tapiFactory.getTapiLinks().values().stream()
-            .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
-            .collect(Collectors.toList());
-        checkTransitionalLink(tapiLinks.get(0), dsrNodeUuid, otsiNodeUuid,
-            "SPDR-SA1-XPDR1+iODU+XPDR1-NETWORK1", "SPDR-SA1-XPDR1+iOTSi+XPDR1-NETWORK1", "SPDR-SA1-XPDR1");
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> tapiNodes =
+            tapiFactory.getTapiNodes().values().stream()
+                .sorted((n1, n2) -> n1.getUuid().getValue().compareTo(n2.getUuid().getValue()))
+                .collect(Collectors.toList());
+
+        assertEquals(1, tapiFactory.getTapiNodes().size(), "Node list size should be 1 (DSR & ODU merged");
+        assertEquals(0, tapiFactory.getTapiLinks().size(), "Link list size should be 0, no more transitional links");
+        Uuid dsrNodeUuid = new Uuid(
+            UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+XPONDER".getBytes(Charset.forName("UTF-8"))).toString());
+        checkDsrNode(tapiNodes.get(getNodeRank("SPDR-SA1", tapiNodes)), dsrNodeUuid, "mux", "SPDR-SA1-XPDR1+XPONDER");
     }
 
     @Test
-    public void convertNodeForOtnSwitch() {
-        ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topologyUuid, tapiLink);
+    void convertNodeForOtnSwitch() {
+        ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(topologyUuid);
         List<String> networkPortList = new ArrayList<>();
         for (TerminationPoint tp : otnSwitch.augmentation(Node1.class).getTerminationPoint().values()) {
             if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
@@ -581,38 +529,32 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
             }
         }
         tapiFactory.convertNode(otnSwitch, networkPortList);
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> tapiNodes
-            = tapiFactory.getTapiNodes().values().stream()
-            .sorted((n1, n2) -> n1.getUuid().getValue().compareTo(n2.getUuid().getValue()))
-            .collect(Collectors.toList());
-
-        assertEquals("Node list size should be 2", 2, tapiFactory.getTapiNodes().size());
-        assertEquals("Link list size should be 4", 4, tapiFactory.getTapiLinks().size());
-
-        Uuid dsrNodeUuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR2+DSR".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        checkDsrNode(tapiNodes.get(0), dsrNodeUuid, "switch", "SPDR-SA1-XPDR2+DSR");
-        Uuid otsiNodeUuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR2+OTSi".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        checkOtsiNode(tapiNodes.get(1), otsiNodeUuid, "switch", "SPDR-SA1-XPDR2+OTSi");
-
-        List<Link> tapiLinks = tapiFactory.getTapiLinks().values().stream()
-            .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
-            .collect(Collectors.toList());
-        checkTransitionalLink(tapiLinks.get(2), dsrNodeUuid, otsiNodeUuid,
-            "SPDR-SA1-XPDR2+iODU+XPDR2-NETWORK4", "SPDR-SA1-XPDR2+iOTSi+XPDR2-NETWORK4", "SPDR-SA1-XPDR2");
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> tapiNodes =
+            tapiFactory.getTapiNodes().values().stream()
+                .sorted((n1, n2) -> n1.getUuid().getValue().compareTo(n2.getUuid().getValue()))
+                .collect(Collectors.toList());
+
+        assertEquals(1, tapiFactory.getTapiNodes().size(), "Node list size should be 1 (DSR/ODU merged)");
+        assertEquals(0, tapiFactory.getTapiLinks().size(), "Link list size should be 0 : no more transitional link");
+
+        Uuid dsrNodeUuid = new Uuid(
+            UUID.nameUUIDFromBytes("SPDR-SA1-XPDR2+XPONDER".getBytes(Charset.forName("UTF-8"))).toString());
+        checkDsrNode(tapiNodes.get(getNodeRank("SPDR-SA1", tapiNodes)), dsrNodeUuid, "switch",
+            "SPDR-SA1-XPDR2+XPONDER");
     }
 
     @Test
-    public void convertOtnLink() {
-        ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topologyUuid, tapiLink);
+    void convertOtnLink() {
         List<String> networkPortListA = new ArrayList<>();
         for (TerminationPoint tp : otnMuxA.augmentation(Node1.class).getTerminationPoint().values()) {
             if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
                 networkPortListA.add(tp.getTpId().getValue());
             }
         }
+        ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(topologyUuid);
+        ConvertORTopoToTapiTopo tapiAbsFactory = new ConvertORTopoToTapiTopo(topologyUuid, tapiLink);
         tapiFactory.convertNode(otnMuxA, networkPortListA);
+        tapiAbsFactory.setTapiNodes(tapiFactory.getTapiNodes());
         List<String> networkPortListC = new ArrayList<>();
         for (TerminationPoint tp : otnMuxC.augmentation(Node1.class).getTerminationPoint().values()) {
             if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
@@ -620,58 +562,66 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
             }
         }
         tapiFactory.convertNode(otnMuxC, networkPortListC);
-        tapiFactory.convertLinks(otnLinks);
-        assertEquals("Link list size should be 4", 4, tapiFactory.getTapiLinks().size());
-
-        Uuid node1Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+DSR".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        Uuid node2Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SC1-XPDR1+DSR".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        Uuid node3Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+OTSi".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        Uuid node4Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SC1-XPDR1+OTSi".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        Uuid tp1Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+eODU+XPDR1-NETWORK1"
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid tp2Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SC1-XPDR1+eODU+XPDR1-NETWORK1"
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid tp3Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+iOTSi+XPDR1-NETWORK1"
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid tp4Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SC1-XPDR1+iOTSi+XPDR1-NETWORK1"
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid link1Uuid =
-            new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+eODU+XPDR1-NETWORK1toSPDR-SC1-XPDR1+eODU+XPDR1-NETWORK1"
-                .getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid link2Uuid =
-            new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+iOTSi+XPDR1-NETWORK1toSPDR-SC1-XPDR1+iOTSi+XPDR1-NETWORK1"
-                .getBytes(Charset.forName("UTF-8"))).toString());
-
-        List<Link> links = tapiFactory.getTapiLinks().values().stream()
+        tapiAbsFactory.setTapiNodes(tapiFactory.getTapiNodes());
+
+        tapiAbsFactory.convertLinks(otnLinks);
+        assertEquals(2, tapiAbsFactory.getTapiLinks().size(), "Link list size should be 2 : no transitional link");
+
+        Uuid node1Uuid = new Uuid(
+            UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+XPONDER".getBytes(Charset.forName("UTF-8"))).toString());
+        Uuid node2Uuid = new Uuid(
+            UUID.nameUUIDFromBytes("SPDR-SC1-XPDR1+XPONDER".getBytes(Charset.forName("UTF-8"))).toString());
+        Uuid node3Uuid = new Uuid(
+            UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+XPONDER".getBytes(Charset.forName("UTF-8"))).toString());
+        Uuid node4Uuid = new Uuid(
+            UUID.nameUUIDFromBytes("SPDR-SC1-XPDR1+XPONDER".getBytes(Charset.forName("UTF-8"))).toString());
+        Uuid tp1Uuid = new Uuid(
+            UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+eODU+XPDR1-NETWORK1".getBytes(Charset.forName("UTF-8"))).toString());
+        Uuid tp2Uuid = new Uuid(
+            UUID.nameUUIDFromBytes("SPDR-SC1-XPDR1+eODU+XPDR1-NETWORK1".getBytes(Charset.forName("UTF-8"))).toString());
+        Uuid tp3Uuid = new Uuid(
+            UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+iOTSi+XPDR1-NETWORK1".getBytes(Charset.forName("UTF-8")))
+                .toString());
+        Uuid tp4Uuid = new Uuid(
+            UUID.nameUUIDFromBytes("SPDR-SC1-XPDR1+iOTSi+XPDR1-NETWORK1".getBytes(Charset.forName("UTF-8")))
+                .toString());
+        Uuid link1Uuid = new Uuid(
+            UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+eODU+XPDR1-NETWORK1toSPDR-SC1-XPDR1+eODU+XPDR1-NETWORK1"
+                    .getBytes(Charset.forName("UTF-8")))
+                .toString());
+        Uuid link2Uuid = new Uuid(
+            UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+iOTSi+XPDR1-NETWORK1toSPDR-SC1-XPDR1+iOTSi+XPDR1-NETWORK1"
+                    .getBytes(Charset.forName("UTF-8")))
+                .toString());
+        List<Link> links = tapiAbsFactory.getTapiLinks().values().stream()
             .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
             .collect(Collectors.toList());
-        checkOtnLink(links.get(3), node1Uuid, node2Uuid, tp1Uuid, tp2Uuid, link1Uuid,
+        LOG.info("Node3 {}, Node4 = {},", node3Uuid, node4Uuid);
+        checkOtnLink(links.get(1), node1Uuid, node2Uuid, tp1Uuid, tp2Uuid, link1Uuid,
             "SPDR-SA1-XPDR1+eODU+XPDR1-NETWORK1toSPDR-SC1-XPDR1+eODU+XPDR1-NETWORK1");
-        checkOtnLink(links.get(2), node3Uuid, node4Uuid, tp3Uuid, tp4Uuid, link2Uuid,
+        checkOtnLink(links.get(0), node3Uuid, node4Uuid, tp3Uuid, tp4Uuid, link2Uuid,
             "SPDR-SA1-XPDR1+iOTSi+XPDR1-NETWORK1toSPDR-SC1-XPDR1+iOTSi+XPDR1-NETWORK1");
+        LOG.info("The link we check  has name {}", links.get(0).getName());
     }
 
     @Test
-    public void convertRoadmInfrastructureWhenNoXponderAttached() {
-        ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topologyUuid, tapiLink);
-        tapiFactory.convertRoadmInfrastructure();
-
-        assertEquals("Node list size should be 1", 1, tapiFactory.getTapiNodes().size());
-        assertEquals("Link list size should be empty", 0, tapiFactory.getTapiLinks().size());
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> tapiNodes
-            = tapiFactory.getTapiNodes().values().stream().collect(Collectors.toList());
-        Uuid otsiNodeUuid = new Uuid(UUID.nameUUIDFromBytes("ROADM-infra".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        checkOtsiNode(tapiNodes.get(0), otsiNodeUuid, "infra", "ROADM-infra");
+    void convertRoadmInfrastructureWhenNoXponderAttached() {
+        ConvertORTopoToTapiTopo tapiAbsFactory = new ConvertORTopoToTapiTopo(topologyUuid, tapiLink);
+        tapiAbsFactory.convertRoadmInfrastructure();
+
+        assertEquals(1, tapiAbsFactory.getTapiNodes().size(), "Node list size should be 1");
+        assertEquals(0, tapiAbsFactory.getTapiLinks().size(), "Link list size should be empty");
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> tapiNodes =
+            tapiAbsFactory.getTapiNodes().values().stream().collect(Collectors.toList());
+        Uuid photNodeUuid = new Uuid(
+            UUID.nameUUIDFromBytes("ROADM-infra".getBytes(Charset.forName("UTF-8"))).toString());
+        checkOtsiNode(tapiNodes.get(0), photNodeUuid, "infra", "ROADM-infra");
     }
 
     @Test
-    public void convertRoadmInfrastructureWhenOtnMuxAttached() {
-        ConvertORTopoToTapiTopo tapiFactory = new ConvertORTopoToTapiTopo(topologyUuid, tapiLink);
+    void convertRoadmInfrastructureWhenOtnMuxAttached() {
+        ConvertORTopoToTapiTopo tapiAbsFactory = new ConvertORTopoToTapiTopo(topologyUuid, tapiLink);
+        ConvertORToTapiTopology tapiFactory = new ConvertORToTapiTopology(topologyUuid);
         List<String> networkPortListA = new ArrayList<>();
         for (TerminationPoint tp : otnMuxA.augmentation(Node1.class).getTerminationPoint().values()) {
             if (tp.augmentation(TerminationPoint1.class).getTpType().equals(OpenroadmTpType.XPONDERNETWORK)) {
@@ -679,51 +629,65 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
             }
         }
         tapiFactory.convertNode(otnMuxA, networkPortListA);
-        tapiFactory.convertRoadmInfrastructure();
-
-        assertEquals("Node list size should be 3", 3, tapiFactory.getTapiNodes().size());
-        assertEquals("Link list size should be 2", 2, tapiFactory.getTapiLinks().size());
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node> tapiNodes
-            = tapiFactory.getTapiNodes().values().stream()
-            .sorted((n1, n2) -> n1.getUuid().getValue().compareTo(n2.getUuid().getValue()))
-            .collect(Collectors.toList());
-        Uuid otsiNodeUuid = new Uuid(UUID.nameUUIDFromBytes("ROADM-infra".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        checkOtsiNode(tapiNodes.get(2), otsiNodeUuid, "infra", "ROADM-infra");
-
-        List<Link> links = tapiFactory.getTapiLinks().values().stream()
+        tapiAbsFactory.setTapiNodes(tapiFactory.getTapiNodes());
+        tapiAbsFactory.convertRoadmInfrastructure();
+        LOG.info("ERRORLINK List of link = {}", tapiAbsFactory.getTapiLinks().toString());
+        assertEquals(2, tapiAbsFactory.getTapiNodes().size(),
+            "Node list size should be 2");
+        assertEquals(1, tapiAbsFactory.getTapiLinks().size(), "Link list size should be 1");
+
+        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey,
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> nodeMap =
+                tapiFactory.getTapiNodes();
+        nodeMap.putAll(tapiAbsFactory.getTapiNodes());
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> tapiNodes =
+            nodeMap.values().stream()
+                .sorted((n1, n2) -> n1.getUuid().getValue().compareTo(n2.getUuid().getValue()))
+                .collect(Collectors.toList());
+        checkOtsiNode(
+            tapiNodes.get(getNodeRank("ROADM", tapiNodes)),
+            //otsiNodeUuid,
+            new Uuid(UUID.nameUUIDFromBytes("ROADM-infra".getBytes(Charset.forName("UTF-8"))).toString()),
+            "infra", "ROADM-infra");
+        List<Link> links = tapiAbsFactory.getTapiLinks().values().stream()
             .sorted((l1, l2) -> l1.getUuid().getValue().compareTo(l2.getUuid().getValue()))
             .collect(Collectors.toList());
-        Uuid node1Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+OTSi".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        Uuid node2Uuid = new Uuid(UUID.nameUUIDFromBytes("ROADM-infra".getBytes(Charset.forName("UTF-8")))
-            .toString());
-        Uuid tp1Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+eOTSi+XPDR1-NETWORK1"
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid tp2Uuid = new Uuid(UUID.nameUUIDFromBytes(("roadm node+nep+1")
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid linkUuid =
-            new Uuid(UUID.nameUUIDFromBytes(
-                "SPDR-SA1-XPDR1+OTSi--SPDR-SA1-XPDR1+eOTSi+XPDR1-NETWORK1 and ROADM-infra--NodeEdgePoint_1"
-                    .getBytes(Charset.forName("UTF-8"))).toString());
-        checkOmsLink(links.get(1), node1Uuid, node2Uuid, tp1Uuid, tp2Uuid, linkUuid,
-            "SPDR-SA1-XPDR1+OTSi--SPDR-SA1-XPDR1+eOTSi+XPDR1-NETWORK1 and ROADM-infra--NodeEdgePoint_1");
+        String str1 =
+            "SPDR-SA1-XPDR1+XPONDER--SPDR-SA1-XPDR1+PHOTONIC_MEDIA_OTS+XPDR1-NETWORK1 and ROADM-infra--NodeEdgePoint_1";
+        LOG.info("LinksCheck 0 = {} ", links.get(0).getName());
+        checkOmsLink(links.get(0),
+            //node1Uuid,
+            new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+XPONDER".getBytes(Charset.forName("UTF-8"))).toString()),
+            //node2Uuid,
+            new Uuid(UUID.nameUUIDFromBytes("ROADM-infra".getBytes(Charset.forName("UTF-8"))).toString()),
+            //tp1Uuid,
+            new Uuid(
+                UUID.nameUUIDFromBytes(
+                        "SPDR-SA1-XPDR1+PHOTONIC_MEDIA_OTS+XPDR1-NETWORK1".getBytes(Charset.forName("UTF-8")))
+                    .toString()),
+            //tp2Uuid,
+            new Uuid(UUID.nameUUIDFromBytes(("roadm node+nep+1").getBytes(Charset.forName("UTF-8"))).toString()),
+            //linkUuid,
+            new Uuid(UUID.nameUUIDFromBytes(str1.getBytes(Charset.forName("UTF-8"))).toString()),
+            str1);
     }
 
-    private void checkDsrNode(org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node node,
-                              Uuid nodeUuid, String dsrNodeType, String nodeId) {
-        assertEquals("incorrect node uuid", nodeUuid, node.getUuid());
-        assertEquals("incorrect node name", nodeId, node.getName().get(new NameKey("dsr/odu node name")).getValue());
-        assertEquals("administrative state should be UNLOCKED",
-            AdministrativeState.UNLOCKED, node.getAdministrativeState());
-        assertEquals("life-cycle state should be INSTALLED", LifecycleState.INSTALLED, node.getLifecycleState());
-        assertEquals("operational state should be ENABLED", OperationalState.ENABLED, node.getOperationalState());
+    private void checkDsrNode(
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node node,
+            Uuid nodeUuid, String dsrNodeType, String nodeId) {
+        assertEquals(nodeUuid, node.getUuid(), "incorrect node uuid");
+        assertEquals(nodeId, node.getName().get(new NameKey("dsr/odu node name")).getValue(), "incorrect node name");
+        assertEquals(AdministrativeState.UNLOCKED, node.getAdministrativeState(),
+            "administrative state should be UNLOCKED");
+        assertEquals(LifecycleState.INSTALLED, node.getLifecycleState(), "life-cycle state should be INSTALLED");
+        assertEquals(OperationalState.ENABLED, node.getOperationalState(), "operational state should be ENABLED");
         assertThat("one value-name should be 'dsr/odu node name'",
             new ArrayList<>(node.nonnullName().keySet()), hasItem(new NameKey("dsr/odu node name")));
-        assertEquals("dsr node should manage 2 protocol layers : dsr and odu",
-            2, node.getLayerProtocolName().size());
-        assertThat("dsr node should manage 2 protocol layers : dsr and odu",
-            node.getLayerProtocolName(), hasItems(LayerProtocolName.DSR, LayerProtocolName.ODU));
+        assertEquals(4, node.getLayerProtocolName().size(),
+            "dsr node should manage 4 protocol layers : dsr, odu, DIGITALOTN and photonic");
+        assertThat("dsr node should manage 3 protocol layers : dsr, odu and photonic",
+            node.getLayerProtocolName(), hasItems(LayerProtocolName.DSR, LayerProtocolName.ODU,
+                LayerProtocolName.PHOTONICMEDIA));
         List<OwnedNodeEdgePoint> nepsN = node.nonnullOwnedNodeEdgePoint().values().stream()
             .filter(n -> n.getName().containsKey(new NameKey("iNodeEdgePoint_N")))
             .sorted((nep1, nep2) -> nep1.getUuid().getValue().compareTo(nep2.getUuid().getValue()))
@@ -735,8 +699,8 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
                     .filter(n -> n.getName().containsKey(new NameKey("NodeEdgePoint_C")))
                     .sorted((nep1, nep2) -> nep1.getUuid().getValue().compareTo(nep2.getUuid().getValue()))
                     .collect(Collectors.toList());
-                assertEquals("Switch-DSR node should have 4 NEPs network", 4, nepsN.size());
-                assertEquals("Switch-DSR node should have 4 NEPs client", 4, nepsC.size());
+                assertEquals(4, nepsN.size(), "Switch-DSR node should have 4 NEPs network");
+                assertEquals(4, nepsC.size(), "Switch-DSR node should have 4 NEPs client");
                 OwnedNodeEdgePoint nep1 = nepsC.get(2);
                 Uuid client4NepUuid = new Uuid(
                     UUID.nameUUIDFromBytes((nodeId.split("\\+")[0] + "+DSR+XPDR2-CLIENT4")
@@ -759,8 +723,8 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
                     .filter(n -> n.getName().containsKey(new NameKey("NodeEdgePoint_C")))
                     .sorted((nep3, nep4) -> nep3.getUuid().getValue().compareTo(nep4.getUuid().getValue()))
                     .collect(Collectors.toList());
-                assertEquals("Mux-DSR node should have 1 NEP network", 1, nepsN.size());
-                assertEquals("Mux-DSR node should have 4 NEPs client", 4, nepsC.size());
+                assertEquals(1, nepsN.size(), "Mux-DSR node should have 1 NEP network");
+                assertEquals(4, nepsC.size(), "Mux-DSR node should have 4 NEPs client");
                 OwnedNodeEdgePoint nep3 = nepsC.get(2);
                 Uuid client3NepUuid = new Uuid(
                     UUID.nameUUIDFromBytes((nodeId.split("\\+")[0] + "+DSR+XPDR1-CLIENT3")
@@ -784,8 +748,8 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
                     .filter(n -> n.getName().containsKey(new NameKey("100G-tpdr")))
                     .sorted((nep5, nep6) -> nep5.getUuid().getValue().compareTo(nep6.getUuid().getValue()))
                     .collect(Collectors.toList());
-                assertEquals("Tpdr-DSR node should have 2 NEPs network", 2, nepsN.size());
-                assertEquals("Tpdr-DSR node should have 2 NEPs client", 2, nepsC.size());
+                assertEquals(2, nepsN.size(), "Tpdr-DSR node should have 2 NEPs network");
+                assertEquals(2, nepsC.size(), "Tpdr-DSR node should have 2 NEPs client");
                 OwnedNodeEdgePoint nep5 = nepsC.get(0);
                 Uuid client1NepUuid = new Uuid(
                     UUID.nameUUIDFromBytes((nodeId.split("\\+")[0] + "+DSR+XPDR1-CLIENT1")
@@ -811,20 +775,20 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
     }
 
     private void checkOtsiNode(
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node node,
-        Uuid nodeUuid, String otsiNodeType, String nodeId) {
-        assertEquals("incorrect node uuid", nodeUuid, node.getUuid());
-        assertEquals("incorrect node name", nodeId, node.getName().get(new NameKey("otsi node name")).getValue());
-        assertEquals("administrative state should be UNLOCKED",
-            AdministrativeState.UNLOCKED, node.getAdministrativeState());
-        assertEquals("life-cycle state should be INSTALLED", LifecycleState.INSTALLED, node.getLifecycleState());
-        assertEquals("operational state should be ENABLED", OperationalState.ENABLED, node.getOperationalState());
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node node,
+            Uuid nodeUuid, String otsiNodeType, String nodeId) {
+        assertEquals(nodeUuid, node.getUuid(), "incorrect node uuid");
+        assertEquals(nodeId, node.getName().get(new NameKey("otsi node name")).getValue(), "incorrect node name");
+        assertEquals(AdministrativeState.UNLOCKED, node.getAdministrativeState(),
+            "administrative state should be UNLOCKED");
+        assertEquals(LifecycleState.INSTALLED, node.getLifecycleState(), "life-cycle state should be INSTALLED");
+        assertEquals(OperationalState.ENABLED, node.getOperationalState(), "operational state should be ENABLED");
         assertThat("one value-name should be 'dsr/odu node name'",
             new ArrayList<>(node.nonnullName().keySet()), hasItem(new NameKey("otsi node name")));
-        assertEquals("otsi node should manage a single protocol layer : PHOTONIC_MEDIA",
-            1, node.getLayerProtocolName().size());
-        assertEquals("otsi node should manage a single protocol layer : PHOTONIC_MEDIA",
-            LayerProtocolName.PHOTONICMEDIA, node.getLayerProtocolName().get(0));
+        assertEquals(1, node.getLayerProtocolName().size(),
+            "otsi node should manage a single protocol layer : PHOTONIC_MEDIA");
+        assertEquals(LayerProtocolName.PHOTONICMEDIA, node.getLayerProtocolName().stream().findFirst().orElseThrow(),
+            "otsi node should manage a single protocol layer : PHOTONIC_MEDIA");
         List<OwnedNodeEdgePoint> nepsI = node.nonnullOwnedNodeEdgePoint().values().stream()
             .filter(n -> n.getName().containsKey(new NameKey("iNodeEdgePoint")))
             .sorted((nep1, nep2) -> nep1.getUuid().getValue().compareTo(nep2.getUuid().getValue()))
@@ -835,8 +799,8 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
             .collect(Collectors.toList());
         switch (otsiNodeType) {
             case "switch":
-                assertEquals("Switch-OTSi node should have 4 eNEPs", 4, nepsE.size());
-                assertEquals("Switch-OTSi node should have 4 iNEPs", 4, nepsI.size());
+                assertEquals(4, nepsE.size(), "Switch-OTSi node should have 4 eNEPs");
+                assertEquals(4, nepsI.size(), "Switch-OTSi node should have 4 iNEPs");
                 OwnedNodeEdgePoint nep1 = nepsI.get(1);
                 Uuid inepUuid = new Uuid(
                     UUID.nameUUIDFromBytes((nodeId.split("\\+")[0] + "+iOTSi+XPDR2-NETWORK2")
@@ -845,24 +809,24 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
                     otnSwitch.getNodeId().getValue(), TapiStringConstants.I_OTSI);
                 OwnedNodeEdgePoint nep2 = nepsE.get(0);
                 Uuid enepUuid = new Uuid(
-                    UUID.nameUUIDFromBytes((nodeId.split("\\+")[0] + "+eOTSi+XPDR2-NETWORK2")
+                    UUID.nameUUIDFromBytes((nodeId.split("\\+")[0] + "+PHOTONIC_MEDIA_OTS+XPDR2-NETWORK2")
                         .getBytes(Charset.forName("UTF-8"))).toString());
                 checkNepOtsiNode(nep2, enepUuid, "XPDR2-NETWORK2", "eNodeEdgePoint",
-                    otnSwitch.getNodeId().getValue(), TapiStringConstants.E_OTSI);
+                    otnSwitch.getNodeId().getValue(), TapiStringConstants.PHTNC_MEDIA_OTS);
                 List<NodeRuleGroup> nrgList = node.nonnullNodeRuleGroup().values().stream()
                     .sorted((nrg1, nrg2) -> nrg1.getUuid().getValue().compareTo(nrg2.getUuid().getValue()))
                     .collect(Collectors.toList());
                 checkNodeRuleGroupForSwitchOTSi(nrgList, enepUuid, inepUuid, nodeUuid);
                 break;
             case "mux":
-                assertEquals("Mux-OTSi node should have 1 eNEP", 1, nepsE.size());
-                assertEquals("Mux-OTSi node should have 1 iNEPs", 1, nepsI.size());
+                assertEquals(1, nepsE.size(), "Mux-OTSi node should have 1 eNEP");
+                assertEquals(1, nepsI.size(), "Mux-OTSi node should have 1 iNEPs");
                 OwnedNodeEdgePoint nep3 = nepsE.get(0);
                 Uuid enepUuid2 = new Uuid(
-                    UUID.nameUUIDFromBytes((nodeId.split("\\+")[0] + "+eOTSi+XPDR1-NETWORK1")
+                    UUID.nameUUIDFromBytes((nodeId.split("\\+")[0] + "+PHOTONIC_MEDIA_OTS+XPDR1-NETWORK1")
                         .getBytes(Charset.forName("UTF-8"))).toString());
                 checkNepOtsiNode(nep3, enepUuid2, "XPDR1-NETWORK1", "eNodeEdgePoint",
-                    otnMuxA.getNodeId().getValue(), TapiStringConstants.E_OTSI);
+                    otnMuxA.getNodeId().getValue(), TapiStringConstants.PHTNC_MEDIA_OTS);
                 OwnedNodeEdgePoint nep4 = nepsI.get(0);
                 Uuid inepUuid2 = new Uuid(
                     UUID.nameUUIDFromBytes((nodeId.split("\\+")[0] + "+iOTSi+XPDR1-NETWORK1")
@@ -875,14 +839,14 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
                 checkNodeRuleGroupForMuxOTSi(nrgList2, enepUuid2, inepUuid2, nodeUuid);
                 break;
             case "tpdr":
-                assertEquals("Tpdr-OTSi node should have 2 eNEPs", 2, nepsE.size());
-                assertEquals("Tpdr-OTSi node should have 2 iNEPs", 2, nepsI.size());
+                assertEquals(2, nepsE.size(), "Tpdr-OTSi node should have 2 eNEPs");
+                assertEquals(2, nepsI.size(), "Tpdr-OTSi node should have 2 iNEPs");
                 OwnedNodeEdgePoint nep5 = nepsE.get(0);
                 Uuid enepUuid3 = new Uuid(
-                    UUID.nameUUIDFromBytes((nodeId.split("\\+")[0] + "+eOTSi+XPDR1-NETWORK1")
+                    UUID.nameUUIDFromBytes((nodeId.split("\\+")[0] + "+PHOTONIC_MEDIA_OTS+XPDR1-NETWORK1")
                         .getBytes(Charset.forName("UTF-8"))).toString());
                 checkNepOtsiNode(nep5, enepUuid3, "XPDR1-NETWORK1", "eNodeEdgePoint",
-                    tpdr100G.getNodeId().getValue(), TapiStringConstants.E_OTSI);
+                    tpdr100G.getNodeId().getValue(), TapiStringConstants.PHTNC_MEDIA_OTS);
                 OwnedNodeEdgePoint nep6 = nepsI.get(0);
                 Uuid inepUuid3 = new Uuid(
                     UUID.nameUUIDFromBytes((nodeId.split("\\+")[0] + "+iOTSi+XPDR1-NETWORK1")
@@ -914,50 +878,54 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
         }
     }
 
-    private void checkNepClient10G(OwnedNodeEdgePoint nep, Uuid nepUuid, String portName, String nepName,
-                                   String nodeId, String extension) {
-        assertEquals("bad uuid for " + portName, nepUuid, nep.getUuid());
-        List<Name> nameList = new ArrayList<>(nep.nonnullName().values());
-        Name name = nameList.get(0);
-        assertEquals("value of client nep should be '" + portName + "'",
-            String.join("+", nodeId, extension, portName), name.getValue());
-        assertEquals("value-name of client nep for '" + portName + "' should be '" + nepName + "'",
-            nepName, name.getValueName());
-        assertEquals("Client nep should support 3 kind of cep",
-            3, nep.getSupportedCepLayerProtocolQualifier().size());
-        assertThat("client nep should support 3 kind of cep",
-            nep.getSupportedCepLayerProtocolQualifier(),
-            hasItems(ODUTYPEODU2.class, ODUTYPEODU2E.class, DIGITALSIGNALTYPE10GigELAN.class));
-        assertEquals("client nep should be of ETH protocol type", LayerProtocolName.ETH, nep.getLayerProtocolName());
+    private void checkNepClient10G(
+            OwnedNodeEdgePoint nep, Uuid nepUuid, String portName, String nepName, String nodeId, String extension) {
+        assertEquals(nepUuid, nep.getUuid(), "bad uuid for " + portName);
+        Name name = new ArrayList<>(nep.nonnullName().values()).get(0);
+        assertEquals(
+            String.join("+", nodeId, extension, portName),
+            name.getValue(),
+            "value of client nep should be '" + portName + "'");
+        assertEquals(nepName, name.getValueName(),
+            "value-name of client nep for '" + portName + "' should be '" + nepName + "'");
+        List<LAYERPROTOCOLQUALIFIER> lpql = new ArrayList<>();
+        for (SupportedCepLayerProtocolQualifierInstances entry : nep.getSupportedCepLayerProtocolQualifierInstances()) {
+            lpql.add(entry.getLayerProtocolQualifier());
+        }
+        assertEquals(3, lpql.size(), "Client nep should support 3 kind of cep");
+        assertThat("client nep should support 3 kind of cep", lpql,
+            hasItems(ODUTYPEODU2.VALUE, ODUTYPEODU2E.VALUE, DIGITALSIGNALTYPE10GigELAN.VALUE));
+        assertEquals(LayerProtocolName.DSR, nep.getLayerProtocolName(), "client nep should be of DSR(ETH) protocol ");
         checkCommonPartOfNep(nep, false);
         checkSIP(nep, portName, nodeId, extension);
     }
 
-    private void checkNepNetworkODU4(OwnedNodeEdgePoint nep, Uuid nepUuid, String portName, String nepName,
-                                     String nodeId, String extension) {
-        assertEquals("bad uuid for " + portName, nepUuid, nep.getUuid());
+    private void checkNepNetworkODU4(
+            OwnedNodeEdgePoint nep, Uuid nepUuid, String portName, String nepName, String nodeId, String extension) {
+        assertEquals(nepUuid, nep.getUuid(), "bad uuid for " + portName);
         List<Name> nameList = new ArrayList<>(nep.nonnullName().values());
         Name name = nameList.get(0);
-        assertEquals("value of network nep should be '" + portName + "'",
-            String.join("+", nodeId, extension, portName), name.getValue());
-        assertEquals("value-name of network nep for '" + portName + "' should be '" + nepName + "'",
-            nepName, name.getValueName());
-        assertEquals("Network nep should support 1 kind of cep",
-            1, nep.getSupportedCepLayerProtocolQualifier().size());
-        assertThat("network nep should support 1 kind of cep",
-            nep.getSupportedCepLayerProtocolQualifier(),
-            hasItem(ODUTYPEODU4.class));
-        assertEquals("network nep should be of ODU protocol type", LayerProtocolName.ODU, nep.getLayerProtocolName());
+        assertEquals(String.join("+", nodeId, extension, portName), name.getValue(),
+            "value of network nep should be '" + portName + "'");
+        assertEquals(nepName, name.getValueName(),
+            "value-name of network nep for '" + portName + "' should be '" + nepName + "'");
+        List<LAYERPROTOCOLQUALIFIER> lpql = new ArrayList<>();
+        for (SupportedCepLayerProtocolQualifierInstances entry :nep.getSupportedCepLayerProtocolQualifierInstances()) {
+            lpql.add(entry.getLayerProtocolQualifier());
+        }
+        assertEquals(1, lpql.size(), "Network nep should support 1 kind of cep");
+        assertThat("network nep should support 1 kind of cep", lpql, hasItem(ODUTYPEODU4.VALUE));
+        assertEquals(LayerProtocolName.ODU, nep.getLayerProtocolName(), "network nep should be of ODU protocol type");
         checkCommonPartOfNep(nep, false);
         checkSIP(nep, portName, nodeId, extension);
     }
 
-    private void checkNodeRuleGroupForTpdrDSR(List<NodeRuleGroup> nrgList, Uuid clientNepUuid, Uuid networkNepUuid,
-                                              Uuid nodeUuid) {
-        assertEquals("transponder DSR should contain 2 node rule group", 2, nrgList.size());
+    private void checkNodeRuleGroupForTpdrDSR(
+            List<NodeRuleGroup> nrgList, Uuid clientNepUuid, Uuid networkNepUuid, Uuid nodeUuid) {
+        assertEquals(4, nrgList.size(), "transponder DSR should contain 4 node rule group (2*DSR/I_ODU+2*E_ODU/I_ODU)");
         for (NodeRuleGroup nodeRuleGroup : nrgList) {
-            assertEquals("each node-rule-group should contain 2 NEP for transponder DSR",
-                2, nodeRuleGroup.getNodeEdgePoint().size());
+            assertEquals(2, nodeRuleGroup.getNodeEdgePoint().size(),
+                "each node-rule-group should contain 2 NEP for transponder DSR");
         }
         List<NodeEdgePoint> nodeEdgePointList = new ArrayList<>(nrgList.get(0).nonnullNodeEdgePoint().values());
         assertThat("node-rule-group nb 1 should be between nep-client1 and nep-network1",
@@ -966,26 +934,25 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
         assertThat("node-rule-group nb 1 should be between nep-client1 and nep-network1",
             nodeEdgePointList.get(1).getNodeEdgePointUuid().getValue(),
             either(containsString(networkNepUuid.getValue())).or(containsString(clientNepUuid.getValue())));
-        assertEquals("node-rule-group nb 1 should be between nep-client1 and nep-network1 of the same node",
-            nodeEdgePointList.get(0).getNodeUuid(), nodeUuid);
-        assertEquals("node-rule-group nb 1 should be between nep-client1 and nep-network1 of the same node",
-            nodeEdgePointList.get(1).getNodeUuid(), nodeUuid);
+        assertEquals(nodeEdgePointList.get(0).getNodeUuid(), nodeUuid,
+            "node-rule-group nb 1 should be between nep-client1 and nep-network1 of the same node");
+        assertEquals(nodeEdgePointList.get(1).getNodeUuid(), nodeUuid,
+            "node-rule-group nb 1 should be between nep-client1 and nep-network1 of the same node");
         List<Rule> rule = new ArrayList<>(nrgList.get(1).nonnullRule().values());
-        assertEquals("node-rule-group nb 1 should contain a single rule", 1, rule.size());
-        assertEquals("local-id of the rule should be 'forward'",
-            "forward", rule.get(0).getLocalId());
-        assertEquals("the forwarding rule should be 'MAYFORWARDACROSSGROUP'",
-            ForwardingRule.MAYFORWARDACROSSGROUP, rule.get(0).getForwardingRule());
-        assertEquals("the rule type should be 'FORWARDING'",
-            RuleType.FORWARDING, rule.get(0).getRuleType());
+        assertEquals(1, rule.size(), "node-rule-group nb 1 should contain a single rule");
+        assertEquals("forward", rule.get(0).getLocalId(), "local-id of the rule should be 'forward'");
+        assertEquals(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE, rule.get(0).getForwardingRule(),
+            "the forwarding rule should be 'MAYFORWARDACROSSGROUP'");
+        assertEquals(RuleType.FORWARDING, rule.get(0).getRuleType().iterator().next(),
+            "the rule type should be 'FORWARDING'");
     }
 
-    private void checkNodeRuleGroupForMuxDSR(List<NodeRuleGroup> nrgList, Uuid clientNepUuid, Uuid networkNepUuid,
-                                             Uuid nodeUuid) {
-        assertEquals("muxponder DSR should contain 4 node rule group", 4, nrgList.size());
+    private void checkNodeRuleGroupForMuxDSR(
+            List<NodeRuleGroup> nrgList, Uuid clientNepUuid, Uuid networkNepUuid, Uuid nodeUuid) {
+        assertEquals(8, nrgList.size(), "muxponder DSR should contain 8 node rule group (4*DSR/I_ODU + 4*E_ODU/I_ODU)");
         for (NodeRuleGroup nodeRuleGroup : nrgList) {
-            assertEquals("each node-rule-group should contain 2 NEP for muxponder DSR",
-                2, nodeRuleGroup.getNodeEdgePoint().size());
+            assertEquals(2, nodeRuleGroup.getNodeEdgePoint().size(),
+                "each node-rule-group should contain 2 NEP for muxponder DSR");
         }
         List<NodeEdgePoint> nodeEdgePointList = new ArrayList<>(nrgList.get(0).nonnullNodeEdgePoint().values());
         assertThat("node-rule-group nb 2 should be between nep-client4 and nep-network1",
@@ -994,122 +961,122 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
         assertThat("node-rule-group nb 2 should be between nep-client4 and nep-network1",
             nodeEdgePointList.get(1).getNodeEdgePointUuid().getValue(),
             either(containsString(networkNepUuid.getValue())).or(containsString(clientNepUuid.getValue())));
-        assertEquals("node-rule-group nb 2 should be between nep-client4 and nep-network1 of the same node",
-            nodeEdgePointList.get(0).getNodeUuid(), nodeUuid);
-        assertEquals("node-rule-group nb 2 should be between nep-client4 and nep-network1 of the same node",
-            nodeEdgePointList.get(1).getNodeUuid(), nodeUuid);
+        assertEquals(nodeEdgePointList.get(0).getNodeUuid(), nodeUuid,
+            "node-rule-group nb 2 should be between nep-client4 and nep-network1 of the same node");
+        assertEquals(nodeEdgePointList.get(1).getNodeUuid(), nodeUuid,
+            "node-rule-group nb 2 should be between nep-client4 and nep-network1 of the same node");
         List<Rule> rule = new ArrayList<>(nrgList.get(1).nonnullRule().values());
-        assertEquals("node-rule-group nb 2 should contain a single rule", 1, rule.size());
-        assertEquals("local-id of the rule should be 'forward'",
-            "forward", rule.get(0).getLocalId());
-        assertEquals("the forwarding rule should be 'MAYFORWARDACROSSGROUP'",
-            ForwardingRule.MAYFORWARDACROSSGROUP, rule.get(0).getForwardingRule());
-        assertEquals("the rule type should be 'FORWARDING'",
-            RuleType.FORWARDING, rule.get(0).getRuleType());
+        assertEquals(1, rule.size(), "node-rule-group nb 2 should contain a single rule");
+        assertEquals("forward", rule.get(0).getLocalId(), "local-id of the rule should be 'forward'");
+        assertEquals(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE, rule.get(0).getForwardingRule(),
+            "the forwarding rule should be 'MAYFORWARDACROSSGROUP'");
+        assertEquals(RuleType.FORWARDING, rule.get(0).getRuleType().iterator().next(),
+            "the rule type should be 'FORWARDING'");
     }
 
-    private void checkNodeRuleGroupForSwitchDSR(List<NodeRuleGroup> nrgList, Uuid clientNepUuid, Uuid networkNepUuid,
-                                                Uuid nodeUuid) {
-        assertEquals("Switch-DSR should contain a single node rule group", 1, nrgList.size());
-        assertEquals("Switch-DSR node-rule-group should contain 8 NEP", 8, nrgList.get(0).getNodeEdgePoint().size());
+    private void checkNodeRuleGroupForSwitchDSR(
+            List<NodeRuleGroup> nrgList, Uuid clientNepUuid, Uuid networkNepUuid, Uuid nodeUuid) {
+        assertEquals(2, nrgList.size(), "Switch-DSR should contain 2 node rule groups (DSR/I_ODU + E_ODU/I_ODU)");
+        assertEquals(8, nrgList.get(0).getNodeEdgePoint().size(), "Switch-DSR node-rule-group should contain 8 NEP");
         List<NodeEdgePoint> nrg = nrgList.get(0).nonnullNodeEdgePoint().values().stream()
             .sorted((nrg1, nrg2) -> nrg1.getNodeEdgePointUuid().getValue()
                 .compareTo(nrg2.getNodeEdgePointUuid().getValue()))
             .collect(Collectors.toList());
-        assertEquals("in the sorted node-rule-group, nep number 7 should be XPDR2-NETWORK1",
-            networkNepUuid, nrg.get(6).getNodeEdgePointUuid());
-        assertEquals("in the sorted node-rule-group, nep number 6 should be XPDR2-CLIENT4",
-            clientNepUuid, nrg.get(5).getNodeEdgePointUuid());
-        assertEquals("any item of the node-rule-group should have the same nodeUuid",
-            nodeUuid, nrg.get(4).getNodeUuid());
-        assertEquals("any item of the node-rule-group should have the same nodeUuid",
-            nodeUuid, nrg.get(3).getNodeUuid());
+        assertEquals(networkNepUuid, nrg.get(6).getNodeEdgePointUuid(),
+            "in the sorted node-rule-group, nep number 7 should be XPDR2-NETWORK1");
+        assertEquals(clientNepUuid, nrg.get(5).getNodeEdgePointUuid(),
+            "in the sorted node-rule-group, nep number 6 should be XPDR2-CLIENT4");
+        assertEquals(nodeUuid, nrg.get(4).getNodeUuid(),
+            "any item of the node-rule-group should have the same nodeUuid");
+        assertEquals(nodeUuid, nrg.get(3).getNodeUuid(),
+            "any item of the node-rule-group should have the same nodeUuid");
         @Nullable
         List<Rule> ruleList = new ArrayList<>(nrgList.get(0).nonnullRule().values());
-        assertEquals("node-rule-group should contain a single rule", 1, ruleList.size());
-        assertEquals("local-id of the rule should be 'forward'",
-            "forward", ruleList.get(0).getLocalId());
-        assertEquals("the forwarding rule should be 'MAYFORWARDACROSSGROUP'",
-            ForwardingRule.MAYFORWARDACROSSGROUP, ruleList.get(0).getForwardingRule());
-        assertEquals("the rule type should be 'FORWARDING'",
-            RuleType.FORWARDING, ruleList.get(0).getRuleType());
+        assertEquals(1, ruleList.size(), "node-rule-group should contain a single rule");
+        assertEquals("forward", ruleList.get(0).getLocalId(), "local-id of the rule should be 'forward'");
+        assertEquals(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE, ruleList.get(0).getForwardingRule(),
+            "the forwarding rule should be 'MAYFORWARDACROSSGROUP'");
+        assertEquals(RuleType.FORWARDING, ruleList.get(0).getRuleType().iterator().next(),
+            "the rule type should be 'FORWARDING'");
     }
 
     private void checkNodeRuleGroupForRdmInfra(List<NodeRuleGroup> nrgList, int nbNeps) {
-        assertEquals("RDM infra node - OTSi should contain a single node rule groups", 1, nrgList.size());
+        // if no XPDR is connected, no OTS is created and no NodeRuleGroup is created
+        assertTrue(nrgList.size() <= 1, "RDM infra node - OTSi should contain maximum one node rule groups");
+        // When a nrg is present it shall respect the following
+        if (nrgList.isEmpty()) {
+            return;
+        }
         if (nbNeps > 0) {
             List<NodeEdgePoint> nodeEdgePointList = new ArrayList<>(nrgList.get(0).getNodeEdgePoint().values());
-            assertEquals("RDM infra node -rule-group should contain " + nbNeps + " NEP",
-                nbNeps, nodeEdgePointList.size());
+            assertEquals(nbNeps, nodeEdgePointList.size(),
+                "RDM infra node -rule-group should contain " + nbNeps + " NEP");
         } else {
-            assertNull("RDM infra node -rule-group should contain no NEP", nrgList.get(0).getNodeEdgePoint());
+            assertNull(nrgList.get(0).getNodeEdgePoint(), "RDM infra node -rule-group should contain no NEP");
         }
         List<Rule> ruleList = new ArrayList<>(nrgList.get(0).nonnullRule().values());
-        assertEquals("node-rule-group should contain a single rule", 1, ruleList.size());
-        assertEquals("local-id of the rule should be 'forward'",
-            "forward", ruleList.get(0).getLocalId());
-        assertEquals("the forwarding rule should be 'MAYFORWARDACROSSGROUP'",
-            ForwardingRule.MAYFORWARDACROSSGROUP, ruleList.get(0).getForwardingRule());
-        assertEquals("the rule type should be 'FORWARDING'",
-            RuleType.FORWARDING, ruleList.get(0).getRuleType());
+        assertEquals(1, ruleList.size(), "node-rule-group should contain a single rule");
+        assertEquals("forward", ruleList.get(0).getLocalId(), "local-id of the rule should be 'forward'");
+        assertEquals(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE, ruleList.get(0).getForwardingRule(),
+            "the forwarding rule should be 'MAYFORWARDACROSSGROUP'");
+        assertEquals(RuleType.FORWARDING, ruleList.get(0).getRuleType().iterator().next(),
+            "the rule type should be 'FORWARDING'");
     }
 
-    private void checkNodeRuleGroupForTpdrOTSi(List<NodeRuleGroup> nrgList, Uuid enepUuid, Uuid inepUuid,
-                                               Uuid nodeUuid) {
-        assertEquals("Tpdr-OTSi should contain two node rule groups", 2, nrgList.size());
+    private void checkNodeRuleGroupForTpdrOTSi(
+            List<NodeRuleGroup> nrgList, Uuid enepUuid, Uuid inepUuid, Uuid nodeUuid) {
+        assertEquals(2, nrgList.size(), "Tpdr-OTSi should contain two node rule groups");
         List<NodeEdgePoint> nodeEdgePointList = new ArrayList<>(nrgList.get(0).getNodeEdgePoint().values());
-        assertEquals("Tpdr-OTSi node-rule-group should contain 2 NEP", 2, nodeEdgePointList.size());
+        assertEquals(2, nodeEdgePointList.size(), "Tpdr-OTSi node-rule-group should contain 2 NEP");
         assertThat("Tpdr-OTSi node-rule-group should be between eNEP and iNEP of XPDR1-NETWORK1",
             nodeEdgePointList.get(0).getNodeEdgePointUuid().getValue(),
             either(containsString(enepUuid.getValue())).or(containsString(inepUuid.getValue())));
         assertThat("Tpdr-OTSi node-rule-group should be between eNEP and iNEP of XPDR1-NETWORK1",
             nodeEdgePointList.get(1).getNodeEdgePointUuid().getValue(),
             either(containsString(enepUuid.getValue())).or(containsString(inepUuid.getValue())));
-        assertEquals("any item of the node-rule-group should have the same nodeUuid",
-            nodeUuid, nodeEdgePointList.get(0).getNodeUuid());
-        assertEquals("any item of the node-rule-group should have the same nodeUuid",
-            nodeUuid, nodeEdgePointList.get(1).getNodeUuid());
+        assertEquals(nodeUuid, nodeEdgePointList.get(0).getNodeUuid(),
+            "any item of the node-rule-group should have the same nodeUuid");
+        assertEquals(nodeUuid, nodeEdgePointList.get(1).getNodeUuid(),
+            "any item of the node-rule-group should have the same nodeUuid");
         List<Rule> ruleList = new ArrayList<>(nrgList.get(0).nonnullRule().values());
-        assertEquals("node-rule-group should contain a single rule", 1, ruleList.size());
-        assertEquals("local-id of the rule should be 'forward'",
-            "forward", ruleList.get(0).getLocalId());
-        assertEquals("the forwarding rule should be 'MAYFORWARDACROSSGROUP'",
-            ForwardingRule.MAYFORWARDACROSSGROUP, ruleList.get(0).getForwardingRule());
-        assertEquals("the rule type should be 'FORWARDING'",
-            RuleType.FORWARDING, ruleList.get(0).getRuleType());
+        assertEquals(1, ruleList.size(), "node-rule-group should contain a single rule");
+        assertEquals("forward", ruleList.get(0).getLocalId(), "local-id of the rule should be 'forward'");
+        assertEquals(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE, ruleList.get(0).getForwardingRule(),
+            "the forwarding rule should be 'MAYFORWARDACROSSGROUP'");
+        assertEquals(RuleType.FORWARDING, ruleList.get(0).getRuleType().iterator().next(),
+            "the rule type should be 'FORWARDING'");
     }
 
-    private void checkNodeRuleGroupForMuxOTSi(List<NodeRuleGroup> nrgList, Uuid enepUuid, Uuid inepUuid,
-                                              Uuid nodeUuid) {
-        assertEquals("Mux-OTSi should contain a single node rule group", 1, nrgList.size());
+    private void checkNodeRuleGroupForMuxOTSi(
+            List<NodeRuleGroup> nrgList, Uuid enepUuid, Uuid inepUuid, Uuid nodeUuid) {
+        assertEquals(1, nrgList.size(), "Mux-OTSi should contain a single node rule group");
         List<NodeEdgePoint> nodeEdgePointList = new ArrayList<>(nrgList.get(0).getNodeEdgePoint().values());
-        assertEquals("Mux-OTSi node-rule-group should contain 2 NEP", 2, nodeEdgePointList.size());
+        assertEquals(2, nodeEdgePointList.size(), "Mux-OTSi node-rule-group should contain 2 NEP");
         assertThat("Mux-OTSi node-rule-group should be between eNEP and iNEP of XPDR1-NETWORK1",
             nodeEdgePointList.get(0).getNodeEdgePointUuid().getValue(),
             either(containsString(enepUuid.getValue())).or(containsString(inepUuid.getValue())));
         assertThat("Mux-OTSi node-rule-group should be between eNEP and iNEP of XPDR1-NETWORK1",
             nodeEdgePointList.get(1).getNodeEdgePointUuid().getValue(),
             either(containsString(enepUuid.getValue())).or(containsString(inepUuid.getValue())));
-        assertEquals("any item of the node-rule-group should have the same nodeUuid",
-            nodeUuid, nodeEdgePointList.get(0).getNodeUuid());
-        assertEquals("any item of the node-rule-group should have the same nodeUuid",
-            nodeUuid, nodeEdgePointList.get(1).getNodeUuid());
+        assertEquals(nodeUuid, nodeEdgePointList.get(0).getNodeUuid(),
+            "any item of the node-rule-group should have the same nodeUuid");
+        assertEquals(nodeUuid, nodeEdgePointList.get(1).getNodeUuid(),
+            "any item of the node-rule-group should have the same nodeUuid");
         List<Rule> ruleList = new ArrayList<>(nrgList.get(0).nonnullRule().values());
-        assertEquals("node-rule-group should contain a single rule", 1, ruleList.size());
-        assertEquals("local-id of the rule should be 'forward'",
-            "forward", ruleList.get(0).getLocalId());
-        assertEquals("the forwarding rule should be 'MAYFORWARDACROSSGROUP'",
-            ForwardingRule.MAYFORWARDACROSSGROUP, ruleList.get(0).getForwardingRule());
-        assertEquals("the rule type should be 'FORWARDING'",
-            RuleType.FORWARDING, ruleList.get(0).getRuleType());
+        assertEquals(1, ruleList.size(), "node-rule-group should contain a single rule");
+        assertEquals("forward", ruleList.get(0).getLocalId(), "local-id of the rule should be 'forward'");
+        assertEquals(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE, ruleList.get(0).getForwardingRule(),
+            "the forwarding rule should be 'MAYFORWARDACROSSGROUP'");
+        assertEquals(RuleType.FORWARDING, ruleList.get(0).getRuleType().iterator().next(),
+            "the rule type should be 'FORWARDING'");
     }
 
-    private void checkNodeRuleGroupForSwitchOTSi(List<NodeRuleGroup> nrgList, Uuid enepUuid, Uuid inepUuid,
-                                                 Uuid nodeUuid) {
-        assertEquals("Switch-OTSi should contain 4 node rule group", 4, nrgList.size());
+    private void checkNodeRuleGroupForSwitchOTSi(
+            List<NodeRuleGroup> nrgList, Uuid enepUuid, Uuid inepUuid, Uuid nodeUuid) {
+        assertEquals(4, nrgList.size(), "Switch-OTSi should contain 4 node rule group");
         for (NodeRuleGroup nodeRuleGroup : nrgList) {
-            assertEquals("each node-rule-group should contain 2 NEP for Switch-OTSi",
-                2, nodeRuleGroup.getNodeEdgePoint().size());
+            assertEquals(2, nodeRuleGroup.getNodeEdgePoint().size(),
+                "each node-rule-group should contain 2 NEP for Switch-OTSi");
         }
         List<NodeEdgePoint> nodeEdgePointList1 = new ArrayList<>(nrgList.get(3).nonnullNodeEdgePoint().values());
         assertThat("Switch-OTSi node-rule-group nb 4 should be between eNEP and iNEP of XPDR2-NETWORK2",
@@ -1119,192 +1086,168 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
             nodeEdgePointList1.get(1).getNodeEdgePointUuid().getValue(),
             either(containsString(enepUuid.getValue())).or(containsString(inepUuid.getValue())));
         List<NodeEdgePoint> nodeEdgePointList0 = new ArrayList<>(nrgList.get(0).getNodeEdgePoint().values());
-        assertEquals("any item of the node-rule-group should have the same nodeUuid",
-            nodeUuid, nodeEdgePointList0.get(0).getNodeUuid());
-        assertEquals("any item of the node-rule-group should have the same nodeUuid",
-            nodeUuid, nodeEdgePointList0.get(1).getNodeUuid());
+        assertEquals(nodeUuid, nodeEdgePointList0.get(0).getNodeUuid(),
+            "any item of the node-rule-group should have the same nodeUuid");
+        assertEquals(nodeUuid, nodeEdgePointList0.get(1).getNodeUuid(),
+            "any item of the node-rule-group should have the same nodeUuid");
         List<Rule> ruleList0 = new ArrayList<>(nrgList.get(0).nonnullRule().values());
-        assertEquals("node-rule-group should contain a single rule", 1, ruleList0.size());
-        assertEquals("local-id of the rule should be 'forward'",
-            "forward", ruleList0.get(0).getLocalId());
-        assertEquals("the forwarding rule should be 'MAYFORWARDACROSSGROUP'",
-            ForwardingRule.MAYFORWARDACROSSGROUP, ruleList0.get(0).getForwardingRule());
-        assertEquals("the rule type should be 'FORWARDING'",
-            RuleType.FORWARDING, ruleList0.get(0).getRuleType());
+        assertEquals(1, ruleList0.size(), "node-rule-group should contain a single rule");
+        assertEquals("forward", ruleList0.get(0).getLocalId(),"local-id of the rule should be 'forward'");
+        assertEquals(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE, ruleList0.get(0).getForwardingRule(),
+            "the forwarding rule should be 'MAYFORWARDACROSSGROUP'");
+        assertEquals(RuleType.FORWARDING, ruleList0.get(0).getRuleType().iterator().next(),
+            "the rule type should be 'FORWARDING'");
     }
 
-    private void checkNepClient100GSwitch(OwnedNodeEdgePoint nep, Uuid nepUuid, String portName, String nepName,
-                                          String nodeId, String extension) {
-        assertEquals("bad uuid for " + portName, nepUuid, nep.getUuid());
+    private void checkNepClient100GSwitch(
+            OwnedNodeEdgePoint nep, Uuid nepUuid, String portName, String nepName, String nodeId, String extension) {
+        assertEquals(nepUuid, nep.getUuid(), "bad uuid for " + portName);
         List<Name> nameList = new ArrayList<>(nep.nonnullName().values());
-        assertEquals("value of client nep should be '" + portName + "'",
-            String.join("+", nodeId, extension, portName), nameList.get(0).getValue());
-        assertEquals("value-name of client nep for '" + portName + "' should be '" + nepName + "'",
-            nepName, nameList.get(0).getValueName());
-        assertEquals("Client nep should support 2 kind of cep",
-            2, nep.getSupportedCepLayerProtocolQualifier().size());
-        assertThat("client nep should support 2 kind of cep",
-            nep.getSupportedCepLayerProtocolQualifier(),
-            hasItems(ODUTYPEODU4.class, DIGITALSIGNALTYPE100GigE.class));
-        assertEquals("client nep should be of ETH protocol type", LayerProtocolName.ETH, nep.getLayerProtocolName());
+        assertEquals(String.join("+", nodeId, extension, portName), nameList.get(0).getValue(),
+            "value of client nep should be '" + portName + "'");
+        assertEquals(nepName, nameList.get(0).getValueName(),
+            "value-name of client nep for '" + portName + "' should be '" + nepName + "'");
+        List<LAYERPROTOCOLQUALIFIER> lpql = new ArrayList<>();
+        for (SupportedCepLayerProtocolQualifierInstances entry : nep.getSupportedCepLayerProtocolQualifierInstances()) {
+            lpql.add(entry.getLayerProtocolQualifier());
+        }
+        assertEquals(2, lpql.size(), "Client nep should support 2 kind of cep");
+        assertThat("client nep should support 2 kind of cep", lpql,
+            hasItems(ODUTYPEODU4.VALUE, DIGITALSIGNALTYPE100GigE.VALUE));
+        assertEquals(LayerProtocolName.DSR, nep.getLayerProtocolName(), "client nep should be of DSR(ETH) protocol");
         checkCommonPartOfNep(nep, false);
         checkSIP(nep, portName, nodeId, extension);
     }
 
-    private void checkNepClient100GTpdr(OwnedNodeEdgePoint nep, Uuid nepUuid, String portName, String nepName,
-                                        String nodeId, String extension) {
-        assertEquals("bad uuid for " + portName, nepUuid, nep.getUuid());
+    private void checkNepClient100GTpdr(
+            OwnedNodeEdgePoint nep, Uuid nepUuid, String portName, String nepName, String nodeId, String extension) {
+        assertEquals(nepUuid, nep.getUuid(), "bad uuid for " + portName);
         List<Name> nameList = new ArrayList<>(nep.nonnullName().values());
-        assertEquals("value of client nep should be '" + portName + "'",
-            String.join("+", nodeId, extension, portName), nameList.get(0).getValue());
-        assertEquals("value-name of client nep for '" + portName + "' should be 100G-tpdr'",
-            nepName, nameList.get(0).getValueName());
-        assertEquals("Client nep should support 1 kind of cep",
-            1, nep.getSupportedCepLayerProtocolQualifier().size());
-        assertThat("client nep should support 2 kind of cep",
-            nep.getSupportedCepLayerProtocolQualifier(),
-            hasItems(DIGITALSIGNALTYPE100GigE.class));
-        assertEquals("client nep should be of ETH protocol type", LayerProtocolName.ETH, nep.getLayerProtocolName());
+        assertEquals(String.join("+", nodeId, extension, portName), nameList.get(0).getValue(),
+            "value of client nep should be '" + portName + "'");
+        assertEquals(nepName, nameList.get(0).getValueName(),
+            "value-name of client nep for '" + portName + "' should be 100G-tpdr'");
+        List<LAYERPROTOCOLQUALIFIER> lpql = new ArrayList<>();
+        for (SupportedCepLayerProtocolQualifierInstances entry : nep.getSupportedCepLayerProtocolQualifierInstances()) {
+            lpql.add(entry.getLayerProtocolQualifier());
+        }
+        assertEquals(1, lpql.size(), "Client nep should support 1 kind of cep");
+        assertThat("client nep should support 2 kind of cep", lpql, hasItems(DIGITALSIGNALTYPE100GigE.VALUE));
+        assertEquals(LayerProtocolName.DSR, nep.getLayerProtocolName(), "client nep should be of DSR(ETH) protocol");
         checkCommonPartOfNep(nep, false);
         checkSIP(nep, portName, nodeId, extension);
     }
 
-    private void checkNepOtsiNode(OwnedNodeEdgePoint nep, Uuid nepUuid, String portName, String nepName,
-                                  String nodeId, String extension) {
-        assertEquals("bad uuid for " + portName, nepUuid, nep.getUuid());
+    private void checkNepOtsiNode(
+            OwnedNodeEdgePoint nep, Uuid nepUuid, String portName, String nepName, String nodeId, String extension) {
+        assertEquals(nepUuid, nep.getUuid(), "bad uuid for " + portName);
         List<Name> nameList = new ArrayList<>(nep.nonnullName().values());
-        assertEquals("value of OTSi nep should be '" + portName + "'",
-            String.join("+", nodeId, extension, portName), nameList.get(0).getValue());
-        assertEquals("value-name of OTSi nep should be '" + nepName + "'",
-            nepName, nameList.get(0).getValueName());
-        assertEquals("OTSi nep should support 2 kind of cep",
-            2, nep.getSupportedCepLayerProtocolQualifier().size());
-        assertThat("OTSi nep should support 2 kind of cep",
-            nep.getSupportedCepLayerProtocolQualifier(),
-            hasItems(PHOTONICLAYERQUALIFIEROMS.class, PHOTONICLAYERQUALIFIEROTSi.class));
-        assertEquals("OTSi nep should be of PHOTONIC_MEDIA protocol type",
-            LayerProtocolName.PHOTONICMEDIA, nep.getLayerProtocolName());
-        assertEquals("OTSi nep should support one SIP", 1, nep.getMappedServiceInterfacePoint().size());
+        assertEquals(String.join("+", nodeId, extension, portName), nameList.get(0).getValue(),
+            "value of OTSi nep should be '" + portName + "'");
+        assertEquals(nepName, nameList.get(0).getValueName(), "value-name of OTSi nep should be '" + nepName + "'");
+        List<LAYERPROTOCOLQUALIFIER> lpql = new ArrayList<>();
+        for (SupportedCepLayerProtocolQualifierInstances entry : nep.getSupportedCepLayerProtocolQualifierInstances()) {
+            lpql.add(entry.getLayerProtocolQualifier());
+        }
+        assertEquals(2, lpql.size(), "OTSi nep should support 2 kind of cep");
+        assertThat("OTSi nep should support 2 kind of cep", lpql,
+            hasItems(PHOTONICLAYERQUALIFIEROMS.VALUE, PHOTONICLAYERQUALIFIEROTSi.VALUE));
+        assertEquals(LayerProtocolName.PHOTONICMEDIA, nep.getLayerProtocolName(),
+            "OTSi nep should be of PHOTONIC_MEDIA protocol type");
+        assertEquals(1, nep.getMappedServiceInterfacePoint().size(), "OTSi nep should support one SIP");
         checkCommonPartOfNep(nep, false);
         checkSIP(nep, portName, nodeId, extension);
     }
 
     private void checkSIP(OwnedNodeEdgePoint nep, String portName, String nodeId, String extension) {
-        Uuid sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP", nodeId, extension, portName))
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        assertEquals("service-interface-point-uuid of network nep for '" + portName + "' should be '"
-            + String.join("+", "SIP", portName) + "'", sipUuid, nep.getMappedServiceInterfacePoint()
-            .get(new MappedServiceInterfacePointKey(sipUuid)).getServiceInterfacePointUuid());
+        Uuid sipUuid = new Uuid(
+            UUID.nameUUIDFromBytes((String.join("+", "SIP", nodeId, extension, portName))
+                    .getBytes(Charset.forName("UTF-8")))
+                .toString());
+        assertEquals(
+            sipUuid,
+            nep.getMappedServiceInterfacePoint().get(new MappedServiceInterfacePointKey(sipUuid))
+                .getServiceInterfacePointUuid(),
+            "service-interface-point-uuid of network nep for '" + portName + "' should be '"
+                + String.join("+", "SIP", portName) + "'");
     }
 
     private void checkNepOtsiRdmNode(OwnedNodeEdgePoint nep, Uuid nepUuid, String portName, String nepName) {
-        assertEquals("bad uuid for " + portName, nepUuid, nep.getUuid());
+        assertEquals(nepUuid, nep.getUuid(), "bad uuid for " + portName);
         List<Name> nameList = new ArrayList<>(nep.nonnullName().values());
-        assertEquals("value of OTSi nep should be '" + portName + "'",
-            portName, nameList.get(0).getValue());
-        assertEquals("value-name of OTSi nep should be '" + nepName + "'",
-            nepName, nameList.get(0).getValueName());
-        assertEquals("OTSi nep of RDM infra node should support only 1 kind of cep",
-            1, nep.getSupportedCepLayerProtocolQualifier().size());
-        assertThat("OTSi nep should support 2 kind of cep",
-            nep.getSupportedCepLayerProtocolQualifier(),
-            hasItems(PHOTONICLAYERQUALIFIEROMS.class));
-        assertEquals("OTSi nep should be of PHOTONIC_MEDIA protocol type",
-            LayerProtocolName.PHOTONICMEDIA, nep.getLayerProtocolName());
-        assertEquals("OTSi nep of RDM infra should support no SIP", 0, nep.nonnullMappedServiceInterfacePoint().size());
+        assertEquals(portName, nameList.get(0).getValue(), "value of OTSi nep should be '" + portName + "'");
+        assertEquals(nepName, nameList.get(0).getValueName(), "value-name of OTSi nep should be '" + nepName + "'");
+        List<LAYERPROTOCOLQUALIFIER> lpql = new ArrayList<>();
+        for (SupportedCepLayerProtocolQualifierInstances entry : nep.getSupportedCepLayerProtocolQualifierInstances()) {
+            lpql.add(entry.getLayerProtocolQualifier());
+        }
+        assertEquals(1, lpql.size(), "OTSi nep of RDM infra node should support only 1 kind of cep");
+        assertThat("OTSi nep should support OTS cep", lpql, hasItems(PHOTONICLAYERQUALIFIEROTS.VALUE));
+        assertEquals(LayerProtocolName.PHOTONICMEDIA, nep.getLayerProtocolName(),
+            "OTSi nep should be of PHOTONIC_MEDIA protocol type");
+        assertEquals(0, nep.nonnullMappedServiceInterfacePoint().size(), "OTSi nep of RDM infra should support no SIP");
         checkCommonPartOfNep(nep, true);
     }
 
     private void checkCommonPartOfNep(OwnedNodeEdgePoint nep, boolean isRdm) {
-        assertEquals("link port direction should be DIRECTIONAL",
-            PortDirection.BIDIRECTIONAL, nep.getLinkPortDirection());
-        assertEquals("administrative state should be UNLOCKED",
-            AdministrativeState.UNLOCKED, nep.getAdministrativeState());
-        assertEquals("termination state should be TERMINATED BIDIRECTIONAL",
-            TerminationState.TERMINATEDBIDIRECTIONAL, nep.getTerminationState());
-        assertEquals("life-cycle state should be INSTALLED", LifecycleState.INSTALLED, nep.getLifecycleState());
+        assertEquals(Direction.BIDIRECTIONAL, nep.getDirection(),
+            "link port direction should be DIRECTIONAL");
+        assertEquals(AdministrativeState.UNLOCKED, nep.getAdministrativeState(),
+            "administrative state should be UNLOCKED");
+//      TODO: convert this test since terminationState is migrated to CEP attribute in TAPI 2.4
+//        assertEquals(TerminationState.TERMINATEDBIDIRECTIONAL, nep.getTerminationState(),
+//            "termination state should be TERMINATED BIDIRECTIONAL");
+        assertEquals(LifecycleState.INSTALLED, nep.getLifecycleState(),
+            "life-cycle state should be INSTALLED");
         if (!isRdm) {
-            assertEquals("client nep should support 1 SIP", 1, nep.getMappedServiceInterfacePoint().size());
+            assertEquals(1, nep.getMappedServiceInterfacePoint().size(), "client nep should support 1 SIP");
         }
-        assertEquals("termination direction should be BIDIRECTIONAL",
-            TerminationDirection.BIDIRECTIONAL, nep.getTerminationDirection());
-        assertEquals("operational state of client nep should be ENABLED",
-            OperationalState.ENABLED, nep.getOperationalState());
-        assertEquals("link-port-role of client nep should be SYMMETRIC",
-            PortRole.SYMMETRIC, nep.getLinkPortRole());
+//      TODO: convert this test since terminationState is migrated to CEP attribute in TAPI 2.4
+//        assertEquals(TerminationDirection.BIDIRECTIONAL, nep.getTerminationDirection(),
+//            "termination direction should be BIDIRECTIONAL");
+        assertEquals(OperationalState.ENABLED, nep.getOperationalState(),
+            "operational state of client nep should be ENABLED");
+        assertEquals(PortRole.SYMMETRIC, nep.getLinkPortRole(), "link-port-role of client nep should be SYMMETRIC");
     }
 
-    private void checkTransitionalLink(Link link, Uuid node1Uuid, Uuid node2Uuid, String tp1, String tp2,
-                                       String ietfNodeId) {
-        Uuid linkUuid = new Uuid(UUID.nameUUIDFromBytes((tp1 + "to" + tp2)
-            .getBytes(Charset.forName("UTF-8"))).toString());
-        assertEquals("bad uuid for link between DSR node " + tp1 + " and iOTSI port " + tp2, linkUuid, link.getUuid());
-        assertEquals("Available capacity unit should be GBPS",
-            CapacityUnit.GBPS, link.getAvailableCapacity().getTotalSize().getUnit());
-        assertEquals("Available capacity -total size value should be 100",
-            Uint64.valueOf(100), link.getAvailableCapacity().getTotalSize().getValue());
-        assertEquals("transitional link should be between 2 nodes of protocol layers ODU and PHOTONIC_MEDIA",
-            2, link.getTransitionedLayerProtocolName().size());
-        assertThat("transitional link should be between 2 nodes of protocol layers ODU and PHOTONIC_MEDIA",
-            link.getTransitionedLayerProtocolName(),
-            hasItems(LayerProtocolName.ODU.getName(), LayerProtocolName.PHOTONICMEDIA.getName()));
-        assertEquals("transitional link should be BIDIRECTIONAL",
-            ForwardingDirection.BIDIRECTIONAL, link.getDirection());
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
-            .link.NodeEdgePoint> nodeEdgePointList = new ArrayList<>(link.nonnullNodeEdgePoint().values());
-        assertEquals("topology uuid should be the same for the two termination point of the link",
-            topologyUuid, nodeEdgePointList.get(0).getTopologyUuid());
-        assertEquals("topology uuid should be the same for the two termination point of the link",
-            topologyUuid, nodeEdgePointList.get(1).getTopologyUuid());
-        assertThat("transitional links should terminate on DSR node and Photonic node",
-            nodeEdgePointList.get(0).getNodeUuid().getValue(),
-            either(containsString(node1Uuid.getValue())).or(containsString(node2Uuid.getValue())));
-        assertThat("transitional links should terminate on DSR node and Photonic node",
-            nodeEdgePointList.get(1).getNodeUuid().getValue(),
-            either(containsString(node1Uuid.getValue())).or(containsString(node2Uuid.getValue())));
-        Uuid nep1Uuid = new Uuid(UUID.nameUUIDFromBytes(tp1.getBytes(Charset.forName("UTF-8"))).toString());
-        Uuid nep2Uuid = new Uuid(UUID.nameUUIDFromBytes(tp2.getBytes(Charset.forName("UTF-8"))).toString());
-        assertThat("transitional links should terminate on " + tp1 + " and " + tp2 + " neps",
-            nodeEdgePointList.get(0).getNodeEdgePointUuid().getValue(),
-            either(containsString(nep1Uuid.getValue())).or(containsString(nep2Uuid.getValue())));
-        assertThat("transitional links should terminate on DSR node and Photonic node",
-            nodeEdgePointList.get(1).getNodeEdgePointUuid().getValue(),
-            either(containsString(nep1Uuid.getValue())).or(containsString(nep2Uuid.getValue())));
-    }
-
-    private void checkOtnLink(Link link, Uuid node1Uuid, Uuid node2Uuid, Uuid tp1Uuid, Uuid tp2Uuid, Uuid linkUuid,
-                              String linkName) {
-        assertEquals("bad name for the link", linkName, link.getName().get(new NameKey("otn link name")).getValue());
-        assertEquals("bad uuid for link", linkUuid, link.getUuid());
-        assertEquals("Available capacity unit should be MBPS",
-            CapacityUnit.GBPS, link.getAvailableCapacity().getTotalSize().getUnit());
+    private void checkOtnLink(
+            Link link, Uuid node1Uuid, Uuid node2Uuid, Uuid tp1Uuid, Uuid tp2Uuid, Uuid linkUuid, String linkName) {
+        assertEquals(linkName, link.getName().get(new NameKey("otn link name")).getValue(), "bad name for the link");
+        assertEquals(linkUuid, link.getUuid(), "bad uuid for link");
+        assertEquals(CAPACITYUNITGBPS.VALUE, link.getAvailableCapacity().getTotalSize().getUnit(),
+            "Available capacity unit should be MBPS");
         String prefix = linkName.split("-")[0];
         if ("OTU4".equals(prefix)) {
-            assertEquals("Available capacity -total size value should be 0",
-                Uint64.valueOf(0), link.getAvailableCapacity().getTotalSize().getValue());
+            assertEquals(Uint64.valueOf(0), link.getAvailableCapacity().getTotalSize().getValue(),
+                "Available capacity -total size value should be 0");
         } else if ("ODTU4".equals(prefix)) {
-            assertEquals("Available capacity -total size value should be 100 000",
-                Uint64.valueOf(100000), link.getAvailableCapacity().getTotalSize().getValue());
+            assertEquals(Uint64.valueOf(100000), link.getAvailableCapacity().getTotalSize().getValue(),
+                "Available capacity -total size value should be 100 000");
         }
-        assertEquals("Total capacity unit should be GBPS",
-            CapacityUnit.GBPS, link.getTotalPotentialCapacity().getTotalSize().getUnit());
-        assertEquals("Total capacity -total size value should be 100",
-            Uint64.valueOf(100), link.getTotalPotentialCapacity().getTotalSize().getValue());
+        assertEquals(CAPACITYUNITGBPS.VALUE, link.getTotalPotentialCapacity().getTotalSize().getUnit(),
+            "Total capacity unit should be GBPS");
+        assertEquals(Decimal64.valueOf("100"), link.getTotalPotentialCapacity().getTotalSize().getValue(),
+            "Total capacity -total size value should be 100");
         if ("OTU4".equals(prefix)) {
-            assertEquals("otn link should be between 2 nodes of protocol layers PHOTONIC_MEDIA",
-                LayerProtocolName.PHOTONICMEDIA.getName(), link.getLayerProtocolName().get(0).getName());
+            assertEquals(
+                LayerProtocolName.PHOTONICMEDIA.getName(),
+                link.getLayerProtocolName().stream().findFirst().orElseThrow().getName(),
+                "otn link should be between 2 nodes of protocol layers PHOTONIC_MEDIA");
         } else if ("ODTU4".equals(prefix)) {
-            assertEquals("otn link should be between 2 nodes of protocol layers ODU",
-                LayerProtocolName.ODU.getName(), link.getLayerProtocolName().get(0).getName());
+            assertEquals(
+                LayerProtocolName.ODU.getName(),
+                link.getLayerProtocolName().stream().findFirst().orElseThrow().getName(),
+                "otn link should be between 2 nodes of protocol layers ODU");
         }
-        assertEquals("otn tapi link should be BIDIRECTIONAL",
-            ForwardingDirection.BIDIRECTIONAL, link.getDirection());
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
-            .link.NodeEdgePoint> nodeEdgePointList = new ArrayList<>(link.nonnullNodeEdgePoint().values());
-        assertEquals("topology uuid should be the same for the two termination point of the link",
-            topologyUuid, nodeEdgePointList.get(0).getTopologyUuid());
-        assertEquals("topology uuid should be the same for the two termination point of the link",
-            topologyUuid, nodeEdgePointList.get(1).getTopologyUuid());
+        assertEquals(ForwardingDirection.BIDIRECTIONAL, link.getDirection(), "otn tapi link should be BIDIRECTIONAL");
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
+                .link.NodeEdgePoint> nodeEdgePointList = new ArrayList<>(link.nonnullNodeEdgePoint().values());
+        LOG.info("OUTPUT: Node1UUID = {}, Node2UU2D = {},", node1Uuid, node2Uuid);
+        LOG.info("NEPLIST = {}", nodeEdgePointList);
+        assertEquals(topologyUuid, nodeEdgePointList.get(0).getTopologyUuid(),
+            "topology uuid should be the same for the two termination point of the link");
+        assertEquals(topologyUuid, nodeEdgePointList.get(1).getTopologyUuid(),
+            "topology uuid should be the same for the two termination point of the link");
         assertThat("otn links should terminate on two distinct nodes",
             nodeEdgePointList.get(0).getNodeUuid().getValue(),
             either(containsString(node1Uuid.getValue())).or(containsString(node2Uuid.getValue())));
@@ -1317,27 +1260,27 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
         assertThat("otn links should terminate on two distinct tps",
             nodeEdgePointList.get(1).getNodeEdgePointUuid().getValue(),
             either(containsString(tp1Uuid.getValue())).or(containsString(tp2Uuid.getValue())));
-        assertEquals("operational state should be ENABLED",
-            OperationalState.ENABLED, link.getOperationalState());
-        assertEquals("administrative state should be UNLOCKED",
-            AdministrativeState.UNLOCKED, link.getAdministrativeState());
+        assertEquals(OperationalState.ENABLED, link.getOperationalState(), "operational state should be ENABLED");
+        assertEquals(AdministrativeState.UNLOCKED, link.getAdministrativeState(),
+            "administrative state should be UNLOCKED");
     }
 
-    private void checkOmsLink(Link link, Uuid node1Uuid, Uuid node2Uuid, Uuid tp1Uuid, Uuid tp2Uuid, Uuid linkUuid,
-                              String linkName) {
-        assertEquals("bad name for the link", linkName, link.getName().get(new NameKey("OMS link name")).getValue());
-        assertEquals("bad uuid for link", linkUuid, link.getUuid());
-        assertEquals("oms link should be between 2 nodes of protocol layers PHOTONIC_MEDIA",
-            LayerProtocolName.PHOTONICMEDIA.getName(), link.getLayerProtocolName().get(0).getName());
-        assertEquals("otn tapi link should be BIDIRECTIONAL",
-            ForwardingDirection.BIDIRECTIONAL, link.getDirection());
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
-            .link.NodeEdgePoint> nodeEdgePointList = new ArrayList<>(link.nonnullNodeEdgePoint().values());
-        assertEquals("oms link should be between 2 neps",2 , nodeEdgePointList.size());
-        assertEquals("topology uuid should be the same for the two termination point of the link",
-            topologyUuid, nodeEdgePointList.get(0).getTopologyUuid());
-        assertEquals("topology uuid should be the same for the two termination point of the link",
-            topologyUuid, nodeEdgePointList.get(1).getTopologyUuid());
+    private void checkOmsLink(
+            Link link, Uuid node1Uuid, Uuid node2Uuid, Uuid tp1Uuid, Uuid tp2Uuid, Uuid linkUuid, String linkName) {
+        assertEquals(linkName, link.getName().get(new NameKey("OTS link name")).getValue(), "bad name for the link");
+        assertEquals(linkUuid, link.getUuid(), "bad uuid for link");
+        assertEquals(
+            LayerProtocolName.PHOTONICMEDIA.getName(),
+            link.getLayerProtocolName().stream().findFirst().orElseThrow().getName(),
+            "oms link should be between 2 nodes of protocol layers PHOTONIC_MEDIA");
+        assertEquals(ForwardingDirection.BIDIRECTIONAL, link.getDirection(), "otn tapi link should be BIDIRECTIONAL");
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
+                .link.NodeEdgePoint> nodeEdgePointList = new ArrayList<>(link.nonnullNodeEdgePoint().values());
+        assertEquals(2, nodeEdgePointList.size(), "oms link should be between 2 neps");
+        assertEquals(topologyUuid, nodeEdgePointList.get(0).getTopologyUuid(),
+            "topology uuid should be the same for the two termination point of the link");
+        assertEquals(topologyUuid, nodeEdgePointList.get(1).getTopologyUuid(),
+            "topology uuid should be the same for the two termination point of the link");
         assertThat("oms links should terminate on two distinct nodes",
             nodeEdgePointList.get(0).getNodeUuid().getValue(),
             either(containsString(node1Uuid.getValue())).or(containsString(node2Uuid.getValue())));
@@ -1353,34 +1296,50 @@ public class ConvertORTopoToTapiTopoTest extends AbstractTest {
     }
 
     private Node changeTerminationPointState(Node initialNode, String tpid, AdminStates admin, State oper) {
-        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder tpdr1Bldr
-            = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.Node1Builder(
-            initialNode.augmentation(Node1.class));
+        var tpdr1Bldr = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                .Node1Builder(initialNode.augmentation(Node1.class));
         Map<TerminationPointKey, TerminationPoint> tps = new HashMap<>(tpdr1Bldr.getTerminationPoint());
-        TerminationPointBuilder tpBldr = new TerminationPointBuilder(
-            tps.get(new TerminationPointKey(new TpId(tpid))));
-        TerminationPoint1Builder tp1Bldr = new TerminationPoint1Builder(tpBldr.augmentation(TerminationPoint1.class));
-        tp1Bldr.setAdministrativeState(admin)
-            .setOperationalState(oper);
+        TerminationPointBuilder tpBldr = new TerminationPointBuilder(tps.get(new TerminationPointKey(new TpId(tpid))));
+        TerminationPoint1Builder tp1Bldr =
+            new TerminationPoint1Builder(tpBldr.augmentation(TerminationPoint1.class))
+                .setAdministrativeState(admin)
+                .setOperationalState(oper);
         tpBldr.addAugmentation(tp1Bldr.build());
         tps.replace(tpBldr.key(), tpBldr.build());
-        tpdr1Bldr.setTerminationPoint(tps);
-        return new NodeBuilder(initialNode).addAugmentation(tpdr1Bldr.build()).build();
+        return new NodeBuilder(initialNode).addAugmentation(tpdr1Bldr.setTerminationPoint(tps).build()).build();
     }
 
-    private org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
-            .Link changeOtnLinkState(
-            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
-            .Link initiallink, AdminStates admin, State oper) {
+    private org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                .networks.network.Link changeOtnLinkState(
+            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                .networks.network.Link initiallink,
+            AdminStates admin,
+            State oper) {
+        var linkBldr = new org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226
+                .networks.network.LinkBuilder(initiallink);
+        return linkBldr
+            .addAugmentation(
+                new Link1Builder(linkBldr.augmentation(Link1.class))
+                    .setAdministrativeState(admin)
+                    .setOperationalState(oper)
+                    .build())
+            .build();
+    }
 
-        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
-            .LinkBuilder linkBldr = new
-            org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.topology.rev180226.networks.network
-            .LinkBuilder(initiallink);
-        Link1Builder link1Bldr = new Link1Builder(linkBldr.augmentation(Link1.class));
-        link1Bldr.setAdministrativeState(admin)
-            .setOperationalState(oper);
-        linkBldr.addAugmentation(link1Bldr.build());
-        return linkBldr.build();
+    private int getNodeRank(
+            String searchedChar,
+            List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> nodeList) {
+        int foundAtRank = 0;
+        int rank = 0;
+        for (var node: nodeList) {
+            for (Map.Entry<NameKey, Name> entry: node.getName().entrySet()) {
+                if (entry.getValue().getValue().contains(searchedChar)) {
+                    foundAtRank = rank;
+                }
+            }
+            rank++;
+        }
+        LOG.info("searched Char {} found at rank {}", searchedChar, foundAtRank);
+        return foundAtRank;
     }
-}
\ No newline at end of file
+}
index 9f4f466e73e0ed9a37fe76e736cb3dcc3ab090e2..4fc51dc7986924dbb6afc5ba03d4fde83f18c8e2 100644 (file)
  */
 package org.opendaylight.transportpce.tapi.topology;
 
-import static org.junit.Assert.assertNull;
-import static org.mockito.Mockito.mock;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.when;
 
 import com.google.common.util.concurrent.FluentFuture;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
-import java.util.Optional;
+import java.nio.charset.Charset;
+import java.util.UUID;
 import java.util.concurrent.ExecutionException;
-import org.eclipse.jdt.annotation.NonNull;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.Mock;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
-import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.api.ReadTransaction;
-import org.opendaylight.mdsal.common.api.CommitInfo;
-import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.opendaylight.mdsal.binding.api.RpcService;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
 import org.opendaylight.transportpce.tapi.TapiStringConstants;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetTopologyDetailsImpl;
 import org.opendaylight.transportpce.tapi.utils.TapiContext;
 import org.opendaylight.transportpce.tapi.utils.TapiLink;
 import org.opendaylight.transportpce.tapi.utils.TapiTopologyDataUtils;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetTopologyDetailsInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetTopologyDetailsOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.get.topology.details.output.Topology;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetTopologyDetails;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetTopologyDetailsInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetTopologyDetailsOutput;
+import org.opendaylight.yangtools.yang.common.ErrorType;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 
+@ExtendWith(MockitoExtension.class)
 public class TapiTopologyImplExceptionTest {
     @Mock
-    TapiContext tapiContext;
+    private RpcService rpcService;
     @Mock
-    TopologyUtils topologyUtils;
+    private NetworkTransactionService networkTransactionService;
     @Mock
-    TapiLink tapiLink;
+    private TapiContext tapiContext;
+    @Mock
+    private TopologyUtils topologyUtils;
+    @Mock
+    private TapiLink tapiLink;
 
     @Test
-    public void getTopologyDetailsWithExceptionTest() throws InterruptedException, ExecutionException {
-        DataBroker dataBroker = mock(DataBroker.class);
-        when(dataBroker.newReadOnlyTransaction())
-                .thenReturn(new ReadTransactionMock());
-        NetworkTransactionService networkTransactionService = mock(NetworkTransactionService.class);
-        Answer<FluentFuture<CommitInfo>> answer = new Answer<FluentFuture<CommitInfo>>() {
-
-            @Override
-            public FluentFuture<CommitInfo> answer(InvocationOnMock invocation) throws Throwable {
-                return CommitInfo.emptyFluentFuture();
-            }
-
-        };
-        when(networkTransactionService.commit()).then(answer);
-        tapiContext = new TapiContext(networkTransactionService);
-        tapiLink = new TapiLink(networkTransactionService);
-
-        GetTopologyDetailsInput input = TapiTopologyDataUtils.buildGetTopologyDetailsInput(
-            TapiStringConstants.T0_MULTILAYER);
-        TapiTopologyImpl tapiTopoImpl = new TapiTopologyImpl(dataBroker, tapiContext, topologyUtils, tapiLink);
-        ListenableFuture<RpcResult<GetTopologyDetailsOutput>> result = tapiTopoImpl.getTopologyDetails(input);
-        RpcResult<GetTopologyDetailsOutput> rpcResult = result.get();
-        if (rpcResult.isSuccessful()) {
-            Topology topology = rpcResult.getResult().getTopology();
-            assertNull("Topology should be null", topology);
-        } else {
-            assertNull("Topology should be null", null);
-        }
-    }
-
-    private class ReadTransactionMock implements ReadTransaction {
-
-        @Override
-        public @NonNull Object getIdentifier() {
-            // TODO Auto-generated method stub
-            return null;
-        }
-
-        @Override
-        public <T extends DataObject> @NonNull FluentFuture<Optional<T>> read(@NonNull LogicalDatastoreType store,
-                                                                              @NonNull InstanceIdentifier<T> path) {
-            return FluentFuture.from(Futures.immediateFailedFuture(new InterruptedException()));
-        }
-
-        @Override
-        public @NonNull FluentFuture<Boolean> exists(@NonNull LogicalDatastoreType store,
-                                                     @NonNull InstanceIdentifier<?> path) {
-            // TODO Auto-generated method stub
-            return null;
-        }
-
-        @Override
-        public void close() {
-            // TODO Auto-generated method stub
-        }
+    void getTopologyDetailsWithExceptionTest() throws InterruptedException, ExecutionException {
+        when(networkTransactionService.read(any(), any()))
+            .thenReturn(FluentFuture.from(Futures.immediateFailedFuture(new InterruptedException())));
+        when(rpcService.getRpc(GetTopologyDetails.class))
+            .thenReturn(new GetTopologyDetailsImpl(tapiContext, topologyUtils, tapiLink, networkTransactionService));
+        Uuid topologyUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_MULTILAYER.getBytes(
+            Charset.forName("UTF-8"))).toString());
+        GetTopologyDetailsInput input = TapiTopologyDataUtils.buildGetTopologyDetailsInput(topologyUuid);
+        ListenableFuture<RpcResult<GetTopologyDetailsOutput>> result = rpcService
+                .getRpc(GetTopologyDetails.class).invoke(input);
+        assertFalse(result.get().isSuccessful(), "RpcResult is not successful");
+        assertNull(result.get().getResult(), "RpcResult result should be null");
+        assertEquals(ErrorType.RPC, result.get().getErrors().get(0).getErrorType());
+        assertEquals("Error building topology", result.get().getErrors().get(0).getMessage());
     }
-
-}
+}
\ No newline at end of file
index d5925d5bf8b1fa18133a188f00784e052b22fc61..427b637578d8840976ce20c6e62382d9eebcd020 100644 (file)
@@ -10,12 +10,12 @@ package org.opendaylight.transportpce.tapi.topology;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.either;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
 
 import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.common.util.concurrent.MoreExecutors;
+import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -27,76 +27,89 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executors;
 import java.util.stream.Collectors;
 import org.eclipse.jdt.annotation.Nullable;
-import org.junit.BeforeClass;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+import org.opendaylight.mdsal.binding.api.RpcService;
 import org.opendaylight.transportpce.common.InstanceIdentifiers;
 import org.opendaylight.transportpce.common.network.NetworkTransactionImpl;
 import org.opendaylight.transportpce.common.network.NetworkTransactionService;
-import org.opendaylight.transportpce.common.network.RequestProcessor;
 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperations;
 import org.opendaylight.transportpce.servicehandler.service.ServiceDataStoreOperationsImpl;
 import org.opendaylight.transportpce.tapi.TapiStringConstants;
 import org.opendaylight.transportpce.tapi.connectivity.ConnectivityUtils;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetLinkDetailsImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetNodeDetailsImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetNodeEdgePointDetailsImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetServiceInterfacePointDetailsImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetServiceInterfacePointListImpl;
+import org.opendaylight.transportpce.tapi.impl.rpc.GetTopologyDetailsImpl;
 import org.opendaylight.transportpce.tapi.utils.TapiContext;
 import org.opendaylight.transportpce.tapi.utils.TapiInitialORMapping;
 import org.opendaylight.transportpce.tapi.utils.TapiLink;
+import org.opendaylight.transportpce.tapi.utils.TapiLinkImpl;
 import org.opendaylight.transportpce.tapi.utils.TapiTopologyDataUtils;
 import org.opendaylight.transportpce.test.AbstractTest;
 import org.opendaylight.transportpce.test.utils.TopologyDataUtils;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.AdministrativeState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.CapacityUnit;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.ForwardingDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.GetServiceInterfacePointDetailsInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.GetServiceInterfacePointDetailsOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.GetServiceInterfacePointListInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.GetServiceInterfacePointListOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.OperationalState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.get.service._interface.point.list.output.Sip;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.get.service._interface.point.list.output.SipKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.ForwardingRule;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetLinkDetailsInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetLinkDetailsOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetNodeDetailsInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetNodeDetailsOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetNodeEdgePointDetailsInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetNodeEdgePointDetailsOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetTopologyDetailsInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetTopologyDetailsOutput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.Node;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.RuleType;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.get.topology.details.output.Topology;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.NodeRuleGroup;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.OwnedNodeEdgePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.NodeEdgePoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.node.rule.group.Rule;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Link;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.CAPACITYUNITGBPS;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.ForwardingDirection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.GetServiceInterfacePointDetailsInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.GetServiceInterfacePointDetailsOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.GetServiceInterfacePointListInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.GetServiceInterfacePointListOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.get.service._interface.point.list.output.Sip;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.get.service._interface.point.list.output.SipKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.FORWARDINGRULEMAYFORWARDACROSSGROUP;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetLinkDetailsInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetLinkDetailsOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetNodeDetailsInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetNodeDetailsOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetNodeEdgePointDetailsInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetNodeEdgePointDetailsOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetTopologyDetailsInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetTopologyDetailsOutput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.Node;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.RuleType;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.get.topology.details.output.Topology;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.NodeRuleGroup;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.OwnedNodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.NodeEdgePoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.node.rule.group.Rule;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Link;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.LinkKey;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.opendaylight.yangtools.yang.common.Uint64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@ExtendWith(MockitoExtension.class)
 public class TapiTopologyImplTest extends AbstractTest {
     private static final Logger LOG = LoggerFactory.getLogger(TapiTopologyImplTest.class);
 
-    private static ListeningExecutorService executorService;
-    private static CountDownLatch endSignal;
+    @Mock
+    private RpcService rpcService;
     private static final int NUM_THREADS = 3;
-    public static NetworkTransactionService networkTransactionService;
-    public static TapiContext tapiContext;
-    public static TopologyUtils topologyUtils;
-    public static ConnectivityUtils connectivityUtils;
-    public static ServiceDataStoreOperations serviceDataStoreOperations;
-    public static TapiInitialORMapping tapiInitialORMapping;
-    public static TapiLink tapiLink;
+    private static NetworkTransactionService networkTransactionService;
+    private static TapiContext tapiContext;
+    private static TopologyUtils topologyUtils;
+    private static ConnectivityUtils connectivityUtils;
+    private static ServiceDataStoreOperations serviceDataStoreOperations;
+    private static TapiInitialORMapping tapiInitialORMapping;
+    private static TapiLink tapiLink;
 
-    @BeforeClass
-    public static void setUp() throws InterruptedException, ExecutionException {
-        executorService = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(NUM_THREADS));
-        endSignal = new CountDownLatch(1);
+    @BeforeAll
+    static void setUp() throws InterruptedException, ExecutionException {
+        MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(NUM_THREADS));
+        new CountDownLatch(1);
         TopologyDataUtils.writeTopologyFromFileToDatastore(getDataStoreContextUtil(),
             TapiTopologyDataUtils.OPENROADM_TOPOLOGY_FILE, InstanceIdentifiers.OVERLAY_NETWORK_II);
         TopologyDataUtils.writeTopologyFromFileToDatastore(getDataStoreContextUtil(),
@@ -105,9 +118,8 @@ public class TapiTopologyImplTest extends AbstractTest {
             TapiTopologyDataUtils.OTN_TOPOLOGY_FILE, InstanceIdentifiers.OTN_NETWORK_II);
         TopologyDataUtils.writePortmappingFromFileToDatastore(getDataStoreContextUtil(),
             TapiTopologyDataUtils.PORTMAPPING_FILE);
-        networkTransactionService = new NetworkTransactionImpl(
-            new RequestProcessor(getDataStoreContextUtil().getDataBroker()));
-        tapiLink = new TapiLink(networkTransactionService);
+        networkTransactionService = new NetworkTransactionImpl(getDataBroker());
+        tapiLink = new TapiLinkImpl(networkTransactionService);
         serviceDataStoreOperations = new ServiceDataStoreOperationsImpl(getDataStoreContextUtil().getDataBroker());
         tapiContext = new TapiContext(networkTransactionService);
         topologyUtils = new TopologyUtils(networkTransactionService, getDataStoreContextUtil().getDataBroker(),
@@ -121,140 +133,166 @@ public class TapiTopologyImplTest extends AbstractTest {
     }
 
     @Test
-    public void getTopologyDetailsForTransponder100GTopologyWhenSuccessful()
-            throws ExecutionException, InterruptedException {
-        GetTopologyDetailsInput input = TapiTopologyDataUtils.buildGetTopologyDetailsInput(
-            TapiStringConstants.TPDR_100G);
-        TapiTopologyImpl tapiTopoImpl = new TapiTopologyImpl(getDataBroker(), tapiContext, topologyUtils, tapiLink);
-        ListenableFuture<RpcResult<GetTopologyDetailsOutput>> result = tapiTopoImpl.getTopologyDetails(input);
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-        endSignal.await();
+    void getTopologyDetailsForTransponder100GTopologyWhenSuccessful() throws ExecutionException, InterruptedException {
+        Uuid topologyUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.TPDR_100G.getBytes(
+            Charset.forName("UTF-8"))).toString());
+        LOG.info("TPDR100GUuid = {}", topologyUuid);
+        GetTopologyDetailsInput input = TapiTopologyDataUtils.buildGetTopologyDetailsInput(topologyUuid);
+//        TapiTopologyImpl tapiTopoImpl = new TapiTopologyImpl(networkTransactionService, tapiContext, topologyUtils,
+//            tapiLink);
+        ListenableFuture<RpcResult<GetTopologyDetailsOutput>> result = new GetTopologyDetailsImpl(tapiContext,
+                topologyUtils, tapiLink, networkTransactionService)
+            .invoke(input);
+        LOG.info("RESULT of getTopoDetailsTopo/name = {}", result.get().getResult().getTopology().getName().toString());
         RpcResult<GetTopologyDetailsOutput> rpcResult = result.get();
         @Nullable
         Topology topology = rpcResult.getResult().getTopology();
-        assertNotNull("Topology should not be null", topology);
+        assertNotNull(topology, "Topology should not be null");
         Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.TPDR_100G.getBytes(StandardCharsets.UTF_8))
             .toString());
-        assertEquals("incorrect topology uuid", topoUuid, topology.getUuid());
-        assertEquals("Node list size should be 1", 1, topology.getNode().size());
-        Name nodeName = topology.getNode().values().stream().findFirst().get().getName()
+        assertEquals(topoUuid, topology.getUuid(), "incorrect topology uuid");
+        assertEquals(1, topology.getNode().size(), "Node list size should be 1");
+        Name nodeName = topology.getNode().values().stream().findFirst().orElseThrow().getName()
             .get(new NameKey("Tpdr100g node name"));
-        assertEquals("Node name should be 'Tpdr100g over WDM node'", "Tpdr100g over WDM node", nodeName.getValue());
+        assertEquals("Tpdr100g over WDM node", nodeName.getValue(), "Node name should be 'Tpdr100g over WDM node'");
         Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(nodeName.getValue().getBytes(StandardCharsets.UTF_8))
             .toString());
-        assertEquals("incorrect node uuid", nodeUuid, topology.getNode().values().stream().findFirst().get().getUuid());
-        long nb = topology.getNode().values().stream().findFirst().get().getOwnedNodeEdgePoint().size();
-        assertEquals("'Transponder 100GE' node should have 2 neps", 2, nb);
-        List<NodeRuleGroup> nrgList = topology.getNode().values().stream().findFirst().get().nonnullNodeRuleGroup()
-            .values().stream().sorted((nrg1, nrg2) -> nrg1.getUuid().getValue().compareTo(nrg2.getUuid().getValue()))
+        assertEquals(nodeUuid, topology.getNode().values().stream().findFirst().orElseThrow().getUuid(),
+            "incorrect node uuid");
+        long nb = topology.getNode().values().stream().findFirst().orElseThrow().getOwnedNodeEdgePoint().size();
+        assertEquals(2, nb, "'Transponder 100GE' node should have 2 neps");
+        List<NodeRuleGroup> nrgList = topology.getNode().values().stream().findFirst().orElseThrow()
+            .nonnullNodeRuleGroup().values().stream()
+            .sorted((nrg1, nrg2) -> nrg1.getUuid().getValue().compareTo(nrg2.getUuid().getValue()))
             .collect(Collectors.toList());
-        assertEquals("'Transponder 100GE' node should contain a single node rule groups", 1, nrgList.size());
+        assertEquals(1, nrgList.size(), "'Transponder 100GE' node should contain a single node rule groups");
         List<NodeEdgePoint> nodeEdgePointList = new ArrayList<>(nrgList.get(0).getNodeEdgePoint().values());
-        assertEquals("'Transponder 100GE' node -rule-group should contain 2 NEPs", nb, nodeEdgePointList.size());
+        assertEquals(nb, nodeEdgePointList.size(), "'Transponder 100GE' node -rule-group should contain 2 NEPs");
         List<Rule> ruleList = new ArrayList<>(nrgList.get(0).nonnullRule().values());
-        assertEquals("node-rule-group should contain a single rule", 1, ruleList.size());
-        assertEquals("local-id of the rule should be 'forward'",
-            "forward", ruleList.get(0).getLocalId());
-        assertEquals("the forwarding rule should be 'MAYFORWARDACROSSGROUP'",
-            ForwardingRule.MAYFORWARDACROSSGROUP, ruleList.get(0).getForwardingRule());
-        assertEquals("the rule type should be 'FORWARDING'",
-            RuleType.FORWARDING, ruleList.get(0).getRuleType());
+        assertEquals(1, ruleList.size(), "node-rule-group should contain a single rule");
+        assertEquals("forward", ruleList.get(0).getLocalId(), "local-id of the rule should be 'forward'");
+        assertEquals(FORWARDINGRULEMAYFORWARDACROSSGROUP.VALUE, ruleList.get(0).getForwardingRule(),
+            "the forwarding rule should be 'MAYFORWARDACROSSGROUP'");
+        assertEquals(RuleType.FORWARDING, ruleList.get(0).getRuleType().iterator().next(),
+            "the rule type should be 'FORWARDING'");
     }
 
     @Test
-    public void getTopologyDetailsForOtnTopologyWithOtnLinksWhenSuccessful()
-            throws ExecutionException, InterruptedException {
-        GetTopologyDetailsInput input = TapiTopologyDataUtils.buildGetTopologyDetailsInput(
-            TapiStringConstants.T0_MULTILAYER);
-        TapiTopologyImpl tapiTopoImpl = new TapiTopologyImpl(getDataBroker(), tapiContext, topologyUtils, tapiLink);
-        ListenableFuture<RpcResult<GetTopologyDetailsOutput>> result = tapiTopoImpl.getTopologyDetails(input);
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-        endSignal.await();
+    void getTopologyDetailsForOtnTopologyWithOtnLinksWhenSuccessful() throws ExecutionException, InterruptedException {
+        Uuid topologyUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_MULTILAYER.getBytes(
+            Charset.forName("UTF-8"))).toString());
+        LOG.info("T0MultilayerUuid = {}", topologyUuid);
+        GetTopologyDetailsInput input = TapiTopologyDataUtils.buildGetTopologyDetailsInput(topologyUuid);
+        ListenableFuture<RpcResult<GetTopologyDetailsOutput>> result = new GetTopologyDetailsImpl(tapiContext,
+                topologyUtils, tapiLink, networkTransactionService)
+            .invoke(input);
         RpcResult<GetTopologyDetailsOutput> rpcResult = result.get();
         @Nullable
         Topology topology = rpcResult.getResult().getTopology();
-        assertNotNull("Topology should not be null", topology);
-        assertEquals("Node list size should be 13", 13, topology.getNode().size());
+        assertNotNull(topology, "Topology should not be null");
+        for (Map.Entry<
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.NodeKey,
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.topology.Node> entry :
+                topology.getNode().entrySet()) {
+            LOG.debug("NODESDETECTED = {}",entry.getValue().getName().toString());
+        }
+        assertEquals(7, topology.getNode().size(), "Node list size should be 7");
         long nb1 = topology.getNode().values().stream()
             .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR))
             .filter(node -> node.getName().get(new NameKey("dsr/odu node name")).getValue()
-                .equals("XPDR-A1-XPDR1+DSR"))
+                .equals("XPDR-A1-XPDR1+XPONDER"))
             .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
                 .filter(nep -> nep.getName().containsKey(new NameKey("100G-tpdr"))))
             .count();
-        assertEquals("XPDR-A1-XPDR1 should only have one client nep", 1, nb1);
+        assertEquals(1, nb1, "XPDR-A1-XPDR1 should only have one client nep");
         long nb2 = topology.getNode().values().stream()
             .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR))
             .filter(node -> node.getName().get(new NameKey("dsr/odu node name")).getValue()
-                .equals("SPDR-SA1-XPDR1+DSR"))
+                .equals("SPDR-SA1-XPDR1+XPONDER"))
             .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
                 .filter(nep -> nep.getName().containsKey(new NameKey("NodeEdgePoint_C"))))
             .count();
-        assertEquals("SPDR-SA1-XPDR1 (mux) should have 4 client neps", 4, nb2);
+        assertEquals(4, nb2, "SPDR-SA1-XPDR1 (mux) should have 4 client neps");
         long nb3 = topology.getNode().values().stream()
             .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR))
             .filter(node -> node.getName().get(new NameKey("dsr/odu node name")).getValue()
-                .equals("SPDR-SA1-XPDR1+DSR"))
+                .equals("SPDR-SA1-XPDR1+XPONDER"))
             .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
                 .filter(nep -> nep.getName().containsKey(new NameKey("iNodeEdgePoint_N"))))
             .count();
-        assertEquals("SPDR-SA1-XPDR1 (mux) should have a single network nep", 1, nb3);
+        assertEquals(1, nb3, "SPDR-SA1-XPDR1 (mux) should have a single network nep");
         long nb4 = topology.getNode().values().stream()
             .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR))
             .filter(node -> node.getName().get(new NameKey("dsr/odu node name")).getValue()
-                .equals("SPDR-SA1-XPDR2+DSR"))
+                .equals("SPDR-SA1-XPDR2+XPONDER"))
             .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
                 .filter(nep -> nep.getName().containsKey(new NameKey("NodeEdgePoint_C"))))
             .count();
-        assertEquals("SPDR-SA1-XPDR2 (switch) should have 4 client neps", 4, nb4);
+        assertEquals(4, nb4, "SPDR-SA1-XPDR2 (switch) should have 4 client neps");
         long nb5 = topology.getNode().values().stream()
             .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR))
             .filter(node -> node.getName().get(new NameKey("dsr/odu node name")).getValue()
-                .equals("SPDR-SA1-XPDR2+DSR"))
+                .equals("SPDR-SA1-XPDR2+XPONDER"))
             .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
                 .filter(nep -> nep.getName().containsKey(new NameKey("iNodeEdgePoint_N"))))
             .count();
-        assertEquals("SPDR-SA1-XPDR2 (switch) should have 2 network neps", 2, nb5);
-        assertEquals("Link list size should be 18", 18, topology.getLink().size());
+        assertEquals(2, nb5, "SPDR-SA1-XPDR2 (switch) should have 2 network neps");
+        long nb7 = topology.getNode().values().stream()
+            .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA)
+                && node.getLayerProtocolName().contains(LayerProtocolName.DSR))
+            .filter(node -> node.getName().get(new NameKey("otsi node name")).getValue()
+                .equals("XPDR-A1-XPDR1+XPONDER"))
+            .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
+                .filter(nep -> nep.getName().containsKey(new NameKey("eNodeEdgePoint"))))
+            .count();
+        assertEquals(1, nb7, "XPDR-A1-XPDR1 should only have 1 OTSI network nep");
+        long nb8 = topology.getNode().values().stream()
+            .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA)
+                && node.getLayerProtocolName().contains(LayerProtocolName.DSR))
+            .filter(node -> node.getName().get(new NameKey("otsi node name")).getValue()
+                .equals("SPDR-SA1-XPDR1+XPONDER"))
+            .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
+                .filter(nep -> nep.getName().containsKey(new NameKey("eNodeEdgePoint"))))
+            .count();
+        assertEquals(1, nb8, "SPDR-SA1-XPDR1 (mux) should have a single OTSI network nep");
+        long nb9 = topology.getNode().values().stream()
+            .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA)
+                && node.getLayerProtocolName().contains(LayerProtocolName.DSR))
+            .filter(node -> node.getName().get(new NameKey("otsi node name")).getValue()
+                .equals("SPDR-SA1-XPDR2+XPONDER"))
+            .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
+                .filter(nep -> nep.getName().containsKey(new NameKey("eNodeEdgePoint"))))
+            .count();
+        assertEquals(2, nb9, "SPDR-SA1-XPDR2 (switch) should have 2 OTSI network nep");
+
+        assertEquals(10, topology.getLink().size(), "Link list size should be 10, no more transitionnal links");
         Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes("T0 - Multi-layer topology".getBytes()).toString());
-        assertEquals("incorrect topology uuid", topoUuid, topology.getUuid());
-        assertEquals("topology name should be T0 - Multi-layer topology",
+        assertEquals(topoUuid, topology.getUuid(), "incorrect topology uuid");
+        assertEquals(
             "T0 - Multi-layer topology",
-            topology.nonnullName().values().stream().findFirst().get().getValue());
+            topology.nonnullName().values().stream().findFirst().orElseThrow().getValue(),
+            "topology name should be T0 - Multi-layer topology");
 
         long nbDsrOduNodes = topology.nonnullNode().values().stream()
             .filter(n -> n.getName().containsKey(new NameKey("dsr/odu node name"))).count();
         long nbPhotonicNodes = topology.nonnullNode().values().stream()
             .filter(n -> n.getName().containsKey(new NameKey("otsi node name"))).count();
-        assertEquals("Node list should contain 6 DSR-ODU nodes", 6, nbDsrOduNodes);
-        assertEquals("Node list should contain 7 Photonics nodes", 7, nbPhotonicNodes);
-        long nbTransititionalLinks = topology.getLink().values().stream()
-            .filter(l -> l.getName().containsKey(new NameKey("transitional link name"))).count();
-        long nbOmsLinks = topology.getLink().values().stream()
-            .filter(l -> l.getName().containsKey(new NameKey("OMS link name"))).count();
+        assertEquals(6, nbDsrOduNodes, "Node list should contain 6 DSR-ODU nodes");
+        assertEquals(7, nbPhotonicNodes, "Node list should contain 7 Photonics node");
+        long nbOtsLinks = topology.getLink().values().stream()
+            .filter(l -> l.getName().containsKey(new NameKey("OTS link name"))).count();
         long nbOtnLinks = topology.getLink().values().stream()
             .filter(l -> l.getName().containsKey(new NameKey("otn link name"))).count();
-        assertEquals("Link list should contain 8 transitional links", 8, nbTransititionalLinks);
-        assertEquals("Link list should contain 8 transitional links", 8, nbOmsLinks);
-        assertEquals("Link list should contain 2 OTN links", 2, nbOtnLinks);
+        assertEquals(8, nbOtsLinks, "Link list should contain 8 OTS links");
+        assertEquals(2, nbOtnLinks, "Link list should contain 2 OTN links");
 
-        Uuid node1Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+DSR".getBytes(StandardCharsets.UTF_8))
+        Uuid node1Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+XPONDER".getBytes(StandardCharsets.UTF_8))
             .toString());
-        Uuid node2Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SC1-XPDR1+DSR".getBytes(StandardCharsets.UTF_8))
+        Uuid node2Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SC1-XPDR1+XPONDER".getBytes(StandardCharsets.UTF_8))
             .toString());
-        Uuid node3Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+OTSi".getBytes(StandardCharsets.UTF_8))
+        Uuid node3Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+XPONDER".getBytes(StandardCharsets.UTF_8))
             .toString());
-        Uuid node4Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SC1-XPDR1+OTSi".getBytes(StandardCharsets.UTF_8))
+        Uuid node4Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SC1-XPDR1+XPONDER".getBytes(StandardCharsets.UTF_8))
             .toString());
         Uuid tp1Uuid = new Uuid(UUID.nameUUIDFromBytes("SPDR-SA1-XPDR1+eODU+XPDR1-NETWORK1"
             .getBytes(StandardCharsets.UTF_8)).toString());
@@ -279,368 +317,307 @@ public class TapiTopologyImplTest extends AbstractTest {
             "SPDR-SA1-XPDR1+iOTSi+XPDR1-NETWORK1toSPDR-SC1-XPDR1+iOTSi+XPDR1-NETWORK1");
         checkOtnLink(links.get(1), topoUuid, node1Uuid, node2Uuid, tp1Uuid, tp2Uuid, link2Uuid,
             "SPDR-SA1-XPDR1+eODU+XPDR1-NETWORK1toSPDR-SC1-XPDR1+eODU+XPDR1-NETWORK1");
+
     }
 
     @Test
-    public void getTopologyDetailsForFullTapiTopologyWithLinksWhenSuccessful()
+    void getTopologyDetailsForFullTapiTopologyWithLinksWhenSuccessful()
             throws ExecutionException, InterruptedException {
-        GetTopologyDetailsInput input = TapiTopologyDataUtils.buildGetTopologyDetailsInput(
-            TapiStringConstants.T0_FULL_MULTILAYER);
-        TapiTopologyImpl tapiTopoImpl = new TapiTopologyImpl(getDataBroker(), tapiContext, topologyUtils, tapiLink);
-        ListenableFuture<RpcResult<GetTopologyDetailsOutput>> result = tapiTopoImpl.getTopologyDetails(input);
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-        endSignal.await();
+        Uuid topologyUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER.getBytes(
+            Charset.forName("UTF-8"))).toString());
+        LOG.info("T0FullMultilayerUuid = {}", topologyUuid);
+        GetTopologyDetailsInput input = TapiTopologyDataUtils.buildGetTopologyDetailsInput(topologyUuid);
+        ListenableFuture<RpcResult<GetTopologyDetailsOutput>> result = new GetTopologyDetailsImpl(tapiContext,
+                topologyUtils, tapiLink, networkTransactionService)
+            .invoke(input);
         RpcResult<GetTopologyDetailsOutput> rpcResult = result.get();
         @Nullable
         Topology topology = rpcResult.getResult().getTopology();
-        assertNotNull("Topology should not be null", topology);
-        // 2 Nodes per Xpdr/Spdr node (DSR-ODU & PHOT) + 1 Node per Roadm
-        assertEquals("Node list size should be 18", 18, topology.getNode().size());
+        assertNotNull(topology, "Topology should not be null");
+        // 2 ROADM Nodes, 2 XPDR Nodes, 6 SPDR Nodes
+        assertEquals(10, topology.getNode().size(), "Node list size should be 10");
+        List<Map<NameKey, Name>> nodeNames = topology.getNode().values().stream()
+            .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA))
+            .map(Node::getName).collect(Collectors.toList());
+        LOG.info("TopologyNodes = {}", nodeNames.toString());
+        Node nodeTsp = topology.getNode().values().stream()
+            .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR))
+            .filter(node -> node.getName().get(new NameKey("dsr/odu node name")).getValue()
+                .equals("XPDR-A1-XPDR1+XPONDER"))
+            .findAny().orElseThrow();
+        LOG.debug("XPDRA1 NEPs = {}", nodeTsp.getOwnedNodeEdgePoint().toString());
         long nb1 = topology.getNode().values().stream()
             .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR))
-            .filter(node -> node.getName().values().stream().findFirst().get().getValue().equals("XPDR-A1-XPDR1+DSR"))
+            .filter(node -> node.getName().get(new NameKey("dsr/odu node name")).getValue()
+                .equals("XPDR-A1-XPDR1+XPONDER"))
             .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
                 .filter(nep -> nep.getName().containsKey(new NameKey("100G-tpdr"))))
             .count();
         // 2 client ports in configuration -> removed the checkTp so we have 2 NEPs
-        assertEquals("XPDR-A1-XPDR1+DSR should only have two client neps", 2, nb1);
+        assertEquals(2, nb1, "XPDR-A1-XPDR1+XPONDER should only have two client neps");
         long inb1 = topology.getNode().values().stream()
             .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR))
-            .filter(node -> node.getName().values().stream().findFirst().get().getValue().equals("XPDR-A1-XPDR1+DSR"))
+            .filter(node -> node.getName().get(new NameKey("dsr/odu node name")).getValue()
+                .equals("XPDR-A1-XPDR1+XPONDER"))
             .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
                 .filter(nep -> nep.getName().containsKey(new NameKey("iNodeEdgePoint_N"))))
             .count();
-        assertEquals("XPDR-A1-XPDR1+DSR should only have two internal network neps", 2, inb1);
+        assertEquals(2, inb1, "XPDR-A1-XPDR1+XPONDER should only have two internal network neps");
         long enb1 = topology.getNode().values().stream()
             .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR))
-            .filter(node -> node.getName().values().stream().findFirst().get().getValue().equals("XPDR-A1-XPDR1+DSR"))
+            .filter(node -> node.getName().get(new NameKey("dsr/odu node name")).getValue()
+                .equals("XPDR-A1-XPDR1+XPONDER"))
             .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
                 .filter(nep -> nep.getName().containsKey(new NameKey("eNodeEdgePoint_N"))))
             .count();
-        assertEquals("XPDR-A1-XPDR1+DSR should only have two external network neps", 2, enb1);
+        assertEquals(2, enb1, "XPDR-A1-XPDR1+XPONDER should only have two external network neps");
         long nb2 = topology.getNode().values().stream()
             .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR))
-            .filter(node -> node.getName().values().stream().findFirst().get().getValue().equals("SPDR-SA1-XPDR1+DSR"))
+            .filter(node -> node.getName().get(new NameKey("dsr/odu node name")).getValue()
+                .equals("SPDR-SA1-XPDR1+XPONDER"))
             .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
                 .filter(nep -> nep.getName().containsKey(new NameKey("NodeEdgePoint_C"))))
             .count();
-        assertEquals("SPDR-SA1-XPDR1+DSR (mux) should have 4 client neps", 4, nb2);
+        assertEquals(4, nb2, "SPDR-SA1-XPDR1+XPONDER (mux) should have 4 client neps");
         long inb3 = topology.getNode().values().stream()
             .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR))
-            .filter(node -> node.getName().values().stream().findFirst().get().getValue().equals("SPDR-SA1-XPDR1+DSR"))
+            .filter(node -> node.getName().get(new NameKey("dsr/odu node name")).getValue()
+                .equals("SPDR-SA1-XPDR1+XPONDER"))
             .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
                 .filter(nep -> nep.getName().containsKey(new NameKey("iNodeEdgePoint_N"))))
             .count();
-        assertEquals("SPDR-SA1-XPDR1+DSR (mux) should have a single internal network nep", 1, inb3);
+        assertEquals(1, inb3, "SPDR-SA1-XPDR1+XPONDER (mux) should have a single internal network nep");
         long enb3 = topology.getNode().values().stream()
             .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR))
-            .filter(node -> node.getName().values().stream().findFirst().get().getValue().equals("SPDR-SA1-XPDR1+DSR"))
+            .filter(node -> node.getName().get(new NameKey("dsr/odu node name")).getValue()
+                .equals("SPDR-SA1-XPDR1+XPONDER"))
             .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
                 .filter(nep -> nep.getName().containsKey(new NameKey("eNodeEdgePoint_N"))))
             .count();
-        assertEquals("SPDR-SA1-XPDR1+DSR (mux) should have 4 external network nep", 4, enb3);
+        assertEquals(4, enb3, "SPDR-SA1-XPDR1+XPONDER (mux) should have 4 external network nep");
         long nb4 = topology.getNode().values().stream()
             .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR))
-            .filter(node -> node.getName().values().stream().findFirst().get().getValue().equals("SPDR-SA1-XPDR2+DSR"))
+            .filter(node -> node.getName().get(new NameKey("dsr/odu node name")).getValue()
+                .equals("SPDR-SA1-XPDR2+XPONDER"))
             .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
                 .filter(nep -> nep.getName().containsKey(new NameKey("NodeEdgePoint_C"))))
             .count();
-        assertEquals("SPDR-SA1-XPDR2+DSR (switch) should have 4 client neps", 4, nb4);
+        assertEquals(4, nb4, "SPDR-SA1-XPDR2+XPONDER (switch) should have 4 client neps");
         long inb5 = topology.getNode().values().stream()
             .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR))
-            .filter(node -> node.getName().values().stream().findFirst().get().getValue().equals("SPDR-SA1-XPDR2+DSR"))
+            .filter(node -> node.getName().get(new NameKey("dsr/odu node name")).getValue()
+                .equals("SPDR-SA1-XPDR2+XPONDER"))
             .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
                 .filter(nep -> nep.getName().containsKey(new NameKey("iNodeEdgePoint_N"))))
             .count();
-        assertEquals("SPDR-SA1-XPDR2+DSR (switch) should have 4 internal network neps", 4, inb5);
+        assertEquals(4, inb5, "SPDR-SA1-XPDR2+XPONDER (switch) should have 4 internal network neps");
         long enb5 = topology.getNode().values().stream()
             .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR))
-            .filter(node -> node.getName().values().stream().findFirst().get().getValue().equals("SPDR-SA1-XPDR2+DSR"))
+            .filter(node -> node.getName().get(new NameKey("dsr/odu node name")).getValue()
+                .equals("SPDR-SA1-XPDR1+XPONDER"))
             .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
                 .filter(nep -> nep.getName().containsKey(new NameKey("eNodeEdgePoint_N"))))
             .count();
-        assertEquals("SPDR-SA1-XPDR2+DSR (switch) should have 4 external network neps", 4, enb5);
+        assertEquals(4, enb5, "SPDR-SA1-XPDR2+XPONDER (switch) should have 4 external network neps");
 
-        // Now lets check for the Photonic media nodes (same nodes as for DSR + 1 Roadm node)
-        nb1 = topology.getNode().values().stream()
-            .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA))
-            .filter(node -> node.getName().values().stream().findFirst().get().getValue().equals("XPDR-A1-XPDR1+OTSi"))
-            .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
-                .filter(nep -> nep.getName().containsKey(new NameKey("iNodeEdgePoint"))))
-            .count();
-        // 2 client ports in configuration -> removed the checkTp so we have 2 NEPs
-        assertEquals("XPDR-A1-XPDR1+OTSi should only have two internal network neps", 2, nb1);
         inb1 = topology.getNode().values().stream()
-            .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA))
-            .filter(node -> node.getName().values().stream().findFirst().get().getValue().equals("XPDR-A1-XPDR1+OTSi"))
+            .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR))
+            .filter(node -> node.getName().get(new NameKey("dsr/odu node name")).getValue()
+                .equals("XPDR-A1-XPDR1+XPONDER"))
             .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
-                .filter(nep -> nep.getName().containsKey(new NameKey("eNodeEdgePoint"))))
+                .filter(nep -> nep.getName().containsKey(new NameKey("eNodeEdgePoint_N"))))
             .count();
-        assertEquals("XPDR-A1-XPDR1+OTSi should only have two external network neps", 2, inb1);
+        assertEquals(2, inb1, "XPDR-A1-XPDR1+XPONDER should only have two external network neps");
         enb1 = topology.getNode().values().stream()
-            .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA))
-            .filter(node -> node.getName().values().stream().findFirst().get().getValue().equals("XPDR-A1-XPDR1+OTSi"))
-            .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
-                .filter(nep -> nep.getName().containsKey(new NameKey("PhotMedNodeEdgePoint"))))
-            .count();
-        assertEquals("XPDR-A1-XPDR1+OTSi should only have two photonic network neps", 2, enb1);
-        nb2 = topology.getNode().values().stream()
-            .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA))
-            .filter(node -> node.getName().values().stream().findFirst().get().getValue().equals("SPDR-SA1-XPDR1+OTSi"))
+            .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR))
+            .filter(node -> node.getName().get(new NameKey("dsr/odu node name")).getValue()
+                .equals("XPDR-A1-XPDR1+XPONDER"))
             .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
-                .filter(nep -> nep.getName().containsKey(new NameKey("iNodeEdgePoint"))))
+                .filter(nep -> nep.getName().containsKey(new NameKey("iNodeEdgePoint_N"))))
             .count();
-        assertEquals("SPDR-SA1-XPDR1+OTSi (mux) should have a single internal network nep", 1, nb2);
+        assertEquals(2, enb1, "XPDR-A1-XPDR1+XPONDER should only have two photonic network neps");
         inb3 = topology.getNode().values().stream()
-            .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA))
-            .filter(node -> node.getName().values().stream().findFirst().get().getValue().equals("SPDR-SA1-XPDR1+OTSi"))
+            .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR))
+            .filter(node -> node.getName().get(new NameKey("dsr/odu node name")).getValue()
+                .equals("SPDR-SA1-XPDR1+XPONDER"))
             .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
                 .filter(nep -> nep.getName().containsKey(new NameKey("eNodeEdgePoint"))))
             .count();
-        assertEquals("SPDR-SA1-XPDR1+OTSi (mux) should have a single external network nep", 1, inb3);
-        enb3 = topology.getNode().values().stream()
-            .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA))
-            .filter(node -> node.getName().values().stream().findFirst().get().getValue().equals("SPDR-SA1-XPDR1+OTSi"))
-            .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
-                .filter(nep -> nep.getName().containsKey(new NameKey("PhotMedNodeEdgePoint"))))
-            .count();
-        assertEquals("SPDR-SA1-XPDR1+OTSi (mux) should have a single photonic network nep", 1, enb3);
-        nb4 = topology.getNode().values().stream()
-            .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA))
-            .filter(node -> node.getName().values().stream().findFirst().get().getValue().equals("SPDR-SA1-XPDR2+OTSi"))
-            .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
-                .filter(nep -> nep.getName().containsKey(new NameKey("iNodeEdgePoint"))))
-            .count();
-        assertEquals("SPDR-SA1-XPDR2+OTSi (switch) should have 4 internal network neps", 4, nb4);
+        assertEquals(1, inb3, "SPDR-SA1-XPDR1+XPONDER (mux) should have a single external network nep");
         inb5 = topology.getNode().values().stream()
-            .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA))
-            .filter(node -> node.getName().values().stream().findFirst().get().getValue().equals("SPDR-SA1-XPDR2+OTSi"))
+            .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.DSR))
+            .filter(node -> node.getName().get(new NameKey("dsr/odu node name")).getValue()
+                .equals("SPDR-SA1-XPDR2+XPONDER"))
             .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
                 .filter(nep -> nep.getName().containsKey(new NameKey("eNodeEdgePoint"))))
             .count();
-        assertEquals("SPDR-SA1-XPDR2+OTSi (switch) should have 4 external network neps", 4, inb5);
-        enb5 = topology.getNode().values().stream()
-            .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA))
-            .filter(node -> node.getName().values().stream().findFirst().get().getValue().equals("SPDR-SA1-XPDR2+OTSi"))
-            .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
-                .filter(nep -> nep.getName().containsKey(new NameKey("PhotMedNodeEdgePoint"))))
-            .count();
-        assertEquals("SPDR-SA1-XPDR2+OTSi (switch) should have 4 photonic network neps", 4, enb5);
-        // We should have 3 neps per DEGREE-TTP port and 3 neps per SRG-PP port
+        assertEquals(4, inb5, "SPDR-SA1-XPDR2+XPONDER (switch) should have 4 external network neps");
         long inb6 = topology.getNode().values().stream()
-            .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA))
-            .filter(node -> node.getName().values().stream().findFirst().get().getValue().equals(
-                "ROADM-A1+PHOTONIC_MEDIA"))
+            .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA)
+                && !node.getLayerProtocolName().contains(LayerProtocolName.DSR))
+            .filter(node -> node.getName().get(new NameKey("roadm node name")).getValue()
+                .equals("ROADM-A1+PHOTONIC_MEDIA"))
             .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
-                .filter(nep -> nep.getName().values().stream().findFirst().get().getValue().contains("DEG")))
+                .filter(nep -> nep.getName().values().stream().findAny().orElseThrow().getValue().contains("DEG")))
             .count();
-        assertEquals("ROADM-A1+PHOTONIC_MEDIA (DEGREE) should have 6 network neps", 6, inb6);
+        assertEquals(4, inb6, "ROADM-A1+PHOTONIC_MEDIA (DEGREE) should have 4 network neps");
         long enb6 = topology.getNode().values().stream()
-            .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA))
-            .filter(node -> node.getName().values().stream().findFirst().get().getValue().equals(
-                "ROADM-A1+PHOTONIC_MEDIA"))
+            .filter(node -> node.getLayerProtocolName().contains(LayerProtocolName.PHOTONICMEDIA)
+                && !node.getLayerProtocolName().contains(LayerProtocolName.DSR))
+            .filter(node -> node.getName().get(new NameKey("roadm node name")).getValue()
+                .equals("ROADM-A1+PHOTONIC_MEDIA"))
             .flatMap(node -> node.getOwnedNodeEdgePoint().values().stream()
-                .filter(nep -> nep.getName().values().stream().findFirst().get().getValue().contains("SRG")))
+                .filter(nep -> nep.getName().values().stream().findAny().orElseThrow().getValue().contains("SRG")))
             .count();
-        assertEquals("ROADM-A1+PHOTONIC_MEDIA (SRG) should have 24 network neps", 24, enb6);
+        assertEquals(8, enb6, "ROADM-A1+PHOTONIC_MEDIA (SRG) should have 8 network neps (OTS)");
 
         // Links in openroadm topology which include Roadm-to-Roadm and Xpdr-to-Roadm (ortopo / 2)
-        // + transitional links -> 1 per network port of Xpdr + OTN links / 2
-        assertEquals("Link list size should be 25", 25, topology.getLink().size());
+        // + transitional links -> 0 per network port of Xpdr + OTN links / 2
+        List<String> linkList = new ArrayList<>();
+        for (Map.Entry<LinkKey, Link> entry : topology.getLink().entrySet()) {
+            linkList.add(entry.getValue().getName().entrySet().iterator().next().getValue().toString());
+        }
+        assertEquals(9, topology.getLink().size(), "Link list size should be 8 XPDR To SRG and 1 DEG2A-DEG1C");
         Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes("T0 - Full Multi-layer topology".getBytes()).toString());
-        assertEquals("incorrect topology uuid", topoUuid, topology.getUuid());
-        assertEquals("topology name should be T0 - Full Multi-layer topology",
+        assertEquals(topoUuid, topology.getUuid(), "incorrect topology uuid");
+        assertEquals(
             "T0 - Full Multi-layer topology",
-            topology.nonnullName().values().stream().findFirst().get().getValue());
+            topology.nonnullName().values().stream().findFirst().orElseThrow().getValue(),
+            "topology name should be T0 - Full Multi-layer topology");
 
         long nbDsrOduNodes = topology.nonnullNode().values().stream()
             .filter(n -> n.getName().containsKey(new NameKey("dsr/odu node name"))).count();
         long nbPhotonicNodes = topology.nonnullNode().values().stream()
             .filter(n -> n.getName().containsKey(new NameKey("otsi node name"))).count();
         // In DSR/ODU we create one node per Xpdr (no filtering out)
-        assertEquals("Node list should contain 8 DSR-ODU nodes", 8, nbDsrOduNodes);
+        assertEquals(8, nbDsrOduNodes, "Node list should contain 8 DSR-ODU nodes");
         // We need to add the Roadms as Photonic nodes. Instead of 1 node as roadm infra we have 2 roadm nodes
-        assertEquals("Node list should contain 8 Photonics nodes", 8, nbPhotonicNodes);
-        long nbTransititionalLinks = topology.getLink().values().stream()
-            .filter(l -> l.getName().containsKey(new NameKey("transitional link name"))).count();
+        assertEquals(8, nbPhotonicNodes, "Node list should contain 8 Photonics nodes");
         // Roadm-to-Roadm
         long nbOmsLinks = topology.getLink().values().stream()
             .filter(l -> l.getName().containsKey(new NameKey("OMS link name"))).count();
         // Xpdr-to-Roadm
         long nbOmsLinks1 = topology.getLink().values().stream()
             .filter(l -> l.getName().containsKey(new NameKey("XPDR-RDM link name"))).count();
-        // 1 transitional link per NETWORK port
-        assertEquals("Link list should contain 16 transitional links", 16, nbTransititionalLinks);
         // 1 OMS per ROADM-to-ROADM link + Existing XPDR-tp-ROADM link in openroadm topology
-        assertEquals("Link list should contain 9 OMS links", 9, nbOmsLinks + nbOmsLinks1);
+        assertEquals(9, nbOmsLinks + nbOmsLinks1, "Link list should contain 9 OMS links");
     }
 
     @Test
-    public void getNodeAndNepsDetailsWhenSuccessful()
-            throws ExecutionException, InterruptedException {
-        GetTopologyDetailsInput input = TapiTopologyDataUtils.buildGetTopologyDetailsInput(
-            TapiStringConstants.T0_FULL_MULTILAYER);
-        TapiTopologyImpl tapiTopoImpl = new TapiTopologyImpl(getDataBroker(), tapiContext, topologyUtils, tapiLink);
-        ListenableFuture<RpcResult<GetTopologyDetailsOutput>> result = tapiTopoImpl.getTopologyDetails(input);
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-        endSignal.await();
+    void getNodeAndNepsDetailsWhenSuccessful() throws ExecutionException, InterruptedException {
+        Uuid topologyUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER.getBytes(
+            Charset.forName("UTF-8"))).toString());
+        GetTopologyDetailsInput input = TapiTopologyDataUtils.buildGetTopologyDetailsInput(topologyUuid);
+        ListenableFuture<RpcResult<GetTopologyDetailsOutput>> result = new GetTopologyDetailsImpl(tapiContext,
+                    topologyUtils, tapiLink, networkTransactionService)
+                .invoke(input);
         RpcResult<GetTopologyDetailsOutput> rpcResult = result.get();
         @Nullable
         Topology topology = rpcResult.getResult().getTopology();
         for (Node node:topology.getNode().values()) {
-            String nodeName = node.getName().values().stream().findFirst().get().getValue();
-            GetNodeDetailsInput input1 = TapiTopologyDataUtils.buildGetNodeDetailsInput(
-                TapiStringConstants.T0_FULL_MULTILAYER, nodeName);
-            ListenableFuture<RpcResult<GetNodeDetailsOutput>> result1 = tapiTopoImpl.getNodeDetails(input1);
-            result.addListener(new Runnable() {
-                @Override
-                public void run() {
-                    endSignal.countDown();
-                }
-            }, executorService);
-            endSignal.await();
+            Uuid nodeUuid = node.getUuid();
+            GetNodeDetailsInput input1 = TapiTopologyDataUtils.buildGetNodeDetailsInput(topologyUuid, nodeUuid);
+            ListenableFuture<RpcResult<GetNodeDetailsOutput>> result1 = new GetNodeDetailsImpl(tapiContext)
+                    .invoke(input1);
             RpcResult<GetNodeDetailsOutput> rpcResult1 = result1.get();
             @Nullable
             Node node1 = rpcResult1.getResult().getNode();
-            assertNotNull("Node should not be null", node1);
+            assertNotNull(node1, "Node should not be null");
             for (OwnedNodeEdgePoint onep:node1.getOwnedNodeEdgePoint().values()) {
-                String onepName = onep.getName().values().stream().findFirst().get().getValue();
+                Uuid onepUuid = onep.getUuid();
                 GetNodeEdgePointDetailsInput input2 = TapiTopologyDataUtils.buildGetNodeEdgePointDetailsInput(
-                    TapiStringConstants.T0_FULL_MULTILAYER, nodeName, onepName);
-                ListenableFuture<RpcResult<GetNodeEdgePointDetailsOutput>> result2
-                    = tapiTopoImpl.getNodeEdgePointDetails(input2);
-                result.addListener(new Runnable() {
-                    @Override
-                    public void run() {
-                        endSignal.countDown();
-                    }
-                }, executorService);
-                endSignal.await();
+                    topologyUuid, nodeUuid, onepUuid);
+                ListenableFuture<RpcResult<GetNodeEdgePointDetailsOutput>> result2 =
+                        new GetNodeEdgePointDetailsImpl(tapiContext).invoke(input2);
                 RpcResult<GetNodeEdgePointDetailsOutput> rpcResult2 = result2.get();
                 org.opendaylight.yang.gen.v1
-                    .urn.onf.otcc.yang.tapi.topology.rev181210.get.node.edge.point.details.output.NodeEdgePoint
+                    .urn.onf.otcc.yang.tapi.topology.rev221121.get.node.edge.point.details.output.NodeEdgePoint
                     onep1 = rpcResult2.getResult().getNodeEdgePoint();
-                assertNotNull("Node Edge Point should not be null", onep1);
+                assertNotNull(onep1, "Node Edge Point should not be null");
             }
         }
     }
 
     @Test
-    public void getLinkDetailsWhenSuccessful()
-            throws ExecutionException, InterruptedException {
-        GetTopologyDetailsInput input = TapiTopologyDataUtils.buildGetTopologyDetailsInput(
-            TapiStringConstants.T0_FULL_MULTILAYER);
-        TapiTopologyImpl tapiTopoImpl = new TapiTopologyImpl(getDataBroker(), tapiContext, topologyUtils, tapiLink);
-        ListenableFuture<RpcResult<GetTopologyDetailsOutput>> result = tapiTopoImpl.getTopologyDetails(input);
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-        endSignal.await();
+    void getLinkDetailsWhenSuccessful() throws ExecutionException, InterruptedException {
+        Uuid topologyUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER.getBytes(
+            Charset.forName("UTF-8"))).toString());
+        GetTopologyDetailsInput input = TapiTopologyDataUtils.buildGetTopologyDetailsInput(topologyUuid);
+        ListenableFuture<RpcResult<GetTopologyDetailsOutput>> result = new GetTopologyDetailsImpl(tapiContext,
+                topologyUtils, tapiLink, networkTransactionService)
+            .invoke(input);
         RpcResult<GetTopologyDetailsOutput> rpcResult = result.get();
         @Nullable
         Topology topology = rpcResult.getResult().getTopology();
         for (Link link:topology.getLink().values()) {
-            String linkName = link.getName().values().stream().findFirst().get().getValue();
+            Uuid linkUuid = link.getUuid();
             GetLinkDetailsInput input1 = TapiTopologyDataUtils.buildGetLinkDetailsInput(
-                TapiStringConstants.T0_FULL_MULTILAYER, linkName);
-            ListenableFuture<RpcResult<GetLinkDetailsOutput>> result1 = tapiTopoImpl.getLinkDetails(input1);
-            result.addListener(new Runnable() {
-                @Override
-                public void run() {
-                    endSignal.countDown();
-                }
-            }, executorService);
-            endSignal.await();
+                topologyUuid, linkUuid);
+            ListenableFuture<RpcResult<GetLinkDetailsOutput>> result1 = new GetLinkDetailsImpl(tapiContext)
+                    .invoke(input1);
             RpcResult<GetLinkDetailsOutput> rpcResult1 = result1.get();
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.get.link.details.output.Link link1
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.get.link.details.output.Link link1
                 = rpcResult1.getResult().getLink();
-            assertNotNull("Link should not be null", link1);
+            assertNotNull(link1, "Link should not be null");
         }
     }
 
     @Test
-    public void getSipDetailsWhenSuccessful()
-            throws ExecutionException, InterruptedException {
+    void getSipDetailsWhenSuccessful() throws ExecutionException, InterruptedException {
         GetServiceInterfacePointListInput input = TapiTopologyDataUtils.buildServiceInterfacePointListInput();
-        TapiTopologyImpl tapiTopoImpl = new TapiTopologyImpl(getDataBroker(), tapiContext, topologyUtils, tapiLink);
-        ListenableFuture<RpcResult<GetServiceInterfacePointListOutput>> result = tapiTopoImpl
-            .getServiceInterfacePointList(input);
-        result.addListener(new Runnable() {
-            @Override
-            public void run() {
-                endSignal.countDown();
-            }
-        }, executorService);
-        endSignal.await();
+        ListenableFuture<RpcResult<GetServiceInterfacePointListOutput>> result =
+                new GetServiceInterfacePointListImpl(tapiContext).invoke(input);
         RpcResult<GetServiceInterfacePointListOutput> rpcResult = result.get();
         Map<SipKey, Sip> sipMap = rpcResult.getResult().getSip();
         for (Sip sip:sipMap.values()) {
             Uuid sipUuid = sip.getUuid();
             GetServiceInterfacePointDetailsInput input1 = TapiTopologyDataUtils
                 .buildGetServiceInterfacePointDetailsInput(sipUuid);
-            ListenableFuture<RpcResult<GetServiceInterfacePointDetailsOutput>> result1
-                = tapiTopoImpl.getServiceInterfacePointDetails(input1);
-            result.addListener(new Runnable() {
-                @Override
-                public void run() {
-                    endSignal.countDown();
-                }
-            }, executorService);
-            endSignal.await();
+            ListenableFuture<RpcResult<GetServiceInterfacePointDetailsOutput>> result1 =
+                    new GetServiceInterfacePointDetailsImpl(tapiContext).invoke(input1);
             RpcResult<GetServiceInterfacePointDetailsOutput> rpcResult1 = result1.get();
             org.opendaylight.yang.gen.v1
-                .urn.onf.otcc.yang.tapi.common.rev181210.get.service._interface.point.details.output.Sip sip1
+                .urn.onf.otcc.yang.tapi.common.rev221121.get.service._interface.point.details.output.Sip sip1
                 = rpcResult1.getResult().getSip();
-            assertNotNull("Sip should not be null", sip1);
+            assertNotNull(sip1, "Sip should not be null");
         }
     }
 
     private void checkOtnLink(Link link, Uuid topoUuid, Uuid node1Uuid, Uuid node2Uuid, Uuid tp1Uuid, Uuid tp2Uuid,
             Uuid linkUuid, String linkName) {
-        assertEquals("bad name for the link", linkName, link.getName().get(new NameKey("otn link name")).getValue());
-        assertEquals("bad uuid for link", linkUuid, link.getUuid());
-        assertEquals("Available capacity unit should be MBPS",
-            CapacityUnit.GBPS, link.getAvailableCapacity().getTotalSize().getUnit());
+        assertEquals(linkName, link.getName().get(new NameKey("otn link name")).getValue(), "bad name for the link");
+        assertEquals(linkUuid, link.getUuid(), "bad uuid for link");
+        assertEquals(CAPACITYUNITGBPS.VALUE, link.getAvailableCapacity().getTotalSize().getUnit(),
+            "Available capacity unit should be MBPS");
         String prefix = linkName.split("-")[0];
         if ("OTU4".equals(prefix)) {
-            assertEquals("Available capacity -total size value should be 0",
-                Uint64.valueOf(0), link.getAvailableCapacity().getTotalSize().getValue());
+            assertEquals(Uint64.valueOf(0), link.getAvailableCapacity().getTotalSize().getValue(),
+                "Available capacity -total size value should be 0");
         } else if ("ODTU4".equals(prefix)) {
-            assertEquals("Available capacity -total size value should be 100 000",
-                Uint64.valueOf(100000), link.getAvailableCapacity().getTotalSize().getValue());
+            assertEquals(Uint64.valueOf(100000), link.getAvailableCapacity().getTotalSize().getValue(),
+                "Available capacity -total size value should be 100 000");
         }
-        assertEquals("Total capacity unit should be GBPS",
-            CapacityUnit.GBPS, link.getTotalPotentialCapacity().getTotalSize().getUnit());
-        assertEquals("Total capacity -total size value should be 100",
-            Uint64.valueOf(100), link.getTotalPotentialCapacity().getTotalSize().getValue());
+        assertEquals(CAPACITYUNITGBPS.VALUE, link.getTotalPotentialCapacity().getTotalSize().getUnit(),
+            "Total capacity unit should be GBPS");
+        assertEquals(Decimal64.valueOf("100"), link.getTotalPotentialCapacity().getTotalSize().getValue(),
+            "Total capacity -total size value should be 100");
         if ("OTU4".equals(prefix)) {
             assertEquals("otn link should be between 2 nodes of protocol layers PHOTONIC_MEDIA",
-                LayerProtocolName.PHOTONICMEDIA.getName(), link.getLayerProtocolName().get(0).getName());
+                LayerProtocolName.PHOTONICMEDIA.getName(),
+                link.getLayerProtocolName().stream().findFirst().orElseThrow().getName());
         } else if ("ODTU4".equals(prefix)) {
             assertEquals("otn link should be between 2 nodes of protocol layers ODU",
-                LayerProtocolName.ODU.getName(), link.getLayerProtocolName().get(0).getName());
+                LayerProtocolName.ODU.getName(),
+                link.getLayerProtocolName().stream().findFirst().orElseThrow().getName());
         }
-        assertEquals("transitional link should be BIDIRECTIONAL",
-            ForwardingDirection.BIDIRECTIONAL, link.getDirection());
-        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210
+        assertEquals(ForwardingDirection.BIDIRECTIONAL, link.getDirection(),
+            "transitional link should be BIDIRECTIONAL");
+        List<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121
             .link.NodeEdgePoint> nodeEdgePointList = new ArrayList<>(link.nonnullNodeEdgePoint().values());
-        assertEquals("topology uuid should be the same for the two termination point of the link",
-            topoUuid, nodeEdgePointList.get(0).getTopologyUuid());
-        assertEquals("topology uuid should be the same for the two termination point of the link",
-            topoUuid, nodeEdgePointList.get(1).getTopologyUuid());
+        assertEquals(topoUuid, nodeEdgePointList.get(0).getTopologyUuid(),
+            "topology uuid should be the same for the two termination point of the link");
+        assertEquals(topoUuid, nodeEdgePointList.get(1).getTopologyUuid(),
+            "topology uuid should be the same for the two termination point of the link");
         assertThat("otn links should terminate on two distinct nodes",
             nodeEdgePointList.get(0).getNodeUuid().getValue(),
             either(containsString(node1Uuid.getValue())).or(containsString(node2Uuid.getValue())));
@@ -653,9 +630,8 @@ public class TapiTopologyImplTest extends AbstractTest {
         assertThat("otn links should terminate on two distinct tps",
             nodeEdgePointList.get(1).getNodeEdgePointUuid().getValue(),
             either(containsString(tp1Uuid.getValue())).or(containsString(tp2Uuid.getValue())));
-        assertEquals("operational state should be ENABLED",
-            OperationalState.ENABLED, link.getOperationalState());
-        assertEquals("administrative state should be UNLOCKED",
-            AdministrativeState.UNLOCKED, link.getAdministrativeState());
+        assertEquals(OperationalState.ENABLED, link.getOperationalState(), "operational state should be ENABLED");
+        assertEquals(AdministrativeState.UNLOCKED, link.getAdministrativeState(),
+            "administrative state should be UNLOCKED");
     }
-}
+}
\ No newline at end of file
index a5277619b2422502ac349c2969f5cace608f6da8..bb3b4774dd81e0eb0fb80d4cff722ff3548f7e24 100644 (file)
@@ -12,54 +12,58 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ConnectionType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.RpcActions;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.sdnc.request.header.SdncRequestHeaderBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.RxDirection;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.RxDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.RxDirectionKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.TxDirection;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.TxDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.TxDirectionKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.lgx.LgxBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.port.PortBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.ConnectionType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.RpcActions;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.sdnc.request.header.SdncRequestHeaderBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.RxDirection;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.RxDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.RxDirectionKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.TxDirection;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.TxDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.endpoint.TxDirectionKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.lgx.LgxBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev230526.service.port.PortBuilder;
 import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input.ServiceAEndBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input.ServiceZEndBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.AdministrativeState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.CapacityUnit;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.ForwardingDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LayerProtocolName;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.LifecycleState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.OperationalState;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortDirection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.PortRole;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.capacity.TotalSizeBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.local._class.Name;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.local._class.NameBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.CreateConnectivityServiceInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.CreateConnectivityServiceInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.DeleteConnectivityServiceInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.DeleteConnectivityServiceInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.ProtectionRole;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.ServiceType;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.constraint.RequestedCapacityBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityService;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityServiceBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectivityServiceKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.Connection;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.ConnectionBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.ConnectionKey;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.end.point.ServiceInterfacePointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.input.ConnectivityConstraintBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.input.EndPoint;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.input.EndPointBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.input.EndPointKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.ServiceCreateInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.create.input.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev230526.service.create.input.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.AdministrativeState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.CAPACITYUNITGBPS;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Direction;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.ForwardingDirection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LayerProtocolName;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.LifecycleState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.OperationalState;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.PortRole;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.capacity.TotalSizeBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.local._class.Name;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.local._class.NameBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CreateConnectivityServiceInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.CreateConnectivityServiceInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.DeleteConnectivityServiceInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.DeleteConnectivityServiceInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.ProtectionRole;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.ServiceType;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.constraint.RequestedCapacityBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityService;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.context.ConnectivityServiceKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.Connection;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.ConnectionBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.ConnectionKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.ConnectivityConstraint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.ConnectivityConstraintBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.end.point.ServiceInterfacePointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.create.connectivity.service.input.EndPoint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.create.connectivity.service.input.EndPointBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.create.connectivity.service.input.EndPointKey;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.create.connectivity.service.input.TopologyConstraint;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.create.connectivity.service.input.TopologyConstraintBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.create.connectivity.service.input.TopologyConstraintKey;
+import org.opendaylight.yangtools.yang.common.Decimal64;
 import org.opendaylight.yangtools.yang.common.Uint32;
-import org.opendaylight.yangtools.yang.common.Uint64;
 import org.opendaylight.yangtools.yang.common.Uint8;
 
 public final class TapiConnectivityDataUtils {
@@ -73,18 +77,21 @@ public final class TapiConnectivityDataUtils {
 
         return new CreateConnectivityServiceInputBuilder()
             .setEndPoint(endPointMap)
-            .setConnectivityConstraint(new ConnectivityConstraintBuilder().setServiceLayer(LayerProtocolName.DSR)
-                .setServiceType(ServiceType.POINTTOPOINTCONNECTIVITY).setServiceLevel("some service-level")
-                .setRequestedCapacity(new RequestedCapacityBuilder()
-                    .setTotalSize(new TotalSizeBuilder().setUnit(CapacityUnit.GBPS)
-                        .setValue(Uint64.valueOf(10)).build()).build()).build())
-            .setState("some state")
+            .setLayerProtocolName(LayerProtocolName.DSR)
+            .setConnectivityConstraint(new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121
+                        .create.connectivity.service.input.ConnectivityConstraintBuilder()
+                    .setServiceType(ServiceType.POINTTOPOINTCONNECTIVITY).setServiceLevel("some service-level")
+                    .setRequestedCapacity(new RequestedCapacityBuilder()
+                    .setTotalSize(new TotalSizeBuilder().setUnit(CAPACITYUNITGBPS.VALUE)
+                        .setValue(Decimal64.valueOf("10")).build()).build()).build())
+            .setState(AdministrativeState.UNLOCKED)
+            .setTopologyConstraint(getTopoConstraintMap())
             .build();
     }
 
     public static DeleteConnectivityServiceInput buildConnServiceDeleteInput() {
         return new DeleteConnectivityServiceInputBuilder()
-            .setServiceIdOrName(UUID.nameUUIDFromBytes("service 1".getBytes(StandardCharsets.UTF_8)).toString())
+            .setUuid(new Uuid(UUID.nameUUIDFromBytes("service 1".getBytes(StandardCharsets.UTF_8)).toString()))
             .build();
     }
 
@@ -93,7 +100,7 @@ public final class TapiConnectivityDataUtils {
         return new EndPointBuilder().setLayerProtocolName(LayerProtocolName.DSR)
             .setAdministrativeState(AdministrativeState.UNLOCKED)
             .setOperationalState(OperationalState.ENABLED)
-            .setDirection(PortDirection.BIDIRECTIONAL)
+            .setDirection(Direction.BIDIRECTIONAL)
             .setRole(PortRole.SYMMETRIC)
             .setProtectionRole(ProtectionRole.NA)
             .setLocalId("SPDR-SC1-XPDR1")
@@ -107,7 +114,7 @@ public final class TapiConnectivityDataUtils {
         return new EndPointBuilder().setLayerProtocolName(LayerProtocolName.DSR)
             .setAdministrativeState(AdministrativeState.UNLOCKED)
             .setOperationalState(OperationalState.ENABLED)
-            .setDirection(PortDirection.BIDIRECTIONAL)
+            .setDirection(Direction.BIDIRECTIONAL)
             .setRole(PortRole.SYMMETRIC)
             .setProtectionRole(ProtectionRole.NA)
             .setLocalId("SPDR-SA1-XPDR1")
@@ -117,7 +124,6 @@ public final class TapiConnectivityDataUtils {
     }
 
     public static ServiceCreateInput buildServiceCreateInput() {
-
         return new ServiceCreateInputBuilder()
             .setCommonId("commonId")
             .setConnectionType(ConnectionType.Service)
@@ -169,20 +175,28 @@ public final class TapiConnectivityDataUtils {
             .build());
     }
 
+    private static Map<TopologyConstraintKey, TopologyConstraint> getTopoConstraintMap() {
+        Map<TopologyConstraintKey, TopologyConstraint> topoConstraintMap = new HashMap<>();
+        TopologyConstraint topoConstraint = new TopologyConstraintBuilder()
+            .setLocalId("localIdTopoConstraint").build();
+        topoConstraintMap.put(topoConstraint.key(), topoConstraint);
+        return topoConstraintMap;
+    }
+
     public static Map<ConnectivityServiceKey, ConnectivityService> createConnService() {
         EndPoint endPoint1 = getEndPoint1Builder().build();
         EndPoint endPoint2 = getEndPoint2Builder().build();
 
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.EndPoint
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPoint
             endPoint11 = new org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.EndPointBuilder(endPoint1).build();
+                .onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPointBuilder(endPoint1).build();
 
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.EndPoint
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPoint
             endPoint12 = new org.opendaylight.yang.gen.v1.urn
-                .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.EndPointBuilder(endPoint2).build();
+                .onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPointBuilder(endPoint2).build();
 
-        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.EndPointKey,
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.service.EndPoint>
+        Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPointKey,
+            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev221121.connectivity.service.EndPoint>
                 endPointMap = new HashMap<>();
         endPointMap.put(endPoint11.key(), endPoint11);
         endPointMap.put(endPoint12.key(), endPoint12);
@@ -192,18 +206,22 @@ public final class TapiConnectivityDataUtils {
             .build();
         connectionMap.put(connection.key(), connection);
 
-        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.Name name =
-            new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.global._class.NameBuilder()
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.Name name =
+            new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.global._class.NameBuilder()
                 .setValueName("Connectivity Service Name").setValue("service 1")
                 .build();
+        ConnectivityConstraint conCons = new ConnectivityConstraintBuilder()
+            .setServiceLevel(null)
+            .setServiceType(ServiceType.POINTTOPOINTCONNECTIVITY)
+            .build();
         ConnectivityService connServ = new ConnectivityServiceBuilder()
             .setAdministrativeState(AdministrativeState.LOCKED)
             .setOperationalState(OperationalState.DISABLED)
             .setLifecycleState(LifecycleState.PLANNED)
             .setUuid(new Uuid(UUID.nameUUIDFromBytes("service 1".getBytes(StandardCharsets.UTF_8)).toString()))
-            .setServiceLayer(LayerProtocolName.DSR)
-            .setServiceType(ServiceType.POINTTOPOINTCONNECTIVITY)
-            .setConnectivityDirection(ForwardingDirection.BIDIRECTIONAL)
+            .setLayerProtocolName(LayerProtocolName.DSR)
+            .setConnectivityConstraint(conCons)
+            .setDirection(ForwardingDirection.BIDIRECTIONAL)
             .setName(Map.of(name.key(), name))
             .setConnection(connectionMap)
             .setEndPoint(endPointMap)
@@ -215,7 +233,8 @@ public final class TapiConnectivityDataUtils {
 
     public static DeleteConnectivityServiceInput buildConnServiceDeleteInput1() {
         return new DeleteConnectivityServiceInputBuilder()
-            .setServiceIdOrName("random-service").build();
+            .setUuid(new Uuid(UUID.nameUUIDFromBytes("service 1".getBytes(StandardCharsets.UTF_8)).toString()))
+            .build();
     }
 
     private TapiConnectivityDataUtils() {
index 32cbbf19ed9acf8bcda4db2331f854b94fa0bef3..bfc61279fb199b47c6e17435a81cde377b68110c 100644 (file)
@@ -8,19 +8,19 @@
 
 package org.opendaylight.transportpce.tapi.utils;
 
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.GetServiceInterfacePointDetailsInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.GetServiceInterfacePointDetailsInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.GetServiceInterfacePointListInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.GetServiceInterfacePointListInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.Uuid;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetLinkDetailsInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetLinkDetailsInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetNodeDetailsInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetNodeDetailsInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetNodeEdgePointDetailsInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetNodeEdgePointDetailsInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetTopologyDetailsInput;
-import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.GetTopologyDetailsInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.GetServiceInterfacePointDetailsInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.GetServiceInterfacePointDetailsInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.GetServiceInterfacePointListInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.GetServiceInterfacePointListInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev221121.Uuid;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetLinkDetailsInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetLinkDetailsInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetNodeDetailsInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetNodeDetailsInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetNodeEdgePointDetailsInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetNodeEdgePointDetailsInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetTopologyDetailsInput;
+import org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev221121.GetTopologyDetailsInputBuilder;
 
 public final class TapiTopologyDataUtils {
     public static final String OPENROADM_TOPOLOGY_FILE = "src/test/resources/openroadm-topology.xml";
@@ -28,45 +28,46 @@ public final class TapiTopologyDataUtils {
     public static final String OTN_TOPOLOGY_FILE = "src/test/resources/otn-topology.xml";
     public static final String PORTMAPPING_FILE = "src/test/resources/portmapping.xml";
 
-    public static GetTopologyDetailsInput buildGetTopologyDetailsInput(String topoName) {
-        GetTopologyDetailsInputBuilder builtInput = new GetTopologyDetailsInputBuilder();
-        builtInput.setTopologyIdOrName(topoName);
-        return builtInput.build();
+    public static GetTopologyDetailsInput buildGetTopologyDetailsInput(Uuid topoId) {
+        return new GetTopologyDetailsInputBuilder()
+            .setTopologyId(topoId)
+            .build();
     }
 
-    public static GetNodeDetailsInput buildGetNodeDetailsInput(String topoName, String nodeName) {
-        GetNodeDetailsInputBuilder builtInput = new GetNodeDetailsInputBuilder();
-        builtInput.setTopologyIdOrName(topoName);
-        builtInput.setNodeIdOrName(nodeName);
-        return builtInput.build();
+    public static GetNodeDetailsInput buildGetNodeDetailsInput(Uuid topoId, Uuid nodeId) {
+        return new GetNodeDetailsInputBuilder()
+            .setTopologyId(topoId)
+            .setNodeId(nodeId)
+            .build();
     }
 
-    public static GetLinkDetailsInput buildGetLinkDetailsInput(String topoName, String linkName) {
-        GetLinkDetailsInputBuilder builtInput = new GetLinkDetailsInputBuilder();
-        builtInput.setTopologyIdOrName(topoName);
-        builtInput.setLinkIdOrName(linkName);
-        return builtInput.build();
+    public static GetLinkDetailsInput buildGetLinkDetailsInput(Uuid topoId, Uuid linkId) {
+        return new GetLinkDetailsInputBuilder()
+            .setTopologyId(topoId)
+            .setLinkId(linkId)
+            .build();
     }
 
     public static GetServiceInterfacePointListInput buildServiceInterfacePointListInput() {
-        return new GetServiceInterfacePointListInputBuilder().build();
+        return new GetServiceInterfacePointListInputBuilder()
+            .build();
     }
 
     public static GetServiceInterfacePointDetailsInput buildGetServiceInterfacePointDetailsInput(Uuid sipUuid) {
-        GetServiceInterfacePointDetailsInputBuilder builtInput = new GetServiceInterfacePointDetailsInputBuilder();
-        builtInput.setSipIdOrName(sipUuid.getValue());
-        return builtInput.build();
+        return new GetServiceInterfacePointDetailsInputBuilder()
+            .setUuid(sipUuid)
+            .build();
     }
 
-    public static GetNodeEdgePointDetailsInput buildGetNodeEdgePointDetailsInput(String topoName,
-                                                                                 String nodeName, String onepName) {
-        GetNodeEdgePointDetailsInputBuilder builtInput = new GetNodeEdgePointDetailsInputBuilder();
-        builtInput.setTopologyIdOrName(topoName);
-        builtInput.setNodeIdOrName(nodeName);
-        builtInput.setEpIdOrName(onepName);
-        return builtInput.build();
+    public static GetNodeEdgePointDetailsInput buildGetNodeEdgePointDetailsInput(Uuid topoId, Uuid nodeId,
+            Uuid onepId) {
+        return new GetNodeEdgePointDetailsInputBuilder()
+            .setTopologyId(topoId)
+            .setNodeId(nodeId)
+            .setNodeEdgePointId(onepId)
+            .build();
     }
 
     private TapiTopologyDataUtils() {
     }
-}
+}
\ No newline at end of file
index 54068af2237707aac4b5473baa929ccc3be29cc7..f0da0c7fb5d366dffa727bf68c48b05d18432cf5 100644 (file)
     <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
     <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
       <tp-id>XPDR1-CLIENT1</tp-id>
-      <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-NETWORK1</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-NETWORK1</associated-connection-map-tp>
       <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
       <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
       <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
     </termination-point>
     <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
       <tp-id>XPDR1-CLIENT2</tp-id>
-      <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-NETWORK2</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-NETWORK2</associated-connection-map-tp>
       <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
       <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
       <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
     </termination-point>
     <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
       <tp-id>XPDR1-NETWORK2</tp-id>
-      <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-CLIENT2</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-CLIENT2</associated-connection-map-tp>
       <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
       <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
       <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
     </termination-point>
     <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
       <tp-id>XPDR1-NETWORK1</tp-id>
-      <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-CLIENT1</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-CLIENT1</associated-connection-map-tp>
       <xpdr-network-attributes xmlns="http://org/openroadm/network/topology">
         <tail-equipment-id>ROADM-C1-SRG1--SRG1-PP1-TXRX</tail-equipment-id>
       </xpdr-network-attributes>
     <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
     <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
       <tp-id>XPDR1-CLIENT1</tp-id>
-      <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-NETWORK1</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-NETWORK1</associated-connection-map-tp>
       <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
       <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
       <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
     </termination-point>
     <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
       <tp-id>XPDR1-CLIENT2</tp-id>
-      <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-NETWORK2</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-NETWORK2</associated-connection-map-tp>
       <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
       <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
       <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
     </termination-point>
     <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
       <tp-id>XPDR1-NETWORK2</tp-id>
-      <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-CLIENT2</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-CLIENT2</associated-connection-map-tp>
       <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
       <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
       <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
     </termination-point>
     <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
       <tp-id>XPDR1-NETWORK1</tp-id>
-      <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-CLIENT1</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-CLIENT1</associated-connection-map-tp>
       <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
       <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
       <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
index e02d8d0316d64dcc66ecdb6b4c3b3c226287c059..c2086f6505084f33bb10c824dd4c28c6e273ebae 100644 (file)
@@ -12,7 +12,7 @@
     <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
     <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
       <tp-id>XPDR1-CLIENT1</tp-id>
-      <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-NETWORK1</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-NETWORK1</associated-connection-map-tp>
       <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
         <supported-interface-capability>
           <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-100GE</if-cap-type>
@@ -25,7 +25,7 @@
     </termination-point>
     <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
       <tp-id>XPDR1-CLIENT2</tp-id>
-      <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-NETWORK2</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-NETWORK2</associated-connection-map-tp>
       <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
         <supported-interface-capability>
           <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-100GE</if-cap-type>
@@ -43,7 +43,7 @@
         <node-ref>XPDR-C1-XPDR1</node-ref>
         <tp-ref>XPDR1-NETWORK2</tp-ref>
       </supporting-termination-point>
-      <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-CLIENT2</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-CLIENT2</associated-connection-map-tp>
       <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
         <supported-interface-capability>
           <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OCH</if-cap-type>
@@ -61,7 +61,7 @@
         <node-ref>XPDR-C1-XPDR1</node-ref>
         <tp-ref>XPDR1-NETWORK1</tp-ref>
       </supporting-termination-point>
-      <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-CLIENT1</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-CLIENT1</associated-connection-map-tp>
       <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
         <supported-interface-capability>
           <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OCH</if-cap-type>
     <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
     <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
       <tp-id>XPDR1-CLIENT1</tp-id>
-      <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-NETWORK1</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-NETWORK1</associated-connection-map-tp>
       <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
         <supported-interface-capability>
           <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-100GE</if-cap-type>
     </termination-point>
     <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
       <tp-id>XPDR1-CLIENT2</tp-id>
-      <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-NETWORK2</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-NETWORK2</associated-connection-map-tp>
       <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
         <supported-interface-capability>
           <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-100GE</if-cap-type>
         <node-ref>XPDR-A1-XPDR1</node-ref>
         <tp-ref>XPDR1-NETWORK2</tp-ref>
       </supporting-termination-point>
-      <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-CLIENT2</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-CLIENT2</associated-connection-map-tp>
       <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
         <supported-interface-capability>
           <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OCH</if-cap-type>
         <node-ref>XPDR-A1-XPDR1</node-ref>
         <tp-ref>XPDR1-NETWORK1</tp-ref>
       </supporting-termination-point>
-      <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-CLIENT1</associated-connection-map-port>
+      <associated-connection-map-tp xmlns="http://org/openroadm/common/network">XPDR1-CLIENT1</associated-connection-map-tp>
       <tp-supported-interfaces xmlns="http://org/openroadm/otn/network/topology">
         <supported-interface-capability>
           <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OCH</if-cap-type>
       <dest-tp>XPDR1-NETWORK1</dest-tp>
       <dest-node>SPDR-SA1-XPDR1</dest-node>
     </destination>
-    <otn-link-type xmlns="http://transportpce/topology">OTU4</otn-link-type>
+    <otn-link-type xmlns="http://org/opendaylight/transportpce/networkutils">OTU4</otn-link-type>
   </link>
   <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
     <link-id>OTU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1</link-id>
       <dest-tp>XPDR1-NETWORK1</dest-tp>
       <dest-node>SPDR-SC1-XPDR1</dest-node>
     </destination>
-    <otn-link-type xmlns="http://transportpce/topology">OTU4</otn-link-type>
+    <otn-link-type xmlns="http://org/opendaylight/transportpce/networkutils">OTU4</otn-link-type>
   </link>
   <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
     <link-id>ODTU4-SPDR-SC1-XPDR1-XPDR1-NETWORK1toSPDR-SA1-XPDR1-XPDR1-NETWORK1</link-id>
       <dest-tp>XPDR1-NETWORK1</dest-tp>
       <dest-node>SPDR-SA1-XPDR1</dest-node>
     </destination>
-    <otn-link-type xmlns="http://transportpce/topology">ODTU4</otn-link-type>
+    <otn-link-type xmlns="http://org/opendaylight/transportpce/networkutils">ODTU4</otn-link-type>
   </link>
   <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
     <link-id>ODTU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1</link-id>
       <dest-tp>XPDR1-NETWORK1</dest-tp>
       <dest-node>SPDR-SC1-XPDR1</dest-node>
     </destination>
-    <otn-link-type xmlns="http://transportpce/topology">ODTU4</otn-link-type>
+    <otn-link-type xmlns="http://org/opendaylight/transportpce/networkutils">ODTU4</otn-link-type>
   </link>
 </network>
 </networks>
index ef5e307446fe95d7c0703f2a20240fdecb7582cc..f5446cb041364405dce487898cbc283a6e29e234 100644 (file)
       <supported-interface-capability xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</supported-interface-capability>
       <lcp-hash-val>FBhfaeWn4kY=</lcp-hash-val>
       <port-direction>bidirectional</port-direction>
-      <xponder-type>mpdr</xponder-type>
+      <xpdr-type>mpdr</xpdr-type>
       <supporting-port>CP3-CFP0-P1</supporting-port>
       <port-qual>xpdr-network</port-qual>
     </mapping>
       <supported-interface-capability xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</supported-interface-capability>
       <lcp-hash-val>ALx70DYYfGTx</lcp-hash-val>
       <port-direction>bidirectional</port-direction>
-      <xponder-type>switch</xponder-type>
+      <xpdr-type>switch</xpdr-type>
       <supporting-port>CP6-CFP-P1</supporting-port>
       <port-qual>switch-network</port-qual>
     </mapping>
       <supported-interface-capability xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</supported-interface-capability>
       <lcp-hash-val>ALx70DYYfGTy</lcp-hash-val>
       <port-direction>bidirectional</port-direction>
-      <xponder-type>switch</xponder-type>
+      <xpdr-type>switch</xpdr-type>
       <supporting-port>CP7-CFP-P1</supporting-port>
       <port-qual>switch-network</port-qual>
     </mapping>
       <supported-interface-capability xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</supported-interface-capability>
       <lcp-hash-val>ALx70DYYfGTz</lcp-hash-val>
       <port-direction>bidirectional</port-direction>
-      <xponder-type>switch</xponder-type>
+      <xpdr-type>switch</xpdr-type>
       <supporting-port>CP8-CFP-P1</supporting-port>
       <port-qual>switch-network</port-qual>
     </mapping>
       <supported-interface-capability xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</supported-interface-capability>
       <lcp-hash-val>ALx70DYYfGT0</lcp-hash-val>
       <port-direction>bidirectional</port-direction>
-      <xponder-type>switch</xponder-type>
+      <xpdr-type>switch</xpdr-type>
       <supporting-port>CP5-CFP-P1</supporting-port>
       <port-qual>switch-network</port-qual>
     </mapping>
       <supported-interface-capability xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</supported-interface-capability>
       <lcp-hash-val>fuYZwEO660g=</lcp-hash-val>
       <port-direction>bidirectional</port-direction>
-      <xponder-type>mpdr</xponder-type>
+      <xpdr-type>mpdr</xpdr-type>
       <supporting-port>CP1-CFP0-P1</supporting-port>
       <port-qual>xpdr-network</port-qual>
     </mapping>
       <supported-interface-capability xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</supported-interface-capability>
       <lcp-hash-val>ANnxoi7K8q30</lcp-hash-val>
       <port-direction>bidirectional</port-direction>
-      <xponder-type>mpdr</xponder-type>
+      <xpdr-type>mpdr</xpdr-type>
       <supporting-port>CP3-CFP0-P1</supporting-port>
       <port-qual>xpdr-network</port-qual>
     </mapping>
       <supported-interface-capability xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</supported-interface-capability>
       <lcp-hash-val>exT821pFtOc=</lcp-hash-val>
       <port-direction>bidirectional</port-direction>
-      <xponder-type>switch</xponder-type>
+      <xpdr-type>switch</xpdr-type>
       <supporting-port>CP6-CFP-P1</supporting-port>
       <port-qual>switch-network</port-qual>
     </mapping>
       <supported-interface-capability xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</supported-interface-capability>
       <lcp-hash-val>exT821pFtOQ=</lcp-hash-val>
       <port-direction>bidirectional</port-direction>
-      <xponder-type>switch</xponder-type>
+      <xpdr-type>switch</xpdr-type>
       <supporting-port>CP7-CFP-P1</supporting-port>
       <port-qual>switch-network</port-qual>
     </mapping>
       <supported-interface-capability xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</supported-interface-capability>
       <lcp-hash-val>exT821pFtOU=</lcp-hash-val>
       <port-direction>bidirectional</port-direction>
-      <xponder-type>switch</xponder-type>
+      <xpdr-type>switch</xpdr-type>
       <supporting-port>CP8-CFP-P1</supporting-port>
       <port-qual>switch-network</port-qual>
     </mapping>
       <supported-interface-capability xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</supported-interface-capability>
       <lcp-hash-val>exT821pFtOI=</lcp-hash-val>
       <port-direction>bidirectional</port-direction>
-      <xponder-type>switch</xponder-type>
+      <xpdr-type>switch</xpdr-type>
       <supporting-port>CP5-CFP-P1</supporting-port>
       <port-qual>switch-network</port-qual>
     </mapping>
       <supported-interface-capability xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</supported-interface-capability>
       <lcp-hash-val>Swfw02qXGyI=</lcp-hash-val>
       <port-direction>bidirectional</port-direction>
-      <xponder-type>mpdr</xponder-type>
+      <xpdr-type>mpdr</xpdr-type>
       <supporting-port>CP1-CFP0-P1</supporting-port>
       <port-qual>xpdr-network</port-qual>
     </mapping>
diff --git a/tapimodels/pom.xml b/tapimodels/pom.xml
deleted file mode 100644 (file)
index 8ef00a5..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-Copyright © 2018 Orange and others. All rights reserved.
-
-This program and the accompanying materials are made available under the
-terms of the Eclipse Public License v1.0 which accompanies this distribution,
-and is available at http://www.eclipse.org/legal/epl-v10.html
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.opendaylight.mdsal</groupId>
-    <artifactId>binding-parent</artifactId>
-    <version>8.0.11</version>
-    <relativePath/>
-  </parent>
-
-  <groupId>org.opendaylight.transportpce</groupId>
-  <artifactId>transportpce-tapimodels</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
-  <packaging>bundle</packaging>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>concepts</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.opendaylight.yangtools</groupId>
-      <artifactId>yang-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>com.google.guava</groupId>
-      <artifactId>guava</artifactId>
-    </dependency>
-  </dependencies>
-</project>
diff --git a/tapimodels/src/main/yang/tapi-common@2018-12-10.yang b/tapimodels/src/main/yang/tapi-common@2018-12-10.yang
deleted file mode 100644 (file)
index 2d5dd65..0000000
+++ /dev/null
@@ -1,683 +0,0 @@
-module tapi-common {
-    namespace "urn:onf:otcc:yang:tapi-common";
-    prefix tapi-common;
-    organization "ONF OTCC (Open Transport Configuration & Control) Project";
-    contact "
-         Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>
-         Project List: <mailto:transport-api@opennetworking.org>
-         Editor: Karthik Sethuraman
-                 <mailto:karthik.sethuraman@necam.com>";
-    description "
-        This module contains TAPI Common Model definitions.
-        Source: TapiCommon.uml
-        - The TAPI YANG models included in this TAPI release are a *normative* part of the TAPI SDK.
-        - The YANG specifications have been generated from the corresponding UML model using the [ONF EAGLE UML2YANG mapping tool]
-          <https://github.com/OpenNetworkingFoundation/EagleUmlYang>
-          and further edited manually to comply with the [ONF IISOMI UML2YANG mapping guidelines]
-          <https://wiki.opennetworking.org/display/OIMT/UML+-+YANG+Guidelines>
-        - Status of YANG model artifacts can be determined by referring to the corresponding UML artifacts.
-          As described in the UML models, some artifacts are considered *experimental*, and thus the corresponding YANG artifacts.
-        - The ONF TAPI release process does not guarantee backward compatibility of YANG models across major versions of TAPI releases.
-          The YANG model backward compatibility criteria are outlined in section 11 of <https://tools.ietf.org/html/rfc7950>.
-          YANG models included in this release may not be backward compatible with previous TAPI releases.
-        Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.
-        License: This module is distributed under the Apache License 2.0";
-    revision 2018-12-10 {
-        description "ONF Transport API version 2.1.1.
-                   Changes included in this TAPI release (v2.1.1) are listed in
-                   <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.1.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
-    }
-    revision 2018-10-16 {
-        description "ONF Transport API version 2.1.0.
-                   Changes included in this TAPI release (v2.1.0) are listed in
-                   <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
-    }
-    revision 2018-03-07 {
-        description "ONF Transport API version 2.0.2
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";
-    }
-    revision 2018-02-16 {
-        description "ONF Transport API version 2.0.1
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";
-    }
-    revision 2018-01-02 {
-        description "ONF Transport API version 2.0.0
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";
-    }
-
-   /**************************
-    * definitions of refrences
-    **************************/
-    grouping service-interface-point-ref {
-        leaf service-interface-point-uuid {
-            type leafref {
-                path '/tapi-common:context/tapi-common:service-interface-point/tapi-common:uuid';
-            }
-            description "none";
-        }
-        description "none";
-    }
-
-   /**************************
-    * package object-classes
-    **************************/
-    grouping admin-state-pac {
-        leaf administrative-state {
-            type administrative-state;
-            description "none";
-        }
-        leaf operational-state {
-            type operational-state;
-            config false;
-            description "none";
-        }
-        leaf lifecycle-state {
-            type lifecycle-state;
-            config false;
-            description "none";
-        }
-        description "Provides state attributes that are applicable to an entity that can be administered. Such an entity also has operational and lifecycle aspects.";
-    }
-    grouping global-class {
-        leaf uuid {
-            type uuid;
-            description "UUID: An identifier that is universally unique within an identifier space, where the identifier space is itself globally unique, and immutable. An UUID carries no semantics with respect to the purpose or state of the entity.
-                UUID here uses string representation as defined in RFC 4122.  The canonical representation uses lowercase characters.
-                Pattern: [0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-' + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}
-                Example of a UUID in string representation: f81d4fae-7dec-11d0-a765-00a0c91e6bf6";
-        }
-        list name {
-            key 'value-name';
-            uses name-and-value;
-            description "List of names. A property of an entity with a value that is unique in some namespace but may change during the life of the entity. A name carries no semantics with respect to the purpose of the entity.";
-        }
-        description "The TAPI GlobalComponent serves as the super class for all TAPI entities that can be directly retrieved by their ID. As such, these are first class entities and their ID is expected to be globally unique. ";
-    }
-    grouping lifecycle-state-pac {
-        leaf lifecycle-state {
-            type lifecycle-state;
-            config false;
-            description "none";
-        }
-        description "Provides state attributes for an entity that has lifeccycle aspects only.";
-    }
-    grouping local-class {
-        leaf local-id {
-            type string;
-            description "none";
-        }
-        list name {
-            key 'value-name';
-            uses name-and-value;
-            description "List of names. A property of an entity with a value that is unique in some namespace but may change during the life of the entity. A name carries no semantics with respect to the purpose of the entity.";
-        }
-        description "The TAPI GlobalComponent serves as the super class for all TAPI entities that can be directly retrieved by their ID. As such, these are first class entities and their ID is expected to be globally unique. ";
-    }
-    grouping operational-state-pac {
-        leaf operational-state {
-            type operational-state;
-            config false;
-            description "none";
-        }
-        leaf lifecycle-state {
-            type lifecycle-state;
-            config false;
-            description "none";
-        }
-        description "Provides state attributes that are applicable to an entity that reflects operational aspects. Such an entity is expected to also have lifecycle aspects.";
-    }
-    container context {
-        uses tapi-context;
-        presence "Root container for all TAPI interaction";
-        description "none";
-    }
-    grouping tapi-context {
-        list service-interface-point {
-            key 'uuid';
-            uses service-interface-point;
-            description "none";
-        }
-        uses global-class;
-        description "The Network Control Domain (NCD) object class represents the scope of control that a particular SDN controller has with respect to a particular network, (i.e., encompassing a designated set of interconnected (virtual) network elements).";
-    }
-    grouping resource-spec {
-        uses global-class;
-        description "none";
-    }
-    grouping service-spec {
-        uses global-class;
-        description "none";
-    }
-    grouping service-interface-point {
-        leaf layer-protocol-name {
-            type layer-protocol-name;
-            config false;
-            description "Usage of layerProtocolName [>1]  in the ServiceInterfacePoint should be considered experimental";
-        }
-        leaf-list supported-layer-protocol-qualifier {
-            type layer-protocol-qualifier;
-            config false;
-            min-elements 1;
-            description "none";
-        }
-        uses resource-spec;
-        uses admin-state-pac;
-        uses capacity-pac;
-        description "The LogicalTerminationPoint (LTP) object class encapsulates the termination and adaptation functions of one or more transport layers.
-            The structure of LTP supports all transport protocols including circuit and packet forms.";
-    }
-    grouping capacity-pac {
-        container total-potential-capacity {
-            config false;
-            uses capacity;
-            description "An optimistic view of the capacity of the TopologicalEntity assuming that any shared capacity is available to be taken.";
-        }
-        container available-capacity {
-            config false;
-            uses capacity;
-            description "Capacity available to be assigned.";
-        }
-        description "The TopologicalEntity derives capacity from the underlying realization.
-            A TopologicalEntity may be an abstraction and virtualization of a subset of the underlying capability offered in a view or may be directly reflecting the underlying realization.
-            A TopologicalEntity may be directly used in the view or may be assigned to another view for use.
-            The clients supported by a multi-layer TopologicalEntity may interact such that the resources used by one client may impact those available to another. This is derived from the LTP spec details.
-            Represents the capacity available to user (client) along with client interaction and usage.
-            A TopologicalEntity may reflect one or more client protocols and one or more members for each profile.";
-    }
-    grouping termination-pac {
-        leaf termination-direction {
-            type termination-direction;
-            config false;
-            description "The overall directionality of the LP.
-                - A BIDIRECTIONAL LP will have some SINK and/or SOURCE flowss.
-                - A SINK LP can only contain elements with SINK flows or CONTRA_DIRECTION_SOURCE flows
-                - A SOURCE LP can only contain SOURCE flows or CONTRA_DIRECTION_SINK flows";
-        }
-        leaf termination-state {
-            type termination-state;
-            config false;
-            description "Indicates whether the layer is terminated and if so how.";
-        }
-        description "Each transport layer is represented by a LayerProtocol (LP) instance. The LayerProtocol instances it can be used for controlling termination and monitoring functionality.
-            It can also be used for controlling the adaptation (i.e. encapsulation and/or multiplexing of client signal), tandem connection monitoring, traffic conditioning and/or shaping functionality at an intermediate point along a connection.
-            Where the client – server relationship is fixed 1:1 and immutable, the layers can be encapsulated in a single LTP instance. Where the is a n:1 relationship between client and server, the layers must be split over two separate instances of LTP. ";
-    }
-
-   /**************************
-    * package type-definitions
-    **************************/
-    identity LAYER_PROTOCOL_QUALIFIER {
-        description "none";
-    }
-    typedef administrative-state {
-        type enumeration {
-            enum LOCKED {
-                description "Users are administratively prohibited from making use of the resource.";
-            }
-            enum UNLOCKED {
-                description "Users are allowed to use the resource";
-            }
-        }
-        description "The possible values of the administrativeState.";
-    }
-    typedef date-and-time {
-        type string;
-        description "This primitive type defines the date and time according to the following structure:
-            yyyyMMddhhmmss.s[Z|{+|-}HHMm] where:
-            yyyy    0000..9999    year
-            MM    01..12            month
-            dd        01..31            day
-            hh        00..23            hour
-            mm    00..59            minute
-            ss        00..59            second
-            s        .0...9            tenth of second (set to .0 if EMS or NE cannot support this granularity)
-            Z        Z                indicates UTC (rather than local time)
-            {+|-}    + or -            delta from UTC
-            HH        00..23            time zone difference in hours
-            Mm    00..59            time zone difference in minutes.";
-    }
-    typedef directive-value {
-        type enumeration {
-            enum MINIMIZE {
-                description "none";
-            }
-            enum MAXIMIZE {
-                description "none";
-            }
-            enum ALLOW {
-                description "none";
-            }
-            enum DISALLOW {
-                description "none";
-            }
-            enum DONT_CARE {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    typedef forwarding-direction {
-        type enumeration {
-            enum BIDIRECTIONAL {
-                description "The Fowarding entity supports both BIDIRECTIONAL flows at all Ports (i.e. all Ports have both an INPUT flow and an OUTPUT flow defined)";
-            }
-            enum UNIDIRECTIONAL {
-                description "The Forwarding entity has Ports that are either INPUT or OUTPUT. It has no BIDIRECTIONAL Ports.";
-            }
-            enum UNDEFINED_OR_UNKNOWN {
-                description "Not a normal state. The system is unable to determine the correct value.";
-            }
-        }
-        description "The directionality of a Forwarding entity.";
-    }
-    typedef layer-protocol-name {
-        type enumeration {
-            enum ODU {
-                description "Models the ODU layer as per ITU-T G.872";
-            }
-            enum ETH {
-                description "Models the ETH layer as per ITU-T G.8010";
-            }
-            enum DSR {
-                description "Models a Digital Signal of an unspecified rate. This value can be used when the intent is to respresent an generic digital layer signal without making any statement on its format or overhead (processing) capabilities.";
-            }
-            enum PHOTONIC_MEDIA {
-                description "Models the OCH, OTSi, OTSiA, OTSiG, OMS, OTS and Media channels as per ITU-T G.872 (2017) version 4";
-            }
-        }
-        description "Provides a controlled list of layer protocol names and indicates the naming authority.
-            Note that it is expected that attributes will be added to this structure to convey the naming authority name, the name of the layer protocol using a human readable string and any particular standard reference.
-            Layer protocol names include:
-            -    Layer 1 (L1): OTU, ODU
-            -    Layer 2 (L2): Carrier Grade Ethernet (ETY, ETH), MPLS-TP (MT)
-            ";
-    }
-    typedef lifecycle-state {
-        type enumeration {
-            enum PLANNED {
-                description "The resource is planned but is not present in the network.";
-            }
-            enum POTENTIAL_AVAILABLE {
-                description "The supporting resources are present in the network but are shared with other clients; or require further configuration before they can be used; or both.
-                    o    When a potential resource is configured and allocated to a client it is moved to the installed state for that client.
-                    o    If the potential resource has been consumed (e.g. allocated to another client) it is moved to the planned state for all other clients.";
-            }
-            enum POTENTIAL_BUSY {
-                description "The supporting resources are present in the network but are shared with other clients; or require further configuration before they can be used; or both.
-                    o    When a potential resource is configured and allocated to a client it is moved to the installed state for that client.
-                    o    If the potential resource has been consumed (e.g. allocated to another client) it is moved to the planned state for all other clients.";
-            }
-            enum INSTALLED {
-                description "The resource is present in the network and is capable of providing the service expected.";
-            }
-            enum PENDING_REMOVAL {
-                description "The resource has been marked for removal";
-            }
-        }
-        description "The possible values of the lifecycleState.";
-    }
-    grouping name-and-value {
-        leaf value-name {
-            type string;
-            description "The name of the value. The value need not have a name.";
-        }
-        leaf value {
-            type string;
-            description "The value";
-        }
-        description "A scoped name-value pair";
-    }
-    typedef operational-state {
-        type enumeration {
-            enum DISABLED {
-                description "The resource is unable to meet the SLA of the user of the resource. If no (explicit) SLA is defined the resource is disabled if it is totally inoperable and unable to provide service to the user.";
-            }
-            enum ENABLED {
-                description "The resource is partially or fully operable and available for use";
-            }
-        }
-        description "The possible values of the operationalState.";
-    }
-    typedef port-direction {
-        type enumeration {
-            enum BIDIRECTIONAL {
-                description "The Port has both an INPUT flow and an OUTPUT flow defined.";
-            }
-            enum INPUT {
-                description "The Port only has definition for a flow into the Forwarding entity (i.e. an ingress flow).";
-            }
-            enum OUTPUT {
-                description "The Port only has definition for a flow out of the Forwarding entity (i.e. an egress flow).";
-            }
-            enum UNIDENTIFIED_OR_UNKNOWN {
-                description "Not a normal state. The system is unable to determine the correct value.";
-            }
-        }
-        description "The orientation of flow at the Port of a Forwarding entity";
-    }
-    typedef port-role {
-        type enumeration {
-            enum SYMMETRIC {
-                description "none";
-            }
-            enum ROOT {
-                description "none";
-            }
-            enum LEAF {
-                description "none";
-            }
-            enum TRUNK {
-                description "none";
-            }
-            enum UNKNOWN {
-                description "none";
-            }
-        }
-        description "The role of an end in the context of the function of the forwarding entity that it bounds";
-    }
-    typedef termination-direction {
-        type enumeration {
-            enum BIDIRECTIONAL {
-                description "A Termination with both SINK and SOURCE flows.";
-            }
-            enum SINK {
-                description "The flow is up the layer stack from the server side to the client side.
-                    Considering an example of a Termination function within the termination entity, a SINK flow:
-                    - will arrive at at the base of the termination function (the server side) where it is essentially at an INPUT to the termination component
-                    - then will be decoded and deconstructed
-                    - then relevant parts of the flow will be sent out of the termination function (the client side) where it is essentially at an OUTPUT from the termination component
-                    A SINK termination is one that only supports a SINK flow.
-                    A SINK termiation can be bound to an OUTPUT Port of a Forwarding entity";
-            }
-            enum SOURCE {
-                description "The flow is down the layer stack from the server side to the client side.
-                    Considering an example of a Termination function within the termination entity, a SOURCE flow:
-                    - will arrive at at the top of the termination function (the client side) where it is essentially at an INPUT to the termination component
-                    - then will be assembled with various overheads etc and will be coded
-                    - then coded form of the assembly of flow will be sent out of the termination function (the server side) where it is essentially at an OUTPUT from the termination component
-                    A SOURCE termination is one that only supports a SOURCE flow.
-                    A SOURCE termiation can be bound to an INPUT Port of a Forwarding entity";
-            }
-            enum UNDEFINED_OR_UNKNOWN {
-                description "Not a normal state. The system is unable to determine the correct value.";
-            }
-        }
-        description "The directionality of a termination entity";
-    }
-    typedef termination-state {
-        type enumeration {
-            enum LP_CAN_NEVER_TERMINATE {
-                description "A non-flexible case that can never be terminated.";
-            }
-            enum LT_NOT_TERMINATED {
-                description "A flexible termination that can terminate but is currently not terminated.";
-            }
-            enum TERMINATED_SERVER_TO_CLIENT_FLOW {
-                description "A flexible termination that is currently terminated for server to client flow only.";
-            }
-            enum TERMINATED_CLIENT_TO_SERVER_FLOW {
-                description "A flexible termination that is currently terminated for client to server flow only.";
-            }
-            enum TERMINATED_BIDIRECTIONAL {
-                description "A flexible termination that is currently terminated in both directions of flow.";
-            }
-            enum LT_PERMENANTLY_TERMINATED {
-                description "A non-flexible termination that is always terminated (in both directions of flow for a bidirectional case and in the one direction of flow for both unidirectional cases).";
-            }
-            enum TERMINATION_STATE_UNKNOWN {
-                description "There TerminationState cannot be determined.";
-            }
-        }
-        description "Provides support for the range of behaviours and specific states that an LP can take with respect to termination of the signal.
-            Indicates to what degree the LayerTermination is terminated.";
-    }
-    typedef uuid {
-        type string;
-        description "The univeral ID value where the mechanism for generation is defned by some authority not directly referenced in the structure.
-            UUID here uses string representation as defined in RFC 4122.  The canonical representation uses lowercase characters.
-            Pattern: [0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-' + '[0-9a-fA-F]{4}-[0-9a-fA-F]{12}
-            Example of a UUID in string representation: f81d4fae-7dec-11d0-a765-00a0c91e6bf6";
-    }
-    grouping capacity {
-        container total-size {
-            uses capacity-value;
-            description "Total capacity of the TopologicalEntity in MB/s. In case of bandwidthProfile, this is expected to same as the committedInformationRate.";
-        }
-        container bandwidth-profile {
-            uses bandwidth-profile;
-            description "none";
-        }
-        description "Information on capacity of a particular TopologicalEntity.";
-    }
-    grouping bandwidth-profile {
-        leaf bw-profile-type {
-            type bandwidth-profile-type;
-            description "none";
-        }
-        container committed-information-rate {
-            uses capacity-value;
-            description "none";
-        }
-        container committed-burst-size {
-            uses capacity-value;
-            description "none";
-        }
-        container peak-information-rate {
-            uses capacity-value;
-            description "none";
-        }
-        container peak-burst-size {
-            uses capacity-value;
-            description "none";
-        }
-        leaf color-aware {
-            type boolean;
-            description "none";
-        }
-        leaf coupling-flag {
-            type boolean;
-            description "none";
-        }
-        description "none";
-    }
-    grouping capacity-value {
-        leaf value {
-            type uint64;
-            description "none";
-        }
-        leaf unit {
-            type capacity-unit;
-            description "none";
-        }
-        description "The Capacity (Bandwidth) values that are applicable for digital layers.";
-    }
-    typedef capacity-unit {
-        type enumeration {
-            enum TB {
-                description "Indicates that the integer CapacityValue is in TeraBytes";
-            }
-            enum TBPS {
-                description "Indicates that the integer CapacityValue is in Terabit-per-second";
-            }
-            enum GB {
-                description "Indicates that the integer CapacityValue is in GigaBytes";
-            }
-            enum GBPS {
-                description "Indicates that the integer CapacityValue is in Gigabit-per-second";
-            }
-            enum MB {
-                description "Indicates that the integer CapacityValue is in MegaBytes";
-            }
-            enum MBPS {
-                description "Indicates that the integer CapacityValue is in Megabit-per-second";
-            }
-            enum KB {
-                description "Indicates that the integer CapacityValue is in KiloBytes";
-            }
-            enum KBPS {
-                description "Indicates that the integer CapacityValue is in Kilobit-per-second";
-            }
-            enum GHz {
-                description "none";
-            }
-            enum MHz {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    typedef bandwidth-profile-type {
-        type enumeration {
-            enum MEF_10.x {
-                description "none";
-            }
-            enum RFC_2697 {
-                description "none";
-            }
-            enum RFC_2698 {
-                description "none";
-            }
-            enum RFC_4115 {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    grouping time-range {
-        leaf end-time {
-            type date-and-time;
-            description "none";
-        }
-        leaf start-time {
-            type date-and-time;
-            description "none";
-        }
-        description "none";
-    }
-    grouping time-period {
-        leaf value {
-            type uint64;
-            description "none";
-        }
-        leaf unit {
-            type time-unit;
-            description "none";
-        }
-        description "none";
-    }
-    typedef time-unit {
-        type enumeration {
-            enum YEARS {
-                description "none";
-            }
-            enum MONTHS {
-                description "none";
-            }
-            enum DAYS {
-                description "none";
-            }
-            enum HOURS {
-                description "none";
-            }
-            enum MINUTES {
-                description "none";
-            }
-            enum SECONDS {
-                description "none";
-            }
-            enum MILLISECONDS {
-                description "none";
-            }
-            enum MICROSECONDS {
-                description "none";
-            }
-            enum NANOSECONDS {
-                description "none";
-            }
-            enum PICOSECONDS {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    grouping time-interval {
-        list period {
-            key 'unit';
-            min-elements 1;
-            max-elements 5;
-            uses time-period;
-            description "none";
-        }
-        description "none";
-    }
-    typedef layer-protocol-qualifier {
-        type identityref {
-            base LAYER_PROTOCOL_QUALIFIER;
-        }
-        description "This enumeration is used to qualify the sub-layers (if applicable) for a specific LayerProtocol.
-            This extensible enumeration is intentionally empty in the common module and will be augmented with layer-specific values in the respective technology-specific modules.
-            Examples:
-            - LayerProtocolName := OPTICAL_DATA_UNIT
-            LayerProtocolQualifier := 'ODU_FLEX', 'ODU_0', 'ODU_1', 'ODU_2', 'ODU_2E', 'ODU_3', 'ODU_4'', 'ODU_CBR'', 'ODU_GFP'', 'ODU_GFP_HAO', etc
-            - LayerProtocolName := DIGITAL_SIGNAL_RATE
-            LayerProtocolQualifier := 'GBE', '10_GBE_WAN', '10_GBE_LAN', '100_GBE', 'FC_100', 'FC_200', 'FC_400', 'FC_800', 'FC_1200', 'FC_1600', 'FC_3200', 'STM_1', 'STM_4', 'STM_16', 'STM_64', 'STM_256', 'OC_3', 'OC_12', 'OC_48', 'OC_192', 'OC_768', 'OTU_1', 'OTU_2', 'OTU_2E', 'OTU_3', 'OTU_4', 'GPON', 'XGPON', 'IB_SDR', 'IB_DDR', 'IB_QDR', 'SBCON_ESCON', 'DVB_ASI', 'SDI', 'SDI_1G5', 'SDI_3G', etc
-            - LayerProtocolName := PHOTONIC_MEDIA
-            LayerProtocolQualifier := OCH, OTSi, OTSiA, NMC, NMCA, SMC, SMCA, OMS, OTS
-            ";
-    }
-
-   /**************************
-    * package interfaces
-    **************************/
-    rpc get-service-interface-point-details {
-        description "none";
-        input {
-            leaf sip-id-or-name {
-                type string;
-                description "none";
-            }
-        }
-        output {
-            container sip {
-                uses service-interface-point;
-                description "none";
-            }
-        }
-    }
-    rpc get-service-interface-point-list {
-        description "none";
-        output {
-            list sip {
-                key 'uuid';
-                uses service-interface-point;
-                description "none";
-            }
-        }
-    }
-    rpc update-service-interface-point {
-        description "none";
-        input {
-            leaf sip-id-or-name {
-                type string;
-                description "none";
-            }
-            leaf state {
-                type administrative-state;
-                description "none";
-            }
-        }
-    }
-}
diff --git a/tapimodels/src/main/yang/tapi-connectivity@2018-12-10.yang b/tapimodels/src/main/yang/tapi-connectivity@2018-12-10.yang
deleted file mode 100644 (file)
index 9727852..0000000
+++ /dev/null
@@ -1,761 +0,0 @@
-module tapi-connectivity {
-    namespace "urn:onf:otcc:yang:tapi-connectivity";
-    prefix tapi-connectivity;
-    import tapi-common {
-        prefix tapi-common;
-    }
-    import tapi-topology {
-        prefix tapi-topology;
-    }
-    import tapi-path-computation {
-        prefix tapi-path-computation;
-    }
-    organization "ONF OTCC (Open Transport Configuration & Control) Project";
-    contact "
-         Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>
-         Project List: <mailto:transport-api@opennetworking.org>
-         Editor: Karthik Sethuraman
-                 <mailto:karthik.sethuraman@necam.com>";
-    description "
-        This module contains TAPI Connectivity Model definitions.
-        Source: TapiConnectivity.uml
-        - The TAPI YANG models included in this TAPI release are a *normative* part of the TAPI SDK.
-        - The YANG specifications have been generated from the corresponding UML model using the [ONF EAGLE UML2YANG mapping tool]
-          <https://github.com/OpenNetworkingFoundation/EagleUmlYang>
-          and further edited manually to comply with the [ONF IISOMI UML2YANG mapping guidelines]
-          <https://wiki.opennetworking.org/display/OIMT/UML+-+YANG+Guidelines>
-        - Status of YANG model artifacts can be determined by referring to the corresponding UML artifacts.
-          As described in the UML models, some artifacts are considered *experimental*, and thus the corresponding YANG artifacts.
-        - The ONF TAPI release process does not guarantee backward compatibility of YANG models across major versions of TAPI releases.
-          The YANG model backward compatibility criteria are outlined in section 11 of <https://tools.ietf.org/html/rfc7950>.
-          YANG models included in this release may not be backward compatible with previous TAPI releases.
-        Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.
-        License: This module is distributed under the Apache License 2.0";
-    revision 2018-12-10 {
-        description "ONF Transport API version 2.1.1.
-                   Changes included in this TAPI release (v2.1.1) are listed in
-                   <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.1.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
-    }
-    revision 2018-10-16 {
-        description "ONF Transport API version 2.1.0.
-                   Changes included in this TAPI release (v2.1.0) are listed in
-                   <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
-    }
-    revision 2018-03-07 {
-        description "ONF Transport API version 2.0.2
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";
-    }
-    revision 2018-02-16 {
-        description "ONF Transport API version 2.0.1
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";
-    }
-    revision 2018-01-02 {
-        description "ONF Transport API version 2.0.0
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";
-    }
-    augment "/tapi-common:context" {
-        container connectivity-context {
-            uses connectivity-context;
-            description "Augments the base TAPI Context with ConnectivityService information";
-        }
-        description "Augments the base TAPI Context with ConnectivityService information";
-    }
-    augment "/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point" {
-        container cep-list {
-            uses cep-list;
-            description "none";
-        }
-        description "none";
-    }
-
-   /**************************
-    * definitions of references
-    **************************/
-    grouping connectivity-service-ref {
-        leaf connectivity-service-uuid {
-            type leafref {
-                path '/tapi-common:context/tapi-connectivity:connectivity-context/tapi-connectivity:connectivity-service/tapi-connectivity:uuid';
-            }
-            description "none";
-        }
-        description "none";
-    }
-    grouping connectivity-service-end-point-ref {
-        uses connectivity-service-ref;
-        leaf connectivity-service-end-point-local-id {
-            type leafref {
-                path '/tapi-common:context/tapi-connectivity:connectivity-context/tapi-connectivity:connectivity-service/tapi-connectivity:end-point/tapi-connectivity:local-id';
-            }
-            description "none";
-        }
-        description "none";
-    }
-    grouping connection-end-point-ref {
-        uses tapi-topology:node-edge-point-ref;
-        leaf connection-end-point-uuid {
-            type leafref {
-                path '/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:cep-list/tapi-connectivity:connection-end-point/tapi-connectivity:uuid';
-            }
-            description "none";
-        }
-        description "none";
-    }
-    grouping connection-ref {
-        leaf connection-uuid {
-            type leafref {
-                path '/tapi-common:context/tapi-connectivity:connectivity-context/tapi-connectivity:connection/tapi-connectivity:uuid';
-            }
-            description "none";
-        }
-        description "none";
-    }
-    grouping switch-control-ref {
-        uses connection-ref;
-        leaf switch-control-uuid {
-            type leafref {
-                path '/tapi-common:context/tapi-connectivity:connectivity-context/tapi-connectivity:connection/tapi-connectivity:switch-control/tapi-connectivity:uuid';
-            }
-            description "none";
-        }
-        description "none";
-    }
-    grouping route-ref {
-        uses connection-ref;
-        leaf route-local-id {
-            type leafref {
-                path '/tapi-common:context/tapi-connectivity:connectivity-context/tapi-connectivity:connection/tapi-connectivity:route/tapi-connectivity:local-id';
-            }
-            description "none";
-        }
-        description "none";
-    }
-
-   /**************************
-    * package object-classes
-    **************************/
-    grouping connection {
-        list connection-end-point {
-            uses connection-end-point-ref;
-            key 'topology-uuid node-uuid node-edge-point-uuid connection-end-point-uuid';
-            config false;
-            min-elements 2;
-            description "none";
-        }
-        list lower-connection {
-            uses connection-ref;
-            key 'connection-uuid';
-            config false;
-            description "An Connection object supports a recursive aggregation relationship such that the internal construction of an Connection can be exposed as multiple lower level Connection objects (partitioning).
-                Aggregation is used as for the Node/Topology  to allow changes in hierarchy.
-                Connection aggregation reflects Node/Topology aggregation.
-                The FC represents a Cross-Connection in an NE. The Cross-Connection in an NE is not necessarily the lowest level of FC partitioning.";
-        }
-        list supported-client-link {
-            uses tapi-topology:link-ref;
-            key 'topology-uuid link-uuid';
-            config false;
-            description "none";
-        }
-        list route {
-            key 'local-id';
-            config false;
-            uses route;
-            description "none";
-        }
-        list switch-control {
-            key 'uuid';
-            config false;
-            uses switch-control;
-            description "none";
-        }
-        leaf direction {
-            type tapi-common:forwarding-direction;
-            config false;
-            description "none";
-        }
-        leaf layer-protocol-name {
-            type tapi-common:layer-protocol-name;
-            config false;
-            description "none";
-        }
-        uses tapi-common:resource-spec;
-        uses tapi-common:operational-state-pac;
-        description "The ForwardingConstruct (FC) object class models enabled potential for forwarding between two or more LTPs and like the LTP supports any transport protocol including all circuit and packet forms.
-            At the lowest level of recursion, a FC represents a cross-connection within an NE.";
-    }
-    grouping connection-end-point {
-        leaf layer-protocol-name {
-            type tapi-common:layer-protocol-name;
-            config false;
-            description "none";
-        }
-        leaf layer-protocol-qualifier {
-            type tapi-common:layer-protocol-qualifier;
-            config false;
-            description "none";
-        }
-        container parent-node-edge-point {
-            uses tapi-topology:node-edge-point-ref;
-            config false;
-            description "none";
-        }
-        list client-node-edge-point {
-            uses tapi-topology:node-edge-point-ref;
-            key 'topology-uuid node-uuid node-edge-point-uuid';
-            config false;
-            description "none";
-        }
-        list aggregated-connection-end-point {
-            uses connection-end-point-ref;
-            key 'topology-uuid node-uuid node-edge-point-uuid connection-end-point-uuid';
-            config false;
-            description "none";
-        }
-        leaf connection-port-direction {
-            type tapi-common:port-direction;
-            config false;
-            description "The orientation of defined flow at the EndPoint.";
-        }
-        leaf connection-port-role {
-            type tapi-common:port-role;
-            config false;
-            description "Each EP of the FC has a role (e.g., working, protection, protected, symmetric, hub, spoke, leaf, root)  in the context of the FC with respect to the FC function. ";
-        }
-        uses tapi-common:resource-spec;
-        uses tapi-common:operational-state-pac;
-        uses tapi-common:termination-pac;
-        description "The LogicalTerminationPoint (LTP) object class encapsulates the termination and adaptation functions of one or more transport layers.
-            The structure of LTP supports all transport protocols including circuit and packet forms.";
-    }
-    grouping connectivity-constraint {
-        leaf service-layer {
-            type tapi-common:layer-protocol-name;
-            description "none";
-        }
-        leaf service-type {
-            type service-type;
-            description "none";
-        }
-        leaf service-level {
-            type string;
-            description "An abstract value the meaning of which is mutually agreed – typically represents metrics such as - Class of service, priority, resiliency, availability";
-        }
-        container requested-capacity {
-            uses tapi-common:capacity;
-            description "none";
-        }
-        leaf connectivity-direction {
-            type tapi-common:forwarding-direction;
-            description "none";
-        }
-        container schedule {
-            uses tapi-common:time-range;
-            description "none";
-        }
-        container coroute-inclusion {
-            uses connectivity-service-ref;
-            description "none";
-        }
-        list diversity-exclusion {
-            uses connectivity-service-ref;
-            key 'connectivity-service-uuid';
-            description "none";
-        }
-        description "none";
-    }
-    grouping connectivity-service {
-        list end-point {
-            key 'local-id';
-            min-elements 2;
-            uses connectivity-service-end-point;
-            description "none";
-        }
-        list connection {
-            uses connection-ref;
-            key 'connection-uuid';
-            config false;
-            description "none";
-        }
-        uses tapi-common:service-spec;
-        uses connectivity-constraint;
-        uses tapi-path-computation:routing-constraint;
-        uses tapi-path-computation:topology-constraint;
-        uses resilience-constraint;
-        uses tapi-common:admin-state-pac;
-        description "The ForwardingConstruct (FC) object class models enabled potential for forwarding between two or more LTPs and like the LTP supports any transport protocol including all circuit and packet forms.
-            At the lowest level of recursion, a FC represents a cross-connection within an NE.";
-    }
-    grouping connectivity-service-end-point {
-        leaf layer-protocol-name {
-            type tapi-common:layer-protocol-name;
-            description "none";
-        }
-        leaf layer-protocol-qualifier {
-            type tapi-common:layer-protocol-qualifier;
-            description "none";
-        }
-        container service-interface-point {
-            uses tapi-common:service-interface-point-ref;
-            description "none";
-        }
-        list connection-end-point {
-            uses connection-end-point-ref;
-            key 'topology-uuid node-uuid node-edge-point-uuid connection-end-point-uuid';
-            config false;
-            description "none";
-        }
-        container capacity {
-            uses tapi-common:capacity;
-            description "none";
-        }
-        leaf direction {
-            type tapi-common:port-direction;
-            description "The orientation of defined flow at the EndPoint.";
-        }
-        leaf role {
-            type tapi-common:port-role;
-            description "Each EP of the FC has a role (e.g., working, protection, protected, symmetric, hub, spoke, leaf, root)  in the context of the FC with respect to the FC function. ";
-        }
-        leaf protection-role {
-            type protection-role;
-            description "To specify the protection role of this Port when create or update ConnectivityService.";
-        }
-        uses tapi-common:local-class;
-        uses tapi-common:admin-state-pac;
-        description "The association of the FC to LTPs is made via EndPoints.
-            The EndPoint (EP) object class models the access to the FC function.
-            The traffic forwarding between the associated EPs of the FC depends upon the type of FC and may be associated with FcSwitch object instances.
-            In cases where there is resilience the EndPoint may convey the resilience role of the access to the FC.
-            It can represent a protected (resilient/reliable) point or a protecting (unreliable working or protection) point.
-            The EP replaces the Protection Unit of a traditional protection model.
-            The ForwadingConstruct can be considered as a component and the EndPoint as a Port on that component";
-    }
-    grouping route {
-        list connection-end-point {
-            uses connection-end-point-ref;
-            key 'topology-uuid node-uuid node-edge-point-uuid connection-end-point-uuid';
-            config false;
-            min-elements 2;
-            description "none";
-        }
-        uses tapi-common:local-class;
-        description "The FC Route (FcRoute) object class models the individual routes of an FC.
-            The route of an FC object is represented by a list of FCs at a lower level.
-            Note that depending on the service supported by an FC, an the FC can have multiple routes.";
-    }
-    grouping connectivity-context {
-        list connectivity-service {
-            key 'uuid';
-            uses connectivity-service;
-            description "none";
-        }
-        list connection {
-            key 'uuid';
-            config false;
-            uses connection;
-            description "none";
-        }
-        description "none";
-    }
-    grouping switch {
-        list selected-connection-end-point {
-            uses connection-end-point-ref;
-            key 'topology-uuid node-uuid node-edge-point-uuid connection-end-point-uuid';
-            min-elements 1;
-            description "none";
-        }
-        list selected-route {
-            uses route-ref;
-            key 'connection-uuid route-local-id';
-            min-elements 1;
-            description "none";
-        }
-        leaf selection-control {
-            type selection-control;
-            description "Degree of administrative control applied to the switch selection.";
-        }
-        leaf selection-reason {
-            type selection-reason;
-            config false;
-            description "The reason for the current switch selection.";
-        }
-        leaf switch-direction {
-            type tapi-common:port-direction;
-            description "Indicates whether the switch selects from ingress to the FC or to egress of the FC, or both.";
-        }
-        uses tapi-common:local-class;
-        description "The class models the switched forwarding of traffic (traffic flow) between FcPorts (ConnectionEndPoints) and is present where there is protection functionality in the FC (Connection).
-            If an FC exposes protection (having two or more FcPorts that provide alternative identical inputs/outputs), the FC will have one or more associated FcSwitch objects to represent the alternative flow choices visible at the edge of the FC.
-            The FC switch represents and defines a protection switch structure encapsulated in the FC.
-            Essentially performs one of the functions of the Protection Group in a traditional model. It associates to 2 or more FcPorts each playing the role of a Protection Unit.
-            One or more protection, i.e. standby/backup, FcPorts provide protection for one or more working (i.e. regular/main/preferred) FcPorts where either protection or working can feed one or more protected FcPort.
-            The switch may be used in revertive or non-revertive (symmetric) mode. When in revertive mode it may define a waitToRestore time.
-            It may be used in one of several modes including source switch, destination switched, source and destination switched etc (covering cases such as 1+1 and 1:1).
-            It may be locked out (prevented from switching), force switched or manual switched.
-            It will indicate switch state and change of state.
-            The switch can be switched away from all sources such that it becomes open and hence two coordinated switches can both feed the same LTP so long as at least one of the two is switched away from all sources (is 'open').
-            The ability for a Switch to be 'high impedance' allows bidirectional ForwardingConstructs to be overlaid on the same bidirectional LTP where the appropriate control is enabled to prevent signal conflict.
-            This ability allows multiple alternate routes to be present that otherwise would be in conflict.";
-    }
-    grouping switch-control {
-        list sub-switch-control {
-            uses switch-control-ref;
-            key 'connection-uuid switch-control-uuid';
-            description "none";
-        }
-        list switch {
-            key 'local-id';
-            uses switch;
-            description "none";
-        }
-        uses tapi-common:resource-spec;
-        uses resilience-constraint;
-        description "Represents the capability to control and coordinate switches, to add/delete/modify FCs and to add/delete/modify LTPs/LPs so as to realize a protection scheme.";
-    }
-    grouping resilience-constraint {
-        container resilience-type {
-            uses tapi-topology:resilience-type;
-            description "none";
-        }
-        leaf restoration-coordinate-type {
-            type coordinate-type;
-            description " The coordination mechanism between multi-layers.";
-        }
-        leaf restore-priority {
-            type uint64;
-            description "none";
-        }
-        leaf reversion-mode {
-            type reversion-mode;
-            description "Indcates whether the protection scheme is revertive or non-revertive.";
-        }
-        leaf wait-to-revert-time {
-            type uint64;
-            default "15";
-            description "If the protection system is revertive, this attribute specifies the time, in minutes, to wait after a fault clears on a higher priority (preferred) resource before reverting to the preferred resource.";
-        }
-        leaf hold-off-time {
-            type uint64;
-            description "This attribute indicates the time, in milliseconds, between declaration of signal degrade or signal fail, and the initialization of the protection switching algorithm.";
-        }
-        leaf is-lock-out {
-            type boolean;
-            description "The resource is configured to temporarily not be available for use in the protection scheme(s) it is part of.
-                This overrides all other protection control states including forced.
-                If the item is locked out then it cannot be used under any circumstances.
-                Note: Only relevant when part of a protection scheme.";
-        }
-        leaf is-frozen {
-            type boolean;
-            description "Temporarily prevents any switch action to be taken and, as such, freezes the current state.
-                Until the freeze is cleared, additional near-end external commands are rejected and fault condition changes and received APS messages are ignored.
-                All administrative controls of any aspect of protection are rejected.";
-        }
-        leaf is-coordinated-switching-both-ends {
-            type boolean;
-            description "Is operating such that switching at both ends of each flow acorss the FC is coordinated at both ingress and egress ends.";
-        }
-        leaf max-switch-times {
-            type uint64;
-            description "Used to limit the maximum swtich times. When work fault disappears , and traffic return to the original work path, switch counter reset.";
-        }
-        leaf-list preferred-restoration-layer {
-            type tapi-common:layer-protocol-name;
-            description "Indicate which layer this resilience parameters package configured for.";
-        }
-        description "A list of control parameters to apply to a switch.";
-    }
-    grouping cep-list {
-        list connection-end-point {
-            key 'uuid';
-            uses connection-end-point;
-            description "none";
-        }
-        description "none";
-    }
-
-   /**************************
-    * package type-definitions
-    **************************/
-    typedef service-type {
-        type enumeration {
-            enum POINT_TO_POINT_CONNECTIVITY {
-                description "none";
-            }
-            enum POINT_TO_MULTIPOINT_CONNECTIVITY {
-                description "none";
-            }
-            enum MULTIPOINT_CONNECTIVITY {
-                description "none";
-            }
-            enum ROOTED_MULTIPOINT_CONNECTIVITY {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    typedef reversion-mode {
-        type enumeration {
-            enum REVERTIVE {
-                description "An FC switched to a lower priority (non-preferred) resource will revert to a higher priority (preferred) resource when that recovers (potentially after some hold-off time).";
-            }
-            enum NON-REVERTIVE {
-                description "An FC switched to a lower priority (non-preferred) resource will not revert to a higher priority (preferred) resource when that recovers.";
-            }
-        }
-        description "The reversion mode associated with protection.";
-    }
-    typedef selection-control {
-        type enumeration {
-            enum LOCK_OUT {
-                description "The resource is configured to temporarily not be available for use in the protection scheme(s) it is part of.
-                    This overrides all other protection control states including forced.
-                    If the item is locked out then it cannot be used under any circumstances.
-                    Note: Only relevant when part of a protection scheme.";
-            }
-            enum NORMAL {
-                description "none";
-            }
-            enum MANUAL {
-                description "none";
-            }
-            enum FORCED {
-                description "none";
-            }
-        }
-        description "Possible degrees of administrative control applied to the Route selection.";
-    }
-    typedef selection-reason {
-        type enumeration {
-            enum LOCKOUT {
-                description "none";
-            }
-            enum NORMAL {
-                description "none";
-            }
-            enum MANUAL {
-                description "none";
-            }
-            enum FORCED {
-                description "none";
-            }
-            enum WAIT_TO_REVERT {
-                description "none";
-            }
-            enum SIGNAL_DEGRADE {
-                description "none";
-            }
-            enum SIGNAL_FAIL {
-                description "none";
-            }
-        }
-        description "The cause of the current route selection.";
-    }
-    typedef coordinate-type {
-        type enumeration {
-            enum NO_COORDINATE {
-                description "none";
-            }
-            enum HOLD_OFF_TIME {
-                description "none";
-            }
-            enum WAIT_FOR_NOTIFICATION {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    typedef protection-role {
-        type enumeration {
-            enum WORK {
-                description "none";
-            }
-            enum PROTECT {
-                description "none";
-            }
-            enum PROTECTED {
-                description "none";
-            }
-            enum NA {
-                description "none";
-            }
-            enum WORK_RESTORE {
-                description "none";
-            }
-            enum PROTECT_RESTORE {
-                description "none";
-            }
-        }
-        description "none";
-    }
-
-   /**************************
-    * package interfaces
-    **************************/
-    rpc get-connection-details {
-        description "none";
-        input {
-            leaf connection-id-or-name {
-                type string;
-                description "none";
-            }
-        }
-        output {
-            container connection {
-                uses connection;
-                description "none";
-            }
-        }
-    }
-    rpc get-connectivity-service-list {
-        description "none";
-        output {
-            list service {
-                key 'uuid';
-                uses connectivity-service;
-                description "none";
-            }
-        }
-    }
-    rpc get-connectivity-service-details {
-        description "none";
-        input {
-            leaf service-id-or-name {
-                type string;
-                description "none";
-            }
-        }
-        output {
-            container service {
-                uses connectivity-service;
-                description "none";
-            }
-        }
-    }
-    rpc create-connectivity-service {
-        description "none";
-        input {
-            list end-point {
-                key 'local-id';
-                min-elements 2;
-                uses connectivity-service-end-point;
-                description "none";
-            }
-            container connectivity-constraint {
-                uses connectivity-constraint;
-                description "none";
-            }
-            container routing-constraint {
-                uses tapi-path-computation:routing-constraint;
-                description "none";
-            }
-            container topology-constraint {
-                uses tapi-path-computation:topology-constraint;
-                description "none";
-            }
-            container resilience-constraint {
-                uses resilience-constraint;
-                description "none";
-            }
-            leaf state {
-                type string;
-                description "none";
-            }
-        }
-        output {
-            container service {
-                uses connectivity-service;
-                description "none";
-            }
-        }
-    }
-    rpc update-connectivity-service {
-        description "none";
-        input {
-            leaf service-id-or-name {
-                type string;
-                description "none";
-            }
-            list end-point {
-                key 'local-id';
-                uses connectivity-service-end-point;
-                description "none";
-            }
-            container connectivity-constraint {
-                uses connectivity-constraint;
-                description "none";
-            }
-            container routing-constraint {
-                uses tapi-path-computation:routing-constraint;
-                description "none";
-            }
-            container topology-constraint {
-                uses tapi-path-computation:topology-constraint;
-                description "none";
-            }
-            container resilience-constraint {
-                uses resilience-constraint;
-                description "none";
-            }
-            leaf state {
-                type string;
-                description "none";
-            }
-        }
-        output {
-            container service {
-                uses connectivity-service;
-                description "none";
-            }
-        }
-    }
-    rpc delete-connectivity-service {
-        description "none";
-        input {
-            leaf service-id-or-name {
-                type string;
-                description "none";
-            }
-        }
-    }
-    rpc get-connection-end-point-details {
-        description "none";
-        input {
-            leaf topology-id-or-name {
-                type string;
-                description "none";
-            }
-            leaf node-id-or-name {
-                type string;
-                description "none";
-            }
-            leaf nep-id-or-name {
-                type string;
-                description "none";
-            }
-            leaf cep-id-or-name {
-                type string;
-                description "none";
-            }
-        }
-        output {
-            container connection-end-point {
-                uses connection-end-point;
-                description "none";
-            }
-        }
-    }
-}
diff --git a/tapimodels/src/main/yang/tapi-dsr@2018-12-10.yang b/tapimodels/src/main/yang/tapi-dsr@2018-12-10.yang
deleted file mode 100644 (file)
index d9cc0bc..0000000
+++ /dev/null
@@ -1,225 +0,0 @@
-module tapi-dsr {
-    namespace "urn:onf:otcc:yang:tapi-dsr";
-    prefix tapi-dsr;
-    import tapi-common {
-        prefix tapi-common;
-    }
-    organization "ONF OTCC (Open Transport Configuration & Control) Project";
-    contact "
-         Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>
-         Project List: <mailto:transport-api@opennetworking.org>
-         Editor: Karthik Sethuraman
-                 <mailto:karthik.sethuraman@necam.com>";
-    description "
-        This module contains TAPI DSR Model definitions.
-        Source: TapiDsr.uml
-        - The TAPI YANG models included in this TAPI release are a *normative* part of the TAPI SDK.
-        - The YANG specifications have been generated from the corresponding UML model using the [ONF EAGLE UML2YANG mapping tool]
-          <https://github.com/OpenNetworkingFoundation/EagleUmlYang>
-          and further edited manually to comply with the [ONF IISOMI UML2YANG mapping guidelines]
-          <https://wiki.opennetworking.org/display/OIMT/UML+-+YANG+Guidelines>
-        - Status of YANG model artifacts can be determined by referring to the corresponding UML artifacts.
-          As described in the UML models, some artifacts are considered *experimental*, and thus the corresponding YANG artifacts.
-        - The ONF TAPI release process does not guarantee backward compatibility of YANG models across major versions of TAPI releases.
-          The YANG model backward compatibility criteria are outlined in section 11 of <https://tools.ietf.org/html/rfc7950>.
-          YANG models included in this release may not be backward compatible with previous TAPI releases.
-        Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.
-        License: This module is distributed under the Apache License 2.0";
-    revision 2018-12-10 {
-        description "ONF Transport API version 2.1.1.
-                   Changes included in this TAPI release (v2.1.1) are listed in
-                   <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.1.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
-    }
-    revision 2018-10-16 {
-        description "ONF Transport API version 2.1.0.
-                   Changes included in this TAPI release (v2.1.0) are listed in
-                   <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
-    }
-    revision 2018-03-07 {
-        description "ONF Transport API version 2.0.2
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";
-    }
-    revision 2018-02-16 {
-        description "ONF Transport API version 2.0.1
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";
-    }
-    revision 2018-01-02 {
-        description "ONF Transport API version 2.0.0
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";
-    }
-
-   /**************************
-    * package type-definitions
-    **************************/
-    identity DIGITAL_SIGNAL_TYPE {
-        base tapi-common:LAYER_PROTOCOL_QUALIFIER;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_GigE {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_10_GigE_LAN {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_10_GigE_WAN {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_40_GigE {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_100_GigE {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_FC_100 {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_FC_200 {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_FC_400 {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_FC_800 {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_FC_1200 {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_FC_1600 {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_FC_3200 {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_STM_1 {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_STM_4 {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_STM_16 {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_STM_64 {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_STM_256 {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_OC_3 {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_OC_12 {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_OC_48 {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_OC_192 {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_OC_768 {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_OTU_1 {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_OTU_2 {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_OTU_2E {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_OTU_3 {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_OTU_4 {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_GPON {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_XGPON {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_IB_SDR {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_IB_DDR {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_IB_QDR {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_SBCON_ESCON {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_DVB_ASI {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_SDI {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_SDI_1G5 {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    identity DIGITAL_SIGNAL_TYPE_SDI_3G {
-        base DIGITAL_SIGNAL_TYPE;
-        description "none";
-    }
-    typedef digital-signal-type {
-        type identityref {
-            base DIGITAL_SIGNAL_TYPE;
-        }
-        description "none";
-    }
-}
diff --git a/tapimodels/src/main/yang/tapi-eth@2018-12-10.yang b/tapimodels/src/main/yang/tapi-eth@2018-12-10.yang
deleted file mode 100644 (file)
index fdca157..0000000
+++ /dev/null
@@ -1,1904 +0,0 @@
-module tapi-eth {
-    namespace "urn:onf:otcc:yang:tapi-eth";
-    prefix tapi-eth;
-    import tapi-common {
-        prefix tapi-common;
-    }
-    import tapi-topology {
-        prefix tapi-topology;
-    }
-    import tapi-connectivity {
-        prefix tapi-connectivity;
-    }
-    import tapi-oam {
-        prefix tapi-oam;
-    }
-    organization "ONF OTCC (Open Transport Configuration & Control) Project";
-    contact "
-         Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>
-         Project List: <mailto:transport-api@opennetworking.org>
-         Editor: Karthik Sethuraman
-                 <mailto:karthik.sethuraman@necam.com>";
-    description "This module contains TAPI ETH Model definitions.
-        Source: TapiEth.uml
-        - The TAPI YANG models included in this TAPI release are a *normative* part of the TAPI SDK.
-        - The YANG specifications have been generated from the corresponding UML model using the [ONF EAGLE UML2YANG mapping tool]
-          <https://github.com/OpenNetworkingFoundation/EagleUmlYang>
-          and further edited manually to comply with the [ONF IISOMI UML2YANG mapping guidelines]
-          <https://wiki.opennetworking.org/display/OIMT/UML+-+YANG+Guidelines>
-        - Status of YANG model artifacts can be determined by referring to the corresponding UML artifacts.
-          As described in the UML models, some artifacts are considered *experimental*, and thus the corresponding YANG artifacts.
-        - The ONF TAPI release process does not guarantee backward compatibility of YANG models across major versions of TAPI releases.
-          The YANG model backward compatibility criteria are outlined in section 11 of <https://tools.ietf.org/html/rfc7950>.
-          YANG models included in this release may not be backward compatible with previous TAPI releases.
-        Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.
-        License: This module is distributed under the Apache License 2.0";
-    revision 2018-12-10 {
-        description "ONF Transport API version 2.1.1.
-                   Changes included in this TAPI release (v2.1.1) are listed in
-                   <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.1.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
-    }
-    revision 2018-10-16 {
-        description "ONF Transport API version 2.1.0.
-                   Changes included in this TAPI release (v2.1.0) are listed in
-                   <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
-    }
-    revision 2018-03-07 {
-        description "ONF Transport API version 2.0.2
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";
-    }
-    revision 2018-02-16 {
-        description "ONF Transport API version 2.0.1
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";
-    }
-    revision 2018-01-02 {
-        description "ONF Transport API version 2.0.0
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";
-    }
-    augment "/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:cep-list/tapi-connectivity:connection-end-point" {
-        container eth-connection-end-point-spec {
-            uses eth-connection-end-point-spec;
-            description "Augments the base LayerProtocol information in ConnectionEndPoint with ETH-specific information";
-        }
-        description "Augments the base LayerProtocol information in ConnectionEndPoint with ETH-specific information";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job" {
-        container eth-loopback-job {
-            uses eth-loopback-job;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:meg" {
-        container eth-meg-spec {
-            uses eth-meg-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:meg/tapi-oam:mep" {
-        container eth-mep-spec {
-            uses eth-mep-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:meg/tapi-oam:mip" {
-        container eth-mip-spec {
-            uses eth-mip-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job" {
-        container eth-pro-active-2way-measurement-job {
-            uses eth-pro-active-2way-measurement-job;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job" {
-        container eth-link-trace-job {
-            uses eth-link-trace-job;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job" {
-        container eth-test-job {
-            uses eth-test-job;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job" {
-        container eth-pro-active-1way-measurement-job {
-            uses eth-pro-active-1way-measurement-job;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data" {
-        container eth-pro-active-dm-performance-data {
-            uses eth-pro-active-dm-performance-data;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {
-        container eth-pro-active-dm-performance-data {
-            uses eth-pro-active-dm-performance-data;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data" {
-        container eth-pro-active-lm-performance-data {
-            uses eth-pro-active-lm-performance-data;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {
-        container eth-pro-active-lm-performance-data {
-            uses eth-pro-active-lm-performance-data;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data" {
-        container eth-on-demand-dm-performance-data {
-            uses eth-on-demand-dm-performance-data;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data" {
-        container eth-on-demand-1-lm-performance-data {
-            uses eth-on-demand-1-lm-performance-data;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data" {
-        container eth-on-demand-1-dm-performance-data {
-            uses eth-on-demand-1-dm-performance-data;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data" {
-        container eth-pro-active-1-dm-performance-data {
-            uses eth-pro-active-1-dm-performance-data;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {
-        container eth-pro-active-1-dm-performance-data {
-            uses eth-pro-active-1-dm-performance-data;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data" {
-        container eth-pro-active-1-lm-performance-data {
-            uses eth-pro-active-1-lm-performance-data;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {
-        container eth-pro-active-1-lm-performance-data {
-            uses eth-pro-active-1-lm-performance-data;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job" {
-        container eth-on-demand-1way-measurement-job {
-            uses eth-on-demand-1way-measurement-job;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job" {
-        container eth-on-demand-2way-measurement-job {
-            uses eth-on-demand-2way-measurement-job;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {
-        container eth-on-demand-1-dm-performance-data {
-            uses eth-on-demand-1-dm-performance-data;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {
-        container eth-on-demand-1-lm-performance-data {
-            uses eth-on-demand-1-lm-performance-data;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {
-        container eth-on-demand-dm-performance-data {
-            uses eth-on-demand-dm-performance-data;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data" {
-        container eth-on-demand-lm-performance-data {
-            uses eth-on-demand-lm-performance-data;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data" {
-        container eth-on-demand-lm-performance-data {
-            uses eth-on-demand-lm-performance-data;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-profile/tapi-oam:pm-threshold-data" {
-        container eth-1-dm-threshold-data {
-            uses eth-1-dm-threshold-data;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-profile/tapi-oam:pm-threshold-data" {
-        container eth-1-lm-threshold-data {
-            uses eth-1-lm-threshold-data;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-profile/tapi-oam:pm-threshold-data" {
-        container eth-dm-threshold-data {
-            uses eth-dm-threshold-data;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-profile/tapi-oam:pm-threshold-data" {
-        container eth-lm-threshold-data {
-            uses eth-lm-threshold-data;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data" {
-        container eth-link-trace-result-data {
-            uses eth-link-trace-result-data;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data" {
-        container eth-test-result-data {
-            uses eth-test-result-data;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data" {
-        container eth-loopback-result-data {
-            uses eth-loopback-result-data;
-            description "none";
-        }
-        description "none";
-    }
-
-   /**************************
-    * package object-classes
-    **************************/
-    grouping eth-ctp-pac {
-        leaf-list auxiliary-function-position-sequence {
-            type uint64;
-            description "This attribute indicates the positions (i.e., the relative order) of all the MEP, MIP, and TCS objects which are associated with the CTP.";
-        }
-        leaf vlan-config {
-            type uint64;
-            description "This attribute models the ETHx/ETH-m_A_So_MI_Vlan_Config information defined in G.8021.
-                range of type : -1, 0, 1..4094";
-        }
-        leaf csf-rdi-fdi-enable {
-            type boolean;
-            description "This attribute models the MI_CSFrdifdiEnable information defined in G.8021.";
-        }
-        leaf csf-report {
-            type boolean;
-            description "This attribute models the MI_CSF_Reported information defined in G.8021.
-                range of type : true, false";
-        }
-        leaf-list filter-config-snk {
-            type mac-address;
-            description "This attribute models the FilteConfig MI defined in 8.3/G.8021. It indicates the configured filter action for each of the 33 group MAC addresses for control frames. The 33 MAC addresses are:
-                01-80-C2-00-00-10,
-                01-80-C2-00-00-00 to 01-80-C2-00-00-0F, and
-                01-80-C2-00-00-20 to 01-80-C2-00-00-2F.
-                The filter action is Pass or Block.
-                If the destination address of the incoming ETH_CI_D matches one of the above addresses, the filter process shall perform the corresponding configured filter action.
-                If none of the above addresses match, the ETH_CI_D is passed.";
-        }
-        leaf mac-length {
-            type uint64;
-            default "2000";
-            description "This attribute models the MAC_Lenght MI defined in 8.6/G.8021 for the MAC Length Check process. It indicates the allowed maximum frame length in bytes.
-                range of type : 1518, 1522, 2000";
-        }
-        container filter-config {
-            uses control-frame-filter;
-            description "This attribute models the FilterConfig MI defined in section 8.3/G.8021. It indicates the configured filter action for each of the 33 group MAC addresses for control frames. The 33 MAC addresses are:
-                - All bridges address: 01-80-C2-00-00-10,
-                - Reserved addresses: 01-80-C2-00-00-00 to 01-80-C2-00-00-0F,
-                - GARP Application addresses: 01-80-C2-00-00-20 to 01-80-C2-00-00-2F.
-                The filter action is Pass or Block.
-                If the destination address of the incoming ETH_CI_D matches one of the above addresses, the filter process shall perform the corresponding configured filter action.
-                If none of the above addresses match, the ETH_CI_D is passed.";
-        }
-        leaf is-ssf-reported {
-            type boolean;
-            description "This attribute provisions whether the SSF defect should be reported as fault cause or not.
-                It models the ETH-LAG_FT_Sk_MI_SSF_Reported defined in G.8021.";
-        }
-        leaf pll-thr {
-            type uint64;
-            description "This attribute provisions the threshold for the number of active ports. If the number of active ports is more than zero but less than the provisioned threshold, a cPLL (Partial Link Loss) is raised. See section 9.7.1.2 of G.8021.
-                range of type : 0..number of ports";
-        }
-        leaf actor-oper-key {
-            type uint64;
-            config false;
-            description "See 802.1AX:
-                The current operational value of the Key for the Aggregator. The administrative Key value may differ from the operational Key value for the reasons discussed in 5.6.2.
-                The meaning of particular Key values is of local significance.
-                range of type : 16 bit";
-        }
-        leaf actor-system-id {
-            type mac-address;
-            description "See 802.1AX:
-                A MAC address used as a unique identifier for the System that contains this Aggregator.";
-        }
-        leaf actor-system-priority {
-            type uint64;
-            description "See 802.1AX:
-                Indicating the priority associated with the Actors System ID.
-                range of type : 2-octet";
-        }
-        leaf collector-max-delay {
-            type uint64;
-            description "See 802.1AX:
-                The value of this attribute defines the maximum delay, in tens of microseconds, that may be imposed by the Frame Collector between receiving a frame from an Aggregator Parser, and either delivering the frame to its MAC Client or discarding the frame (see IEEE 802.1AX clause 5.2.3.1.1).
-                range of type : 16-bit";
-        }
-        leaf data-rate {
-            type uint64;
-            config false;
-            description "See 802.1AX:
-                The current data rate, in bits per second, of the aggregate link. The value is calculated as N times the data rate of a single link in the aggregation, where N is the number of active links.";
-        }
-        leaf partner-oper-key {
-            type uint64;
-            config false;
-            description "See 802.1AX:
-                The current operational value of the Key for the Aggregators current protocol Partner. If the aggregation is manually configured, this Key value will be a value assigned by the local System.
-                range of type : 16-bit";
-        }
-        leaf partner-system-id {
-            type mac-address;
-            config false;
-            description "See 802.1AX:
-                A MAC address consisting of the unique identifier for the current protocol Partner of this Aggregator. A value of zero indicates that there is no known Partner. If the aggregation is manually configured, this System ID value will be a value assigned by the local System.";
-        }
-        leaf partner-system-priority {
-            type uint64;
-            config false;
-            description "See 802.1AX:
-                Indicates the priority associated with the Partners System ID. If the aggregation is manually configured, this System Priority value will be a value assigned by the local System.
-                range of type : 2-octet";
-        }
-        leaf csf-config {
-            type csf-config;
-            description "This attribute models the combination of all CSF related MI signals (MI_CSF_Enable, MI_CSFrdifdi_Enable, MI_CSFdci_Enable) as defined in G.8021.
-                range of type : true, false";
-        }
-        container traffic-shaping {
-            uses traffic-shaping-pac;
-            description "none";
-        }
-        container traffic-conditioning {
-            uses traffic-conditioning-pac;
-            description "none";
-        }
-        description "none";
-    }
-    grouping eth-connection-end-point-spec {
-        container ety-term {
-            uses ety-termination-pac;
-            description "none";
-        }
-        container eth-term {
-            uses eth-termination-pac;
-            description "none";
-        }
-        container eth-ctp {
-            uses eth-ctp-pac;
-            description "none";
-        }
-        description "none";
-    }
-    grouping eth-termination-pac {
-        container priority-regenerate {
-            uses priority-mapping;
-            description "This attribute models the ETHx/ETH-m _A_Sk_MI_P_Regenerate information defined in G.8021.";
-        }
-        leaf ether-type {
-            type vlan-type;
-            description "This attribute models the ETHx/ETH-m _A_Sk_MI_Etype information defined in G.8021.";
-        }
-        leaf-list filter-config-1 {
-            type mac-address;
-            description "This attribute models the ETHx/ETH-m_A_Sk_MI_Filter_Config information defined in G.8021.
-                It indicates the configured filter action for each of the 33 group MAC addresses for control frames.
-                The 33 MAC addresses are:
-                01-80-C2-00-00-10,
-                01-80-C2-00-00-00 to 01-80-C2-00-00-0F, and
-                01-80-C2-00-00-20 to 01-80-C2-00-00-2F.
-                The filter action is Pass or Block.
-                If the destination address of the incoming ETH_CI_D matches one of the above addresses, the filter process shall perform the corresponding configured filter action.
-                If none of the above addresses match, the ETH_CI_D is passed.
-                range of type : MacAddress:
-                01-80-C2-00-00-10,
-                01-80-C2-00-00-00 to
-                01-80-C2-00-00-0F, and
-                01-80-C2-00-00-20 to
-                01-80-C2-00-00-2F;
-                ActionEnum:
-                PASS, BLOCK";
-        }
-        leaf frametype-config {
-            type frame-type;
-            description "This attribute models the ETHx/ETH-m_A_Sk_MI_Frametype_Config information defined in G.8021.
-                range of type : see Enumeration";
-        }
-        leaf port-vid {
-            type vid;
-            default "1";
-            description "This attribute models the ETHx/ETH-m _A_Sk_MI_PVID information defined in G.8021.";
-        }
-        leaf priority-code-point-config {
-            type pcp-coding;
-            description "This attribute models the ETHx/ETH-m _A_Sk_MI_PCP_Config information defined in G.8021.
-                range of type : see Enumeration";
-        }
-        description "This object class models the Ethernet Flow Termination function located at a layer boundary.";
-    }
-    grouping ety-termination-pac {
-        leaf is-fts-enabled {
-            type boolean;
-            description "This attribute indicates whether Forced Transmitter Shutdown (FTS) is enabled or not. It models the ETYn_TT_So_MI_FTSEnable information.";
-        }
-        leaf is-tx-pause-enabled {
-            type boolean;
-            description "This attribute identifies whether the Transmit Pause process is enabled or not. It models the MI_TxPauseEnable defined in G.8021.";
-        }
-        leaf phy-type {
-            type ety-phy-type;
-            config false;
-            description "This attribute identifies the PHY type of the ETY trail termination. See IEEE 802.3 clause 30.3.2.1.2.";
-        }
-        leaf-list phy-type-list {
-            type ety-phy-type;
-            config false;
-            description "This attribute identifies the possible PHY types that could be supported at the ETY trail termination. See IEEE 802.3 clause 30.3.2.1.3.";
-        }
-        description "none";
-    }
-    grouping traffic-conditioning-pac {
-        list prio-config-list {
-            key 'queue-id';
-            config false;
-            uses priority-configuration;
-            description "This attribute indicates the Priority Splitter function for the mapping of the Ethernet frame priority (ETH_CI_P) values to the output queue.";
-        }
-        list cond-config-list {
-            key 'queue-id';
-            config false;
-            uses traffic-conditioning-configuration;
-            description "This attribute indicates for the conditioner process the conditioning parameters:
-                - Queue ID: Indicates the Queue ID
-                - Committed Information Rate (CIR): number of bits per second
-                - Committed Burst Size (CBS): number of bytes
-                - Excess Information Rate (EIR): number of bits per second
-                - Excess Burst Size (EBS): number of bytes
-                - Coupling flag (CF): 0 or 1
-                - Color mode (CM): color-blind and color-aware.";
-        }
-        leaf codirectional {
-            type boolean;
-            config false;
-            description "This attribute indicates the direction of the conditioner. The value of true means that the conditioner (modeled as a TCS Sink according to G.8021) is associated with the sink part of the containing CTP. The value of false means that the conditioner (modeled as a TCS Sink according to G.8021) is associated with the source part of the containing CTP.";
-        }
-        description "This object class models the ETH traffic conditioning function as defined in G.8021.
-            Basic attributes: codirectional, condConfigList, prioConfigList";
-    }
-    grouping traffic-shaping-pac {
-        list prio-config-list {
-            key 'queue-id';
-            config false;
-            uses priority-configuration;
-            description "This attribute configures the Priority Splitter function for the mapping of the Ethernet frame priority (ETH_CI_P) values to the output queue.";
-        }
-        list queue-config-list {
-            key 'queue-id';
-            config false;
-            uses queue-configuration;
-            description "This attribute configures the Queue depth and Dropping threshold parameters of the Queue process. The Queue depth sets the maximum size of the queue in bytes. An incoming ETH_CI traffic unit is dropped if there is insufficient space in the queue to hold the whole unit. The Dropping threshold sets the threshold of the queue. If the queue is filled beyond this threshold, incoming ETH_CI traffic units accompanied by the ETH_CI_DE signal set are dropped.";
-        }
-        leaf sched-config {
-            type scheduling-configuration;
-            config false;
-            description "This attribute configures the scheduler process. The value of this attribute is for further study because it is for further study in G.8021.
-                Scheduler is a pointer to a Scheduler object, which is to be defined in the future (because in G.8021, this is FFS).
-                Note that the only significance of the GTCS function defined in G.8021 is the use of a common scheduler for shaping. Given that, G.8052 models the common scheduler feature by having a common value for this attribute.";
-        }
-        leaf codirectional {
-            type boolean;
-            config false;
-            description "This attribute indicates the direction of the shaping function. The value of true means that the shaping (modeled as a TCS Source according to G.8021) is associated with the source part of the containing CTP. The value of false means that the shaping (modeled as a TCS Source according to G.8021) is associated with the sink part of the containing CTP.";
-        }
-        description "This object class models the ETH traffic shaping function as defined in G.8021.
-            Basic attribute: codirectional, prioConfigList, queueConfigList, schedConfig";
-    }
-    grouping eth-meg-spec {
-        leaf client-mel {
-            type uint64;
-            description "none";
-        }
-        description "none";
-    }
-    grouping eth-mep-spec {
-        container eth-mep-common {
-            uses eth-mep-common;
-            description "none";
-        }
-        container eth-mep-source-pac {
-            uses eth-mep-source;
-            description "none";
-        }
-        container eth-mep-sink {
-            uses eth-mep-sink;
-            description "none";
-        }
-        description "none";
-    }
-    grouping eth-mip-spec {
-        leaf mip-mac {
-            type mac-address;
-            config false;
-            description "This attribute contains the MAC address of the MIP instance.";
-        }
-        leaf is-full-mip {
-            type boolean;
-            config false;
-            description "This attribute indicates whether the MIP is a full MIP (true) or a down-half MIP (false).";
-        }
-        description "none";
-    }
-    grouping eth-loopback-job {
-        container eth-lb-msg {
-            uses eth-oam-msg-common-pac;
-            description "none";
-        }
-        leaf number {
-            type uint64;
-            description "G.8052: This parameter specifies how many LB messages to be sent for the LB_Series process.";
-        }
-        description "This class represents the Loopback (LB) process (send a series of LB messages carrying a test pattern to a particular MEP). The termination occurs at specified stop time (schedule attribute of OamJob).
-            This class models also the 'loopback discover' process, when destinationAddress is multicast.
-            When number is greater than 1, then the process is to perform a Loopback (LB) Series process (send a series of N LB messages to a particular MEP/MIP. ";
-    }
-    grouping eth-mep-common {
-        leaf mep-mac {
-            type mac-address;
-            config false;
-            description "This attribute contains the MAC Address of the MEP.";
-        }
-        leaf is-cc-enabled {
-            type boolean;
-            description "This attribute models the MI_CC_Enable signal defined in G.8021 and configured as specified in G8051.";
-        }
-        leaf cc-period {
-            type oam-period;
-            description "This attribute models the MI_CC_Period signal defined in G.8021 and configured as specified in G8051.
-                It is the period at which the CCM message should be sent.
-                Default values are: 3.33 ms for PS, 100 ms for PM, 1 s for FM.";
-        }
-        leaf cc-priority {
-            type uint64 {
-                range "0..7";
-            }
-            default "7";
-            description "This attribute models the MI_CC_Pri signal defined in G.8021 and configured as specified in G8051. It is the priority at which the CCM message should be sent.";
-        }
-        leaf lck-period {
-            type oam-period;
-            description "This attribute models the MI_LCK_Period signal defined in G.8021 and configured as specified in G8051. It is the frequency at which the LCK messages should be sent.
-                range of type : 1s, 1min";
-        }
-        leaf lck-priority {
-            type uint64 {
-                range "0..7";
-            }
-            default "7";
-            description "This attribute models the MI_LCK_Pri signal defined in G.8021 and configured as specified in G8051. It is the priority at which the LCK messages should be sent.";
-        }
-        description "Basic attributes: adminState, clientMel, megIdentifier, mepMac
-            Continuity Check Process related attributes: ccPeriod, ccPriority, isCcEnabled
-            Lock Process related attributes: lckPeriod, lckPriority
-            This object class models the MEP functions that are common to MEP Sink and MEP Source.";
-    }
-    grouping eth-mep-sink {
-        leaf-list dm-1-priority {
-            type uint64;
-            description "This attribute indicates the list of 1DM priorities for the MepSink.";
-        }
-        leaf ais-priority {
-            type uint64 {
-                range "0..7";
-            }
-            default "7";
-            description "This attribute models the MI_AIS_Pri signal defined in G.8021 and configured as specified in G8051. It is the priority at which the AIS messages should be sent.";
-        }
-        leaf ais-period {
-            type oam-period;
-            description "This attribute models the MI_AIS_Period signal defined in G.8021 and configured as specified in G8051. It is the frequency at which the AIS messages should be sent.
-                range of type : 1s, 1min";
-        }
-        leaf is-csf-reported {
-            type boolean;
-            default "true";
-            description "This attribute models the MI_CSF_Reported signal defined in G.8021 and configured as specified in G8051. It configures whether the secondary failure CSF should be reported or not.";
-        }
-        leaf is-csf-rdi-fdi-enabled {
-            type boolean;
-            default "true";
-            description "This attribute models the MI_CSFrdifdiEnable signal defined in G.8021 and configured as specified in G8051.";
-        }
-        container bandwidth-report {
-            config false;
-            uses bandwidth-report;
-            description "This attribute models the content of the bandwidth report received by the MEP Sink from the peer MEP Source.";
-        }
-        leaf lm-degm {
-            type uint64;
-            default "10";
-            description "This attribute defines the number of consecutive bad seconds necessary for the 'degraded' detection. See also section 'Degraded signal defect (dDEG)' in G.8021.";
-        }
-        leaf lm-deg-thr {
-            type uint64;
-            default "30";
-            description "This attribute defines the threshold for declaring a 'bad second'. See also section 'Degraded signal defect (dDEG)' in G.8021.";
-        }
-        leaf lm-m {
-            type uint64 {
-                range "2..10";
-            }
-            default "10";
-            description "This attribute defines the number of consecutive good seconds necessary for the clearing of 'degraded'. See also section 'Degraded signal defect (dDEG)' in G.8021.";
-        }
-        leaf lm-tf-min {
-            type uint64;
-            description "This attribute defines the necessary number of transmitted frames to enable the detection of 'bad seconds'. See also section 'Degraded signal defect (dDEG)' in G.8021.";
-        }
-        description "1DM related attribute: 1DmPriority
-            AIS Process related attributes: aisPeriod, aisPriority
-            Bandwidth notification Process related attribute: bandwidthReport
-            Basic attribute: peerMepRefList
-            CSF Process related attributes: isCsfRdiFdiEnabled, isCsfReported
-            Defect correlation Process related attribute: currentProblemList
-            This object class models the MEP sink function. Instance of this object class can be created and contained by ETH CTP or TTP objects.
-            It also provides the management of the dual-ended maintenance job, such as test.
-            This object contains the configuration parameters for detecting 'degraded signal' (DEG).";
-    }
-    grouping eth-mep-source {
-        leaf aps-priority {
-            type uint64 {
-                range "0..7";
-            }
-            default "7";
-            description "This attribute specifies the priority of the APS messages.
-                See section 8.1.5    APS insert process in G.8021.";
-        }
-        leaf csf-priority {
-            type uint64 {
-                range "0..7";
-            }
-            default "7";
-            description "This attribute models the MI_CSF_Pri signal defined in G.8021 and configured as specified in G8051. It is the priority at which the CSF messages should be sent";
-        }
-        leaf csf-period {
-            type oam-period;
-            description "This attribute models the MI_CSF_Period signal defined in G.8021 and configured as specified in G8051. It is the period at which the CSF messages should be sent.
-                range of type : 1s, 1min";
-        }
-        leaf csf-config {
-            type csf-config;
-            description "This attribute models the combination of all CSF related MI signals (MI_CSF_Enable, MI_CSFrdifdi_Enable, MI_CSFdci_Enable) as defined in G.8021.";
-        }
-        description "APS Process related attribute: apsPriority
-            Basic attribute: mepIdentifier
-            CSF Process related attributes: csfConfig, csfPeriod, csfPriority
-            Link trace related operation: linkTrace
-            Loopback related operations: loopbackDiscover, loopbackSeries, loopbackTest, loopbackTestTerminate
-            On demand measurement job control related operation: establishOnDemandDualEndedMeasurementJobSource
-            Proactive measurement job control related operation: establishProActiveDualEndedMeasurementJobSource
-            Test related operations: testInitiatorStart, testInitiatorTerminate
-            This object class models the MEP source function. Instance of this object class can be created and contained by ETH CTP or TTP objects.
-            It also provides the management of single-ended maintenance jobs, such as loopback test, loopback discover, loopback series, link trace, and dual-ended maintenance job, such as test.";
-    }
-    grouping eth-link-trace-job {
-        container eth-lt-msg {
-            uses eth-oam-operation-common-pac;
-            description "none";
-        }
-        leaf time-to-live {
-            type uint64;
-            description "G.8052: This parameter provides the Time To Live (TTL) parameter of the Link Track protocol.
-                The TTL parameter allows the receiver (MIP or MEP) of the LTM frame to determine if the frame can be terminated. TTL is decremented every time the LTM frame is relayed. LTM frame with TTL<=1 is terminated and not relayed.";
-        }
-        description "This class represents the Link Trace (LT) process for fault localization or for discovering the intermediate MIPs along the link from the MEP Source to a target MEP or MIP. An LTM frame will be sent from the MEP source to the target MEP/MIP.
-            The termination occurs at specified stop time (schedule attribute of OamJob).";
-    }
-    grouping eth-test-job {
-        container eth-test-msg {
-            uses eth-oam-msg-common-pac;
-            description "none";
-        }
-        description "This class represents the 1-way on-demand in-service or out-of-service diagnostic test. The diagnostic test includes verifying bandwidth throughput, frame loss, bit errors, etc. TST frames are transmitted.
-            The termination occurs at specified stop time (schedule attribute of OamJob).";
-    }
-    grouping eth-on-demand-measurement-job-control-sink {
-        leaf responder-mep-id {
-            type string;
-            description "none";
-        }
-        leaf source-address {
-            type mac-address;
-            description "This attribute contains the MAC address of the peer MEP. See G.8013 for details.";
-        }
-        leaf priority {
-            type uint64;
-            default "7";
-            description "This attribute contains the priority of the OAM PDU frames.
-                range of type : 0, 1, 2, 3, 4, 5, 6, 7";
-        }
-        leaf test-identifier {
-            type uint64;
-            description "This attribute is used to distinguish each measurement session if multiple measurement sessions are simultaneously activated towards a peer MEP including concurrent on-demand and proactive tests. It must be unique at least within the context of any measurement type for the MEG and initiating MEP.
-                range of type : 0..(2^32) - 1";
-        }
-        description "This object class represents an on-demand measurement job controller sink for 1-way measurements. It is created as a result of an establishOnDemandDualEndedMeasurementJobSink() operation. It is deleted either automatically after the measurement job has completed (stop time reached) and the performance data AVC notification has been sent, or by an explicit abortOnDemandMeasurementJob() operation when the measurement job is running.";
-    }
-    grouping eth-on-demand-measurement-job-control-source {
-        leaf controller-mep-id {
-            type string;
-            description "none";
-        }
-        leaf oam-pdu-generation-type {
-            type oam-pdu-generation-type;
-            description "This attribute contains the pattern that is used for the generation of OAM PDUs.";
-        }
-        leaf destination-address {
-            type mac-address;
-            description "This attribute contains the MAC address of the peer MEP. See G.8013 for details.";
-        }
-        leaf priority {
-            type uint64;
-            default "7";
-            description "This attribute contains the priority of the OAM PDU frames.
-                range of type : 0, 1, 2, 3, 4, 5, 6, 7";
-        }
-        leaf message-period {
-            type message-period;
-            description "This attribute contains the frequency of the OAM message (PDU) generation within a series.
-                Note that the value 0 means that only one OAM message per measurement interval is generated.
-                range of type : See corresponding Enum.";
-        }
-        leaf repetition-period {
-            type repetition-period;
-            description "This attribute contains the time between the start of two measurement intervals. This IS applicable for the repetitive instance type and MAY be applicable for the repetitive series type.
-                Note that a value of 0 means not applicable (NA), which is for the cases of single instance, single series, or repetitive series without extra gap in between the measurement intervals (i.e., also as known as continuous series).";
-        }
-        leaf measurement-interval {
-            type uint64;
-            description "This attribute contains the discrete non overlapping periods of time (in seconds) during which measurements are performed (i.e., OAM messages are generated) and reports are gathered at the end of the measurement intervals. Note that the value 0 means a degenerated measurement interval with a single OAM message and the report is sent as immediately as possible.
-                range of type : Non-negative";
-        }
-        leaf test-identifier {
-            type uint64;
-            description "This attribute is used to distinguish each measurement session if multiple measurement sessions are simultaneously activated towards a peer MEP including concurrent on-demand and proactive tests. It must be unique at least within the context of any measurement type for the MEG and initiating MEP.
-                Note: The attribute is not used in case of LMM/LMR measurement.
-                range of type : 0..(2^32) - 1";
-        }
-        leaf data-tlv-length {
-            type uint64;
-            description "This parameter provides the size of the optional data TLV.
-                Non-negative integer represents the number of bytes for the length of the padding TLV.
-                Notes:
-                When configuring this parameter one should be aware of the maximum allowed total frame size limitation.
-                The attribute is not used in case of 2-way loss measurement.
-                range of type : Depends on the allowed MTU size.";
-        }
-        description "Basic attributes: destinationAddress, priority
-            Measurement configuration related attributes: oamPduGenerationType, startTime, stopTime, messagePeriod, repetitionPeriod, measurementInterval
-            Optional attributes: dataTlvLength, testIdentifier
-            This object class represents an on-demand measurement job controller source for 1-way measurements. It is created as a result of an establishOnDemandDualEndedMeasurementJobSource() operation. It is deleted either automatically after the measurement job has completed (stop time reached), or by an explicit abortOnDemandMeasurementJob() operation while the measurement job is running.";
-    }
-    grouping eth-pro-active-measurement-job-control-sink {
-        leaf responder-mep-id {
-            type string;
-            description "none";
-        }
-        leaf is-enabled {
-            type boolean;
-            default "true";
-            description "This attribute identifies the state of the measurement job. If set to TRUE, the MEP performs proactive Performance Measurement.";
-        }
-        leaf source-address {
-            type mac-address;
-            description "This attribute contains the MAC address of the peer MEP. See G.8013 for details.";
-        }
-        leaf test-identifier {
-            type uint64;
-            description "This attribute is used to distinguish each measurement session if multiple measurement sessions are simultaneously activated towards a peer MEP including concurrent on-demand and proactive tests. It must be unique at least within the context of any measurement type for the MEG and initiating MEP.
-                range of type : 0..(2^32) - 1";
-        }
-        description "This object class allows the control of the proactive 1-way measurement. It is created as a part of an establishProActiveDualEndedMeasurementJobSink() operation. Lifecycle: A pre-condition of deleting the object is that the Enable attribute should have the value FALSE.";
-    }
-    grouping eth-pro-active-measurement-job-control-source {
-        leaf controller-mep-id {
-            type string;
-            description "none";
-        }
-        leaf is-enabled {
-            type boolean;
-            default "true";
-            description "This attribute identifies the state of the measurement job. If set to TRUE, the MEP performs proactive Performance Measurement.";
-        }
-        leaf destination-address {
-            type mac-address;
-            description "This attribute provides the Unicast MAC address of the intented destination.";
-        }
-        leaf priority {
-            type uint64 {
-                range "0..7";
-            }
-            default "7";
-            description "This attribute contains the priority value on which the MEP performs the measurement. When the measurement is enabled, the MEP should use this value to encode the priority of generated measurement frames. The EMF usese this value to assign the P parameter of the measurement operation.";
-        }
-        leaf period {
-            type oam-period;
-            description "This attribute indicates the period (frequency) of the measurement frame transmission.
-                range of type : 100ms, 1s, 10s";
-        }
-        leaf test-identifier {
-            type uint64;
-            description "This attribute is used to distinguish each measurement session if multiple measurement sessions are simultaneously activated towards a peer MEP including concurrent on-demand and proactive tests. It must be unique at least within the context of any measurement type for the MEG and initiating MEP.
-                Note: The attribute is not used in case of 2-way loss measurement.
-                range of type : 0..(2^32) - 1";
-        }
-        leaf data-tlv-length {
-            type uint64;
-            description "This parameter provides the size of the optional data TLV.
-                Non-negative integer represents the number of bytes for the length of the padding TLV.
-                Notes:
-                When configuring this parameter one should be aware of the maximum allowed total frame size limitation.
-                The attribute is not used in case of 2-way loss measurement.
-                range of type : Depends on the allowed MTU size.";
-        }
-        description "This object class represents a proactive measurement job controller source for 1way measurements. It is created as a part of an establishProactiveDualEndedMeasurementJobSource() operation.";
-    }
-    grouping eth-pro-active-1-dm-performance-data {
-        container pro-active-near-end-1-dm-parameters {
-            uses statistical-dm-performance-parameters;
-            description "This attribute contains the statistical near end performnace parameters.";
-        }
-        description "This object class represents the PM current data collected in a pro-active delay measurement job (using 1DM).";
-    }
-    grouping eth-pro-active-1-lm-performance-data {
-        container pro-active-near-end-1-lm-parameters {
-            uses statistical-lm-performance-parameters;
-            description "This attribute contains the statistical near end performnace parameters.";
-        }
-        description "This object class represents the PM current data collected in a pro-active loss measurement job (using 1SL).";
-    }
-    grouping eth-pro-active-dm-performance-data {
-        container pro-active-bi-dir-dm-parameters {
-            uses statistical-dm-performance-parameters;
-            description "This attribute contains the statistical bidirectional performnace parameters.";
-        }
-        container pro-active-far-end-dm-parameters {
-            uses statistical-dm-performance-parameters;
-            description "This attribute contains the statistical far end performnace parameters.";
-        }
-        container pro-active-near-end-dm-parameters {
-            uses statistical-dm-performance-parameters;
-            description "This attribute contains the statistical near end performnace parameters.";
-        }
-        description "This object class represents the PM current data collected in a pro-active delay measurement job (using DMM/DMR).";
-    }
-    grouping eth-pro-active-lm-performance-data {
-        container pro-active-far-end-lm-parameters {
-            uses statistical-lm-performance-parameters;
-            description "This attribute contains the statistical far end performnace parameters.";
-        }
-        container pro-active-near-end-lm-parameters {
-            uses statistical-lm-performance-parameters;
-            description "This attribute contains the statistical near end performnace parameters.";
-        }
-        leaf bidirectional-uas {
-            type uint64;
-            description "This attribute contains the bidirectional UAS (unavailable seconds) detected in the monitoring interval.
-                range of type : 0..900 for 15min interval or 0..86400 for 24 hr interval.";
-        }
-        description "This object class represents the PM current data collected in a pro-active loss measurement job (using LMM/LMR or SLM/SLR).";
-    }
-    grouping eth-on-demand-1-dm-performance-data {
-        container on-demand-near-end-1-dm-parameters {
-            uses on-demand-dm-performance-parameters;
-            description "This attribute contains the results of an on-demand frame delay measurement job in the ingress direction.";
-        }
-        description "none";
-    }
-    grouping eth-on-demand-1-lm-performance-data {
-        container on-demand-near-end-1-lm-parameters {
-            uses on-demand-lm-performance-parameters;
-            description "This attribute contains the results of an on-demand synthetic loss measurement job in the ingress direction.";
-        }
-        description "none";
-    }
-    grouping eth-on-demand-dm-performance-data {
-        container on-demand-far-end-dm-parameters {
-            uses on-demand-dm-performance-parameters;
-            description "This attribute contains the results of an on-demand frame delay measurement job in the ingress direction.";
-        }
-        container on-demand-near-end-dm-parameters {
-            uses on-demand-dm-performance-parameters;
-            description "This attribute contains the results of an on-demand frame delay measurement job in the ingress direction.";
-        }
-        description "none";
-    }
-    grouping eth-on-demand-lm-performance-data {
-        container on-demand-far-end-lm-parameters {
-            uses on-demand-lm-performance-parameters;
-            description "This attribute contains the results of an on-demand synthetic loss measurement job in the egress direction.";
-        }
-        container on-demand-near-end-lm-parameters {
-            uses on-demand-lm-performance-parameters;
-            description "This attribute contains the results of an on-demand synthetic loss measurement job in the ingress direction.";
-        }
-        description "none";
-    }
-    grouping eth-pro-active-1way-measurement-job {
-        container pro-active-control-1way-source {
-            uses eth-pro-active-measurement-job-control-source;
-            description "none";
-        }
-        container pro-active-control-1way-sink {
-            uses eth-pro-active-measurement-job-control-sink;
-            description "none";
-        }
-        description "none";
-    }
-    grouping eth-pro-active-2way-measurement-job {
-        container pro-active-control-2way-source {
-            uses eth-pro-active-measurement-job-control-source;
-            description "none";
-        }
-        description "none";
-    }
-    grouping eth-on-demand-2way-measurement-job {
-        container on-demand-control-2way-source {
-            uses eth-on-demand-measurement-job-control-source;
-            description "none";
-        }
-        description "none";
-    }
-    grouping eth-on-demand-1way-measurement-job {
-        container on-demand-control-1way-source {
-            uses eth-on-demand-measurement-job-control-source;
-            description "none";
-        }
-        container on-demand-control-1way-sink {
-            uses eth-on-demand-measurement-job-control-sink;
-            description "none";
-        }
-        description "none";
-    }
-    grouping eth-1-dm-threshold-data {
-        container near-end-1-dm-cross-threshold {
-            uses statistical-dm-performance-parameters;
-            description "This attribute contains the near end cross threshold values of the delay measurements.";
-        }
-        container near-end-1-dm-clear-threshold {
-            uses statistical-dm-performance-parameters;
-            description "This attribute contains the near end clear threshold values of the delay measurements.";
-        }
-        description "This data type contains the threshold values for frame delay related 1-way measurements.";
-    }
-    grouping eth-1-lm-threshold-data {
-        container near-end-1-lm-cross-threshold {
-            uses statistical-lm-performance-parameters;
-            description "This attribute contains the near end cross threshold values of the loss measurements.";
-        }
-        container near-end-1-lm-clear-threshold {
-            uses statistical-lm-performance-parameters;
-            description "This attribute is only valid for frame loss ratio parameters and counter type parameters working in the 'standing condition method' (see G.7710, section 10.1.7.2: Threshold reporting) and contains the near end clear threshold values of the loss measurements.";
-        }
-        description "This data type contains the threshold values for frame loss related 1-way measurements.";
-    }
-    grouping eth-dm-threshold-data {
-        container near-end-dm-cross-threshold {
-            uses statistical-dm-performance-parameters;
-            description "This attribute contains the near end cross threshold values of the delay measurements.";
-        }
-        container near-end-dm-clear-threshold {
-            uses statistical-dm-performance-parameters;
-            description "This attribute contains the near end clear threshold values of the delay measurements.";
-        }
-        container far-end-dm-cross-threshold {
-            uses statistical-dm-performance-parameters;
-            description "This attribute contains the far end cross threshold values of the delay measurements.";
-        }
-        container far-end-dm-clear-threshold {
-            uses statistical-dm-performance-parameters;
-            description "This attribute contains the far end clear threshold values of the delay measurements.";
-        }
-        container bi-dir-dm-cross-threshold {
-            uses statistical-dm-performance-parameters;
-            description "This attribute contains the bidirectional cross threshold values of the delay measurements.";
-        }
-        container bi-dir-dm-clear-threshold {
-            uses statistical-dm-performance-parameters;
-            description "This attribute contains the bidirectional clear threshold values of the delay measurements.";
-        }
-        description "This data type contains the threshold values for frame delay related 2-way measurements.";
-    }
-    grouping eth-lm-threshold-data {
-        container near-end-lm-cross-threshold {
-            uses statistical-lm-performance-parameters;
-            description "This attribute contains the near end cross threshold values of the loss measurements.";
-        }
-        container near-end-lm-clear-threshold {
-            uses statistical-lm-performance-parameters;
-            description "This attribute is only valid for frame loss ratio parameters and counter type parameters working in the 'standing condition method' (see G.7710, section 10.1.7.2: Threshold reporting) and contains the near end clear threshold values of the loss measurements.";
-        }
-        container far-end-lm-cross-threshold {
-            uses statistical-lm-performance-parameters;
-            description "This attribute contains the far end cross threshold values of the loss measurements.";
-        }
-        container far-end-lm-clear-threshold {
-            uses statistical-lm-performance-parameters;
-            description "This attribute is only valid for frame loss ratio parameters and counter type parameters working in the 'standing condition method' (see G.7710, section 10.1.7.2: Threshold reporting) and contains the far end clear threshold values of the loss measurements.";
-        }
-        leaf bi-dir-lm-uas-cross-threshold {
-            type uint64;
-            description "This attribute contains the bidirectional cross threshold value of the UAS loss measurement.";
-        }
-        leaf bi-dir-lm-uas-clear-threshold {
-            type uint64;
-            description "This attribute is only valid for the UAS parameter working in the 'standing condition method' (see G.7710, section 10.1.7.2: Threshold reporting) and contains the bidirectional clear threshold value of the UAS loss measurement.";
-        }
-        description "This data type contains the threshold values for frame loss related 2-way measurements.";
-    }
-    grouping eth-loopback-result-data {
-        leaf rec-lbr-frames {
-            type uint64;
-            config false;
-            description "G.8052: This parameter returns the total number of received LBR messages, including the out of order LBR frames.";
-        }
-        leaf out-of-order-lbr-frames {
-            type uint64;
-            config false;
-            description "G.8052: This parameter returns the number of LBR traffic unites (messages) that were received out of order (OO).";
-        }
-        leaf sent-lbm-frames {
-            type uint64;
-            config false;
-            description "G.8052: This parameter returns the total number of sent LBM frames.";
-        }
-        leaf crc-lbr-frames {
-            type uint64;
-            config false;
-            description "G.8052: This parameter returns the number of LBR frames where the CRC in the pattern failed.";
-        }
-        leaf ber-lbr-frames {
-            type uint64;
-            config false;
-            description "G.8052: This parameter returns the number of LBR frames where there was a bit error in the pattern.";
-        }
-        leaf-list detected-peer-mep {
-            type mac-address;
-            config false;
-            description "G.8052: This parameter returns the MAC addresses of the discovered peer MEPs of the subject MEP.";
-        }
-        description "none";
-    }
-    grouping eth-link-trace-result-data {
-        list result-list {
-            key 'source-address';
-            config false;
-            uses link-trace-result;
-            description "G.8052: This parameter returns the results of the LT process. It contains a list of the result received from the individual LTR frames.
-                The result from the individual LTR frame include the Source Mac Address, the TTL, and TLV.";
-        }
-        description "none";
-    }
-    grouping eth-test-result-data {
-        leaf sent-tst-frames {
-            type uint64;
-            config false;
-            description "G.8052: This parameter returns the total number of sent TST frames.";
-        }
-        description "none";
-    }
-    grouping eth-oam-operation-common-pac {
-        leaf destination-address {
-            type mac-address;
-            description "G.8052: This parameter provides the destination address, i.e., the MAC Address of the target MEP or MIP.";
-        }
-        leaf priority {
-            type uint64;
-            default "7";
-            description "G.8052: This parameter provides the priority to be used in the LBM frame.";
-        }
-        description "none";
-    }
-    grouping eth-oam-msg-common-pac {
-        leaf period {
-            type oam-period;
-            description "G.8052: This parameter provides the periodicity of the TST OAM messages.";
-        }
-        leaf drop-eligibility {
-            type boolean;
-            description "G.8052: This parameter provides the eligibility of frames with unicast ETH-TST information to be discarded when congestion conditions are encountered.";
-        }
-        leaf data-tlv-length {
-            type uint64;
-            description "G.8052: This parameter provides the length (in number of octet) of the optional Data TLV to be included in the TST frame.";
-        }
-        leaf test-pattern {
-            type uint64;
-            description "G.8052: This parameter provides the test pattern to be used in the optional Data TLV.
-                Examples of test patterns include pseudo-random bit sequence (PRBS) 2^31-1 as specified in clause 5.8 of [ITU-T O.150], all '0' pattern, etc.
-                The following values of pattern types are defined:
-                0: 'Null signal without CRC-32'
-                1: 'Null signal with CRC-32'
-                2: 'PRBS 2^31-1 without CRC-32'
-                3: 'PRBS 2^31-1 with CRC-32'.";
-        }
-        uses eth-oam-operation-common-pac;
-        description "none";
-    }
-
-   /**************************
-    * package type-definitions
-    **************************/
-    identity ETH_OAM_JOB_TYPE {
-        base tapi-oam:OAM_JOB_TYPE;
-        description "none";
-    }
-    identity ETH_OAM_JOB_TYPE_ETH_1DM {
-        base ETH_OAM_JOB_TYPE;
-        description "none";
-    }
-    identity ETH_OAM_JOB_TYPE_ETH_1SLM {
-        base ETH_OAM_JOB_TYPE;
-        description "none";
-    }
-    identity ETH_OAM_JOB_TYPE_ETH_LM_CCM {
-        base ETH_OAM_JOB_TYPE;
-        description "none";
-    }
-    identity ETH_OAM_JOB_TYPE_ETH_LM_LMM {
-        base ETH_OAM_JOB_TYPE;
-        description "none";
-    }
-    identity ETH_OAM_JOB_TYPE_ETH_SLM {
-        base ETH_OAM_JOB_TYPE;
-        description "none";
-    }
-    identity ETH_OAM_JOB_TYPE_ETH_DM {
-        base ETH_OAM_JOB_TYPE;
-        description "none";
-    }
-    identity ETH_OAM_JOB_TYPE_ETH_LTC {
-        base ETH_OAM_JOB_TYPE;
-        description "none";
-    }
-    identity ETH_OAM_JOB_TYPE_ETH_LBK {
-        base ETH_OAM_JOB_TYPE;
-        description "none";
-    }
-    identity ETH_OAM_JOB_TYPE_ETH_TEST {
-        base ETH_OAM_JOB_TYPE;
-        description "none";
-    }
-    grouping priority-configuration {
-        leaf priority {
-            type uint64 {
-                range "0..7";
-            }
-            description "none";
-        }
-        leaf queue-id {
-            type uint64 {
-                range "1..8";
-            }
-            description "none";
-        }
-        description "none";
-    }
-    grouping queue-configuration {
-        leaf queue-id {
-            type uint64;
-            description "This attribute indicates the queue id.";
-        }
-        leaf queue-depth {
-            type uint64;
-            description "This attribute defines the depth of the queue in bytes.";
-        }
-        leaf queue-threshold {
-            type uint64;
-            description "This attribute defines the threshold of the queue in bytes.";
-        }
-        description "none";
-    }
-    grouping traffic-conditioning-configuration {
-        leaf cir {
-            type uint64;
-            description "This attribute indicates the Committed Information Rate in bits/s.";
-        }
-        leaf cbs {
-            type uint64;
-            description "This attribute indicates the Committed Burst Size in bytes.";
-        }
-        leaf eir {
-            type uint64;
-            description "This attribute indicates the Excess Information Rate in bits/s.";
-        }
-        leaf ebs {
-            type uint64;
-            description "This attribute indicates the Excess Burst Size in bytes.";
-        }
-        leaf coupling-flag {
-            type boolean;
-            description "This attribute indicates the coupling flag.";
-        }
-        leaf colour-mode {
-            type colour-mode;
-            description "This attribute indicates the colour mode.";
-        }
-        leaf queue-id {
-            type uint64 {
-                range "1..8";
-            }
-            description "This attribute indicates the queue id.";
-        }
-        description "none";
-    }
-    typedef mac-address {
-        type string;
-        description "This primitive data type contains an Ethernet MAC address defined by IEEE 802a. The format of the address consists of 12 hexadecimal characters, grouped in pairs and separated by '-' (e.g., 03-27-AC-75-3E-1D).";
-    }
-    grouping priority-mapping {
-        leaf priority-0 {
-            type uint64 {
-                range "0..7";
-            }
-            description "This attribute defines the new priority value for the old priority value 0.";
-        }
-        leaf priority-1 {
-            type uint64 {
-                range "0..7";
-            }
-            default "1";
-            description "This attribute defines the new priority value for the old priority value 1.";
-        }
-        leaf priority-2 {
-            type uint64 {
-                range "0..7";
-            }
-            default "2";
-            description "This attribute defines the new priority value for the old priority value 2.";
-        }
-        leaf priority-3 {
-            type uint64 {
-                range "0..7";
-            }
-            default "3";
-            description "This attribute defines the new priority value for the old priority value 3.";
-        }
-        leaf priority-4 {
-            type uint64 {
-                range "0..7";
-            }
-            default "4";
-            description "This attribute defines the new priority value for the old priority value 4.";
-        }
-        leaf priority-5 {
-            type uint64 {
-                range "0..7";
-            }
-            default "5";
-            description "This attribute defines the new priority value for the old priority value 5.";
-        }
-        leaf priority-6 {
-            type uint64 {
-                range "0..7";
-            }
-            default "6";
-            description "This attribute defines the new priority value for the old priority value 6.";
-        }
-        leaf priority-7 {
-            type uint64 {
-                range "0..7";
-            }
-            default "7";
-            description "This attribute defines the new priority value for the old priority value 7.";
-        }
-        description "This data type provides the priority mapping done in the 'P Regenerate' process defined in G.8021.";
-    }
-    typedef vid {
-        type string;
-        description "This primitive type models the 12 Bit VLAN identifier of a VLAN tag.";
-    }
-    typedef modify-cross-connection-data {
-        type string;
-        description "none";
-    }
-    grouping address-tuple {
-        leaf address {
-            type mac-address;
-            description "This attribute contains the MAC address of the address tuple.";
-        }
-        leaf-list port-list {
-            type mac-address;
-            description "This attribute contains the ports associated to the MAC address in the address tuple.";
-        }
-        description "This data type contains an address tuple consisting of a MAC address and a corresponding port list.";
-    }
-    typedef scheduling-configuration {
-        type string;
-        description "The syntax of this dataType is pending on the specification in G.8021, which is for further study.";
-    }
-    grouping control-frame-filter {
-        leaf c-2-00-00-10 {
-            type boolean;
-            description "This attribute identifies the 'All LANs Bridge Management Group Address'.";
-        }
-        leaf c-2-00-00-00 {
-            type boolean;
-            description "This attribute identifies the STP/RSTP/MSTP protocol address.";
-        }
-        leaf c-2-00-00-01 {
-            type boolean;
-            description "This attribute identifies the IEEE MAC-specific Control Protocols group address (PAUSE protocol).";
-        }
-        leaf c-2-00-00-02 {
-            type boolean;
-            description "This attribute identifies the IEEE 802.3 Slow_Protocols_Multicast address (LACP/LAMP or Link OAM protocols).";
-        }
-        leaf c-2-00-00-03 {
-            type boolean;
-            description "This attribute identifies the Nearest non-TPMR Bridge group address (Port Authentication protocol).";
-        }
-        leaf c-2-00-00-04 {
-            type boolean;
-            description "This attribute identifies the IEEE MAC-specific Control Protocols group address.";
-        }
-        leaf c-2-00-00-05 {
-            type boolean;
-            description "Reserved for future standardization.";
-        }
-        leaf c-2-00-00-06 {
-            type boolean;
-            description "Reserved for future standardization.";
-        }
-        leaf c-2-00-00-07 {
-            type boolean;
-            description "This attribute identifies the Metro Ethernet Forum E-LMI protocol group address.";
-        }
-        leaf c-2-00-00-08 {
-            type boolean;
-            description "This attribute identifies the Provider Bridge Group address.";
-        }
-        leaf c-2-00-00-09 {
-            type boolean;
-            description "Reserved for future standardization.";
-        }
-        leaf c-2-00-00-0-a {
-            type boolean;
-            description "Reserved for future standardization.";
-        }
-        leaf c-2-00-00-0-b {
-            type boolean;
-            description "Reserved for future standardization.";
-        }
-        leaf c-2-00-00-0-c {
-            type boolean;
-            description "Reserved for future standardization.";
-        }
-        leaf c-2-00-00-0-d {
-            type boolean;
-            description "This attribute identifies the Provider Bridge MVRP address.";
-        }
-        leaf c-2-00-00-0-e {
-            type boolean;
-            description "This attribute identifies the Individual LAN Scope group address, Nearest Bridge group address (LLDP protocol).";
-        }
-        leaf c-2-00-00-0-f {
-            type boolean;
-            description "Reserved for future standardization.";
-        }
-        leaf c-2-00-00-20 {
-            type boolean;
-            description "This attribute identifies the Customer and Provider Bridge MMRP address.";
-        }
-        leaf c-2-00-00-21 {
-            type boolean;
-            description "This attribute identifies the Customer Bridge MVRP address.";
-        }
-        leaf c-2-00-00-22 {
-            type boolean;
-            description "Reserved for future standardization.";
-        }
-        leaf c-2-00-00-23 {
-            type boolean;
-            description "Reserved for future standardization.";
-        }
-        leaf c-2-00-00-24 {
-            type boolean;
-            description "Reserved for future standardization.";
-        }
-        leaf c-2-00-00-25 {
-            type boolean;
-            description "Reserved for future standardization.";
-        }
-        leaf c-2-00-00-26 {
-            type boolean;
-            description "Reserved for future standardization.";
-        }
-        leaf c-2-00-00-27 {
-            type boolean;
-            description "Reserved for future standardization.";
-        }
-        leaf c-2-00-00-28 {
-            type boolean;
-            description "Reserved for future standardization.";
-        }
-        leaf c-2-00-00-29 {
-            type boolean;
-            description "Reserved for future standardization.";
-        }
-        leaf c-2-00-00-2-a {
-            type boolean;
-            description "Reserved for future standardization.";
-        }
-        leaf c-2-00-00-2-b {
-            type boolean;
-            description "Reserved for future standardization.";
-        }
-        leaf c-2-00-00-2-c {
-            type boolean;
-            description "Reserved for future standardization.";
-        }
-        leaf c-2-00-00-2-d {
-            type boolean;
-            description "Reserved for future standardization.";
-        }
-        leaf c-2-00-00-2-e {
-            type boolean;
-            description "Reserved for future standardization.";
-        }
-        leaf c-2-00-00-2-f {
-            type boolean;
-            description "Reserved for future standardization.";
-        }
-        description "This data type identifies the filter action for each of the 33 group MAC addresses (control frames).
-            Value 'false' means block: The frame is discarded by the filter process.
-            Value 'true' means pass: The frame is passed unchanged through the filter process.";
-    }
-    grouping bandwidth-report {
-        leaf source-mac-address {
-            type mac-address;
-            description "The sourceMacAddress is the address from the far end.";
-        }
-        leaf port-id {
-            type uint64;
-            description "This attribute returns the far end port identifier.";
-        }
-        leaf nominal-bandwidth {
-            type uint64;
-            description "This attribute returns the configured bandwidth";
-        }
-        leaf current-bandwidth {
-            type uint64;
-            description "This attribute returns the current bandwidth.";
-        }
-        description "Data type for the bandwidth report.";
-    }
-    typedef admin-state {
-        type enumeration {
-            enum LOCK {
-                description "none";
-            }
-            enum NORMAL {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    typedef colour-mode {
-        type enumeration {
-            enum COLOUR_BLIND {
-                description "none";
-            }
-            enum COLOUR_AWARE {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    typedef csf-config {
-        type enumeration {
-            enum DISABLED {
-                description "This literal covers the following states of the CSF related MI informations:
-                    - MI_CSF_Enable is false
-                    - MI_CSFrdifdi_Enable is false
-                    - MI_CSFdci_Enable is false.";
-            }
-            enum ENABLED {
-                description "This literal covers the following states of the CSF related MI informations:
-                    - MI_CSF_Enable is true
-                    - MI_CSFrdifdi_Enable is false
-                    - MI_CSFdci_Enable is false.";
-            }
-            enum ENABLED_WITH_RDI_FDI {
-                description "This literal covers the following states of the CSF related MI informations:
-                    - MI_CSF_Enable is true
-                    - MI_CSFrdifdi_Enable is true
-                    - MI_CSFdci_Enable is false.";
-            }
-            enum ENABLED_WITH_RDI_FDI_DCI {
-                description "This literal covers the following states of the CSF related MI informations:
-                    - MI_CSF_Enable is true
-                    - MI_CSFrdifdi_Enable is true
-                    - MI_CSFdci_Enable is true.";
-            }
-            enum ENABLED_WITH_DCI {
-                description "This literal covers the following states of the CSF related MI informations:
-                    - MI_CSF_Enable is true
-                    - MI_CSFrdifdi_Enable is false
-                    - MI_CSFdci_Enable is true.";
-            }
-        }
-        description "none";
-    }
-    typedef ety-phy-type {
-        type enumeration {
-            enum OTHER {
-                description "none";
-            }
-            enum UNKNOWN {
-                description "none";
-            }
-            enum NONE {
-                description "none";
-            }
-            enum 2BASE_TL {
-                description "none";
-            }
-            enum 10MBIT_S {
-                description "none";
-            }
-            enum 10PASS_TS {
-                description "none";
-            }
-            enum 100BASE_T4 {
-                description "none";
-            }
-            enum 100BASE_X {
-                description "none";
-            }
-            enum 100BASE_T2 {
-                description "none";
-            }
-            enum 1000BASE_X {
-                description "none";
-            }
-            enum 1000BASE_T {
-                description "none";
-            }
-            enum 10GBASE-X {
-                description "none";
-            }
-            enum 10GBASE_R {
-                description "none";
-            }
-            enum 10GBASE_W {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    typedef frame-type {
-        type enumeration {
-            enum ADMIT_ONLY_VLAN_TAGGED_FRAMES {
-                description "none";
-            }
-            enum ADMIT_ONLY_UNTAGGED_AND_PRIORITY_TAGGED_FRAMES {
-                description "none";
-            }
-            enum ADMIT_ALL_FRAMES {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    typedef oam-period {
-        type enumeration {
-            enum 3_33MS {
-                description "Default for protection.";
-            }
-            enum 10MS {
-                description "none";
-            }
-            enum 100MS {
-                description "none";
-            }
-            enum 1S {
-                description "none";
-            }
-            enum 10S {
-                description "none";
-            }
-            enum 1MIN {
-                description "none";
-            }
-            enum 10MIN {
-                description "none";
-            }
-        }
-        description "Provides the frequency for the OAM PDU insertion.";
-    }
-    typedef pcp-coding {
-        type enumeration {
-            enum 8P0D {
-                description "none";
-            }
-            enum 7P1D {
-                description "none";
-            }
-            enum 6P2D {
-                description "none";
-            }
-            enum 5P3D {
-                description "none";
-            }
-            enum DEI {
-                description "This enumeration value means that all priorities should be drop eligible.
-                    DEI = Drop Eligibility Indicator";
-            }
-        }
-        description "This enum models the coding of the Priority Code Point as defined in section 'Priority Code Point encoding' of IEEE 802.1Q.";
-    }
-    typedef vlan-type {
-        type enumeration {
-            enum C_Tag {
-                description "0x8100";
-            }
-            enum S_Tag {
-                description "0x88a8";
-            }
-            enum I_Tag {
-                description "88-e7";
-            }
-        }
-        description "This enumeration contains the Ethertypes defined in IEEE 802.1Q.";
-    }
-    typedef repetition-period {
-        type enumeration {
-            enum 1MIN {
-                description "none";
-            }
-            enum 1S {
-                description "none";
-            }
-            enum 10S {
-                description "none";
-            }
-            enum 0 {
-                description "none";
-            }
-        }
-        description "This enumeration defines the allowed values for the repetition period in on-demand measurements.
-            Note: The value 0 means that the value is not relevant.";
-    }
-    typedef message-period {
-        type enumeration {
-            enum 10MS {
-                description "none";
-            }
-            enum 100MS {
-                description "none";
-            }
-            enum 1S {
-                description "none";
-            }
-            enum 10S {
-                description "none";
-            }
-            enum 0 {
-                description "none";
-            }
-        }
-        description "This enumeration defines the allowed values for the message period in on-demand measurements.
-            Notes:
-            The value 10ms is only used in synthetic loss measurements.
-            The value 0 means that the value is not relevant.";
-    }
-    typedef oam-pdu-generation-type {
-        type enumeration {
-            enum SINGLE_INSTANCE {
-                description "none";
-            }
-            enum REPETITIVE_INSTANCE {
-                description "none";
-            }
-            enum SINGLE_SERIES {
-                description "none";
-            }
-            enum REPETITIVE_SERIES {
-                description "none";
-            }
-        }
-        description "This enumeration defines the generation pattern of the on-demand OAM PDUs (messages). ";
-    }
-    grouping on-demand-dm-performance-parameters {
-        leaf number-of-samples {
-            type uint64;
-            description "This attribute contains the number of received DM frames (successful samples) used for this frame delay measurement.
-                range of type : non-negative";
-        }
-        leaf-list frame-delay-list {
-            type uint64;
-            description "This attribute contains the frame delays measured in ns (nano second, 1x10e-9 seconds). The multiplicity is defined by the numberOfSamples attribute.";
-        }
-        leaf-list frame-delay-variation-list {
-            type uint64;
-            description "This attribute contains the frame delay variations measured in ns (nano second).  The multiplicity is defined by (numberOfSamples - 1, for numberOfSamples > 0).";
-        }
-        description "This data type contains the results of an on-demand delay measurement job.";
-    }
-    grouping on-demand-lm-performance-parameters {
-        leaf total-transmitted-frames {
-            type uint64;
-            description "This attribute contains the total number of frames transmitted.";
-        }
-        leaf total-lost-frames {
-            type uint64;
-            description "This attribute contains the total number of frames lost.";
-        }
-        leaf total-frame-loss-ratio {
-            type decimal64 {
-                fraction-digits 7;
-            }
-            description "This attribute contains the frame loss ratio (number of lost frames divided by the number of total frames (N_LF / N_TF)).
-                The accuracy of the value is for further study.";
-        }
-        description "This data type contains the results of an on-demand loss measurement job.";
-    }
-    grouping statistical-dm-performance-parameters {
-        leaf minimum-frame-delay {
-            type uint64;
-            description "This attribute contains the minimum frame delay observed over the monitored period. It is measured in units of ns (nano second, 1x10e-9 seconds).";
-        }
-        leaf average-frame-delay {
-            type uint64;
-            description "This attribute contains the average frame delay observed over the monitored period. It is measured in units of ns (nano second, 1x10e-9 seconds).";
-        }
-        leaf maximum-frame-delay {
-            type uint64;
-            description "This attribute contains the maximum frame delay observed over the monitored period. It is measured in units of ns (nano second, 1x10e-9 seconds).";
-        }
-        leaf minimum-frame-delay-variation {
-            type uint64;
-            description "This attribute contains the minimum frame delay variation measured in units of ns (nano second, 1x10e-9 seconds).";
-        }
-        leaf average-frame-delay-variation {
-            type uint64;
-            description "This attribute contains the average frame delay variation measured in units of ns (nano second, 1x10e-9 seconds).";
-        }
-        leaf maximum-frame-delay-variation {
-            type uint64;
-            description "This attribute contains the maximum frame delay variation measured in units of ns (nano second, 1x10e-9 seconds).";
-        }
-        description "This data type contains the statistical delay measurement performance parameters.";
-    }
-    grouping statistical-lm-performance-parameters {
-        leaf minimum-frame-loss-ratio {
-            type decimal64 {
-                fraction-digits 7;
-            }
-            description "This attribute contains the minimum frame loss ratio calculated over a period of time.
-                The accuracy of the value is for further study.";
-        }
-        leaf average-frame-loss-ratio {
-            type decimal64 {
-                fraction-digits 7;
-            }
-            description "This attribute contains the average frame loss ratio calculated over a period of time.
-                The accuracy of the value is for further study.";
-        }
-        leaf maximum-frame-loss-ratio {
-            type decimal64 {
-                fraction-digits 7;
-            }
-            description "This attribute contains the maximum frame loss ratio calculated over a period of time.
-                The accuracy of the value is for further study.";
-        }
-        leaf ses {
-            type uint64;
-            description "This attribute contains the SES detected in the monitoring interval.
-                range of type : 0..900 for 15min interval or 0..86400 for 24 hr interval.";
-        }
-        leaf uas {
-            type uint64;
-            description "This attribute contains UAS (unavailable seconds) detected in the monitoring interval.
-                range of type : 0..900 for 15min interval or 0..86400 for 24 hr interval.";
-        }
-        description "This data type contains the statistical loss measurement performance parameters.";
-    }
-    typedef eth-oam-job-type {
-        type identityref {
-            base ETH_OAM_JOB_TYPE;
-        }
-        description "none";
-    }
-    grouping link-trace-result {
-        leaf source-address {
-            type mac-address;
-            description "G.8052: This attribute contains the source MAC Address of an individual LTR frame result.";
-        }
-        leaf time-to-live {
-            type uint64;
-            description "G.8052: This attribute contains the Time To Live (TTL) value of an individual LTR frame result.";
-        }
-        leaf data-tlv-length {
-            type uint64;
-            description "G.8052: This attribute contains the length (in number of octets) of the Data TLV of an individual LTR frame result.";
-        }
-        description "G.8052: This data type contains the result from an individual LTR frame.";
-    }
-}
diff --git a/tapimodels/src/main/yang/tapi-oam@2018-12-10.yang b/tapimodels/src/main/yang/tapi-oam@2018-12-10.yang
deleted file mode 100644 (file)
index ec2a300..0000000
+++ /dev/null
@@ -1,825 +0,0 @@
-module tapi-oam {
-    namespace "urn:onf:otcc:yang:tapi-oam";
-    prefix tapi-oam;
-    import tapi-common {
-        prefix tapi-common;
-    }
-    import tapi-connectivity {
-        prefix tapi-connectivity;
-    }
-    import tapi-topology {
-        prefix tapi-topology;
-    }
-    organization "ONF OTCC (Open Transport Configuration & Control) Project";
-    contact "
-         Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>
-         Project List: <mailto:transport-api@opennetworking.org>
-         Editor: Karthik Sethuraman
-                 <mailto:karthik.sethuraman@necam.com>";
-    description "
-        This module contains TAPI OAM Model definitions.
-        Source: TapiOam.uml
-        - The TAPI YANG models included in this TAPI release are a *normative* part of the TAPI SDK.
-        - The YANG specifications have been generated from the corresponding UML model using the [ONF EAGLE UML2YANG mapping tool]
-          <https://github.com/OpenNetworkingFoundation/EagleUmlYang>
-          and further edited manually to comply with the [ONF IISOMI UML2YANG mapping guidelines]
-          <https://wiki.opennetworking.org/display/OIMT/UML+-+YANG+Guidelines>
-        - Status of YANG model artifacts can be determined by referring to the corresponding UML artifacts.
-          As described in the UML models, some artifacts are considered *experimental*, and thus the corresponding YANG artifacts.
-        - The ONF TAPI release process does not guarantee backward compatibility of YANG models across major versions of TAPI releases.
-          The YANG model backward compatibility criteria are outlined in section 11 of <https://tools.ietf.org/html/rfc7950>.
-          YANG models included in this release may not be backward compatible with previous TAPI releases.
-        Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.
-        License: This module is distributed under the Apache License 2.0";
-    revision 2018-12-10 {
-        description "ONF Transport API version 2.1.1.
-                   Changes included in this TAPI release (v2.1.1) are listed in
-                   <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.1.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
-    }
-    revision 2018-10-16 {
-        description "ONF Transport API version 2.1.0.
-                   Changes included in this TAPI release (v2.1.0) are listed in
-                   <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
-    }
-    revision 2018-03-07 {
-        description "ONF Transport API version 2.0.2
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";
-    }
-    revision 2018-02-16 {
-        description "ONF Transport API version 2.0.1
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";
-    }
-    revision 2018-01-02 {
-        description "ONF Transport API version 2.0.0
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";
-    }
-    augment "/tapi-common:context" {
-        container oam-context {
-            uses oam-context;
-            description "Augments the base TAPI Context with OamService information";
-        }
-        description "Augments the base TAPI Context with OamService information";
-    }
-    augment "/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:cep-list/tapi-connectivity:connection-end-point" {
-        container mep-mip-list {
-            uses mep-mip-list;
-            description "none";
-        }
-        description "none";
-    }
-
-   /**************************
-    * definitions of references
-    **************************/
-    grouping oam-service-ref {
-        leaf oam-service-uuid {
-            type leafref {
-                path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-service/tapi-oam:uuid';
-            }
-            description "none";
-        }
-        description "none";
-    }
-    grouping oam-service-end-point-ref {
-        uses oam-service-ref;
-        leaf oam-service-end-point-local-id {
-            type leafref {
-                path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-service/tapi-oam:end-point/tapi-oam:local-id';
-            }
-            description "none";
-        }
-        description "none";
-    }
-    grouping meg-ref {
-        leaf meg-uuid {
-            type leafref {
-                path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:meg/tapi-oam:uuid';
-            }
-            description "none";
-        }
-        description "none";
-    }
-    grouping maintenance-entity-ref {
-        uses meg-ref;
-        leaf maintenance-entity-local-id {
-            type leafref {
-                path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:meg/tapi-oam:mep/tapi-oam:local-id';
-            }
-            description "none";
-        }
-        description "none";
-    }
-    grouping mep-ref {
-        uses meg-ref;
-        leaf mep-local-id {
-            type leafref {
-                path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:meg/tapi-oam:mep/tapi-oam:local-id';
-            }
-            description "none";
-        }
-        description "none";
-    }
-    grouping mip-ref {
-        uses meg-ref;
-        leaf mip-local-id {
-            type leafref {
-                path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:meg/tapi-oam:mip/tapi-oam:local-id';
-            }
-            description "none";
-        }
-        description "none";
-    }
-    grouping oam-job-ref {
-        leaf oam-job-uuid {
-            type leafref {
-                path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:uuid';
-            }
-            description "none";
-        }
-        description "none";
-    }
-    grouping pm-current-data-ref {
-        uses oam-job-ref;
-        leaf pm-current-data-local-id {
-            type leafref {
-                path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:local-id';
-            }
-            description "none";
-        }
-        description "none";
-    }
-    grouping pm-history-data-ref {
-        uses pm-current-data-ref;
-        leaf pm-history-data-local-id {
-            type leafref {
-                path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-job/tapi-oam:pm-current-data/tapi-oam:pm-history-data/tapi-oam:local-id';
-            }
-            description "none";
-        }
-        description "none";
-    }
-    grouping oam-profile-ref {
-        leaf oam-profile-uuid {
-            type leafref {
-                path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-profile/tapi-oam:uuid';
-            }
-            description "none";
-        }
-        description "none";
-    }
-    grouping pm-threshold-data-ref {
-        uses oam-profile-ref;
-        leaf pm-threshold-data-local-id {
-            type leafref {
-                path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-profile/tapi-oam:pm-threshold-data/tapi-oam:local-id';
-            }
-            description "none";
-        }
-        description "none";
-    }
-    grouping pm-bin-data-ref {
-        uses oam-profile-ref;
-        leaf pm-bin-data-local-id {
-            type leafref {
-                path '/tapi-common:context/tapi-oam:oam-context/tapi-oam:oam-profile/tapi-oam:pm-bin-data/tapi-oam:local-id';
-            }
-            description "none";
-        }
-        description "none";
-    }
-
-   /**************************
-    * package object-classes
-    **************************/
-    grouping mep {
-        leaf layer-protocol-name {
-            type tapi-common:layer-protocol-name;
-            config false;
-            description "none";
-        }
-        leaf direction {
-            type tapi-common:termination-direction;
-            config false;
-            description "none";
-        }
-        leaf mep-identifier {
-            type string;
-            config false;
-            description "none";
-        }
-        leaf-list peer-mep-identifier {
-            type string;
-            config false;
-            min-elements 1;
-            description "none";
-        }
-        uses tapi-common:local-class;
-        uses tapi-common:operational-state-pac;
-        description "none";
-    }
-    grouping oam-job {
-        list oam-service-end-point {
-            uses oam-service-end-point-ref;
-            key 'oam-service-uuid oam-service-end-point-local-id';
-            min-elements 1;
-            description "none";
-        }
-        container oam-profile {
-            uses oam-profile-ref;
-            description "none";
-        }
-        list pm-current-data {
-            key 'local-id';
-            config false;
-            uses pm-current-data;
-            description "Granularity period of the CurrentData identifies the specific CurrentData instance in the scope of this OamJob.
-                For example, typically at least
-                one 15min and
-                one 24hr;
-                optionally one additional configurable (< 15min)";
-        }
-        leaf oam-job-type {
-            type oam-job-type;
-            description "none";
-        }
-        container schedule {
-            uses tapi-common:time-range;
-            description "none";
-        }
-        leaf creation-time {
-            type tapi-common:date-and-time;
-            config false;
-            description "none";
-        }
-        uses tapi-common:global-class;
-        uses tapi-common:admin-state-pac;
-        description "none";
-    }
-    grouping meg {
-        list mep {
-            key 'local-id';
-            config false;
-            uses mep;
-            description "1. ME may have 0 MEPs (case of transit domains where at least 1 MIP is present)
-                2. ME may have 1 MEP (case of edge domaind, where the peer MEP is ouside the managed domain)
-                3. ME may have 2 MEPs";
-        }
-        list mip {
-            key 'local-id';
-            config false;
-            uses mip;
-            description "ME may 0, 1, or more MIPs";
-        }
-        leaf layer-protocol-name {
-            type tapi-common:layer-protocol-name;
-            config false;
-            description "none";
-        }
-        leaf direction {
-            type tapi-common:forwarding-direction;
-            config false;
-            description "none";
-        }
-        leaf meg-level {
-            type uint64;
-            config false;
-            description "none";
-        }
-        leaf meg-identifier {
-            type string;
-            config false;
-            description "none";
-        }
-        uses tapi-common:resource-spec;
-        uses tapi-common:operational-state-pac;
-        description "none";
-    }
-    grouping mip {
-        leaf layer-protocol-name {
-            type tapi-common:layer-protocol-name;
-            config false;
-            description "none";
-        }
-        uses tapi-common:local-class;
-        description "none";
-    }
-    grouping oam-service {
-        list end-point {
-            key 'local-id';
-            min-elements 2;
-            uses oam-service-end-point;
-            description "none";
-        }
-        container meg {
-            uses meg-ref;
-            config false;
-            description "none";
-        }
-        container oam-profile {
-            uses oam-profile-ref;
-            description "none";
-        }
-        uses tapi-common:service-spec;
-        uses tapi-common:admin-state-pac;
-        uses oam-constraint;
-        description "none";
-    }
-    grouping oam-context {
-        list oam-service {
-            key 'uuid';
-            uses oam-service;
-            description "none";
-        }
-        list meg {
-            key 'uuid';
-            config false;
-            uses meg;
-            description "none";
-        }
-        list oam-job {
-            key 'uuid';
-            uses oam-job;
-            description "none";
-        }
-        list oam-profile {
-            key 'uuid';
-            uses oam-profile;
-            description "none";
-        }
-        description "none";
-    }
-    grouping oam-service-end-point {
-        container service-interface-point {
-            uses tapi-common:service-interface-point-ref;
-            description "none";
-        }
-        container connectivity-service-end-point {
-            uses tapi-connectivity:connectivity-service-end-point-ref;
-            description "none";
-        }
-        container mep {
-            uses mep-ref;
-            config false;
-            description "none";
-        }
-        container mip {
-            uses mip-ref;
-            config false;
-            description "none";
-        }
-        leaf layer-protocol-name {
-            type tapi-common:layer-protocol-name;
-            description "none";
-        }
-        leaf direction {
-            type tapi-common:port-direction;
-            description "none";
-        }
-        leaf mep-identifier {
-            type string;
-            description "This attribute contains the identifier of the MEP.
-                This attribute is empty in case the OSEP relates to the provisioing of an MIP.
-                ";
-        }
-        leaf-list peer-mep-identifier {
-            type string;
-            description "This attribute models the MI_PeerMEP_ID[i] defined in G.8021 and configured as specified in G.8051. It provides the identifiers of the MEPs which are peer to the subject MEP.
-                This attribute is not specified in case the OSEP relates to the provisioing of an MIP.
-                In case of P2P, there is only one peer";
-        }
-        uses tapi-common:local-class;
-        uses tapi-common:admin-state-pac;
-        description "none";
-    }
-    grouping mep-mip-list {
-        list mip {
-            uses mip-ref;
-            key 'meg-uuid mip-local-id';
-            description "none";
-        }
-        list mep {
-            uses mep-ref;
-            key 'meg-uuid mep-local-id';
-            description "none";
-        }
-        description "none";
-    }
-    grouping oam-constraint {
-        leaf layer-protocol-name {
-            type tapi-common:layer-protocol-name;
-            description "none";
-        }
-        leaf direction {
-            type tapi-common:forwarding-direction;
-            description "none";
-        }
-        leaf meg-level {
-            type uint64;
-            description "none";
-        }
-        description "none";
-    }
-    grouping pm-current-data {
-        list pm-history-data {
-            key 'local-id';
-            config false;
-            uses pm-history-data;
-            description "in case of 24hr Current Data, at least 1 History Data.
-                In case of 15min Current Data, at least 16 History Data.
-                In case of <15min, the number of History Data shall be able to cover a span of 4 hours.";
-        }
-        container granularity-period {
-            uses tapi-common:time-period;
-            description "none";
-        }
-        leaf timestamp {
-            type tapi-common:date-and-time;
-            config false;
-            description "This attribute indicates the start of the current monitoring interval.
-                The value is bound to the quarter of an hour in case of a 15 minute interval and bound to the hour in case of a 24 hour interval.";
-        }
-        container elapsed-time {
-            uses tapi-common:time-interval;
-            description "none";
-        }
-        leaf suspect-interval-flag {
-            type boolean;
-            description "This attribute is used to indicate that the performance data for the current period may not be reliable. Some reasons for this to occur are:
-                – Suspect data were detected by the actual resource doing data collection.
-                – Transition of the administrativeState attribute to/from the 'lock' state.
-                – Transition of the operationalState to/from the 'disabled' state.
-                – Scheduler setting that inhibits the collection function.
-                – The performance counters were reset during the interval.
-                – The currentData (or subclass) object instance was created during the monitoring period.";
-        }
-        uses tapi-common:local-class;
-        description "none";
-    }
-    grouping pm-history-data {
-        container granularity-period {
-            uses tapi-common:time-period;
-            description "none";
-        }
-        leaf period-end-time {
-            type tapi-common:date-and-time;
-            description "none";
-        }
-        leaf suspect-interval-flag {
-            type boolean;
-            config false;
-            description "This attribute indicates that the performance data may not be reliable.";
-        }
-        uses tapi-common:local-class;
-        description "none";
-    }
-    grouping oam-profile {
-        list pm-threshold-data {
-            key 'local-id';
-            min-elements 1;
-            uses pm-threshold-data;
-            description "none";
-        }
-        list pm-bin-data {
-            key 'local-id';
-            min-elements 1;
-            uses pm-bin-data;
-            description "none";
-        }
-        uses tapi-common:global-class;
-        description "none";
-    }
-    grouping pm-threshold-data {
-        container granularity-period {
-            uses tapi-common:time-period;
-            description "none";
-        }
-        leaf is-transient {
-            type boolean;
-            description "none";
-        }
-        uses tapi-common:local-class;
-        description "none";
-    }
-    grouping pm-bin-data {
-        container granularity-period {
-            uses tapi-common:time-period;
-            description "none";
-        }
-        uses tapi-common:local-class;
-        description "none";
-    }
-
-   /**************************
-    * package type-definitions
-    **************************/
-    identity OAM_JOB_TYPE {
-        description "none";
-    }
-    typedef oam-job-type {
-        type identityref {
-            base OAM_JOB_TYPE;
-        }
-        description "none";
-    }
-
-   /**************************
-    * package interfaces
-    **************************/
-    rpc create-oam-service {
-        description "none";
-        input {
-            list end-point {
-                key 'local-id';
-                min-elements 2;
-                uses oam-service-end-point;
-                description "none";
-            }
-            container oam-constraint {
-                uses oam-constraint;
-                description "none";
-            }
-            leaf state {
-                type string;
-                description "none";
-            }
-        }
-        output {
-            container service {
-                uses oam-service;
-                description "none";
-            }
-        }
-    }
-    rpc delete-oam-service {
-        description "none";
-        input {
-            leaf service-id {
-                type string;
-                description "none";
-            }
-        }
-    }
-    rpc get-oam-service {
-        description "none";
-        input {
-            leaf service-id {
-                type string;
-                description "none";
-            }
-        }
-        output {
-            container service {
-                uses oam-service;
-                description "none";
-            }
-        }
-    }
-    rpc create-oam-job {
-        description "none";
-        input {
-            leaf oam-job-type {
-                type oam-job-type;
-                description "none";
-            }
-            list oam-service-end-point {
-                key 'local-id';
-                min-elements 2;
-                uses oam-service-end-point;
-                description "none";
-            }
-            container oam-profile {
-                uses oam-profile;
-                description "none";
-            }
-            leaf state {
-                type string;
-                description "none";
-            }
-            leaf schedule {
-                type string;
-                description "none";
-            }
-        }
-        output {
-            container oam-job {
-                uses oam-job;
-                description "none";
-            }
-        }
-    }
-    rpc get-oam-job {
-        description "none";
-        input {
-            leaf job-id {
-                type string;
-                description "none";
-            }
-        }
-        output {
-            container oam-job {
-                uses oam-job;
-                description "none";
-            }
-        }
-    }
-    rpc get-oam-service-list {
-        description "none";
-        output {
-            list service {
-                key 'uuid';
-                uses oam-service;
-                description "none";
-            }
-        }
-    }
-    rpc get-meg {
-        description "none";
-        input {
-            leaf service-id {
-                type string;
-                description "none";
-            }
-        }
-        output {
-            container meg {
-                uses meg;
-                description "none";
-            }
-        }
-    }
-    rpc update-oam-service {
-        description "none";
-        input {
-            leaf service-id {
-                type string;
-                description "none";
-            }
-            list end-point {
-                key 'local-id';
-                uses oam-service-end-point;
-                description "none";
-            }
-            container oam-constraint {
-                uses oam-constraint;
-                description "none";
-            }
-            leaf state {
-                type string;
-                description "none";
-            }
-        }
-        output {
-            container service {
-                uses oam-service;
-                description "none";
-            }
-        }
-    }
-    rpc delete-oam-job {
-        description "none";
-        input {
-            leaf job-id {
-                type string;
-                description "none";
-            }
-        }
-    }
-    rpc update-oam-job {
-        description "none";
-        input {
-            leaf job-id {
-                type string;
-                description "none";
-            }
-            container oam-profile {
-                uses oam-profile;
-                description "none";
-            }
-            leaf state {
-                type string;
-                description "none";
-            }
-            leaf schedule {
-                type string;
-                description "none";
-            }
-        }
-        output {
-            container oam-job {
-                uses oam-job;
-                description "none";
-            }
-        }
-    }
-    rpc create-oam-service-end-point {
-        description "none";
-        input {
-            leaf service-id {
-                type string;
-                description "none";
-            }
-            leaf sip-id {
-                type string;
-                description "none";
-            }
-            leaf c-sep-id {
-                type string;
-                description "none";
-            }
-            leaf layer {
-                type string;
-                description "none";
-            }
-            leaf direction {
-                type string;
-                description "none";
-            }
-            leaf state {
-                type string;
-                description "none";
-            }
-            leaf mep-identifier {
-                type string;
-                description "none";
-            }
-            leaf-list peer-mep-identifier {
-                type string;
-                description "none";
-            }
-        }
-        output {
-            container end-point {
-                uses oam-service-end-point;
-                description "none";
-            }
-        }
-    }
-    rpc delete-oam-service-end-point {
-        description "none";
-        input {
-            leaf service-id {
-                type string;
-                description "none";
-            }
-            leaf o-sep-id {
-                type string;
-                description "none";
-            }
-        }
-    }
-    rpc update-oam-service-end-point {
-        description "none";
-        input {
-            leaf service-id {
-                type string;
-                description "none";
-            }
-            leaf o-sep-id {
-                type string;
-                description "none";
-            }
-            leaf state {
-                type string;
-                description "none";
-            }
-        }
-        output {
-            container end-point {
-                uses oam-service-end-point;
-                description "none";
-            }
-        }
-    }
-    rpc get-oam-service-end-point {
-        description "none";
-        input {
-            leaf service-id {
-                type string;
-                description "none";
-            }
-            leaf o-sep-id {
-                type string;
-                description "none";
-            }
-        }
-        output {
-            container end-point {
-                uses oam-service-end-point;
-                description "none";
-            }
-        }
-    }
-}
diff --git a/tapimodels/src/main/yang/tapi-odu@2018-12-10.yang b/tapimodels/src/main/yang/tapi-odu@2018-12-10.yang
deleted file mode 100644 (file)
index f2999b4..0000000
+++ /dev/null
@@ -1,716 +0,0 @@
-module tapi-odu {
-    namespace "urn:onf:otcc:yang:tapi-odu";
-    prefix tapi-odu;
-    import tapi-common {
-        prefix tapi-common;
-    }
-    import tapi-connectivity {
-        prefix tapi-connectivity;
-    }
-    import tapi-topology {
-        prefix tapi-topology;
-    }
-    import tapi-oam {
-        prefix tapi-oam;
-    }
-    import tapi-dsr {
-        prefix tapi-dsr;
-    }
-    organization "ONF OTCC (Open Transport Configuration & Control) Project";
-    contact "
-         Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>
-         Project List: <mailto:transport-api@opennetworking.org>
-         Editor: Karthik Sethuraman
-                 <mailto:karthik.sethuraman@necam.com>";
-    description "
-        This module contains TAPI Odu Model definitions.
-        Source: TapiOdu.uml
-        - The TAPI YANG models included in this TAPI release are a *normative* part of the TAPI SDK.
-        - The YANG specifications have been generated from the corresponding UML model using the [ONF EAGLE UML2YANG mapping tool]
-          <https://github.com/OpenNetworkingFoundation/EagleUmlYang>
-          and further edited manually to comply with the [ONF IISOMI UML2YANG mapping guidelines]
-          <https://wiki.opennetworking.org/display/OIMT/UML+-+YANG+Guidelines>
-        - Status of YANG model artifacts can be determined by referring to the corresponding UML artifacts.
-          As described in the UML models, some artifacts are considered *experimental*, and thus the corresponding YANG artifacts.
-        - The ONF TAPI release process does not guarantee backward compatibility of YANG models across major versions of TAPI releases.
-          The YANG model backward compatibility criteria are outlined in section 11 of <https://tools.ietf.org/html/rfc7950>.
-          YANG models included in this release may not be backward compatible with previous TAPI releases.
-        Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.
-        License: This module is distributed under the Apache License 2.0";
-    revision 2018-12-10 {
-        description "ONF Transport API version 2.1.1.
-                   Changes included in this TAPI release (v2.1.1) are listed in
-                   <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.1.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
-    }
-    revision 2018-10-16 {
-        description "ONF Transport API version 2.1.0.
-                   Changes included in this TAPI release (v2.1.0) are listed in
-                   <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
-    }
-    revision 2018-03-07 {
-        description "ONF Transport API version 2.0.2
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";
-    }
-    revision 2018-02-16 {
-        description "ONF Transport API version 2.0.1
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";
-    }
-    revision 2018-01-02 {
-        description "ONF Transport API version 2.0.0
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";
-    }
-    augment "/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point" {
-        container odu-node-edge-point-spec {
-            uses odu-node-edge-point-spec;
-            description "Augments the base LayerProtocol information in NodeEdgePoint with ODU-specific information";
-        }
-        description "Augments the base LayerProtocol information in NodeEdgePoint with ODU-specific information";
-    }
-    augment "/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:cep-list/tapi-connectivity:connection-end-point" {
-        container odu-connection-end-point-spec {
-            uses odu-connection-end-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:meg/tapi-oam:mep" {
-        container odu-connection-end-point-spec {
-            uses odu-connection-end-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-oam:oam-context/tapi-oam:meg/tapi-oam:mip" {
-        container odu-mip-spec {
-            uses odu-mip-spec;
-            description "none";
-        }
-        description "none";
-    }
-
-   /**************************
-    * package object-classes
-    **************************/
-    grouping odu-termination-and-client-adaptation-pac {
-        leaf opu-tributary-slot-size {
-            type odu-slot-size;
-            config false;
-            description "This attribute is applicable for ODU2 and ODU3 CTP only. It indicates the slot size of the ODU CTP.";
-        }
-        leaf auto-payload-type {
-            type boolean;
-            config false;
-            description "This attribute is applicable when the ODU CTP object instance represents a lower order ODU CTP Source at the client layer of the ODUP/ODUj-21 adaptation function. The value of true of this attribute configures that the adaptation source function shall fall back to the payload type PT=20 if the conditions specified in 14.3.10.1/G.798 are satisfied. ";
-        }
-        leaf configured-client-type {
-            type tapi-dsr:digital-signal-type;
-            config false;
-            description "This attribute configures the type of the client CTP of the server ODU TTP.";
-        }
-        leaf configured-mapping-type {
-            type mapping-type;
-            config false;
-            description "This attributes indicates the configured mapping type.";
-        }
-        container accepted-payload-type {
-            config false;
-            uses odu-payload-type;
-            description "This attribute is applicable when the ODU CTP object instance represents a lower order ODU CTP Sink at the client layer of the ODUP/ODU[i]j or ODUP/ODUj-21 adaptation function.
-                This attribute is a 2-digit Hex code that indicates the new accepted payload type.
-                Valid values are defined in Table 15-8 of ITU-T Recommendation G.709 with one additional value UN_INTERPRETABLE.";
-        }
-        description "This Pac contains the attributes associated with the client adaptation function of the server layer TTP
-            It is present only if the CEP contains a TTP";
-    }
-    grouping odu-connection-end-point-spec {
-        container odu-common {
-            uses odu-common-pac;
-            description "none";
-        }
-        container odu-term-and-adapter {
-            config false;
-            uses odu-termination-and-client-adaptation-pac;
-            description "none";
-        }
-        container odu-ctp {
-            config false;
-            uses odu-ctp-pac;
-            description "none";
-        }
-        container odu-protection {
-            config false;
-            uses odu-protection-pac;
-            description "none";
-        }
-        description "none";
-    }
-    grouping odu-pool-pac {
-        leaf client-capacity {
-            type uint64;
-            description "none";
-        }
-        leaf max-client-instances {
-            type uint64;
-            config false;
-            description "none";
-        }
-        leaf max-client-size {
-            type uint64;
-            config false;
-            description "none";
-        }
-        description "none";
-    }
-    grouping odu-node-edge-point-spec {
-        container odu-pool {
-            config false;
-            uses odu-pool-pac;
-            description "none";
-        }
-        description "none";
-    }
-    grouping odu-ctp-pac {
-        leaf-list tributary-slot-list {
-            type uint64;
-            config false;
-            description "This attribute contains a set of distinct (i.e. unique) integers (e.g. 2, 3, 5, 9, 15 representing the tributary slots TS2, TS3, TS5, TS9 and TS15) which represents the resources occupied by the Low Order ODU Link Connection (e.g. carrying an ODUflex with a bit rate of 6.25G).
-                This attribute applies when the LO ODU_ ConnectionTerminationPoint connects with an HO ODU_TrailTerminationPoint object.
-                It will not apply if this ODU_ ConnectionTerminationPoint object directly connects to an OTU_TrailTerminationPoint object (i.e. OTU has no trib slots).
-                The upper bound of the integer allowed in this set is a function of the HO-ODU server layer to which the ODU connection has been mapped (adapted).
-                Thus, for example, M=8/32/80 for ODU2/ODU3/ODU4 server layers (respectively). Note that the value of this attribute can be changed only in the case of ODUflex and has to be through specific operations (i.e. not be changing the attribute tributarySlotList directly).";
-        }
-        leaf tributary-port-number {
-            type uint64;
-            config false;
-            description "This attribute identifies the tributary port number that is associated with the ODU CTP.
-                range of type : The value range depends on the size of the Tributary Port Number (TPN) field used which depends on th server-layer ODU or OTU.
-                In case of ODUk mapping into OTUk, there is no TPN field, so the tributaryPortNumber shall be zero.
-                In case of LO ODUj mapping over ODU1, ODU2 or ODU3, the TPN is encoded in a 6-bit field so the value range is 0-63. See clause 14.4.1/G.709-2016.
-                In case of LO ODUj mapping over ODU4, the TPN is encoded in a 7-bit field so the value range is 0-127. See clause 14.4.1.4/G.709-2016.
-                In case of ODUk mapping over ODUCn, the TPN is encoded in a 14-bit field so the value range is 0-16383. See clause 20.4.1.1/G.709-2016.
-                ";
-        }
-        leaf accepted-msi {
-            type string;
-            config false;
-            description "This attribute is applicable when the ODU CTP object instance represents a lower order ODU1 or ODU2 CTP Sink at the client layer of the ODU3P/ODU12 adaptation function or represents a lower order ODUj CTP Sink at the client layer of the ODUP/ODUj-21 adaptation function. This attribute is a 1-byte field that represents the accepted multiplex structure of the adaptation function. ";
-        }
-        description "This Pac contains the attributes associated with the CTP
-            It is present only if the CEP contains a CTP";
-    }
-    grouping odu-mep-spec {
-        container odu-mep {
-            uses odu-mep-pac;
-            description "none";
-        }
-        container odu-ncm {
-            config false;
-            uses odu-ncm-pac;
-            description "none";
-        }
-        container odu-tcm {
-            config false;
-            uses odu-tcm-mep-pac;
-            description "none";
-        }
-        container odu-defect {
-            uses odu-defect-pac;
-            description "none";
-        }
-        container odu-pm {
-            uses odu-pm-pac;
-            description "none";
-        }
-        description "none";
-    }
-    grouping odu-protection-pac {
-        leaf aps-enable {
-            type boolean;
-            default "true";
-            description "This attribute is for enabling/disabling the automatic protection switching (APS) capability at the transport adaptation function that is represented by the ODU_ConnectionTerminationPoint object class. It triggers the MI_APS_EN signal to the transport adaptation function.";
-        }
-        leaf aps-level {
-            type uint64;
-            description "This attribute is for configuring the automatic protection switching (APS) level that should operate at the transport adaptation function that is represented by the ODU_ConnectionTerminationPoint object class. It triggers the MI_APS_LVL signal to the transport adaptation function. The value 0 means path and the values 1 through 6 mean TCM level 1 through 6 respectively.";
-        }
-        description "none";
-    }
-    grouping odu-ncm-pac {
-        leaf-list tcm-fields-in-use {
-            type uint64;
-            config false;
-            description "This attribute indicates the used TCM fields of the ODU OH.";
-        }
-        description "none";
-    }
-    grouping odu-tcm-mep-pac {
-        leaf tcm-extension {
-            type tcm-extension;
-            description "none";
-        }
-        leaf tcm-mode {
-            type tcm-mode;
-            description "This attribute specifies the TCM mode at the entity. Valid values are: Operational, Monitor, and Transparent.";
-        }
-        leaf codirectional {
-            type boolean;
-            config false;
-            description "This attribute specifies the directionality of the ODUT MEP with respect to the associated ODU CEP. The value of TRUE means that the sink part of the ODUT MEP terminates the same signal direction as the sink part of the ODU CEP. The Source part behaves similarly. This attribute is meaningful only on objects instantiated under ODU CEP, and at least one among ODU CEP and the subordinate object is bidirectional.";
-        }
-        leaf ac-status-source {
-            type tcm-status;
-            config false;
-            description "This attribute indicates the status of the accepted TCM. ";
-        }
-        leaf ac-status-sink {
-            type tcm-status;
-            config false;
-            description "This attribute indicates the status of the accepted TCM. ";
-        }
-        leaf admin-state-source {
-            type tapi-common:administrative-state;
-            description "This attribute provides the capability to provision the LOCK signal at the source, which is one of the ODU maintenance signals.  When a Tandem Connection endpoint is set to admin state locked, it will insert the ODU-LCK signal in the source direction.";
-        }
-        leaf admin-state-sink {
-            type tapi-common:administrative-state;
-            description "This attribute provides the capability to provision the LOCK signal at the sink, which is one of the ODU maintenance signals. When a Tandem Connection endpoint is set to admin state locked, it will insert the ODU-LCK signal in the downstream direction.";
-        }
-        uses odu-tcm-mip-pac;
-        description "none";
-    }
-    grouping odu-mip-spec {
-        container odu-mip {
-            config false;
-            uses odu-mip-pac;
-            description "none";
-        }
-        container odu-ncm {
-            config false;
-            uses odu-ncm-pac;
-            description "none";
-        }
-        container odu-tcm {
-            config false;
-            uses odu-tcm-mip-pac;
-            description "none";
-        }
-        container odu-pm {
-            uses odu-pm-pac;
-            description "none";
-        }
-        container odu-defect {
-            uses odu-defect-pac;
-            description "none";
-        }
-        description "none";
-    }
-    grouping odu-mip-pac {
-        leaf acti {
-            type string;
-            config false;
-            description "The Trail Trace Identifier (TTI) information recovered (Accepted) from the TTI overhead position at the sink of a trail.";
-        }
-        leaf ex-dapi {
-            type string;
-            description "The Expected Destination Access Point Identifier (ExDAPI), provisioned by the managing system, to be compared with the TTI accepted at the overhead position of the sink for the purpose of checking the integrity of connectivity.";
-        }
-        leaf ex-sapi {
-            type string;
-            description "The Expected Source Access Point Identifier (ExSAPI), provisioned by the managing system, to be compared with the TTI accepted at the overhead position of the sink for the purpose of checking the integrity of connectivity.
-                ";
-        }
-        leaf tim-act-disabled {
-            type boolean;
-            default "true";
-            description "This attribute provides the control capability for the managing system to enable or disable the Consequent Action function when detecting Trace Identifier Mismatch (TIM) at the trail termination sink.";
-        }
-        leaf tim-det-mode {
-            type tim-det-mo;
-            description "This attribute indicates the mode of the Trace Identifier Mismatch (TIM) Detection function allowed values: OFF, SAPIonly, DAPIonly, SAPIandDAPI";
-        }
-        leaf deg-m {
-            type uint64;
-            description "This attribute indicates the threshold level for declaring a Degraded Signal defect (dDEG). A dDEG shall be declared if DegM consecutive bad PM Seconds are detected.";
-        }
-        container deg-thr {
-            uses deg-thr;
-            description "This attribute indicates the threshold level for declaring a performance monitoring (PM) Second to be bad. The value of the threshold can be provisioned in terms of number of errored blocks or in terms of percentage of errored blocks. For percentage-based specification, in order to support provision of less than 1%, the specification consists of two fields. The first field indicates the granularity of percentage. For examples, in 1%, in 0.1%, or in 0.01%, etc. The second field indicates the multiple of the granularity. For number of errored block based, the value is a positive integer.";
-        }
-        description "none";
-    }
-    grouping odu-tcm-mip-pac {
-        leaf tcm-field {
-            type uint64;
-            config false;
-            description "This attribute indicates the tandem connection monitoring field of the ODU OH.";
-        }
-        description "none";
-    }
-    grouping odu-mep-pac {
-        leaf dm-source {
-            type boolean;
-            description "This attribute is for configuring the delay measurement process at the trail termination function represented by the subject TTP object class. It models the MI_DM_Source MI signal. If MI_DM_Source is false, then the value of the DMp bit is determined by the RI_DM. If MI_DM_Source is true, then the value of the DMp bit is set to MI_DMValue.";
-        }
-        leaf dm-value {
-            type boolean;
-            description "This attribute is for setting the DMp and DMti bits of the delay measurement process. The value of 'true' sets the DMp and DMti bits to 0 and the value of 'false' to 1.";
-        }
-        leaf txti {
-            type string;
-            description "The Trail Trace Identifier (TTI) information, provisioned by the managing system at the termination source, to be placed in the TTI overhead position of the source of a trail for transmission.
-                ";
-        }
-        uses odu-mip-pac;
-        description "none";
-    }
-    grouping odu-common-pac {
-        leaf odu-type {
-            type odu-type;
-            config false;
-            description "This attribute specifies the type of the ODU termination point.";
-        }
-        leaf odu-rate {
-            type uint64;
-            config false;
-            description "This attribute indicates the rate of the ODU terminatino point.
-                This attribute is Set at create; i.e., once created it cannot be changed directly.
-                In case of resizable ODU flex, its value can be changed via HAO (not directly on the attribute).
-                ";
-        }
-        leaf odu-rate-tolerance {
-            type uint64;
-            config false;
-            description "This attribute indicates the rate tolerance of the ODU termination point.
-                Valid values are real value in the unit of ppm.
-                Standardized values are defined in Table 7-2/G.709.";
-        }
-        description "none";
-    }
-    grouping odu-pm-pac {
-        leaf n-bbe {
-            type uint64;
-            description "Near-end Background Block Error";
-        }
-        leaf f-bbe {
-            type uint64;
-            config false;
-            description "Far-end Background Block Error";
-        }
-        leaf n-ses {
-            type uint64;
-            description "Near-end Severely Errored Second";
-        }
-        leaf f-ses {
-            type uint64;
-            description "Far-end Severely Errored Second";
-        }
-        container uas {
-            uses uas-choice;
-            description "UnAvailable Second";
-        }
-        description "Instance of this object class contains the ODUP layer-specific Current Data. This object class is a subclass of the OTN_CurrentData object class.
-            PM data attributes: fBbe, fSes, nBbe, nSes. uas";
-    }
-    grouping odu-defect-pac {
-        leaf bdi {
-            type boolean;
-            config false;
-            description "Backward Defect Indication";
-        }
-        leaf deg {
-            type boolean;
-            config false;
-            description "Signal Degraded";
-        }
-        leaf lck {
-            type boolean;
-            config false;
-            description "Locked";
-        }
-        leaf oci {
-            type boolean;
-            config false;
-            description "Open Connection Indicator";
-        }
-        leaf ssf {
-            type boolean;
-            config false;
-            description "Server Signal Failure";
-        }
-        leaf tim {
-            type boolean;
-            config false;
-            description "Trail Trace Identifier Mismatch";
-        }
-        description "The valid list of defects raised on the entity. If the value of any attribute is true, then the corresponding defect is raised.";
-    }
-
-   /**************************
-    * package type-definitions
-    **************************/
-    identity ODU_TYPE {
-        base tapi-common:LAYER_PROTOCOL_QUALIFIER;
-        description "none";
-    }
-    identity ODU_TYPE_ODU0 {
-        base ODU_TYPE;
-        description "none";
-    }
-    identity ODU_TYPE_ODU1 {
-        base ODU_TYPE;
-        description "none";
-    }
-    identity ODU_TYPE_ODU2 {
-        base ODU_TYPE;
-        description "none";
-    }
-    identity ODU_TYPE_ODU2E {
-        base ODU_TYPE;
-        description "none";
-    }
-    identity ODU_TYPE_ODU3 {
-        base ODU_TYPE;
-        description "none";
-    }
-    identity ODU_TYPE_ODU4 {
-        base ODU_TYPE;
-        description "none";
-    }
-    identity ODU_TYPE_ODU_FLEX {
-        base ODU_TYPE;
-        description "none";
-    }
-    identity ODU_TYPE_ODU_CN {
-        base ODU_TYPE;
-        description "none";
-    }
-    typedef odu-type {
-        type identityref {
-            base ODU_TYPE;
-        }
-        description "none";
-    }
-    typedef mapping-type {
-        type enumeration {
-            enum AMP {
-                description "none";
-            }
-            enum BMP {
-                description "none";
-            }
-            enum GFP-F {
-                description "none";
-            }
-            enum GMP {
-                description "none";
-            }
-            enum TTP_GFP_BMP {
-                description "none";
-            }
-            enum NULL {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    typedef tim-det-mo {
-        type enumeration {
-            enum DAPI {
-                description "none";
-            }
-            enum SAPI {
-                description "none";
-            }
-            enum BOTH {
-                description "none";
-            }
-            enum OFF {
-                description "none";
-            }
-        }
-        description "List of modes for trace identifier mismatch detection.";
-    }
-    typedef odu-slot-size {
-        type enumeration {
-            enum 1G25 {
-                description "none";
-            }
-            enum 2G5 {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    grouping odu-payload-type {
-        leaf named-payload-type {
-            type odu-named-payload-type;
-            description "none";
-        }
-        leaf hex-payload-type {
-            type uint64;
-            description "none";
-        }
-        description "none";
-    }
-    typedef odu-named-payload-type {
-        type enumeration {
-            enum UNKNOWN {
-                description "none";
-            }
-            enum UNINTERPRETABLE {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    grouping deg-thr {
-        leaf deg-thr-value {
-            type uint64;
-            description "Percentage of detected errored blocks";
-        }
-        leaf deg-thr-type {
-            type deg-thr-type;
-            description "Number of errored blocks";
-        }
-        leaf percentage-granularity {
-            type percentage-granularity;
-            description "none";
-        }
-        description "Degraded Threshold, specify either the percentage or the number of Errored Blocks in the defined interval.
-            degThrValue when type is PERCENTAGE:
-            percentageGranularity is used to indicate the number of decimal points
-            So if percentageGranularity is ones, a value of 1 in degThrValue would indicate 1%, a value of 10 = 10%, a value of 100 = 100%
-            So if percentageGranularity is thousandths a value of 1 in degThrValue would indicate 0.001%, a value of 1000 = 1%, a value of 1000000 = 100%
-            degThrValue when type is NUMBER_ERROR_BLOCKS:
-            Number of Errored Blocks is captured in an integer value.";
-    }
-    typedef deg-thr-type {
-        type enumeration {
-            enum PERCENTAGE {
-                description "Choice of % or Number of errored blocks";
-            }
-            enum NUMBER_ERRORED_BLOCKS {
-                description "Number of % or blocks";
-            }
-        }
-        description "The value of the threshold can be provisioned in terms of number of errored blocks or in terms of percentage of errored blocks. For percentage-based specification, in order to support provision of less than 1%, the specification consists of two fields. The first field indicates the granularity of percentage. For examples, in 1%, in 0.1%, or in 0.01%, etc. The second field indicates the multiple of the granularity. For number of errored block based, the value is a positive integer.";
-    }
-    typedef tcm-status {
-        type enumeration {
-            enum NO_SOURCE_TC {
-                description "TCM byte 3 (bits 6 7 8) -- 0 0 0, No source Tandem Connection";
-            }
-            enum IN_USE_WITHOUT_IAE {
-                description "TCM byte 3 (bits 6 7 8) -- 0 0 1,  In use without IAE (Incoming Alignment Error)";
-            }
-            enum IN_USE_WITH_IAE {
-                description "TCM byte 3 (bits 6 7 8) -- 0 1 0, In use with IAE (Incoming Alignment Error)";
-            }
-            enum RESERVED_1 {
-                description "TCM byte 3 (bits 6 7 8) -- 0 1 1, Reserved for future international standardization";
-            }
-            enum RESERVED_2 {
-                description "TCM byte 3 (bits 6 7 8) -- 1 0 0, Reserved for future international standardization";
-            }
-            enum LCK {
-                description "TCM byte 3 (bits 6 7 8) -- 1 0 1, Maintenance signal: ODU-LCK";
-            }
-            enum OCI {
-                description "TCM byte 3 (bits 6 7 8) -- 1 1 0, Maintenance signal: ODU-OCI";
-            }
-            enum AIS {
-                description "TCM byte 3 (bits 6 7 8) -- 1 1 1, Maintenance signal: ODU-AIS";
-            }
-        }
-        description "See Table 15-5/G.709/Y.1331 ";
-    }
-    typedef tcm-mode {
-        type enumeration {
-            enum OPERATIONAL {
-                description "none";
-            }
-            enum TRANSPARENT {
-                description "none";
-            }
-            enum MONITOR {
-                description "none";
-            }
-        }
-        description "List of value modes for the sink side of the tandem connection monitoring function.";
-    }
-    typedef tcm-monitoring {
-        type enumeration {
-            enum INTRUSIVE {
-                description "none";
-            }
-            enum NON-INTRUSIVE {
-                description "none";
-            }
-        }
-        description "Monitoring types for the tandem connection monitoring function.";
-    }
-    typedef tcm-extension {
-        type enumeration {
-            enum NORMAL {
-                description "none";
-            }
-            enum PASS-THROUGH {
-                description "none";
-            }
-            enum ERASE {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    typedef percentage-granularity {
-        type enumeration {
-            enum ONES {
-                description "none";
-            }
-            enum ONE_TENTHS {
-                description "value * (1/10)";
-            }
-            enum ONE_HUNDREDTHS {
-                description "value * (1/100)";
-            }
-            enum ONE_THOUSANDTHS {
-                description "value * (1/1000)";
-            }
-        }
-        description "none";
-    }
-    grouping uas-choice {
-        leaf bidirectional {
-            type boolean;
-            default "true";
-            description "none";
-        }
-        leaf uas {
-            type uint64;
-            description "none";
-        }
-        leaf nuas {
-            type uint64;
-            description "none";
-        }
-        leaf fuas {
-            type uint64;
-            description "none";
-        }
-        description "If bidirectional is TRUE then use the uas attribute, if bidirectional is FALSE use the nuas, and fuas attributes";
-    }
-}
diff --git a/tapimodels/src/main/yang/tapi-path-computation@2018-12-10.yang b/tapimodels/src/main/yang/tapi-path-computation@2018-12-10.yang
deleted file mode 100644 (file)
index df6ab76..0000000
+++ /dev/null
@@ -1,430 +0,0 @@
-module tapi-path-computation {
-    namespace "urn:onf:otcc:yang:tapi-path-computation";
-    prefix tapi-path-computation;
-    import tapi-topology {
-        prefix tapi-topology;
-    }
-    import tapi-common {
-        prefix tapi-common;
-    }
-    organization "ONF OTCC (Open Transport Configuration & Control) Project";
-    contact "
-         Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>
-         Project List: <mailto:transport-api@opennetworking.org>
-         Editor: Karthik Sethuraman
-                 <mailto:karthik.sethuraman@necam.com>";
-    description "
-        This module contains TAPI Path Computation Model definitions.
-        Source: TapiPathComputation.uml
-        - The TAPI YANG models included in this TAPI release are a *normative* part of the TAPI SDK.
-        - The YANG specifications have been generated from the corresponding UML model using the [ONF EAGLE UML2YANG mapping tool]
-          <https://github.com/OpenNetworkingFoundation/EagleUmlYang>
-          and further edited manually to comply with the [ONF IISOMI UML2YANG mapping guidelines]
-          <https://wiki.opennetworking.org/display/OIMT/UML+-+YANG+Guidelines>
-        - Status of YANG model artifacts can be determined by referring to the corresponding UML artifacts.
-          As described in the UML models, some artifacts are considered *experimental*, and thus the corresponding YANG artifacts.
-        - The ONF TAPI release process does not guarantee backward compatibility of YANG models across major versions of TAPI releases.
-          The YANG model backward compatibility criteria are outlined in section 11 of <https://tools.ietf.org/html/rfc7950>.
-          YANG models included in this release may not be backward compatible with previous TAPI releases.
-        Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.
-        License: This module is distributed under the Apache License 2.0";
-    revision 2018-12-10 {
-        description "ONF Transport API version 2.1.1.
-                   Changes included in this TAPI release (v2.1.1) are listed in
-                   <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.1.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
-    }
-    revision 2018-10-16 {
-        description "ONF Transport API version 2.1.0.
-                   Changes included in this TAPI release (v2.1.0) are listed in
-                   <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
-    }
-    revision 2018-03-07 {
-        description "ONF Transport API version 2.0.2
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";
-    }
-    revision 2018-02-16 {
-        description "ONF Transport API version 2.0.1
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";
-    }
-    revision 2018-01-02 {
-        description "ONF Transport API version 2.0.0
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";
-    }
-    augment "/tapi-common:context" {
-        container path-computation-context {
-            uses path-computation-context;
-            description "Augments the base TAPI Context with PathComputationService information";
-        }
-        description "Augments the base TAPI Context with PathComputationService information";
-    }
-
-   /**************************
-    * definitions of refrences
-    **************************/
-    grouping path-ref {
-        leaf path-uuid {
-            type leafref {
-                path '/tapi-common:context/tapi-path-computation:path-computation-context/tapi-path-computation:path/tapi-path-computation:uuid';
-            }
-            description "none";
-        }
-        description "none";
-    }
-
-   /**************************
-    * package object-classes
-    **************************/
-    grouping path {
-        list link {
-            uses tapi-topology:link-ref;
-            key 'topology-uuid link-uuid';
-            config false;
-            min-elements 1;
-            description "none";
-        }
-        container routing-constraint {
-            config false;
-            uses routing-constraint;
-            description "none";
-        }
-        leaf direction {
-            type tapi-common:forwarding-direction;
-            config false;
-            description "none";
-        }
-        leaf layer-protocol-name {
-            type tapi-common:layer-protocol-name;
-            config false;
-            description "none";
-        }
-        uses tapi-common:resource-spec;
-        description "Path is described by an ordered list of TE Links. A TE Link is defined by a pair of Node/NodeEdgePoint IDs. A Connection is realized by concatenating link resources (associated with a Link) and the lower-level connections (cross-connections) in the different nodes";
-    }
-    grouping path-service-end-point {
-        container service-interface-point {
-            uses tapi-common:service-interface-point-ref;
-            description "none";
-        }
-        leaf layer-protocol-name {
-            type tapi-common:layer-protocol-name;
-            description "none";
-        }
-        leaf layer-protocol-qualifier {
-            type tapi-common:layer-protocol-qualifier;
-            description "none";
-        }
-        container capacity {
-            uses tapi-common:capacity;
-            description "none";
-        }
-        leaf role {
-            type tapi-common:port-role;
-            description "Each EP of the FC has a role (e.g., working, protection, protected, symmetric, hub, spoke, leaf, root)  in the context of the FC with respect to the FC function. ";
-        }
-        leaf direction {
-            type tapi-common:port-direction;
-            description "The orientation of defined flow at the EndPoint.";
-        }
-        uses tapi-common:local-class;
-        description "The association of the FC to LTPs is made via EndPoints.
-            The EndPoint (EP) object class models the access to the FC function.
-            The traffic forwarding between the associated EPs of the FC depends upon the type of FC and may be associated with FcSwitch object instances.
-            In cases where there is resilience the EndPoint may convey the resilience role of the access to the FC.
-            It can represent a protected (resilient/reliable) point or a protecting (unreliable working or protection) point.
-            The EP replaces the Protection Unit of a traditional protection model.
-            The ForwadingConstruct can be considered as a component and the EndPoint as a Port on that component";
-    }
-    grouping path-computation-service {
-        list path {
-            uses path-ref;
-            key 'path-uuid';
-            config false;
-            min-elements 1;
-            description "none";
-        }
-        list end-point {
-            key 'local-id';
-            min-elements 2;
-            max-elements 2;
-            uses path-service-end-point;
-            description "none";
-        }
-        container routing-constraint {
-            uses routing-constraint;
-            description "none";
-        }
-        container topology-constraint {
-            uses topology-constraint;
-            description "none";
-        }
-        container objective-function {
-            uses path-objective-function;
-            description "none";
-        }
-        container optimization-constraint {
-            uses path-optimization-constraint;
-            description "none";
-        }
-        uses tapi-common:service-spec;
-        description "none";
-    }
-    grouping path-objective-function {
-        leaf bandwidth-optimization {
-            type tapi-common:directive-value;
-            description "none";
-        }
-        leaf concurrent-paths {
-            type tapi-common:directive-value;
-            description "none";
-        }
-        leaf cost-optimization {
-            type tapi-common:directive-value;
-            description "none";
-        }
-        leaf link-utilization {
-            type tapi-common:directive-value;
-            description "none";
-        }
-        leaf resource-sharing {
-            type tapi-common:directive-value;
-            description "none";
-        }
-        uses tapi-common:local-class;
-        description "none";
-    }
-    grouping path-optimization-constraint {
-        leaf traffic-interruption {
-            type tapi-common:directive-value;
-            description "none";
-        }
-        uses tapi-common:local-class;
-        description "none";
-    }
-    grouping routing-constraint {
-        list cost-characteristic {
-            key 'cost-name';
-            uses tapi-topology:cost-characteristic;
-            description "The list of costs where each cost relates to some aspect of the TopologicalEntity.";
-        }
-        list latency-characteristic {
-            key 'traffic-property-name';
-            uses tapi-topology:latency-characteristic;
-            description "The effect on the latency of a queuing process. This only has significant effect for packet based systems and has a complex characteristic.";
-        }
-        list risk-diversity-characteristic {
-            key 'risk-characteristic-name';
-            uses tapi-topology:risk-characteristic;
-            description "none";
-        }
-        leaf diversity-policy {
-            type diversity-policy;
-            description "none";
-        }
-        leaf route-objective-function {
-            type route-objective-function;
-            description "none";
-        }
-        leaf route-direction {
-            type tapi-common:forwarding-direction;
-            description "none";
-        }
-        leaf is-exclusive {
-            type boolean;
-            default "true";
-            description "To distinguish if the resources are to be exclusive to the service";
-        }
-        description "none";
-    }
-    grouping path-computation-context {
-        list path-comp-service {
-            key 'uuid';
-            uses path-computation-service;
-            description "none";
-        }
-        list path {
-            key 'uuid';
-            config false;
-            uses path;
-            description "none";
-        }
-        description "none";
-    }
-    grouping topology-constraint {
-        leaf-list include-topology {
-            type tapi-common:uuid;
-            description "none";
-        }
-        leaf-list avoid-topology {
-            type tapi-common:uuid;
-            description "none";
-        }
-        leaf-list include-path {
-            type tapi-common:uuid;
-            description "none";
-        }
-        leaf-list exclude-path {
-            type tapi-common:uuid;
-            description "none";
-        }
-        leaf-list include-link {
-            type tapi-common:uuid;
-            description "This is a loose constraint - that is it is unordered and could be a partial list ";
-        }
-        leaf-list exclude-link {
-            type tapi-common:uuid;
-            description "none";
-        }
-        leaf-list include-node {
-            type tapi-common:uuid;
-            description "This is a loose constraint - that is it is unordered and could be a partial list";
-        }
-        leaf-list exclude-node {
-            type tapi-common:uuid;
-            description "none";
-        }
-        leaf-list preferred-transport-layer {
-            type tapi-common:layer-protocol-name;
-            description "soft constraint requested by client to indicate the layer(s) of transport connection that it prefers to carry the service. This could be same as the service layer or one of the supported server layers";
-        }
-        description "none";
-    }
-
-   /**************************
-    * package type-definitions
-    **************************/
-    typedef route-objective-function {
-        type enumeration {
-            enum MIN_WORK_ROUTE_HOP {
-                description "none";
-            }
-            enum MIN_WORK_ROUTE_COST {
-                description "none";
-            }
-            enum MIN_WORK_ROUTE_LATENCY {
-                description "none";
-            }
-            enum MIN_SUM_OF_WORK_AND_PROTECTION_ROUTE_HOP {
-                description "none";
-            }
-            enum MIN_SUM_OF_WORK_AND_PROTECTION_ROUTE_COST {
-                description "none";
-            }
-            enum MIN_SUM_OF_WORK_AND_PROTECTION_ROUTE_LATENCY {
-                description "none";
-            }
-            enum LOAD_BALANCE_MAX_UNUSED_CAPACITY {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    typedef diversity-policy {
-        type enumeration {
-            enum SRLG {
-                description "none";
-            }
-            enum SRNG {
-                description "none";
-            }
-            enum SNG {
-                description "none";
-            }
-            enum NODE {
-                description "none";
-            }
-            enum LINK {
-                description "none";
-            }
-        }
-        description "none";
-    }
-
-   /**************************
-    * package interfaces
-    **************************/
-    rpc compute-p-2-p-path {
-        description "none";
-        input {
-            list sep {
-                key 'local-id';
-                min-elements 2;
-                max-elements 2;
-                uses path-service-end-point;
-                description "none";
-            }
-            container routing-constraint {
-                uses routing-constraint;
-                description "none";
-            }
-            container topology-constraint {
-                uses topology-constraint;
-                description "none";
-            }
-            container objective-function {
-                uses path-objective-function;
-                description "none";
-            }
-        }
-        output {
-            container service {
-                uses path-computation-service;
-                description "none";
-            }
-        }
-    }
-    rpc optimize-p-2-p-path {
-        description "none";
-        input {
-            leaf path-id-or-name {
-                type string;
-                description "none";
-            }
-            container routing-constraint {
-                uses routing-constraint;
-                description "none";
-            }
-            container optimization-constraint {
-                uses path-optimization-constraint;
-                description "none";
-            }
-            container objective-function {
-                uses path-objective-function;
-                description "none";
-            }
-        }
-        output {
-            container service {
-                uses path-computation-service;
-                description "none";
-            }
-        }
-    }
-    rpc delete-p-2-p-path {
-        description "none";
-        input {
-            leaf path-id-or-name {
-                type string;
-                description "none";
-            }
-        }
-        output {
-            container service {
-                uses path-computation-service;
-                description "none";
-            }
-        }
-    }
-}
diff --git a/tapimodels/src/main/yang/tapi-photonic-media@2018-12-10.yang b/tapimodels/src/main/yang/tapi-photonic-media@2018-12-10.yang
deleted file mode 100644 (file)
index 0fd14b3..0000000
+++ /dev/null
@@ -1,933 +0,0 @@
-module tapi-photonic-media {
-    namespace "urn:onf:otcc:yang:tapi-photonic-media";
-    prefix tapi-photonic-media;
-    import tapi-common {
-        prefix tapi-common;
-    }
-    import tapi-connectivity {
-        prefix tapi-connectivity;
-    }
-    import tapi-topology {
-        prefix tapi-topology;
-    }
-    organization "ONF OTCC (Open Transport Configuration & Control) Project";
-    contact "
-         Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>
-         Project List: <mailto:transport-api@opennetworking.org>
-         Editor: Karthik Sethuraman
-                 <mailto:karthik.sethuraman@necam.com>";
-    description "
-        This module contains TAPI PhotonicMedia Model definitions.
-        Source: TapiPhotonicMedia.uml
-        - The TAPI YANG models included in this TAPI release are a *normative* part of the TAPI SDK.
-        - The YANG specifications have been generated from the corresponding UML model using the [ONF EAGLE UML2YANG mapping tool]
-          <https://github.com/OpenNetworkingFoundation/EagleUmlYang>
-          and further edited manually to comply with the [ONF IISOMI UML2YANG mapping guidelines]
-          <https://wiki.opennetworking.org/display/OIMT/UML+-+YANG+Guidelines>
-        - Status of YANG model artifacts can be determined by referring to the corresponding UML artifacts.
-          As described in the UML models, some artifacts are considered *experimental*, and thus the corresponding YANG artifacts.
-        - The ONF TAPI release process does not guarantee backward compatibility of YANG models across major versions of TAPI releases.
-          The YANG model backward compatibility criteria are outlined in section 11 of <https://tools.ietf.org/html/rfc7950>.
-          YANG models included in this release may not be backward compatible with previous TAPI releases.
-        Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.
-        License: This module is distributed under the Apache License 2.0";
-    revision 2018-12-10 {
-        description "ONF Transport API version 2.1.1.
-                   Changes included in this TAPI release (v2.1.1) are listed in
-                   <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.1.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
-    }
-    revision 2018-10-16 {
-        description "ONF Transport API version 2.1.0.
-                   Changes included in this TAPI release (v2.1.0) are listed in
-                   <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
-    }
-    revision 2018-03-07 {
-        description "ONF Transport API version 2.0.2
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";
-    }
-    revision 2018-02-16 {
-        description "ONF Transport API version 2.0.1
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";
-    }
-    revision 2018-01-02 {
-        description "ONF Transport API version 2.0.0
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";
-    }
-    augment "/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:cep-list/tapi-connectivity:connection-end-point" {
-        container otsi-connection-end-point-spec {
-            uses otsi-connection-end-point-spec;
-            description "Augments the base LayerProtocol information in ConnectionEndPoint with OCH-specific information";
-        }
-        description "Augments the base LayerProtocol information in ConnectionEndPoint with OCH-specific information";
-    }
-    augment "/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point" {
-        container media-channel-node-edge-point-spec {
-            uses media-channel-node-edge-point-spec;
-            description "Augments the base LayerProtocol information in NodeEdgePoint with OCH-specific information";
-        }
-        description "Augments the base LayerProtocol information in NodeEdgePoint with OCH-specific information";
-    }
-    augment "/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:cep-list/tapi-connectivity:connection-end-point" {
-        container otsi-assembly-connection-end-point-spec {
-            uses otsi-assembly-connection-end-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-common:service-interface-point" {
-        container otsi-service-interface-point-spec {
-            uses otsi-service-interface-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-connectivity:connectivity-context/tapi-connectivity:connectivity-service/tapi-connectivity:end-point" {
-        container otsi-connectivity-service-end-point-spec {
-            uses otsi-connectivity-service-end-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-common:service-interface-point" {
-        container media-channel-service-interface-point-spec {
-            uses media-channel-service-interface-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-connectivity:connectivity-context/tapi-connectivity:connectivity-service/tapi-connectivity:end-point" {
-        container media-channel-connectivity-service-end-point-spec {
-            uses media-channel-connectivity-service-end-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:cep-list/tapi-connectivity:connection-end-point" {
-        container media-channel-connection-end-point-spec {
-            uses media-channel-connection-end-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:cep-list/tapi-connectivity:connection-end-point" {
-        container ots-connection-end-point-spec {
-            uses ots-connection-end-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-connectivity:cep-list/tapi-connectivity:connection-end-point" {
-        container media-channel-assembly-spec {
-            uses media-channel-assembly-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:get-service-interface-point-list/tapi-common:output/tapi-common:sip" {
-        container otsi-service-interface-point-spec {
-            uses otsi-service-interface-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:get-service-interface-point-details/tapi-common:output/tapi-common:sip" {
-        container otsi-service-interface-point-spec {
-            uses otsi-service-interface-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-topology:get-node-edge-point-details/tapi-topology:output/tapi-topology:node-edge-point" {
-        container media-channel-node-edge-point-spec {
-            uses media-channel-node-edge-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-connectivity:get-connectivity-service-list/tapi-connectivity:output/tapi-connectivity:service/tapi-connectivity:end-point" {
-        container otsi-connectivity-service-end-point-spec {
-            uses otsi-connectivity-service-end-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-connectivity:get-connectivity-service-details/tapi-connectivity:output/tapi-connectivity:service/tapi-connectivity:end-point" {
-        container otsi-connectivity-service-end-point-spec {
-            uses otsi-connectivity-service-end-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-connectivity:create-connectivity-service/tapi-connectivity:output/tapi-connectivity:service/tapi-connectivity:end-point" {
-        container media-channel-connectivity-service-end-point-spec {
-            uses media-channel-connectivity-service-end-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-connectivity:update-connectivity-service/tapi-connectivity:output/tapi-connectivity:service/tapi-connectivity:end-point" {
-        container media-channel-connectivity-service-end-point-spec {
-            uses media-channel-connectivity-service-end-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-connectivity:get-connectivity-service-details/tapi-connectivity:output/tapi-connectivity:service/tapi-connectivity:end-point" {
-        container media-channel-connectivity-service-end-point-spec {
-            uses media-channel-connectivity-service-end-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-connectivity:get-connectivity-service-list/tapi-connectivity:output/tapi-connectivity:service/tapi-connectivity:end-point" {
-        container media-channel-connectivity-service-end-point-spec {
-            uses media-channel-connectivity-service-end-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-connectivity:create-connectivity-service/tapi-connectivity:input/tapi-connectivity:end-point" {
-        container otsi-connectivity-service-end-point-spec {
-            uses otsi-connectivity-service-end-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-connectivity:update-connectivity-service/tapi-connectivity:input/tapi-connectivity:end-point" {
-        container otsi-connectivity-service-end-point-spec {
-            uses otsi-connectivity-service-end-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-connectivity:update-connectivity-service/tapi-connectivity:input/tapi-connectivity:end-point" {
-        container media-channel-connectivity-service-end-point-spec {
-            uses media-channel-connectivity-service-end-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-connectivity:create-connectivity-service/tapi-connectivity:output/tapi-connectivity:service/tapi-connectivity:end-point" {
-        container otsi-connectivity-service-end-point-spec {
-            uses otsi-connectivity-service-end-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-connectivity:create-connectivity-service/tapi-connectivity:input/tapi-connectivity:end-point" {
-        container media-channel-connectivity-service-end-point-spec {
-            uses media-channel-connectivity-service-end-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-connectivity:update-connectivity-service/tapi-connectivity:output/tapi-connectivity:service/tapi-connectivity:end-point" {
-        container otsi-connectivity-service-end-point-spec {
-            uses otsi-connectivity-service-end-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:get-service-interface-point-details/tapi-common:output/tapi-common:sip" {
-        container media-channel-service-interface-point-spec {
-            uses media-channel-service-interface-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-common:get-service-interface-point-list/tapi-common:output/tapi-common:sip" {
-        container media-channel-service-interface-point-spec {
-            uses media-channel-service-interface-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-connectivity:get-connection-end-point-details/tapi-connectivity:output/tapi-connectivity:connection-end-point" {
-        container media-channel-connection-end-point-spec {
-            uses media-channel-connection-end-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-connectivity:get-connection-end-point-details/tapi-connectivity:output/tapi-connectivity:connection-end-point" {
-        container otsi-assembly-connection-end-point-spec {
-            uses otsi-assembly-connection-end-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-    augment "/tapi-connectivity:get-connection-end-point-details/tapi-connectivity:output/tapi-connectivity:connection-end-point" {
-        container otsi-connection-end-point-spec {
-            uses otsi-connection-end-point-spec;
-            description "none";
-        }
-        description "none";
-    }
-
-   /**************************
-    * package object-classes
-    **************************/
-    grouping otsi-gserver-adaptation-pac {
-        leaf number-of-otsi {
-            type uint64;
-            config false;
-            description "none";
-        }
-        description "none";
-    }
-    grouping otsi-connection-end-point-spec {
-        container otsi-termination {
-            config false;
-            uses otsi-termination-pac;
-            description "none";
-        }
-        description "none";
-    }
-    grouping otsi-termination-pac {
-        container selected-central-frequency {
-            config false;
-            uses central-frequency;
-            description "none";
-        }
-        container selected-application-identifier {
-            config false;
-            uses application-identifier;
-            description "This attribute indicates the selected Application Identifier that is used by the OCh trail termination function. The syntax of ApplicationIdentifier is a pair {ApplicationIdentifierType, PrintableString}. The value of ApplicationIdentifierType is either STANDARD or PROPRIETARY. The value of PrintableString represents the standard application code as defined in the ITU-T Recommendations or a vendor-specific proprietary code. If the ApplicationIdentifierType is STANDARD the value of PrintableString represents a standard application code as defined in the ITU-T Recommendations. If the ApplicationIdentifierType is PROPRIETARY, the first six characters of the PrintableString must contain the Hexadecimal representation of an OUI assigned to the vendor whose implementation generated the Application Identifier; the remaining octets of the PrintableString are unspecified. The value of this attribute of an object instance has to be one of the values identified in the attribute SupportableApplicationIdentifierList of the same object instance. The values and value ranges of the optical interface parameters of a standard application code must be consistent with those values specified in the ITU-T Recommendation for that application code.";
-        }
-        leaf selected-modulation {
-            type modulation-technique;
-            default "UNDEFINED";
-            config false;
-            description "This parameter defines the modulation used at the source";
-        }
-        container selected-spectrum {
-            config false;
-            uses spectrum-band;
-            description "none";
-        }
-        container transmited-power {
-            config false;
-            uses power-properties-pac;
-            description "Measured power at the Transmitter.";
-        }
-        container received-power {
-            uses power-properties-pac;
-            description "none";
-        }
-        container laser-properties {
-            config false;
-            uses laser-properties-pac;
-            description "Laser properties.";
-        }
-        description "Provides status information only.";
-    }
-    grouping media-channel-pool-capability-pac {
-        list supportable-spectrum {
-            key 'upper-frequency lower-frequency';
-            config false;
-            uses spectrum-band;
-            description "none";
-        }
-        list available-spectrum {
-            key 'upper-frequency lower-frequency';
-            config false;
-            uses spectrum-band;
-            description "none";
-        }
-        list occupied-spectrum {
-            key 'upper-frequency lower-frequency';
-            config false;
-            uses spectrum-band;
-            description "none";
-        }
-        description "none";
-    }
-    grouping media-channel-node-edge-point-spec {
-        container mc-pool {
-            config false;
-            uses media-channel-pool-capability-pac;
-            description "none";
-        }
-        description "none";
-    }
-    grouping otsi-routing-spec {
-        leaf optical-routing-strategy {
-            type optical-routing-strategy;
-            description "none";
-        }
-        description "none";
-    }
-    grouping media-channel-properties-pac {
-        container occupied-spectrum {
-            config false;
-            uses spectrum-band;
-            description "none";
-        }
-        container measured-power-ingress {
-            config false;
-            uses power-properties-pac;
-            description "none";
-        }
-        container measured-power-egress {
-            uses power-properties-pac;
-            description "none";
-        }
-        description "none";
-    }
-    grouping otsi-assembly-connection-end-point-spec {
-        container otsi-adapter {
-            config false;
-            uses otsi-gserver-adaptation-pac;
-            description "none";
-        }
-        container fec-parameters {
-            config false;
-            uses fec-properties-pac;
-            description "none";
-        }
-        description "none";
-    }
-    grouping otsi-capability-pac {
-        list supportable-central-frequency-spectrum-band {
-            leaf lower-central-frequency {
-                type uint64;
-                description "The lower central frequency can be tuned in the laser specified in MHz.
-                It is the oscillation frequency of the corresponding electromagnetic wave. ";
-            }
-            leaf upper-central-frequency {
-                type uint64;
-                description "The lower central frequency can be tuned in the laser specified in MHz.
-                It is the oscillation frequency of the corresponding electromagnetic wave. ";
-            }
-            container frequency-constraint {
-                uses frequency-constraint;
-                description "none";
-            }
-            config false;
-            description "Each spectrum band supported for otsi trasmitter to be tuned on, is specified
-              as per it's lower and upper central frequencies supported and its frequency constraints,
-              consisting in the frequency Grid and the AdjustmentGranularity, used to uniquely identify all
-              central frequencies supported within the band.";
-        }
-        list supportable-application-identifier {
-            key 'application-code';
-            config false;
-            uses application-identifier;
-            description "The list of supportable ApplicationIdentifiers.";
-        }
-        leaf-list supportable-modulation {
-            type modulation-technique;
-            config false;
-            description "This parameter defines the modulation used at the source";
-        }
-        container total-power-warn-threshold {
-            config false;
-            uses total-power-threshold-pac;
-            description "none";
-        }
-        description "Can read the status of the warning for the upper value that the power can reach.";
-    }
-    grouping otsi-service-interface-point-spec {
-        container otsi-capability {
-            config false;
-            uses otsi-capability-pac;
-            description "none";
-        }
-        description "none";
-    }
-    grouping otsi-connectivity-service-end-point-spec {
-        container otsi-config {
-            uses otsi-termination-config-pac;
-            description "none";
-        }
-        description "none";
-    }
-    grouping otsi-termination-config-pac {
-        container central-frequency {
-            uses central-frequency;
-            description "The central frequency of the laser. It is the oscillation frequency of the corresponding electromagnetic wave";
-        }
-        container spectrum {
-            uses spectrum-band;
-            description "none";
-        }
-        container application-identifier {
-            uses application-identifier;
-            description "This attribute indicates the selected Application Identifier.";
-        }
-        leaf modulation {
-            type modulation-technique;
-            description "The modulation techniqu selected at the source.";
-        }
-        leaf laser-control {
-            type laser-control-type;
-            description "Laser control can be FORCED-ON, FORCED-OFF or LASER-SHUTDOWN";
-        }
-        container transmit-power {
-            uses power-properties-pac;
-            description "Transmit power as requested.";
-        }
-        leaf total-power-warn-threshold-upper {
-            type decimal64 {
-                fraction-digits 7;
-            }
-            description "Allows to configure the Upper power threshold which is expected to be different from Default, but within the Min and Max values specified as OTSi SIP capability.";
-        }
-        leaf total-power-warn-threshold-lower {
-            type decimal64 {
-                fraction-digits 7;
-            }
-            description "Allows to configure the Lowerpower threshold which is expected to be different from Default, but within the Min and Max values specified as OTSi SIP capability.";
-        }
-        description "none";
-    }
-    grouping fec-properties-pac {
-        leaf pre-fec-ber {
-            type uint64;
-            config false;
-            description "counter: bit error rate before correction by FEC";
-        }
-        leaf post-fec-ber {
-            type uint64;
-            config false;
-            description "counter: bit error rate after correction by FEC";
-        }
-        leaf corrected-bytes {
-            type uint64;
-            config false;
-            description "Bytes corrected between those that were received corrupted";
-        }
-        leaf corrected-bits {
-            type uint64;
-            config false;
-            description "Bits corrected between those that were received corrupted";
-        }
-        leaf uncorrectable-bytes {
-            type uint64;
-            config false;
-            description "Bytes that could not be corrected by FEC";
-        }
-        leaf uncorrectable-bits {
-            type uint64;
-            config false;
-            description "Bits that could not be corrected by FEC";
-        }
-        description "none";
-    }
-    grouping media-channel-service-interface-point-spec {
-        container mc-pool {
-            config false;
-            uses media-channel-pool-capability-pac;
-            description "none";
-        }
-        description "none";
-    }
-    grouping media-channel-connectivity-service-end-point-spec {
-        container mc-config {
-            uses media-channel-config-pac;
-            description "none";
-        }
-        description "none";
-    }
-    grouping media-channel-config-pac {
-        container spectrum {
-            uses spectrum-band;
-            description "none";
-        }
-        description "none";
-    }
-    grouping media-channel-connection-end-point-spec {
-        container media-channel {
-            config false;
-            uses media-channel-properties-pac;
-            description "none";
-        }
-        description "none";
-    }
-    grouping ots-connection-end-point-spec {
-        container ots-media-channel {
-            config false;
-            uses media-channel-properties-pac;
-            description "none";
-        }
-        description "none";
-    }
-    grouping media-channel-assembly-spec {
-        description "none";
-    }
-    grouping laser-properties-pac {
-        leaf laser-status {
-            type laser-control-status-type;
-            config false;
-            description "none";
-        }
-        leaf laser-application-type {
-            type laser-type;
-            config false;
-            description "The type of laser, its operational wavelengths, and its applications. String size 255.";
-        }
-        leaf laser-bias-current {
-            type decimal64 {
-                fraction-digits 7;
-            }
-            config false;
-            description "The Bias current of the laser that is the medium polarization current of the laser.";
-        }
-        leaf laser-temperature {
-            type decimal64 {
-                fraction-digits 7;
-            }
-            config false;
-            description "The temperature of the laser";
-        }
-        description "none";
-    }
-    grouping power-properties-pac {
-        leaf total-power {
-            type decimal64 {
-                fraction-digits 7;
-            }
-            description "The total power at any point in a channel specified in dBm.";
-        }
-        leaf power-spectral-density {
-            type decimal64 {
-                fraction-digits 7;
-            }
-            config false;
-            description "This describes how power of a signal  is distributed over frequency specified in nW/MHz";
-        }
-        description "Indication with severity warning raised when a total power value measured is above the threshold.";
-    }
-    grouping total-power-threshold-pac {
-        leaf total-power-upper-warn-threshold-default {
-            type decimal64 {
-                fraction-digits 7;
-            }
-            description "Can read the value of the default  threshold that was set";
-        }
-        leaf total-power-upper-warn-threshold-min {
-            type decimal64 {
-                fraction-digits 7;
-            }
-            description "Can read the value of the lower threshold that was set";
-        }
-        leaf total-power-upper-warn-threshold-max {
-            type decimal64 {
-                fraction-digits 7;
-            }
-            description "Can  read the value of the upper threshold that was set";
-        }
-        leaf total-power-lower-warn-threshold-default {
-            type decimal64 {
-                fraction-digits 7;
-            }
-            description "Can read the value of the default  threshold that was set";
-        }
-        leaf total-power-lower-warn-threshold-max {
-            type decimal64 {
-                fraction-digits 7;
-            }
-            description "Can  read the value of the upper threshold that was set";
-        }
-        leaf total-power-lower-warn-threshold-min {
-            type decimal64 {
-                fraction-digits 7;
-            }
-            description "Can read the value of the lower threshold that was set";
-        }
-        description "none";
-    }
-
-   /**************************
-    * package type-definitions
-    **************************/
-    identity PHOTONIC_LAYER_QUALIFIER {
-        base tapi-common:LAYER_PROTOCOL_QUALIFIER;
-        description "none";
-    }
-    identity PHOTONIC_LAYER_QUALIFIER_OTSi {
-        base PHOTONIC_LAYER_QUALIFIER;
-        description "none";
-    }
-    identity PHOTONIC_LAYER_QUALIFIER_OTSiA {
-        base PHOTONIC_LAYER_QUALIFIER;
-        description "none";
-    }
-    identity PHOTONIC_LAYER_QUALIFIER_OTSiG {
-        base PHOTONIC_LAYER_QUALIFIER;
-        description "none";
-    }
-    identity PHOTONIC_LAYER_QUALIFIER_NMC {
-        base PHOTONIC_LAYER_QUALIFIER;
-        description "none";
-    }
-    identity PHOTONIC_LAYER_QUALIFIER_NMCA {
-        base PHOTONIC_LAYER_QUALIFIER;
-        description "none";
-    }
-    identity PHOTONIC_LAYER_QUALIFIER_SMC {
-        base PHOTONIC_LAYER_QUALIFIER;
-        description "none";
-    }
-    identity PHOTONIC_LAYER_QUALIFIER_SMCA {
-        base PHOTONIC_LAYER_QUALIFIER;
-        description "none";
-    }
-    identity PHOTONIC_LAYER_QUALIFIER_OCH {
-        base PHOTONIC_LAYER_QUALIFIER;
-        description "none";
-    }
-    identity PHOTONIC_LAYER_QUALIFIER_OMS {
-        base PHOTONIC_LAYER_QUALIFIER;
-        description "none";
-    }
-    identity PHOTONIC_LAYER_QUALIFIER_OTS {
-        base PHOTONIC_LAYER_QUALIFIER;
-        description "none";
-    }
-    grouping application-identifier {
-        leaf application-identifier-type {
-            type application-identifier-type;
-            description "The ITU-T recommendation which defines the application code format.";
-        }
-        leaf application-code {
-            type string;
-            description "none";
-        }
-        description "The syntax of ApplicationIdentifier is a pair {ApplicationIdentifierType, PrintableString}. The value of ApplicationIdentifierType is either STANDARD or PROPRIETARY. The value of PrintableString represents the standard application code as defined in the ITU-T Recommendations or a vendor-specific proprietary code. If the ApplicationIdentifierType is STANDARD the value of PrintableString represents a standard application code as defined in the ITU-T Recommendations. If the ApplicationIdentifierType is PROPRIETARY, the first six characters of the PrintableString must contain the Hexadecimal representation of an OUI assigned to the vendor whose implementation generated the Application Identifier; the remaining octets of the PrintableString are unspecified. The value of this attribute of an object instance has to be one of the values identified in the attribute SupportableApplicationIdentifierList of the same object instance. The values and value ranges of the optical interface parameters of a standard application code must be consistent with those values specified in the ITU-T Recommendation for that application code.";
-    }
-    grouping central-frequency {
-        container frequency-constraint {
-            uses frequency-constraint;
-            description "none";
-        }
-        leaf central-frequency {
-            type uint64;
-            description "The central frequency of the laser specified in MHz. It is the oscillation frequency of the corresponding electromagnetic wave. ";
-        }
-        description "This data-type holds the central frequency information as well frequency constraints in terms of GridType ( FIXED grid (DWDM or CWDM) or FLEX grid) and AdjustmentGranularity.";
-    }
-    typedef optical-routing-strategy {
-        type enumeration {
-            enum OPTIMAL_OSNR {
-                description "none";
-            }
-            enum NO_RELAY {
-                description "none";
-            }
-            enum MIN_RELAY {
-                description "none";
-            }
-            enum PREFERRED_NO_CHANGE_WAVELENGTH_AS_RESTORE {
-                description "none";
-            }
-            enum PREFERRED_NO_SKIPPING_WAVELENGTH {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    typedef application-identifier-type {
-        type enumeration {
-            enum PROPRIETARY {
-                description "none";
-            }
-            enum ITUT_G959_1 {
-                description "none";
-            }
-            enum ITUT_G698_1 {
-                description "none";
-            }
-            enum ITUT_G698_2 {
-                description "none";
-            }
-            enum ITUT_G696_1 {
-                description "none";
-            }
-            enum ITUT_G695 {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    typedef grid-type {
-        type enumeration {
-            enum DWDM {
-                description "Fixed frequency grid in C & L bands as specified in ITU-T G.694.1
-                    ";
-            }
-            enum CWDM {
-                description "Fixed frequency grid as specified in ITU-T G.694.2";
-            }
-            enum FLEX {
-                description "Flexible frequency grid as specified in ITU-T G.694.1. In this case,
-                    - the allowed frequency slots have a nominal central frequency (in THz) defined by:
-                    193.1 + n × 0.00625 where n is a positive or negative integer including 0 and 0.00625 is the nominal central frequency granularity in THz
-                    - and a slot width defined by:
-                    12.5 × m where m is a positive integer and 12.5 is the slot width granularity in GHz.
-                    Any combination of frequency slots is allowed as long as no two frequency slots overlap.";
-            }
-            enum GRIDLESS {
-                description "none";
-            }
-            enum UNSPECIFIED {
-                description "Unspecified/proprietary frequency grid";
-            }
-        }
-        description "The frequency grid standard that specify reference set of frequencies used to denote allowed nominal central frequencies that may be used for defining applications.";
-    }
-    typedef adjustment-granularity {
-        type enumeration {
-            enum G_100GHZ {
-                description "100000 MHz";
-            }
-            enum G_50GHZ {
-                description "50000 MHz";
-            }
-            enum G_25GHZ {
-                description "25000 MHz";
-            }
-            enum G_12_5GHZ {
-                description "12500 MHz";
-            }
-            enum G_6_25GHZ {
-                description "6250 MHz";
-            }
-            enum G_3_125GHZ {
-                description "3125 MHz";
-            }
-            enum UNCONSTRAINED {
-                description "none";
-            }
-        }
-        description "Adjustment granularity in Gigahertz. As per ITU-T G.694.1, it is used to calculate nominal central frequency";
-    }
-    grouping spectrum-band {
-        leaf upper-frequency {
-            type uint64;
-            description "The upper frequency bound of the media channel spectrum specified in MHz";
-        }
-        leaf lower-frequency {
-            type uint64;
-            description "The lower frequency bound of the media channel spectrum specified in MHz";
-        }
-        container frequency-constraint {
-            uses frequency-constraint;
-            description "none";
-        }
-        description "This data-type holds the spectrum information in termsof upper/lower frequency directly or optionally the information to determin this in terms of the nominal central frequency and spectral width for a FIXED grid (DWDM or CWDM) and FLEX grid type systems.";
-    }
-    typedef modulation-technique {
-        type enumeration {
-            enum RZ {
-                description "none";
-            }
-            enum NRZ {
-                description "none";
-            }
-            enum BPSK {
-                description "none";
-            }
-            enum DPSK {
-                description "none";
-            }
-            enum QPSK {
-                description "none";
-            }
-            enum 8QAM {
-                description "none";
-            }
-            enum 16QAM {
-                description "none";
-            }
-            enum PAM4 {
-                description "none";
-            }
-            enum PAM8 {
-                description "none";
-            }
-            enum UNDEFINED {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    typedef laser-type {
-        type enumeration {
-            enum PUMP {
-                description "none";
-            }
-            enum MODULATED {
-                description "none";
-            }
-            enum PULSE {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    typedef photonic-layer-qualifier {
-        type identityref {
-            base PHOTONIC_LAYER_QUALIFIER;
-        }
-        description "none";
-    }
-    typedef laser-control-type {
-        type enumeration {
-            enum FORCED-ON {
-                description "none";
-            }
-            enum FORCED-OFF {
-                description "none";
-            }
-            enum AUTOMATIC-LASER-SHUTDOWN {
-                description "none";
-            }
-            enum UNDEFINED {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    typedef laser-control-status-type {
-        type enumeration {
-            enum ON {
-                description "none";
-            }
-            enum OFF {
-                description "none";
-            }
-            enum PULSING {
-                description "none";
-            }
-            enum UNDEFINED {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    grouping frequency-constraint {
-        leaf adjustment-granularity {
-            type adjustment-granularity;
-            description "Adjustment granularity in Gigahertz. As per ITU-T G.694.1, it is used to calculate nominal central frequency (in THz)";
-        }
-        leaf grid-type {
-            type grid-type;
-            description "Specifies the frequency grid standard used to determine the nominal central frequency and frequency slot width";
-        }
-        description "This data-type holds the frequency constraint information in terms of GridType ( FIXED grid (DWDM or CWDM) or FLEX grid) and AdjustmentGranularity.";
-    }
-}
diff --git a/tapimodels/src/main/yang/tapi-topology@2018-12-10.yang b/tapimodels/src/main/yang/tapi-topology@2018-12-10.yang
deleted file mode 100644 (file)
index 2ceeb77..0000000
+++ /dev/null
@@ -1,716 +0,0 @@
-module tapi-topology {
-    namespace "urn:onf:otcc:yang:tapi-topology";
-    prefix tapi-topology;
-    import tapi-common {
-        prefix tapi-common;
-    }
-    organization "ONF OTCC (Open Transport Configuration & Control) Project";
-    contact "
-         Project Web: <https://wiki.opennetworking.org/display/OTCC/TAPI>
-         Project List: <mailto:transport-api@opennetworking.org>
-         Editor: Karthik Sethuraman
-                 <mailto:karthik.sethuraman@necam.com>";
-    description "
-        This module contains TAPI Topology Model definitions.
-        Source: TapiTopology.uml
-        - The TAPI YANG models included in this TAPI release are a *normative* part of the TAPI SDK.
-        - The YANG specifications have been generated from the corresponding UML model using the [ONF EAGLE UML2YANG mapping tool]
-          <https://github.com/OpenNetworkingFoundation/EagleUmlYang>
-          and further edited manually to comply with the [ONF IISOMI UML2YANG mapping guidelines]
-          <https://wiki.opennetworking.org/display/OIMT/UML+-+YANG+Guidelines>
-        - Status of YANG model artifacts can be determined by referring to the corresponding UML artifacts.
-          As described in the UML models, some artifacts are considered *experimental*, and thus the corresponding YANG artifacts.
-        - The ONF TAPI release process does not guarantee backward compatibility of YANG models across major versions of TAPI releases.
-          The YANG model backward compatibility criteria are outlined in section 11 of <https://tools.ietf.org/html/rfc7950>.
-          YANG models included in this release may not be backward compatible with previous TAPI releases.
-        Copyright (c) 2018 Open Networking Foundation (ONF). All rights reserved.
-        License: This module is distributed under the Apache License 2.0";
-    revision 2018-12-10 {
-        description "ONF Transport API version 2.1.1.
-                   Changes included in this TAPI release (v2.1.1) are listed in
-                   <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.1.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
-    }
-    revision 2018-10-16 {
-        description "ONF Transport API version 2.1.0.
-                   Changes included in this TAPI release (v2.1.0) are listed in
-                   <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.1.0.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 7950, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.1.0/UML>";
-    }
-    revision 2018-03-07 {
-        description "ONF Transport API version 2.0.2
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.2.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.2/UML>";
-    }
-    revision 2018-02-16 {
-        description "ONF Transport API version 2.0.1
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.1.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.1/UML>";
-    }
-    revision 2018-01-02 {
-        description "ONF Transport API version 2.0.0
-        This YANG module has been generated from the TAPI UML Model using the IISOMI-Eagle xmi2yang mapping tool.
-        Changes in this revision: <https://github.com/OpenNetworkingFoundation/TAPI/blob/develop/CHANGE_LOG/change-log.2.0.0.md>";
-        reference "ONF-TR-527, ONF-TR-512, ONF-TR-531, RFC 6020, RFC 6087 and ONF TAPI UML model
-                  <https://github.com/OpenNetworkingFoundation/TAPI/tree/v2.0.0/UML>";
-    }
-    augment "/tapi-common:context" {
-        container topology-context {
-            uses topology-context;
-            description "Augments the base TAPI Context with TopologyService information";
-        }
-        description "Augments the base TAPI Context with TopologyService information";
-    }
-
-   /**************************
-    * definitions of refrences
-    **************************/
-    grouping topology-ref {
-        leaf topology-uuid {
-            type leafref {
-                path '/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:uuid';
-            }
-            description "none";
-        }
-        description "none";
-    }
-    grouping link-ref {
-        uses topology-ref;
-        leaf link-uuid {
-            type leafref {
-                path '/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:link/tapi-topology:uuid';
-            }
-            description "none";
-        }
-        description "none";
-    }
-    grouping node-ref {
-        uses topology-ref;
-        leaf node-uuid {
-            type leafref {
-                path '/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:uuid';
-            }
-            description "none";
-        }
-        description "none";
-    }
-    grouping node-edge-point-ref {
-        uses node-ref;
-        leaf node-edge-point-uuid {
-            type leafref {
-                path '/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:owned-node-edge-point/tapi-topology:uuid';
-            }
-            description "none";
-        }
-        description "none";
-    }
-    grouping node-rule-group-ref {
-        uses node-ref;
-        leaf node-rule-group-uuid {
-            type leafref {
-                path '/tapi-common:context/tapi-topology:topology-context/tapi-topology:topology/tapi-topology:node/tapi-topology:node-rule-group/tapi-topology:uuid';
-            }
-            description "none";
-        }
-        description "none";
-    }
-
-   /**************************
-    * package object-classes
-    **************************/
-    grouping link {
-        list node-edge-point {
-            uses node-edge-point-ref;
-            key 'topology-uuid node-uuid node-edge-point-uuid';
-            config false;
-            min-elements 2;
-            description "none";
-        }
-        leaf-list layer-protocol-name {
-            type tapi-common:layer-protocol-name;
-            config false;
-            min-elements 1;
-            description "none";
-        }
-        leaf direction {
-            type tapi-common:forwarding-direction;
-            config false;
-            description "The directionality of the Link.
-                Is applicable to simple Links where all LinkEnds are BIDIRECTIONAL (the Link will be BIDIRECTIONAL) or UNIDIRECTIONAL (the Link will be UNIDIRECTIONAL).
-                Is not present in more complex cases.";
-        }
-        container resilience-type {
-            uses resilience-type;
-            description "none";
-        }
-        uses tapi-common:resource-spec;
-        uses tapi-common:admin-state-pac;
-        uses tapi-common:capacity-pac;
-        uses transfer-cost-pac;
-        uses transfer-integrity-pac;
-        uses transfer-timing-pac;
-        uses risk-parameter-pac;
-        uses validation-pac;
-        uses layer-protocol-transition-pac;
-        description "The Link object class models effective adjacency between two or more ForwardingDomains (FD). ";
-    }
-    grouping node {
-        list owned-node-edge-point {
-            key 'uuid';
-            config false;
-            uses node-edge-point;
-            description "none";
-        }
-        list aggregated-node-edge-point {
-            uses node-edge-point-ref;
-            key 'topology-uuid node-uuid node-edge-point-uuid';
-            config false;
-            description "none";
-        }
-        list node-rule-group {
-            key 'uuid';
-            uses node-rule-group;
-            description "none";
-        }
-        container encap-topology {
-            uses topology-ref;
-            config false;
-            description "none";
-        }
-        leaf-list layer-protocol-name {
-            type tapi-common:layer-protocol-name;
-            config false;
-            min-elements 1;
-            description "none";
-        }
-        uses tapi-common:resource-spec;
-        uses tapi-common:admin-state-pac;
-        uses tapi-common:capacity-pac;
-        uses transfer-cost-pac;
-        uses transfer-integrity-pac;
-        uses transfer-timing-pac;
-        description "The ForwardingDomain (FD) object class models the ForwardingDomain topological component which is used to effect forwarding of transport characteristic information and offers the potential to enable forwarding.
-            At the lowest level of recursion, an FD (within a network element (NE)) represents a switch matrix (i.e., a fabric). Note that an NE can encompass multiple switch matrices (FDs). ";
-    }
-    grouping topology {
-        list node {
-            key 'uuid';
-            config false;
-            uses node;
-            description "none";
-        }
-        list link {
-            key 'uuid';
-            config false;
-            uses link;
-            description "none";
-        }
-        leaf-list layer-protocol-name {
-            type tapi-common:layer-protocol-name;
-            config false;
-            min-elements 1;
-            description "none";
-        }
-        uses tapi-common:resource-spec;
-        description "The ForwardingDomain (FD) object class models the ForwardingDomain topological component which is used to effect forwarding of transport characteristic information and offers the potential to enable forwarding.
-            At the lowest level of recursion, an FD (within a network element (NE)) represents a switch matrix (i.e., a fabric). Note that an NE can encompass multiple switch matrices (FDs). ";
-    }
-    grouping layer-protocol-transition-pac {
-        leaf-list transitioned-layer-protocol-name {
-            type string;
-            min-elements 2;
-            description "Provides the ordered structure of layer protocol transitions encapsulated in the TopologicalEntity. The ordering relates to the LinkPort role.";
-        }
-        description "Relevant for a Link that is formed by abstracting one or more LTPs (in a stack) to focus on the flow and deemphasize the protocol transformation.
-            This abstraction is relevant when considering multi-layer routing.
-            The layer protocols of the LTP and the order of their application to the signal is still relevant and need to be accounted for. This is derived from the LTP spec details.
-            This Pac provides the relevant abstractions of the LTPs and provides the necessary association to the LTPs involved.
-            Links that included details in this Pac are often referred to as Transitional Links.";
-    }
-    grouping node-edge-point {
-        leaf layer-protocol-name {
-            type tapi-common:layer-protocol-name;
-            config false;
-            description "none";
-        }
-        leaf-list supported-cep-layer-protocol-qualifier {
-            type tapi-common:layer-protocol-qualifier;
-            min-elements 1;
-            description "none";
-        }
-        list aggregated-node-edge-point {
-            uses node-edge-point-ref;
-            key 'topology-uuid node-uuid node-edge-point-uuid';
-            config false;
-            description "none";
-        }
-        list mapped-service-interface-point {
-            uses tapi-common:service-interface-point-ref;
-            key 'service-interface-point-uuid';
-            config false;
-            description "NodeEdgePoint mapped to more than ServiceInterfacePoint (slicing/virtualizing) or a ServiceInterfacePoint mapped to more than one NodeEdgePoint (load balancing/Resilience) should be considered experimental";
-        }
-        leaf link-port-direction {
-            type tapi-common:port-direction;
-            config false;
-            description "The orientation of defined flow at the LinkEnd.";
-        }
-        leaf link-port-role {
-            type tapi-common:port-role;
-            config false;
-            description "Each LinkEnd of the Link has a role (e.g., symmetric, hub, spoke, leaf, root)  in the context of the Link with respect to the Link function. ";
-        }
-        uses tapi-common:resource-spec;
-        uses tapi-common:admin-state-pac;
-        uses tapi-common:termination-pac;
-        uses tapi-common:capacity-pac;
-        description "The LogicalTerminationPoint (LTP) object class encapsulates the termination and adaptation functions of one or more transport layers.
-            The structure of LTP supports all transport protocols including circuit and packet forms.";
-    }
-    grouping risk-parameter-pac {
-        list risk-characteristic {
-            key 'risk-characteristic-name';
-            config false;
-            min-elements 1;
-            uses risk-characteristic;
-            description "A list of risk characteristics for consideration in an analysis of shared risk. Each element of the list represents a specific risk consideration.";
-        }
-        description "The risk characteristics of a TopologicalEntity come directly from the underlying physical realization.
-            The risk characteristics propagate from the physical realization to the client and from the server layer to the client layer, this propagation may be modified by protection.
-            A TopologicalEntity may suffer degradation or failure as a result of a problem in a part of the underlying realization.
-            The realization can be partitioned into segments which have some relevant common failure modes.
-            There is a risk of failure/degradation of each segment of the underlying realization.
-            Each segment is a part of a larger physical/geographical unit that behaves as one with respect to failure (i.e. a failure will have a high probability of impacting the whole unit (e.g. all cables in the same duct).
-            Disruptions to that larger physical/geographical unit will impact (cause failure/errors to) all TopologicalEntities that use any part of that larger physical/geographical entity.
-            Any TopologicalEntity that uses any part of that larger physical/geographical unit will suffer impact and hence each TopologicalEntity shares risk.
-            The identifier of each physical/geographical unit that is involved in the realization of each segment of a Topological entity can be listed in the RiskParameter_Pac of that TopologicalEntity.
-            A segment has one or more risk characteristic.
-            Shared risk between two TopologicalEntities compromises the integrity of any solution that use one of those TopologicalEntity as a backup for the other.
-            Where two TopologicalEntities have a common risk characteristic they have an elevated probability of failing simultaneously compared to two TopologicalEntities that do not share risk characteristics.";
-    }
-    grouping transfer-cost-pac {
-        list cost-characteristic {
-            key 'cost-name';
-            config false;
-            min-elements 1;
-            uses cost-characteristic;
-            description "The list of costs where each cost relates to some aspect of the TopologicalEntity.";
-        }
-        description "The cost characteristics of a TopologicalEntity not necessarily correlated to the cost of the underlying physical realization.
-            They may be quite specific to the individual TopologicalEntity e.g. opportunity cost. Relates to layer capacity
-            There may be many perspectives from which cost may be considered  for a particular TopologicalEntity and hence many specific costs and potentially cost algorithms.
-            Using an entity will incur a cost. ";
-    }
-    grouping transfer-integrity-pac {
-        leaf error-characteristic {
-            type string;
-            config false;
-            description "Describes the degree to which the signal propagated can be errored.
-                Applies to TDM systems as the errored signal will be propagated and not packet as errored packets will be discarded.";
-        }
-        leaf loss-characteristic {
-            type string;
-            config false;
-            description "Describes the acceptable characteristic of lost packets where loss may result from discard due to errors or overflow.
-                Applies to packet systems and not TDM (as for TDM errored signals are propagated unless grossly errored and overflow/underflow turns into timing slips).";
-        }
-        leaf repeat-delivery-characteristic {
-            type string;
-            config false;
-            description "Primarily applies to packet systems where a packet may be delivered more than once (in fault recovery for example).
-                It can also apply to TDM where several frames may be received twice due to switching in a system with a large differential propagation delay.";
-        }
-        leaf delivery-order-characteristic {
-            type string;
-            config false;
-            description "Describes the degree to which packets will be delivered out of sequence.
-                Does not apply to TDM as the TDM protocols maintain strict order.";
-        }
-        leaf unavailable-time-characteristic {
-            type string;
-            config false;
-            description "Describes the duration for which there may be no valid signal propagated.";
-        }
-        leaf server-integrity-process-characteristic {
-            type string;
-            config false;
-            description "Describes the effect of any server integrity enhancement process on the characteristics of the TopologicalEntity.";
-        }
-        description "Transfer intergrity characteristic covers expected/specified/acceptable characteristic of degradation of the transfered signal.
-            It includes all aspects of possible degradation of signal content as well as any damage of any form to the total TopologicalEntity and to the carried signals.
-            Note that the statement is of total impact to the TopologicalEntity so any partial usage of the TopologicalEntity (e.g. a signal that does not use full capacity) will only suffer its portion of the impact.";
-    }
-    grouping transfer-timing-pac {
-        list latency-characteristic {
-            key 'traffic-property-name';
-            config false;
-            min-elements 1;
-            uses latency-characteristic;
-            description "The effect on the latency of a queuing process. This only has significant effect for packet based systems and has a complex characteristic.";
-        }
-        description "A TopologicalEntity will suffer effects from the underlying physical realization related to the timing of the information passed by the TopologicalEntity.";
-    }
-    grouping validation-pac {
-        list validation-mechanism {
-            key 'validation-mechanism';
-            config false;
-            min-elements 1;
-            uses validation-mechanism;
-            description "Provides details of the specific validation mechanism(s) used to confirm the presence of an intended topologicalEntity.";
-        }
-        description "Validation covers the various adjacenct discovery and reachability verification protocols. Also may cover Information source and degree of integrity.";
-    }
-    grouping network-topology-service {
-        list topology {
-            uses topology-ref;
-            key 'topology-uuid';
-            config false;
-            description "none";
-        }
-        uses tapi-common:service-spec;
-        description "none";
-    }
-    grouping topology-context {
-        container nw-topology-service {
-            config false;
-            uses network-topology-service;
-            description "none";
-        }
-        list topology {
-            key 'uuid';
-            config false;
-            uses topology;
-            description "none";
-        }
-        description "none";
-    }
-    grouping inter-rule-group {
-        list rule {
-            key 'local-id';
-            min-elements 1;
-            uses rule;
-            description "none";
-        }
-        list associated-node-rule-group {
-            uses node-rule-group-ref;
-            key 'topology-uuid node-uuid node-rule-group-uuid';
-            min-elements 2;
-            description "none";
-        }
-        uses tapi-common:resource-spec;
-        uses tapi-common:capacity-pac;
-        uses transfer-cost-pac;
-        uses transfer-timing-pac;
-        uses risk-parameter-pac;
-        description "none";
-    }
-    grouping node-rule-group {
-        list rule {
-            key 'local-id';
-            min-elements 1;
-            uses rule;
-            description "none";
-        }
-        list node-edge-point {
-            uses node-edge-point-ref;
-            key 'topology-uuid node-uuid node-edge-point-uuid';
-            min-elements 1;
-            description "none";
-        }
-        list composed-rule-group {
-            uses node-rule-group-ref;
-            key 'topology-uuid node-uuid node-rule-group-uuid';
-            description "none";
-        }
-        list inter-rule-group {
-            key 'uuid';
-            uses inter-rule-group;
-            description "none";
-        }
-        uses tapi-common:resource-spec;
-        uses tapi-common:capacity-pac;
-        uses transfer-cost-pac;
-        uses transfer-timing-pac;
-        uses risk-parameter-pac;
-        description "none";
-    }
-    grouping rule {
-        leaf rule-type {
-            type rule-type;
-            description "none";
-        }
-        leaf forwarding-rule {
-            type forwarding-rule;
-            description "none";
-        }
-        leaf override-priority {
-            type uint64;
-            description "none";
-        }
-        uses tapi-common:local-class;
-        description "none";
-    }
-
-   /**************************
-    * package type-definitions
-    **************************/
-    grouping cost-characteristic {
-        leaf cost-name {
-            type string;
-            description "The cost characteristic will related to some aspect of the TopologicalEntity (e.g. $ cost, routing weight). This aspect will be conveyed by the costName.";
-        }
-        leaf cost-value {
-            type string;
-            description "The specific cost.";
-        }
-        leaf cost-algorithm {
-            type string;
-            description "The cost may vary based upon some properties of the TopologicalEntity. The rules for the variation are conveyed by the costAlgorithm.";
-        }
-        description "The information for a particular cost characteristic.";
-    }
-    grouping latency-characteristic {
-        leaf traffic-property-name {
-            type string;
-            description "The identifier of the specific traffic property to which the queuing latency applies.";
-        }
-        leaf fixed-latency-characteristic {
-            type string;
-            config false;
-            description "A TopologicalEntity suffers delay caused by the realization of the servers (e.g. distance related; FEC encoding etc.) along with some client specific processing. This is the total average latency effect of the TopologicalEntity";
-        }
-        leaf queing-latency-characteristic {
-            type string;
-            description "The specific queuing latency for the traffic property.";
-        }
-        leaf jitter-characteristic {
-            type string;
-            config false;
-            description "High frequency deviation from true periodicity of a signal and therefore a small high rate of change of transfer latency.
-                Applies to TDM systems (and not packet).";
-        }
-        leaf wander-characteristic {
-            type string;
-            config false;
-            description "Low frequency deviation from true periodicity of a signal and therefore a small low rate of change of transfer latency.
-                Applies to TDM systems (and not packet).";
-        }
-        description "Provides information on latency characteristic for a particular stated trafficProperty.";
-    }
-    grouping risk-characteristic {
-        leaf risk-characteristic-name {
-            type string;
-            description "The name of the risk characteristic. The characteristic may be related to a specific degree of closeness.
-                For example a particular characteristic may apply to failures that are localized (e.g. to one side of a road) where as another characteristic may relate to failures that have a broader impact (e.g. both sides of a road that crosses a bridge).
-                Depending upon the importance of the traffic being routed different risk characteristics will be evaluated.";
-        }
-        leaf-list risk-identifier-list {
-            type string;
-            min-elements 1;
-            description "A list of the identifiers of each physical/geographic unit (with the specific risk characteristic) that is related to a segment of the TopologicalEntity.";
-        }
-        description "The information for a particular risk characteristic where there is a list of risk identifiers related to that characteristic.";
-    }
-    grouping validation-mechanism {
-        leaf validation-mechanism {
-            type string;
-            description "Name of mechanism used to validate adjacency";
-        }
-        leaf layer-protocol-adjacency-validated {
-            type string;
-            description "State of validatiion";
-        }
-        leaf validation-robustness {
-            type string;
-            description "Quality of validation (i.e. how likely is the stated validation to be invalid)";
-        }
-        description "Identifies the validation mechanism and describes the characteristics of that mechanism";
-    }
-    typedef forwarding-rule {
-        type enumeration {
-            enum MAY_FORWARD_ACROSS_GROUP {
-                description "none";
-            }
-            enum MUST_FORWARD_ACROSS_GROUP {
-                description "none";
-            }
-            enum CANNOT_FORWARD_ACROSS_GROUP {
-                description "none";
-            }
-            enum NO_STATEMENT_ON_FORWARDING {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    typedef rule-type {
-        type enumeration {
-            enum FORWARDING {
-                description "none";
-            }
-            enum CAPACITY {
-                description "none";
-            }
-            enum COST {
-                description "none";
-            }
-            enum TIMING {
-                description "none";
-            }
-            enum RISK {
-                description "none";
-            }
-            enum GROUPING {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    grouping resilience-type {
-        leaf restoration-policy {
-            type restoration-policy;
-            description "none";
-        }
-        leaf protection-type {
-            type protection-type;
-            description "none";
-        }
-        description "none";
-    }
-    typedef restoration-policy {
-        type enumeration {
-            enum PER_DOMAIN_RESTORATION {
-                description "none";
-            }
-            enum END_TO_END_RESTORATION {
-                description "none";
-            }
-            enum NA {
-                description "none";
-            }
-        }
-        description "none";
-    }
-    typedef protection-type {
-        type enumeration {
-            enum NO_PROTECTON {
-                description "none";
-            }
-            enum ONE_PLUS_ONE_PROTECTION {
-                description "none";
-            }
-            enum ONE_PLUS_ONE_PROTECTION_WITH_DYNAMIC_RESTORATION {
-                description "none";
-            }
-            enum PERMANENT_ONE_PLUS_ONE_PROTECTION {
-                description "none";
-            }
-            enum ONE_FOR_ONE_PROTECTION {
-                description "none";
-            }
-            enum DYNAMIC_RESTORATION {
-                description "none";
-            }
-            enum PRE_COMPUTED_RESTORATION {
-                description "none";
-            }
-        }
-        description "none";
-    }
-
-   /**************************
-    * package interfaces
-    **************************/
-    rpc get-topology-details {
-        description "none";
-        input {
-            leaf topology-id-or-name {
-                type string;
-                description "none";
-            }
-        }
-        output {
-            container topology {
-                uses topology;
-                description "none";
-            }
-        }
-    }
-    rpc get-node-details {
-        description "none";
-        input {
-            leaf topology-id-or-name {
-                type string;
-                description "none";
-            }
-            leaf node-id-or-name {
-                type string;
-                description "none";
-            }
-        }
-        output {
-            container node {
-                uses node;
-                description "none";
-            }
-        }
-    }
-    rpc get-node-edge-point-details {
-        description "none";
-        input {
-            leaf topology-id-or-name {
-                type string;
-                description "none";
-            }
-            leaf node-id-or-name {
-                type string;
-                description "none";
-            }
-            leaf ep-id-or-name {
-                type string;
-                description "none";
-            }
-        }
-        output {
-            container node-edge-point {
-                uses node-edge-point;
-                description "none";
-            }
-        }
-    }
-    rpc get-link-details {
-        description "none";
-        input {
-            leaf topology-id-or-name {
-                type string;
-                description "none";
-            }
-            leaf link-id-or-name {
-                type string;
-                description "none";
-            }
-        }
-        output {
-            container link {
-                uses link;
-                description "none";
-            }
-        }
-    }
-    rpc get-topology-list {
-        description "none";
-        output {
-            list topology {
-                key 'uuid';
-                uses topology;
-                description "none";
-            }
-        }
-    }
-}
index 3e40288b93b4870007c1fb9ca81306e447b9c209..652237719738c4975f5108da27ce2bc17bd56058 100644 (file)
   <parent>
     <groupId>org.opendaylight.mdsal</groupId>
     <artifactId>binding-parent</artifactId>
-    <version>8.0.11</version>
+    <version>13.0.1</version>
     <relativePath/>
   </parent>
 
   <groupId>org.opendaylight.transportpce</groupId>
   <artifactId>test-common</artifactId>
-  <version>5.0.0-SNAPSHOT</version>
+  <version>10.0.0-SNAPSHOT</version>
   <packaging>bundle</packaging>
 
+  <properties>
+    <transportpce.models.version>20.0.0-SNAPSHOT</transportpce.models.version>
+  </properties>
+
   <dependencyManagement>
     <dependencies>
+      <dependency>
+        <groupId>org.opendaylight.transportpce.models</groupId>
+        <artifactId>transportpce-models-artifacts</artifactId>
+        <version>${transportpce.models.version}</version>
+        <type>pom</type>
+        <scope>import</scope>
+      </dependency>
       <dependency>
         <groupId>org.opendaylight.netconf</groupId>
         <artifactId>netconf-artifacts</artifactId>
-        <version>2.0.14</version>
+        <version>7.0.4</version>
         <scope>import</scope>
         <type>pom</type>
       </dependency>
   </dependencyManagement>
 
   <dependencies>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-1.2.1</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-2.2.1</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-7.1.0</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-common-13.1.0</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-device-7.1.0</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-network-13.1.0</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.opendaylight.transportpce.models</groupId>
+      <artifactId>openroadm-service-13.1.0</artifactId>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
       <artifactId>transportpce-api</artifactId>
       <groupId>org.opendaylight.mdsal.binding.model.ietf</groupId>
       <artifactId>rfc8345-ietf-network</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.mdsal</groupId>
+      <artifactId>yang-binding</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.opendaylight.mdsal</groupId>
       <artifactId>mdsal-dom-api</artifactId>
       <groupId>org.opendaylight.mdsal</groupId>
       <artifactId>mdsal-binding-runtime-spi</artifactId>
     </dependency>
-    <!-- Sodium bump: javax.annotation.Nullable and friends -->
     <dependency>
-      <groupId>com.google.code.findbugs</groupId>
-      <artifactId>jsr305</artifactId>
-      <version>3.0.2</version>
+      <groupId>com.github.spotbugs</groupId>
+      <artifactId>spotbugs-annotations</artifactId>
       <optional>true</optional>
     </dependency>
     <dependency>
index ccb2546c9c3c33d6bc0733174489228f27f2ade9..267ad301aa39b56072cee0ee661a30abb0d7da5f 100644 (file)
@@ -13,7 +13,7 @@ import java.io.InputStream;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
-import javax.annotation.Nonnull;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -45,8 +45,8 @@ public abstract class AbstractDeviceTest {
      * @param intialDataQName {@link QName} of initial simulator data
      * @return device simulator (wrapper)
      */
-    public DeviceWrapper createDeviceWrapper(@Nonnull String key, @Nonnull InputStream initialDataXmlInputStream,
-            @Nonnull QName intialDataQName) {
+    public DeviceWrapper createDeviceWrapper(@NonNull String key, @NonNull InputStream initialDataXmlInputStream,
+            @NonNull QName intialDataQName) {
         DeviceWrapper deviceWrapper =
                 DeviceWrapper.createDeviceWrapper(key, initialDataXmlInputStream, intialDataQName);
         LOG.info("Creating a new device wrapper {}, {}", key, deviceWrapper);
@@ -60,7 +60,7 @@ public abstract class AbstractDeviceTest {
      * @param deviceIdentifier identifier of device simulator
      * @return stored device or null if not found
      */
-    public DeviceWrapper getDevice(@Nonnull String deviceIdentifier) {
+    public DeviceWrapper getDevice(@NonNull String deviceIdentifier) {
         Preconditions.checkArgument(!Strings.isNullOrEmpty(deviceIdentifier));
         return internalStorage.get(deviceIdentifier);
     }
index b3fd4f24a87e31a256674eea8eca20251a97ccdb..c94230bbb2647e86e4c630654b8589dbfd774aa5 100644 (file)
@@ -9,22 +9,28 @@ package org.opendaylight.transportpce.test;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.util.concurrent.MoreExecutors;
-import java.util.LinkedList;
-import java.util.List;
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.ServiceLoader;
+import java.util.Set;
 import java.util.concurrent.Executors;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.NotificationPublishService;
 import org.opendaylight.mdsal.binding.api.NotificationService;
 import org.opendaylight.mdsal.binding.dom.adapter.BindingAdapterFactory;
 import org.opendaylight.mdsal.binding.dom.adapter.ConstantAdapterContext;
+import org.opendaylight.mdsal.binding.dom.adapter.spi.AdapterFactory;
 import org.opendaylight.mdsal.binding.dom.codec.impl.BindingCodecContext;
 import org.opendaylight.mdsal.binding.dom.codec.spi.BindingDOMCodecServices;
 import org.opendaylight.mdsal.binding.runtime.spi.BindingRuntimeHelpers;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
+import org.opendaylight.mdsal.dom.api.DOMNotificationPublishService;
+import org.opendaylight.mdsal.dom.api.DOMNotificationService;
 import org.opendaylight.mdsal.dom.broker.DOMNotificationRouter;
+import org.opendaylight.mdsal.dom.broker.RouterDOMNotificationService;
+import org.opendaylight.mdsal.dom.broker.RouterDOMPublishNotificationService;
 import org.opendaylight.mdsal.dom.broker.SerializedDOMDataBroker;
 import org.opendaylight.mdsal.dom.spi.FixedDOMSchemaService;
 import org.opendaylight.mdsal.dom.spi.store.DOMStore;
@@ -43,11 +49,13 @@ public class DataStoreContextImpl implements DataStoreContext {
     private final NotificationPublishService notificationPublishService;
     private EffectiveModelContext schemaCtx;
     private BindingDOMCodecServices bindingDOMCodecServices;
-    private BindingAdapterFactory adapterFactory ;
-
+    private AdapterFactory adapterFactory;
+    private DOMNotificationService domNotificationService;
+    private DOMNotificationPublishService domNotificationPublishService;
 
+    @SuppressFBWarnings(value = "MC_OVERRIDABLE_METHOD_CALL_IN_CONSTRUCTOR")
     public DataStoreContextImpl() {
-        List<YangModuleInfo> moduleInfos = new LinkedList<>();
+        Set<YangModuleInfo> moduleInfos = new HashSet<>();
         ServiceLoader<YangModelBindingProvider> yangProviderLoader = ServiceLoader.load(YangModelBindingProvider.class);
         for (YangModelBindingProvider yangModelBindingProvider : yangProviderLoader) {
             moduleInfos.add(yangModelBindingProvider.getModuleInfo());
@@ -56,6 +64,8 @@ public class DataStoreContextImpl implements DataStoreContext {
         bindingDOMCodecServices = new BindingCodecContext(BindingRuntimeHelpers.createRuntimeContext());
         adapterFactory = new BindingAdapterFactory(new ConstantAdapterContext(bindingDOMCodecServices));
         domNotificationRouter = new DOMNotificationRouter(16);
+        domNotificationService = new RouterDOMNotificationService(domNotificationRouter);
+        domNotificationPublishService = new RouterDOMPublishNotificationService(domNotificationRouter);
         datastores = createDatastores();
         domDataBroker = createDOMDataBroker();
         dataBroker = createDataBroker();
@@ -74,13 +84,13 @@ public class DataStoreContextImpl implements DataStoreContext {
     }
 
     @Override
-    public NotificationService createNotificationService() {
-        return adapterFactory.createNotificationService(domNotificationRouter);
+    public final NotificationService createNotificationService() {
+        return adapterFactory.createNotificationService(domNotificationService);
     }
 
     @Override
-    public NotificationPublishService createNotificationPublishService() {
-        return adapterFactory.createNotificationPublishService(domNotificationRouter);
+    public final NotificationPublishService createNotificationPublishService() {
+        return adapterFactory.createNotificationPublishService(domNotificationPublishService);
     }
 
     @Override
@@ -114,13 +124,11 @@ public class DataStoreContextImpl implements DataStoreContext {
     }
 
     private DOMStore createConfigurationDatastore() {
-        return InMemoryDOMDataStoreFactory.create("CFG",
-                FixedDOMSchemaService.of(bindingDOMCodecServices.getRuntimeContext()));
+        return InMemoryDOMDataStoreFactory.create("DOM-CFG", new FixedDOMSchemaService(schemaCtx));
     }
 
     private DOMStore createOperationalDatastore() {
-        return InMemoryDOMDataStoreFactory.create("OPER",
-                FixedDOMSchemaService.of(bindingDOMCodecServices.getRuntimeContext()));
+        return InMemoryDOMDataStoreFactory.create("DOM-OPER", new FixedDOMSchemaService(schemaCtx));
     }
 
     @Override
index 98b52ea97e553f97b0f9d1fc11e502ae8bedef24..ebd1ec0da88c0b3445253540f725df75dfcafb8d 100644 (file)
@@ -18,7 +18,7 @@ import java.util.List;
 import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.concurrent.ExecutionException;
-import javax.annotation.Nonnull;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
@@ -91,8 +91,8 @@ public final class DeviceWrapper {
      * @param intialDataQName {@link QName} of initial data
      * @return device simulator
      */
-    public static DeviceWrapper createDeviceWrapper(@Nonnull String key, @Nonnull InputStream initialDataXmlInputStream,
-            @Nonnull QName intialDataQName) {
+    public static DeviceWrapper createDeviceWrapper(@NonNull String key, @NonNull InputStream initialDataXmlInputStream,
+            @NonNull QName intialDataQName) {
         requireNonNull(initialDataXmlInputStream, "Input stream cannot be null");
         requireNonNull(intialDataQName, "QName cannot be null");
         return createDeviceWrapper(key, Lists.newArrayList(
@@ -109,8 +109,8 @@ public final class DeviceWrapper {
      * @param initialData {@link List} of {@link Entry} values
      * @return created {@link DeviceWrapper} with all initial data provided by initial data
      */
-    public static DeviceWrapper createDeviceWrapper(@Nonnull String key,
-            @Nonnull List<Entry<QName, InputStream>> initialData) {
+    public static DeviceWrapper createDeviceWrapper(@NonNull String key,
+            @NonNull List<Entry<QName, InputStream>> initialData) {
         Preconditions.checkArgument(!Strings.isNullOrEmpty(key), "The provided key cannot be null or empty");
         Preconditions.checkArgument(initialData != null && !initialData.isEmpty(),
                 "Initial data cannot be null or empty");
@@ -131,13 +131,13 @@ public final class DeviceWrapper {
         LOG.debug("Input data converted into normalizedNodes");
 
         YangInstanceIdentifier initialDataIi = YangInstanceIdentifier.of(dataQName);
-        LOG.debug("Searching for {} inside {}", initialDataIi, initialDataNormalizedNodes.get());
+        LOG.debug("Searching for {} inside {}", initialDataIi, initialDataNormalizedNodes.orElseThrow());
         Optional<NormalizedNode> dataNormalizedNodes =
-                NormalizedNodes.findNode(initialDataNormalizedNodes.get(), initialDataIi);
+                NormalizedNodes.findNode(initialDataNormalizedNodes.orElseThrow(), initialDataIi);
         Preconditions.checkArgument(dataNormalizedNodes.isPresent());
         LOG.info("Initial data was successfully stored into ds");
         DOMDataTreeWriteTransaction writeOnlyTransaction = domDataBroker.newWriteOnlyTransaction();
-        writeOnlyTransaction.put(LogicalDatastoreType.OPERATIONAL, initialDataIi, dataNormalizedNodes.get());
+        writeOnlyTransaction.put(LogicalDatastoreType.OPERATIONAL, initialDataIi, dataNormalizedNodes.orElseThrow());
         try {
             writeOnlyTransaction.commit().get();
         } catch (InterruptedException | ExecutionException e) {
index 9601b7945199fba1615e6071ff59f6cf98f6d347..59be4bb4b434c7ada421f771616aa4a741e73e25 100644 (file)
@@ -8,9 +8,8 @@
 package org.opendaylight.transportpce.test.converter;
 
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Optional;
-import javax.annotation.Nonnull;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
 import org.opendaylight.yangtools.yang.binding.DataContainer;
 import org.opendaylight.yangtools.yang.binding.DataObject;
@@ -72,8 +71,8 @@ public abstract class AbstractDataObjectConverter implements DataObjectConverter
     @Override
     @SuppressWarnings("unchecked")
     public <T extends DataObject> Optional<T> getDataObject(
-            @Nonnull NormalizedNode normalizedNode,
-            @Nonnull QName rootNode) {
+            @NonNull NormalizedNode normalizedNode,
+            @NonNull QName rootNode) {
         //Preconditions.checkNotNull(normalizedNode);
         if (normalizedNode instanceof ContainerNode) {
             YangInstanceIdentifier.PathArgument directChildIdentifier =
@@ -83,7 +82,7 @@ public abstract class AbstractDataObjectConverter implements DataObjectConverter
             if (!directChild.isPresent()) {
                 throw new IllegalStateException(String.format("Could not get the direct child of %s", rootNode));
             }
-            normalizedNode = directChild.get();
+            normalizedNode = directChild.orElseThrow();
         }
         YangInstanceIdentifier rootNodeYangInstanceIdentifier = YangInstanceIdentifier.of(rootNode);
 
@@ -97,34 +96,34 @@ public abstract class AbstractDataObjectConverter implements DataObjectConverter
 
     @Override
     @SuppressWarnings("unchecked")
-    public <T extends DataObject> Optional<T> getDataObjectFromRpc(@Nonnull NormalizedNode normalizedNode) {
+    public <T extends DataObject> Optional<T> getDataObjectFromRpc(@NonNull NormalizedNode normalizedNode) {
 
         if (! (normalizedNode instanceof ContainerNode)) {
             LOG.error("converting normalized node is not ContainerNode. It's actual type is {}",
                     normalizedNode.getClass().getSimpleName());
             return Optional.empty();
         }
-        T rpcDataObject = (T) codecRegistry.fromNormalizedNodeRpcData(
-                Absolute.of(QName.create(schemaContext.getClass().getSimpleName())),
-                (ContainerNode) normalizedNode);
+        T rpcDataObject = (T) codecRegistry
+            .fromNormalizedNodeRpcData(Absolute.of(EffectiveModelContext.NAME), (ContainerNode) normalizedNode);
         return Optional.ofNullable(rpcDataObject);
     }
 
     @Override
-    public <T extends DataObject> Optional<NormalizedNode> toNormalizedNodes(@Nonnull T object,
-            Class<T> dataObjectClass) {
-        Entry<YangInstanceIdentifier, NormalizedNode> normalizedNode =
-                codecRegistry.toNormalizedNode(InstanceIdentifier.create(dataObjectClass), object);
-        return Optional.ofNullable(normalizedNode.getValue());
+    @SuppressWarnings({"rawtypes","unchecked"})
+    public <T extends DataObject> Optional<NormalizedNode> toNormalizedNodes(@NonNull T object,
+            Class dataObjectClass) {
+        return Optional.of(codecRegistry.toNormalizedDataObject(InstanceIdentifier.create(dataObjectClass), object)
+            .node());
     }
 
     @Override
     public <T extends DataObject> ConvertType<T> dataContainer() {
-        return (object, objectClass) -> {
-            NormalizedNode value =
-                    getCodecRegistry().toNormalizedNode(InstanceIdentifier.create(objectClass), object).getValue();
-            return Optional.ofNullable(value);
-        };
+//        return (object, objectClass) -> {
+//            NormalizedNode value =
+//                    getCodecRegistry().toNormalizedNode(InstanceIdentifier.create(objectClass), object).getValue();
+//            return Optional.ofNullable(value);
+//        };
+        return null;
     }
 
     @Override
@@ -136,6 +135,7 @@ public abstract class AbstractDataObjectConverter implements DataObjectConverter
     }
 
     @Override
+    @SuppressWarnings("rawtypes")
     public <T extends Notification> ConvertType<T> notification() {
         return (object, objectClass) -> {
             ContainerNode normalizedNodeNotification = getCodecRegistry().toNormalizedNodeNotification(object);
index 94f61935541415dc99da61228a8b61a3cf88f492..0e87da06fbee720f1ddf49187a3db5872cf67f34 100644 (file)
@@ -11,7 +11,7 @@ import java.io.InputStream;
 import java.io.Reader;
 import java.io.Writer;
 import java.util.Optional;
-import javax.annotation.Nonnull;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.binding.DataContainer;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.Notification;
@@ -22,31 +22,31 @@ import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 public interface DataObjectConverter {
 
     <T extends DataObject> Optional<T> getDataObject(
-            @Nonnull NormalizedNode normalizedNode,
-            @Nonnull QName rootNode);
+            @NonNull NormalizedNode normalizedNode,
+            @NonNull QName rootNode);
 
     <T extends DataObject> Optional<T> getDataObjectFromRpc(
-            @Nonnull NormalizedNode normalizedNode);
+            @NonNull NormalizedNode normalizedNode);
 
     Optional<NormalizedNode> transformIntoNormalizedNode(
-            @Nonnull InputStream inputStream);
+            @NonNull InputStream inputStream);
 
     Optional<NormalizedNode> transformIntoNormalizedNode(
-            @Nonnull Reader inputReader, SchemaNode parentSchema);
+            @NonNull Reader inputReader, SchemaNode parentSchema);
 
     Optional<NormalizedNode> transformIntoNormalizedNode(
-            @Nonnull Reader inputReader);
+            @NonNull Reader inputReader);
 
-    <T extends DataObject> Writer writerFromDataObject(@Nonnull DataObject object, Class<T> dataObjectClass,
+    <T extends DataObject> Writer writerFromDataObject(@NonNull DataObject object, Class<T> dataObjectClass,
             ConvertType<T> convertType);
 
-    <T extends DataObject> Writer writerFromRpcDataObject(@Nonnull DataObject object, Class<T> dataObjectClass,
+    <T extends DataObject> Writer writerFromRpcDataObject(@NonNull DataObject object, Class<T> dataObjectClass,
             ConvertType<T> convertType, QName rpcOutputQName, String rpcName);
 
-    <T extends DataObject> Optional<NormalizedNode> toNormalizedNodes(@Nonnull T object,
-            Class<T> dataObjectClass);
+    @SuppressWarnings("rawtypes")
+    <T extends DataObject> Optional<NormalizedNode> toNormalizedNodes(@NonNull T object, Class dataObjectClass);
 
-    public interface ConvertType<T> {
+    interface ConvertType<T> {
         Optional<NormalizedNode> toNormalizedNodes(T object, Class<T> clazz);
     }
 
@@ -73,6 +73,7 @@ public interface DataObjectConverter {
      *
      * @return {@link ConvertType} converter for {@link Notification}
      */
+    @SuppressWarnings("rawtypes")
     <T extends Notification> ConvertType<T> notification();
 
 }
index aaf32eef0a8de5780f1d08362187619eb347ee6e..06a645dfcad9044f7c70932c69926a062f208b81 100644 (file)
@@ -17,7 +17,7 @@ import java.io.StringWriter;
 import java.io.Writer;
 import java.nio.charset.StandardCharsets;
 import java.util.Optional;
-import javax.annotation.Nonnull;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
 import org.opendaylight.transportpce.test.DataStoreContext;
 import org.opendaylight.yangtools.yang.binding.DataObject;
@@ -30,7 +30,7 @@ import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactorySupplier;
 import org.opendaylight.yangtools.yang.data.codec.gson.JSONNormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.data.codec.gson.JsonParserStream;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
-import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
+import org.opendaylight.yangtools.yang.data.impl.schema.NormalizationResultHolder;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.EffectiveStatementInference;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
@@ -53,7 +53,7 @@ public final class JSONDataObjectConverter extends AbstractDataObjectConverter {
      * @param dataStoreContextUtil datastore context util used to extract codec and schema context
      * @return {@link AbstractDataObjectConverter}
      */
-    public static DataObjectConverter createWithDataStoreUtil(@Nonnull DataStoreContext dataStoreContextUtil) {
+    public static DataObjectConverter createWithDataStoreUtil(@NonNull DataStoreContext dataStoreContextUtil) {
         return new JSONDataObjectConverter(dataStoreContextUtil.getSchemaContext(),
                 dataStoreContextUtil.getBindingDOMCodecServices());
     }
@@ -65,8 +65,8 @@ public final class JSONDataObjectConverter extends AbstractDataObjectConverter {
      * @param codecRegistry codec registry used for converting
      * @return converter
      */
-    public static DataObjectConverter createWithSchemaContext(@Nonnull EffectiveModelContext schemaContext,
-            @Nonnull BindingNormalizedNodeSerializer codecRegistry) {
+    public static DataObjectConverter createWithSchemaContext(@NonNull EffectiveModelContext schemaContext,
+            @NonNull BindingNormalizedNodeSerializer codecRegistry) {
         return new JSONDataObjectConverter(schemaContext, codecRegistry);
     }
 
@@ -78,26 +78,26 @@ public final class JSONDataObjectConverter extends AbstractDataObjectConverter {
      */
     @Override
     public Optional<NormalizedNode> transformIntoNormalizedNode(
-            @Nonnull InputStream inputStream) {
+        @   NonNull InputStream inputStream) {
         JsonReader reader = new JsonReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
         return parseInputJSON(reader);
     }
 
     @Override
     public Optional<NormalizedNode> transformIntoNormalizedNode(
-            @Nonnull Reader inputReader, SchemaNode parentSchema) {
+            @NonNull Reader inputReader, SchemaNode parentSchema) {
         throw new UnsupportedOperationException("Not Implemented yet");
     }
 
     @Override
     public Optional<NormalizedNode> transformIntoNormalizedNode(
-            @Nonnull Reader inputReader) {
+            @NonNull Reader inputReader) {
         JsonReader reader = new JsonReader(inputReader);
         return parseInputJSON(reader);
     }
 
     @Override
-    public <T extends DataObject> Writer writerFromDataObject(@Nonnull DataObject object, Class<T> dataObjectClass,
+    public <T extends DataObject> Writer writerFromDataObject(@NonNull DataObject object, Class<T> dataObjectClass,
             ConvertType<T> convertType) {
         Writer writer = new StringWriter();
         JsonWriter jsonWriter = new JsonWriter(writer);
@@ -108,7 +108,7 @@ public final class JSONDataObjectConverter extends AbstractDataObjectConverter {
                 jsonCodecFactory, rootNode, EffectiveModelContext.NAME.getNamespace(), jsonWriter);
         try (NormalizedNodeWriter normalizedNodeWriter = NormalizedNodeWriter.forStreamWriter(create);) {
             normalizedNodeWriter
-                    .write(convertType.toNormalizedNodes(dataObjectClass.cast(object), dataObjectClass).get());
+                    .write(convertType.toNormalizedNodes(dataObjectClass.cast(object), dataObjectClass).orElseThrow());
         } catch (IOException ioe) {
             throw new IllegalStateException(ioe);
         }
@@ -116,7 +116,7 @@ public final class JSONDataObjectConverter extends AbstractDataObjectConverter {
     }
 
     @Override
-    public <T extends DataObject> Writer writerFromRpcDataObject(@Nonnull DataObject object, Class<T> dataObjectClass,
+    public <T extends DataObject> Writer writerFromRpcDataObject(@NonNull DataObject object, Class<T> dataObjectClass,
             ConvertType<T> convertType, QName rpcOutputQName, String rpcName) {
         return null;
     }
@@ -129,7 +129,7 @@ public final class JSONDataObjectConverter extends AbstractDataObjectConverter {
      */
     private Optional<NormalizedNode> parseInputJSON(
             JsonReader reader) {
-        NormalizedNodeResult result = new NormalizedNodeResult();
+        NormalizationResultHolder result = new NormalizationResultHolder();
         try (NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
             JsonParserStream jsonParser = JsonParserStream.create(streamWriter,
                 JSONCodecFactorySupplier.RFC7951.getShared(getSchemaContext()))) {
@@ -138,7 +138,7 @@ public final class JSONDataObjectConverter extends AbstractDataObjectConverter {
             LOG.warn("An error occured during parsing Json input stream", e);
             return Optional.empty();
         }
-        return Optional.ofNullable(result.getResult());
+        return Optional.ofNullable(result.getResult().data());
     }
 
 }
index b973ca758ab0707ee4d6ea40e865712d256e3f52..653efb160ad0cdbf12b486fd42d671b9e8c75fe0 100644 (file)
@@ -12,9 +12,7 @@ import java.io.InputStream;
 import java.io.Reader;
 import java.io.StringWriter;
 import java.io.Writer;
-import java.net.URISyntaxException;
 import java.util.Optional;
-import javax.annotation.Nonnull;
 import javax.xml.XMLConstants;
 import javax.xml.parsers.FactoryConfigurationError;
 import javax.xml.stream.XMLInputFactory;
@@ -22,6 +20,7 @@ import javax.xml.stream.XMLOutputFactory;
 import javax.xml.stream.XMLStreamException;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.stream.XMLStreamWriter;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
 import org.opendaylight.transportpce.test.DataStoreContext;
 import org.opendaylight.yangtools.yang.binding.DataObject;
@@ -33,7 +32,7 @@ import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWrit
 import org.opendaylight.yangtools.yang.data.codec.xml.XMLStreamNormalizedNodeStreamWriter;
 import org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter;
-import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult;
+import org.opendaylight.yangtools.yang.data.impl.schema.NormalizationResultHolder;
 import org.opendaylight.yangtools.yang.model.api.EffectiveModelContext;
 import org.opendaylight.yangtools.yang.model.api.EffectiveStatementInference;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
@@ -41,7 +40,6 @@ import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack;
 import org.opendaylight.yangtools.yang.model.util.SchemaInferenceStack.Inference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.xml.sax.SAXException;
 
 public final class XMLDataObjectConverter extends AbstractDataObjectConverter {
 
@@ -70,7 +68,7 @@ public final class XMLDataObjectConverter extends AbstractDataObjectConverter {
      * @param dataStoreContextUtil datastore context util used to extract codec and schema context
      * @return {@link AbstractDataObjectConverter}
      */
-    public static XMLDataObjectConverter createWithDataStoreUtil(@Nonnull DataStoreContext dataStoreContextUtil) {
+    public static XMLDataObjectConverter createWithDataStoreUtil(@NonNull DataStoreContext dataStoreContextUtil) {
         BindingNormalizedNodeSerializer bindingToNormalizedNodeCodec =
                 dataStoreContextUtil.getBindingDOMCodecServices();
         return new XMLDataObjectConverter(dataStoreContextUtil.getSchemaContext(), bindingToNormalizedNodeCodec);
@@ -83,8 +81,8 @@ public final class XMLDataObjectConverter extends AbstractDataObjectConverter {
      * @param codecRegistry codec registry used for converting
      * @return new {@link XMLDataObjectConverter}
      */
-    public static XMLDataObjectConverter createWithSchemaContext(@Nonnull EffectiveModelContext schemaContext,
-            @Nonnull BindingNormalizedNodeSerializer codecRegistry) {
+    public static XMLDataObjectConverter createWithSchemaContext(@NonNull EffectiveModelContext schemaContext,
+            @NonNull BindingNormalizedNodeSerializer codecRegistry) {
         return new XMLDataObjectConverter(schemaContext, codecRegistry);
     }
 
@@ -95,7 +93,7 @@ public final class XMLDataObjectConverter extends AbstractDataObjectConverter {
      * @return {@link Optional} instance of {@link NormalizedNode}.
      */
     @Override
-    public Optional<NormalizedNode> transformIntoNormalizedNode(@Nonnull InputStream inputStream) {
+    public Optional<NormalizedNode> transformIntoNormalizedNode(@NonNull InputStream inputStream) {
         try {
             XMLStreamReader reader = this.xmlInputFactory.createXMLStreamReader(inputStream);
             return parseInputXML(reader);
@@ -106,7 +104,7 @@ public final class XMLDataObjectConverter extends AbstractDataObjectConverter {
     }
 
     @Override
-    public Optional<NormalizedNode> transformIntoNormalizedNode(@Nonnull Reader inputReader) {
+    public Optional<NormalizedNode> transformIntoNormalizedNode(@NonNull Reader inputReader) {
         try {
             XMLStreamReader reader = this.xmlInputFactory.createXMLStreamReader(inputReader);
             return parseInputXML(reader);
@@ -127,7 +125,7 @@ public final class XMLDataObjectConverter extends AbstractDataObjectConverter {
      * @param inputReader of the given XML
      * @return {@link Optional} instance of {@link NormalizedNode}.
      */
-    public Optional<NormalizedNode> transformInschemaContexttoNormalizedNode(@Nonnull Reader inputReader) {
+    public Optional<NormalizedNode> transformInschemaContexttoNormalizedNode(@NonNull Reader inputReader) {
         try {
             XMLStreamReader reader = this.xmlInputFactory.createXMLStreamReader(inputReader);
             return parseInputXML(reader);
@@ -138,7 +136,7 @@ public final class XMLDataObjectConverter extends AbstractDataObjectConverter {
     }
 
     @Override
-    public <T extends DataObject> Writer writerFromRpcDataObject(@Nonnull DataObject object, Class<T> dataObjectClass,
+    public <T extends DataObject> Writer writerFromRpcDataObject(@NonNull DataObject object, Class<T> dataObjectClass,
             ConvertType<T> convertType, QName rpcOutputQName, String rpcName) {
         Writer writer = new StringWriter();
         XMLStreamWriter xmlStreamWriter = createXmlStreamWriter(writer);
@@ -146,8 +144,8 @@ public final class XMLDataObjectConverter extends AbstractDataObjectConverter {
             xmlStreamWriter.writeStartElement(XMLConstants.DEFAULT_NS_PREFIX,
                     rpcOutputQName.getLocalName(), rpcOutputQName.getNamespace().toString());
             xmlStreamWriter.writeDefaultNamespace(rpcOutputQName.getNamespace().toString());
-            NormalizedNode rpcOutputNormalizedNode = convertType.toNormalizedNodes(dataObjectClass.cast(object),
-                    dataObjectClass).get();
+            NormalizedNode rpcOutputNormalizedNode =
+                convertType.toNormalizedNodes(dataObjectClass.cast(object), dataObjectClass).orElseThrow();
             for (final NormalizedNode child : ((ContainerNode)rpcOutputNormalizedNode).body()) {
                 normalizedNodeWriter.write(child);
             }
@@ -169,7 +167,7 @@ public final class XMLDataObjectConverter extends AbstractDataObjectConverter {
      *
      */
     @Override
-    public <T extends DataObject> Writer writerFromDataObject(@Nonnull DataObject object, Class<T> dataObjectClass,
+    public <T extends DataObject> Writer writerFromDataObject(@NonNull DataObject object, Class<T> dataObjectClass,
             ConvertType<T> convertType) {
 
         Writer writer = new StringWriter();
@@ -181,7 +179,7 @@ public final class XMLDataObjectConverter extends AbstractDataObjectConverter {
         }
 
         try (NormalizedNodeWriter normalizedNodeWriter = createWriterBackedNormalizedNodeWriter(writer)) {
-            normalizedNodeWriter.write(normalizedNode.get());
+            normalizedNodeWriter.write(normalizedNode.orElseThrow());
             normalizedNodeWriter.flush();
         } catch (IOException ioe) {
             throw new IllegalStateException(ioe);
@@ -194,17 +192,17 @@ public final class XMLDataObjectConverter extends AbstractDataObjectConverter {
     }
 
     private Optional<NormalizedNode> parseInputXML(XMLStreamReader reader, SchemaNode parentSchemaNode) {
-        NormalizedNodeResult result = new NormalizedNodeResult();
+        NormalizationResultHolder result = new NormalizationResultHolder();
         EffectiveStatementInference schema = SchemaInferenceStack.of(getSchemaContext()).toInference();
         try (NormalizedNodeStreamWriter streamWriter = ImmutableNormalizedNodeStreamWriter.from(result);
                 XmlParserStream xmlParser = XmlParserStream
                     .create(streamWriter, schema)) {
             xmlParser.parse(reader);
-        } catch (XMLStreamException | URISyntaxException | IOException | SAXException e) {
+        } catch (XMLStreamException | IOException e) {
             LOG.warn("An error occured during parsing XML input stream", e);
             return Optional.empty();
         }
-        return Optional.ofNullable(result.getResult());
+        return Optional.ofNullable(result.getResult().data());
     }
 
     private NormalizedNodeWriter createWriterBackedNormalizedNodeWriter(Writer backingWriter) {
index edd5f76b40993c29c28c55bae371b64148ae8719..c06dcb451e6854726c63dfa3b6452f6f36992c8e 100644 (file)
@@ -9,9 +9,11 @@
 package org.opendaylight.transportpce.test.stub;
 
 import java.util.Optional;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.mdsal.binding.api.MountPoint;
 import org.opendaylight.mdsal.binding.api.MountPointService;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.mdsal.binding.dom.adapter.BindingDOMMountPointServiceAdapter;
+import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public class MountPointServiceStub implements MountPointService {
@@ -31,8 +33,7 @@ public class MountPointServiceStub implements MountPointService {
     }
 
     @Override
-    public <T extends MountPointListener> ListenerRegistration<T> registerListener(InstanceIdentifier<?> path,
-        T listener) {
-        return null;
+    public @NonNull Registration registerListener(InstanceIdentifier<?> path, MountPointListener listener) {
+        return new BindingDOMMountPointServiceAdapter(null, null).registerListener(path, listener);
     }
 }
index 362a40b638b9c8570bb285b839cae2693033c6c3..6e8b55737fd92242d081f530f7b7ceba22fd5cee 100644 (file)
@@ -5,30 +5,27 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-
 package org.opendaylight.transportpce.test.stub;
 
 import java.util.Optional;
-import javax.annotation.Nonnull;
 import org.opendaylight.mdsal.binding.api.BindingService;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.MountPoint;
-import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
+import org.opendaylight.mdsal.binding.api.RpcService;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 public class MountPointStub implements MountPoint {
 
     private DataBroker dataBroker;
 
-    private RpcConsumerRegistry rpcConsumerRegistry;
+    private RpcService rpcService;
 
     public MountPointStub(DataBroker dataBroker) {
         this.dataBroker = dataBroker;
     }
 
-    public void setRpcConsumerRegistry(
-            RpcConsumerRegistry rpcConsumerRegistry) {
-        this.rpcConsumerRegistry = rpcConsumerRegistry;
+    public void setRpcService(RpcService rpcService) {
+        this.rpcService = rpcService;
     }
 
     @Override
@@ -37,13 +34,12 @@ public class MountPointStub implements MountPoint {
         if (service.isInstance(dataBroker)) {
             return Optional.ofNullable((T) dataBroker);
         }
-        if (service.isInstance(rpcConsumerRegistry)) {
-            return Optional.ofNullable((T) rpcConsumerRegistry);
+        if (service.isInstance(rpcService)) {
+            return Optional.ofNullable((T) rpcService);
         }
         return Optional.empty();
     }
 
-    @Nonnull
     @Override
     public InstanceIdentifier<?> getIdentifier() {
         throw new UnsupportedOperationException();
index 859a329fad96960f7d5e7f1233fc247509bcacf1..44c5252aebcd378426b14608ef57f4f05064b794 100644 (file)
@@ -20,7 +20,7 @@ import org.opendaylight.mdsal.common.api.CommitInfo;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.transportpce.test.DataStoreContext;
 import org.opendaylight.transportpce.test.converter.XMLDataObjectConverter;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.Network;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev231221.Network;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.rev180226.Networks;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -32,7 +32,7 @@ public final class TopologyDataUtils {
 
     private static final Logger LOG = LoggerFactory.getLogger(TopologyDataUtils.class);
 
-    @SuppressWarnings({"unchecked","rawtypes"})
+    @SuppressWarnings("rawtypes")
     // FIXME check if the InstanceIdentifier raw type can be avoided
     // Raw types use are discouraged since they lack type safety.
     // Resulting Problems are observed at run time and not at compile time
@@ -50,11 +50,11 @@ public final class TopologyDataUtils {
                         "Could not transform the input %s into normalized nodes", fileName));
                 }
                 Optional<DataObject> dataObject = XMLDataObjectConverter.createWithDataStoreUtil(dataStoreContextUtil)
-                    .getDataObject(transformIntoNormalizedNode.get(), Networks.QNAME);
+                    .getDataObject(transformIntoNormalizedNode.orElseThrow(), Networks.QNAME);
                 if (!dataObject.isPresent()) {
                     throw new IllegalStateException("Could not transform normalized nodes into data object");
                 } else {
-                    networks = (Networks) dataObject.get();
+                    networks = (Networks) dataObject.orElseThrow();
                 }
             } catch (IOException e) {
                 LOG.error("An error occured while reading file {}", file, e);
@@ -66,7 +66,7 @@ public final class TopologyDataUtils {
             throw new IllegalStateException("Network is null cannot write it to datastore");
         }
         FluentFuture<? extends CommitInfo> commitFuture = writeTransaction(dataStoreContextUtil.getDataBroker(), ii,
-                networks.nonnullNetwork().values().stream().findFirst().get());
+                networks.nonnullNetwork().values().stream().findFirst().orElseThrow());
         commitFuture.get();
         LOG.info("extraction from {} stored with success in datastore", topoFile.getName());
     }
@@ -97,11 +97,11 @@ public final class TopologyDataUtils {
                         "Could not transform the input %s into normalized nodes", fileName));
                 }
                 Optional<DataObject> dataObject = XMLDataObjectConverter.createWithDataStoreUtil(dataStoreContextUtil)
-                    .getDataObject(transformIntoNormalizedNode.get(), Network.QNAME);
+                    .getDataObject(transformIntoNormalizedNode.orElseThrow(), Network.QNAME);
                 if (!dataObject.isPresent()) {
                     throw new IllegalStateException("Could not transform normalized nodes into data object");
                 } else {
-                    result = (Network) dataObject.get();
+                    result = (Network) dataObject.orElseThrow();
                 }
             } catch (IOException e) {
                 LOG.error("An error occured while reading file {}", file, e);
diff --git a/test-common/src/main/yang/path-description-stub@2020-12-11.yang b/test-common/src/main/yang/path-description-stub@2020-12-11.yang
deleted file mode 100644 (file)
index 4332e00..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-module pathdescription-stub {
-  yang-version 1;
-  namespace "pathdescription-stub";
-  prefix pathdescription-stub;
-
-  import transportpce-pathDescription {
-    prefix transportpce-pathDescription;
-    revision-date 2021-07-05;
-  }
-
-  description
-    "YANG model for providing path-description through data container for testing purpose";
-
-  revision 2020-12-11 {
-    description
-      "first version";
-    reference
-      "YANG model for providing path-description through data container for testing purpose";
-  }
-
-  container path-description {
-    uses transportpce-pathDescription:path-description;
-  }
-}
diff --git a/tests/Xtesting/Dockerfile b/tests/Xtesting/Dockerfile
new file mode 100644 (file)
index 0000000..82963d4
--- /dev/null
@@ -0,0 +1,32 @@
+FROM alpine:3.18
+
+ARG BRANCH=master
+
+RUN apk --update add \
+        build-base \
+        checkbashisms \
+        curl \
+        linux-headers \
+        git \
+        gcc \
+        libxml2-dev \
+        libxslt-dev \
+        maven \
+        openjdk17-jdk \
+        openssl-dev \
+        python3 \
+        python3-dev \
+        py3-pip \
+        py3-psutil \
+        py3-tox \
+        py3-wheel \
+    && \
+    git init /src/transportpce && \
+    (cd /src/transportpce && \
+        git fetch --tags https://git.opendaylight.org/gerrit/transportpce.git $BRANCH && \
+        git checkout FETCH_HEAD) && \
+    pip install xtesting \
+        -r /src/transportpce/tests/requirements.txt \
+        -r /src/transportpce/tests/test-requirements.txt
+COPY testcases.yaml /etc/xtesting/testcases.yaml
+CMD ["run_tests", "-t", "all"]
diff --git a/tests/Xtesting/INSTALL.txt b/tests/Xtesting/INSTALL.txt
new file mode 100644 (file)
index 0000000..2ee3a5e
--- /dev/null
@@ -0,0 +1,17 @@
+## required steps on a brand new debian 12 system
+# apt-get install git sudo
+# adduser opnfv
+# adduser opnfv sudo
+# su - opnfv
+git clone https://git.opendaylight.org/gerrit/transportpce
+cd transportpce/tests/Xtesting
+sudo apt-get install virtualenv
+virtualenv xtesting -p python3 --system-site-packages
+. xtesting/bin/activate
+pip install ansible
+ansible-galaxy install -r requirements.yml
+ansible-playbook site.yml
+deactivate
+sudo docker build -t 127.0.0.1:5000/tpce0 .
+sudo docker run -d -p 5000:5000 --restart=always --name registry registry:2
+sudo docker push 127.0.0.1:5000/tpce0
diff --git a/tests/Xtesting/patch.diff b/tests/Xtesting/patch.diff
new file mode 100644 (file)
index 0000000..d8999db
--- /dev/null
@@ -0,0 +1,31 @@
+diff --git a/tox.ini b/tox.ini
+index 7cae5c70..dd44b57a 100644
+--- a/tox.ini
++++ b/tox.ini
+@@ -94,7 +94,7 @@ commands =
+   ./build_karaf_for_tests.sh
+ [testenv:tests121]
+-depends = buildcontroller,build_karaf_tests121,sims121,testsPCE
++depends = buildcontroller,build_karaf_tests121,sims121
+ # testsPCE dependency is only here to chain tests in the gate and avoid resources starvation
+ allowlist_externals = launch_tests.sh
+ passenv = LAUNCHER, USE_LIGHTY, NO_ODL_STARTUP, USE_ODL_RESTCONF_VERSION
+@@ -127,7 +127,7 @@ commands =
+   ./build_karaf_for_tests.sh
+ [testenv:tests221]
+-depends = buildcontroller,build_karaf_tests221,sims221,tests71
++depends = buildcontroller,build_karaf_tests221,sims221,tests_tapi
+ # tests71 dependency is only here to chain tests in the gate and avoid ressources starvation
+ allowlist_externals = launch_tests.sh
+ passenv = LAUNCHER, USE_LIGHTY, NO_ODL_STARTUP, USE_ODL_RESTCONF_VERSION
+@@ -152,7 +152,7 @@ commands =
+   ./build_karaf_for_tests.sh
+ [testenv:tests71]
+-depends = buildcontroller,build_karaf_tests71,sims71,tests_tapi
++depends = buildcontroller,build_karaf_tests71,sims71
+ allowlist_externals = launch_tests.sh
+ passenv = LAUNCHER, USE_LIGHTY, NO_ODL_STARTUP, USE_ODL_RESTCONF_VERSION
+ setenv =
diff --git a/tests/Xtesting/requirements.yml b/tests/Xtesting/requirements.yml
new file mode 100644 (file)
index 0000000..a546126
--- /dev/null
@@ -0,0 +1,16 @@
+---
+roles:
+  - name: collivier.xtesting
+    src: https://github.com/collivier/ansible-role-xtesting
+    version: master
+  # to use xtesting GitHub repo master branch until a version > 4.2.0
+  # is published in ansible catalog to bring the following fix
+  # https://github.com/collivier/ansible-role-xtesting/pull/19
+
+collections:
+  - name: ansible.posix
+  - name: community.general
+  - name: community.grafana
+  - name: community.kubernetes
+  - name: community.docker
+  - name: community.postgresql
diff --git a/tests/Xtesting/site.yml b/tests/Xtesting/site.yml
new file mode 100644 (file)
index 0000000..fc832f3
--- /dev/null
@@ -0,0 +1,21 @@
+---
+- hosts:
+    - 127.0.0.1
+  roles:
+    - role: collivier.xtesting
+      project: transportpce
+      repo: 127.0.0.1
+      dport: 5000
+      gerrit: git.opendaylight.org
+      gerrit_project: transportpce
+      suites:
+        - container: tpce0
+          tests:
+            - combined
+#            - linters
+#            - build
+#            - PCE
+#            - 121
+#            - 221
+#            - 71
+#            - hybrid
diff --git a/tests/Xtesting/testcases.yaml b/tests/Xtesting/testcases.yaml
new file mode 100644 (file)
index 0000000..67cd870
--- /dev/null
@@ -0,0 +1,108 @@
+---
+tiers:
+    -
+        name: suites
+        order: 0
+        description: 'transportPCE tests by category'
+        testcases:
+            -
+                case_name: linters
+                project_name: transportpce
+                criteria: 100
+                blocking: true
+                clean_flag: false
+                description: 'linters suite'
+                run:
+                    name: 'bashfeature'
+                    args:
+                        cmd: 'cd /src/transportpce && tox -o -p auto -e docs,docs-linkcheck,pre-commit,checkbashisms,pylint'
+                        console: true
+            -
+                case_name: build
+                project_name: transportpce
+                criteria: 100
+                blocking: true
+                clean_flag: false
+                description: 'build transportpce with karaf and lighty.io'
+                run:
+                    name: 'bashfeature'
+                    args:
+                        cmd: 'cd /src/transportpce && tox -e buildcontroller,buildlighty'
+                        console: true
+            -
+                case_name: PCE
+                project_name: transportpce
+                criteria: 100
+                blocking: true
+                clean_flag: false
+                description: 'run PCE tests'
+                run:
+                    name: 'bashfeature'
+                    args:
+                        cmd: 'cd /src/transportpce && tox -e buildcontroller,testsPCE'
+                        console: true
+            -
+                case_name: 121
+                project_name: transportpce
+                criteria: 100
+                blocking: true
+                clean_flag: false
+                description: 'run OpenROADM device 1.2.1 tests suite'
+                run:
+                    name: 'bashfeature'
+                    args:
+                        cmd: 'cd /src/transportpce && tox -e buildcontroller,build_karaf_tests121,sims121,tests121'
+                        console: true
+            -
+                case_name: 221
+                project_name: transportpce
+                criteria: 100
+                blocking: true
+                clean_flag: false
+                description: 'run OpenROADM device 2.2.1 tests suite'
+                run:
+                    name: 'bashfeature'
+                    args:
+                        cmd: 'cd /src/transportpce && tox -e buildcontroller,build_karaf_tests221,sims221,tests221'
+                        console: true
+            -
+                case_name: 71
+                project_name: transportpce
+                criteria: 100
+                blocking: true
+                clean_flag: false
+                description: 'run OpenROADM device 7.1 tests suite'
+                run:
+                    name: 'bashfeature'
+                    args:
+                        cmd: 'cd /src/transportpce && tox -e buildcontroller,build_karaf_tests71,sims71,tests71'
+                        console: true
+            -
+                case_name: hybrid
+                project_name: transportpce
+                criteria: 100
+                blocking: true
+                clean_flag: false
+                description: 'run OpenROADM device mixed versions tests suite'
+                run:
+                    name: 'bashfeature'
+                    args:
+                        cmd: 'cd /src/transportpce && tox -e buildcontroller,build_karaf_tests_hybrid,tests_hybrid'
+                        console: true
+    -
+        name: combined
+        order: 1
+        description: 'combine all transportPCE tests'
+        testcases:
+            -
+                case_name: combined
+                project_name: transportpce
+                criteria: 100
+                blocking: true
+                clean_flag: false
+                description: 'run all transportPCE tests in parallell with tox'
+                run:
+                    name: 'bashfeature'
+                    args:
+                        cmd: 'cd /src/transportpce && git apply tests/Xtesting/patch.diff && tox -o -p auto'
+                        console: true
diff --git a/tests/add_tapi_feature_to_tests221.sh b/tests/add_tapi_feature_to_tests221.sh
new file mode 100755 (executable)
index 0000000..f358607
--- /dev/null
@@ -0,0 +1,28 @@
+#!/bin/sh
+
+if [ "$USE_LIGHTY" = "True" ]; then
+    exit 0;
+fi
+
+cd $(dirname $0)
+cd ..
+
+if [ ! -d karaf221/ ]; then
+    echo 'no target directory' >&2
+    cd $(dirname $0)
+    exit 1
+fi
+
+featreference=$(grep '^featuresBoot =' karaf221/target/assembly/etc/org.apache.karaf.features.cfg | cut -d= -f2 | sed 's/^ *//')
+xmlfeatconfigfile=$(grep -lR $featreference karaf221/target/assembly/etc/*.xml)
+
+if [ -f "$xmlfeatconfigfile"_ ]; then
+    echo "nothing to do : $xmlfeatconfigfile already modified" >&2
+    cd $(dirname $0)
+    exit 0
+fi
+
+newconfigline=$(grep 'odl-transportpce</feature>' $xmlfeatconfigfile | sed 's@odl-transportpce</feature>@odl-transportpce-tapi</feature>@g')
+sed -i_ "/odl-transportpce<\/feature>/a $newconfigline" $xmlfeatconfigfile
+
+cd $(dirname $0)
index d250dcf1cae94ca0f885a7ac31e99a326cb144a4..00a8fe28b88b5576555ba92f80eb15cca00d9088 100755 (executable)
@@ -19,7 +19,7 @@ fi
 
 #build controller, source JDK_JAVA_OPTIONS to remove illegal reflective acces warnings introduced by Java11
 . "$current_dir"/reflectwarn.sh
-mvn clean install -B -q -s tests/odl_settings.xml -DskipTests -Dmaven.javadoc.skip=true -Dodlparent.spotbugs.skip -Dodlparent.checkstyle.skip
+mvn clean install -B -q -s tests/odl_settings.xml -Pq
 
 #patch Karaf exec for the same reason at runtime and also to have the possibility to use alternative ports
 ./karaf/target/assembly/ressources/post_install_for_tests.sh
index e2d13cd12eba411c3a645576e7a49b68aa897c5d..cb637bbd458916b4dbc40561d8ca3d12f57797e6 100755 (executable)
@@ -18,5 +18,5 @@ fi
 . $USE_ODL_ALT_KARAF_ENV
 . ./reflectwarn.sh
 cd  ../$USE_ODL_ALT_KARAF_INSTALL_DIR
-mvn clean install -B -q -s ../tests/odl_settings.xml -DskipTests -Dmaven.javadoc.skip=true
+mvn clean install -B -q -s ../tests/odl_settings.xml -Pq
 ./target/assembly/ressources/post_install_for_tests.sh
index b943d518ffa3dd622c38f8764ad8a62c294f64f2..243524b3975a12facbacd0ecfdf175298ee7ff2c 100755 (executable)
@@ -1,35 +1,35 @@
-#!/bin/bash
+#!/bin/sh
 
 set -x
 
 #check Java version install if any
 JAVA_CMD="java"
 [ -n "$JAVA_HOME" ] && JAVA_CMD="$JAVA_HOME/bin/java"
-JAVA_VER=$("$JAVA_CMD" -version 2>&1 | sed -n ';s/.* version "\(.*\)\.\(.*\)\..*".*$/\1\2/p;')
+JAVA_VER=$("$JAVA_CMD" -version 2>&1 | sed -n ';s/.* version "\(.*\)\.\(.*\)\..*".*$/\1/p;')
 echo $JAVA_VER
 JAVAC_CMD="javac"
 [ -n "$JAVA_HOME" ] && JAVAC_CMD="$JAVA_HOME/bin/javac"
-JAVAC_VER=$("$JAVAC_CMD" -version 2>&1 |  sed -n ';s/javac \(.*\)\.\(.*\)\..*.*$/\1\2/p;')
+JAVAC_VER=$("$JAVAC_CMD" -version 2>&1 |  sed -n ';s/javac \(.*\)\.\(.*\)\..*.*$/\1/p;')
 echo $JAVAC_VER
-if [ "$JAVA_VER" -ge 110 -a "$JAVAC_VER" -ge 110 ];then
-        echo "ok, java is 11 or newer"
+if [ "$JAVA_VER" -ge 17 -a "$JAVAC_VER" -ge 17 ];then
+        echo "ok, java is 17 or newer"
 else
-    #java 11 installation for CentOS (releng OS image target)
-        echo "install java 11"
-        sudo yum install -y java-11-openjdk java-11-openjdk-devel
-        last_installed_jdk11=$(ls -tr1 /usr/lib/jvm/ | grep java-11-openjdk-11 | tail -1)
-        if [ -n "$last_installed_jdk11" ];then
-            sudo alternatives --set java /usr/lib/jvm/$last_installed_jdk11/bin/java
-            sudo alternatives --set javac /usr/lib/jvm/$last_installed_jdk11/bin/javac
+    #java installation for CentOS (releng OS image target)
+        echo "install java 17"
+        sudo yum install -y java-17-openjdk java-17-openjdk-devel
+        last_installed_jdk17=$(ls -tr1 /usr/lib/jvm/ | grep java-17-openjdk-17 | tail -1)
+        if [ -n "$last_installed_jdk17" ];then
+            sudo alternatives --set java /usr/lib/jvm/$last_installed_jdk17/bin/java
+            sudo alternatives --set javac /usr/lib/jvm/$last_installed_jdk17/bin/javac
         else
-           echo "No java11 available"
+           echo "No java17 available"
            exit 1
         fi
 fi
 
-#download maven image 3.8.5 and install it
-wget -nv https://dlcdn.apache.org/maven/maven-3/3.8.5/binaries/apache-maven-3.8.5-bin.tar.gz -P /tmp
+#download maven image 3.8.8 and install it
+wget -nv https://dlcdn.apache.org/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz -P /tmp
 sudo mkdir -p /opt
-sudo tar xf /tmp/apache-maven-3.8.5-bin.tar.gz -C /opt
-sudo ln -s /opt/apache-maven-3.8.5 /opt/maven
+sudo tar xf /tmp/apache-maven-3.8.8-bin.tar.gz -C /opt
+sudo ln -s /opt/apache-maven-3.8.8 /opt/maven
 sudo ln -s /opt/maven/bin/mvn /usr/bin/mvn
index 1d0b3de98418d13170aa121b7ad34fd8d76aadfc..a4c21ba1b1fef4761d2f3325fff5618c1a2daeff 100755 (executable)
@@ -19,10 +19,13 @@ for VERSION in $VERSIONS_LIST
 do
     case "$VERSION" in
         "1.2.1") PLUGIN_VERSION=1.0.9
+        #update 1.2.1 openroadm device configuration samples to be compliant with honeynode
+        #device models ("multi-wavelegnth" instead of "multi-wavelength" whose typo has been solved with 2.2.1 device models)
+        sed -i_ 's/multi-wavelegnth/multi-wavelength/g' $(dirname $0)/sample_configs/openroadm/1.2.1/oper-ROADM*.xml
         ;;
-        "2.2.1") PLUGIN_VERSION=2.0.9
+        "2.2.1") PLUGIN_VERSION=2.0.10
         ;;
-        "7.1") PLUGIN_VERSION=7.1.6
+        "7.1") PLUGIN_VERSION=7.1.9
         ;;
         *) echo "unsupported device version" >&2
         continue
diff --git a/tests/install_lightynode.sh b/tests/install_lightynode.sh
new file mode 100755 (executable)
index 0000000..aa9cd5e
--- /dev/null
@@ -0,0 +1,51 @@
+#!/bin/sh
+
+#set -x
+
+PLUGIN_VERSION=${1:-19.1.0.5}
+
+#check if curl exists
+if ! [ -x "$(command -v curl)" ];then
+    echo "curl is not installed." >&2
+    exit 1
+fi
+#check if unzip exists
+if ! [ -x "$(command -v unzip)" ];then
+    echo "unzip is not installed." >&2
+    exit 1
+fi
+
+if [ -n "$2" ];then
+    echo "Using lighynode version $1 $2"
+    FILE_NAME="lighty-openroadm-device-$(echo $1 | cut -d - -f 1)-$2-bin.zip"
+    TARGET_URL="https://gitlab.com/api/v4/projects/36076125/packages/maven/io/lighty/transportpce/netconf/device/lighty-openroadm-device/$PLUGIN_VERSION/${FILE_NAME}"
+else
+    echo "Using lighynode version $PLUGIN_VERSION"
+    TARGET_URL="https://gitlab.com/api/v4/projects/36076125/packages/maven/io/lighty/transportpce/netconf/device/lighty-openroadm-device/$PLUGIN_VERSION/lighty-openroadm-device-$PLUGIN_VERSION-bin.zip"
+fi
+
+TARGET_DIR=$(dirname $0)/lightynode
+INSTALL_DIR=$TARGET_DIR/lightynode-openroadm-device
+ARTIFACT_ZIPFILE=$TARGET_DIR/artifact.zip
+if ! [ -d "$TARGET_DIR" ];then
+    echo "Creating 'lightynode' directory."
+    mkdir lightynode
+fi
+
+#clean lightynode install directory
+if [ -d "$INSTALL_DIR" ];then
+    echo "Removing $INSTALL_DIR directory"
+    rm -rf $INSTALL_DIR
+fi
+
+#download lightynode  and install it
+#complete source code can be found at https://gitlab.com/Orange-OpenSource/lfn/odl/lightynode-simulator.git
+echo "Installing lightynode device to $INSTALL_DIR directory "
+curl --retry-delay 10 --retry 3 -sS --fail --location --request GET $TARGET_URL -o $ARTIFACT_ZIPFILE || exit 2
+unzip -q -o $ARTIFACT_ZIPFILE -d $TARGET_DIR
+rm -f $ARTIFACT_ZIPFILE
+mv $TARGET_DIR/lighty-openroadm-device-$PLUGIN_VERSION $INSTALL_DIR
+
+#update 1.2.1 openroadm device configuration samples to be compliant with 1.2.1
+#device models ("multi-wavelegnth" instead of "multi-wavelength" whose typo has been solved with 2.2.1 device models)
+sed -i_ 's/multi-wavelength/multi-wavelegnth/g' $(dirname $0)/sample_configs/openroadm/1.2.1/oper-ROADM*.xml
diff --git a/tests/install_sims.sh b/tests/install_sims.sh
new file mode 100755 (executable)
index 0000000..69f8afd
--- /dev/null
@@ -0,0 +1,13 @@
+#!/bin/sh
+
+#set -x
+
+cd $(dirname $0)
+
+if [ "$USE_SIMS" = "honeynode" ];then
+    ./install_honeynode.sh $@
+else
+    ./install_lightynode.sh
+fi
+
+exit
index a2f3f1997ddd50e7c02b198161c05aa9f687ea12..497209341bde920a81119740c4f095cbc399facc 100755 (executable)
@@ -31,7 +31,19 @@ else
     done
 fi
 if [ -z "$LAUNCHER" ]; then
-    LAUNCHER="nosetests --with-xunit";
+    if [ `which pytest-3` ]; then
+            LAUNCHER="pytest-3"
+    else
+        if [ `which pytest` ]; then
+            LAUNCHER="pytest"
+        else
+            LAUNCHER="python3 -m pytest"
+        fi
+    fi
+    if [ -d "allure-report" ]; then
+        LAUNCHER="$LAUNCHER --alluredir=allure-report/"
+    fi
+    LAUNCHER="$LAUNCHER -q"
 fi
 
 for script in $scriptlist; do
diff --git a/tests/lightynode/.gitkeep b/tests/lightynode/.gitkeep
new file mode 100644 (file)
index 0000000..e69de29
index 5ebd5e2e7e5284c53e9b5ce37a494f002859846c..e1c86aa270e84cef7a588a0692c96022339b85ca 100644 (file)
@@ -1,2 +1,4 @@
+dict2xml>=1.6.0 # MIT License
+netconf_client>=2.0.0 # Apache License 2.0
 psutil>=5.6.7 # 3-clause / New BSD License
 requests!=2.12.2,>=2.10.0 # Apache License 2.0
diff --git a/tests/sample_configs/NW-for-test-5-4.json b/tests/sample_configs/NW-for-test-5-4.json
new file mode 100644 (file)
index 0000000..1a288a2
--- /dev/null
@@ -0,0 +1,14751 @@
+{
+    "ietf-network:network": [
+        {
+            "network-id": "openroadm-topology",
+            "ietf-network-topology:link": [
+                {
+                    "link-id": "OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-4-4XPDR-NW3-TX-toOpenROADM-4-4-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-4",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-4-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-4-SRG1-SRG1-PP3-TX-to-XPONDER-4-4XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-4-SRG1-SRG1-CP-TXtoOpenROADM-5-4-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-4-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-5-4-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-4-DEG2-DEG2-CTP-TXtoOpenROADM-5-4-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-SRG1-SRG1-PP3-TX-to-XPONDER-5-2XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-5-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-2XPDR-NW3-TX-toOpenROADM-5-2-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-4-DEG2-DEG2-CTP-TXtoOpenROADM-5-4-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-4-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-5-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-4-SRG1-SRG1-CP-TXtoOpenROADM-5-4-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-4-DEG1-to-OpenROADM-4-3-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-4-4-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-4-3-DEG1"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-3-DEG1-to-OpenROADM-4-4-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber4443",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-4-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "XPONDER-5-4XPDR-NW3-TX-toOpenROADM-5-4-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-4",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-5-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-4-SRG1-SRG1-PP3-TX-to-XPONDER-5-4XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "XPONDER-2-2XPDR-NW4-TX-toOpenROADM-2-2-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-2",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-2-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-SRG1-SRG1-PP4-TX-to-XPONDER-2-2XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-SRG1-SRG1-PP1-TX-to-XPONDER-3-2XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-3-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-2XPDR-NW1-TX-toOpenROADM-3-2-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-4-SRG1-SRG1-PP2-TX-to-XPONDER-3-4XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-4-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-3-4"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-4XPDR-NW2-TX-toOpenROADM-3-4-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-5-4XPDR-NW4-TX-toOpenROADM-5-4-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-4",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-5-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-4-SRG1-SRG1-PP4-TX-to-XPONDER-5-4XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "XPONDER-3-2XPDR-NW2-TX-toOpenROADM-3-2-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-2",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-3-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-SRG1-SRG1-PP2-TX-to-XPONDER-3-2XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-3-DEG2-DEG2-CTP-TXtoOpenROADM-2-3-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-3-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-2-3-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-3-DEG1-DEG1-CTP-TXtoOpenROADM-2-3-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG2-to-OpenROADM-4-4-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-4-4-DEG2"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-4-DEG2-to-OpenROADM-4-1-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber4144",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-4-3-DEG3-DEG3-CTP-TXtoOpenROADM-4-3-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-3-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-4-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-3-SRG1-SRG1-CP-TXtoOpenROADM-4-3-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG2-to-OpenROADM-4-3-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-4-3-DEG2"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-3-DEG2-to-OpenROADM-4-2-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber4243",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-1-2-SRG1-SRG1-PP2-TX-to-XPONDER-1-2XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-1-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-2XPDR-NW2-TX-toOpenROADM-1-2-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-3-SRG1-SRG1-CP-TXtoOpenROADM-3-3-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-3-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-3-3-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-3-DEG2-DEG2-CTP-TXtoOpenROADM-3-3-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG2-to-OpenROADM-1-4-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-1-4-DEG2"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-4-DEG2-to-OpenROADM-1-1-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber1114",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-2-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "XPONDER-1-2XPDR-NW4-TX-toOpenROADM-1-2-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-2",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-1-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-SRG1-SRG1-PP4-TX-to-XPONDER-1-2XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG3-to-OpenROADM-5-3-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-5-3-DEG3"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-3-DEG3-to-OpenROADM-1-2-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber1253",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-3-SRG1-SRG1-PP2-TX-to-XPONDER-1-3XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-3-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-1-3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-3XPDR-NW2-TX-toOpenROADM-1-3-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-3-DEG1-DEG1-CTP-TXtoOpenROADM-4-3-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-3-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-4-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-3-SRG1-SRG1-CP-TXtoOpenROADM-4-3-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-5-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-1-2XPDR-NW3-TX-toOpenROADM-1-2-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-2",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-1-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-SRG1-SRG1-PP3-TX-to-XPONDER-1-2XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-SRG1-SRG1-PP2-TX-to-XPONDER-2-2XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-2-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-2XPDR-NW2-TX-toOpenROADM-2-2-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-4-SRG1-SRG1-CP-TXtoOpenROADM-5-4-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-4-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-5-4-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-4-DEG3-DEG3-CTP-TXtoOpenROADM-5-4-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG3-to-OpenROADM-3-4-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-3-4-DEG3"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-4-DEG3-to-OpenROADM-4-1-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber4134",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-1-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-4-DEG1-DEG1-CTP-TXtoOpenROADM-4-4-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-4-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-4-4-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-4-DEG3-DEG3-CTP-TXtoOpenROADM-4-4-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-3-2XPDR-NW3-TX-toOpenROADM-3-2-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-2",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-3-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-SRG1-SRG1-PP3-TX-to-XPONDER-3-2XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-4-DEG2-DEG2-CTP-TXtoOpenROADM-1-4-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-4-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-1-4-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-4-DEG3-DEG3-CTP-TXtoOpenROADM-1-4-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-SRG1-SRG1-PP1-TX-to-XPONDER-4-1XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-4-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-1XPDR-NW1-TX-toOpenROADM-4-1-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-2-1XPDR-NW2-TX-toOpenROADM-2-1-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-1",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-2-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-SRG1-SRG1-PP2-TX-to-XPONDER-2-1XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-3-DEG2-DEG2-CTP-TXtoOpenROADM-4-3-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-3-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-4-3-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-3-DEG1-DEG1-CTP-TXtoOpenROADM-4-3-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-4-SRG1-SRG1-CP-TXtoOpenROADM-2-4-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-4-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-2-4-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-4-DEG3-DEG3-CTP-TXtoOpenROADM-2-4-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-SRG1-SRG1-PP3-TX-to-XPONDER-2-2XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-2-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-2XPDR-NW3-TX-toOpenROADM-2-2-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "XPONDER-3-4XPDR-NW2-TX-toOpenROADM-3-4-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-4",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-3-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-4-SRG1-SRG1-PP2-TX-to-XPONDER-3-4XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-4-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-SRG1-SRG1-PP1-TX-to-XPONDER-5-2XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-5-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-2XPDR-NW1-TX-toOpenROADM-5-2-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-DEG2-to-OpenROADM-5-3-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-5-3-DEG2"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-3-DEG2-to-OpenROADM-5-2-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber5253",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-5-4XPDR-NW1-TX-toOpenROADM-5-4-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-4",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-5-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-4-SRG1-SRG1-PP1-TX-to-XPONDER-5-4XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "XPONDER-4-4XPDR-NW2-TX-toOpenROADM-4-4-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-4",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-4-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-4-SRG1-SRG1-PP2-TX-to-XPONDER-4-4XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-4-DEG1-DEG1-CTP-TXtoOpenROADM-3-4-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-4-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-3-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-4-SRG1-SRG1-CP-TXtoOpenROADM-3-4-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-4-DEG3-to-OpenROADM-4-1-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-3-4-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG3"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG3-to-OpenROADM-3-4-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber3441",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-4-1-SRG1-SRG1-PP4-TX-to-XPONDER-4-1XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-4-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-1XPDR-NW4-TX-toOpenROADM-4-1-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-3-DEG1-DEG1-CTP-TXtoOpenROADM-5-3-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-3-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-5-3-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-3-DEG2-DEG2-CTP-TXtoOpenROADM-5-3-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG3-to-OpenROADM-1-4-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-1-4-DEG3"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-4-DEG3-to-OpenROADM-2-1-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber2114",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-2-1XPDR-NW3-TX-toOpenROADM-2-1-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-1",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-2-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-SRG1-SRG1-PP3-TX-to-XPONDER-2-1XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-4-DEG3-DEG3-CTP-TXtoOpenROADM-5-4-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-4-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-5-4-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-4-DEG1-DEG1-CTP-TXtoOpenROADM-5-4-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-2-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-3-DEG1-to-OpenROADM-2-4-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-2-3-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-2-4-DEG1"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-4-DEG1-to-OpenROADM-2-3-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber2324",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-3-3-SRG1-SRG1-PP3-TX-to-XPONDER-3-3XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-3-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-3-3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-3XPDR-NW3-TX-toOpenROADM-3-3-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "XPONDER-2-3XPDR-NW3-TX-toOpenROADM-2-3-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-3",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-2-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-3-SRG1-SRG1-PP3-TX-to-XPONDER-2-3XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-4-DEG1-DEG1-CTP-TXtoOpenROADM-5-4-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-4-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-5-4-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-4-DEG3-DEG3-CTP-TXtoOpenROADM-5-4-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "XPONDER-4-2XPDR-NW2-TX-toOpenROADM-4-2-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-2",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-4-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-SRG1-SRG1-PP2-TX-to-XPONDER-4-2XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-4-DEG3-to-OpenROADM-3-1-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-2-4-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG3"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG3-to-OpenROADM-2-4-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber2431",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-1-1XPDR-NW1-TX-toOpenROADM-1-1-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-1",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-1-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-SRG1-SRG1-PP1-TX-to-XPONDER-1-1XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-4-DEG2-to-OpenROADM-1-1-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-1-4-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG2"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG2-to-OpenROADM-1-4-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber1411",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-1-4-SRG1-SRG1-PP1-TX-to-XPONDER-1-4XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-4-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-1-4"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-4XPDR-NW1-TX-toOpenROADM-1-4-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-4-DEG3-DEG3-CTP-TXtoOpenROADM-2-4-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-4-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-2-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-4-SRG1-SRG1-CP-TXtoOpenROADM-2-4-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "XPONDER-1-3XPDR-NW2-TX-toOpenROADM-1-3-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-3",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-1-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-3-SRG1-SRG1-PP2-TX-to-XPONDER-1-3XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-4-DEG1-DEG1-CTP-TXtoOpenROADM-4-4-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-4-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-4-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-4-SRG1-SRG1-CP-TXtoOpenROADM-4-4-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-4-SRG1-SRG1-PP1-TX-to-XPONDER-2-4XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-4-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-2-4"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-4XPDR-NW1-TX-toOpenROADM-2-4-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-3-DEG3-DEG3-CTP-TXtoOpenROADM-5-3-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-3-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-5-3-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-3-DEG2-DEG2-CTP-TXtoOpenROADM-5-3-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-4-SRG1-SRG1-PP2-TX-to-XPONDER-5-4XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-4-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-5-4"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-4XPDR-NW2-TX-toOpenROADM-5-4-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-3-SRG1-SRG1-PP1-TX-to-XPONDER-2-3XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-3-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-2-3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-3XPDR-NW1-TX-toOpenROADM-2-3-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "XPONDER-1-3XPDR-NW4-TX-toOpenROADM-1-3-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-3",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-1-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-3-SRG1-SRG1-PP4-TX-to-XPONDER-1-3XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-3-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "XPONDER-5-1XPDR-NW4-TX-toOpenROADM-5-1-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-1",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-5-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-SRG1-SRG1-PP4-TX-to-XPONDER-5-1XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-4-SRG1-SRG1-CP-TXtoOpenROADM-2-4-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-4-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-2-4-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-4-DEG2-DEG2-CTP-TXtoOpenROADM-2-4-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-SRG1-SRG1-PP1-TX-to-XPONDER-2-2XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-2-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-2XPDR-NW1-TX-toOpenROADM-2-2-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-4-SRG1-SRG1-CP-TXtoOpenROADM-4-4-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-4-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-4-4-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-4-DEG2-DEG2-CTP-TXtoOpenROADM-4-4-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-4-DEG2-to-OpenROADM-3-1-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-3-4-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG2"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG2-to-OpenROADM-3-4-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber3431",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG3-to-OpenROADM-4-4-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-4-4-DEG3"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-4-DEG3-to-OpenROADM-5-1-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber5144",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-1-3-DEG1-DEG1-CTP-TXtoOpenROADM-1-3-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-3-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-1-3-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-3-DEG2-DEG2-CTP-TXtoOpenROADM-1-3-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-SRG1-SRG1-PP4-TX-to-XPONDER-1-2XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-1-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-2XPDR-NW4-TX-toOpenROADM-1-2-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-3-DEG2-DEG2-CTP-TXtoOpenROADM-5-3-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-3-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-5-3-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-3-DEG3-DEG3-CTP-TXtoOpenROADM-5-3-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-3-DEG3-to-OpenROADM-2-2-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-1-3-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG3"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG3-to-OpenROADM-1-3-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber1322",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-3-3-DEG3-DEG3-CTP-TXtoOpenROADM-3-3-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-3-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-3-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-3-SRG1-SRG1-CP-TXtoOpenROADM-3-3-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-4-DEG3-DEG3-CTP-TXtoOpenROADM-4-4-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-4-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-4-4-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-4-DEG2-DEG2-CTP-TXtoOpenROADM-4-4-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-3-DEG2-DEG2-CTP-TXtoOpenROADM-3-3-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-3-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-3-3-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-3-DEG1-DEG1-CTP-TXtoOpenROADM-3-3-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-5-2XPDR-NW3-TX-toOpenROADM-5-2-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-2",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-5-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-SRG1-SRG1-PP3-TX-to-XPONDER-5-2XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-3-DEG2-to-OpenROADM-1-2-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-1-3-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG2"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG2-to-OpenROADM-1-3-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber1312",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-1-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-3-DEG3-to-OpenROADM-1-2-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-5-3-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG3"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG3-to-OpenROADM-5-3-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber5312",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-5-1XPDR-NW3-TX-toOpenROADM-5-1-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-1",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-5-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-SRG1-SRG1-PP3-TX-to-XPONDER-5-1XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-3-DEG3-DEG3-CTP-TXtoOpenROADM-3-3-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-3-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-3-3-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-3-DEG2-DEG2-CTP-TXtoOpenROADM-3-3-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-3-DEG1-DEG1-CTP-TXtoOpenROADM-2-3-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-3-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-2-3-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-3-DEG3-DEG3-CTP-TXtoOpenROADM-2-3-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-4-DEG3-to-OpenROADM-5-1-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-4-4-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG3"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG3-to-OpenROADM-4-4-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber4451",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG1-to-OpenROADM-5-2-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG1"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG1-to-OpenROADM-5-1-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber5152",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-1-4-DEG2-DEG2-CTP-TXtoOpenROADM-1-4-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-4-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-1-4-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-4-DEG1-DEG1-CTP-TXtoOpenROADM-1-4-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-3-DEG3-DEG3-CTP-TXtoOpenROADM-1-3-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-3-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-1-3-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-3-DEG2-DEG2-CTP-TXtoOpenROADM-1-3-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-5-1XPDR-NW2-TX-toOpenROADM-5-1-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-1",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-5-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-SRG1-SRG1-PP2-TX-to-XPONDER-5-1XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-3-SRG1-SRG1-CP-TXtoOpenROADM-2-3-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-3-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-2-3-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-3-DEG2-DEG2-CTP-TXtoOpenROADM-2-3-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-3-SRG1-SRG1-CP-TXtoOpenROADM-1-3-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-3-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-1-3-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-3-DEG2-DEG2-CTP-TXtoOpenROADM-1-3-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-2-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-3-DEG2-to-OpenROADM-2-2-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-2-3-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG2"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG2-to-OpenROADM-2-3-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber2322",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-SRG1-SRG1-PP4-TX-to-XPONDER-3-1XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-3-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-1XPDR-NW4-TX-toOpenROADM-3-1-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "XPONDER-3-2XPDR-NW1-TX-toOpenROADM-3-2-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-2",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-3-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-SRG1-SRG1-PP1-TX-to-XPONDER-3-2XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-4-DEG3-DEG3-CTP-TXtoOpenROADM-3-4-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-4-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-3-4-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-4-DEG1-DEG1-CTP-TXtoOpenROADM-3-4-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-3-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-4-DEG3-DEG3-CTP-TXtoOpenROADM-4-4-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-4-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-4-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-4-SRG1-SRG1-CP-TXtoOpenROADM-4-4-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-4-SRG1-SRG1-CP-TXtoOpenROADM-4-4-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-4-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-4-4-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-4-DEG1-DEG1-CTP-TXtoOpenROADM-4-4-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-4-DEG2-DEG2-CTP-TXtoOpenROADM-3-4-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-4-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-3-4-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-4-DEG1-DEG1-CTP-TXtoOpenROADM-3-4-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-5-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "XPONDER-1-1XPDR-NW3-TX-toOpenROADM-1-1-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-1",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-1-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-SRG1-SRG1-PP3-TX-to-XPONDER-1-1XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-SRG1-SRG1-PP3-TX-to-XPONDER-4-2XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-4-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-2XPDR-NW3-TX-toOpenROADM-4-2-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-4-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-SRG1-SRG1-PP2-TX-to-XPONDER-5-2XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-5-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-2XPDR-NW2-TX-toOpenROADM-5-2-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-4-DEG1-DEG1-CTP-TXtoOpenROADM-2-4-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-4-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-2-4-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-4-DEG3-DEG3-CTP-TXtoOpenROADM-2-4-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-SRG1-SRG1-PP3-TX-to-XPONDER-2-1XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-2-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-1XPDR-NW3-TX-toOpenROADM-2-1-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-3-DEG1-DEG1-CTP-TXtoOpenROADM-1-3-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-3-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-1-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-3-SRG1-SRG1-CP-TXtoOpenROADM-1-3-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "XPONDER-5-2XPDR-NW4-TX-toOpenROADM-5-2-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-2",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-5-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-SRG1-SRG1-PP4-TX-to-XPONDER-5-2XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "XPONDER-2-4XPDR-NW1-TX-toOpenROADM-2-4-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-4",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-2-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-4-SRG1-SRG1-PP1-TX-to-XPONDER-2-4XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-4-DEG1-to-OpenROADM-1-3-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-1-4-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-1-3-DEG1"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-3-DEG1-to-OpenROADM-1-4-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber1413",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-3-4-SRG1-SRG1-PP1-TX-to-XPONDER-3-4XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-4-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-3-4"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-4XPDR-NW1-TX-toOpenROADM-3-4-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-4-DEG3-to-OpenROADM-2-1-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-1-4-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG3"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG3-to-OpenROADM-1-4-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber1421",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-3-SRG1-SRG1-PP3-TX-to-XPONDER-1-3XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-3-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-1-3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-3XPDR-NW3-TX-toOpenROADM-1-3-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-4-DEG3-DEG3-CTP-TXtoOpenROADM-3-4-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-4-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-3-4-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-4-DEG2-DEG2-CTP-TXtoOpenROADM-3-4-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-SRG1-SRG1-PP2-TX-to-XPONDER-4-2XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-4-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-2XPDR-NW2-TX-toOpenROADM-4-2-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-3-DEG2-to-OpenROADM-5-2-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-5-3-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG2"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG2-to-OpenROADM-5-3-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber5352",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-2-2XPDR-NW3-TX-toOpenROADM-2-2-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-2",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-2-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-SRG1-SRG1-PP3-TX-to-XPONDER-2-2XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-3-SRG1-SRG1-PP1-TX-to-XPONDER-1-3XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-3-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-1-3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-3XPDR-NW1-TX-toOpenROADM-1-3-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-3-DEG2-DEG2-CTP-TXtoOpenROADM-4-3-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-3-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-4-3-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-3-DEG3-DEG3-CTP-TXtoOpenROADM-4-3-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-4-4XPDR-NW1-TX-toOpenROADM-4-4-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-4",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-4-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-4-SRG1-SRG1-PP1-TX-to-XPONDER-4-4XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "XPONDER-1-2XPDR-NW1-TX-toOpenROADM-1-2-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-2",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-1-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-SRG1-SRG1-PP1-TX-to-XPONDER-1-2XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-4-DEG3-DEG3-CTP-TXtoOpenROADM-5-4-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-4-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-5-4-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-4-DEG2-DEG2-CTP-TXtoOpenROADM-5-4-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-4-DEG3-DEG3-CTP-TXtoOpenROADM-5-4-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-4-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-5-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-4-SRG1-SRG1-CP-TXtoOpenROADM-5-4-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-2-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-3-DEG2-DEG2-CTP-TXtoOpenROADM-5-3-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-3-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-5-3-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-3-DEG1-DEG1-CTP-TXtoOpenROADM-5-3-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-3-SRG1-SRG1-PP2-TX-to-XPONDER-2-3XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-3-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-2-3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-3XPDR-NW2-TX-toOpenROADM-2-3-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-3-SRG1-SRG1-PP3-TX-to-XPONDER-5-3XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-3-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-5-3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-3XPDR-NW3-TX-toOpenROADM-5-3-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "XPONDER-3-1XPDR-NW3-TX-toOpenROADM-3-1-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-1",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-3-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-SRG1-SRG1-PP3-TX-to-XPONDER-3-1XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-4-DEG1-to-OpenROADM-5-3-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-5-4-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-5-3-DEG1"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-3-DEG1-to-OpenROADM-5-4-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber5453",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-1-3-DEG3-DEG3-CTP-TXtoOpenROADM-1-3-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-3-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-1-3-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-3-DEG1-DEG1-CTP-TXtoOpenROADM-1-3-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-3-DEG2-DEG2-CTP-TXtoOpenROADM-1-3-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-3-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-1-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-3-SRG1-SRG1-CP-TXtoOpenROADM-1-3-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-4-DEG1-to-OpenROADM-3-3-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-3-4-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-3-3-DEG1"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-3-DEG1-to-OpenROADM-3-4-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber3433",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-1-2XPDR-NW2-TX-toOpenROADM-1-2-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-2",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-1-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-SRG1-SRG1-PP2-TX-to-XPONDER-1-2XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "XPONDER-3-1XPDR-NW1-TX-toOpenROADM-3-1-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-1",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-3-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-SRG1-SRG1-PP1-TX-to-XPONDER-3-1XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-1-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG2-to-OpenROADM-1-3-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-1-3-DEG2"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-3-DEG2-to-OpenROADM-1-2-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber1213",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-4-3-SRG1-SRG1-PP3-TX-to-XPONDER-4-3XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-3-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-4-3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-3XPDR-NW3-TX-toOpenROADM-4-3-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-4-DEG1-DEG1-CTP-TXtoOpenROADM-1-4-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-4-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-1-4-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-4-DEG3-DEG3-CTP-TXtoOpenROADM-1-4-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-4-SRG1-SRG1-PP2-TX-to-XPONDER-4-4XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-4-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-4-4"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-4XPDR-NW2-TX-toOpenROADM-4-4-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-3-SRG1-SRG1-PP4-TX-to-XPONDER-3-3XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-3-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-3-3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-3XPDR-NW4-TX-toOpenROADM-3-3-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-4-DEG2-DEG2-CTP-TXtoOpenROADM-3-4-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-4-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-3-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-4-SRG1-SRG1-CP-TXtoOpenROADM-3-4-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-3-DEG1-DEG1-CTP-TXtoOpenROADM-3-3-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-3-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-3-3-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-3-DEG3-DEG3-CTP-TXtoOpenROADM-3-3-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-SRG1-SRG1-PP4-TX-to-XPONDER-2-1XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-2-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-1XPDR-NW4-TX-toOpenROADM-2-1-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-4-DEG1-DEG1-CTP-TXtoOpenROADM-3-4-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-4-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-3-4-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-4-DEG3-DEG3-CTP-TXtoOpenROADM-3-4-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-2-1XPDR-NW1-TX-toOpenROADM-2-1-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-1",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-2-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-SRG1-SRG1-PP1-TX-to-XPONDER-2-1XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-SRG1-SRG1-PP1-TX-to-XPONDER-1-1XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-1-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-1XPDR-NW1-TX-toOpenROADM-1-1-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-4-DEG2-to-OpenROADM-2-1-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-2-4-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG2"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG2-to-OpenROADM-2-4-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber2421",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-3-2-DEG1-to-OpenROADM-3-1-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG1"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG1-to-OpenROADM-3-2-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber3231",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-4-1-SRG1-SRG1-PP3-TX-to-XPONDER-4-1XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-4-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-1XPDR-NW3-TX-toOpenROADM-4-1-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "XPONDER-4-2XPDR-NW3-TX-toOpenROADM-4-2-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-2",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-4-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-SRG1-SRG1-PP3-TX-to-XPONDER-4-2XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-4-DEG3-DEG3-CTP-TXtoOpenROADM-1-4-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-4-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-1-4-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-4-DEG2-DEG2-CTP-TXtoOpenROADM-1-4-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-4-SRG1-SRG1-PP4-TX-to-XPONDER-4-4XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-4-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-4-4"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-4XPDR-NW4-TX-toOpenROADM-4-4-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-4-SRG1-SRG1-PP3-TX-to-XPONDER-1-4XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-4-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-1-4"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-4XPDR-NW3-TX-toOpenROADM-1-4-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-4-DEG2-DEG2-CTP-TXtoOpenROADM-2-4-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-4-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-2-4-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-4-DEG3-DEG3-CTP-TXtoOpenROADM-2-4-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-5-3XPDR-NW3-TX-toOpenROADM-5-3-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-3",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-5-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-3-SRG1-SRG1-PP3-TX-to-XPONDER-5-3XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "XPONDER-5-3XPDR-NW1-TX-toOpenROADM-5-3-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-3",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-5-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-3-SRG1-SRG1-PP1-TX-to-XPONDER-5-3XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-4-DEG2-to-OpenROADM-5-1-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-5-4-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG2"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG2-to-OpenROADM-5-4-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber5451",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-3-3XPDR-NW1-TX-toOpenROADM-3-3-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-3",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-3-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-3-SRG1-SRG1-PP1-TX-to-XPONDER-3-3XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-4-DEG1-to-OpenROADM-2-3-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-2-4-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-2-3-DEG1"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-3-DEG1-to-OpenROADM-2-4-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber2423",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-1-4-DEG1-DEG1-CTP-TXtoOpenROADM-1-4-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-4-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-1-4-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-4-DEG2-DEG2-CTP-TXtoOpenROADM-1-4-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-3-SRG1-SRG1-CP-TXtoOpenROADM-3-3-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-3-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-3-3-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-3-DEG1-DEG1-CTP-TXtoOpenROADM-3-3-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG3-to-OpenROADM-1-3-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-1-3-DEG3"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-3-DEG3-to-OpenROADM-2-2-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber2213",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-3-3XPDR-NW4-TX-toOpenROADM-3-3-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-3",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-3-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-3-SRG1-SRG1-PP4-TX-to-XPONDER-3-3XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG1-to-OpenROADM-1-2-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG1"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG1-to-OpenROADM-1-1-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber1112",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-5-3-DEG3-DEG3-CTP-TXtoOpenROADM-5-3-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-3-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-5-3-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-3-DEG1-DEG1-CTP-TXtoOpenROADM-5-3-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-SRG1-SRG1-PP3-TX-to-XPONDER-1-1XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-1-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-1XPDR-NW3-TX-toOpenROADM-1-1-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-3-DEG1-DEG1-CTP-TXtoOpenROADM-2-3-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-3-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-2-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-3-SRG1-SRG1-CP-TXtoOpenROADM-2-3-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-4-DEG2-DEG2-CTP-TXtoOpenROADM-3-4-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-4-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-3-4-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-4-DEG3-DEG3-CTP-TXtoOpenROADM-3-4-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-3-DEG1-to-OpenROADM-1-4-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-1-3-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-1-4-DEG1"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-4-DEG1-to-OpenROADM-1-3-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber1314",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-4-3XPDR-NW4-TX-toOpenROADM-4-3-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-3",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-4-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-3-SRG1-SRG1-PP4-TX-to-XPONDER-4-3XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-3-SRG1-SRG1-CP-TXtoOpenROADM-4-3-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-3-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-4-3-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-3-DEG2-DEG2-CTP-TXtoOpenROADM-4-3-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-4-SRG1-SRG1-CP-TXtoOpenROADM-4-4-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-4-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-4-4-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-4-DEG3-DEG3-CTP-TXtoOpenROADM-4-4-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-SRG1-SRG1-PP4-TX-to-XPONDER-1-1XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-1-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-1XPDR-NW4-TX-toOpenROADM-1-1-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG2-to-OpenROADM-5-4-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-5-4-DEG2"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-4-DEG2-to-OpenROADM-5-1-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber5154",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-4-2XPDR-NW4-TX-toOpenROADM-4-2-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-2",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-4-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-SRG1-SRG1-PP4-TX-to-XPONDER-4-2XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "XPONDER-2-2XPDR-NW2-TX-toOpenROADM-2-2-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-2",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-2-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-SRG1-SRG1-PP2-TX-to-XPONDER-2-2XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-3-SRG1-SRG1-CP-TXtoOpenROADM-3-3-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-3-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-3-3-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-3-DEG3-DEG3-CTP-TXtoOpenROADM-3-3-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "XPONDER-2-4XPDR-NW4-TX-toOpenROADM-2-4-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-4",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-2-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-4-SRG1-SRG1-PP4-TX-to-XPONDER-2-4XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-4-DEG2-DEG2-CTP-TXtoOpenROADM-5-4-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-4-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-5-4-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-4-DEG1-DEG1-CTP-TXtoOpenROADM-5-4-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-4-SRG1-SRG1-CP-TXtoOpenROADM-1-4-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-4-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-1-4-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-4-DEG3-DEG3-CTP-TXtoOpenROADM-1-4-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "XPONDER-2-3XPDR-NW2-TX-toOpenROADM-2-3-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-3",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-2-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-3-SRG1-SRG1-PP2-TX-to-XPONDER-2-3XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "XPONDER-3-2XPDR-NW4-TX-toOpenROADM-3-2-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-2",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-3-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-SRG1-SRG1-PP4-TX-to-XPONDER-3-2XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-3-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG1-to-OpenROADM-1-1-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG1"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG1-to-OpenROADM-1-2-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber1211",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-3-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG3-to-OpenROADM-3-3-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-3-3-DEG3"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-3-DEG3-to-OpenROADM-4-2-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber4233",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-4-3-SRG1-SRG1-CP-TXtoOpenROADM-4-3-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-3-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-4-3-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-3-DEG1-DEG1-CTP-TXtoOpenROADM-4-3-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-3-DEG2-DEG2-CTP-TXtoOpenROADM-2-3-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-3-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-2-3-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-3-DEG3-DEG3-CTP-TXtoOpenROADM-2-3-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-4-1XPDR-NW2-TX-toOpenROADM-4-1-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-1",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-4-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-SRG1-SRG1-PP2-TX-to-XPONDER-4-1XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-4-DEG2-DEG2-CTP-TXtoOpenROADM-4-4-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-4-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-4-4-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-4-DEG1-DEG1-CTP-TXtoOpenROADM-4-4-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-3-DEG3-DEG3-CTP-TXtoOpenROADM-4-3-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-3-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-4-3-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-3-DEG1-DEG1-CTP-TXtoOpenROADM-4-3-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-3-DEG3-to-OpenROADM-3-2-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-2-3-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG3"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG3-to-OpenROADM-2-3-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber2332",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-3-SRG1-SRG1-CP-TXtoOpenROADM-2-3-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-3-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-2-3-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-3-DEG3-DEG3-CTP-TXtoOpenROADM-2-3-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-3-DEG1-DEG1-CTP-TXtoOpenROADM-4-3-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-3-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-4-3-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-3-DEG2-DEG2-CTP-TXtoOpenROADM-4-3-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-SRG1-SRG1-PP1-TX-to-XPONDER-3-1XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-3-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-1XPDR-NW1-TX-toOpenROADM-3-1-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-3-SRG1-SRG1-CP-TXtoOpenROADM-2-3-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-3-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-2-3-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-3-DEG1-DEG1-CTP-TXtoOpenROADM-2-3-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-3-SRG1-SRG1-CP-TXtoOpenROADM-5-3-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-3-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-5-3-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-3-DEG3-DEG3-CTP-TXtoOpenROADM-5-3-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-SRG1-SRG1-PP2-TX-to-XPONDER-2-1XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-2-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-1XPDR-NW2-TX-toOpenROADM-2-1-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "XPONDER-3-4XPDR-NW1-TX-toOpenROADM-3-4-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-4",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-3-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-4-SRG1-SRG1-PP1-TX-to-XPONDER-3-4XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "XPONDER-1-4XPDR-NW3-TX-toOpenROADM-1-4-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-4",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-1-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-4-SRG1-SRG1-PP3-TX-to-XPONDER-1-4XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "XPONDER-3-1XPDR-NW2-TX-toOpenROADM-3-1-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-1",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-3-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-SRG1-SRG1-PP2-TX-to-XPONDER-3-1XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "XPONDER-1-3XPDR-NW1-TX-toOpenROADM-1-3-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-3",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-1-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-3-SRG1-SRG1-PP1-TX-to-XPONDER-1-3XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-3-DEG2-DEG2-CTP-TXtoOpenROADM-1-3-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-3-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-1-3-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-3-DEG1-DEG1-CTP-TXtoOpenROADM-1-3-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG1-to-OpenROADM-2-1-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG1"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG1-to-OpenROADM-2-2-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber2221",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-1-1XPDR-NW4-TX-toOpenROADM-1-1-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-1",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-1-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-SRG1-SRG1-PP4-TX-to-XPONDER-1-1XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-4-SRG1-SRG1-PP1-TX-to-XPONDER-4-4XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-4-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-4-4"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-4XPDR-NW1-TX-toOpenROADM-4-4-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-3-SRG1-SRG1-CP-TXtoOpenROADM-1-3-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-3-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-1-3-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-3-DEG3-DEG3-CTP-TXtoOpenROADM-1-3-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-4-SRG1-SRG1-PP3-TX-to-XPONDER-2-4XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-4-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-2-4"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-4XPDR-NW3-TX-toOpenROADM-2-4-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-SRG1-SRG1-PP2-TX-to-XPONDER-4-1XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-4-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-1XPDR-NW2-TX-toOpenROADM-4-1-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-4-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-3-SRG1-SRG1-CP-TXtoOpenROADM-1-3-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-3-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-1-3-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-3-DEG1-DEG1-CTP-TXtoOpenROADM-1-3-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-3-DEG1-DEG1-CTP-TXtoOpenROADM-1-3-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-3-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-1-3-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-3-DEG3-DEG3-CTP-TXtoOpenROADM-1-3-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-3-DEG1-DEG1-CTP-TXtoOpenROADM-3-3-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-3-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-3-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-3-SRG1-SRG1-CP-TXtoOpenROADM-3-3-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-3-SRG1-SRG1-PP1-TX-to-XPONDER-5-3XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-3-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-5-3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-3XPDR-NW1-TX-toOpenROADM-5-3-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-3-SRG1-SRG1-PP2-TX-to-XPONDER-4-3XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-3-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-4-3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-3XPDR-NW2-TX-toOpenROADM-4-3-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-4-SRG1-SRG1-CP-TXtoOpenROADM-1-4-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-4-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-1-4-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-4-DEG1-DEG1-CTP-TXtoOpenROADM-1-4-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-4-DEG3-DEG3-CTP-TXtoOpenROADM-1-4-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-4-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-1-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-4-SRG1-SRG1-CP-TXtoOpenROADM-1-4-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-5-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-3-DEG1-to-OpenROADM-4-4-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-4-3-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-4-4-DEG1"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-4-DEG1-to-OpenROADM-4-3-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber4344",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-2-1XPDR-NW4-TX-toOpenROADM-2-1-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-1",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-2-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-SRG1-SRG1-PP4-TX-to-XPONDER-2-1XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-4-SRG1-SRG1-PP1-TX-to-XPONDER-5-4XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-4-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-5-4"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-4XPDR-NW1-TX-toOpenROADM-5-4-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-4-SRG1-SRG1-CP-TXtoOpenROADM-5-4-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-4-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-5-4-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-4-DEG1-DEG1-CTP-TXtoOpenROADM-5-4-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-4-DEG2-DEG2-CTP-TXtoOpenROADM-2-4-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-4-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-2-4-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-4-DEG1-DEG1-CTP-TXtoOpenROADM-2-4-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "XPONDER-3-3XPDR-NW3-TX-toOpenROADM-3-3-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-3",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-3-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-3-SRG1-SRG1-PP3-TX-to-XPONDER-3-3XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-3-DEG3-to-OpenROADM-4-2-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-3-3-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG3"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG3-to-OpenROADM-3-3-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber3342",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-5-4-SRG1-SRG1-PP3-TX-to-XPONDER-5-4XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-4-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-5-4"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-4XPDR-NW3-TX-toOpenROADM-5-4-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-4-DEG3-to-OpenROADM-1-1-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-5-4-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG3"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG3-to-OpenROADM-5-4-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber5411",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-3-3-SRG1-SRG1-PP1-TX-to-XPONDER-3-3XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-3-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-3-3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-3XPDR-NW1-TX-toOpenROADM-3-3-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG2-to-OpenROADM-3-4-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-3-4-DEG2"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-4-DEG2-to-OpenROADM-3-1-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber3431",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-4-3-SRG1-SRG1-CP-TXtoOpenROADM-4-3-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-3-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-4-3-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-3-DEG3-DEG3-CTP-TXtoOpenROADM-4-3-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-3-SRG1-SRG1-PP4-TX-to-XPONDER-5-3XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-3-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-5-3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-3XPDR-NW4-TX-toOpenROADM-5-3-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-4-SRG1-SRG1-PP4-TX-to-XPONDER-5-4XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-4-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-5-4"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-4XPDR-NW4-TX-toOpenROADM-5-4-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-DEG3-to-OpenROADM-4-3-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-4-3-DEG3"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-3-DEG3-to-OpenROADM-5-2-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber5243",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-4-2XPDR-NW1-TX-toOpenROADM-4-2-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-2",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-4-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-SRG1-SRG1-PP1-TX-to-XPONDER-4-2XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG1-to-OpenROADM-4-1-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG1"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG1-to-OpenROADM-4-2-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber4241",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-1-3XPDR-NW3-TX-toOpenROADM-1-3-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-3",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-1-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-3-SRG1-SRG1-PP3-TX-to-XPONDER-1-3XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "XPONDER-4-1XPDR-NW3-TX-toOpenROADM-4-1-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-1",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-4-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-SRG1-SRG1-PP3-TX-to-XPONDER-4-1XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "XPONDER-1-4XPDR-NW4-TX-toOpenROADM-1-4-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-4",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-1-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-4-SRG1-SRG1-PP4-TX-to-XPONDER-1-4XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-1-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-4-DEG1-DEG1-CTP-TXtoOpenROADM-5-4-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-4-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-5-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-4-SRG1-SRG1-CP-TXtoOpenROADM-5-4-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-4-SRG1-SRG1-CP-TXtoOpenROADM-3-4-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-4-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-3-4-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-4-DEG3-DEG3-CTP-TXtoOpenROADM-3-4-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-3-DEG1-DEG1-CTP-TXtoOpenROADM-5-3-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-3-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-5-3-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-3-DEG3-DEG3-CTP-TXtoOpenROADM-5-3-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-5-2XPDR-NW1-TX-toOpenROADM-5-2-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-2",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-5-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-SRG1-SRG1-PP1-TX-to-XPONDER-5-2XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "XPONDER-5-3XPDR-NW4-TX-toOpenROADM-5-3-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-3",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-5-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-3-SRG1-SRG1-PP4-TX-to-XPONDER-5-3XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-3-DEG3-DEG3-CTP-TXtoOpenROADM-5-3-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-3-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-5-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-3-SRG1-SRG1-CP-TXtoOpenROADM-5-3-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-SRG1-SRG1-PP2-TX-to-XPONDER-3-1XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-3-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-1XPDR-NW2-TX-toOpenROADM-3-1-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-3-DEG3-DEG3-CTP-TXtoOpenROADM-1-3-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-3-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-1-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-3-SRG1-SRG1-CP-TXtoOpenROADM-1-3-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-5-3XPDR-NW2-TX-toOpenROADM-5-3-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-3",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-5-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-3-SRG1-SRG1-PP2-TX-to-XPONDER-5-3XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-4-SRG1-SRG1-PP3-TX-to-XPONDER-3-4XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-4-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-3-4"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-4XPDR-NW3-TX-toOpenROADM-3-4-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-SRG1-SRG1-PP4-TX-to-XPONDER-5-2XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-5-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-2XPDR-NW4-TX-toOpenROADM-5-2-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG2-to-OpenROADM-2-3-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-2-3-DEG2"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-3-DEG2-to-OpenROADM-2-2-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber2223",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-3-3-DEG2-DEG2-CTP-TXtoOpenROADM-3-3-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-3-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-3-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-3-SRG1-SRG1-CP-TXtoOpenROADM-3-3-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-SRG1-SRG1-PP4-TX-to-XPONDER-5-1XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-5-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-1XPDR-NW4-TX-toOpenROADM-5-1-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-SRG1-SRG1-PP3-TX-to-XPONDER-5-1XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-5-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-1XPDR-NW3-TX-toOpenROADM-5-1-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "XPONDER-2-3XPDR-NW1-TX-toOpenROADM-2-3-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-3",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-2-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-3-SRG1-SRG1-PP1-TX-to-XPONDER-2-3XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-3-SRG1-SRG1-PP1-TX-to-XPONDER-4-3XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-3-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-4-3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-3XPDR-NW1-TX-toOpenROADM-4-3-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-4-DEG3-DEG3-CTP-TXtoOpenROADM-2-4-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-4-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-2-4-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-4-DEG2-DEG2-CTP-TXtoOpenROADM-2-4-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-4-DEG3-DEG3-CTP-TXtoOpenROADM-2-4-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-4-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-2-4-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-4-DEG1-DEG1-CTP-TXtoOpenROADM-2-4-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-SRG1-SRG1-PP3-TX-to-XPONDER-3-1XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-3-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-1XPDR-NW3-TX-toOpenROADM-3-1-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "XPONDER-4-1XPDR-NW4-TX-toOpenROADM-4-1-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-1",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-4-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-SRG1-SRG1-PP4-TX-to-XPONDER-4-1XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-3-DEG1-DEG1-CTP-TXtoOpenROADM-5-3-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-3-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-5-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-3-SRG1-SRG1-CP-TXtoOpenROADM-5-3-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-3-SRG1-SRG1-PP2-TX-to-XPONDER-3-3XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-3-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-3-3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-3XPDR-NW2-TX-toOpenROADM-3-3-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-3-DEG2-DEG2-CTP-TXtoOpenROADM-4-3-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-3-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-4-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-3-SRG1-SRG1-CP-TXtoOpenROADM-4-3-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-4-SRG1-SRG1-CP-TXtoOpenROADM-3-4-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-4-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-3-4-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-4-DEG2-DEG2-CTP-TXtoOpenROADM-3-4-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-3-DEG2-DEG2-CTP-TXtoOpenROADM-1-3-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-3-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-1-3-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-3-DEG3-DEG3-CTP-TXtoOpenROADM-1-3-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-3-SRG1-SRG1-PP4-TX-to-XPONDER-2-3XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-3-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-2-3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-3XPDR-NW4-TX-toOpenROADM-2-3-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-3-DEG3-DEG3-CTP-TXtoOpenROADM-2-3-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-3-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-2-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-3-SRG1-SRG1-CP-TXtoOpenROADM-2-3-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-SRG1-SRG1-PP1-TX-to-XPONDER-1-2XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-1-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-2XPDR-NW1-TX-toOpenROADM-1-2-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-DEG1-to-OpenROADM-5-1-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG1"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG1-to-OpenROADM-5-2-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber5251",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-4-DEG2-DEG2-CTP-TXtoOpenROADM-2-4-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-4-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-2-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-4-SRG1-SRG1-CP-TXtoOpenROADM-2-4-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG1-to-OpenROADM-2-2-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG1"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG1-to-OpenROADM-2-1-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber2122",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-5-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-3-DEG3-DEG3-CTP-TXtoOpenROADM-4-3-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-3-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-4-3-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-3-DEG2-DEG2-CTP-TXtoOpenROADM-4-3-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-SRG1-SRG1-PP1-TX-to-XPONDER-2-1XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-2-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-1XPDR-NW1-TX-toOpenROADM-2-1-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-4-DEG1-DEG1-CTP-TXtoOpenROADM-2-4-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-4-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-2-4-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-4-DEG2-DEG2-CTP-TXtoOpenROADM-2-4-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-3-DEG2-DEG2-CTP-TXtoOpenROADM-3-3-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-3-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-3-3-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-3-DEG3-DEG3-CTP-TXtoOpenROADM-3-3-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-2-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG1-to-OpenROADM-4-2-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG1"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG1-to-OpenROADM-4-1-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber4142",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-1-2-SRG1-SRG1-PP3-TX-to-XPONDER-1-2XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-1-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-2XPDR-NW3-TX-toOpenROADM-1-2-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-3-SRG1-SRG1-CP-TXtoOpenROADM-5-3-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-3-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-5-3-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-3-DEG1-DEG1-CTP-TXtoOpenROADM-5-3-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-4-SRG1-SRG1-CP-TXtoOpenROADM-1-4-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-4-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-1-4-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-4-DEG2-DEG2-CTP-TXtoOpenROADM-1-4-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-3-DEG2-DEG2-CTP-TXtoOpenROADM-5-3-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-3-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-5-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-3-SRG1-SRG1-CP-TXtoOpenROADM-5-3-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-3-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-3-DEG3-DEG3-CTP-TXtoOpenROADM-2-3-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-3-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-2-3-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-3-DEG2-DEG2-CTP-TXtoOpenROADM-2-3-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG3-to-OpenROADM-5-4-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-5-4-DEG3"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-4-DEG3-to-OpenROADM-1-1-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber1154",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-2-3-DEG2-DEG2-CTP-TXtoOpenROADM-2-3-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-3-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-2-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-3-SRG1-SRG1-CP-TXtoOpenROADM-2-3-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-3-DEG1-to-OpenROADM-3-4-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-3-3-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-3-4-DEG1"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-4-DEG1-to-OpenROADM-3-3-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber3334",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-3-3-DEG2-to-OpenROADM-3-2-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-3-3-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG2"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG2-to-OpenROADM-3-3-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber3332",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-5-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-2-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "XPONDER-2-4XPDR-NW3-TX-toOpenROADM-2-4-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-4",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-2-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-4-SRG1-SRG1-PP3-TX-to-XPONDER-2-4XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-4-DEG2-DEG2-CTP-TXtoOpenROADM-4-4-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-4-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-4-4-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-4-DEG3-DEG3-CTP-TXtoOpenROADM-4-4-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-4-SRG1-SRG1-PP2-TX-to-XPONDER-1-4XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-4-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-1-4"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-4XPDR-NW2-TX-toOpenROADM-1-4-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "XPONDER-4-3XPDR-NW1-TX-toOpenROADM-4-3-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-3",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-4-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-3-SRG1-SRG1-PP1-TX-to-XPONDER-4-3XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-4-DEG1-DEG1-CTP-TXtoOpenROADM-4-4-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-4-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-4-4-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-4-DEG2-DEG2-CTP-TXtoOpenROADM-4-4-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-4-SRG1-SRG1-PP4-TX-to-XPONDER-2-4XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-4-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-2-4"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-4XPDR-NW4-TX-toOpenROADM-2-4-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-4-SRG1-SRG1-CP-TXtoOpenROADM-3-4-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-4-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-3-4-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-4-DEG1-DEG1-CTP-TXtoOpenROADM-3-4-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-4-DEG1-DEG1-CTP-TXtoOpenROADM-2-4-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-4-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-2-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-4-SRG1-SRG1-CP-TXtoOpenROADM-2-4-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG2-to-OpenROADM-2-4-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-2-4-DEG2"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-4-DEG2-to-OpenROADM-2-1-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber2124",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-2-4XPDR-NW2-TX-toOpenROADM-2-4-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-4",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-2-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-4-SRG1-SRG1-PP2-TX-to-XPONDER-2-4XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "XPONDER-4-3XPDR-NW3-TX-toOpenROADM-4-3-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-3",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-4-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-3-SRG1-SRG1-PP3-TX-to-XPONDER-4-3XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-4-SRG1-SRG1-CP-TXtoOpenROADM-2-4-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-4-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-2-4-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-4-DEG1-DEG1-CTP-TXtoOpenROADM-2-4-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-3-SRG1-SRG1-PP2-TX-to-XPONDER-5-3XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-3-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-5-3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-3XPDR-NW2-TX-toOpenROADM-5-3-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-5-2XPDR-NW2-TX-toOpenROADM-5-2-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-2",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-5-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-SRG1-SRG1-PP2-TX-to-XPONDER-5-2XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-DEG3-to-OpenROADM-2-3-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-2-3-DEG3"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-3-DEG3-to-OpenROADM-3-2-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber3223",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-3-4-DEG1-DEG1-CTP-TXtoOpenROADM-3-4-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-4-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-3-4-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-4-DEG2-DEG2-CTP-TXtoOpenROADM-3-4-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-1-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-4-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "XPONDER-4-1XPDR-NW1-TX-toOpenROADM-4-1-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-1",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-4-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-SRG1-SRG1-PP1-TX-to-XPONDER-4-1XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-SRG1-SRG1-PP2-TX-to-XPONDER-5-1XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-5-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-1XPDR-NW2-TX-toOpenROADM-5-1-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "XPONDER-1-1XPDR-NW2-TX-toOpenROADM-1-1-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-1",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-1-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-SRG1-SRG1-PP2-TX-to-XPONDER-1-1XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-4-DEG3-DEG3-CTP-TXtoOpenROADM-3-4-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-4-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-3-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-4-SRG1-SRG1-CP-TXtoOpenROADM-3-4-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-SRG1-SRG1-PP4-TX-to-XPONDER-3-2XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-3-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-2XPDR-NW4-TX-toOpenROADM-3-2-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG1-to-OpenROADM-3-2-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG1"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG1-to-OpenROADM-3-1-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber3132",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-4-4XPDR-NW4-TX-toOpenROADM-4-4-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-4",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-4-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-4-SRG1-SRG1-PP4-TX-to-XPONDER-4-4XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-5-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "XPONDER-4-3XPDR-NW2-TX-toOpenROADM-4-3-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-3",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-4-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-3-SRG1-SRG1-PP2-TX-to-XPONDER-4-3XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-SRG1-SRG1-PP2-TX-to-XPONDER-3-2XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-3-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-2XPDR-NW2-TX-toOpenROADM-3-2-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-4-SRG1-SRG1-PP2-TX-to-XPONDER-2-4XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-4-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-2-4"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-4XPDR-NW2-TX-toOpenROADM-2-4-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-3-DEG3-to-OpenROADM-5-2-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-4-3-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG3"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG3-to-OpenROADM-4-3-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber4352",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "XPONDER-3-3XPDR-NW2-TX-toOpenROADM-3-3-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-3",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-3-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-3-SRG1-SRG1-PP2-TX-to-XPONDER-3-3XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "XPONDER-1-4XPDR-NW2-TX-toOpenROADM-1-4-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-4",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-1-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-4-SRG1-SRG1-PP2-TX-to-XPONDER-1-4XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-4-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-3-DEG2-to-OpenROADM-4-2-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-4-3-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG2"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG2-to-OpenROADM-4-3-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber4342",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG3-to-OpenROADM-2-4-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-2-4-DEG3"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-4-DEG3-to-OpenROADM-3-1-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber3124",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "XPONDER-5-1XPDR-NW1-TX-toOpenROADM-5-1-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-1",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-5-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-SRG1-SRG1-PP1-TX-to-XPONDER-5-1XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-4-DEG3-DEG3-CTP-TXtoOpenROADM-4-4-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-4-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-4-4-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-4-DEG1-DEG1-CTP-TXtoOpenROADM-4-4-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-3-DEG3-DEG3-CTP-TXtoOpenROADM-3-3-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-3-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-3-3-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-3-DEG1-DEG1-CTP-TXtoOpenROADM-3-3-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-4-DEG2-DEG2-CTP-TXtoOpenROADM-1-4-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-4-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-1-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-4-SRG1-SRG1-CP-TXtoOpenROADM-1-4-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-4-DEG1-DEG1-CTP-TXtoOpenROADM-5-4-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-4-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-5-4-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-4-DEG2-DEG2-CTP-TXtoOpenROADM-5-4-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-4-DEG1-DEG1-CTP-TXtoOpenROADM-1-4-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-4-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-1-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-4-SRG1-SRG1-CP-TXtoOpenROADM-1-4-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-3-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "XPONDER-3-4XPDR-NW4-TX-toOpenROADM-3-4-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-4",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-3-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-4-SRG1-SRG1-PP4-TX-to-XPONDER-3-4XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "XPONDER-1-4XPDR-NW1-TX-toOpenROADM-1-4-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-4",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-1-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-4-SRG1-SRG1-PP1-TX-to-XPONDER-1-4XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-4-DEG2-DEG2-CTP-TXtoOpenROADM-5-4-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-4-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-5-4-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-4-DEG3-DEG3-CTP-TXtoOpenROADM-5-4-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-3-SRG1-SRG1-PP4-TX-to-XPONDER-4-3XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-3-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-4-3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-3XPDR-NW4-TX-toOpenROADM-4-3-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-3-SRG1-SRG1-CP-TXtoOpenROADM-5-3-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-3-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-5-3-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-3-DEG2-DEG2-CTP-TXtoOpenROADM-5-3-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-SRG1-SRG1-PP2-TX-to-XPONDER-1-1XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-1-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-1XPDR-NW2-TX-toOpenROADM-1-1-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-SRG1-SRG1-PP1-TX-to-XPONDER-5-1XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-5-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-1XPDR-NW1-TX-toOpenROADM-5-1-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-4-DEG3-DEG3-CTP-TXtoOpenROADM-1-4-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-4-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-1-4-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-4-DEG1-DEG1-CTP-TXtoOpenROADM-1-4-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-4-DEG2-to-OpenROADM-4-1-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-4-4-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG2"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG2-to-OpenROADM-4-4-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber4441",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-5-3-DEG1-to-OpenROADM-5-4-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-5-3-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-5-4-DEG1"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-4-DEG1-to-OpenROADM-5-3-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber5354",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-2-2-SRG1-SRG1-PP4-TX-to-XPONDER-2-2XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-2-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-2XPDR-NW4-TX-toOpenROADM-2-2-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-4-DEG2-DEG2-CTP-TXtoOpenROADM-4-4-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-4-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-4-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-4-SRG1-SRG1-CP-TXtoOpenROADM-4-4-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "XPONDER-2-3XPDR-NW4-TX-toOpenROADM-2-3-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-3",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-2-3-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-3-SRG1-SRG1-PP4-TX-to-XPONDER-2-3XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-4-SRG1-SRG1-PP4-TX-to-XPONDER-3-4XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-4-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-3-4"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-4XPDR-NW4-TX-toOpenROADM-3-4-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-DEG2-to-OpenROADM-3-3-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-3-3-DEG2"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-3-DEG2-to-OpenROADM-3-2-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber3233",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-3-2-SRG1-SRG1-PP3-TX-to-XPONDER-3-2XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-3-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-2XPDR-NW3-TX-toOpenROADM-3-2-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-3-SRG1-SRG1-PP3-TX-to-XPONDER-2-3XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-3-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-2-3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-3XPDR-NW3-TX-toOpenROADM-2-3-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-1-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "XPONDER-3-4XPDR-NW3-TX-toOpenROADM-3-4-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-4",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-3-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-4-SRG1-SRG1-PP3-TX-to-XPONDER-3-4XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-4-SRG1-SRG1-PP4-TX-to-XPONDER-1-4XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-4-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-1-4"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-4XPDR-NW4-TX-toOpenROADM-1-4-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-SRG1-SRG1-PP1-TX-to-XPONDER-4-2XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-4-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-2XPDR-NW1-TX-toOpenROADM-4-2-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-3-DEG3-DEG3-CTP-TXtoOpenROADM-2-3-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-3-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-2-3-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-3-DEG1-DEG1-CTP-TXtoOpenROADM-2-3-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-4-SRG1-SRG1-PP3-TX-to-XPONDER-4-4XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-4-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-4-4"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-4XPDR-NW3-TX-toOpenROADM-4-4-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-3-SRG1-SRG1-PP4-TX-to-XPONDER-1-3XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-3-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-1-3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-3XPDR-NW4-TX-toOpenROADM-1-3-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-3-DEG1-DEG1-CTP-TXtoOpenROADM-4-3-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-3-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-4-3-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-3-DEG3-DEG3-CTP-TXtoOpenROADM-4-3-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-3-DEG1-DEG1-CTP-TXtoOpenROADM-2-3-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-3-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-2-3-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-3-DEG2-DEG2-CTP-TXtoOpenROADM-2-3-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-3-DEG1-DEG1-CTP-TXtoOpenROADM-3-3-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-3-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-3-3-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-3-DEG2-DEG2-CTP-TXtoOpenROADM-3-3-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-SRG1-SRG1-PP4-TX-to-XPONDER-4-2XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-4-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-2XPDR-NW4-TX-toOpenROADM-4-2-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "XPONDER-5-4XPDR-NW2-TX-toOpenROADM-5-4-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-4",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-5-4-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-4-SRG1-SRG1-PP2-TX-to-XPONDER-5-4XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "XPONDER-3-1XPDR-NW4-TX-toOpenROADM-3-1-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-1",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-3-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-SRG1-SRG1-PP4-TX-to-XPONDER-3-1XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-2-2XPDR-NW1-TX-toOpenROADM-2-2-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-2",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-2-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-SRG1-SRG1-PP1-TX-to-XPONDER-2-2XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                }
+            ],
+            "node": [
+                {
+                    "node-id": "XPONDER-3-1",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-3-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE3"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-3-2",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-3-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE3"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-3-3",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-3-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE3"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-3-4",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-3-4"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE3"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-1-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli21"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-1-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli41"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-4-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli44"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-4"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-4-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-4"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli34"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-4-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-4"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli34"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-4-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli44"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-4"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-4-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-4"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli34"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-4-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli44"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-4"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-2-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli22"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-2-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli32"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-3-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli33"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-3"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-3-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli43"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-1-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli11"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-4-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli14"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-4"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-3-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli23"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-2-2",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-2-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-2-3",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE2"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-2-3"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-2-4",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE2"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-2-4"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-2-1",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE2"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-2-1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-5-2-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli52"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-5-2-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli52"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-5-2-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli52"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-5-4-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli54"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-4"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-3-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli23"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-3-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli23"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-5-1-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli51"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-5-1-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli51"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-1-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli41"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-5-1-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli51"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-1-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli41"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-5-1-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli51"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-1-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli31"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-2-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli12"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-2-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli12"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-2-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli22"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-2-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli12"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-2-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli22"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-2-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli32"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-2-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli32"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-2-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli22"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-2-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli32"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-1-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli21"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-1-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli11"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-1-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli21"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-1-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli11"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-1-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli31"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-1-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli11"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-1-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli21"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-1-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli31"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-1-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli41"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-5-3",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-5-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE5"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-5-4",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-5-4"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE5"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-3-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli13"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-3-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli13"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-1-3",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE1"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-1-3"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-4-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli24"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-4"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-1-4",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE1"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-1-4"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-5-1",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE5"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-5-1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-5-2",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE5"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-5-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-1-1",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-1-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-1-2",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-1-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-2-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli42"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-2-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli42"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-2-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli42"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-4-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli44"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-4"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-3-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli33"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-3"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-3-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli33"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-3"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-5-3-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli53"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-3-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli33"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-3"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-5-3-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli53"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-5-3-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli53"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-3-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli13"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-5-4-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli54"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-4"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-2-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli42"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-5-2-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli52"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-4-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli24"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-4"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-4-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli24"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-4"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-5-4-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli54"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-4"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-4-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli24"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-4"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-5-4-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli54"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-4"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-4-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli14"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-4"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-4-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli14"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-4"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-2-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli12"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-3-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli13"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-3-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli23"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-4-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli14"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-4"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-5-3-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli53"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-4-4",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-4-4"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE4"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-4-1",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-4-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE4"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-4-2",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-4-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE4"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-4-3",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE4"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-4-3"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-3-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli43"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-4-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-4"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli34"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-3-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli43"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-3-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-3"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli43"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-1-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli31"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                }
+            ]
+        }
+    ]
+}
diff --git a/tests/sample_configs/NW-for-test-5-4.xml b/tests/sample_configs/NW-for-test-5-4.xml
deleted file mode 100644 (file)
index 20d05c9..0000000
+++ /dev/null
@@ -1,8580 +0,0 @@
-<network xmlns="urn:ietf:params:xml:ns:yang:ietf-network">
- <network-id>openroadm-topology</network-id>
-<node>    <node-id>OpenROADM-1-1-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-                </freq-map>
-            </avail-freq-maps>s>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli11</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-1-1-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli11</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-1-1-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-    <degree-attributes xmlns="http://org/openroadm/network/topology">
-      <avail-freq-maps>
-        <map-name>cband</map-name>
-        <start-edge-freq>191.325</start-edge-freq>
-        <freq-map-granularity>6.25</freq-map-granularity>
-        <effective-bits>768</effective-bits>
-        <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-        </freq-map>
-      </avail-freq-maps>
-    </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli11</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-1-1-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-1</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli11</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-</node>
-<node>        <node-id>XPONDER-1-1</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-1-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE1</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-1-2-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli12</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-1-2-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli12</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-1-2-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli12</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-1-2-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-2</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli12</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-</node>
-<node>        <node-id>XPONDER-1-2</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-1-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE1</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-1-3-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-3</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli13</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-1-3-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-3</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli13</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-1-3-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-3</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli13</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-1-3-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-3</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli13</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-</node>
-<node>        <node-id>XPONDER-1-3</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-1-3</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE1</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-1-4-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-4</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli14</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-1-4-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-4</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli14</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-1-4-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-4</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli14</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-1-4-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-4</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli14</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-</node>
-<node>        <node-id>XPONDER-1-4</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-1-4</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE1</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-2-1-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
-                </freq-map>
-            </avail-freq-maps>
-         </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli21</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-2-1-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli21</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-2-1-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli21</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-2-1-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-1</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli21</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-</node>
-<node>        <node-id>XPONDER-2-1</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-2-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE2</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-2-2-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli22</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-2-2-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli22</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-2-2-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli22</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-2-2-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-2</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli22</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-</node>
-<node>        <node-id>XPONDER-2-2</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-2-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE2</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-2-3-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-3</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli23</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-2-3-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-3</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli23</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-2-3-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
-                </freq-map>
-            </avail-freq-maps>>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-3</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli23</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-2-3-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-3</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli23</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
-                </freq-map>
-            </avail-freq-maps>>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-</node>
-<node>        <node-id>XPONDER-2-3</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-2-3</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE2</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-2-4-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-4</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli24</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-2-4-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-4</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli24</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-2-4-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-4</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli24</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-2-4-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-4</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli24</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////8A
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-</node>
-<node>        <node-id>XPONDER-2-4</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-2-4</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE2</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-3-1-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli31</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-3-1-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli31</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-3-1-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli31</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-3-1-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-1</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli31</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-</node>
-<node>        <node-id>XPONDER-3-1</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-3-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE3</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-3-2-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli32</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-3-2-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli32</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-3-2-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli32</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-3-2-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-2</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli32</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-</node>
-<node>        <node-id>XPONDER-3-2</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-3-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE3</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-3-3-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-3</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli33</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-3-3-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-3</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli33</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-3-3-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-3</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli33</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-3-3-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-3</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli33</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-</node>
-<node>        <node-id>XPONDER-3-3</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-3-3</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE3</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-3-4-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-4</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli34</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-3-4-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-4</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli34</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-3-4-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-4</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli34</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-3-4-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-4</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli34</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-</node>
-<node>        <node-id>XPONDER-3-4</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-3-4</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE3</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-4-1-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli41</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-4-1-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli41</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-4-1-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli41</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-4-1-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-1</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli41</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-</node>
-<node>        <node-id>XPONDER-4-1</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-4-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE4</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-4-2-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli42</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-4-2-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli42</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-4-2-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli42</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-4-2-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-2</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli42</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-</node>
-<node>        <node-id>XPONDER-4-2</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-4-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE4</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-4-3-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-3</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli43</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-4-3-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-3</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli43</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-4-3-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-3</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli43</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-4-3-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-3</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli43</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-</node>
-<node>        <node-id>XPONDER-4-3</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-4-3</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE4</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-4-4-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-4</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli44</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-4-4-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>s>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-4</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli44</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-4-4-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-4</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli44</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-4-4-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-4</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli44</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-</node>
-<node>        <node-id>XPONDER-4-4</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-4-4</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE4</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-5-1-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli51</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-5-1-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli51</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-5-1-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli51</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-5-1-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-1</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli51</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-</node>
-<node>        <node-id>XPONDER-5-1</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-5-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE5</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-5-2-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli52</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-5-2-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli52</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-5-2-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli52</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-5-2-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-2</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli52</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-</node>
-<node>        <node-id>XPONDER-5-2</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-5-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE5</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-5-3-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-3</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli53</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-5-3-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-3</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli53</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-5-3-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-3</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli53</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-5-3-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-3</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli53</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-</node>
-<node>        <node-id>XPONDER-5-3</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-5-3</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE5</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-5-4-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG1-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-4</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli54</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-5-4-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG2-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-4</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli54</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-5-4-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-CTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-RX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state> <tp-id>DEG3-TTP-TX</tp-id>  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-4</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli54</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-5-4-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-4</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli54</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP///////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-RX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-TX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-</node>
-<node>        <node-id>XPONDER-5-4</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-5-4</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE5</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-1-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-1-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-1-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-1-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-1-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-1-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-1XPDR-NW1-TX-toOpenROADM-1-1-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-1-1</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-1-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-SRG1-SRG1-PP1-TX-to-XPONDER-1-1XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-1-SRG1-SRG1-PP1-TX-to-XPONDER-1-1XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-1-1-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-1-1</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-1XPDR-NW1-TX-toOpenROADM-1-1-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-1XPDR-NW2-TX-toOpenROADM-1-1-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-1-1</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-1-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-SRG1-SRG1-PP2-TX-to-XPONDER-1-1XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-1-SRG1-SRG1-PP2-TX-to-XPONDER-1-1XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-1-1-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-1-1</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-1XPDR-NW2-TX-toOpenROADM-1-1-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-1XPDR-NW3-TX-toOpenROADM-1-1-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-1-1</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-1-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-SRG1-SRG1-PP3-TX-to-XPONDER-1-1XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-1-SRG1-SRG1-PP3-TX-to-XPONDER-1-1XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-1-1-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-1-1</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-1XPDR-NW3-TX-toOpenROADM-1-1-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-1XPDR-NW4-TX-toOpenROADM-1-1-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-1-1</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-1-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-SRG1-SRG1-PP4-TX-to-XPONDER-1-1XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-1-SRG1-SRG1-PP4-TX-to-XPONDER-1-1XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-1-1-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-1-1</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-1XPDR-NW4-TX-toOpenROADM-1-1-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-1-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-1-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-1-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-1-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-1-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-1-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-2XPDR-NW1-TX-toOpenROADM-1-2-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-1-2</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-2-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-SRG1-SRG1-PP1-TX-to-XPONDER-1-2XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-2-SRG1-SRG1-PP1-TX-to-XPONDER-1-2XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-1-2-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-1-2</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-2XPDR-NW1-TX-toOpenROADM-1-2-SRG1-SRG1-PP1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-2XPDR-NW2-TX-toOpenROADM-1-2-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-1-2</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-2-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-SRG1-SRG1-PP2-TX-to-XPONDER-1-2XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-2-SRG1-SRG1-PP2-TX-to-XPONDER-1-2XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-1-2-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-1-2</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-2XPDR-NW2-TX-toOpenROADM-1-2-SRG1-SRG1-PP2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-2XPDR-NW3-TX-toOpenROADM-1-2-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-1-2</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-2-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-SRG1-SRG1-PP3-TX-to-XPONDER-1-2XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-2-SRG1-SRG1-PP3-TX-to-XPONDER-1-2XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-1-2-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-1-2</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-2XPDR-NW3-TX-toOpenROADM-1-2-SRG1-SRG1-PP3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-2XPDR-NW4-TX-toOpenROADM-1-2-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-1-2</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-2-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-SRG1-SRG1-PP4-TX-to-XPONDER-1-2XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-2-SRG1-SRG1-PP4-TX-to-XPONDER-1-2XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-1-2-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-1-2</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-2XPDR-NW4-TX-toOpenROADM-1-2-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-3-DEG1-DEG1-CTP-TXtoOpenROADM-1-3-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-3-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-3-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-3-DEG2-DEG2-CTP-TXtoOpenROADM-1-3-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-3-DEG1-DEG1-CTP-TXtoOpenROADM-1-3-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-3-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-3-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-3-DEG3-DEG3-CTP-TXtoOpenROADM-1-3-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-3-SRG1-SRG1-CP-TXtoOpenROADM-1-3-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-1-3-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-3-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-3-DEG1-DEG1-CTP-TXtoOpenROADM-1-3-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-3-DEG1-DEG1-CTP-TXtoOpenROADM-1-3-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-1-3-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-3-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-3-SRG1-SRG1-CP-TXtoOpenROADM-1-3-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-3-DEG2-DEG2-CTP-TXtoOpenROADM-1-3-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-3-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-3-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-3-DEG1-DEG1-CTP-TXtoOpenROADM-1-3-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-3-DEG2-DEG2-CTP-TXtoOpenROADM-1-3-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-3-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-3-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-3-DEG3-DEG3-CTP-TXtoOpenROADM-1-3-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-3-SRG1-SRG1-CP-TXtoOpenROADM-1-3-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-1-3-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-3-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-3-DEG2-DEG2-CTP-TXtoOpenROADM-1-3-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-3-DEG2-DEG2-CTP-TXtoOpenROADM-1-3-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-1-3-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-3-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-3-SRG1-SRG1-CP-TXtoOpenROADM-1-3-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-3-DEG3-DEG3-CTP-TXtoOpenROADM-1-3-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-3-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-3-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-3-DEG1-DEG1-CTP-TXtoOpenROADM-1-3-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-3-DEG3-DEG3-CTP-TXtoOpenROADM-1-3-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-3-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-3-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-3-DEG2-DEG2-CTP-TXtoOpenROADM-1-3-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-3-SRG1-SRG1-CP-TXtoOpenROADM-1-3-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-1-3-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-3-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-3-DEG3-DEG3-CTP-TXtoOpenROADM-1-3-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-3-DEG3-DEG3-CTP-TXtoOpenROADM-1-3-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-1-3-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-3-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-3-SRG1-SRG1-CP-TXtoOpenROADM-1-3-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-3XPDR-NW1-TX-toOpenROADM-1-3-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-1-3</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-3-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-3-SRG1-SRG1-PP1-TX-to-XPONDER-1-3XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-3-SRG1-SRG1-PP1-TX-to-XPONDER-1-3XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-1-3-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-1-3</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-3XPDR-NW1-TX-toOpenROADM-1-3-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-3XPDR-NW2-TX-toOpenROADM-1-3-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-1-3</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-3-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-3-SRG1-SRG1-PP2-TX-to-XPONDER-1-3XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-3-SRG1-SRG1-PP2-TX-to-XPONDER-1-3XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-1-3-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-1-3</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-3XPDR-NW2-TX-toOpenROADM-1-3-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-3XPDR-NW3-TX-toOpenROADM-1-3-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-1-3</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-3-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-3-SRG1-SRG1-PP3-TX-to-XPONDER-1-3XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-3-SRG1-SRG1-PP3-TX-to-XPONDER-1-3XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-1-3-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-1-3</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-3XPDR-NW3-TX-toOpenROADM-1-3-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-3XPDR-NW4-TX-toOpenROADM-1-3-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-1-3</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-3-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-3-SRG1-SRG1-PP4-TX-to-XPONDER-1-3XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-3-SRG1-SRG1-PP4-TX-to-XPONDER-1-3XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-1-3-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-1-3</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-3XPDR-NW4-TX-toOpenROADM-1-3-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-4-DEG1-DEG1-CTP-TXtoOpenROADM-1-4-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-4-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-4-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-4-DEG2-DEG2-CTP-TXtoOpenROADM-1-4-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-4-DEG1-DEG1-CTP-TXtoOpenROADM-1-4-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-4-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-4-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-4-DEG3-DEG3-CTP-TXtoOpenROADM-1-4-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-4-SRG1-SRG1-CP-TXtoOpenROADM-1-4-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-1-4-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-4-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-4-DEG1-DEG1-CTP-TXtoOpenROADM-1-4-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-4-DEG1-DEG1-CTP-TXtoOpenROADM-1-4-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-1-4-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-4-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-4-SRG1-SRG1-CP-TXtoOpenROADM-1-4-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-4-DEG2-DEG2-CTP-TXtoOpenROADM-1-4-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-4-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-4-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-4-DEG1-DEG1-CTP-TXtoOpenROADM-1-4-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-4-DEG2-DEG2-CTP-TXtoOpenROADM-1-4-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-4-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-4-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-4-DEG3-DEG3-CTP-TXtoOpenROADM-1-4-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-4-SRG1-SRG1-CP-TXtoOpenROADM-1-4-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-1-4-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-4-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-4-DEG2-DEG2-CTP-TXtoOpenROADM-1-4-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-4-DEG2-DEG2-CTP-TXtoOpenROADM-1-4-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-1-4-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-4-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-4-SRG1-SRG1-CP-TXtoOpenROADM-1-4-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-4-DEG3-DEG3-CTP-TXtoOpenROADM-1-4-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-4-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-4-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-4-DEG1-DEG1-CTP-TXtoOpenROADM-1-4-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-4-DEG3-DEG3-CTP-TXtoOpenROADM-1-4-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-4-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-4-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-4-DEG2-DEG2-CTP-TXtoOpenROADM-1-4-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-4-SRG1-SRG1-CP-TXtoOpenROADM-1-4-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-1-4-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-4-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-4-DEG3-DEG3-CTP-TXtoOpenROADM-1-4-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-4-DEG3-DEG3-CTP-TXtoOpenROADM-1-4-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-1-4-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-4-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-4-SRG1-SRG1-CP-TXtoOpenROADM-1-4-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-4XPDR-NW1-TX-toOpenROADM-1-4-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-1-4</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-4-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-4-SRG1-SRG1-PP1-TX-to-XPONDER-1-4XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-4-SRG1-SRG1-PP1-TX-to-XPONDER-1-4XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-1-4-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-1-4</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-4XPDR-NW1-TX-toOpenROADM-1-4-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-4XPDR-NW2-TX-toOpenROADM-1-4-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-1-4</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-4-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-4-SRG1-SRG1-PP2-TX-to-XPONDER-1-4XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-4-SRG1-SRG1-PP2-TX-to-XPONDER-1-4XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-1-4-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-1-4</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-4XPDR-NW2-TX-toOpenROADM-1-4-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-4XPDR-NW3-TX-toOpenROADM-1-4-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-1-4</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-4-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-4-SRG1-SRG1-PP3-TX-to-XPONDER-1-4XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-4-SRG1-SRG1-PP3-TX-to-XPONDER-1-4XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-1-4-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-1-4</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-4XPDR-NW3-TX-toOpenROADM-1-4-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-4XPDR-NW4-TX-toOpenROADM-1-4-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-1-4</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-4-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-4-SRG1-SRG1-PP4-TX-to-XPONDER-1-4XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-4-SRG1-SRG1-PP4-TX-to-XPONDER-1-4XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-1-4-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-1-4</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-4XPDR-NW4-TX-toOpenROADM-1-4-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-1-1-DEG1-to-OpenROADM-1-2-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG1-to-OpenROADM-1-1-DEG1</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber1112</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-1-1-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-1-2-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-1-2-DEG1-to-OpenROADM-1-1-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG1-to-OpenROADM-1-2-DEG1</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber1211</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-1-2-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-1-1-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-1-2-DEG2-to-OpenROADM-1-3-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-3-DEG2-to-OpenROADM-1-2-DEG2</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber1213</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-1-2-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-1-3-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-1-3-DEG2-to-OpenROADM-1-2-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG2-to-OpenROADM-1-3-DEG2</opposite-link>
-
-    <clfi xmlns="http://org/openroadm/common/network">fiber1312</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-1-3-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-1-2-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-1-3-DEG1-to-OpenROADM-1-4-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-4-DEG1-to-OpenROADM-1-3-DEG1</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber1314</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-1-3-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-1-4-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-1-4-DEG1-to-OpenROADM-1-3-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-3-DEG1-to-OpenROADM-1-4-DEG1</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber1413</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-1-4-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-1-3-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-1-4-DEG2-to-OpenROADM-1-1-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG2-to-OpenROADM-1-4-DEG2</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber1411</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-1-4-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-1-1-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-1-1-DEG2-to-OpenROADM-1-4-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-4-DEG2-to-OpenROADM-1-1-DEG2</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber1114</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-1-1-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-1-4-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-2-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-2-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-2-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-2-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-2-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-2-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-1XPDR-NW1-TX-toOpenROADM-2-1-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-2-1</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-1-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-SRG1-SRG1-PP1-TX-to-XPONDER-2-1XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-1-SRG1-SRG1-PP1-TX-to-XPONDER-2-1XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-2-1-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-2-1</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-1XPDR-NW1-TX-toOpenROADM-2-1-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-1XPDR-NW2-TX-toOpenROADM-2-1-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-2-1</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-1-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-SRG1-SRG1-PP2-TX-to-XPONDER-2-1XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-1-SRG1-SRG1-PP2-TX-to-XPONDER-2-1XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-2-1-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-2-1</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-1XPDR-NW2-TX-toOpenROADM-2-1-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-1XPDR-NW3-TX-toOpenROADM-2-1-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-2-1</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-1-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-SRG1-SRG1-PP3-TX-to-XPONDER-2-1XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-1-SRG1-SRG1-PP3-TX-to-XPONDER-2-1XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-2-1-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-2-1</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-1XPDR-NW3-TX-toOpenROADM-2-1-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-1XPDR-NW4-TX-toOpenROADM-2-1-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-2-1</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-1-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-SRG1-SRG1-PP4-TX-to-XPONDER-2-1XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-1-SRG1-SRG1-PP4-TX-to-XPONDER-2-1XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-2-1-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-2-1</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-1XPDR-NW4-TX-toOpenROADM-2-1-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-2-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-2-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-2-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-2-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-2-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-2-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-2XPDR-NW1-TX-toOpenROADM-2-2-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-2-2</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-2-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-SRG1-SRG1-PP1-TX-to-XPONDER-2-2XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-2-SRG1-SRG1-PP1-TX-to-XPONDER-2-2XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-2-2-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-2-2</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-2XPDR-NW1-TX-toOpenROADM-2-2-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-2XPDR-NW2-TX-toOpenROADM-2-2-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-2-2</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-2-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-SRG1-SRG1-PP2-TX-to-XPONDER-2-2XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-2-SRG1-SRG1-PP2-TX-to-XPONDER-2-2XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-2-2-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-2-2</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-2XPDR-NW2-TX-toOpenROADM-2-2-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-2XPDR-NW3-TX-toOpenROADM-2-2-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-2-2</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-2-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-SRG1-SRG1-PP3-TX-to-XPONDER-2-2XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-2-SRG1-SRG1-PP3-TX-to-XPONDER-2-2XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-2-2-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-2-2</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-2XPDR-NW3-TX-toOpenROADM-2-2-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-2XPDR-NW4-TX-toOpenROADM-2-2-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-2-2</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-2-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-SRG1-SRG1-PP4-TX-to-XPONDER-2-2XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-2-SRG1-SRG1-PP4-TX-to-XPONDER-2-2XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-2-2-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-2-2</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-2XPDR-NW4-TX-toOpenROADM-2-2-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-3-DEG1-DEG1-CTP-TXtoOpenROADM-2-3-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-3-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-3-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-3-DEG2-DEG2-CTP-TXtoOpenROADM-2-3-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-3-DEG1-DEG1-CTP-TXtoOpenROADM-2-3-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-3-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-3-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-3-DEG3-DEG3-CTP-TXtoOpenROADM-2-3-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-3-SRG1-SRG1-CP-TXtoOpenROADM-2-3-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-2-3-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-3-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-3-DEG1-DEG1-CTP-TXtoOpenROADM-2-3-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-3-DEG1-DEG1-CTP-TXtoOpenROADM-2-3-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-2-3-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-3-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-3-SRG1-SRG1-CP-TXtoOpenROADM-2-3-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-3-DEG2-DEG2-CTP-TXtoOpenROADM-2-3-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-3-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-3-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-3-DEG1-DEG1-CTP-TXtoOpenROADM-2-3-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-3-DEG2-DEG2-CTP-TXtoOpenROADM-2-3-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-3-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-3-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-3-DEG3-DEG3-CTP-TXtoOpenROADM-2-3-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-3-SRG1-SRG1-CP-TXtoOpenROADM-2-3-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-2-3-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-3-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-3-DEG2-DEG2-CTP-TXtoOpenROADM-2-3-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-3-DEG2-DEG2-CTP-TXtoOpenROADM-2-3-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-2-3-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-3-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-3-SRG1-SRG1-CP-TXtoOpenROADM-2-3-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-3-DEG3-DEG3-CTP-TXtoOpenROADM-2-3-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-3-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-3-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-3-DEG1-DEG1-CTP-TXtoOpenROADM-2-3-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-3-DEG3-DEG3-CTP-TXtoOpenROADM-2-3-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-3-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-3-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-3-DEG2-DEG2-CTP-TXtoOpenROADM-2-3-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-3-SRG1-SRG1-CP-TXtoOpenROADM-2-3-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-2-3-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-3-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-3-DEG3-DEG3-CTP-TXtoOpenROADM-2-3-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-3-DEG3-DEG3-CTP-TXtoOpenROADM-2-3-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-2-3-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-3-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-3-SRG1-SRG1-CP-TXtoOpenROADM-2-3-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-3XPDR-NW1-TX-toOpenROADM-2-3-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-2-3</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-3-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-3-SRG1-SRG1-PP1-TX-to-XPONDER-2-3XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-3-SRG1-SRG1-PP1-TX-to-XPONDER-2-3XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-2-3-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-2-3</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-3XPDR-NW1-TX-toOpenROADM-2-3-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-3XPDR-NW2-TX-toOpenROADM-2-3-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-2-3</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-3-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-3-SRG1-SRG1-PP2-TX-to-XPONDER-2-3XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-3-SRG1-SRG1-PP2-TX-to-XPONDER-2-3XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-2-3-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-2-3</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-3XPDR-NW2-TX-toOpenROADM-2-3-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-3XPDR-NW3-TX-toOpenROADM-2-3-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-2-3</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-3-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-3-SRG1-SRG1-PP3-TX-to-XPONDER-2-3XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-3-SRG1-SRG1-PP3-TX-to-XPONDER-2-3XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-2-3-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-2-3</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-3XPDR-NW3-TX-toOpenROADM-2-3-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-3XPDR-NW4-TX-toOpenROADM-2-3-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-2-3</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-3-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-3-SRG1-SRG1-PP4-TX-to-XPONDER-2-3XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-3-SRG1-SRG1-PP4-TX-to-XPONDER-2-3XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-2-3-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-2-3</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-3XPDR-NW4-TX-toOpenROADM-2-3-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-4-DEG1-DEG1-CTP-TXtoOpenROADM-2-4-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-4-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-4-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-4-DEG2-DEG2-CTP-TXtoOpenROADM-2-4-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-4-DEG1-DEG1-CTP-TXtoOpenROADM-2-4-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-4-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-4-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-4-DEG3-DEG3-CTP-TXtoOpenROADM-2-4-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-4-SRG1-SRG1-CP-TXtoOpenROADM-2-4-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-2-4-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-4-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-4-DEG1-DEG1-CTP-TXtoOpenROADM-2-4-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-4-DEG1-DEG1-CTP-TXtoOpenROADM-2-4-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-2-4-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-4-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-4-SRG1-SRG1-CP-TXtoOpenROADM-2-4-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-4-DEG2-DEG2-CTP-TXtoOpenROADM-2-4-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-4-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-4-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-4-DEG1-DEG1-CTP-TXtoOpenROADM-2-4-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-4-DEG2-DEG2-CTP-TXtoOpenROADM-2-4-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-4-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-4-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-4-DEG3-DEG3-CTP-TXtoOpenROADM-2-4-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-4-SRG1-SRG1-CP-TXtoOpenROADM-2-4-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-2-4-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-4-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-4-DEG2-DEG2-CTP-TXtoOpenROADM-2-4-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-4-DEG2-DEG2-CTP-TXtoOpenROADM-2-4-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-2-4-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-4-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-4-SRG1-SRG1-CP-TXtoOpenROADM-2-4-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-4-DEG3-DEG3-CTP-TXtoOpenROADM-2-4-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-4-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-4-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-4-DEG1-DEG1-CTP-TXtoOpenROADM-2-4-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-4-DEG3-DEG3-CTP-TXtoOpenROADM-2-4-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-4-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-4-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-4-DEG2-DEG2-CTP-TXtoOpenROADM-2-4-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-4-SRG1-SRG1-CP-TXtoOpenROADM-2-4-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-2-4-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-4-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-4-DEG3-DEG3-CTP-TXtoOpenROADM-2-4-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-4-DEG3-DEG3-CTP-TXtoOpenROADM-2-4-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-2-4-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-4-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-4-SRG1-SRG1-CP-TXtoOpenROADM-2-4-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-4XPDR-NW1-TX-toOpenROADM-2-4-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-2-4</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-4-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-4-SRG1-SRG1-PP1-TX-to-XPONDER-2-4XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-4-SRG1-SRG1-PP1-TX-to-XPONDER-2-4XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-2-4-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-2-4</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-4XPDR-NW1-TX-toOpenROADM-2-4-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-4XPDR-NW2-TX-toOpenROADM-2-4-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-2-4</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-4-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-4-SRG1-SRG1-PP2-TX-to-XPONDER-2-4XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-4-SRG1-SRG1-PP2-TX-to-XPONDER-2-4XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-2-4-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-2-4</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-4XPDR-NW2-TX-toOpenROADM-2-4-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-4XPDR-NW3-TX-toOpenROADM-2-4-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-2-4</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-4-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-4-SRG1-SRG1-PP3-TX-to-XPONDER-2-4XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-4-SRG1-SRG1-PP3-TX-to-XPONDER-2-4XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-2-4-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-2-4</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-4XPDR-NW3-TX-toOpenROADM-2-4-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-4XPDR-NW4-TX-toOpenROADM-2-4-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-2-4</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-4-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-4-SRG1-SRG1-PP4-TX-to-XPONDER-2-4XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-4-SRG1-SRG1-PP4-TX-to-XPONDER-2-4XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-2-4-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-2-4</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-4XPDR-NW4-TX-toOpenROADM-2-4-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-2-1-DEG1-to-OpenROADM-2-2-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG1-to-OpenROADM-2-1-DEG1</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber2122</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-2-1-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-2-2-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-2-2-DEG1-to-OpenROADM-2-1-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG1-to-OpenROADM-2-2-DEG1</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber2221</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-2-2-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-2-1-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-2-2-DEG2-to-OpenROADM-2-3-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-3-DEG2-to-OpenROADM-2-2-DEG2</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber2223</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-2-2-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-2-3-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-2-3-DEG2-to-OpenROADM-2-2-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG2-to-OpenROADM-2-3-DEG2</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber2322</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-2-3-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-2-2-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-2-3-DEG1-to-OpenROADM-2-4-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-4-DEG1-to-OpenROADM-2-3-DEG1</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber2324</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-2-3-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-2-4-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-2-4-DEG1-to-OpenROADM-2-3-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-3-DEG1-to-OpenROADM-2-4-DEG1</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber2423</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-2-4-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-2-3-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-2-4-DEG2-to-OpenROADM-2-1-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG2-to-OpenROADM-2-4-DEG2</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber2421</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-2-4-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-2-1-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-2-1-DEG2-to-OpenROADM-2-4-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-4-DEG2-to-OpenROADM-2-1-DEG2</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber2124</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-2-1-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-2-4-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <link-id>OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>
-        <destination><dest-node>OpenROADM-3-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <link-id>OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-3-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-3-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-3-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-3-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-3-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-3-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-1XPDR-NW1-TX-toOpenROADM-3-1-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-3-1</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-1-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-SRG1-SRG1-PP1-TX-to-XPONDER-3-1XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-1-SRG1-SRG1-PP1-TX-to-XPONDER-3-1XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-3-1-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-3-1</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-1XPDR-NW1-TX-toOpenROADM-3-1-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-1XPDR-NW2-TX-toOpenROADM-3-1-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-3-1</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-1-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-SRG1-SRG1-PP2-TX-to-XPONDER-3-1XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-1-SRG1-SRG1-PP2-TX-to-XPONDER-3-1XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-3-1-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-3-1</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-1XPDR-NW2-TX-toOpenROADM-3-1-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-1XPDR-NW3-TX-toOpenROADM-3-1-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-3-1</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-1-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-SRG1-SRG1-PP3-TX-to-XPONDER-3-1XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-1-SRG1-SRG1-PP3-TX-to-XPONDER-3-1XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-3-1-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-3-1</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-1XPDR-NW3-TX-toOpenROADM-3-1-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-1XPDR-NW4-TX-toOpenROADM-3-1-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-3-1</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-1-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-SRG1-SRG1-PP4-TX-to-XPONDER-3-1XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-1-SRG1-SRG1-PP4-TX-to-XPONDER-3-1XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-3-1-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-3-1</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-1XPDR-NW4-TX-toOpenROADM-3-1-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-3-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-3-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-3-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-3-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-3-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-3-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-2XPDR-NW1-TX-toOpenROADM-3-2-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-3-2</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-2-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-SRG1-SRG1-PP1-TX-to-XPONDER-3-2XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-2-SRG1-SRG1-PP1-TX-to-XPONDER-3-2XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-3-2-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-3-2</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-2XPDR-NW1-TX-toOpenROADM-3-2-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-2XPDR-NW2-TX-toOpenROADM-3-2-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-3-2</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-2-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-SRG1-SRG1-PP2-TX-to-XPONDER-3-2XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-2-SRG1-SRG1-PP2-TX-to-XPONDER-3-2XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-3-2-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-3-2</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-2XPDR-NW2-TX-toOpenROADM-3-2-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-2XPDR-NW3-TX-toOpenROADM-3-2-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-3-2</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-2-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-SRG1-SRG1-PP3-TX-to-XPONDER-3-2XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-2-SRG1-SRG1-PP3-TX-to-XPONDER-3-2XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-3-2-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-3-2</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-2XPDR-NW3-TX-toOpenROADM-3-2-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-2XPDR-NW4-TX-toOpenROADM-3-2-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-3-2</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-2-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-SRG1-SRG1-PP4-TX-to-XPONDER-3-2XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-2-SRG1-SRG1-PP4-TX-to-XPONDER-3-2XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-3-2-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-3-2</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-2XPDR-NW4-TX-toOpenROADM-3-2-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-3-DEG1-DEG1-CTP-TXtoOpenROADM-3-3-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-3-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-3-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-3-DEG2-DEG2-CTP-TXtoOpenROADM-3-3-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-3-DEG1-DEG1-CTP-TXtoOpenROADM-3-3-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-3-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-3-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-3-DEG3-DEG3-CTP-TXtoOpenROADM-3-3-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-3-SRG1-SRG1-CP-TXtoOpenROADM-3-3-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-3-3-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-3-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-3-DEG1-DEG1-CTP-TXtoOpenROADM-3-3-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-3-DEG1-DEG1-CTP-TXtoOpenROADM-3-3-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-3-3-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-3-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-3-SRG1-SRG1-CP-TXtoOpenROADM-3-3-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-3-DEG2-DEG2-CTP-TXtoOpenROADM-3-3-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-3-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-3-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-3-DEG1-DEG1-CTP-TXtoOpenROADM-3-3-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-3-DEG2-DEG2-CTP-TXtoOpenROADM-3-3-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-3-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-3-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-3-DEG3-DEG3-CTP-TXtoOpenROADM-3-3-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-3-SRG1-SRG1-CP-TXtoOpenROADM-3-3-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-3-3-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-3-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-3-DEG2-DEG2-CTP-TXtoOpenROADM-3-3-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-3-DEG2-DEG2-CTP-TXtoOpenROADM-3-3-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-3-3-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-3-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-3-SRG1-SRG1-CP-TXtoOpenROADM-3-3-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-3-DEG3-DEG3-CTP-TXtoOpenROADM-3-3-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-3-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-3-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-3-DEG1-DEG1-CTP-TXtoOpenROADM-3-3-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-3-DEG3-DEG3-CTP-TXtoOpenROADM-3-3-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-3-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-3-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-3-DEG2-DEG2-CTP-TXtoOpenROADM-3-3-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-3-SRG1-SRG1-CP-TXtoOpenROADM-3-3-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-3-3-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-3-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-3-DEG3-DEG3-CTP-TXtoOpenROADM-3-3-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-3-DEG3-DEG3-CTP-TXtoOpenROADM-3-3-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-3-3-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-3-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-3-SRG1-SRG1-CP-TXtoOpenROADM-3-3-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-3XPDR-NW1-TX-toOpenROADM-3-3-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-3-3</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-3-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-3-SRG1-SRG1-PP1-TX-to-XPONDER-3-3XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-3-SRG1-SRG1-PP1-TX-to-XPONDER-3-3XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-3-3-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-3-3</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-3XPDR-NW1-TX-toOpenROADM-3-3-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-3XPDR-NW2-TX-toOpenROADM-3-3-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-3-3</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-3-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-3-SRG1-SRG1-PP2-TX-to-XPONDER-3-3XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-3-SRG1-SRG1-PP2-TX-to-XPONDER-3-3XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-3-3-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-3-3</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-3XPDR-NW2-TX-toOpenROADM-3-3-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-3XPDR-NW3-TX-toOpenROADM-3-3-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-3-3</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-3-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-3-SRG1-SRG1-PP3-TX-to-XPONDER-3-3XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-3-SRG1-SRG1-PP3-TX-to-XPONDER-3-3XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-3-3-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-3-3</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-3XPDR-NW3-TX-toOpenROADM-3-3-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-3XPDR-NW4-TX-toOpenROADM-3-3-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-3-3</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-3-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-3-SRG1-SRG1-PP4-TX-to-XPONDER-3-3XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-3-SRG1-SRG1-PP4-TX-to-XPONDER-3-3XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-3-3-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-3-3</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-3XPDR-NW4-TX-toOpenROADM-3-3-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-4-DEG1-DEG1-CTP-TXtoOpenROADM-3-4-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-4-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-4-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-4-DEG2-DEG2-CTP-TXtoOpenROADM-3-4-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-4-DEG1-DEG1-CTP-TXtoOpenROADM-3-4-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-4-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-4-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-4-DEG3-DEG3-CTP-TXtoOpenROADM-3-4-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-4-SRG1-SRG1-CP-TXtoOpenROADM-3-4-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-3-4-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-4-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-4-DEG1-DEG1-CTP-TXtoOpenROADM-3-4-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-4-DEG1-DEG1-CTP-TXtoOpenROADM-3-4-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-3-4-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-4-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-4-SRG1-SRG1-CP-TXtoOpenROADM-3-4-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-4-DEG2-DEG2-CTP-TXtoOpenROADM-3-4-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-4-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-4-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-4-DEG1-DEG1-CTP-TXtoOpenROADM-3-4-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-4-DEG2-DEG2-CTP-TXtoOpenROADM-3-4-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-4-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-4-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-4-DEG3-DEG3-CTP-TXtoOpenROADM-3-4-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-4-SRG1-SRG1-CP-TXtoOpenROADM-3-4-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-3-4-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-4-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-4-DEG2-DEG2-CTP-TXtoOpenROADM-3-4-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-4-DEG2-DEG2-CTP-TXtoOpenROADM-3-4-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-3-4-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-4-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-4-SRG1-SRG1-CP-TXtoOpenROADM-3-4-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-4-DEG3-DEG3-CTP-TXtoOpenROADM-3-4-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-4-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-4-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-4-DEG1-DEG1-CTP-TXtoOpenROADM-3-4-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-4-DEG3-DEG3-CTP-TXtoOpenROADM-3-4-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-4-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-4-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-4-DEG2-DEG2-CTP-TXtoOpenROADM-3-4-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-4-SRG1-SRG1-CP-TXtoOpenROADM-3-4-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-3-4-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-4-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-4-DEG3-DEG3-CTP-TXtoOpenROADM-3-4-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-4-DEG3-DEG3-CTP-TXtoOpenROADM-3-4-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-3-4-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-4-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-4-SRG1-SRG1-CP-TXtoOpenROADM-3-4-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-4XPDR-NW1-TX-toOpenROADM-3-4-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-3-4</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-4-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-4-SRG1-SRG1-PP1-TX-to-XPONDER-3-4XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-4-SRG1-SRG1-PP1-TX-to-XPONDER-3-4XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-3-4-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-3-4</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-4XPDR-NW1-TX-toOpenROADM-3-4-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-4XPDR-NW2-TX-toOpenROADM-3-4-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-3-4</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-4-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-4-SRG1-SRG1-PP2-TX-to-XPONDER-3-4XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-4-SRG1-SRG1-PP2-TX-to-XPONDER-3-4XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-3-4-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-3-4</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-4XPDR-NW2-TX-toOpenROADM-3-4-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-4XPDR-NW3-TX-toOpenROADM-3-4-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-3-4</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-4-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-4-SRG1-SRG1-PP3-TX-to-XPONDER-3-4XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-4-SRG1-SRG1-PP3-TX-to-XPONDER-3-4XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-3-4-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-3-4</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-4XPDR-NW3-TX-toOpenROADM-3-4-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-4XPDR-NW4-TX-toOpenROADM-3-4-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-3-4</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-4-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-4-SRG1-SRG1-PP4-TX-to-XPONDER-3-4XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-4-SRG1-SRG1-PP4-TX-to-XPONDER-3-4XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-3-4-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-3-4</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-4XPDR-NW4-TX-toOpenROADM-3-4-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-3-1-DEG1-to-OpenROADM-3-2-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG1-to-OpenROADM-3-1-DEG1</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber3132</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-3-1-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-3-2-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-3-2-DEG1-to-OpenROADM-3-1-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG1-to-OpenROADM-3-2-DEG1</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber3231</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-3-2-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-3-1-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-3-2-DEG2-to-OpenROADM-3-3-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-3-DEG2-to-OpenROADM-3-2-DEG2</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber3233</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-3-2-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-3-3-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-3-3-DEG2-to-OpenROADM-3-2-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG2-to-OpenROADM-3-3-DEG2</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber3332</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-3-3-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-3-2-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-3-3-DEG1-to-OpenROADM-3-4-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-4-DEG1-to-OpenROADM-3-3-DEG1</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber3334</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-3-3-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-3-4-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-3-4-DEG1-to-OpenROADM-3-3-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-3-DEG1-to-OpenROADM-3-4-DEG1</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber3433</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-3-4-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-3-3-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-3-4-DEG2-to-OpenROADM-3-1-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG2-to-OpenROADM-3-4-DEG2</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber3431</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-3-4-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-3-1-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-3-1-DEG2-to-OpenROADM-3-4-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-4-DEG2-to-OpenROADM-3-1-DEG2</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber3431</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-3-1-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-3-4-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-4-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-4-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-4-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-4-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-4-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-4-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-1XPDR-NW1-TX-toOpenROADM-4-1-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-4-1</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-1-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-SRG1-SRG1-PP1-TX-to-XPONDER-4-1XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-1-SRG1-SRG1-PP1-TX-to-XPONDER-4-1XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-4-1-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-4-1</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-1XPDR-NW1-TX-toOpenROADM-4-1-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-1XPDR-NW2-TX-toOpenROADM-4-1-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-4-1</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-1-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-SRG1-SRG1-PP2-TX-to-XPONDER-4-1XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-1-SRG1-SRG1-PP2-TX-to-XPONDER-4-1XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-4-1-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-4-1</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-1XPDR-NW2-TX-toOpenROADM-4-1-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-1XPDR-NW3-TX-toOpenROADM-4-1-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-4-1</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-1-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-SRG1-SRG1-PP3-TX-to-XPONDER-4-1XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-1-SRG1-SRG1-PP3-TX-to-XPONDER-4-1XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-4-1-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-4-1</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-1XPDR-NW3-TX-toOpenROADM-4-1-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-1XPDR-NW4-TX-toOpenROADM-4-1-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-4-1</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-1-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-SRG1-SRG1-PP4-TX-to-XPONDER-4-1XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-1-SRG1-SRG1-PP4-TX-to-XPONDER-4-1XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-4-1-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-4-1</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-1XPDR-NW4-TX-toOpenROADM-4-1-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-4-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-4-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-4-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-4-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-4-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-4-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-2XPDR-NW1-TX-toOpenROADM-4-2-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-4-2</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-2-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-SRG1-SRG1-PP1-TX-to-XPONDER-4-2XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-2-SRG1-SRG1-PP1-TX-to-XPONDER-4-2XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-4-2-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-4-2</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-2XPDR-NW1-TX-toOpenROADM-4-2-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-2XPDR-NW2-TX-toOpenROADM-4-2-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-4-2</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-2-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-SRG1-SRG1-PP2-TX-to-XPONDER-4-2XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-2-SRG1-SRG1-PP2-TX-to-XPONDER-4-2XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-4-2-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-4-2</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-2XPDR-NW2-TX-toOpenROADM-4-2-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-2XPDR-NW3-TX-toOpenROADM-4-2-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-4-2</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-2-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-SRG1-SRG1-PP3-TX-to-XPONDER-4-2XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-2-SRG1-SRG1-PP3-TX-to-XPONDER-4-2XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-4-2-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-4-2</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-2XPDR-NW3-TX-toOpenROADM-4-2-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-2XPDR-NW4-TX-toOpenROADM-4-2-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-4-2</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-2-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-SRG1-SRG1-PP4-TX-to-XPONDER-4-2XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-2-SRG1-SRG1-PP4-TX-to-XPONDER-4-2XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-4-2-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-4-2</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-2XPDR-NW4-TX-toOpenROADM-4-2-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-3-DEG1-DEG1-CTP-TXtoOpenROADM-4-3-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-3-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-3-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-3-DEG2-DEG2-CTP-TXtoOpenROADM-4-3-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-3-DEG1-DEG1-CTP-TXtoOpenROADM-4-3-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-3-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-3-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-3-DEG3-DEG3-CTP-TXtoOpenROADM-4-3-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-3-SRG1-SRG1-CP-TXtoOpenROADM-4-3-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-4-3-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-3-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-3-DEG1-DEG1-CTP-TXtoOpenROADM-4-3-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-3-DEG1-DEG1-CTP-TXtoOpenROADM-4-3-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-4-3-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-3-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-3-SRG1-SRG1-CP-TXtoOpenROADM-4-3-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-3-DEG2-DEG2-CTP-TXtoOpenROADM-4-3-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-3-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-3-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-3-DEG1-DEG1-CTP-TXtoOpenROADM-4-3-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-3-DEG2-DEG2-CTP-TXtoOpenROADM-4-3-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-3-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-3-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-3-DEG3-DEG3-CTP-TXtoOpenROADM-4-3-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-3-SRG1-SRG1-CP-TXtoOpenROADM-4-3-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-4-3-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-3-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-3-DEG2-DEG2-CTP-TXtoOpenROADM-4-3-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-3-DEG2-DEG2-CTP-TXtoOpenROADM-4-3-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-4-3-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-3-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-3-SRG1-SRG1-CP-TXtoOpenROADM-4-3-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-3-DEG3-DEG3-CTP-TXtoOpenROADM-4-3-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-3-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-3-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-3-DEG1-DEG1-CTP-TXtoOpenROADM-4-3-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-3-DEG3-DEG3-CTP-TXtoOpenROADM-4-3-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-3-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-3-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-3-DEG2-DEG2-CTP-TXtoOpenROADM-4-3-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-3-SRG1-SRG1-CP-TXtoOpenROADM-4-3-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-4-3-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-3-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-3-DEG3-DEG3-CTP-TXtoOpenROADM-4-3-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-3-DEG3-DEG3-CTP-TXtoOpenROADM-4-3-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-4-3-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-3-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-3-SRG1-SRG1-CP-TXtoOpenROADM-4-3-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-3XPDR-NW1-TX-toOpenROADM-4-3-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-4-3</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-3-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-3-SRG1-SRG1-PP1-TX-to-XPONDER-4-3XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-3-SRG1-SRG1-PP1-TX-to-XPONDER-4-3XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-4-3-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-4-3</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-3XPDR-NW1-TX-toOpenROADM-4-3-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-3XPDR-NW2-TX-toOpenROADM-4-3-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-4-3</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-3-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-3-SRG1-SRG1-PP2-TX-to-XPONDER-4-3XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-3-SRG1-SRG1-PP2-TX-to-XPONDER-4-3XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-4-3-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-4-3</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-3XPDR-NW2-TX-toOpenROADM-4-3-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-3XPDR-NW3-TX-toOpenROADM-4-3-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-4-3</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-3-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-3-SRG1-SRG1-PP3-TX-to-XPONDER-4-3XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-3-SRG1-SRG1-PP3-TX-to-XPONDER-4-3XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-4-3-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-4-3</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-3XPDR-NW3-TX-toOpenROADM-4-3-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-3XPDR-NW4-TX-toOpenROADM-4-3-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-4-3</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-3-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-3-SRG1-SRG1-PP4-TX-to-XPONDER-4-3XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-3-SRG1-SRG1-PP4-TX-to-XPONDER-4-3XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-4-3-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-4-3</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-3XPDR-NW4-TX-toOpenROADM-4-3-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-4-DEG1-DEG1-CTP-TXtoOpenROADM-4-4-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-4-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-4-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-4-DEG2-DEG2-CTP-TXtoOpenROADM-4-4-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-4-DEG1-DEG1-CTP-TXtoOpenROADM-4-4-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-4-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-4-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-4-DEG3-DEG3-CTP-TXtoOpenROADM-4-4-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-4-SRG1-SRG1-CP-TXtoOpenROADM-4-4-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-4-4-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-4-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-4-DEG1-DEG1-CTP-TXtoOpenROADM-4-4-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-4-DEG1-DEG1-CTP-TXtoOpenROADM-4-4-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-4-4-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-4-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-4-SRG1-SRG1-CP-TXtoOpenROADM-4-4-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-4-DEG2-DEG2-CTP-TXtoOpenROADM-4-4-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-4-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-4-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-4-DEG1-DEG1-CTP-TXtoOpenROADM-4-4-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-4-DEG2-DEG2-CTP-TXtoOpenROADM-4-4-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-4-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-4-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-4-DEG3-DEG3-CTP-TXtoOpenROADM-4-4-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-4-SRG1-SRG1-CP-TXtoOpenROADM-4-4-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-4-4-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-4-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-4-DEG2-DEG2-CTP-TXtoOpenROADM-4-4-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-4-DEG2-DEG2-CTP-TXtoOpenROADM-4-4-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-4-4-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-4-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-4-SRG1-SRG1-CP-TXtoOpenROADM-4-4-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-4-DEG3-DEG3-CTP-TXtoOpenROADM-4-4-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-4-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-4-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-4-DEG1-DEG1-CTP-TXtoOpenROADM-4-4-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-4-DEG3-DEG3-CTP-TXtoOpenROADM-4-4-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-4-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-4-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-4-DEG2-DEG2-CTP-TXtoOpenROADM-4-4-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-4-SRG1-SRG1-CP-TXtoOpenROADM-4-4-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-4-4-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-4-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-4-DEG3-DEG3-CTP-TXtoOpenROADM-4-4-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-4-DEG3-DEG3-CTP-TXtoOpenROADM-4-4-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-4-4-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-4-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-4-SRG1-SRG1-CP-TXtoOpenROADM-4-4-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-4XPDR-NW1-TX-toOpenROADM-4-4-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-4-4</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-4-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-4-SRG1-SRG1-PP1-TX-to-XPONDER-4-4XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-4-SRG1-SRG1-PP1-TX-to-XPONDER-4-4XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-4-4-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-4-4</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-4XPDR-NW1-TX-toOpenROADM-4-4-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-4XPDR-NW2-TX-toOpenROADM-4-4-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-4-4</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-4-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-4-SRG1-SRG1-PP2-TX-to-XPONDER-4-4XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-4-SRG1-SRG1-PP2-TX-to-XPONDER-4-4XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-4-4-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-4-4</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-4XPDR-NW2-TX-toOpenROADM-4-4-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-4XPDR-NW3-TX-toOpenROADM-4-4-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-4-4</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-4-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-4-SRG1-SRG1-PP3-TX-to-XPONDER-4-4XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-4-SRG1-SRG1-PP3-TX-to-XPONDER-4-4XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-4-4-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-4-4</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-4XPDR-NW3-TX-toOpenROADM-4-4-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-4XPDR-NW4-TX-toOpenROADM-4-4-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-4-4</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-4-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-4-SRG1-SRG1-PP4-TX-to-XPONDER-4-4XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-4-SRG1-SRG1-PP4-TX-to-XPONDER-4-4XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-4-4-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-4-4</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-4XPDR-NW4-TX-toOpenROADM-4-4-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-4-1-DEG1-to-OpenROADM-4-2-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG1-to-OpenROADM-4-1-DEG1</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber4142</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-4-1-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-4-2-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-4-2-DEG1-to-OpenROADM-4-1-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG1-to-OpenROADM-4-2-DEG1</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber4241</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-4-2-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-4-1-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-4-2-DEG2-to-OpenROADM-4-3-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-3-DEG2-to-OpenROADM-4-2-DEG2</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber4243</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-4-2-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-4-3-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-4-3-DEG2-to-OpenROADM-4-2-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG2-to-OpenROADM-4-3-DEG2</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber4342</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-4-3-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-4-2-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-4-3-DEG1-to-OpenROADM-4-4-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-4-DEG1-to-OpenROADM-4-3-DEG1</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber4344</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-4-3-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-4-4-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-4-4-DEG1-to-OpenROADM-4-3-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-3-DEG1-to-OpenROADM-4-4-DEG1</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber4443</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-4-4-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-4-3-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-4-4-DEG2-to-OpenROADM-4-1-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG2-to-OpenROADM-4-4-DEG2</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber4441</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-4-4-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-4-1-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-4-1-DEG2-to-OpenROADM-4-4-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-4-DEG2-to-OpenROADM-4-1-DEG2</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber4144</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-4-1-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-4-4-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-5-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-5-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-5-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-5-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-5-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-5-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-1XPDR-NW1-TX-toOpenROADM-5-1-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-5-1</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-1-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-SRG1-SRG1-PP1-TX-to-XPONDER-5-1XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-1-SRG1-SRG1-PP1-TX-to-XPONDER-5-1XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-5-1-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-5-1</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-1XPDR-NW1-TX-toOpenROADM-5-1-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-1XPDR-NW2-TX-toOpenROADM-5-1-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-5-1</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-1-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-SRG1-SRG1-PP2-TX-to-XPONDER-5-1XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-1-SRG1-SRG1-PP2-TX-to-XPONDER-5-1XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-5-1-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-5-1</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-1XPDR-NW2-TX-toOpenROADM-5-1-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-1XPDR-NW3-TX-toOpenROADM-5-1-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-5-1</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-1-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-SRG1-SRG1-PP3-TX-to-XPONDER-5-1XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-1-SRG1-SRG1-PP3-TX-to-XPONDER-5-1XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-5-1-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-5-1</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-1XPDR-NW3-TX-toOpenROADM-5-1-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-1XPDR-NW4-TX-toOpenROADM-5-1-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-5-1</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-1-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-SRG1-SRG1-PP4-TX-to-XPONDER-5-1XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-1-SRG1-SRG1-PP4-TX-to-XPONDER-5-1XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-5-1-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-5-1</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-1XPDR-NW4-TX-toOpenROADM-5-1-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-5-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-5-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-5-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-5-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-5-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-5-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-2XPDR-NW1-TX-toOpenROADM-5-2-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-5-2</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-2-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-SRG1-SRG1-PP1-TX-to-XPONDER-5-2XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-2-SRG1-SRG1-PP1-TX-to-XPONDER-5-2XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-5-2-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-5-2</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-2XPDR-NW1-TX-toOpenROADM-5-2-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-2XPDR-NW2-TX-toOpenROADM-5-2-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-5-2</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-2-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-SRG1-SRG1-PP2-TX-to-XPONDER-5-2XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-2-SRG1-SRG1-PP2-TX-to-XPONDER-5-2XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-5-2-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-5-2</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-2XPDR-NW2-TX-toOpenROADM-5-2-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-2XPDR-NW3-TX-toOpenROADM-5-2-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-5-2</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-2-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-SRG1-SRG1-PP3-TX-to-XPONDER-5-2XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-2-SRG1-SRG1-PP3-TX-to-XPONDER-5-2XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-5-2-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-5-2</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-2XPDR-NW3-TX-toOpenROADM-5-2-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-2XPDR-NW4-TX-toOpenROADM-5-2-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-5-2</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-2-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-SRG1-SRG1-PP4-TX-to-XPONDER-5-2XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-2-SRG1-SRG1-PP4-TX-to-XPONDER-5-2XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-5-2-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-5-2</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-2XPDR-NW4-TX-toOpenROADM-5-2-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-3-DEG1-DEG1-CTP-TXtoOpenROADM-5-3-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-3-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-3-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-3-DEG2-DEG2-CTP-TXtoOpenROADM-5-3-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-3-DEG1-DEG1-CTP-TXtoOpenROADM-5-3-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-3-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-3-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-3-DEG3-DEG3-CTP-TXtoOpenROADM-5-3-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-3-SRG1-SRG1-CP-TXtoOpenROADM-5-3-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-5-3-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-3-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-3-DEG1-DEG1-CTP-TXtoOpenROADM-5-3-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-3-DEG1-DEG1-CTP-TXtoOpenROADM-5-3-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-5-3-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-3-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-3-SRG1-SRG1-CP-TXtoOpenROADM-5-3-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-3-DEG2-DEG2-CTP-TXtoOpenROADM-5-3-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-3-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-3-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-3-DEG1-DEG1-CTP-TXtoOpenROADM-5-3-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-3-DEG2-DEG2-CTP-TXtoOpenROADM-5-3-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-3-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-3-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-3-DEG3-DEG3-CTP-TXtoOpenROADM-5-3-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-3-SRG1-SRG1-CP-TXtoOpenROADM-5-3-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-5-3-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-3-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-3-DEG2-DEG2-CTP-TXtoOpenROADM-5-3-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-3-DEG2-DEG2-CTP-TXtoOpenROADM-5-3-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-5-3-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-3-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-3-SRG1-SRG1-CP-TXtoOpenROADM-5-3-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-3-DEG3-DEG3-CTP-TXtoOpenROADM-5-3-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-3-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-3-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-3-DEG1-DEG1-CTP-TXtoOpenROADM-5-3-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-3-DEG3-DEG3-CTP-TXtoOpenROADM-5-3-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-3-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-3-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-3-DEG2-DEG2-CTP-TXtoOpenROADM-5-3-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-3-SRG1-SRG1-CP-TXtoOpenROADM-5-3-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-5-3-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-3-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-3-DEG3-DEG3-CTP-TXtoOpenROADM-5-3-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-3-DEG3-DEG3-CTP-TXtoOpenROADM-5-3-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-5-3-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-3-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-3-SRG1-SRG1-CP-TXtoOpenROADM-5-3-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-3XPDR-NW1-TX-toOpenROADM-5-3-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-5-3</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-3-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-3-SRG1-SRG1-PP1-TX-to-XPONDER-5-3XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-3-SRG1-SRG1-PP1-TX-to-XPONDER-5-3XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-5-3-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-5-3</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-3XPDR-NW1-TX-toOpenROADM-5-3-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-3XPDR-NW2-TX-toOpenROADM-5-3-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-5-3</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-3-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-3-SRG1-SRG1-PP2-TX-to-XPONDER-5-3XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-3-SRG1-SRG1-PP2-TX-to-XPONDER-5-3XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-5-3-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-5-3</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-3XPDR-NW2-TX-toOpenROADM-5-3-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-3XPDR-NW3-TX-toOpenROADM-5-3-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-5-3</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-3-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-3-SRG1-SRG1-PP3-TX-to-XPONDER-5-3XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-3-SRG1-SRG1-PP3-TX-to-XPONDER-5-3XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-5-3-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-5-3</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-3XPDR-NW3-TX-toOpenROADM-5-3-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-3XPDR-NW4-TX-toOpenROADM-5-3-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-5-3</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-3-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-3-SRG1-SRG1-PP4-TX-to-XPONDER-5-3XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-3-SRG1-SRG1-PP4-TX-to-XPONDER-5-3XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-5-3-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-5-3</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-3XPDR-NW4-TX-toOpenROADM-5-3-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-4-DEG1-DEG1-CTP-TXtoOpenROADM-5-4-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-4-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-4-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-4-DEG2-DEG2-CTP-TXtoOpenROADM-5-4-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-4-DEG1-DEG1-CTP-TXtoOpenROADM-5-4-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-4-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-4-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-4-DEG3-DEG3-CTP-TXtoOpenROADM-5-4-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-4-SRG1-SRG1-CP-TXtoOpenROADM-5-4-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-5-4-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-4-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-4-DEG1-DEG1-CTP-TXtoOpenROADM-5-4-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-4-DEG1-DEG1-CTP-TXtoOpenROADM-5-4-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-5-4-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-4-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-4-SRG1-SRG1-CP-TXtoOpenROADM-5-4-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-4-DEG2-DEG2-CTP-TXtoOpenROADM-5-4-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-4-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-4-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-4-DEG1-DEG1-CTP-TXtoOpenROADM-5-4-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-4-DEG2-DEG2-CTP-TXtoOpenROADM-5-4-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-4-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-4-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-4-DEG3-DEG3-CTP-TXtoOpenROADM-5-4-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-4-SRG1-SRG1-CP-TXtoOpenROADM-5-4-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-5-4-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-4-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-4-DEG2-DEG2-CTP-TXtoOpenROADM-5-4-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-4-DEG2-DEG2-CTP-TXtoOpenROADM-5-4-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-5-4-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-4-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-4-SRG1-SRG1-CP-TXtoOpenROADM-5-4-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-4-DEG3-DEG3-CTP-TXtoOpenROADM-5-4-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-4-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-4-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-4-DEG1-DEG1-CTP-TXtoOpenROADM-5-4-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-4-DEG3-DEG3-CTP-TXtoOpenROADM-5-4-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-4-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-4-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-4-DEG2-DEG2-CTP-TXtoOpenROADM-5-4-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-4-SRG1-SRG1-CP-TXtoOpenROADM-5-4-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-5-4-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-4-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-4-DEG3-DEG3-CTP-TXtoOpenROADM-5-4-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-4-DEG3-DEG3-CTP-TXtoOpenROADM-5-4-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-5-4-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-4-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-4-SRG1-SRG1-CP-TXtoOpenROADM-5-4-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-4XPDR-NW1-TX-toOpenROADM-5-4-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-5-4</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-4-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-4-SRG1-SRG1-PP1-TX-to-XPONDER-5-4XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-4-SRG1-SRG1-PP1-TX-to-XPONDER-5-4XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-5-4-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-5-4</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-4XPDR-NW1-TX-toOpenROADM-5-4-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-4XPDR-NW2-TX-toOpenROADM-5-4-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-5-4</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-4-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-4-SRG1-SRG1-PP2-TX-to-XPONDER-5-4XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-4-SRG1-SRG1-PP2-TX-to-XPONDER-5-4XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-5-4-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-5-4</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-4XPDR-NW2-TX-toOpenROADM-5-4-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-4XPDR-NW3-TX-toOpenROADM-5-4-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-5-4</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-4-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-4-SRG1-SRG1-PP3-TX-to-XPONDER-5-4XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-4-SRG1-SRG1-PP3-TX-to-XPONDER-5-4XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-5-4-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-5-4</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-4XPDR-NW3-TX-toOpenROADM-5-4-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-4XPDR-NW4-TX-toOpenROADM-5-4-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-5-4</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-4-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-4-SRG1-SRG1-PP4-TX-to-XPONDER-5-4XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-4-SRG1-SRG1-PP4-TX-to-XPONDER-5-4XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-5-4-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-5-4</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-4XPDR-NW4-TX-toOpenROADM-5-4-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-5-1-DEG1-to-OpenROADM-5-2-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG1-to-OpenROADM-5-1-DEG1</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber5152</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-5-1-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-5-2-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-5-2-DEG1-to-OpenROADM-5-1-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG1-to-OpenROADM-5-2-DEG1</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber5251</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-5-2-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-5-1-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-5-2-DEG2-to-OpenROADM-5-3-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-3-DEG2-to-OpenROADM-5-2-DEG2</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber5253</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-5-2-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-5-3-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-5-3-DEG2-to-OpenROADM-5-2-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG2-to-OpenROADM-5-3-DEG2</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber5352</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-5-3-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-5-2-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-5-3-DEG1-to-OpenROADM-5-4-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-4-DEG1-to-OpenROADM-5-3-DEG1</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber5354</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-5-3-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-5-4-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-5-4-DEG1-to-OpenROADM-5-3-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-3-DEG1-to-OpenROADM-5-4-DEG1</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber5453</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-5-4-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-5-3-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-5-4-DEG2-to-OpenROADM-5-1-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG2-to-OpenROADM-5-4-DEG2</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber5451</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-5-4-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-5-1-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-5-1-DEG2-to-OpenROADM-5-4-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-4-DEG2-to-OpenROADM-5-1-DEG2</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber5154</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-5-1-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-5-4-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-1-4-DEG3-to-OpenROADM-2-1-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG3-to-OpenROADM-1-4-DEG3</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber1421</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-1-4-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-2-1-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-2-1-DEG3-to-OpenROADM-1-4-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-4-DEG3-to-OpenROADM-2-1-DEG3</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber2114</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-2-1-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-1-4-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-1-3-DEG3-to-OpenROADM-2-2-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG3-to-OpenROADM-1-3-DEG3</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber1322</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-1-3-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-2-2-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-2-2-DEG3-to-OpenROADM-1-3-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-3-DEG3-to-OpenROADM-2-2-DEG3</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber2213</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-2-2-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-1-3-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-2-4-DEG3-to-OpenROADM-3-1-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG3-to-OpenROADM-2-4-DEG3</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber2431</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-2-4-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-3-1-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-3-1-DEG3-to-OpenROADM-2-4-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-4-DEG3-to-OpenROADM-3-1-DEG3</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber3124</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-3-1-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-2-4-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-2-3-DEG3-to-OpenROADM-3-2-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG3-to-OpenROADM-2-3-DEG3</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber2332</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-2-3-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-3-2-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-   <link-id>OpenROADM-3-2-DEG3-to-OpenROADM-2-3-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-3-DEG3-to-OpenROADM-3-2-DEG3</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber3223</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-3-2-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-2-3-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-3-4-DEG3-to-OpenROADM-4-1-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG3-to-OpenROADM-3-4-DEG3</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber3441</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-3-4-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-4-1-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-4-1-DEG3-to-OpenROADM-3-4-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-4-DEG3-to-OpenROADM-4-1-DEG3</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber4134</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-4-1-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-3-4-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-3-3-DEG3-to-OpenROADM-4-2-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG3-to-OpenROADM-3-3-DEG3</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber3342</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-3-3-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-4-2-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-4-2-DEG3-to-OpenROADM-3-3-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-3-DEG3-to-OpenROADM-4-2-DEG3</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber4233</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-4-2-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-3-3-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-4-4-DEG3-to-OpenROADM-5-1-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG3-to-OpenROADM-4-4-DEG3</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber4451</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-4-4-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-5-1-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-5-1-DEG3-to-OpenROADM-4-4-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-4-DEG3-to-OpenROADM-5-1-DEG3</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber5144</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-5-1-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-4-4-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-4-3-DEG3-to-OpenROADM-5-2-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG3-to-OpenROADM-4-3-DEG3</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber4352</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-4-3-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-5-2-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-5-2-DEG3-to-OpenROADM-4-3-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-3-DEG3-to-OpenROADM-5-2-DEG3</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber5243</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-5-2-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-4-3-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-5-4-DEG3-to-OpenROADM-1-1-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG3-to-OpenROADM-5-4-DEG3</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber5411</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-5-4-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-1-1-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-1-1-DEG3-to-OpenROADM-5-4-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-4-DEG3-to-OpenROADM-1-1-DEG3</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber1154</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-1-1-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-5-4-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-5-3-DEG3-to-OpenROADM-1-2-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG3-to-OpenROADM-5-3-DEG3</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber5312</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-5-3-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-1-2-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-1-2-DEG3-to-OpenROADM-5-3-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-3-DEG3-to-OpenROADM-1-2-DEG3</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber1253</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-1-2-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-5-3-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-</network>
\ No newline at end of file
diff --git a/tests/sample_configs/NW-simple-topology.json b/tests/sample_configs/NW-simple-topology.json
new file mode 100644 (file)
index 0000000..a767c1b
--- /dev/null
@@ -0,0 +1,8405 @@
+{
+    "ietf-network:network": [
+        {
+            "network-id": "openroadm-topology",
+            "ietf-network-topology:link": [
+                {
+                    "link-id": "OpenROADM-5-2-DEG3-to-OpenROADM-1-1-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG3-to-OpenROADM-5-2-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-SRG1-SRG1-PP3-TX-to-XPONDER-5-2XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-5-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-2XPDR-NW3-TX-toOpenROADM-5-2-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-4-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "XPONDER-2-2XPDR-NW4-TX-toOpenROADM-2-2-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-2",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-2-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-SRG1-SRG1-PP4-TX-to-XPONDER-2-2XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-SRG1-SRG1-PP1-TX-to-XPONDER-3-2XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-3-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-2XPDR-NW1-TX-toOpenROADM-3-2-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-3-2XPDR-NW2-TX-toOpenROADM-3-2-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-2",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-3-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-SRG1-SRG1-PP2-TX-to-XPONDER-3-2XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-SRG1-SRG1-PP2-TX-to-XPONDER-1-2XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-1-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-2XPDR-NW2-TX-toOpenROADM-1-2-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-2-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "XPONDER-1-2XPDR-NW4-TX-toOpenROADM-1-2-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-2",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-1-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-SRG1-SRG1-PP4-TX-to-XPONDER-1-2XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-DEG2-to-OpenROADM-3-1-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG2-to-OpenROADM-3-2-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-SRG1-SRG1-PP5-TX-to-XPONDER-4-1XPDR-NW5-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-SRG1",
+                        "source-tp": "SRG1-PP5-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW5-RX",
+                        "dest-node": "XPONDER-4-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-1XPDR-NW5-TX-toOpenROADM-4-1-SRG1-SRG1-PP5-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-5-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-1-2XPDR-NW3-TX-toOpenROADM-1-2-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-2",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-1-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-SRG1-SRG1-PP3-TX-to-XPONDER-1-2XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-SRG1-SRG1-PP2-TX-to-XPONDER-2-2XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-2-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-2XPDR-NW2-TX-toOpenROADM-2-2-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-1-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "XPONDER-3-2XPDR-NW3-TX-toOpenROADM-3-2-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-2",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-3-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-SRG1-SRG1-PP3-TX-to-XPONDER-3-2XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-SRG1-SRG1-PP1-TX-to-XPONDER-4-1XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-4-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-1XPDR-NW1-TX-toOpenROADM-4-1-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-2-1XPDR-NW2-TX-toOpenROADM-2-1-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-1",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-2-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-SRG1-SRG1-PP2-TX-to-XPONDER-2-1XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-SRG1-SRG1-PP3-TX-to-XPONDER-2-2XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-2-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-2XPDR-NW3-TX-toOpenROADM-2-2-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-4-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-SRG1-SRG1-PP1-TX-to-XPONDER-5-2XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-5-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-2XPDR-NW1-TX-toOpenROADM-5-2-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-SRG1-SRG1-PP5-TX-to-XPONDER-4-2XPDR-NW5-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-SRG1",
+                        "source-tp": "SRG1-PP5-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW5-RX",
+                        "dest-node": "XPONDER-4-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-2XPDR-NW5-TX-toOpenROADM-4-2-SRG1-SRG1-PP5-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-SRG1-SRG1-PP4-TX-to-XPONDER-4-1XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-4-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-1XPDR-NW4-TX-toOpenROADM-4-1-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG3-to-OpenROADM-2-2-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG3-to-OpenROADM-3-1-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-2-1XPDR-NW3-TX-toOpenROADM-2-1-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-1",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-2-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-SRG1-SRG1-PP3-TX-to-XPONDER-2-1XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-2-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "XPONDER-4-2XPDR-NW2-TX-toOpenROADM-4-2-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-2",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-4-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-SRG1-SRG1-PP2-TX-to-XPONDER-4-2XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-1-1XPDR-NW1-TX-toOpenROADM-1-1-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-1",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-1-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-SRG1-SRG1-PP1-TX-to-XPONDER-1-1XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG2-to-OpenROADM-4-2-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG2-to-OpenROADM-4-1-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-3-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "XPONDER-5-1XPDR-NW4-TX-toOpenROADM-5-1-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-1",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-5-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-SRG1-SRG1-PP4-TX-to-XPONDER-5-1XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-SRG1-SRG1-PP1-TX-to-XPONDER-2-2XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-2-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-2XPDR-NW1-TX-toOpenROADM-2-2-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG2-to-OpenROADM-1-2-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG2"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG2-to-OpenROADM-1-1-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber1112b",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-1-2-SRG1-SRG1-PP4-TX-to-XPONDER-1-2XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-1-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-2XPDR-NW4-TX-toOpenROADM-1-2-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "XPONDER-3-1XPDR-NW5-TX-toOpenROADM-3-1-SRG1-SRG1-PP5-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-1",
+                        "source-tp": "XPDR-NW5-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP5-RX",
+                        "dest-node": "OpenROADM-3-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-SRG1-SRG1-PP5-TX-to-XPONDER-3-1XPDR-NW5-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-5-2XPDR-NW3-TX-toOpenROADM-5-2-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-2",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-5-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-SRG1-SRG1-PP3-TX-to-XPONDER-5-2XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-1-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "XPONDER-5-1XPDR-NW3-TX-toOpenROADM-5-1-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-1",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-5-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-SRG1-SRG1-PP3-TX-to-XPONDER-5-1XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG2-to-OpenROADM-2-2-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG2-to-OpenROADM-2-1-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG1-to-OpenROADM-5-2-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG1-to-OpenROADM-5-1-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-5-1XPDR-NW2-TX-toOpenROADM-5-1-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-1",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-5-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-SRG1-SRG1-PP2-TX-to-XPONDER-5-1XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-2-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-SRG1-SRG1-PP4-TX-to-XPONDER-3-1XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-3-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-1XPDR-NW4-TX-toOpenROADM-3-1-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "XPONDER-3-2XPDR-NW1-TX-toOpenROADM-3-2-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-2",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-3-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-SRG1-SRG1-PP1-TX-to-XPONDER-3-2XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-3-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-DEG3-to-OpenROADM-4-1-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG3-to-OpenROADM-3-2-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-5-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "XPONDER-1-1XPDR-NW3-TX-toOpenROADM-1-1-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-1",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-1-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-SRG1-SRG1-PP3-TX-to-XPONDER-1-1XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-SRG1-SRG1-PP3-TX-to-XPONDER-4-2XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-4-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-2XPDR-NW3-TX-toOpenROADM-4-2-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-4-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-SRG1-SRG1-PP2-TX-to-XPONDER-5-2XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-5-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-2XPDR-NW2-TX-toOpenROADM-5-2-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-2-2XPDR-NW5-TX-toOpenROADM-2-2-SRG1-SRG1-PP5-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-2",
+                        "source-tp": "XPDR-NW5-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP5-RX",
+                        "dest-node": "OpenROADM-2-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-SRG1-SRG1-PP5-TX-to-XPONDER-2-2XPDR-NW5-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-SRG1-SRG1-PP3-TX-to-XPONDER-2-1XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-2-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-1XPDR-NW3-TX-toOpenROADM-2-1-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-SRG1-SRG1-PP5-TX-to-XPONDER-3-1XPDR-NW5-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-SRG1",
+                        "source-tp": "SRG1-PP5-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW5-RX",
+                        "dest-node": "XPONDER-3-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-1XPDR-NW5-TX-toOpenROADM-3-1-SRG1-SRG1-PP5-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "XPONDER-5-2XPDR-NW4-TX-toOpenROADM-5-2-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-2",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-5-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-SRG1-SRG1-PP4-TX-to-XPONDER-5-2XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-SRG1-SRG1-PP2-TX-to-XPONDER-4-2XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-4-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-2XPDR-NW2-TX-toOpenROADM-4-2-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-2-2XPDR-NW3-TX-toOpenROADM-2-2-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-2",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-2-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-SRG1-SRG1-PP3-TX-to-XPONDER-2-2XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "XPONDER-1-2XPDR-NW1-TX-toOpenROADM-1-2-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-2",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-1-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-SRG1-SRG1-PP1-TX-to-XPONDER-1-2XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-2-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "XPONDER-3-1XPDR-NW3-TX-toOpenROADM-3-1-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-1",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-3-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-SRG1-SRG1-PP3-TX-to-XPONDER-3-1XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-1-2XPDR-NW2-TX-toOpenROADM-1-2-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-2",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-1-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-SRG1-SRG1-PP2-TX-to-XPONDER-1-2XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "XPONDER-3-1XPDR-NW1-TX-toOpenROADM-3-1-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-1",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-3-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-SRG1-SRG1-PP1-TX-to-XPONDER-3-1XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-1-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-SRG1-SRG1-PP4-TX-to-XPONDER-2-1XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-2-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-1XPDR-NW4-TX-toOpenROADM-2-1-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG3-to-OpenROADM-4-2-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG3-to-OpenROADM-5-1-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-2-1XPDR-NW1-TX-toOpenROADM-2-1-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-1",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-2-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-SRG1-SRG1-PP1-TX-to-XPONDER-2-1XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-SRG1-SRG1-PP1-TX-to-XPONDER-1-1XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-1-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-1XPDR-NW1-TX-toOpenROADM-1-1-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "XPONDER-4-1XPDR-NW5-TX-toOpenROADM-4-1-SRG1-SRG1-PP5-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-1",
+                        "source-tp": "XPDR-NW5-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP5-RX",
+                        "dest-node": "OpenROADM-4-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-SRG1-SRG1-PP5-TX-to-XPONDER-4-1XPDR-NW5-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-DEG1-to-OpenROADM-3-1-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG1-to-OpenROADM-3-2-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-4-1-SRG1-SRG1-PP3-TX-to-XPONDER-4-1XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-4-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-1XPDR-NW3-TX-toOpenROADM-4-1-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG3-to-OpenROADM-2-1-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG3-to-OpenROADM-1-2-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-4-2XPDR-NW3-TX-toOpenROADM-4-2-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-2",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-4-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-SRG1-SRG1-PP3-TX-to-XPONDER-4-2XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-SRG1-SRG1-PP5-TX-to-XPONDER-5-1XPDR-NW5-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-SRG1",
+                        "source-tp": "SRG1-PP5-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW5-RX",
+                        "dest-node": "XPONDER-5-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-1XPDR-NW5-TX-toOpenROADM-5-1-SRG1-SRG1-PP5-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-SRG1-SRG1-PP5-TX-to-XPONDER-5-2XPDR-NW5-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-SRG1",
+                        "source-tp": "SRG1-PP5-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW5-RX",
+                        "dest-node": "XPONDER-5-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-2XPDR-NW5-TX-toOpenROADM-5-2-SRG1-SRG1-PP5-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-4-2XPDR-NW5-TX-toOpenROADM-4-2-SRG1-SRG1-PP5-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-2",
+                        "source-tp": "XPDR-NW5-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP5-RX",
+                        "dest-node": "OpenROADM-4-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-SRG1-SRG1-PP5-TX-to-XPONDER-4-2XPDR-NW5-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG1-to-OpenROADM-1-2-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG1"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG1-to-OpenROADM-1-1-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber1112a",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-1-1-SRG1-SRG1-PP3-TX-to-XPONDER-1-1XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-1-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-1XPDR-NW3-TX-toOpenROADM-1-1-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-SRG1-SRG1-PP4-TX-to-XPONDER-1-1XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-1-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-1XPDR-NW4-TX-toOpenROADM-1-1-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "XPONDER-4-2XPDR-NW4-TX-toOpenROADM-4-2-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-2",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-4-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-SRG1-SRG1-PP4-TX-to-XPONDER-4-2XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "XPONDER-2-2XPDR-NW2-TX-toOpenROADM-2-2-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-2",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-2-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-SRG1-SRG1-PP2-TX-to-XPONDER-2-2XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-3-2XPDR-NW5-TX-toOpenROADM-3-2-SRG1-SRG1-PP5-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-2",
+                        "source-tp": "XPDR-NW5-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP5-RX",
+                        "dest-node": "OpenROADM-3-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-SRG1-SRG1-PP5-TX-to-XPONDER-3-2XPDR-NW5-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "XPONDER-3-2XPDR-NW4-TX-toOpenROADM-3-2-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-2",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-3-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-SRG1-SRG1-PP4-TX-to-XPONDER-3-2XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "XPONDER-2-1XPDR-NW5-TX-toOpenROADM-2-1-SRG1-SRG1-PP5-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-1",
+                        "source-tp": "XPDR-NW5-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP5-RX",
+                        "dest-node": "OpenROADM-2-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-SRG1-SRG1-PP5-TX-to-XPONDER-2-1XPDR-NW5-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-3-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG1-to-OpenROADM-1-1-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG1"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG1-to-OpenROADM-1-2-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber1211a",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-3-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-DEG2-to-OpenROADM-5-1-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG2-to-OpenROADM-5-2-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-4-1XPDR-NW2-TX-toOpenROADM-4-1-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-1",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-4-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-SRG1-SRG1-PP2-TX-to-XPONDER-4-1XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-SRG1-SRG1-PP1-TX-to-XPONDER-3-1XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-3-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-1XPDR-NW1-TX-toOpenROADM-3-1-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-SRG1-SRG1-PP2-TX-to-XPONDER-2-1XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-2-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-1XPDR-NW2-TX-toOpenROADM-2-1-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "XPONDER-3-1XPDR-NW2-TX-toOpenROADM-3-1-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-1",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-3-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-SRG1-SRG1-PP2-TX-to-XPONDER-3-1XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-SRG1-SRG1-PP5-TX-to-XPONDER-1-1XPDR-NW5-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-SRG1",
+                        "source-tp": "SRG1-PP5-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW5-RX",
+                        "dest-node": "XPONDER-1-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-1XPDR-NW5-TX-toOpenROADM-1-1-SRG1-SRG1-PP5-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG1-to-OpenROADM-2-1-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG1-to-OpenROADM-2-2-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-1-1XPDR-NW4-TX-toOpenROADM-1-1-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-1",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-1-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-SRG1-SRG1-PP4-TX-to-XPONDER-1-1XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG2-to-OpenROADM-4-1-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG2-to-OpenROADM-4-2-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-SRG1-SRG1-PP2-TX-to-XPONDER-4-1XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-4-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-1XPDR-NW2-TX-toOpenROADM-4-1-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-4-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG2-to-OpenROADM-1-1-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG2"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG2-to-OpenROADM-1-2-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:clfi": "fiber1211b",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-5-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "XPONDER-2-1XPDR-NW4-TX-toOpenROADM-2-1-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-1",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-2-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-SRG1-SRG1-PP4-TX-to-XPONDER-2-1XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-4-2XPDR-NW1-TX-toOpenROADM-4-2-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-2",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-4-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-SRG1-SRG1-PP1-TX-to-XPONDER-4-2XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG1-to-OpenROADM-4-1-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG1-to-OpenROADM-4-2-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-4-1XPDR-NW3-TX-toOpenROADM-4-1-SRG1-SRG1-PP3-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-1",
+                        "source-tp": "XPDR-NW3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP3-RX",
+                        "dest-node": "OpenROADM-4-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-SRG1-SRG1-PP3-TX-to-XPONDER-4-1XPDR-NW3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-1-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG3-to-OpenROADM-5-2-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG3-to-OpenROADM-1-1-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-5-2XPDR-NW1-TX-toOpenROADM-5-2-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-2",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-5-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-SRG1-SRG1-PP1-TX-to-XPONDER-5-2XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG3-to-OpenROADM-3-2-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG3-to-OpenROADM-4-1-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-3-1-SRG1-SRG1-PP2-TX-to-XPONDER-3-1XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-3-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-1XPDR-NW2-TX-toOpenROADM-3-1-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-SRG1-SRG1-PP4-TX-to-XPONDER-5-2XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-5-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-2XPDR-NW4-TX-toOpenROADM-5-2-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-SRG1-SRG1-PP4-TX-to-XPONDER-5-1XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-5-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-1XPDR-NW4-TX-toOpenROADM-5-1-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-SRG1-SRG1-PP3-TX-to-XPONDER-5-1XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-5-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-1XPDR-NW3-TX-toOpenROADM-5-1-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "XPONDER-5-2XPDR-NW5-TX-toOpenROADM-5-2-SRG1-SRG1-PP5-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-2",
+                        "source-tp": "XPDR-NW5-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP5-RX",
+                        "dest-node": "OpenROADM-5-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-SRG1-SRG1-PP5-TX-to-XPONDER-5-2XPDR-NW5-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "XPONDER-1-1XPDR-NW5-TX-toOpenROADM-1-1-SRG1-SRG1-PP5-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-1",
+                        "source-tp": "XPDR-NW5-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP5-RX",
+                        "dest-node": "OpenROADM-1-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-SRG1-SRG1-PP5-TX-to-XPONDER-1-1XPDR-NW5-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-SRG1-SRG1-PP3-TX-to-XPONDER-3-1XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-3-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-1XPDR-NW3-TX-toOpenROADM-3-1-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "XPONDER-4-1XPDR-NW4-TX-toOpenROADM-4-1-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-1",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-4-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-SRG1-SRG1-PP4-TX-to-XPONDER-4-1XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-SRG1-SRG1-PP1-TX-to-XPONDER-1-2XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-1-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-2XPDR-NW1-TX-toOpenROADM-1-2-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-DEG1-to-OpenROADM-5-1-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG1-to-OpenROADM-5-2-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-SRG1-SRG1-PP5-TX-to-XPONDER-3-2XPDR-NW5-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-SRG1",
+                        "source-tp": "SRG1-PP5-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW5-RX",
+                        "dest-node": "XPONDER-3-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-2XPDR-NW5-TX-toOpenROADM-3-2-SRG1-SRG1-PP5-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG1-to-OpenROADM-2-2-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG1-to-OpenROADM-2-1-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-5-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG2-to-OpenROADM-3-2-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG2-to-OpenROADM-3-1-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-2-1-SRG1-SRG1-PP1-TX-to-XPONDER-2-1XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-2-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-1XPDR-NW1-TX-toOpenROADM-2-1-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-2-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG1-to-OpenROADM-4-2-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG1-to-OpenROADM-4-1-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-1-2-SRG1-SRG1-PP3-TX-to-XPONDER-1-2XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-1-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-2XPDR-NW3-TX-toOpenROADM-1-2-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-3-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-SRG1-SRG1-PP5-TX-to-XPONDER-1-2XPDR-NW5-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-SRG1",
+                        "source-tp": "SRG1-PP5-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW5-RX",
+                        "dest-node": "XPONDER-1-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-2XPDR-NW5-TX-toOpenROADM-1-2-SRG1-SRG1-PP5-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-5-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-2-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-5-2XPDR-NW2-TX-toOpenROADM-5-2-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-2",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-5-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-SRG1-SRG1-PP2-TX-to-XPONDER-5-2XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-1-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-4-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "XPONDER-4-1XPDR-NW1-TX-toOpenROADM-4-1-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-4-1",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-4-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-SRG1-SRG1-PP1-TX-to-XPONDER-4-1XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-SRG1-SRG1-PP2-TX-to-XPONDER-5-1XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-5-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-1XPDR-NW2-TX-toOpenROADM-5-1-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "XPONDER-1-1XPDR-NW2-TX-toOpenROADM-1-1-SRG1-SRG1-PP2-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-1",
+                        "source-tp": "XPDR-NW2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP2-RX",
+                        "dest-node": "OpenROADM-1-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-SRG1-SRG1-PP2-TX-to-XPONDER-1-1XPDR-NW2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-4-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-SRG1-SRG1-PP4-TX-to-XPONDER-3-2XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-3-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-2XPDR-NW4-TX-toOpenROADM-3-2-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG1-to-OpenROADM-3-2-DEG1",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG1",
+                        "source-tp": "DEG1-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG1-to-OpenROADM-3-1-DEG1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-5-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-SRG1-SRG1-PP2-TX-to-XPONDER-3-2XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-3-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-2XPDR-NW2-TX-toOpenROADM-3-2-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG3-to-OpenROADM-3-1-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG3-to-OpenROADM-2-2-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG2-to-OpenROADM-5-2-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG2-to-OpenROADM-5-1-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG3-to-OpenROADM-5-1-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG3-to-OpenROADM-4-2-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "XPONDER-5-1XPDR-NW5-TX-toOpenROADM-5-1-SRG1-SRG1-PP5-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-1",
+                        "source-tp": "XPDR-NW5-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP5-RX",
+                        "dest-node": "OpenROADM-5-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-SRG1-SRG1-PP5-TX-to-XPONDER-5-1XPDR-NW5-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-4-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "XPONDER-5-1XPDR-NW1-TX-toOpenROADM-5-1-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-5-1",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-5-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-SRG1-SRG1-PP1-TX-to-XPONDER-5-1XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-3-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-1-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPONDER-1-2XPDR-NW5-TX-toOpenROADM-1-2-SRG1-SRG1-PP5-RX",
+                    "source": {
+                        "source-node": "XPONDER-1-2",
+                        "source-tp": "XPDR-NW5-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP5-RX",
+                        "dest-node": "OpenROADM-1-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-SRG1-SRG1-PP5-TX-to-XPONDER-1-2XPDR-NW5-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG2-to-OpenROADM-2-1-DEG2",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG2",
+                        "source-tp": "DEG2-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-RX",
+                        "dest-node": "OpenROADM-2-1-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-1-DEG2-to-OpenROADM-2-2-DEG2",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-1-1-SRG1-SRG1-PP2-TX-to-XPONDER-1-1XPDR-NW2-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-1-SRG1",
+                        "source-tp": "SRG1-PP2-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW2-RX",
+                        "dest-node": "XPONDER-1-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-1-1XPDR-NW2-TX-toOpenROADM-1-1-SRG1-SRG1-PP2-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-SRG1-SRG1-PP1-TX-to-XPONDER-5-1XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-5-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-5-1XPDR-NW1-TX-toOpenROADM-5-1-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG1",
+                        "source-tp": "DEG1-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-1-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-5-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-3-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-SRG1-SRG1-PP4-TX-to-XPONDER-2-2XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-2-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-2XPDR-NW4-TX-toOpenROADM-2-2-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-4-2-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-3-2-SRG1-SRG1-PP3-TX-to-XPONDER-3-2XPDR-NW3-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-2-SRG1",
+                        "source-tp": "SRG1-PP3-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW3-RX",
+                        "dest-node": "XPONDER-3-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-3-2XPDR-NW3-TX-toOpenROADM-3-2-SRG1-SRG1-PP3-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-SRG1-SRG1-PP5-TX-to-XPONDER-2-2XPDR-NW5-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-SRG1",
+                        "source-tp": "SRG1-PP5-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW5-RX",
+                        "dest-node": "XPONDER-2-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-2XPDR-NW5-TX-toOpenROADM-2-2-SRG1-SRG1-PP5-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-1-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-RX",
+                        "dest-node": "OpenROADM-1-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-DEG3-to-OpenROADM-1-2-DEG3",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-DEG3",
+                        "source-tp": "DEG3-TTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-TTP-RX",
+                        "dest-node": "OpenROADM-1-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-1-2-DEG3-to-OpenROADM-2-1-DEG3",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "OpenROADM-4-2-SRG1-SRG1-PP1-TX-to-XPONDER-4-2XPDR-NW1-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-SRG1",
+                        "source-tp": "SRG1-PP1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW1-RX",
+                        "dest-node": "XPONDER-4-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-2XPDR-NW1-TX-toOpenROADM-4-2-SRG1-SRG1-PP1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-3-1-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-RX",
+                        "dest-node": "OpenROADM-3-1-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-SRG1",
+                        "source-tp": "SRG1-CP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-4-2-SRG1-SRG1-PP4-TX-to-XPONDER-4-2XPDR-NW4-RX",
+                    "source": {
+                        "source-node": "OpenROADM-4-2-SRG1",
+                        "source-tp": "SRG1-PP4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW4-RX",
+                        "dest-node": "XPONDER-4-2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-4-2XPDR-NW4-TX-toOpenROADM-4-2-SRG1-SRG1-PP4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "XPONDER-3-1XPDR-NW4-TX-toOpenROADM-3-1-SRG1-SRG1-PP4-RX",
+                    "source": {
+                        "source-node": "XPONDER-3-1",
+                        "source-tp": "XPDR-NW4-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP4-RX",
+                        "dest-node": "OpenROADM-3-1-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-3-1-SRG1-SRG1-PP4-TX-to-XPONDER-3-1XPDR-NW4-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-2-DEG3",
+                        "source-tp": "DEG3-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-RX",
+                        "dest-node": "OpenROADM-2-2-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "OpenROADM-2-1-SRG1-SRG1-PP5-TX-to-XPONDER-2-1XPDR-NW5-RX",
+                    "source": {
+                        "source-node": "OpenROADM-2-1-SRG1",
+                        "source-tp": "SRG1-PP5-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR-NW5-RX",
+                        "dest-node": "XPONDER-2-1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPONDER-2-1XPDR-NW5-TX-toOpenROADM-2-1-SRG1-SRG1-PP5-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "XPONDER-2-2XPDR-NW1-TX-toOpenROADM-2-2-SRG1-SRG1-PP1-RX",
+                    "source": {
+                        "source-node": "XPONDER-2-2",
+                        "source-tp": "XPDR-NW1-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-RX",
+                        "dest-node": "OpenROADM-2-2-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-2-2-SRG1-SRG1-PP1-TX-to-XPONDER-2-2XPDR-NW1-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX",
+                    "source": {
+                        "source-node": "OpenROADM-5-2-DEG2",
+                        "source-tp": "DEG2-CTP-TX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG3-CTP-RX",
+                        "dest-node": "OpenROADM-5-2-DEG3"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                }
+            ],
+            "node": [
+                {
+                    "node-id": "OpenROADM-5-1-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli51"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-1-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli41"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-5-1-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli51"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-1-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli41"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-5-1-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli51"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-1-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli31"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-2-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli12"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-2-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli12"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-2-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli22"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-2-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli12"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-2-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli22"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-2-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli32"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-2-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli32"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-2-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli22"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-2-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli32"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-1-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli21"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-1-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli11"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-1-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli21"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-1-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli11"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-1-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli31"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-1-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli11"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-1-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli21"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-1-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli31"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-1-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli41"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-3-1",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW5-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW5-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-5",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-1",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-2",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-3",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-4",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-3-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE3"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-3-2",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW5-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW5-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-5",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-1",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-2",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-3",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-4",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-3-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE3"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-5-1",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW5-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW5-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-5",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-1",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-2",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-3",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-4",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE5"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-5-1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-5-2",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-network-topology:xpdr-network-attributes": {
+                                "tail-equipment-id": "Client-4"
+                            },
+                            "org-openroadm-network-topology:xpdr-client-attributes": {
+                                "tail-equipment-id": "XPDR-NW4-RX"
+                            }
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-network-topology:xpdr-network-attributes": {
+                                "tail-equipment-id": "Client-3"
+                            },
+                            "org-openroadm-network-topology:xpdr-client-attributes": {
+                                "tail-equipment-id": "XPDR-NW3-RX"
+                            }
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-network-topology:xpdr-network-attributes": {
+                                "tail-equipment-id": "Client-1"
+                            },
+                            "org-openroadm-network-topology:xpdr-client-attributes": {
+                                "tail-equipment-id": "XPDR-NW1-RX"
+                            }
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-network-topology:xpdr-network-attributes": {
+                                "tail-equipment-id": "Client-2"
+                            },
+                            "org-openroadm-network-topology:xpdr-client-attributes": {
+                                "tail-equipment-id": "XPDR-NW2-RX"
+                            }
+                        },
+                        {
+                            "tp-id": "XPDR-NW5-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-network-topology:xpdr-network-attributes": {
+                                "tail-equipment-id": "Client-5"
+                            },
+                            "org-openroadm-network-topology:xpdr-client-attributes": {
+                                "tail-equipment-id": "XPDR-NW5-TX"
+                            }
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-network-topology:xpdr-network-attributes": {
+                                "tail-equipment-id": "Client-1"
+                            },
+                            "org-openroadm-network-topology:xpdr-client-attributes": {
+                                "tail-equipment-id": "XPDR-NW1-TX"
+                            }
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-network-topology:xpdr-network-attributes": {
+                                "tail-equipment-id": "Client-4"
+                            },
+                            "org-openroadm-network-topology:xpdr-client-attributes": {
+                                "tail-equipment-id": "XPDR-NW4-TX"
+                            }
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-network-topology:xpdr-network-attributes": {
+                                "tail-equipment-id": "Client-2"
+                            },
+                            "org-openroadm-network-topology:xpdr-client-attributes": {
+                                "tail-equipment-id": "XPDR-NW2-TX"
+                            }
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-network-topology:xpdr-network-attributes": {
+                                "tail-equipment-id": "Client-3"
+                            },
+                            "org-openroadm-network-topology:xpdr-client-attributes": {
+                                "tail-equipment-id": "XPDR-NW3-TX"
+                            }
+                        },
+                        {
+                            "tp-id": "XPDR-NW5-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-network-topology:xpdr-network-attributes": {
+                                "tail-equipment-id": "Client-5"
+                            },
+                            "org-openroadm-network-topology:xpdr-client-attributes": {
+                                "tail-equipment-id": "XPDR-NW5-RX"
+                            }
+                        },
+                        {
+                            "tp-id": "Client-5",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-network-topology:xpdr-client-attributes": {
+                                "tail-equipment-id": "XPDR-NW5"
+                            }
+                        },
+                        {
+                            "tp-id": "Client-1",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-network-topology:xpdr-client-attributes": {
+                                "tail-equipment-id": "XPDR-NW1"
+                            }
+                        },
+                        {
+                            "tp-id": "Client-2",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-network-topology:xpdr-client-attributes": {
+                                "tail-equipment-id": "XPDR-NW2"
+                            }
+                        },
+                        {
+                            "tp-id": "Client-3",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-network-topology:xpdr-client-attributes": {
+                                "tail-equipment-id": "XPDR-NW3"
+                            }
+                        },
+                        {
+                            "tp-id": "Client-4",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-network-topology:xpdr-client-attributes": {
+                                "tail-equipment-id": "XPDR-NW4"
+                            }
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE5"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-5-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-1-1",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ]
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW5-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW5-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-5",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-1",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-2",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW2"
+                            ]
+                        },
+                        {
+                            "tp-id": "Client-3",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-4",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "Transport-underlay",
+                            "node-ref": "XPONDER-1-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-1-2",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW5-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW5-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-5",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-1",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-2",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-3",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-4",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-1-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-2-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli42"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-2-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli42"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-2-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli42"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-1-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP5-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP5-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli21"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-1-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP5-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP5-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli41"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-4-2-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP5-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP5-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli42"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-4-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-5-2-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP5-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP5-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli52"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-2-2-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP5-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP5-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli22"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-2-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-2-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP5-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP5-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli12"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-2-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP5-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP5-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli32"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-1-1-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP5-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP5-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli11"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-1-1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-2-2",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW5-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW5-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-5",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-1",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-2",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-3",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-4",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-2-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE2"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-4-1",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW5-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW5-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-5",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-1",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-2",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-3",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-4",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-4-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE4"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-4-2",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW5-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW5-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-5",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-1",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-2",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-3",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-4",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-4-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE4"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPONDER-2-1",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR-NW4-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW5-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW1-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW4-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW2-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW3-TX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR-NW5-RX",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-5",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW5"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-1",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-2",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-3",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW3"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "Client-4",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR-NW4"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "ORANGE2"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPONDER-2-1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-5-2-DEG3",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG3-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG3-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli52"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-5-2-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli52"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-5-2-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-CTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-TTP-RX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-RX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-2"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli52"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-3-1-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP5-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP5-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-3-1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli31"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "OpenROADM-5-1-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP5-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP5-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TX",
+                            "org-openroadm-common-network:tp-type": "SRG-TX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-RX",
+                            "org-openroadm-common-network:tp-type": "SRG-RX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "clli51"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "OpenROADM-5-1"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                }
+            ]
+        }
+    ]
+}
diff --git a/tests/sample_configs/NW-simple-topology.xml b/tests/sample_configs/NW-simple-topology.xml
deleted file mode 100644 (file)
index 646868b..0000000
+++ /dev/null
@@ -1,4939 +0,0 @@
-<network xmlns="urn:ietf:params:xml:ns:yang:ietf-network">
- <network-id>openroadm-topology</network-id>
-<node>    <node-id>OpenROADM-1-1-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli11</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-1-1-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type><administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli11</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-1-1-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli11</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-1-1-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-1</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli11</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">               <tp-id>SRG1-CP-RX</tp-id>  <cp-attributes xmlns="http://org/openroadm/network/topology"></cp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">               <tp-id>SRG1-CP-TX</tp-id>  <cp-attributes xmlns="http://org/openroadm/network/topology"></cp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>              <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP1-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP1-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP2-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP2-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP3-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP3-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>             <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP4-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP4-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP5-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP5-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-</node>
-<node>
-    <node-id>XPONDER-1-1</node-id>
-    <supporting-node>
-        <network-ref>Transport-underlay</network-ref>
-        <node-ref>XPONDER-1-1</node-ref>
-    </supporting-node>
-    <supporting-node>
-        <network-ref>clli-network</network-ref>
-        <node-ref>ORANGE1</node-ref>
-    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-1</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-2</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW2</associated-connection-map-port>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-3</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-4</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW5-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW5-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-5</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-1-2-DEG1</node-id>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli12</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-1-2-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli12</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-1-2-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli12</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-1-2-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-1-2</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli12</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">               <tp-id>SRG1-CP-RX</tp-id>  <cp-attributes xmlns="http://org/openroadm/network/topology"></cp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">               <tp-id>SRG1-CP-TX</tp-id>  <cp-attributes xmlns="http://org/openroadm/network/topology"></cp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP1-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP1-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP2-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP2-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP3-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP3-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP4-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP4-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP5-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP5-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-</node>
-<node>        <node-id>XPONDER-1-2</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-1-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE1</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-1</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-2</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-3</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-4</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW5-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW5-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-5</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-2-1-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli21</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-2-1-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli21</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-2-1-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli21</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-2-1-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-1</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli21</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">               <tp-id>SRG1-CP-RX</tp-id>  <cp-attributes xmlns="http://org/openroadm/network/topology"></cp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>           <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">               <tp-id>SRG1-CP-TX</tp-id>  <cp-attributes xmlns="http://org/openroadm/network/topology"></cp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP1-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP1-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP2-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP2-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP3-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP3-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP4-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP4-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP5-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP5-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-</node>
-<node>        <node-id>XPONDER-2-1</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-2-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE2</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-1</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-2</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-3</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-4</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW5-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW5-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-5</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-2-2-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli22</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-2-2-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli22</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-2-2-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli22</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-2-2-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-2-2</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli22</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAA
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">               <tp-id>SRG1-CP-RX</tp-id>  <cp-attributes xmlns="http://org/openroadm/network/topology"></cp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">               <tp-id>SRG1-CP-TX</tp-id>  <cp-attributes xmlns="http://org/openroadm/network/topology"></cp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP1-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP1-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP2-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP2-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP3-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP3-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP4-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP4-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP5-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP5-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-</node>
-<node>        <node-id>XPONDER-2-2</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-2-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE2</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-1</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-2</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-3</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-4</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW5-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW5-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-5</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-3-1-DEG1</node-id>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli31</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-3-1-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli31</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-3-1-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli31</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-3-1-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli31</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">               <tp-id>SRG1-CP-RX</tp-id>  <cp-attributes xmlns="http://org/openroadm/network/topology"></cp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">               <tp-id>SRG1-CP-TX</tp-id>  <cp-attributes xmlns="http://org/openroadm/network/topology"></cp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP1-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>     <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP1-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP2-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP2-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP3-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP3-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP4-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP4-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP5-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP5-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-</node>
-<node>        <node-id>XPONDER-3-1</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-3-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE3</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-1</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-2</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-3</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-4</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW5-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW5-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-5</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-3-2-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli32</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-3-2-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli32</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-3-2-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli32</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-3-2-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-3-2</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli32</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP////////////8AAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">               <tp-id>SRG1-CP-RX</tp-id>  <cp-attributes xmlns="http://org/openroadm/network/topology"></cp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">               <tp-id>SRG1-CP-TX</tp-id>  <cp-attributes xmlns="http://org/openroadm/network/topology"></cp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP1-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP1-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP2-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP2-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP3-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP3-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP4-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP4-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP5-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP5-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-</node>
-<node>        <node-id>XPONDER-3-2</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-3-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE3</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-1</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-2</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-3</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-4</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW5-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW5-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-5</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-4-1-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli41</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-4-1-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli41</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-4-1-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli41</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-4-1-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-1</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli41</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">               <tp-id>SRG1-CP-RX</tp-id>  <cp-attributes xmlns="http://org/openroadm/network/topology"></cp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">               <tp-id>SRG1-CP-TX</tp-id>  <cp-attributes xmlns="http://org/openroadm/network/topology"></cp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP1-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP1-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP2-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP2-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP3-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP3-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP4-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP4-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP5-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP5-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-</node>
-<node>        <node-id>XPONDER-4-1</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-4-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE4</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-1</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-2</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-3</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-4</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW5-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW5-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-5</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-4-2-DEG1</node-id>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>s>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli42</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-4-2-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli42</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-4-2-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli42</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-4-2-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-4-2</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli42</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/////////////AAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">               <tp-id>SRG1-CP-RX</tp-id>  <cp-attributes xmlns="http://org/openroadm/network/topology"></cp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">               <tp-id>SRG1-CP-TX</tp-id>  <cp-attributes xmlns="http://org/openroadm/network/topology"></cp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>              <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP1-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP1-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP2-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP2-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP3-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP3-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP4-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP4-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>              <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP5-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP5-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-</node>
-<node>        <node-id>XPONDER-4-2</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-4-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE4</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-1</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-2</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-3</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-4</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW5-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW5-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-5</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-5-1-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli51</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-5-1-DEG2</node-id>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli51</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-5-1-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli51</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-5-1-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-1</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli51</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">               <tp-id>SRG1-CP-RX</tp-id>  <cp-attributes xmlns="http://org/openroadm/network/topology"></cp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>              <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">               <tp-id>SRG1-CP-TX</tp-id>  <cp-attributes xmlns="http://org/openroadm/network/topology"></cp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP1-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP1-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP2-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP2-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP3-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP3-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP4-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP4-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP5-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP5-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-</node>
-<node>        <node-id>XPONDER-5-1</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-5-1</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE5</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW1-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-1</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW1</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW2-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-2</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW2</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW3-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-3</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW3</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW4-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-4</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW4</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW5-RX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>XPDR-NW5-TX</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">Client-5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <tp-id>Client-5</tp-id>
-        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-        <associated-connection-map-port xmlns="http://transportpce/topology">XPDR-NW5</associated-connection-map-port>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-</node>
-<node>    <node-id>OpenROADM-5-2-DEG1</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG1-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli52</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-5-2-DEG2</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG2-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli52</node-ref>    </supporting-node></node>
-<node>    <node-id>OpenROADM-5-2-DEG3</node-id>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-CTP-TX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-CTP-RX</tp-id>  <ctp-attributes xmlns="http://org/openroadm/network/topology"></ctp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-CTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-TTP-RX</tp-id>  <rx-ttp-attributes xmlns="http://org/openroadm/network/topology"></rx-ttp-attributes>
-  <tp-type xmlns="http://org/openroadm/common/network">DEGREE-RX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-    <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology"> <tp-id>DEG3-TTP-TX</tp-id>  <tx-ttp-attributes xmlns="http://org/openroadm/network/topology"></tx-ttp-attributes>
-    <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TX-TTP</tp-type> <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </termination-point>
-  <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </degree-attributes>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>clli52</node-ref>    </supporting-node></node>
-<node>   <node-id>OpenROADM-5-2-SRG1</node-id>     <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <supporting-node><network-ref>openroadm-network</network-ref><node-ref>OpenROADM-5-2</node-ref>    </supporting-node>
-        <supporting-node><network-ref>clli-network</network-ref><node-ref>clli52</node-ref>    </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////////////wAAAAAAAAAA
-                </freq-map>
-            </avail-freq-maps>
-        </srg-attributes>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">               <tp-id>SRG1-CP-RX</tp-id>  <cp-attributes xmlns="http://org/openroadm/network/topology"></cp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-CP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">               <tp-id>SRG1-CP-TX</tp-id>  <cp-attributes xmlns="http://org/openroadm/network/topology"></cp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-CP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP1-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP1-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP2-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP2-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP3-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP3-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP4-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP4-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <tp-id>SRG1-PP5-RX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-RX-PP</tp-type>        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">                   <tp-id>SRG1-PP5-TX</tp-id>  <pp-attributes xmlns="http://org/openroadm/network/topology"></pp-attributes>
-   <tp-type xmlns="http://org/openroadm/common/network">SRG-TX-PP</tp-type>               <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</termination-point>
-</node>
-<node>        <node-id>XPONDER-5-2</node-id>
-    <supporting-node><network-ref>openroadm-network</network-ref><node-ref>XPONDER-5-2</node-ref>    </supporting-node>
-    <supporting-node><network-ref>clli-network</network-ref><node-ref>ORANGE5</node-ref>    </supporting-node>
-    <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">    <tp-id>XPDR-NW1-RX</tp-id>        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <xpdr-network-attributes xmlns="http://org/openroadm/network/topology">
-        <tail-equipment-id>Client-1</tail-equipment-id></xpdr-network-attributes>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <xpdr-client-attributes xmlns="http://org/openroadm/network/topology">        <tail-equipment-id>XPDR-NW1-RX</tail-equipment-id>        </xpdr-client-attributes></termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">    <tp-id>XPDR-NW1-TX</tp-id>        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <xpdr-network-attributes xmlns="http://org/openroadm/network/topology">
-        <tail-equipment-id>Client-1</tail-equipment-id></xpdr-network-attributes>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <xpdr-client-attributes xmlns="http://org/openroadm/network/topology">        <tail-equipment-id>XPDR-NW1-TX</tail-equipment-id>        </xpdr-client-attributes></termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">    <tp-id>Client-1</tp-id>        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <xpdr-client-attributes xmlns="http://org/openroadm/network/topology">        <tail-equipment-id>XPDR-NW1</tail-equipment-id>        </xpdr-client-attributes> </termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">    <tp-id>XPDR-NW2-RX</tp-id>        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <xpdr-network-attributes xmlns="http://org/openroadm/network/topology">
-        <tail-equipment-id>Client-2</tail-equipment-id></xpdr-network-attributes>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <xpdr-client-attributes xmlns="http://org/openroadm/network/topology">        <tail-equipment-id>XPDR-NW2-RX</tail-equipment-id>        </xpdr-client-attributes></termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">    <tp-id>XPDR-NW2-TX</tp-id>        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <xpdr-network-attributes xmlns="http://org/openroadm/network/topology">
-        <tail-equipment-id>Client-2</tail-equipment-id></xpdr-network-attributes>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <xpdr-client-attributes xmlns="http://org/openroadm/network/topology">        <tail-equipment-id>XPDR-NW2-TX</tail-equipment-id>        </xpdr-client-attributes></termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">    <tp-id>Client-2</tp-id>        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <xpdr-client-attributes xmlns="http://org/openroadm/network/topology">        <tail-equipment-id>XPDR-NW2</tail-equipment-id>        </xpdr-client-attributes> </termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">    <tp-id>XPDR-NW3-RX</tp-id>        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <xpdr-network-attributes xmlns="http://org/openroadm/network/topology">
-        <tail-equipment-id>Client-3</tail-equipment-id></xpdr-network-attributes>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <xpdr-client-attributes xmlns="http://org/openroadm/network/topology">        <tail-equipment-id>XPDR-NW3-RX</tail-equipment-id>        </xpdr-client-attributes></termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">    <tp-id>XPDR-NW3-TX</tp-id>        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <xpdr-network-attributes xmlns="http://org/openroadm/network/topology">
-        <tail-equipment-id>Client-3</tail-equipment-id></xpdr-network-attributes>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <xpdr-client-attributes xmlns="http://org/openroadm/network/topology">        <tail-equipment-id>XPDR-NW3-TX</tail-equipment-id>        </xpdr-client-attributes></termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">    <tp-id>Client-3</tp-id>        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <xpdr-client-attributes xmlns="http://org/openroadm/network/topology">        <tail-equipment-id>XPDR-NW3</tail-equipment-id>        </xpdr-client-attributes> </termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">    <tp-id>XPDR-NW4-RX</tp-id>        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <xpdr-network-attributes xmlns="http://org/openroadm/network/topology">
-        <tail-equipment-id>Client-4</tail-equipment-id></xpdr-network-attributes>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <xpdr-client-attributes xmlns="http://org/openroadm/network/topology">        <tail-equipment-id>XPDR-NW4-RX</tail-equipment-id>        </xpdr-client-attributes></termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">    <tp-id>XPDR-NW4-TX</tp-id>        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <xpdr-network-attributes xmlns="http://org/openroadm/network/topology">
-        <tail-equipment-id>Client-4</tail-equipment-id></xpdr-network-attributes>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <xpdr-client-attributes xmlns="http://org/openroadm/network/topology">        <tail-equipment-id>XPDR-NW4-TX</tail-equipment-id>        </xpdr-client-attributes></termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">    <tp-id>Client-4</tp-id>        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <xpdr-client-attributes xmlns="http://org/openroadm/network/topology">        <tail-equipment-id>XPDR-NW4</tail-equipment-id>        </xpdr-client-attributes> </termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">    <tp-id>XPDR-NW5-RX</tp-id>        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <xpdr-network-attributes xmlns="http://org/openroadm/network/topology">
-        <tail-equipment-id>Client-5</tail-equipment-id></xpdr-network-attributes>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <xpdr-client-attributes xmlns="http://org/openroadm/network/topology">        <tail-equipment-id>XPDR-NW5-RX</tail-equipment-id>        </xpdr-client-attributes></termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">    <tp-id>XPDR-NW5-TX</tp-id>        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-        <xpdr-network-attributes xmlns="http://org/openroadm/network/topology">
-        <tail-equipment-id>Client-5</tail-equipment-id></xpdr-network-attributes>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <xpdr-client-attributes xmlns="http://org/openroadm/network/topology">        <tail-equipment-id>XPDR-NW5-TX</tail-equipment-id>        </xpdr-client-attributes></termination-point>
-<termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">    <tp-id>Client-5</tp-id>        <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <xpdr-client-attributes xmlns="http://org/openroadm/network/topology">        <tail-equipment-id>XPDR-NW5</tail-equipment-id>        </xpdr-client-attributes> </termination-point>
-</node>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-1-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-1-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-1-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-1-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG1-DEG1-CTP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG2-DEG2-CTP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-1-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-1-DEG3-DEG3-CTP-TXtoOpenROADM-1-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-1-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-SRG1-SRG1-CP-TXtoOpenROADM-1-1-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-1XPDR-NW1-TX-toOpenROADM-1-1-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-1-1</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-1-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-SRG1-SRG1-PP1-TX-to-XPONDER-1-1XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-1-SRG1-SRG1-PP1-TX-to-XPONDER-1-1XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-1-1-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-1-1</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-1XPDR-NW1-TX-toOpenROADM-1-1-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-1XPDR-NW2-TX-toOpenROADM-1-1-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-1-1</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-1-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-SRG1-SRG1-PP2-TX-to-XPONDER-1-1XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-1-SRG1-SRG1-PP2-TX-to-XPONDER-1-1XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-1-1-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-1-1</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-1XPDR-NW2-TX-toOpenROADM-1-1-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-1XPDR-NW3-TX-toOpenROADM-1-1-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-1-1</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-1-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-SRG1-SRG1-PP3-TX-to-XPONDER-1-1XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-1-SRG1-SRG1-PP3-TX-to-XPONDER-1-1XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-1-1-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-1-1</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-1XPDR-NW3-TX-toOpenROADM-1-1-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-1XPDR-NW4-TX-toOpenROADM-1-1-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-1-1</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-1-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-SRG1-SRG1-PP4-TX-to-XPONDER-1-1XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-1-SRG1-SRG1-PP4-TX-to-XPONDER-1-1XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-1-1-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-1-1</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-1XPDR-NW4-TX-toOpenROADM-1-1-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-1XPDR-NW5-TX-toOpenROADM-1-1-SRG1-SRG1-PP5-RX</link-id>
-        <source><source-node>XPONDER-1-1</source-node><source-tp>XPDR-NW5-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-1-SRG1</dest-node><dest-tp>SRG1-PP5-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-SRG1-SRG1-PP5-TX-to-XPONDER-1-1XPDR-NW5-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-1-SRG1-SRG1-PP5-TX-to-XPONDER-1-1XPDR-NW5-RX</link-id>
-        <source><source-node>OpenROADM-1-1-SRG1</source-node><source-tp>SRG1-PP5-TX</source-tp></source>        <destination><dest-node>XPONDER-1-1</dest-node><dest-tp>XPDR-NW5-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-1XPDR-NW5-TX-toOpenROADM-1-1-SRG1-SRG1-PP5-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-1-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-1-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-1-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-1-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG1-DEG1-CTP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-1-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG2-DEG2-CTP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-1-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-1-2-DEG3-DEG3-CTP-TXtoOpenROADM-1-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-1-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-1-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-SRG1-SRG1-CP-TXtoOpenROADM-1-2-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-2XPDR-NW1-TX-toOpenROADM-1-2-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-1-2</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-2-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-SRG1-SRG1-PP1-TX-to-XPONDER-1-2XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-2-SRG1-SRG1-PP1-TX-to-XPONDER-1-2XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-1-2-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-1-2</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-2XPDR-NW1-TX-toOpenROADM-1-2-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-2XPDR-NW2-TX-toOpenROADM-1-2-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-1-2</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-2-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-SRG1-SRG1-PP2-TX-to-XPONDER-1-2XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-2-SRG1-SRG1-PP2-TX-to-XPONDER-1-2XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-1-2-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-1-2</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-2XPDR-NW2-TX-toOpenROADM-1-2-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-2XPDR-NW3-TX-toOpenROADM-1-2-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-1-2</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-2-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-SRG1-SRG1-PP3-TX-to-XPONDER-1-2XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-2-SRG1-SRG1-PP3-TX-to-XPONDER-1-2XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-1-2-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-1-2</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-2XPDR-NW3-TX-toOpenROADM-1-2-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-2XPDR-NW4-TX-toOpenROADM-1-2-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-1-2</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-2-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-SRG1-SRG1-PP4-TX-to-XPONDER-1-2XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-2-SRG1-SRG1-PP4-TX-to-XPONDER-1-2XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-1-2-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-1-2</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-2XPDR-NW4-TX-toOpenROADM-1-2-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-1-2XPDR-NW5-TX-toOpenROADM-1-2-SRG1-SRG1-PP5-RX</link-id>
-        <source><source-node>XPONDER-1-2</source-node><source-tp>XPDR-NW5-TX</source-tp></source>        <destination><dest-node>OpenROADM-1-2-SRG1</dest-node><dest-tp>SRG1-PP5-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-SRG1-SRG1-PP5-TX-to-XPONDER-1-2XPDR-NW5-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-1-2-SRG1-SRG1-PP5-TX-to-XPONDER-1-2XPDR-NW5-RX</link-id>
-        <source><source-node>OpenROADM-1-2-SRG1</source-node><source-tp>SRG1-PP5-TX</source-tp></source>        <destination><dest-node>XPONDER-1-2</dest-node><dest-tp>XPDR-NW5-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-1-2XPDR-NW5-TX-toOpenROADM-1-2-SRG1-SRG1-PP5-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-1-1-DEG1-to-OpenROADM-1-2-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG1-to-OpenROADM-1-1-DEG1</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber1112a</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-1-1-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-1-2-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-1-2-DEG1-to-OpenROADM-1-1-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG1-to-OpenROADM-1-2-DEG1</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber1211a</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-1-2-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-1-1-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-1-2-DEG2-to-OpenROADM-1-1-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG2-to-OpenROADM-1-2-DEG2</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber1211b</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-1-2-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-1-1-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-1-1-DEG2-to-OpenROADM-1-2-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG2-to-OpenROADM-1-1-DEG2</opposite-link>
-    <clfi xmlns="http://org/openroadm/common/network">fiber1112b</clfi>
-    <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-1-1-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-1-2-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-</link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-2-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-2-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-2-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-2-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG1-DEG1-CTP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG2-DEG2-CTP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-2-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-1-DEG3-DEG3-CTP-TXtoOpenROADM-2-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-2-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-SRG1-SRG1-CP-TXtoOpenROADM-2-1-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-1XPDR-NW1-TX-toOpenROADM-2-1-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-2-1</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-1-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-SRG1-SRG1-PP1-TX-to-XPONDER-2-1XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-1-SRG1-SRG1-PP1-TX-to-XPONDER-2-1XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-2-1-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-2-1</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-1XPDR-NW1-TX-toOpenROADM-2-1-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-1XPDR-NW2-TX-toOpenROADM-2-1-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-2-1</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-1-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-SRG1-SRG1-PP2-TX-to-XPONDER-2-1XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-1-SRG1-SRG1-PP2-TX-to-XPONDER-2-1XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-2-1-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-2-1</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-1XPDR-NW2-TX-toOpenROADM-2-1-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-1XPDR-NW3-TX-toOpenROADM-2-1-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-2-1</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-1-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-SRG1-SRG1-PP3-TX-to-XPONDER-2-1XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-1-SRG1-SRG1-PP3-TX-to-XPONDER-2-1XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-2-1-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-2-1</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-1XPDR-NW3-TX-toOpenROADM-2-1-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-1XPDR-NW4-TX-toOpenROADM-2-1-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-2-1</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-1-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-SRG1-SRG1-PP4-TX-to-XPONDER-2-1XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-1-SRG1-SRG1-PP4-TX-to-XPONDER-2-1XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-2-1-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-2-1</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-1XPDR-NW4-TX-toOpenROADM-2-1-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-1XPDR-NW5-TX-toOpenROADM-2-1-SRG1-SRG1-PP5-RX</link-id>
-        <source><source-node>XPONDER-2-1</source-node><source-tp>XPDR-NW5-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-1-SRG1</dest-node><dest-tp>SRG1-PP5-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-SRG1-SRG1-PP5-TX-to-XPONDER-2-1XPDR-NW5-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-1-SRG1-SRG1-PP5-TX-to-XPONDER-2-1XPDR-NW5-RX</link-id>
-        <source><source-node>OpenROADM-2-1-SRG1</source-node><source-tp>SRG1-PP5-TX</source-tp></source>        <destination><dest-node>XPONDER-2-1</dest-node><dest-tp>XPDR-NW5-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-1XPDR-NW5-TX-toOpenROADM-2-1-SRG1-SRG1-PP5-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-2-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-2-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-2-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-2-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG1-DEG1-CTP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-2-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG2-DEG2-CTP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-2-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-2-2-DEG3-DEG3-CTP-TXtoOpenROADM-2-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-2-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-2-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-SRG1-SRG1-CP-TXtoOpenROADM-2-2-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-2XPDR-NW1-TX-toOpenROADM-2-2-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-2-2</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-2-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-SRG1-SRG1-PP1-TX-to-XPONDER-2-2XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-2-SRG1-SRG1-PP1-TX-to-XPONDER-2-2XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-2-2-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-2-2</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-2XPDR-NW1-TX-toOpenROADM-2-2-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-2XPDR-NW2-TX-toOpenROADM-2-2-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-2-2</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-2-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-SRG1-SRG1-PP2-TX-to-XPONDER-2-2XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-2-SRG1-SRG1-PP2-TX-to-XPONDER-2-2XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-2-2-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-2-2</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-2XPDR-NW2-TX-toOpenROADM-2-2-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-2XPDR-NW3-TX-toOpenROADM-2-2-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-2-2</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-2-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-SRG1-SRG1-PP3-TX-to-XPONDER-2-2XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-2-SRG1-SRG1-PP3-TX-to-XPONDER-2-2XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-2-2-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-2-2</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-2XPDR-NW3-TX-toOpenROADM-2-2-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-2XPDR-NW4-TX-toOpenROADM-2-2-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-2-2</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-2-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-SRG1-SRG1-PP4-TX-to-XPONDER-2-2XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-2-SRG1-SRG1-PP4-TX-to-XPONDER-2-2XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-2-2-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-2-2</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-2XPDR-NW4-TX-toOpenROADM-2-2-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-2-2XPDR-NW5-TX-toOpenROADM-2-2-SRG1-SRG1-PP5-RX</link-id>
-        <source><source-node>XPONDER-2-2</source-node><source-tp>XPDR-NW5-TX</source-tp></source>        <destination><dest-node>OpenROADM-2-2-SRG1</dest-node><dest-tp>SRG1-PP5-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-SRG1-SRG1-PP5-TX-to-XPONDER-2-2XPDR-NW5-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-2-2-SRG1-SRG1-PP5-TX-to-XPONDER-2-2XPDR-NW5-RX</link-id>
-        <source><source-node>OpenROADM-2-2-SRG1</source-node><source-tp>SRG1-PP5-TX</source-tp></source>        <destination><dest-node>XPONDER-2-2</dest-node><dest-tp>XPDR-NW5-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-2-2XPDR-NW5-TX-toOpenROADM-2-2-SRG1-SRG1-PP5-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-2-1-DEG1-to-OpenROADM-2-2-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG1-to-OpenROADM-2-1-DEG1</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-2-1-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-2-2-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-2-2-DEG1-to-OpenROADM-2-1-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG1-to-OpenROADM-2-2-DEG1</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-2-2-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-2-1-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-2-2-DEG2-to-OpenROADM-2-1-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG2-to-OpenROADM-2-2-DEG2</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-2-2-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-2-1-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-2-1-DEG2-to-OpenROADM-2-2-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG2-to-OpenROADM-2-1-DEG2</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-2-1-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-2-2-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-3-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-3-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-3-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-3-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG1-DEG1-CTP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG2-DEG2-CTP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-3-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-1-DEG3-DEG3-CTP-TXtoOpenROADM-3-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-3-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-SRG1-SRG1-CP-TXtoOpenROADM-3-1-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-1XPDR-NW1-TX-toOpenROADM-3-1-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-3-1</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-1-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-SRG1-SRG1-PP1-TX-to-XPONDER-3-1XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-1-SRG1-SRG1-PP1-TX-to-XPONDER-3-1XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-3-1-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-3-1</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-1XPDR-NW1-TX-toOpenROADM-3-1-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-1XPDR-NW2-TX-toOpenROADM-3-1-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-3-1</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-1-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-SRG1-SRG1-PP2-TX-to-XPONDER-3-1XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-1-SRG1-SRG1-PP2-TX-to-XPONDER-3-1XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-3-1-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-3-1</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-1XPDR-NW2-TX-toOpenROADM-3-1-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-1XPDR-NW3-TX-toOpenROADM-3-1-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-3-1</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-1-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-SRG1-SRG1-PP3-TX-to-XPONDER-3-1XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-1-SRG1-SRG1-PP3-TX-to-XPONDER-3-1XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-3-1-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-3-1</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-1XPDR-NW3-TX-toOpenROADM-3-1-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-1XPDR-NW4-TX-toOpenROADM-3-1-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-3-1</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-1-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-SRG1-SRG1-PP4-TX-to-XPONDER-3-1XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-1-SRG1-SRG1-PP4-TX-to-XPONDER-3-1XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-3-1-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-3-1</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-1XPDR-NW4-TX-toOpenROADM-3-1-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-1XPDR-NW5-TX-toOpenROADM-3-1-SRG1-SRG1-PP5-RX</link-id>
-        <source><source-node>XPONDER-3-1</source-node><source-tp>XPDR-NW5-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-1-SRG1</dest-node><dest-tp>SRG1-PP5-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-SRG1-SRG1-PP5-TX-to-XPONDER-3-1XPDR-NW5-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-1-SRG1-SRG1-PP5-TX-to-XPONDER-3-1XPDR-NW5-RX</link-id>
-        <source><source-node>OpenROADM-3-1-SRG1</source-node><source-tp>SRG1-PP5-TX</source-tp></source>        <destination><dest-node>XPONDER-3-1</dest-node><dest-tp>XPDR-NW5-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-1XPDR-NW5-TX-toOpenROADM-3-1-SRG1-SRG1-PP5-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-3-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-3-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-3-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-3-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG1-DEG1-CTP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-3-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG2-DEG2-CTP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-3-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-3-2-DEG3-DEG3-CTP-TXtoOpenROADM-3-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-3-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-3-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-SRG1-SRG1-CP-TXtoOpenROADM-3-2-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-2XPDR-NW1-TX-toOpenROADM-3-2-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-3-2</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-2-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-SRG1-SRG1-PP1-TX-to-XPONDER-3-2XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-2-SRG1-SRG1-PP1-TX-to-XPONDER-3-2XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-3-2-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-3-2</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-2XPDR-NW1-TX-toOpenROADM-3-2-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-2XPDR-NW2-TX-toOpenROADM-3-2-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-3-2</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-2-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-SRG1-SRG1-PP2-TX-to-XPONDER-3-2XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-2-SRG1-SRG1-PP2-TX-to-XPONDER-3-2XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-3-2-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-3-2</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-2XPDR-NW2-TX-toOpenROADM-3-2-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-2XPDR-NW3-TX-toOpenROADM-3-2-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-3-2</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-2-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-SRG1-SRG1-PP3-TX-to-XPONDER-3-2XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-2-SRG1-SRG1-PP3-TX-to-XPONDER-3-2XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-3-2-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-3-2</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-2XPDR-NW3-TX-toOpenROADM-3-2-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-2XPDR-NW4-TX-toOpenROADM-3-2-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-3-2</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-2-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-SRG1-SRG1-PP4-TX-to-XPONDER-3-2XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-2-SRG1-SRG1-PP4-TX-to-XPONDER-3-2XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-3-2-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-3-2</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-2XPDR-NW4-TX-toOpenROADM-3-2-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-3-2XPDR-NW5-TX-toOpenROADM-3-2-SRG1-SRG1-PP5-RX</link-id>
-        <source><source-node>XPONDER-3-2</source-node><source-tp>XPDR-NW5-TX</source-tp></source>        <destination><dest-node>OpenROADM-3-2-SRG1</dest-node><dest-tp>SRG1-PP5-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-SRG1-SRG1-PP5-TX-to-XPONDER-3-2XPDR-NW5-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-3-2-SRG1-SRG1-PP5-TX-to-XPONDER-3-2XPDR-NW5-RX</link-id>
-        <source><source-node>OpenROADM-3-2-SRG1</source-node><source-tp>SRG1-PP5-TX</source-tp></source>        <destination><dest-node>XPONDER-3-2</dest-node><dest-tp>XPDR-NW5-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-3-2XPDR-NW5-TX-toOpenROADM-3-2-SRG1-SRG1-PP5-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-3-1-DEG1-to-OpenROADM-3-2-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG1-to-OpenROADM-3-1-DEG1</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-3-1-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-3-2-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-3-2-DEG1-to-OpenROADM-3-1-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG1-to-OpenROADM-3-2-DEG1</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-3-2-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-3-1-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-3-2-DEG2-to-OpenROADM-3-1-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG2-to-OpenROADM-3-2-DEG2</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-3-2-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-3-1-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-3-1-DEG2-to-OpenROADM-3-2-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG2-to-OpenROADM-3-1-DEG2</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-3-1-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-3-2-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-4-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-4-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-4-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-4-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG1-DEG1-CTP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG2-DEG2-CTP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-4-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-1-DEG3-DEG3-CTP-TXtoOpenROADM-4-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-4-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-SRG1-SRG1-CP-TXtoOpenROADM-4-1-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-1XPDR-NW1-TX-toOpenROADM-4-1-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-4-1</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-1-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-SRG1-SRG1-PP1-TX-to-XPONDER-4-1XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-1-SRG1-SRG1-PP1-TX-to-XPONDER-4-1XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-4-1-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-4-1</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-1XPDR-NW1-TX-toOpenROADM-4-1-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-1XPDR-NW2-TX-toOpenROADM-4-1-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-4-1</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-1-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-SRG1-SRG1-PP2-TX-to-XPONDER-4-1XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-1-SRG1-SRG1-PP2-TX-to-XPONDER-4-1XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-4-1-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-4-1</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-1XPDR-NW2-TX-toOpenROADM-4-1-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-1XPDR-NW3-TX-toOpenROADM-4-1-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-4-1</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-1-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-SRG1-SRG1-PP3-TX-to-XPONDER-4-1XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-1-SRG1-SRG1-PP3-TX-to-XPONDER-4-1XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-4-1-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-4-1</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-1XPDR-NW3-TX-toOpenROADM-4-1-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-1XPDR-NW4-TX-toOpenROADM-4-1-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-4-1</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-1-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-SRG1-SRG1-PP4-TX-to-XPONDER-4-1XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-1-SRG1-SRG1-PP4-TX-to-XPONDER-4-1XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-4-1-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-4-1</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-1XPDR-NW4-TX-toOpenROADM-4-1-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-1XPDR-NW5-TX-toOpenROADM-4-1-SRG1-SRG1-PP5-RX</link-id>
-        <source><source-node>XPONDER-4-1</source-node><source-tp>XPDR-NW5-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-1-SRG1</dest-node><dest-tp>SRG1-PP5-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-SRG1-SRG1-PP5-TX-to-XPONDER-4-1XPDR-NW5-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-1-SRG1-SRG1-PP5-TX-to-XPONDER-4-1XPDR-NW5-RX</link-id>
-        <source><source-node>OpenROADM-4-1-SRG1</source-node><source-tp>SRG1-PP5-TX</source-tp></source>        <destination><dest-node>XPONDER-4-1</dest-node><dest-tp>XPDR-NW5-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-1XPDR-NW5-TX-toOpenROADM-4-1-SRG1-SRG1-PP5-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-4-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-4-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-4-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-4-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG1-DEG1-CTP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-4-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG2-DEG2-CTP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-4-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-4-2-DEG3-DEG3-CTP-TXtoOpenROADM-4-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-4-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-4-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-SRG1-SRG1-CP-TXtoOpenROADM-4-2-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-2XPDR-NW1-TX-toOpenROADM-4-2-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-4-2</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-2-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-SRG1-SRG1-PP1-TX-to-XPONDER-4-2XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-2-SRG1-SRG1-PP1-TX-to-XPONDER-4-2XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-4-2-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-4-2</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-2XPDR-NW1-TX-toOpenROADM-4-2-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-2XPDR-NW2-TX-toOpenROADM-4-2-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-4-2</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-2-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-SRG1-SRG1-PP2-TX-to-XPONDER-4-2XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-2-SRG1-SRG1-PP2-TX-to-XPONDER-4-2XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-4-2-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-4-2</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-2XPDR-NW2-TX-toOpenROADM-4-2-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-2XPDR-NW3-TX-toOpenROADM-4-2-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-4-2</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-2-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-SRG1-SRG1-PP3-TX-to-XPONDER-4-2XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-2-SRG1-SRG1-PP3-TX-to-XPONDER-4-2XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-4-2-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-4-2</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-2XPDR-NW3-TX-toOpenROADM-4-2-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-2XPDR-NW4-TX-toOpenROADM-4-2-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-4-2</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-2-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-SRG1-SRG1-PP4-TX-to-XPONDER-4-2XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-2-SRG1-SRG1-PP4-TX-to-XPONDER-4-2XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-4-2-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-4-2</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-2XPDR-NW4-TX-toOpenROADM-4-2-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-4-2XPDR-NW5-TX-toOpenROADM-4-2-SRG1-SRG1-PP5-RX</link-id>
-        <source><source-node>XPONDER-4-2</source-node><source-tp>XPDR-NW5-TX</source-tp></source>        <destination><dest-node>OpenROADM-4-2-SRG1</dest-node><dest-tp>SRG1-PP5-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-SRG1-SRG1-PP5-TX-to-XPONDER-4-2XPDR-NW5-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-4-2-SRG1-SRG1-PP5-TX-to-XPONDER-4-2XPDR-NW5-RX</link-id>
-        <source><source-node>OpenROADM-4-2-SRG1</source-node><source-tp>SRG1-PP5-TX</source-tp></source>        <destination><dest-node>XPONDER-4-2</dest-node><dest-tp>XPDR-NW5-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-4-2XPDR-NW5-TX-toOpenROADM-4-2-SRG1-SRG1-PP5-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-4-1-DEG1-to-OpenROADM-4-2-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG1-to-OpenROADM-4-1-DEG1</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-4-1-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-4-2-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-4-2-DEG1-to-OpenROADM-4-1-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG1-to-OpenROADM-4-2-DEG1</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-4-2-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-4-1-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-4-2-DEG2-to-OpenROADM-4-1-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG2-to-OpenROADM-4-2-DEG2</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-4-2-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-4-1-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-4-1-DEG2-to-OpenROADM-4-2-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG2-to-OpenROADM-4-1-DEG2</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-4-1-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-4-2-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-5-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-5-1-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-5-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-5-1-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-1-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG1-DEG1-CTP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-1-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG2-DEG2-CTP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-5-1-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-1-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-1-DEG3-DEG3-CTP-TXtoOpenROADM-5-1-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-5-1-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-1-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-SRG1-SRG1-CP-TXtoOpenROADM-5-1-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-1XPDR-NW1-TX-toOpenROADM-5-1-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-5-1</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-1-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-SRG1-SRG1-PP1-TX-to-XPONDER-5-1XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-1-SRG1-SRG1-PP1-TX-to-XPONDER-5-1XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-5-1-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-5-1</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-1XPDR-NW1-TX-toOpenROADM-5-1-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-1XPDR-NW2-TX-toOpenROADM-5-1-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-5-1</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-1-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-SRG1-SRG1-PP2-TX-to-XPONDER-5-1XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-1-SRG1-SRG1-PP2-TX-to-XPONDER-5-1XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-5-1-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-5-1</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-1XPDR-NW2-TX-toOpenROADM-5-1-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-1XPDR-NW3-TX-toOpenROADM-5-1-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-5-1</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-1-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-SRG1-SRG1-PP3-TX-to-XPONDER-5-1XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-1-SRG1-SRG1-PP3-TX-to-XPONDER-5-1XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-5-1-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-5-1</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-1XPDR-NW3-TX-toOpenROADM-5-1-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-1XPDR-NW4-TX-toOpenROADM-5-1-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-5-1</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-1-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-SRG1-SRG1-PP4-TX-to-XPONDER-5-1XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-1-SRG1-SRG1-PP4-TX-to-XPONDER-5-1XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-5-1-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-5-1</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-1XPDR-NW4-TX-toOpenROADM-5-1-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-1XPDR-NW5-TX-toOpenROADM-5-1-SRG1-SRG1-PP5-RX</link-id>
-        <source><source-node>XPONDER-5-1</source-node><source-tp>XPDR-NW5-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-1-SRG1</dest-node><dest-tp>SRG1-PP5-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-SRG1-SRG1-PP5-TX-to-XPONDER-5-1XPDR-NW5-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-1-SRG1-SRG1-PP5-TX-to-XPONDER-5-1XPDR-NW5-RX</link-id>
-        <source><source-node>OpenROADM-5-1-SRG1</source-node><source-tp>SRG1-PP5-TX</source-tp></source>        <destination><dest-node>XPONDER-5-1</dest-node><dest-tp>XPDR-NW5-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-1XPDR-NW5-TX-toOpenROADM-5-1-SRG1-SRG1-PP5-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX</link-id>
-            <source><source-node>OpenROADM-5-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-5-2-DEG1</source-node><source-tp>DEG1-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX</link-id>
-            <source><source-node>OpenROADM-5-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-5-2-DEG2</source-node><source-tp>DEG2-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-DEG1-DEG1-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-2-DEG1</dest-node><dest-tp>DEG1-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG1-DEG1-CTP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-DEG2-DEG2-CTP-RX</link-id>
-        <source><source-node>OpenROADM-5-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-2-DEG2</dest-node><dest-tp>DEG2-CTP-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG2-DEG2-CTP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX</link-id>
-            <source><source-node>OpenROADM-5-2-SRG1</source-node><source-tp>SRG1-CP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-2-DEG3</dest-node><dest-tp>DEG3-CTP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-        <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">            <link-id>OpenROADM-5-2-DEG3-DEG3-CTP-TXtoOpenROADM-5-2-SRG1-SRG1-CP-RX</link-id>
-            <source><source-node>OpenROADM-5-2-DEG3</source-node><source-tp>DEG3-CTP-TX</source-tp></source>            <destination><dest-node>OpenROADM-5-2-SRG1</dest-node><dest-tp>SRG1-CP-RX</dest-tp></destination>
-            <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-SRG1-SRG1-CP-TXtoOpenROADM-5-2-DEG3-DEG3-CTP-RX</opposite-link>
-            <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-2XPDR-NW1-TX-toOpenROADM-5-2-SRG1-SRG1-PP1-RX</link-id>
-        <source><source-node>XPONDER-5-2</source-node><source-tp>XPDR-NW1-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-2-SRG1</dest-node><dest-tp>SRG1-PP1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-SRG1-SRG1-PP1-TX-to-XPONDER-5-2XPDR-NW1-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-2-SRG1-SRG1-PP1-TX-to-XPONDER-5-2XPDR-NW1-RX</link-id>
-        <source><source-node>OpenROADM-5-2-SRG1</source-node><source-tp>SRG1-PP1-TX</source-tp></source>        <destination><dest-node>XPONDER-5-2</dest-node><dest-tp>XPDR-NW1-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-2XPDR-NW1-TX-toOpenROADM-5-2-SRG1-SRG1-PP1-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-2XPDR-NW2-TX-toOpenROADM-5-2-SRG1-SRG1-PP2-RX</link-id>
-        <source><source-node>XPONDER-5-2</source-node><source-tp>XPDR-NW2-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-2-SRG1</dest-node><dest-tp>SRG1-PP2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-SRG1-SRG1-PP2-TX-to-XPONDER-5-2XPDR-NW2-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-2-SRG1-SRG1-PP2-TX-to-XPONDER-5-2XPDR-NW2-RX</link-id>
-        <source><source-node>OpenROADM-5-2-SRG1</source-node><source-tp>SRG1-PP2-TX</source-tp></source>        <destination><dest-node>XPONDER-5-2</dest-node><dest-tp>XPDR-NW2-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-2XPDR-NW2-TX-toOpenROADM-5-2-SRG1-SRG1-PP2-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-2XPDR-NW3-TX-toOpenROADM-5-2-SRG1-SRG1-PP3-RX</link-id>
-        <source><source-node>XPONDER-5-2</source-node><source-tp>XPDR-NW3-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-2-SRG1</dest-node><dest-tp>SRG1-PP3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-SRG1-SRG1-PP3-TX-to-XPONDER-5-2XPDR-NW3-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-2-SRG1-SRG1-PP3-TX-to-XPONDER-5-2XPDR-NW3-RX</link-id>
-        <source><source-node>OpenROADM-5-2-SRG1</source-node><source-tp>SRG1-PP3-TX</source-tp></source>        <destination><dest-node>XPONDER-5-2</dest-node><dest-tp>XPDR-NW3-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-2XPDR-NW3-TX-toOpenROADM-5-2-SRG1-SRG1-PP3-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-2XPDR-NW4-TX-toOpenROADM-5-2-SRG1-SRG1-PP4-RX</link-id>
-        <source><source-node>XPONDER-5-2</source-node><source-tp>XPDR-NW4-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-2-SRG1</dest-node><dest-tp>SRG1-PP4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-SRG1-SRG1-PP4-TX-to-XPONDER-5-2XPDR-NW4-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-2-SRG1-SRG1-PP4-TX-to-XPONDER-5-2XPDR-NW4-RX</link-id>
-        <source><source-node>OpenROADM-5-2-SRG1</source-node><source-tp>SRG1-PP4-TX</source-tp></source>        <destination><dest-node>XPONDER-5-2</dest-node><dest-tp>XPDR-NW4-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-2XPDR-NW4-TX-toOpenROADM-5-2-SRG1-SRG1-PP4-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>XPONDER-5-2XPDR-NW5-TX-toOpenROADM-5-2-SRG1-SRG1-PP5-RX</link-id>
-        <source><source-node>XPONDER-5-2</source-node><source-tp>XPDR-NW5-TX</source-tp></source>        <destination><dest-node>OpenROADM-5-2-SRG1</dest-node><dest-tp>SRG1-PP5-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-SRG1-SRG1-PP5-TX-to-XPONDER-5-2XPDR-NW5-RX</opposite-link>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">        <link-id>OpenROADM-5-2-SRG1-SRG1-PP5-TX-to-XPONDER-5-2XPDR-NW5-RX</link-id>
-        <source><source-node>OpenROADM-5-2-SRG1</source-node><source-tp>SRG1-PP5-TX</source-tp></source>        <destination><dest-node>XPONDER-5-2</dest-node><dest-tp>XPDR-NW5-RX</dest-tp></destination>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPONDER-5-2XPDR-NW5-TX-toOpenROADM-5-2-SRG1-SRG1-PP5-RX</opposite-link>
-       <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state></link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-5-1-DEG1-to-OpenROADM-5-2-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG1-to-OpenROADM-5-1-DEG1</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-5-1-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-5-2-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-5-2-DEG1-to-OpenROADM-5-1-DEG1</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG1-to-OpenROADM-5-2-DEG1</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-5-2-DEG1</source-node><source-tp>DEG1-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-5-1-DEG1</dest-node><dest-tp>DEG1-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-5-2-DEG2-to-OpenROADM-5-1-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG2-to-OpenROADM-5-2-DEG2</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-5-2-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-5-1-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-5-1-DEG2-to-OpenROADM-5-2-DEG2</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG2-to-OpenROADM-5-1-DEG2</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-5-1-DEG2</source-node><source-tp>DEG2-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-5-2-DEG2</dest-node><dest-tp>DEG2-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-1-2-DEG3-to-OpenROADM-2-1-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-1-DEG3-to-OpenROADM-1-2-DEG3</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-1-2-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-2-1-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-2-1-DEG3-to-OpenROADM-1-2-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-2-DEG3-to-OpenROADM-2-1-DEG3</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-2-1-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-1-2-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-2-2-DEG3-to-OpenROADM-3-1-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-1-DEG3-to-OpenROADM-2-2-DEG3</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-2-2-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-3-1-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-3-1-DEG3-to-OpenROADM-2-2-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-2-2-DEG3-to-OpenROADM-3-1-DEG3</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-3-1-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-2-2-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-3-2-DEG3-to-OpenROADM-4-1-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-1-DEG3-to-OpenROADM-3-2-DEG3</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-3-2-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-4-1-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-4-1-DEG3-to-OpenROADM-3-2-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-3-2-DEG3-to-OpenROADM-4-1-DEG3</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-4-1-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-3-2-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-4-2-DEG3-to-OpenROADM-5-1-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-1-DEG3-to-OpenROADM-4-2-DEG3</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-4-2-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-5-1-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-5-1-DEG3-to-OpenROADM-4-2-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-4-2-DEG3-to-OpenROADM-5-1-DEG3</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-5-1-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-4-2-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-5-2-DEG3-to-OpenROADM-1-1-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-1-1-DEG3-to-OpenROADM-5-2-DEG3</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-5-2-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-1-1-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-<link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-    <link-id>OpenROADM-1-1-DEG3-to-OpenROADM-5-2-DEG3</link-id>
-    <opposite-link xmlns="http://org/openroadm/common/network">OpenROADM-5-2-DEG3-to-OpenROADM-1-1-DEG3</opposite-link>
-    <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-    <source><source-node>OpenROADM-1-1-DEG3</source-node><source-tp>DEG3-TTP-TX</source-tp></source>
-    <destination><dest-node>OpenROADM-5-2-DEG3</dest-node><dest-tp>DEG3-TTP-RX</dest-tp></destination>
-    <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-    <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-    <OMS-attributes xmlns="http://org/openroadm/network/topology">
-        <span>
-            <auto-spanloss>true</auto-spanloss>
-            <spanloss-base>11.4</spanloss-base>
-            <spanloss-current>12</spanloss-current>
-            <engineered-spanloss>12.2</engineered-spanloss>
-            <link-concatenation>
-                <SRLG-Id>0</SRLG-Id>
-                <fiber-type>smf</fiber-type>
-                <SRLG-length>100000</SRLG-length>
-                <pmd>0.5</pmd>
-            </link-concatenation>
-        </span>
-    </OMS-attributes>
-</link>
-</network>
\ No newline at end of file
index 3029dcaccb24843c0e27ca6c65990a7de4b9d159..283c4c6b9fa5fc74db5bfe9e1f16a18342fd7ffc 100644 (file)
                     "ietf-network-topology:termination-point": [
                         {
                             "tp-id": "XPDR-NW1-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW5-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-5",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW4-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-4",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW2-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-2",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW1-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW3-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-3",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW2-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-2",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW5-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-5",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW3-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-3",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW4-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-4",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                     "ietf-network-topology:termination-point": [
                         {
                             "tp-id": "XPDR-NW1-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW5-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-5",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW4-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-4",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW2-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-2",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW1-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW3-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-3",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW2-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-2",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW5-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-5",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW3-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-3",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW4-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-4",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                     "ietf-network-topology:termination-point": [
                         {
                             "tp-id": "XPDR-NW1-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW5-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-5",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW4-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-4",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW2-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-2",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW1-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW3-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-3",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW2-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-2",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW5-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-5",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW3-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-3",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW4-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-4",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                     "ietf-network-topology:termination-point": [
                         {
                             "tp-id": "XPDR-NW1-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW5-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-5",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW4-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-4",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW2-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-2",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW1-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW3-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-3",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW2-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-2",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW5-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-5",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW3-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-3",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW4-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-4",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                     "ietf-network-topology:termination-point": [
                         {
                             "tp-id": "XPDR-NW1-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW5-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-5",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW4-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-4",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW2-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-2",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW1-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-1"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW3-RX",
-                            "transportpce-topology:associated-connection-map-port": "Client-3",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW2-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-2",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-2"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW5-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-5",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-5"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW3-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-3",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-3"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
                         },
                         {
                             "tp-id": "XPDR-NW4-TX",
-                            "transportpce-topology:associated-connection-map-port": "Client-4",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "Client-4"
+                            ],
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
                             "administrative-state": "inService",
                             "operational-state": "inService"
index c23fb1b00c72dd22c07b83867a674fcf8faeee84..a4cd5f3a3f692e9f4ad7e2f959f8b1e8baa4cc50 100644 (file)
@@ -24,7 +24,9 @@
                                     }
                                 ]
                             },
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-NETWORK1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-NETWORK1"
+                            ],
                             "org-openroadm-common-network:operational-state": "inService",
                             "org-openroadm-common-network:administrative-state": "inService",
                             "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
@@ -45,7 +47,9 @@
                                     }
                                 ]
                             },
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-CLIENT1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-CLIENT1"
+                            ],
                             "org-openroadm-common-network:operational-state": "inService",
                             "org-openroadm-common-network:administrative-state": "inService",
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
@@ -84,7 +88,9 @@
                                     }
                                 ]
                             },
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-NETWORK1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-NETWORK1"
+                            ],
                             "org-openroadm-common-network:operational-state": "inService",
                             "org-openroadm-common-network:administrative-state": "inService",
                             "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
                                     }
                                 ]
                             },
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-CLIENT1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-CLIENT1"
+                            ],
                             "org-openroadm-common-network:operational-state": "inService",
                             "org-openroadm-common-network:administrative-state": "inService",
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
index 5d69ad00f2480ea89acce1c7c541f687e6635b5b..548b0b291d69db00e5a927846de22f381a4c069f 100644 (file)
@@ -24,7 +24,9 @@
                                     }
                                 ]
                             },
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-NETWORK1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-NETWORK1"
+                            ],
                             "org-openroadm-common-network:operational-state": "inService",
                             "org-openroadm-common-network:administrative-state": "inService",
                             "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
@@ -45,7 +47,9 @@
                                     }
                                 ]
                             },
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-CLIENT1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-CLIENT1"
+                            ],
                             "org-openroadm-common-network:operational-state": "inService",
                             "org-openroadm-common-network:administrative-state": "inService",
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
@@ -84,7 +88,9 @@
                                     }
                                 ]
                             },
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-NETWORK1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-NETWORK1"
+                            ],
                             "org-openroadm-common-network:operational-state": "inService",
                             "org-openroadm-common-network:administrative-state": "inService",
                             "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
                                     }
                                 ]
                             },
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-CLIENT1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-CLIENT1"
+                            ],
                             "org-openroadm-common-network:operational-state": "inService",
                             "org-openroadm-common-network:administrative-state": "inService",
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                     "org-openroadm-otn-network-topology:available-bandwidth": "0",
                     "org-openroadm-otn-network-topology:used-bandwidth": "400000",
                     "org-openroadm-common-network:link-type": "OTN-LINK",
-                    "transportpce-topology:otn-link-type": "OTUC4",
+                    "transportpce-networkutils:otn-link-type": "OTUC4",
                     "org-openroadm-common-network:operational-state": "inService",
                     "org-openroadm-common-network:administrative-state": "inService",
                     "org-openroadm-common-network:opposite-link": "OTUC4-XPDR-C2-XPDR2-XPDR2-NETWORK1toXPDR-A2-XPDR2-XPDR2-NETWORK1"
                     "org-openroadm-common-network:link-type": "OTN-LINK",
                     "org-openroadm-common-network:operational-state": "inService",
                     "org-openroadm-common-network:administrative-state": "inService",
-                    "transportpce-topology:otn-link-type": "OTUC4",
+                    "transportpce-networkutils:otn-link-type": "OTUC4",
                     "org-openroadm-common-network:opposite-link": "OTUC4-XPDR-A2-XPDR2-XPDR2-NETWORK1toXPDR-C2-XPDR2-XPDR2-NETWORK1"
                 },
                 {
                     "org-openroadm-otn-network-topology:available-bandwidth": "400000",
                     "org-openroadm-otn-network-topology:used-bandwidth": "0",
                     "org-openroadm-common-network:link-type": "OTN-LINK",
-                    "transportpce-topology:otn-link-type": "ODUC4",
+                    "transportpce-networkutils:otn-link-type": "ODUC4",
                     "org-openroadm-common-network:operational-state": "inService",
                     "org-openroadm-common-network:administrative-state": "inService",
                     "org-openroadm-common-network:opposite-link": "ODUC4-XPDR-C2-XPDR2-XPDR2-NETWORK1toXPDR-A2-XPDR2-XPDR2-NETWORK1"
                     "org-openroadm-common-network:link-type": "OTN-LINK",
                     "org-openroadm-common-network:operational-state": "inService",
                     "org-openroadm-common-network:administrative-state": "inService",
-                    "transportpce-topology:otn-link-type": "ODUC4",
+                    "transportpce-networkutils:otn-link-type": "ODUC4",
                     "org-openroadm-common-network:opposite-link": "ODUC4-XPDR-A2-XPDR2-XPDR2-NETWORK1toXPDR-C2-XPDR2-XPDR2-NETWORK1"
                 }
             ]
index 74f345a35ee95b7f05509a70f2efca4507398833..09acf29bc5d4a89aba63195b1185901a713d2009 100644 (file)
@@ -24,7 +24,9 @@
                                     }
                                 ]
                             },
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-NETWORK1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-NETWORK1"
+                            ],
                             "org-openroadm-common-network:operational-state": "inService",
                             "org-openroadm-common-network:administrative-state": "inService",
                             "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
@@ -45,7 +47,9 @@
                                     }
                                 ]
                             },
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-CLIENT1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-CLIENT1"
+                            ],
                             "org-openroadm-common-network:operational-state": "inService",
                             "org-openroadm-common-network:administrative-state": "inService",
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
@@ -84,7 +88,9 @@
                                     }
                                 ]
                             },
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-NETWORK1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-NETWORK1"
+                            ],
                             "org-openroadm-common-network:operational-state": "inService",
                             "org-openroadm-common-network:administrative-state": "inService",
                             "org-openroadm-common-network:tp-type": "XPONDER-CLIENT"
                                     }
                                 ]
                             },
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-CLIENT1",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-CLIENT1"
+                            ],
                             "org-openroadm-common-network:operational-state": "inService",
                             "org-openroadm-common-network:administrative-state": "inService",
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK"
                     "org-openroadm-otn-network-topology:available-bandwidth": "400000",
                     "org-openroadm-otn-network-topology:used-bandwidth": "0",
                     "org-openroadm-common-network:link-type": "OTN-LINK",
-                    "transportpce-topology:otn-link-type": "OTUC4",
+                    "transportpce-networkutils:otn-link-type": "OTUC4",
                     "org-openroadm-common-network:operational-state": "inService",
                     "org-openroadm-common-network:administrative-state": "inService",
                     "org-openroadm-common-network:opposite-link": "OTUC4-XPDR-C2-XPDR2-XPDR2-NETWORK1toXPDR-A2-XPDR2-XPDR2-NETWORK1"
                     "org-openroadm-common-network:link-type": "OTN-LINK",
                     "org-openroadm-common-network:operational-state": "inService",
                     "org-openroadm-common-network:administrative-state": "inService",
-                    "transportpce-topology:otn-link-type": "OTUC4",
+                    "transportpce-networkutils:otn-link-type": "OTUC4",
                     "org-openroadm-common-network:opposite-link": "OTUC4-XPDR-A2-XPDR2-XPDR2-NETWORK1toXPDR-C2-XPDR2-XPDR2-NETWORK1"
                 }
             ]
diff --git a/tests/sample_configs/honeynode-topo-3-RDM.json b/tests/sample_configs/honeynode-topo-3-RDM.json
new file mode 100644 (file)
index 0000000..8828e18
--- /dev/null
@@ -0,0 +1,1074 @@
+{
+    "ietf-network:network": [
+        {
+            "network-id": "openroadm-topology",
+            "network-types": {
+                "org-openroadm-common-network:openroadm-common-network": {}
+            },
+            "ietf-network-topology:link": [
+                {
+                    "link-id": "ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-A1-SRG3",
+                        "source-tp": "SRG3-CP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-TXRX",
+                        "dest-node": "ROADM-A1-DEG2"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX"
+                },
+                {
+                    "link-id": "ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-A1-DEG1",
+                        "source-tp": "DEG1-CTP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "SRG3-CP-TXRX",
+                        "dest-node": "ROADM-A1-SRG3"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX"
+                },
+                {
+                    "link-id": "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-C1-DEG1",
+                        "source-tp": "DEG1-TTP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-TXRX",
+                        "dest-node": "ROADM-A1-DEG2"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX"
+                },
+                {
+                    "link-id": "ROADM-B1-DEG1-DEG1-CTP-TXRXtoROADM-B1-SRG1-SRG1-CP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-B1-DEG1",
+                        "source-tp": "DEG1-CTP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "SRG1-CP-TXRX",
+                        "dest-node": "ROADM-B1-SRG1"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-B1-SRG1-SRG1-CP-TXRXtoROADM-B1-DEG1-DEG1-CTP-TXRX"
+                },
+                {
+                    "link-id": "ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-DEG1-DEG1-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-C1-DEG2",
+                        "source-tp": "DEG2-CTP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-TXRX",
+                        "dest-node": "ROADM-C1-DEG1"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-DEG2-DEG2-CTP-TXRX"
+                },
+                {
+                    "link-id": "ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-C1-DEG2",
+                        "source-tp": "DEG2-CTP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "SRG1-CP-TXRX",
+                        "dest-node": "ROADM-C1-SRG1"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-C1-SRG1-SRG1-CP-TXRXtoROADM-C1-DEG2-DEG2-CTP-TXRX"
+                },
+                {
+                    "link-id": "ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-A1-DEG1",
+                        "source-tp": "DEG1-TTP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-TXRX",
+                        "dest-node": "ROADM-B1-DEG1"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-B1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG1-DEG1-TTP-TXRX",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "spanloss-current": "12.0",
+                            "auto-spanloss": true,
+                            "spanloss-base": "11.4",
+                            "engineered-spanloss": "12.2",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "SRLG-length": "100000.0",
+                                    "pmd": "0.5",
+                                    "fiber-type": "smf"
+                                }
+                            ]
+                        }
+                    }
+                },
+                {
+                    "link-id": "ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-A1-DEG2",
+                        "source-tp": "DEG2-CTP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "SRG1-CP-TXRX",
+                        "dest-node": "ROADM-A1-SRG1"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX"
+                },
+                {
+                    "link-id": "ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-DEG2-DEG2-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-C1-DEG1",
+                        "source-tp": "DEG1-CTP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-TXRX",
+                        "dest-node": "ROADM-C1-DEG2"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-DEG1-DEG1-CTP-TXRX"
+                },
+                {
+                    "link-id": "ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-A1-DEG2",
+                        "source-tp": "DEG2-CTP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-TXRX",
+                        "dest-node": "ROADM-A1-DEG1"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX"
+                },
+                {
+                    "link-id": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-A1-SRG1",
+                        "source-tp": "SRG1-CP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-TXRX",
+                        "dest-node": "ROADM-A1-DEG1"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX"
+                },
+                {
+                    "link-id": "ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-A1-DEG2",
+                        "source-tp": "DEG2-CTP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "SRG3-CP-TXRX",
+                        "dest-node": "ROADM-A1-SRG3"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX"
+                },
+                {
+                    "link-id": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-A1-SRG1",
+                        "source-tp": "SRG1-CP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-TXRX",
+                        "dest-node": "ROADM-A1-DEG2"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX"
+                },
+                {
+                    "link-id": "ROADM-B1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG1-DEG1-TTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-B1-DEG1",
+                        "source-tp": "DEG1-TTP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-TXRX",
+                        "dest-node": "ROADM-A1-DEG1"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "spanloss-current": "12.0",
+                            "auto-spanloss": true,
+                            "spanloss-base": "11.4",
+                            "engineered-spanloss": "12.2",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "SRLG-length": "100000.0",
+                                    "pmd": "0.5",
+                                    "fiber-type": "smf"
+                                }
+                            ]
+                        }
+                    }
+                },
+                {
+                    "link-id": "ROADM-C1-SRG1-SRG1-CP-TXRXtoROADM-C1-DEG2-DEG2-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-C1-SRG1",
+                        "source-tp": "SRG1-CP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-TXRX",
+                        "dest-node": "ROADM-C1-DEG2"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX"
+                },
+                {
+                    "link-id": "ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG1-SRG1-CP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-A1-DEG1",
+                        "source-tp": "DEG1-CTP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "SRG1-CP-TXRX",
+                        "dest-node": "ROADM-A1-SRG1"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX"
+                },
+                {
+                    "link-id": "ROADM-B1-DEG2-DEG2-CTP-TXRXtoROADM-B1-SRG1-SRG1-CP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-B1-DEG2",
+                        "source-tp": "DEG2-CTP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "SRG1-CP-TXRX",
+                        "dest-node": "ROADM-B1-SRG1"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-B1-SRG1-SRG1-CP-TXRXtoROADM-B1-DEG2-DEG2-CTP-TXRX"
+                },
+                {
+                    "link-id": "ROADM-C1-SRG1-SRG1-CP-TXRXtoROADM-C1-DEG1-DEG1-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-C1-SRG1",
+                        "source-tp": "SRG1-CP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-TXRX",
+                        "dest-node": "ROADM-C1-DEG1"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX"
+                },
+                {
+                    "link-id": "ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-B1-DEG2",
+                        "source-tp": "DEG2-TTP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-TXRX",
+                        "dest-node": "ROADM-C1-DEG2"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-C1-DEG2-DEG2-TTP-TXRXtoROADM-B1-DEG2-DEG2-TTP-TXRX",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "spanloss-current": "12.0",
+                            "auto-spanloss": true,
+                            "spanloss-base": "11.4",
+                            "engineered-spanloss": "12.2",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "SRLG-length": "100000.0",
+                                    "pmd": "0.5",
+                                    "fiber-type": "smf"
+                                }
+                            ]
+                        }
+                    }
+                },
+                {
+                    "link-id": "ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-A1-DEG1",
+                        "source-tp": "DEG1-CTP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-TXRX",
+                        "dest-node": "ROADM-A1-DEG2"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX"
+                },
+                {
+                    "link-id": "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-A1-DEG2",
+                        "source-tp": "DEG2-TTP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-TXRX",
+                        "dest-node": "ROADM-C1-DEG1"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX"
+                },
+                {
+                    "link-id": "ROADM-C1-DEG2-DEG2-TTP-TXRXtoROADM-B1-DEG2-DEG2-TTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-C1-DEG2",
+                        "source-tp": "DEG2-TTP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-TXRX",
+                        "dest-node": "ROADM-B1-DEG2"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "spanloss-current": "12.0",
+                            "auto-spanloss": true,
+                            "spanloss-base": "11.4",
+                            "engineered-spanloss": "12.2",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "SRLG-length": "100000.0",
+                                    "pmd": "0.5",
+                                    "fiber-type": "smf"
+                                }
+                            ]
+                        }
+                    }
+                },
+                {
+                    "link-id": "ROADM-B1-SRG1-SRG1-CP-TXRXtoROADM-B1-DEG1-DEG1-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-B1-SRG1",
+                        "source-tp": "SRG1-CP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-TXRX",
+                        "dest-node": "ROADM-B1-DEG1"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-B1-DEG1-DEG1-CTP-TXRXtoROADM-B1-SRG1-SRG1-CP-TXRX"
+                },
+                {
+                    "link-id": "ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-C1-DEG1",
+                        "source-tp": "DEG1-CTP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "SRG1-CP-TXRX",
+                        "dest-node": "ROADM-C1-SRG1"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-C1-SRG1-SRG1-CP-TXRXtoROADM-C1-DEG1-DEG1-CTP-TXRX"
+                },
+                {
+                    "link-id": "ROADM-B1-DEG2-DEG2-CTP-TXRXtoROADM-B1-DEG1-DEG1-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-B1-DEG2",
+                        "source-tp": "DEG2-CTP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-TXRX",
+                        "dest-node": "ROADM-B1-DEG1"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-B1-DEG1-DEG1-CTP-TXRXtoROADM-B1-DEG2-DEG2-CTP-TXRX"
+                },
+                {
+                    "link-id": "ROADM-B1-SRG1-SRG1-CP-TXRXtoROADM-B1-DEG2-DEG2-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-B1-SRG1",
+                        "source-tp": "SRG1-CP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-TXRX",
+                        "dest-node": "ROADM-B1-DEG2"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-B1-DEG2-DEG2-CTP-TXRXtoROADM-B1-SRG1-SRG1-CP-TXRX"
+                },
+                {
+                    "link-id": "ROADM-A1-SRG3-SRG3-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-A1-SRG3",
+                        "source-tp": "SRG3-CP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-TXRX",
+                        "dest-node": "ROADM-A1-DEG1"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-A1-DEG1-DEG1-CTP-TXRXtoROADM-A1-SRG3-SRG3-CP-TXRX"
+                },
+                {
+                    "link-id": "ROADM-B1-DEG1-DEG1-CTP-TXRXtoROADM-B1-DEG2-DEG2-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADM-B1-DEG1",
+                        "source-tp": "DEG1-CTP-TXRX"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-TXRX",
+                        "dest-node": "ROADM-B1-DEG2"
+                    },
+                    "org-openroadm-common-network:opposite-link": "ROADM-B1-DEG2-DEG2-CTP-TXRXtoROADM-B1-DEG1-DEG1-CTP-TXRX"
+                }
+            ],
+            "node": [
+                {
+                    "node-id": "ROADM-B1-DEG1",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-TXRX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TXRX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeB"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "ROADM-B1"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 1,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////",
+                                "start-edge-freq": "191.325",
+                                "freq-map-granularity": "6.25",
+                                "effective-bits": 768
+                            }
+                        ]
+                    }
+                },
+                {
+                    "node-id": "ROADM-A1-SRG3",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////",
+                                "start-edge-freq": "191.325",
+                                "freq-map-granularity": "6.25",
+                                "effective-bits": 768
+                            }
+                        ]
+                    },
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG3-PP3-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG3-PP4-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG3-PP2-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG3-CP-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG3-PP1-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "ROADM-A1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeA"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "ROADM-B1-DEG2",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-TTP-TXRX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-network-topology:tx-ttp-attributes": {
+                                "avail-freq-maps": [
+                                    {
+                                        "map-name": "cband",
+                                        "freq-map": "//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A",
+                                        "start-edge-freq": "191.325",
+                                        "freq-map-granularity": "6.25",
+                                        "effective-bits": 768
+                                    }
+                                ]
+                            }
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TXRX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-network-topology:ctp-attributes": {
+                                "avail-freq-maps": [
+                                    {
+                                        "map-name": "cband",
+                                        "freq-map": "//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A",
+                                        "start-edge-freq": "191.325",
+                                        "freq-map-granularity": "6.25",
+                                        "effective-bits": 768
+                                    }
+                                ]
+                            }
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeB"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "ROADM-B1"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 2,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "freq-map": "//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A",
+                                "start-edge-freq": "191.325",
+                                "freq-map-granularity": "6.25",
+                                "effective-bits": 768
+                            }
+                        ]
+                    }
+                },
+                {
+                    "node-id": "ROADM-C1-SRG1",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "freq-map": "//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A",
+                                "start-edge-freq": "191.325",
+                                "freq-map-granularity": "6.25",
+                                "effective-bits": 768
+                            }
+                        ]
+                    },
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP4-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-network-topology:pp-attributes": {
+                                "avail-freq-maps": [
+                                    {
+                                        "map-name": "cband",
+                                        "freq-map": "//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A",
+                                        "start-edge-freq": "191.325",
+                                        "freq-map-granularity": "6.25",
+                                        "effective-bits": 768
+                                    }
+                                ]
+                            }
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-network-topology:cp-attributes": {
+                                "avail-freq-maps": [
+                                    {
+                                        "map-name": "cband",
+                                        "freq-map": "//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A",
+                                        "start-edge-freq": "191.325",
+                                        "freq-map-granularity": "6.25",
+                                        "effective-bits": 768
+                                    }
+                                ]
+                            }
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeC"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "ROADM-C1"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "ROADM-A1-SRG1",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////",
+                                "start-edge-freq": "191.325",
+                                "freq-map-granularity": "6.25",
+                                "effective-bits": 768
+                            }
+                        ]
+                    },
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP4-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "ROADM-A1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeA"
+                        }
+                    ]
+                },
+                {
+                    "node-id": "ROADM-A1-DEG1",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-TXRX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TXRX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "ROADM-A1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeA"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 1,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////",
+                                "start-edge-freq": "191.325",
+                                "freq-map-granularity": "6.25",
+                                "effective-bits": 768
+                            }
+                        ]
+                    }
+                },
+                {
+                    "node-id": "ROADM-A1-DEG2",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-TTP-TXRX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TXRX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "ROADM-A1"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeA"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 2,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////",
+                                "start-edge-freq": "191.325",
+                                "freq-map-granularity": "6.25",
+                                "effective-bits": 768
+                            }
+                        ]
+                    }
+                },
+                {
+                    "node-id": "ROADM-C1-DEG2",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-TTP-TXRX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-network-topology:tx-ttp-attributes": {
+                                "avail-freq-maps": [
+                                    {
+                                        "map-name": "cband",
+                                        "freq-map": "//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A",
+                                        "start-edge-freq": "191.325",
+                                        "freq-map-granularity": "6.25",
+                                        "effective-bits": 768
+                                    }
+                                ]
+                            }
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TXRX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-network-topology:ctp-attributes": {
+                                "avail-freq-maps": [
+                                    {
+                                        "map-name": "cband",
+                                        "freq-map": "//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A",
+                                        "start-edge-freq": "191.325",
+                                        "freq-map-granularity": "6.25",
+                                        "effective-bits": 768
+                                    }
+                                ]
+                            }
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeC"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "ROADM-C1"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 2,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "freq-map": "//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A",
+                                "start-edge-freq": "191.325",
+                                "freq-map-granularity": "6.25",
+                                "effective-bits": 768
+                            }
+                        ]
+                    }
+                },
+                {
+                    "node-id": "ROADM-C1-DEG1",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-TXRX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TXRX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeC"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "ROADM-C1"
+                        }
+                    ],
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 1,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////",
+                                "start-edge-freq": "191.325",
+                                "freq-map-granularity": "6.25",
+                                "effective-bits": 768
+                            }
+                        ]
+                    }
+                },
+                {
+                    "node-id": "ROADM-B1-SRG1",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "freq-map": "//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A",
+                                "start-edge-freq": "191.325",
+                                "freq-map-granularity": "6.25",
+                                "effective-bits": 768
+                            }
+                        ]
+                    },
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP4-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-network-topology:pp-attributes": {
+                                "avail-freq-maps": [
+                                    {
+                                        "map-name": "cband",
+                                        "freq-map": "//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A",
+                                        "start-edge-freq": "191.325",
+                                        "freq-map-granularity": "6.25",
+                                        "effective-bits": 768
+                                    }
+                                ]
+                            }
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService",
+                            "org-openroadm-network-topology:cp-attributes": {
+                                "avail-freq-maps": [
+                                    {
+                                        "map-name": "cband",
+                                        "freq-map": "//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8A",
+                                        "start-edge-freq": "191.325",
+                                        "freq-map-granularity": "6.25",
+                                        "effective-bits": 768
+                                    }
+                                ]
+                            }
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeB"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "ROADM-B1"
+                        }
+                    ]
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
diff --git a/tests/sample_configs/honeynode-topo.json b/tests/sample_configs/honeynode-topo.json
new file mode 100644 (file)
index 0000000..9ed69ba
--- /dev/null
@@ -0,0 +1,860 @@
+{
+    "ietf-network:network": [
+        {
+            "network-id": "openroadm-topology",
+            "network-types": {
+                "org-openroadm-common-network:openroadm-common-network": {}
+            },
+            "node": [
+                {
+                    "node-id": "ROADMC01-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 2,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-TTP-TXRX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TXRX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeC"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "ROADMC01"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPDRC01-XPDR1",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR1-CLIENT1",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-NETWORK1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR1-CLIENT2",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-NETWORK2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR1-NETWORK2",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-CLIENT2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR1-NETWORK1",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-CLIENT1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeC"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPDRC01"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "ROADMC01-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 1,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-TXRX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TXRX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeC"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "ROADMC01"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "ROADMA01-DEG1",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 1,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG1-CTP-TXRX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG1-TTP-TXRX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "ROADMA01"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeA"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "XPDRA01-XPDR1",
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "XPDR1-CLIENT1",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-NETWORK1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR1-CLIENT2",
+                            "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-NETWORK2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR1-NETWORK2",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-CLIENT2"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "XPDR1-NETWORK1",
+                            "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-CLIENT1"
+                            ],
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "XPDRA01"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeA"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "XPONDER",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "ROADMA01-DEG2",
+                    "org-openroadm-network-topology:degree-attributes": {
+                        "degree-number": 2,
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "DEG2-TTP-TXRX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-TTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "DEG2-CTP-TXRX",
+                            "org-openroadm-common-network:tp-type": "DEGREE-TXRX-CTP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "ROADMA01"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeA"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "DEGREE",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "ROADMC01-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP10-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP9-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP16-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP6-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP13-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP7-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP12-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP15-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP11-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP8-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP14-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP5-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeC"
+                        },
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "ROADMC01"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                },
+                {
+                    "node-id": "ROADMA01-SRG1",
+                    "org-openroadm-network-topology:srg-attributes": {
+                        "avail-freq-maps": [
+                            {
+                                "map-name": "cband",
+                                "start-edge-freq": "191.32500000",
+                                "effective-bits": 768,
+                                "freq-map-granularity": "6.25000",
+                                "freq-map": "////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////"
+                            }
+                        ]
+                    },
+                    "ietf-network-topology:termination-point": [
+                        {
+                            "tp-id": "SRG1-PP10-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP9-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP3-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP16-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP6-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP13-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP1-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP4-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP7-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP12-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP15-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP11-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP8-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP14-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP5-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-PP2-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-PP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        },
+                        {
+                            "tp-id": "SRG1-CP-TXRX",
+                            "org-openroadm-common-network:tp-type": "SRG-TXRX-CP",
+                            "org-openroadm-common-network:operational-state": "inService",
+                            "org-openroadm-common-network:administrative-state": "inService"
+                        }
+                    ],
+                    "supporting-node": [
+                        {
+                            "network-ref": "openroadm-network",
+                            "node-ref": "ROADMA01"
+                        },
+                        {
+                            "network-ref": "clli-network",
+                            "node-ref": "NodeA"
+                        }
+                    ],
+                    "org-openroadm-common-network:node-type": "SRG",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:administrative-state": "inService"
+                }
+            ],
+            "ietf-network-topology:link": [
+                {
+                    "link-id": "ROADMA01-DEG2-DEG2-CTP-TXRXtoROADMA01-SRG1-SRG1-CP-TXRX",
+                    "source": {
+                        "source-node": "ROADMA01-DEG2",
+                        "source-tp": "DEG2-CTP-TXRX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-TXRX",
+                        "dest-node": "ROADMA01-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADMA01-SRG1-SRG1-CP-TXRXtoROADMA01-DEG2-DEG2-CTP-TXRX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "ROADMC01-SRG1-SRG1-PP1-TXRXtoXPDRC01-XPDR1-XPDR1-NETWORK1",
+                    "source": {
+                        "source-node": "ROADMC01-SRG1",
+                        "source-tp": "SRG1-PP1-TXRX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR1-NETWORK1",
+                        "dest-node": "XPDRC01-XPDR1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPDRC01-XPDR1-XPDR1-NETWORK1toROADMC01-SRG1-SRG1-PP1-TXRX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "ROADMA01-DEG2-DEG2-CTP-TXRXtoROADMA01-DEG1-DEG1-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADMA01-DEG2",
+                        "source-tp": "DEG2-CTP-TXRX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-TXRX",
+                        "dest-node": "ROADMA01-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADMA01-DEG1-DEG1-CTP-TXRXtoROADMA01-DEG2-DEG2-CTP-TXRX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "ROADMC01-SRG1-SRG1-CP-TXRXtoROADMC01-DEG1-DEG1-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADMC01-SRG1",
+                        "source-tp": "SRG1-CP-TXRX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-TXRX",
+                        "dest-node": "ROADMC01-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADMC01-DEG1-DEG1-CTP-TXRXtoROADMC01-SRG1-SRG1-CP-TXRX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "ROADMC01-DEG2-DEG2-CTP-TXRXtoROADMC01-SRG1-SRG1-CP-TXRX",
+                    "source": {
+                        "source-node": "ROADMC01-DEG2",
+                        "source-tp": "DEG2-CTP-TXRX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-TXRX",
+                        "dest-node": "ROADMC01-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADMC01-SRG1-SRG1-CP-TXRXtoROADMC01-DEG2-DEG2-CTP-TXRX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "ROADMA01-SRG1-SRG1-CP-TXRXtoROADMA01-DEG1-DEG1-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADMA01-SRG1",
+                        "source-tp": "SRG1-CP-TXRX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-TXRX",
+                        "dest-node": "ROADMA01-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADMA01-DEG1-DEG1-CTP-TXRXtoROADMA01-SRG1-SRG1-CP-TXRX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "ROADMC01-DEG2-DEG2-CTP-TXRXtoROADMC01-DEG1-DEG1-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADMC01-DEG2",
+                        "source-tp": "DEG2-CTP-TXRX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-CTP-TXRX",
+                        "dest-node": "ROADMC01-DEG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADMC01-DEG1-DEG1-CTP-TXRXtoROADMC01-DEG2-DEG2-CTP-TXRX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "ROADMA01-SRG1-SRG1-PP1-TXRXtoXPDRA01-XPDR1-XPDR1-NETWORK1",
+                    "source": {
+                        "source-node": "ROADMA01-SRG1",
+                        "source-tp": "SRG1-PP1-TXRX"
+                    },
+                    "destination": {
+                        "dest-tp": "XPDR1-NETWORK1",
+                        "dest-node": "XPDRA01-XPDR1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "XPDRA01-XPDR1-XPDR1-NETWORK1toROADMA01-SRG1-SRG1-PP1-TXRX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-INPUT"
+                },
+                {
+                    "link-id": "ROADMC01-SRG1-SRG1-CP-TXRXtoROADMC01-DEG2-DEG2-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADMC01-SRG1",
+                        "source-tp": "SRG1-CP-TXRX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-TXRX",
+                        "dest-node": "ROADMC01-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADMC01-DEG2-DEG2-CTP-TXRXtoROADMC01-SRG1-SRG1-CP-TXRX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "ROADMA01-DEG1-DEG1-CTP-TXRXtoROADMA01-SRG1-SRG1-CP-TXRX",
+                    "source": {
+                        "source-node": "ROADMA01-DEG1",
+                        "source-tp": "DEG1-CTP-TXRX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-TXRX",
+                        "dest-node": "ROADMA01-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADMA01-SRG1-SRG1-CP-TXRXtoROADMA01-DEG1-DEG1-CTP-TXRX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "ROADMA01-DEG1-DEG1-CTP-TXRXtoROADMA01-DEG2-DEG2-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADMA01-DEG1",
+                        "source-tp": "DEG1-CTP-TXRX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-TXRX",
+                        "dest-node": "ROADMA01-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADMA01-DEG2-DEG2-CTP-TXRXtoROADMA01-DEG1-DEG1-CTP-TXRX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPDRA01-XPDR1-XPDR1-NETWORK1toROADMA01-SRG1-SRG1-PP1-TXRX",
+                    "source": {
+                        "source-node": "XPDRA01-XPDR1",
+                        "source-tp": "XPDR1-NETWORK1"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-TXRX",
+                        "dest-node": "ROADMA01-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADMA01-SRG1-SRG1-PP1-TXRXtoXPDRA01-XPDR1-XPDR1-NETWORK1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "ROADMC01-DEG1-DEG1-CTP-TXRXtoROADMC01-DEG2-DEG2-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADMC01-DEG1",
+                        "source-tp": "DEG1-CTP-TXRX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-TXRX",
+                        "dest-node": "ROADMC01-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADMC01-DEG2-DEG2-CTP-TXRXtoROADMC01-DEG1-DEG1-CTP-TXRX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "EXPRESS-LINK"
+                },
+                {
+                    "link-id": "XPDRC01-XPDR1-XPDR1-NETWORK1toROADMC01-SRG1-SRG1-PP1-TXRX",
+                    "source": {
+                        "source-node": "XPDRC01-XPDR1",
+                        "source-tp": "XPDR1-NETWORK1"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-PP1-TXRX",
+                        "dest-node": "ROADMC01-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADMC01-SRG1-SRG1-PP1-TXRXtoXPDRC01-XPDR1-XPDR1-NETWORK1",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "XPONDER-OUTPUT"
+                },
+                {
+                    "link-id": "ROADMC01-DEG1-DEG1-CTP-TXRXtoROADMC01-SRG1-SRG1-CP-TXRX",
+                    "source": {
+                        "source-node": "ROADMC01-DEG1",
+                        "source-tp": "DEG1-CTP-TXRX"
+                    },
+                    "destination": {
+                        "dest-tp": "SRG1-CP-TXRX",
+                        "dest-node": "ROADMC01-SRG1"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADMC01-SRG1-SRG1-CP-TXRXtoROADMC01-DEG1-DEG1-CTP-TXRX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "DROP-LINK"
+                },
+                {
+                    "link-id": "ROADMA01-SRG1-SRG1-CP-TXRXtoROADMA01-DEG2-DEG2-CTP-TXRX",
+                    "source": {
+                        "source-node": "ROADMA01-SRG1",
+                        "source-tp": "SRG1-CP-TXRX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-CTP-TXRX",
+                        "dest-node": "ROADMA01-DEG2"
+                    },
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADMA01-DEG2-DEG2-CTP-TXRXtoROADMA01-SRG1-SRG1-CP-TXRX",
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-type": "ADD-LINK"
+                },
+                {
+                    "link-id": "ROADMA01-DEG1-DEG1-TTP-TXRXtoROADMC01-DEG2-DEG2-TTP-TXRX",
+                    "source": {
+                        "source-node": "ROADMA01-DEG1",
+                        "source-tp": "DEG1-TTP-TXRX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG2-TTP-TXRX",
+                        "dest-node": "ROADMC01-DEG2"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-latency": 0,
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADMC01-DEG2-DEG2-TTP-TXRXtoROADMA01-DEG1-DEG1-TTP-TXRX",
+                    "org-openroadm-common-network:clfi": "fiberA01C01",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                },
+                {
+                    "link-id": "ROADMC01-DEG2-DEG2-TTP-TXRXtoROADMA01-DEG1-DEG1-TTP-TXRX",
+                    "source": {
+                        "source-node": "ROADMC01-DEG2",
+                        "source-tp": "DEG2-TTP-TXRX"
+                    },
+                    "destination": {
+                        "dest-tp": "DEG1-TTP-TXRX",
+                        "dest-node": "ROADMA01-DEG1"
+                    },
+                    "org-openroadm-common-network:TE-metric": 10,
+                    "org-openroadm-common-network:administrative-state": "inService",
+                    "org-openroadm-common-network:link-latency": 0,
+                    "org-openroadm-common-network:link-type": "ROADM-TO-ROADM",
+                    "org-openroadm-common-network:operational-state": "inService",
+                    "org-openroadm-common-network:opposite-link": "ROADMA01-DEG1-DEG1-TTP-TXRXtoROADMC01-DEG2-DEG2-TTP-TXRX",
+                    "org-openroadm-common-network:clfi": "fiberC01A01",
+                    "org-openroadm-network-topology:OMS-attributes": {
+                        "span": {
+                            "engineered-spanloss": "12.200",
+                            "spanloss-base": "11.400",
+                            "link-concatenation": [
+                                {
+                                    "SRLG-Id": 0,
+                                    "fiber-type": "smf",
+                                    "pmd": "0.50",
+                                    "SRLG-length": "100000.0"
+                                }
+                            ],
+                            "auto-spanloss": true,
+                            "spanloss-current": "12.0"
+                        }
+                    }
+                }
+            ]
+        }
+    ]
+}
diff --git a/tests/sample_configs/honeynode-topo.xml b/tests/sample_configs/honeynode-topo.xml
deleted file mode 100644 (file)
index 86f8001..0000000
+++ /dev/null
@@ -1,794 +0,0 @@
-<network xmlns="urn:ietf:params:xml:ns:yang:ietf-network">
-    <network-id>openroadm-topology</network-id>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <link-id>ROADMA01-DEG2-DEG2-CTP-TXRXtoROADMA01-DEG1-DEG1-CTP-TXRX</link-id>
-        <opposite-link xmlns="http://org/openroadm/common/network">ROADMA01-DEG1-DEG1-CTP-TXRXtoROADMA01-DEG2-DEG2-CTP-TXRX</opposite-link>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <destination>
-            <dest-tp>DEG1-CTP-TXRX</dest-tp>
-            <dest-node>ROADMA01-DEG1</dest-node>
-        </destination>
-        <source>
-            <source-node>ROADMA01-DEG2</source-node>
-            <source-tp>DEG2-CTP-TXRX</source-tp>
-        </source>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <link-id>ROADMC01-SRG1-SRG1-CP-TXRXtoROADMC01-DEG2-DEG2-CTP-TXRX</link-id>
-        <opposite-link xmlns="http://org/openroadm/common/network">ROADMC01-DEG2-DEG2-CTP-TXRXtoROADMC01-SRG1-SRG1-CP-TXRX</opposite-link>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <destination>
-            <dest-tp>DEG2-CTP-TXRX</dest-tp>
-            <dest-node>ROADMC01-DEG2</dest-node>
-        </destination>
-        <source>
-            <source-node>ROADMC01-SRG1</source-node>
-            <source-tp>SRG1-CP-TXRX</source-tp>
-        </source>
-        <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <link-id>ROADMA01-SRG1-SRG1-CP-TXRXtoROADMA01-DEG1-DEG1-CTP-TXRX</link-id>
-        <opposite-link xmlns="http://org/openroadm/common/network">ROADMA01-DEG1-DEG1-CTP-TXRXtoROADMA01-SRG1-SRG1-CP-TXRX</opposite-link>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <destination>
-            <dest-tp>DEG1-CTP-TXRX</dest-tp>
-            <dest-node>ROADMA01-DEG1</dest-node>
-        </destination>
-        <source>
-            <source-node>ROADMA01-SRG1</source-node>
-            <source-tp>SRG1-CP-TXRX</source-tp>
-        </source>
-        <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <link-id>XPDRA01-XPDR1-XPDR1-NETWORK1toROADMA01-SRG1-SRG1-PP1-TXRX</link-id>
-        <opposite-link xmlns="http://org/openroadm/common/network">ROADMA01-SRG1-SRG1-PP1-TXRXtoXPDRA01-XPDR1-XPDR1-NETWORK1</opposite-link>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <destination>
-            <dest-tp>SRG1-PP1-TXRX</dest-tp>
-            <dest-node>ROADMA01-SRG1</dest-node>
-        </destination>
-        <source>
-            <source-node>XPDRA01-XPDR1</source-node>
-            <source-tp>XPDR1-NETWORK1</source-tp>
-        </source>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <link-id>ROADMA01-DEG1-DEG1-CTP-TXRXtoROADMA01-DEG2-DEG2-CTP-TXRX</link-id>
-        <opposite-link xmlns="http://org/openroadm/common/network">ROADMA01-DEG2-DEG2-CTP-TXRXtoROADMA01-DEG1-DEG1-CTP-TXRX</opposite-link>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <destination>
-            <dest-tp>DEG2-CTP-TXRX</dest-tp>
-            <dest-node>ROADMA01-DEG2</dest-node>
-        </destination>
-        <source>
-            <source-node>ROADMA01-DEG1</source-node>
-            <source-tp>DEG1-CTP-TXRX</source-tp>
-        </source>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <link-id>ROADMC01-DEG2-DEG2-CTP-TXRXtoROADMC01-DEG1-DEG1-CTP-TXRX</link-id>
-        <opposite-link xmlns="http://org/openroadm/common/network">ROADMC01-DEG1-DEG1-CTP-TXRXtoROADMC01-DEG2-DEG2-CTP-TXRX</opposite-link>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <destination>
-            <dest-tp>DEG1-CTP-TXRX</dest-tp>
-            <dest-node>ROADMC01-DEG1</dest-node>
-        </destination>
-        <source>
-            <source-node>ROADMC01-DEG2</source-node>
-            <source-tp>DEG2-CTP-TXRX</source-tp>
-        </source>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <link-id>ROADMC01-DEG1-DEG1-CTP-TXRXtoROADMC01-DEG2-DEG2-CTP-TXRX</link-id>
-        <opposite-link xmlns="http://org/openroadm/common/network">ROADMC01-DEG2-DEG2-CTP-TXRXtoROADMC01-DEG1-DEG1-CTP-TXRX</opposite-link>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <destination>
-            <dest-tp>DEG2-CTP-TXRX</dest-tp>
-            <dest-node>ROADMC01-DEG2</dest-node>
-        </destination>
-        <source>
-            <source-node>ROADMC01-DEG1</source-node>
-            <source-tp>DEG1-CTP-TXRX</source-tp>
-        </source>
-        <link-type xmlns="http://org/openroadm/common/network">EXPRESS-LINK</link-type>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <link-id>ROADMA01-DEG1-DEG1-CTP-TXRXtoROADMA01-SRG1-SRG1-CP-TXRX</link-id>
-        <opposite-link xmlns="http://org/openroadm/common/network">ROADMA01-SRG1-SRG1-CP-TXRXtoROADMA01-DEG1-DEG1-CTP-TXRX</opposite-link>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <destination>
-            <dest-tp>SRG1-CP-TXRX</dest-tp>
-            <dest-node>ROADMA01-SRG1</dest-node>
-        </destination>
-        <source>
-            <source-node>ROADMA01-DEG1</source-node>
-            <source-tp>DEG1-CTP-TXRX</source-tp>
-        </source>
-        <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <link-id>ROADMA01-DEG2-DEG2-CTP-TXRXtoROADMA01-SRG1-SRG1-CP-TXRX</link-id>
-        <opposite-link xmlns="http://org/openroadm/common/network">ROADMA01-SRG1-SRG1-CP-TXRXtoROADMA01-DEG2-DEG2-CTP-TXRX</opposite-link>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <destination>
-            <dest-tp>SRG1-CP-TXRX</dest-tp>
-            <dest-node>ROADMA01-SRG1</dest-node>
-        </destination>
-        <source>
-            <source-node>ROADMA01-DEG2</source-node>
-            <source-tp>DEG2-CTP-TXRX</source-tp>
-        </source>
-        <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <link-id>ROADMA01-DEG1-DEG1-TTP-TXRXtoROADMC01-DEG2-DEG2-TTP-TXRX</link-id>
-        <opposite-link xmlns="http://org/openroadm/common/network">ROADMC01-DEG2-DEG2-TTP-TXRXtoROADMA01-DEG1-DEG1-TTP-TXRX</opposite-link>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <clfi xmlns="http://org/openroadm/common/network">fiberA01C01</clfi>
-        <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-        <destination>
-            <dest-tp>DEG2-TTP-TXRX</dest-tp>
-            <dest-node>ROADMC01-DEG2</dest-node>
-        </destination>
-        <source>
-            <source-node>ROADMA01-DEG1</source-node>
-            <source-tp>DEG1-TTP-TXRX</source-tp>
-        </source>
-        <OMS-attributes xmlns="http://org/openroadm/network/topology">
-            <span>
-                <auto-spanloss>true</auto-spanloss>
-                <spanloss-base>11.4</spanloss-base>
-                <spanloss-current>12</spanloss-current>
-                <engineered-spanloss>12.2</engineered-spanloss>
-                <link-concatenation>
-                    <SRLG-Id>0</SRLG-Id>
-                    <fiber-type>smf</fiber-type>
-                    <SRLG-length>100000</SRLG-length>
-                    <pmd>0.5</pmd>
-                </link-concatenation>
-            </span>
-        </OMS-attributes>
-        <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-        <link-latency xmlns="http://org/openroadm/common/network">0</link-latency>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <link-id>ROADMA01-SRG1-SRG1-PP1-TXRXtoXPDRA01-XPDR1-XPDR1-NETWORK1</link-id>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPDRA01-XPDR1-XPDR1-NETWORK1toROADMA01-SRG1-SRG1-PP1-TXRX</opposite-link>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <destination>
-            <dest-tp>XPDR1-NETWORK1</dest-tp>
-            <dest-node>XPDRA01-XPDR1</dest-node>
-        </destination>
-        <source>
-            <source-node>ROADMA01-SRG1</source-node>
-            <source-tp>SRG1-PP1-TXRX</source-tp>
-        </source>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <link-id>ROADMC01-DEG2-DEG2-TTP-TXRXtoROADMA01-DEG1-DEG1-TTP-TXRX</link-id>
-        <opposite-link xmlns="http://org/openroadm/common/network">ROADMA01-DEG1-DEG1-TTP-TXRXtoROADMC01-DEG2-DEG2-TTP-TXRX</opposite-link>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <clfi xmlns="http://org/openroadm/common/network">fiberC01A01</clfi>
-        <TE-metric xmlns="http://org/openroadm/common/network">10</TE-metric>
-        <destination>
-            <dest-tp>DEG1-TTP-TXRX</dest-tp>
-            <dest-node>ROADMA01-DEG1</dest-node>
-        </destination>
-        <source>
-            <source-node>ROADMC01-DEG2</source-node>
-            <source-tp>DEG2-TTP-TXRX</source-tp>
-        </source>
-        <OMS-attributes xmlns="http://org/openroadm/network/topology">
-            <span>
-                <auto-spanloss>true</auto-spanloss>
-                <spanloss-base>11.4</spanloss-base>
-                <spanloss-current>12</spanloss-current>
-                <engineered-spanloss>12.2</engineered-spanloss>
-                <link-concatenation>
-                    <SRLG-Id>0</SRLG-Id>
-                    <fiber-type>smf</fiber-type>
-                    <SRLG-length>100000</SRLG-length>
-                    <pmd>0.5</pmd>
-                </link-concatenation>
-            </span>
-        </OMS-attributes>
-        <link-type xmlns="http://org/openroadm/common/network">ROADM-TO-ROADM</link-type>
-        <link-latency xmlns="http://org/openroadm/common/network">0</link-latency>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <link-id>ROADMC01-DEG1-DEG1-CTP-TXRXtoROADMC01-SRG1-SRG1-CP-TXRX</link-id>
-        <opposite-link xmlns="http://org/openroadm/common/network">ROADMC01-SRG1-SRG1-CP-TXRXtoROADMC01-DEG1-DEG1-CTP-TXRX</opposite-link>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <destination>
-            <dest-tp>SRG1-CP-TXRX</dest-tp>
-            <dest-node>ROADMC01-SRG1</dest-node>
-        </destination>
-        <source>
-            <source-node>ROADMC01-DEG1</source-node>
-            <source-tp>DEG1-CTP-TXRX</source-tp>
-        </source>
-        <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <link-id>ROADMC01-SRG1-SRG1-CP-TXRXtoROADMC01-DEG1-DEG1-CTP-TXRX</link-id>
-        <opposite-link xmlns="http://org/openroadm/common/network">ROADMC01-DEG1-DEG1-CTP-TXRXtoROADMC01-SRG1-SRG1-CP-TXRX</opposite-link>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <destination>
-            <dest-tp>DEG1-CTP-TXRX</dest-tp>
-            <dest-node>ROADMC01-DEG1</dest-node>
-        </destination>
-        <source>
-            <source-node>ROADMC01-SRG1</source-node>
-            <source-tp>SRG1-CP-TXRX</source-tp>
-        </source>
-        <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <link-id>ROADMC01-DEG2-DEG2-CTP-TXRXtoROADMC01-SRG1-SRG1-CP-TXRX</link-id>
-        <opposite-link xmlns="http://org/openroadm/common/network">ROADMC01-SRG1-SRG1-CP-TXRXtoROADMC01-DEG2-DEG2-CTP-TXRX</opposite-link>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <destination>
-            <dest-tp>SRG1-CP-TXRX</dest-tp>
-            <dest-node>ROADMC01-SRG1</dest-node>
-        </destination>
-        <source>
-            <source-node>ROADMC01-DEG2</source-node>
-            <source-tp>DEG2-CTP-TXRX</source-tp>
-        </source>
-        <link-type xmlns="http://org/openroadm/common/network">DROP-LINK</link-type>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <link-id>ROADMC01-SRG1-SRG1-PP1-TXRXtoXPDRC01-XPDR1-XPDR1-NETWORK1</link-id>
-        <opposite-link xmlns="http://org/openroadm/common/network">XPDRC01-XPDR1-XPDR1-NETWORK1toROADMC01-SRG1-SRG1-PP1-TXRX</opposite-link>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <destination>
-            <dest-tp>XPDR1-NETWORK1</dest-tp>
-            <dest-node>XPDRC01-XPDR1</dest-node>
-        </destination>
-        <source>
-            <source-node>ROADMC01-SRG1</source-node>
-            <source-tp>SRG1-PP1-TXRX</source-tp>
-        </source>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-INPUT</link-type>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <link-id>ROADMA01-SRG1-SRG1-CP-TXRXtoROADMA01-DEG2-DEG2-CTP-TXRX</link-id>
-        <opposite-link xmlns="http://org/openroadm/common/network">ROADMA01-DEG2-DEG2-CTP-TXRXtoROADMA01-SRG1-SRG1-CP-TXRX</opposite-link>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <destination>
-            <dest-tp>DEG2-CTP-TXRX</dest-tp>
-            <dest-node>ROADMA01-DEG2</dest-node>
-        </destination>
-        <source>
-            <source-node>ROADMA01-SRG1</source-node>
-            <source-tp>SRG1-CP-TXRX</source-tp>
-        </source>
-        <link-type xmlns="http://org/openroadm/common/network">ADD-LINK</link-type>
-    </link>
-    <link xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-        <link-id>XPDRC01-XPDR1-XPDR1-NETWORK1toROADMC01-SRG1-SRG1-PP1-TXRX</link-id>
-        <opposite-link xmlns="http://org/openroadm/common/network">ROADMC01-SRG1-SRG1-PP1-TXRXtoXPDRC01-XPDR1-XPDR1-NETWORK1</opposite-link>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <destination>
-            <dest-tp>SRG1-PP1-TXRX</dest-tp>
-            <dest-node>ROADMC01-SRG1</dest-node>
-        </destination>
-        <source>
-            <source-node>XPDRC01-XPDR1</source-node>
-            <source-tp>XPDR1-NETWORK1</source-tp>
-        </source>
-        <link-type xmlns="http://org/openroadm/common/network">XPONDER-OUTPUT</link-type>
-    </link>
-    <network-types>
-        <openroadm-common-network xmlns="http://org/openroadm/common/network"></openroadm-common-network>
-    </network-types>
-    <node>
-        <node-id>ROADMC01-SRG1</node-id>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP12-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP15-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP5-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP8-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP6-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP9-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP10-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP14-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP16-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP7-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP11-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP13-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <supporting-node>
-            <network-ref>openroadm-network</network-ref>
-            <node-ref>ROADMC01</node-ref>
-        </supporting-node>
-        <supporting-node>
-            <network-ref>clli-network</network-ref>
-            <node-ref>NodeC</node-ref>
-        </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-                </freq-map>
-            </avail-freq-maps>s>
-        </srg-attributes>
-        <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    </node>
-    <node>
-        <node-id>ROADMC01-DEG1</node-id>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>DEG1-CTP-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TXRX-CTP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>DEG1-TTP-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TXRX-TTP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-        <supporting-node>
-            <network-ref>openroadm-network</network-ref>
-            <node-ref>ROADMC01</node-ref>
-        </supporting-node>
-        <supporting-node>
-            <network-ref>clli-network</network-ref>
-            <node-ref>NodeC</node-ref>
-        </supporting-node>
-        <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <degree-number>1</degree-number>
-           <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-                </freq-map>
-            </avail-freq-maps>s>
-        </degree-attributes>
-    </node>
-    <node>
-        <node-id>ROADMC01-DEG2</node-id>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>DEG2-TTP-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TXRX-TTP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>DEG2-CTP-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TXRX-CTP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-        <supporting-node>
-            <network-ref>openroadm-network</network-ref>
-            <node-ref>ROADMC01</node-ref>
-        </supporting-node>
-        <supporting-node>
-            <network-ref>clli-network</network-ref>
-            <node-ref>NodeC</node-ref>
-        </supporting-node>
-        <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <degree-number>2</degree-number>
-        <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-                </freq-map>
-            </avail-freq-maps>s>
-        </degree-attributes>
-    </node>
-    <node>
-        <node-id>ROADMA01-SRG1</node-id>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP12-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP15-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP1-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP2-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-CP-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-CP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP5-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP8-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP6-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP9-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP3-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP10-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP14-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP16-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP7-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP11-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP13-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>SRG1-PP4-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">SRG-TXRX-PP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <supporting-node>
-            <network-ref>openroadm-network</network-ref>
-            <node-ref>ROADMA01</node-ref>
-        </supporting-node>
-        <supporting-node>
-            <network-ref>clli-network</network-ref>
-            <node-ref>NodeA</node-ref>
-        </supporting-node>
-        <srg-attributes xmlns="http://org/openroadm/network/topology">
-        <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-                </freq-map>
-            </avail-freq-maps>s>
-        </srg-attributes>
-        <node-type xmlns="http://org/openroadm/common/network">SRG</node-type>
-    </node>
-    <node>
-        <node-id>XPDRA01-XPDR1</node-id>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>XPDR1-NETWORK2</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-            <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-CLIENT2</associated-connection-map-port>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>XPDR1-CLIENT2</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-            <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-NETWORK2</associated-connection-map-port>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>XPDR1-CLIENT1</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-            <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-NETWORK1</associated-connection-map-port>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>XPDR1-NETWORK1</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-            <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-CLIENT1</associated-connection-map-port>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-        <supporting-node>
-            <network-ref>openroadm-network</network-ref>
-            <node-ref>XPDRA01</node-ref>
-        </supporting-node>
-        <supporting-node>
-            <network-ref>clli-network</network-ref>
-            <node-ref>NodeA</node-ref>
-        </supporting-node>
-    </node>
-    <node>
-        <node-id>ROADMA01-DEG2</node-id>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>DEG2-TTP-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TXRX-TTP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>DEG2-CTP-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TXRX-CTP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-        <supporting-node>
-            <network-ref>openroadm-network</network-ref>
-            <node-ref>ROADMA01</node-ref>
-        </supporting-node>
-        <supporting-node>
-            <network-ref>clli-network</network-ref>
-            <node-ref>NodeA</node-ref>
-        </supporting-node>
-        <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <degree-number>2</degree-number>
-         <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-                </freq-map>
-            </avail-freq-maps>s>
-        </degree-attributes>
-    </node>
-    <node>
-        <node-id>XPDRC01-XPDR1</node-id>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>XPDR1-NETWORK2</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-            <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-CLIENT2</associated-connection-map-port>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>XPDR1-CLIENT2</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-            <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-NETWORK2</associated-connection-map-port>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>XPDR1-CLIENT1</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">XPONDER-CLIENT</tp-type>
-            <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-NETWORK1</associated-connection-map-port>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>XPDR1-NETWORK1</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">XPONDER-NETWORK</tp-type>
-            <associated-connection-map-port xmlns="http://transportpce/topology">XPDR1-CLIENT1</associated-connection-map-port>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <node-type xmlns="http://org/openroadm/common/network">XPONDER</node-type>
-        <supporting-node>
-            <network-ref>openroadm-network</network-ref>
-            <node-ref>XPDRC01</node-ref>
-        </supporting-node>
-        <supporting-node>
-            <network-ref>clli-network</network-ref>
-            <node-ref>NodeC</node-ref>
-        </supporting-node>
-    </node>
-    <node>
-        <node-id>ROADMA01-DEG1</node-id>
-        <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-        <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>DEG1-CTP-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TXRX-CTP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <termination-point xmlns="urn:ietf:params:xml:ns:yang:ietf-network-topology">
-            <tp-id>DEG1-TTP-TXRX</tp-id>
-            <tp-type xmlns="http://org/openroadm/common/network">DEGREE-TXRX-TTP</tp-type>
-            <administrative-state xmlns="http://org/openroadm/common/network">inService</administrative-state>
-            <operational-state xmlns="http://org/openroadm/common/network">inService</operational-state>
-        </termination-point>
-        <node-type xmlns="http://org/openroadm/common/network">DEGREE</node-type>
-        <supporting-node>
-            <network-ref>openroadm-network</network-ref>
-            <node-ref>ROADMA01</node-ref>
-        </supporting-node>
-        <supporting-node>
-            <network-ref>clli-network</network-ref>
-            <node-ref>NodeA</node-ref>
-        </supporting-node>
-        <degree-attributes xmlns="http://org/openroadm/network/topology">
-            <degree-number>1</degree-number>
-            <avail-freq-maps>
-                <map-name>cband</map-name>
-                <start-edge-freq>191.325</start-edge-freq>
-                <freq-map-granularity>6.25</freq-map-granularity>
-                <effective-bits>768</effective-bits>
-                <freq-map>////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-                </freq-map>
-            </avail-freq-maps>s>
-        </degree-attributes>
-    </node>
-</network>
index 854adea78d767b089d60a2a6dcc99d80fbb99f87..6706f15c32ba0277551db9d301a7c63fe701f04d 100644 (file)
@@ -76,7 +76,9 @@
                             "org-openroadm-common-network:operational-state": "inService",
                             "org-openroadm-common-network:administrative-state": "inService",
                             "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-NETWORK1"
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-NETWORK1"
+                            ]
                         },
                         {
                             "tp-id": "XPDR1-NETWORK1",
@@ -86,7 +88,9 @@
                             "org-openroadm-common-network:operational-state": "inService",
                             "org-openroadm-common-network:administrative-state": "inService",
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-CLIENT1"
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-CLIENT1"
+                            ]
                         }
                     ],
                     "supporting-node": [
                             "org-openroadm-common-network:operational-state": "inService",
                             "org-openroadm-common-network:administrative-state": "inService",
                             "org-openroadm-common-network:tp-type": "XPONDER-CLIENT",
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-NETWORK1"
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-NETWORK1"
+                            ]
                         },
                         {
                             "tp-id": "XPDR1-NETWORK1",
                             "org-openroadm-common-network:operational-state": "inService",
                             "org-openroadm-common-network:administrative-state": "inService",
                             "org-openroadm-common-network:tp-type": "XPONDER-NETWORK",
-                            "transportpce-topology:associated-connection-map-port": "XPDR1-CLIENT1"
+                            "org-openroadm-common-network:associated-connection-map-tp": [
+                                "XPDR1-CLIENT1"
+                            ]
                         }
                     ],
                     "supporting-node": [
             ]
         }
     ]
-}
\ No newline at end of file
+}
index 9e3646ada688aa99ec2ba4ba1fba777311375e04..a9dc27df697397fbd82d4748ec738ad5838f9aab 100644 (file)
         <port-name>C1</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C2</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C3</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C4</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C5</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C6</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C7</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C8</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C9</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>L1</port-name>
         <port-type>LINE</port-type>
         <port-qual>roadm-external</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>LOG1</port-name>
         <port-type>Logical</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>OSC-DEMUX</port-name>
         <port-type>OSC</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>OSC-PORT</port-name>
         <port-type>1GEX</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>ETH-PLUG</port-name>
         <port-type>1GEX</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>C1</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C2</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C3</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C4</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C5</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C6</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C7</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C8</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C9</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>L1</port-name>
         <port-type>LINE</port-type>
         <port-qual>roadm-external</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>LOG1</port-name>
         <port-type>Logical</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>OSC-DEMUX</port-name>
         <port-type>OSC</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>OSC-PORT</port-name>
         <port-type>1GEX</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>ETH-PLUG</port-name>
         <port-type>1GEX</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG1</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG2</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG3</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG4</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG1</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG2</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG3</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG4</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
index 3aeba3ca67c44829d28cb3cd482978cef5b69570..a21936b6a95ec41673c616c0623ea6e1d576f2c9 100644 (file)
         <port-name>C1</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C2</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C3</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C4</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C5</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C6</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C7</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C8</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C9</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>L1</port-name>
         <port-type>LINE</port-type>
         <port-qual>roadm-external</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>LOG1</port-name>
         <port-type>Logical</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>OSC-DEMUX</port-name>
         <port-type>OSC</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>OSC-PORT</port-name>
         <port-type>1GEX</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>ETH-PLUG</port-name>
         <port-type>1GEX</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>C1</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C2</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C3</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C4</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C5</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C6</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C7</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C8</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C9</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>L1</port-name>
         <port-type>LINE</port-type>
         <port-qual>roadm-external</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>LOG1</port-name>
         <port-type>Logical</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>OSC-DEMUX</port-name>
         <port-type>OSC</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>OSC-PORT</port-name>
         <port-type>1GEX</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>ETH-PLUG</port-name>
         <port-type>1GEX</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG1</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG2</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG3</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG4</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG1</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG2</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG3</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG4</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
index 9ef8d0884b23f614e37a346b9fec0b4a66b96bc7..17457964129a02481c14f5d8f538b8ed07ab70bb 100644 (file)
         <port-name>C1</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C2</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C3</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C4</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C5</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C6</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C7</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C8</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C9</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>L1</port-name>
         <port-type>LINE</port-type>
         <port-qual>roadm-external</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>LOG1</port-name>
         <port-type>Logical</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>OSC-DEMUX</port-name>
         <port-type>OSC</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>OSC-PORT</port-name>
         <port-type>1GEX</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>ETH-PLUG</port-name>
         <port-type>1GEX</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>C1</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C2</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C3</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C4</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C5</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C6</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C7</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C8</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C9</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>L1</port-name>
         <port-type>LINE</port-type>
         <port-qual>roadm-external</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>LOG1</port-name>
         <port-type>Logical</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>OSC-DEMUX</port-name>
         <port-type>OSC</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>OSC-PORT</port-name>
         <port-type>1GEX</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>ETH-PLUG</port-name>
         <port-type>1GEX</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG1</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG2</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG3</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG4</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG1</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG2</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG3</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG4</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
index a958bef4325fb05470644008a6e9e7c7be8f6a19..f60da3f29cdbc5db823d97e53aa9a52e6116b0a3 100644 (file)
         <port-name>C1</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C2</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C3</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C4</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C5</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C6</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C7</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C8</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C9</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>L1</port-name>
         <port-type>LINE</port-type>
         <port-qual>roadm-external</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>LOG1</port-name>
         <port-type>Logical</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>OSC-DEMUX</port-name>
         <port-type>OSC</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>OSC-PORT</port-name>
         <port-type>1GEX</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>ETH-PLUG</port-name>
         <port-type>1GEX</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>C1</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C2</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C3</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C4</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C5</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C6</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C7</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C8</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C9</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>L1</port-name>
         <port-type>LINE</port-type>
         <port-qual>roadm-external</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>LOG1</port-name>
         <port-type>Logical</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>OSC-DEMUX</port-name>
         <port-type>OSC</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>OSC-PORT</port-name>
         <port-type>1GEX</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>ETH-PLUG</port-name>
         <port-type>1GEX</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG1</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG2</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG3</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG4</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG1</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG2</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG3</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG4</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
index db7f3a9feaa04c36598fd1c45eed8a4015f04437..2937e25f7a61b985c4c3deea49e739649dd086c7 100644 (file)
         <port-name>C1</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C2</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C3</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C4</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C5</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C6</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C7</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C8</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C9</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>L1</port-name>
         <port-type>LINE</port-type>
         <port-qual>roadm-external</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>LOG1</port-name>
         <port-type>Logical</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>OSC-DEMUX</port-name>
         <port-type>OSC</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>OSC-PORT</port-name>
         <port-type>1GEX</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>ETH-PLUG</port-name>
         <port-type>1GEX</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>C1</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C2</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C3</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C4</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C5</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C6</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C7</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C8</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>C9</port-name>
         <port-type>Client</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>L1</port-name>
         <port-type>LINE</port-type>
         <port-qual>roadm-external</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <circuit-id>1</circuit-id>
         <administrative-state>inService</administrative-state>
         <port-name>LOG1</port-name>
         <port-type>Logical</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>OSC-DEMUX</port-name>
         <port-type>OSC</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>OSC-PORT</port-name>
         <port-type>1GEX</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>ETH-PLUG</port-name>
         <port-type>1GEX</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG1</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG2</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG3</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
         <port-name>AD-DEG4</port-name>
         <port-type>Edge</port-type>
         <port-qual>roadm-internal</port-qual>
-        <port-wavelength-type>multi-wavelength</port-wavelength-type>
+        <port-wavelength-type>multi-wavelegnth</port-wavelength-type>
         <port-direction>bidirectional</port-direction>
         <administrative-state>inService</administrative-state>
         <operational-state>inService</operational-state>
index d17bf8ca67556b57ea30e894724224e856447a30..2a0b485e7ccc863be60179af3ac48f7cb184ab6c 100644 (file)
       </measurement>
       <measurement>
         <granularity>24Hour</granularity>
-        <pmParameterValue>-49.3</pmParameterValue>
+        <pmParameterValue>-21.3</pmParameterValue>
         <pmParameterUnit>dBm</pmParameterUnit>
         <validity>complete</validity>
       </measurement>
       </measurement>
       <measurement>
         <granularity>24Hour</granularity>
-        <pmParameterValue>-49.3</pmParameterValue>
+        <pmParameterValue>-21.3</pmParameterValue>
         <pmParameterUnit>dBm</pmParameterUnit>
         <validity>complete</validity>
       </measurement>
   </current-pm-entry>
   </current-pm-list>
 
+  <current-pm-description xmlns="http://honeynode-simulator/pm-handling">
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:opticalTransport</triggering-interface>
+      <pm-name-prefix>opticalPowerOutput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of the first NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[TX/TXRX]-[frequency]-->
+      <!--Its value will be changed as additional NMC are created-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>0</default-current-value>
+      <max-value>21.82</max-value>
+      <min-value>-9.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>5</evolution-range>
+    </pm-generation-rules>
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:opticalTransport</triggering-interface>
+      <pm-name-prefix>opticalPowerInput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of a NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[RX/TXRX]-[frequency]-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>-17.0</default-current-value>
+      <max-value>-9.0</max-value>
+      <min-value>-25.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>10</evolution-range>
+    </pm-generation-rules>
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:openROADMOpticalMultiplex</triggering-interface>
+      <pm-name-prefix>opticalPowerOutput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of the first NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[TX/TXRX]-[frequency]-->
+      <!--Its value will be changed as additional NMC are created-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>0</default-current-value>
+      <max-value>21.82</max-value>
+      <min-value>-9.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>5</evolution-range>
+    </pm-generation-rules>
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:openROADMOpticalMultiplex</triggering-interface>
+      <pm-name-prefix>opticalPowerInput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of a NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[RX/TXRX]-[frequency]-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>-17.0</default-current-value>
+      <max-value>-9.0</max-value>
+      <min-value>-25.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>10</evolution-range>
+    </pm-generation-rules>
+  </current-pm-description>
+
  </data>
index d2eee953542ddd028f01ac946e0bc13bfdc27838..50de974c5819aa2de55fd10929340581d0718c24 100644 (file)
   </current-pm-entry>
   </current-pm-list>
 
- </data>
+  <current-pm-description xmlns="http://honeynode-simulator/pm-handling">
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:opticalTransport</triggering-interface>
+      <pm-name-prefix>opticalPowerOutput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of the first NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[TX/TXRX]-[frequency]-->
+      <!--Its value will be changed as additional NMC are created-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>0</default-current-value>
+      <max-value>21.82</max-value>
+      <min-value>-9.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>5</evolution-range>
+    </pm-generation-rules>
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:opticalTransport</triggering-interface>
+      <pm-name-prefix>opticalPowerInput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of a NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[RX/TXRX]-[frequency]-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>-17.0</default-current-value>
+      <max-value>-9.0</max-value>
+      <min-value>-25.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>10</evolution-range>
+    </pm-generation-rules>
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:openROADMOpticalMultiplex</triggering-interface>
+      <pm-name-prefix>opticalPowerOutput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of the first NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[TX/TXRX]-[frequency]-->
+      <!--Its value will be changed as additional NMC are created-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>0</default-current-value>
+      <max-value>21.82</max-value>
+      <min-value>-9.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>5</evolution-range>
+    </pm-generation-rules>
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:openROADMOpticalMultiplex</triggering-interface>
+      <pm-name-prefix>opticalPowerInput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of a NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[RX/TXRX]-[frequency]-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>-17.0</default-current-value>
+      <max-value>-9.0</max-value>
+      <min-value>-25.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>10</evolution-range>
+    </pm-generation-rules>
+  </current-pm-description>
+
+</data>
index de0a5e5eb4359d0283ea5cded82152bf0431636b..49d43e0a64b0bbedb8e509481f1b325ca265ec5f 100644 (file)
   </current-pm-entry>
   </current-pm-list>
 
- </data>
+  <current-pm-description xmlns="http://honeynode-simulator/pm-handling">
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:opticalTransport</triggering-interface>
+      <pm-name-prefix>opticalPowerOutput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of the first NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[TX/TXRX]-[frequency]-->
+      <!--Its value will be changed as additional NMC are created-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>0</default-current-value>
+      <max-value>21.82</max-value>
+      <min-value>-9.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>5</evolution-range>
+    </pm-generation-rules>
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:opticalTransport</triggering-interface>
+      <pm-name-prefix>opticalPowerInput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of a NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[RX/TXRX]-[frequency]-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>-17.0</default-current-value>
+      <max-value>-9.0</max-value>
+      <min-value>-25.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>10</evolution-range>
+    </pm-generation-rules>
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:openROADMOpticalMultiplex</triggering-interface>
+      <pm-name-prefix>opticalPowerOutput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of the first NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[TX/TXRX]-[frequency]-->
+      <!--Its value will be changed as additional NMC are created-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>0</default-current-value>
+      <max-value>21.82</max-value>
+      <min-value>-9.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>5</evolution-range>
+    </pm-generation-rules>
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:openROADMOpticalMultiplex</triggering-interface>
+      <pm-name-prefix>opticalPowerInput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of a NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[RX/TXRX]-[frequency]-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>-17.0</default-current-value>
+      <max-value>-9.0</max-value>
+      <min-value>-25.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>10</evolution-range>
+    </pm-generation-rules>
+  </current-pm-description>
+
+</data>
index 2b99e3aef97770f664f43385655cc38edc7d6d8c..656b07c6777f2a5be7023497a5b6c67c3fde39d0 100644 (file)
   </current-pm-entry>
   </current-pm-list>
 
+  <current-pm-description xmlns="http://honeynode-simulator/pm-handling">
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:opticalTransport</triggering-interface>
+      <pm-name-prefix>opticalPowerOutput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of the first NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[TX/TXRX]-[frequency]-->
+      <!--Its value will be changed as additional NMC are created-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>0</default-current-value>
+      <max-value>21.82</max-value>
+      <min-value>-9.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>5</evolution-range>
+    </pm-generation-rules>
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:opticalTransport</triggering-interface>
+      <pm-name-prefix>opticalPowerInput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of a NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[RX/TXRX]-[frequency]-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>-17.0</default-current-value>
+      <max-value>-9.0</max-value>
+      <min-value>-25.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>10</evolution-range>
+    </pm-generation-rules>
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:openROADMOpticalMultiplex</triggering-interface>
+      <pm-name-prefix>opticalPowerOutput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of the first NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[TX/TXRX]-[frequency]-->
+      <!--Its value will be changed as additional NMC are created-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>0</default-current-value>
+      <max-value>21.82</max-value>
+      <min-value>-9.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>5</evolution-range>
+    </pm-generation-rules>
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:openROADMOpticalMultiplex</triggering-interface>
+      <pm-name-prefix>opticalPowerInput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of a NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[RX/TXRX]-[frequency]-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>-17.0</default-current-value>
+      <max-value>-9.0</max-value>
+      <min-value>-25.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>10</evolution-range>
+    </pm-generation-rules>
+  </current-pm-description>
+
  </data>
index d09d3906706dead55083c48289efad162aee4d4a..26b766ddf9dd61bb321002597052b6e7ee4ff718 100644 (file)
       </connection-ports>
     </degree>
   </org-openroadm-device>
- </data>
+
+  <current-pm-list xmlns="http://org/openroadm/pm">
+  <current-pm-entry>
+    <pm-resource-instance xmlns:d="http://org/openroadm/device">/d:org-openroadm-device/d:interface[d:name='OTS-DEG1-TTP-TXRX']</pm-resource-instance>
+    <pm-resource-type>interface</pm-resource-type>
+    <pm-resource-type-extension></pm-resource-type-extension>
+    <retrieval-time>2018-06-07T13:22:58+00:00</retrieval-time>
+    <current-pm>
+      <type>opticalPowerOutput</type>
+      <extension></extension>
+      <location>nearEnd</location>
+      <direction>tx</direction>
+      <measurement>
+        <granularity>15min</granularity>
+        <pmParameterValue>2.5</pmParameterValue>
+        <pmParameterUnit>dBm</pmParameterUnit>
+        <validity>complete</validity>
+      </measurement>
+      <measurement>
+        <granularity>24Hour</granularity>
+        <pmParameterValue>2.23</pmParameterValue>
+        <pmParameterUnit>dBm</pmParameterUnit>
+        <validity>complete</validity>
+      </measurement>
+    </current-pm>
+    <current-pm>
+      <type>opticalPowerInput</type>
+      <extension></extension>
+      <location>nearEnd</location>
+      <direction>rx</direction>
+      <measurement>
+        <granularity>15min</granularity>
+        <pmParameterValue>-21.1</pmParameterValue>
+        <pmParameterUnit>dBm</pmParameterUnit>
+        <validity>complete</validity>
+      </measurement>
+      <measurement>
+        <granularity>24Hour</granularity>
+        <pmParameterValue>-49.3</pmParameterValue>
+        <pmParameterUnit>dBm</pmParameterUnit>
+        <validity>complete</validity>
+      </measurement>
+    </current-pm>
+    <current-pm>
+      <type>opticalReturnLoss</type>
+      <extension></extension>
+      <location>nearEnd</location>
+      <direction>rx</direction>
+      <measurement>
+        <granularity>15min</granularity>
+        <pmParameterValue>40</pmParameterValue>
+        <pmParameterUnit>dBm</pmParameterUnit>
+        <validity>complete</validity>
+      </measurement>
+      <measurement>
+        <granularity>24Hour</granularity>
+        <pmParameterValue>44</pmParameterValue>
+        <pmParameterUnit>dBm</pmParameterUnit>
+        <validity>complete</validity>
+      </measurement>
+    </current-pm>
+  </current-pm-entry>
+  <current-pm-entry>
+    <pm-resource-instance xmlns:d="http://org/openroadm/device">/d:org-openroadm-device/d:interface[d:name='OTS-DEG2-TTP-TXRX']</pm-resource-instance>
+    <pm-resource-type>interface</pm-resource-type>
+    <pm-resource-type-extension></pm-resource-type-extension>
+    <retrieval-time>2018-06-07T13:22:58+00:00</retrieval-time>
+    <current-pm>
+      <type>opticalPowerOutput</type>
+      <extension></extension>
+      <location>nearEnd</location>
+      <direction>tx</direction>
+      <measurement>
+        <granularity>15min</granularity>
+        <pmParameterValue>2.5</pmParameterValue>
+        <pmParameterUnit>dBm</pmParameterUnit>
+        <validity>complete</validity>
+      </measurement>
+      <measurement>
+        <granularity>24Hour</granularity>
+        <pmParameterValue>2.23</pmParameterValue>
+        <pmParameterUnit>dBm</pmParameterUnit>
+        <validity>complete</validity>
+      </measurement>
+    </current-pm>
+    <current-pm>
+      <type>opticalPowerInput</type>
+      <extension></extension>
+      <location>nearEnd</location>
+      <direction>rx</direction>
+      <measurement>
+        <granularity>15min</granularity>
+        <pmParameterValue>-21.1</pmParameterValue>
+        <pmParameterUnit>dBm</pmParameterUnit>
+        <validity>complete</validity>
+      </measurement>
+      <measurement>
+        <granularity>24Hour</granularity>
+        <pmParameterValue>-49.3</pmParameterValue>
+        <pmParameterUnit>dBm</pmParameterUnit>
+        <validity>complete</validity>
+      </measurement>
+    </current-pm>
+    <current-pm>
+      <type>opticalReturnLoss</type>
+      <extension></extension>
+      <location>nearEnd</location>
+      <direction>rx</direction>
+      <measurement>
+        <granularity>15min</granularity>
+        <pmParameterValue>40</pmParameterValue>
+        <pmParameterUnit>dBm</pmParameterUnit>
+        <validity>complete</validity>
+      </measurement>
+      <measurement>
+        <granularity>24Hour</granularity>
+        <pmParameterValue>44</pmParameterValue>
+        <pmParameterUnit>dBm</pmParameterUnit>
+        <validity>complete</validity>
+      </measurement>
+    </current-pm>
+  </current-pm-entry>
+  </current-pm-list>
+
+  <current-pm-description xmlns="http://honeynode-simulator/pm-handling">
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:opticalTransport</triggering-interface>
+      <pm-name-prefix>opticalPowerOutput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of the first NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[TX/TXRX]-[frequency]-->
+      <!--Its value will be changed as additional NMC are created-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>0</default-current-value>
+      <max-value>21.82</max-value>
+      <min-value>-9.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>5</evolution-range>
+    </pm-generation-rules>
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:opticalTransport</triggering-interface>
+      <pm-name-prefix>opticalPowerInput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of a NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[RX/TXRX]-[frequency]-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>-17.0</default-current-value>
+      <max-value>-9.0</max-value>
+      <min-value>-25.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>10</evolution-range>
+    </pm-generation-rules>
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:openROADMOpticalMultiplex</triggering-interface>
+      <pm-name-prefix>opticalPowerOutput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of the first NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[TX/TXRX]-[frequency]-->
+      <!--Its value will be changed as additional NMC are created-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>0</default-current-value>
+      <max-value>21.82</max-value>
+      <min-value>-9.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>5</evolution-range>
+    </pm-generation-rules>
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:openROADMOpticalMultiplex</triggering-interface>
+      <pm-name-prefix>opticalPowerInput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of a NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[RX/TXRX]-[frequency]-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>-17.0</default-current-value>
+      <max-value>-9.0</max-value>
+      <min-value>-25.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>10</evolution-range>
+    </pm-generation-rules>
+  </current-pm-description>
+
+</data>
index bbd709d524c2fe57ae536236b969dad3d273a39d..47f8f1e367f4267c29013b273cdf9365d9b55cf7 100644 (file)
   </current-pm-entry>
   </current-pm-list>
 
- </data>
+  <current-pm-description xmlns="http://honeynode-simulator/pm-handling">
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:opticalTransport</triggering-interface>
+      <pm-name-prefix>opticalPowerOutput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of the first NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[TX/TXRX]-[frequency]-->
+      <!--Its value will be changed as additional NMC are created-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>0</default-current-value>
+      <max-value>21.82</max-value>
+      <min-value>-9.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>5</evolution-range>
+    </pm-generation-rules>
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:opticalTransport</triggering-interface>
+      <pm-name-prefix>opticalPowerInput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of a NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[RX/TXRX]-[frequency]-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>-17.0</default-current-value>
+      <max-value>-9.0</max-value>
+      <min-value>-25.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>10</evolution-range>
+    </pm-generation-rules>
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:openROADMOpticalMultiplex</triggering-interface>
+      <pm-name-prefix>opticalPowerOutput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of the first NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[TX/TXRX]-[frequency]-->
+      <!--Its value will be changed as additional NMC are created-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>0</default-current-value>
+      <max-value>21.82</max-value>
+      <min-value>-9.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>5</evolution-range>
+    </pm-generation-rules>
+    <pm-generation-rules>
+      <triggering-interface xmlns:org-openroadm-interfaces="http://org/openroadm/interfaces">org-openroadm-interfaces:openROADMOpticalMultiplex</triggering-interface>
+      <pm-name-prefix>opticalPowerInput</pm-name-prefix>
+      <!--This PM is generated on ROADMs on creation of a NMC (MediaChannel) interface nmc-ttp-DEGX-TTP-[RX/TXRX]-[frequency]-->
+      <analog>true</analog>
+      <!--Default value is purely indicative, the value shall be set trough pm-interact RPC according to a value calculated from span loss and Power mask -->
+      <!--The value set through the RPC will be the value to keep as a reference out of any forced mode use to simulate a failure -->
+      <default-current-value>-17.0</default-current-value>
+      <max-value>-9.0</max-value>
+      <min-value>-25.0</min-value>
+      <!--Evolution range is a percentage of the min max range expressed in dB-->
+      <evolution-range>10</evolution-range>
+    </pm-generation-rules>
+  </current-pm-description>
+
+</data>
index 7a753f8e43ad17282e9f690bc9e011afe3a798e8..1ea950be94a7856518081b99d394a923cca031b6 100644 (file)
         <port-name>C1</port-name>
       </destination>
     </connection-map>
+    <connection-map>
+      <connection-map-number>3</connection-map-number>
+      <source>
+        <port-name>C1</port-name>
+        <circuit-pack-name>1/1/3-PLUG-CLIENT</circuit-pack-name>
+      </source>
+      <destination>
+        <circuit-pack-name>1/1/4-PLUG-NET</circuit-pack-name>
+        <port-name>L1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>4</connection-map-number>
+      <source>
+        <port-name>L1</port-name>
+        <circuit-pack-name>1/1/4-PLUG-NET</circuit-pack-name>
+      </source>
+      <destination>
+        <circuit-pack-name>1/1/3-PLUG-CLIENT</circuit-pack-name>
+        <port-name>C1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>5</connection-map-number>
+      <source>
+        <circuit-pack-name>1/1/6-PLUG-NET</circuit-pack-name>
+        <port-name>L1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>1/1/5-PLUG-NET</circuit-pack-name>
+        <port-name>L1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>6</connection-map-number>
+      <source>
+        <circuit-pack-name>1/1/5-PLUG-NET</circuit-pack-name>
+        <port-name>L1</port-name>
+      </source>
+      <destination>
+        <circuit-pack-name>1/1/6-PLUG-NET</circuit-pack-name>
+        <port-name>L1</port-name>
+      </destination>
+    </connection-map>
     <odu-switching-pools>
       <switching-pool-number>1</switching-pool-number>
       <switching-pool-type>blocking</switching-pool-type>
       <serial-id>serial-id</serial-id>
     </shelves>
     <otsigroup-capability-profile>
-      <profile-name>FOIC3.6-OTUC3</profile-name>
-      <otucn-n-rate>4</otucn-n-rate>
-      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic4.8</foic-type>
-      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODUflex-ODU4</otn-odu-mux-hierarchy-profile-name>
+      <profile-name>FOIC1.4-OTUC1</profile-name>
+      <otucn-n-rate>1</otucn-n-rate>
+      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic1.4</foic-type>
+      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODU4</otn-odu-mux-hierarchy-profile-name>
       <otn-capability-profile-name>Otn-ODUCn-TTP-no-protection</otn-capability-profile-name>
       <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OTUCn-ODUCn</if-cap-type>
     </otsigroup-capability-profile>
     <otsigroup-capability-profile>
-      <profile-name>FOIC4.8-OTUC4</profile-name>
-      <otucn-n-rate>4</otucn-n-rate>
-      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic4.8</foic-type>
-      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODUflex-ODU4</otn-odu-mux-hierarchy-profile-name>
+      <profile-name>FOIC2.4-FOIC2.8-OTUC2</profile-name>
+      <otucn-n-rate>2</otucn-n-rate>
+      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic2.8</foic-type>
+      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic2.4</foic-type>
+      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODU4</otn-odu-mux-hierarchy-profile-name>
       <otn-capability-profile-name>Otn-ODUCn-TTP-no-protection</otn-capability-profile-name>
       <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OTUCn-ODUCn</if-cap-type>
     </otsigroup-capability-profile>
     <otsigroup-capability-profile>
-      <profile-name>FOIC2.4-OTUC2</profile-name>
-      <otucn-n-rate>4</otucn-n-rate>
-      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic4.8</foic-type>
-      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODUflex-ODU4</otn-odu-mux-hierarchy-profile-name>
-      <otn-capability-profile-name>Otn-ODUCn-TTP-no-protection</otn-capability-profile-name>
+      <profile-name>FOIC3.6-OTUC3</profile-name>
+      <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OTUCn-ODUCn</if-cap-type>
+      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODU4</otn-odu-mux-hierarchy-profile-name>
+      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic3.6</foic-type>
+      <otucn-n-rate>3</otucn-n-rate>
+      <otn-capability-profile-name>otn-ODUCn-TTP-no-protection</otn-capability-profile-name>
+    </otsigroup-capability-profile>
+    <otsigroup-capability-profile>
+      <profile-name>FOIC4.8-OTUC4</profile-name>
       <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OTUCn-ODUCn</if-cap-type>
+      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODUflex-ODU4</otn-odu-mux-hierarchy-profile-name>
+      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic4.8</foic-type>
+      <otucn-n-rate>4</otucn-n-rate>
+      <otn-capability-profile-name>otn-ODUCn-TTP-no-protection</otn-capability-profile-name>
     </otsigroup-capability-profile>
     <mc-capability-profile>
       <profile-name>mc-capa-profile1</profile-name>
       <hardware-version>hardware-version</hardware-version>
       <serial-id>serial-id</serial-id>
     </circuit-packs>
+    <circuit-packs>
+      <circuit-pack-name>1/1/3-PLUG-CLIENT</circuit-pack-name>
+      <product-code>product-code</product-code>
+      <circuit-pack-product-code>circuit-pack-product-code</circuit-pack-product-code>
+      <is-physical>true</is-physical>
+      <clei>clei</clei>
+      <model>model</model>
+      <manufacture-date>2021-02-08T15:23:43Z</manufacture-date>
+      <shelf>1</shelf>
+      <ports>
+        <port-name>C1</port-name>
+        <administrative-state>inService</administrative-state>
+        <port-capabilities xmlns="http://org/openroadm/port-capability">
+          <supported-interface-capability>
+            <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</if-cap-type>
+            <otn-capability>
+              <otn-capability-profile-name>xponder-client-no-protection</otn-capability-profile-name>
+            </otn-capability>
+          </supported-interface-capability>
+          <supported-interface-capability>
+            <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-100GE</if-cap-type>
+          </supported-interface-capability>
+        </port-capabilities>
+        <port-type>QSFP28</port-type>
+        <faceplate-label>faceplate-label</faceplate-label>
+        <is-physical>true</is-physical>
+        <operational-state>inService</operational-state>
+        <port-direction>bidirectional</port-direction>
+        <lifecycle-state>deployed</lifecycle-state>
+        <port-qual>xpdr-client</port-qual>
+      </ports>
+      <type>Plug_Client_100GE</type>
+      <is-pluggable-optics>true</is-pluggable-optics>
+      <slot>1</slot>
+      <administrative-state>inService</administrative-state>
+      <parent-circuit-pack>
+        <circuit-pack-name>1/1</circuit-pack-name>
+        <cp-slot-name>slot-1</cp-slot-name>
+      </parent-circuit-pack>
+      <faceplate-label>faceplate-label</faceplate-label>
+      <vendor>vendor-A</vendor>
+      <is-passive>false</is-passive>
+      <circuit-pack-category>
+        <type>circuitPack</type>
+      </circuit-pack-category>
+      <operational-state>inService</operational-state>
+      <lifecycle-state>deployed</lifecycle-state>
+      <equipment-state>not-reserved-available</equipment-state>
+      <circuit-pack-type>Plug_Client_100GE</circuit-pack-type>
+      <hardware-version>hardware-version</hardware-version>
+      <serial-id>serial-id</serial-id>
+    </circuit-packs>
     <circuit-packs>
       <circuit-pack-name>1/2/2-PLUG-NET</circuit-pack-name>
       <product-code>product-code</product-code>
             <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-otsi-otsigroup</if-cap-type>
             <otsigroup-capability-profile-name>FOIC4.8-OTUC4</otsigroup-capability-profile-name>
             <otsigroup-capability-profile-name>FOIC3.6-OTUC3</otsigroup-capability-profile-name>
-            <otsigroup-capability-profile-name>FOIC2.4-OTUC2</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC2.4-FOIC2.8-OTUC2</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC1.4-OTUC1</otsigroup-capability-profile-name>
+            <optical-operational-mode-profile-name>OR-W-100G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
+            <optical-operational-mode-profile-name>OR-W-200G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
           </supported-interface-capability>
         </port-capabilities>
         <is-physical>true</is-physical>
             <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-otsi-otsigroup</if-cap-type>
             <otsigroup-capability-profile-name>FOIC4.8-OTUC4</otsigroup-capability-profile-name>
             <otsigroup-capability-profile-name>FOIC3.6-OTUC3</otsigroup-capability-profile-name>
-            <otsigroup-capability-profile-name>FOIC2.4-OTUC2</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC2.4-FOIC2.8-OTUC2</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC1.4-OTUC1</otsigroup-capability-profile-name>
+            <optical-operational-mode-profile-name>OR-W-100G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
+            <optical-operational-mode-profile-name>OR-W-200G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
           </supported-interface-capability>
         </port-capabilities>
         <is-physical>true</is-physical>
       <hardware-version>hardware-version</hardware-version>
       <serial-id>serial-id</serial-id>
     </circuit-packs>
+    <circuit-packs>
+      <circuit-pack-name>1/1/4-PLUG-NET</circuit-pack-name>
+      <product-code>product-code</product-code>
+      <circuit-pack-product-code>circuit-pack-product-code</circuit-pack-product-code>
+      <is-physical>true</is-physical>
+      <clei>clei</clei>
+      <model>model</model>
+      <manufacture-date>2021-02-08T15:23:43Z</manufacture-date>
+      <shelf>1</shelf>
+      <ports>
+        <port-name>L1</port-name>
+        <port-capabilities xmlns="http://org/openroadm/port-capability">
+          <supported-interface-capability>
+            <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-otsi-otsigroup</if-cap-type>
+            <otsigroup-capability-profile-name>FOIC4.8-OTUC4</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC3.6-OTUC3</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC2.4-FOIC2.8-OTUC2</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC1.4-OTUC1</otsigroup-capability-profile-name>
+            <optical-operational-mode-profile-name>OR-W-100G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
+            <optical-operational-mode-profile-name>OR-W-200G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
+          </supported-interface-capability>
+        </port-capabilities>
+        <is-physical>true</is-physical>
+        <port-direction>bidirectional</port-direction>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-qual>xpdr-network</port-qual>
+        <administrative-state>inService</administrative-state>
+        <port-type>CFP2-DCO</port-type>
+        <faceplate-label>faceplate-label</faceplate-label>
+        <operational-state>inService</operational-state>
+        <transponder-port>
+          <port-power-capability-max-rx>13</port-power-capability-max-rx>
+          <port-power-capability-min-tx>-5</port-power-capability-min-tx>
+          <port-power-capability-min-rx>-22</port-power-capability-min-rx>
+          <port-power-capability-max-tx>0</port-power-capability-max-tx>
+        </transponder-port>
+        <lifecycle-state>deployed</lifecycle-state>
+        <mc-capability-profile-name>mc-capability-profile</mc-capability-profile-name>
+      </ports>
+      <type>Plug_Line_400G</type>
+      <is-pluggable-optics>true</is-pluggable-optics>
+      <slot>4</slot>
+      <administrative-state>inService</administrative-state>
+      <parent-circuit-pack>
+        <circuit-pack-name>1/1</circuit-pack-name>
+        <cp-slot-name>slot-2</cp-slot-name>
+      </parent-circuit-pack>
+      <faceplate-label>faceplate-label</faceplate-label>
+      <vendor>vendor-A</vendor>
+      <is-passive>false</is-passive>
+      <circuit-pack-category>
+        <type>circuitPack</type>
+      </circuit-pack-category>
+      <operational-state>inService</operational-state>
+      <lifecycle-state>deployed</lifecycle-state>
+      <equipment-state>not-reserved-available</equipment-state>
+      <circuit-pack-type>Plug_Line_400G</circuit-pack-type>
+      <hardware-version>hardware-version</hardware-version>
+      <serial-id>serial-id</serial-id>
+    </circuit-packs>
+    <circuit-packs>
+      <circuit-pack-name>1/1/5-PLUG-NET</circuit-pack-name>
+      <product-code>product-code</product-code>
+      <circuit-pack-product-code>circuit-pack-product-code</circuit-pack-product-code>
+      <is-physical>true</is-physical>
+      <clei>clei</clei>
+      <model>model</model>
+      <manufacture-date>2021-02-08T15:23:43Z</manufacture-date>
+      <shelf>1</shelf>
+      <ports>
+        <port-name>L1</port-name>
+        <port-capabilities xmlns="http://org/openroadm/port-capability">
+          <supported-interface-capability>
+            <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-otsi-otsigroup</if-cap-type>
+            <otsigroup-capability-profile-name>OTUC2-REGEN</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>OTUC4-REGEN</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>OTUC3-REGEN</otsigroup-capability-profile-name>
+            <optical-operational-mode-profile-name>OR-W-100G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
+            <optical-operational-mode-profile-name>OR-W-200G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
+          </supported-interface-capability>
+        </port-capabilities>
+        <is-physical>true</is-physical>
+        <port-direction>bidirectional</port-direction>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-qual>xpdr-network</port-qual>
+        <administrative-state>inService</administrative-state>
+        <port-type>CFP2-DCO</port-type>
+        <faceplate-label>faceplate-label</faceplate-label>
+        <operational-state>inService</operational-state>
+        <transponder-port>
+          <port-power-capability-max-rx>13</port-power-capability-max-rx>
+          <port-power-capability-min-tx>-5</port-power-capability-min-tx>
+          <port-power-capability-min-rx>-22</port-power-capability-min-rx>
+          <port-power-capability-max-tx>0</port-power-capability-max-tx>
+        </transponder-port>
+        <lifecycle-state>deployed</lifecycle-state>
+        <mc-capability-profile-name>mc-capability-profile</mc-capability-profile-name>
+      </ports>
+      <type>Plug_Line_400G</type>
+      <is-pluggable-optics>true</is-pluggable-optics>
+      <slot>5</slot>
+      <administrative-state>inService</administrative-state>
+      <parent-circuit-pack>
+        <circuit-pack-name>1/1</circuit-pack-name>
+        <cp-slot-name>slot-2</cp-slot-name>
+      </parent-circuit-pack>
+      <faceplate-label>faceplate-label</faceplate-label>
+      <vendor>vendor-A</vendor>
+      <is-passive>false</is-passive>
+      <circuit-pack-category>
+        <type>circuitPack</type>
+      </circuit-pack-category>
+      <operational-state>inService</operational-state>
+      <lifecycle-state>deployed</lifecycle-state>
+      <equipment-state>not-reserved-available</equipment-state>
+      <circuit-pack-type>Plug_Line_400G</circuit-pack-type>
+      <hardware-version>hardware-version</hardware-version>
+      <serial-id>serial-id</serial-id>
+      <circuit-pack-mode>REGEN</circuit-pack-mode>
+    </circuit-packs>
+    <circuit-packs>
+      <circuit-pack-name>1/1/6-PLUG-NET</circuit-pack-name>
+      <product-code>product-code</product-code>
+      <circuit-pack-product-code>circuit-pack-product-code</circuit-pack-product-code>
+      <is-physical>true</is-physical>
+      <clei>clei</clei>
+      <model>model</model>
+      <manufacture-date>2021-02-08T15:23:43Z</manufacture-date>
+      <shelf>1</shelf>
+      <ports>
+        <port-name>L1</port-name>
+        <port-capabilities xmlns="http://org/openroadm/port-capability">
+          <supported-interface-capability>
+            <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-otsi-otsigroup</if-cap-type>
+            <otsigroup-capability-profile-name>OTUC2-REGEN</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>OTUC4-REGEN</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>OTUC3-REGEN</otsigroup-capability-profile-name>
+            <optical-operational-mode-profile-name>OR-W-100G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
+            <optical-operational-mode-profile-name>OR-W-200G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
+          </supported-interface-capability>
+        </port-capabilities>
+        <is-physical>true</is-physical>
+        <port-direction>bidirectional</port-direction>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-qual>xpdr-network</port-qual>
+        <administrative-state>inService</administrative-state>
+        <port-type>CFP2-DCO</port-type>
+        <faceplate-label>faceplate-label</faceplate-label>
+        <operational-state>inService</operational-state>
+        <transponder-port>
+          <port-power-capability-max-rx>13</port-power-capability-max-rx>
+          <port-power-capability-min-tx>-5</port-power-capability-min-tx>
+          <port-power-capability-min-rx>-22</port-power-capability-min-rx>
+          <port-power-capability-max-tx>0</port-power-capability-max-tx>
+        </transponder-port>
+        <lifecycle-state>deployed</lifecycle-state>
+        <mc-capability-profile-name>mc-capability-profile</mc-capability-profile-name>
+      </ports>
+      <type>Plug_Line_400G</type>
+      <is-pluggable-optics>true</is-pluggable-optics>
+      <slot>6</slot>
+      <administrative-state>inService</administrative-state>
+      <parent-circuit-pack>
+        <circuit-pack-name>1/1</circuit-pack-name>
+        <cp-slot-name>slot-2</cp-slot-name>
+      </parent-circuit-pack>
+      <faceplate-label>faceplate-label</faceplate-label>
+      <vendor>vendor-A</vendor>
+      <is-passive>false</is-passive>
+      <circuit-pack-category>
+        <type>circuitPack</type>
+      </circuit-pack-category>
+      <operational-state>inService</operational-state>
+      <lifecycle-state>deployed</lifecycle-state>
+      <equipment-state>not-reserved-available</equipment-state>
+      <circuit-pack-type>Plug_Line_400G</circuit-pack-type>
+      <hardware-version>hardware-version</hardware-version>
+      <serial-id>serial-id</serial-id>
+      <circuit-pack-mode>REGEN</circuit-pack-mode>
+    </circuit-packs>
     <circuit-packs>
       <circuit-pack-name>1/2</circuit-pack-name>
       <product-code>product-code</product-code>
       <type>Base_Transponder_400G_circuit-pack</type>
       <is-pluggable-optics>false</is-pluggable-optics>
       <slot>1</slot>
+      <cp-slots>
+        <slot-name>slot-6</slot-name>
+        <slot-status>installed-prov-match</slot-status>
+        <provisioned-circuit-pack>1/1/6-PLUG-NETWORK</provisioned-circuit-pack>
+        <label>6</label>
+      </cp-slots>
+      <cp-slots>
+        <slot-name>slot-5</slot-name>
+        <slot-status>installed-prov-match</slot-status>
+        <provisioned-circuit-pack>1/1/5-PLUG-NETWORK</provisioned-circuit-pack>
+        <label>5</label>
+      </cp-slots>
       <cp-slots>
         <slot-name>slot-4</slot-name>
-        <slot-status>empty-not-prov</slot-status>
+        <slot-status>installed-prov-match</slot-status>
+        <provisioned-circuit-pack>1/1/4-PLUG-NETWORK</provisioned-circuit-pack>
         <label>4</label>
       </cp-slots>
       <cp-slots>
       </cp-slots>
       <cp-slots>
         <slot-name>slot-3</slot-name>
-        <slot-status>empty-not-prov</slot-status>
+        <slot-status>installed-prov-match</slot-status>
         <label>3</label>
+        <provisioned-circuit-pack>1/1/3-PLUG-CLIENT</provisioned-circuit-pack>
       </cp-slots>
       <cp-slots>
         <slot-name>slot-1</slot-name>
       <xpdr-type>mpdr</xpdr-type>
       <lifecycle-state>deployed</lifecycle-state>
     </xponder>
+    <xponder>
+      <xpdr-number>3</xpdr-number>
+      <xpdr-port>
+        <index>2</index>
+        <port-name>L1</port-name>
+        <circuit-pack-name>1/1/4-PLUG-NET</circuit-pack-name>
+      </xpdr-port>
+      <xpdr-port>
+        <index>1</index>
+        <port-name>C1</port-name>
+        <circuit-pack-name>1/1/3-PLUG-CLIENT</circuit-pack-name>
+      </xpdr-port>
+      <xpdr-type>tpdr</xpdr-type>
+      <lifecycle-state>deployed</lifecycle-state>
+    </xponder>
+    <xponder>
+      <xpdr-number>4</xpdr-number>
+      <xpdr-port>
+        <index>2</index>
+        <port-name>L1</port-name>
+        <circuit-pack-name>1/1/5-PLUG-NET</circuit-pack-name>
+      </xpdr-port>
+      <xpdr-port>
+        <index>1</index>
+        <port-name>L1</port-name>
+        <circuit-pack-name>1/1/6-PLUG-NET</circuit-pack-name>
+      </xpdr-port>
+      <xpdr-type>regen</xpdr-type>
+      <recolor>true</recolor>
+      <lifecycle-state>deployed</lifecycle-state>
+    </xponder>
   </org-openroadm-device>
 </data>
index 88f38339501cf50694b429f217bbde32860d76f4..7a23dace3c1e16e06749110691387f110821e775 100644 (file)
         <port-name>C1</port-name>
       </destination>
     </connection-map>
+    <connection-map>
+      <connection-map-number>3</connection-map-number>
+      <source>
+        <port-name>C1</port-name>
+        <circuit-pack-name>1/1/3-PLUG-CLIENT</circuit-pack-name>
+      </source>
+      <destination>
+        <circuit-pack-name>1/1/4-PLUG-NET</circuit-pack-name>
+        <port-name>L1</port-name>
+      </destination>
+    </connection-map>
+    <connection-map>
+      <connection-map-number>4</connection-map-number>
+      <source>
+        <port-name>L1</port-name>
+        <circuit-pack-name>1/1/4-PLUG-NET</circuit-pack-name>
+      </source>
+      <destination>
+        <circuit-pack-name>1/1/3-PLUG-CLIENT</circuit-pack-name>
+        <port-name>C1</port-name>
+      </destination>
+    </connection-map>
     <odu-switching-pools>
       <switching-pool-number>1</switching-pool-number>
       <switching-pool-type>blocking</switching-pool-type>
       <serial-id>serial-id</serial-id>
     </shelves>
     <otsigroup-capability-profile>
-      <profile-name>FOIC3.6-OTUC3</profile-name>
-      <otucn-n-rate>4</otucn-n-rate>
-      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic4.8</foic-type>
-      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODUflex-ODU4</otn-odu-mux-hierarchy-profile-name>
+      <profile-name>FOIC1.4-OTUC1</profile-name>
+      <otucn-n-rate>1</otucn-n-rate>
+      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic1.4</foic-type>
+      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODU4</otn-odu-mux-hierarchy-profile-name>
       <otn-capability-profile-name>Otn-ODUCn-TTP-no-protection</otn-capability-profile-name>
       <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OTUCn-ODUCn</if-cap-type>
     </otsigroup-capability-profile>
     <otsigroup-capability-profile>
-      <profile-name>FOIC4.8-OTUC4</profile-name>
-      <otucn-n-rate>4</otucn-n-rate>
-      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic4.8</foic-type>
-      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODUflex-ODU4</otn-odu-mux-hierarchy-profile-name>
+      <profile-name>FOIC2.4-FOIC2.8-OTUC2</profile-name>
+      <otucn-n-rate>2</otucn-n-rate>
+      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic2.8</foic-type>
+      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic2.4</foic-type>
+      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODU4</otn-odu-mux-hierarchy-profile-name>
       <otn-capability-profile-name>Otn-ODUCn-TTP-no-protection</otn-capability-profile-name>
       <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OTUCn-ODUCn</if-cap-type>
     </otsigroup-capability-profile>
     <otsigroup-capability-profile>
-      <profile-name>FOCI2.4-OTUC2</profile-name>
-      <otucn-n-rate>4</otucn-n-rate>
-      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic4.8</foic-type>
-      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODUflex-ODU4</otn-odu-mux-hierarchy-profile-name>
-      <otn-capability-profile-name>Otn-ODUCn-TTP-no-protection</otn-capability-profile-name>
+      <profile-name>FOIC3.6-OTUC3</profile-name>
       <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OTUCn-ODUCn</if-cap-type>
+      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODU4</otn-odu-mux-hierarchy-profile-name>
+      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic3.6</foic-type>
+      <otucn-n-rate>3</otucn-n-rate>
+      <otn-capability-profile-name>otn-ODUCn-TTP-no-protection</otn-capability-profile-name>
+    </otsigroup-capability-profile>
+    <otsigroup-capability-profile>
+      <profile-name>FOIC4.8-OTUC4</profile-name>
+      <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OTUCn-ODUCn</if-cap-type>
+      <otn-odu-mux-hierarchy-profile-name>one-stage-ODUCn-ODUflex-ODU4</otn-odu-mux-hierarchy-profile-name>
+      <foic-type xmlns:x="http://org/openroadm/common-optical-channel-types">x:foic4.8</foic-type>
+      <otucn-n-rate>4</otucn-n-rate>
+      <otn-capability-profile-name>otn-ODUCn-TTP-no-protection</otn-capability-profile-name>
     </otsigroup-capability-profile>
     <mc-capability-profile>
       <profile-name>mc-capa-profile1</profile-name>
       <hardware-version>hardware-version</hardware-version>
       <serial-id>serial-id</serial-id>
     </circuit-packs>
+    <circuit-packs>
+      <circuit-pack-name>1/1/3-PLUG-CLIENT</circuit-pack-name>
+      <product-code>product-code</product-code>
+      <circuit-pack-product-code>circuit-pack-product-code</circuit-pack-product-code>
+      <is-physical>true</is-physical>
+      <clei>clei</clei>
+      <model>model</model>
+      <manufacture-date>2021-02-08T15:23:43Z</manufacture-date>
+      <shelf>1</shelf>
+      <ports>
+        <port-name>C1</port-name>
+        <administrative-state>inService</administrative-state>
+        <port-capabilities xmlns="http://org/openroadm/port-capability">
+          <supported-interface-capability>
+            <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-OCH-OTU4-ODU4</if-cap-type>
+              <otn-capability>
+                <otn-capability-profile-name>xponder-client-no-protection</otn-capability-profile-name>
+              </otn-capability>
+          </supported-interface-capability>
+          <supported-interface-capability>
+            <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-100GE</if-cap-type>
+        </supported-interface-capability>
+        </port-capabilities>
+        <port-type>QSFP28</port-type>
+        <faceplate-label>faceplate-label</faceplate-label>
+        <is-physical>true</is-physical>
+        <operational-state>inService</operational-state>
+        <port-direction>bidirectional</port-direction>
+        <lifecycle-state>deployed</lifecycle-state>
+        <port-qual>xpdr-client</port-qual>
+      </ports>
+      <type>Plug_Client_100GE</type>
+      <is-pluggable-optics>true</is-pluggable-optics>
+      <slot>1</slot>
+      <administrative-state>inService</administrative-state>
+      <parent-circuit-pack>
+        <circuit-pack-name>1/1</circuit-pack-name>
+        <cp-slot-name>slot-1</cp-slot-name>
+      </parent-circuit-pack>
+      <faceplate-label>faceplate-label</faceplate-label>
+      <vendor>vendor-A</vendor>
+      <is-passive>false</is-passive>
+      <circuit-pack-category>
+        <type>circuitPack</type>
+      </circuit-pack-category>
+      <operational-state>inService</operational-state>
+      <lifecycle-state>deployed</lifecycle-state>
+      <equipment-state>not-reserved-available</equipment-state>
+      <circuit-pack-type>Plug_Client_100GE</circuit-pack-type>
+      <hardware-version>hardware-version</hardware-version>
+      <serial-id>serial-id</serial-id>
+    </circuit-packs>
     <circuit-packs>
       <circuit-pack-name>1/2/2-PLUG-NET</circuit-pack-name>
       <product-code>product-code</product-code>
             <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-otsi-otsigroup</if-cap-type>
             <otsigroup-capability-profile-name>FOIC4.8-OTUC4</otsigroup-capability-profile-name>
             <otsigroup-capability-profile-name>FOIC3.6-OTUC3</otsigroup-capability-profile-name>
-            <otsigroup-capability-profile-name>FOCI2.4-OTUC2</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC2.4-FOIC2.8-OTUC2</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC1.4-OTUC1</otsigroup-capability-profile-name>
+            <optical-operational-mode-profile-name>OR-W-100G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
+            <optical-operational-mode-profile-name>OR-W-200G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
           </supported-interface-capability>
         </port-capabilities>
         <is-physical>true</is-physical>
             <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-otsi-otsigroup</if-cap-type>
             <otsigroup-capability-profile-name>FOIC4.8-OTUC4</otsigroup-capability-profile-name>
             <otsigroup-capability-profile-name>FOIC3.6-OTUC3</otsigroup-capability-profile-name>
-            <otsigroup-capability-profile-name>FOCI2.4-OTUC2</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC2.4-FOIC2.8-OTUC2</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC1.4-OTUC1</otsigroup-capability-profile-name>
+            <optical-operational-mode-profile-name>OR-W-100G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
+            <optical-operational-mode-profile-name>OR-W-200G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
           </supported-interface-capability>
         </port-capabilities>
         <is-physical>true</is-physical>
       <hardware-version>hardware-version</hardware-version>
       <serial-id>serial-id</serial-id>
     </circuit-packs>
+    <circuit-packs>
+      <circuit-pack-name>1/1/4-PLUG-NET</circuit-pack-name>
+      <product-code>product-code</product-code>
+      <circuit-pack-product-code>circuit-pack-product-code</circuit-pack-product-code>
+      <is-physical>true</is-physical>
+      <clei>clei</clei>
+      <model>model</model>
+      <manufacture-date>2021-02-08T15:23:43Z</manufacture-date>
+      <shelf>1</shelf>
+      <ports>
+        <port-name>L1</port-name>
+        <port-capabilities xmlns="http://org/openroadm/port-capability">
+          <supported-interface-capability>
+            <if-cap-type xmlns:x="http://org/openroadm/port/types">x:if-otsi-otsigroup</if-cap-type>
+            <otsigroup-capability-profile-name>FOIC4.8-OTUC4</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC3.6-OTUC3</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC2.4-FOIC2.8-OTUC2</otsigroup-capability-profile-name>
+            <otsigroup-capability-profile-name>FOIC1.4-OTUC1</otsigroup-capability-profile-name>
+            <optical-operational-mode-profile-name>OR-W-100G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
+            <optical-operational-mode-profile-name>OR-W-200G-oFEC-31.6Gbd</optical-operational-mode-profile-name>
+          </supported-interface-capability>
+        </port-capabilities>
+        <is-physical>true</is-physical>
+        <port-direction>bidirectional</port-direction>
+        <port-wavelength-type>wavelength</port-wavelength-type>
+        <port-qual>xpdr-network</port-qual>
+        <administrative-state>inService</administrative-state>
+        <port-type>CFP2-DCO</port-type>
+        <faceplate-label>faceplate-label</faceplate-label>
+        <operational-state>inService</operational-state>
+        <transponder-port>
+          <port-power-capability-max-rx>13</port-power-capability-max-rx>
+          <port-power-capability-min-tx>-5</port-power-capability-min-tx>
+          <port-power-capability-min-rx>-22</port-power-capability-min-rx>
+          <port-power-capability-max-tx>0</port-power-capability-max-tx>
+        </transponder-port>
+        <lifecycle-state>deployed</lifecycle-state>
+        <mc-capability-profile-name>mc-capability-profile</mc-capability-profile-name>
+      </ports>
+      <type>Plug_Line_400G</type>
+      <is-pluggable-optics>true</is-pluggable-optics>
+      <slot>4</slot>
+      <administrative-state>inService</administrative-state>
+      <parent-circuit-pack>
+        <circuit-pack-name>1/1</circuit-pack-name>
+        <cp-slot-name>slot-2</cp-slot-name>
+      </parent-circuit-pack>
+      <faceplate-label>faceplate-label</faceplate-label>
+      <vendor>vendor-A</vendor>
+      <is-passive>false</is-passive>
+      <circuit-pack-category>
+        <type>circuitPack</type>
+      </circuit-pack-category>
+      <operational-state>inService</operational-state>
+      <lifecycle-state>deployed</lifecycle-state>
+      <equipment-state>not-reserved-available</equipment-state>
+      <circuit-pack-type>Plug_Line_400G</circuit-pack-type>
+      <hardware-version>hardware-version</hardware-version>
+      <serial-id>serial-id</serial-id>
+    </circuit-packs>
     <circuit-packs>
       <circuit-pack-name>1/2</circuit-pack-name>
       <product-code>product-code</product-code>
       <slot>1</slot>
       <cp-slots>
         <slot-name>slot-4</slot-name>
-        <slot-status>empty-not-prov</slot-status>
+        <slot-status>installed-prov-match</slot-status>
+        <provisioned-circuit-pack>1/1/4-PLUG-NETWORK</provisioned-circuit-pack>
         <label>4</label>
       </cp-slots>
       <cp-slots>
       </cp-slots>
       <cp-slots>
         <slot-name>slot-3</slot-name>
-        <slot-status>empty-not-prov</slot-status>
+        <slot-status>installed-prov-match</slot-status>
         <label>3</label>
+        <provisioned-circuit-pack>1/1/3-PLUG-CLIENT</provisioned-circuit-pack>
       </cp-slots>
       <cp-slots>
         <slot-name>slot-1</slot-name>
       <xpdr-type>mpdr</xpdr-type>
       <lifecycle-state>deployed</lifecycle-state>
     </xponder>
+    <xponder>
+      <xpdr-number>3</xpdr-number>
+      <xpdr-port>
+        <index>2</index>
+        <port-name>L1</port-name>
+        <circuit-pack-name>1/1/4-PLUG-NET</circuit-pack-name>
+      </xpdr-port>
+      <xpdr-port>
+        <index>1</index>
+        <port-name>C1</port-name>
+        <circuit-pack-name>1/1/3-PLUG-CLIENT</circuit-pack-name>
+      </xpdr-port>
+      <xpdr-type>tpdr</xpdr-type>
+      <lifecycle-state>deployed</lifecycle-state>
+    </xponder>
   </org-openroadm-device>
 </data>
index 7e877b30fa7a2536d388f513f8110af78f9f723b..1f22bd570a5f53e5b99d62ff82c737a10da6e454 100644 (file)
 {
-  "nodes": [
-    {
-      "node-id": "OpenROADM-1-1",
-      "node-info": {
-        "node-type": "rdm",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-    {
-      "node-id": "XPONDER-1-1",
-      "node-info": {
-        "node-type": "xpdr",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "OpenROADM-1-2",
-      "node-info": {
-        "node-type": "rdm",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "XPONDER-1-2",
-      "node-info": {
-        "node-type": "xpdr",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [
-        {
-          "logical-connection-point": "XPDR1-CLIENT1",
-          "port-qual": "xpdr-client"
+    "nodes": [
+        {
+            "node-id": "OpenROADM-1-1",
+            "node-info": {
+                "node-type": "rdm",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "XPONDER-1-1",
+            "node-info": {
+                "node-type": "xpdr",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "OpenROADM-1-2",
+            "node-info": {
+                "node-type": "rdm",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "XPONDER-1-2",
+            "node-info": {
+                "node-type": "xpdr",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [
+                {
+                    "logical-connection-point": "XPDR1-CLIENT1",
+                    "port-qual": "xpdr-client"
+                }
+            ],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "OpenROADM-1-3",
+            "node-info": {
+                "node-type": "rdm",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "XPONDER-1-3",
+            "node-info": {
+                "node-type": "xpdr",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "OpenROADM-1-4",
+            "node-info": {
+                "node-type": "rdm",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "XPONDER-1-4",
+            "node-info": {
+                "node-type": "xpdr",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "OpenROADM-2-1",
+            "node-info": {
+                "node-type": "rdm",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "XPONDER-2-1",
+            "node-info": {
+                "node-type": "xpdr",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "OpenROADM-2-2",
+            "node-info": {
+                "node-type": "rdm",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "XPONDER-2-2",
+            "node-info": {
+                "node-type": "xpdr",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [
+                {
+                    "logical-connection-point": "XPDR1-CLIENT1",
+                    "port-qual": "xpdr-client"
+                }
+            ],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "OpenROADM-2-3",
+            "node-info": {
+                "node-type": "rdm",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "XPONDER-2-3",
+            "node-info": {
+                "node-type": "xpdr",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "OpenROADM-2-4",
+            "node-info": {
+                "node-type": "rdm",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "XPONDER-2-4",
+            "node-info": {
+                "node-type": "xpdr",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "OpenROADM-3-1",
+            "node-info": {
+                "node-type": "rdm",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "XPONDER-3-1",
+            "node-info": {
+                "node-type": "xpdr",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "OpenROADM-3-2",
+            "node-info": {
+                "node-type": "rdm",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "XPONDER-3-2",
+            "node-info": {
+                "node-type": "xpdr",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [
+                {
+                    "logical-connection-point": "XPDR1-CLIENT1",
+                    "port-qual": "xpdr-client"
+                }
+            ],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "OpenROADM-3-3",
+            "node-info": {
+                "node-type": "rdm",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "XPONDER-3-3",
+            "node-info": {
+                "node-type": "xpdr",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "OpenROADM-3-4",
+            "node-info": {
+                "node-type": "rdm",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "XPONDER-3-4",
+            "node-info": {
+                "node-type": "xpdr",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "OpenROADM-4-1",
+            "node-info": {
+                "node-type": "rdm",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "XPONDER-4-1",
+            "node-info": {
+                "node-type": "xpdr",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "OpenROADM-4-2",
+            "node-info": {
+                "node-type": "rdm",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "XPONDER-4-2",
+            "node-info": {
+                "node-type": "xpdr",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "OpenROADM-4-3",
+            "node-info": {
+                "node-type": "rdm",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "XPONDER-4-3",
+            "node-info": {
+                "node-type": "xpdr",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "OpenROADM-4-4",
+            "node-info": {
+                "node-type": "rdm",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "XPONDER-4-4",
+            "node-info": {
+                "node-type": "xpdr",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "OpenROADM-5-1",
+            "node-info": {
+                "node-type": "rdm",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "XPONDER-5-1",
+            "node-info": {
+                "node-type": "xpdr",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "OpenROADM-5-2",
+            "node-info": {
+                "node-type": "rdm",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "XPONDER-5-2",
+            "node-info": {
+                "node-type": "xpdr",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "OpenROADM-5-3",
+            "node-info": {
+                "node-type": "rdm",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "XPONDER-5-3",
+            "node-info": {
+                "node-type": "xpdr",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "OpenROADM-5-4",
+            "node-info": {
+                "node-type": "rdm",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "XPONDER-5-4",
+            "node-info": {
+                "node-type": "xpdr",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "XPDRC01",
+            "node-info": {
+                "node-type": "xpdr",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [
+                {
+                    "logical-connection-point": "XPDR1-CLIENT1",
+                    "port-qual": "xpdr-client"
+                }
+            ],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "ROADMA01",
+            "node-info": {
+                "node-type": "rdm",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "ROADMC01",
+            "node-info": {
+                "node-type": "rdm",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "XPDRA01",
+            "node-info": {
+                "node-type": "xpdr",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [
+                {
+                    "logical-connection-point": "XPDR1-CLIENT1",
+                    "port-qual": "xpdr-client"
+                }
+            ],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
+        },
+        {
+            "node-id": "XPONDER",
+            "node-info": {
+                "node-type": "xpdr",
+                "openroadm-version": "1.2.1",
+                "node-clli": "NodeX",
+                "node-vendor": "vendorA",
+                "node-model": "model1",
+                "node-ip-address": "1.2.3.4"
+            },
+            "mapping": [],
+            "mc-capabilities": [],
+            "cp-to-degree": [],
+            "switching-pool-lcp": []
         }
-      ],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "OpenROADM-1-3",
-      "node-info": {
-        "node-type": "rdm",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "XPONDER-1-3",
-      "node-info": {
-        "node-type": "xpdr",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "OpenROADM-1-4",
-      "node-info": {
-        "node-type": "rdm",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "XPONDER-1-4",
-      "node-info": {
-        "node-type": "xpdr",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "OpenROADM-2-1",
-      "node-info": {
-        "node-type": "rdm",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "XPONDER-2-1",
-      "node-info": {
-        "node-type": "xpdr",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "OpenROADM-2-2",
-      "node-info": {
-        "node-type": "rdm",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "XPONDER-2-2",
-      "node-info": {
-        "node-type": "xpdr",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [
-        {
-          "logical-connection-point": "XPDR1-CLIENT1",
-          "port-qual": "xpdr-client"
-        }
-      ],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "OpenROADM-2-3",
-      "node-info": {
-        "node-type": "rdm",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "XPONDER-2-3",
-      "node-info": {
-        "node-type": "xpdr",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "OpenROADM-2-4",
-      "node-info": {
-        "node-type": "rdm",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "XPONDER-2-4",
-      "node-info": {
-        "node-type": "xpdr",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "OpenROADM-3-1",
-      "node-info": {
-        "node-type": "rdm",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "XPONDER-3-1",
-      "node-info": {
-        "node-type": "xpdr",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "OpenROADM-3-2",
-      "node-info": {
-        "node-type": "rdm",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "XPONDER-3-2",
-      "node-info": {
-        "node-type": "xpdr",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [
-        {
-          "logical-connection-point": "XPDR1-CLIENT1",
-          "port-qual": "xpdr-client"
-        }
-      ],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "OpenROADM-3-3",
-      "node-info": {
-        "node-type": "rdm",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "XPONDER-3-3",
-      "node-info": {
-        "node-type": "xpdr",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "OpenROADM-3-4",
-      "node-info": {
-        "node-type": "rdm",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "XPONDER-3-4",
-      "node-info": {
-        "node-type": "xpdr",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "OpenROADM-4-1",
-      "node-info": {
-        "node-type": "rdm",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "XPONDER-4-1",
-      "node-info": {
-        "node-type": "xpdr",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "OpenROADM-4-2",
-      "node-info": {
-        "node-type": "rdm",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "XPONDER-4-2",
-      "node-info": {
-        "node-type": "xpdr",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "OpenROADM-4-3",
-      "node-info": {
-        "node-type": "rdm",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "XPONDER-4-3",
-      "node-info": {
-        "node-type": "xpdr",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "OpenROADM-4-4",
-      "node-info": {
-        "node-type": "rdm",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "XPONDER-4-4",
-      "node-info": {
-        "node-type": "xpdr",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "OpenROADM-5-1",
-      "node-info": {
-        "node-type": "rdm",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "XPONDER-5-1",
-      "node-info": {
-        "node-type": "xpdr",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "OpenROADM-5-2",
-      "node-info": {
-        "node-type": "rdm",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "XPONDER-5-2",
-      "node-info": {
-        "node-type": "xpdr",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "OpenROADM-5-3",
-      "node-info": {
-        "node-type": "rdm",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-        {
-      "node-id": "XPONDER-5-3",
-      "node-info": {
-        "node-type": "xpdr",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-    {
-      "node-id": "OpenROADM-5-4",
-      "node-info": {
-        "node-type": "rdm",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-    {
-      "node-id": "XPONDER-5-4",
-      "node-info": {
-        "node-type": "xpdr",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-    {
-      "node-id": "XPDRC01",
-      "node-info": {
-        "node-type": "xpdr",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [
-        {
-          "logical-connection-point": "XPDR1-CLIENT1",
-          "port-qual": "xpdr-client"
-        }
-      ],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-    {
-      "node-id": "ROADMA01",
-      "node-info": {
-        "node-type": "rdm",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-    {
-      "node-id": "ROADMC01",
-      "node-info": {
-        "node-type": "rdm",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-    {
-      "node-id": "XPDRA01",
-      "node-info": {
-        "node-type": "xpdr",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [
-        {
-          "logical-connection-point": "XPDR1-CLIENT1",
-          "port-qual": "xpdr-client"
-        }
-      ],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    },
-    {
-      "node-id": "XPONDER",
-      "node-info": {
-        "node-type": "xpdr",
-        "openroadm-version": "1.2.1",
-        "node-clli": "NodeX",
-        "node-vendor": "vendorA",
-        "node-model": "model1",
-        "node-ip-address": "1.2.3.4"
-      },
-      "mapping": [],
-      "mc-capabilities": [],
-      "cp-to-degree": [],
-      "switching-pool-lcp": []
-    }
-  ]
-}
\ No newline at end of file
+    ]
+}
index 377bde837913c091b85feaa7291e1fb52a1ba43a..a3d1cb0410af7c26e165bbd541ac146f9d72b6e8 100644 (file)
 {
-    "network": {
-        "nodes": [
-            {
-                "node-id": "XPDR-A2",
-                "node-info": {
-                    "node-clli": "NodeA",
-                    "node-vendor": "vendorA",
-                    "openroadm-version": "7.1",
-                    "node-ip-address": "1.2.3.4",
-                    "node-type": "xpdr",
-                    "node-model": "model"
-                },
-                "switching-pool-lcp": [
-                    {
-                        "switching-pool-number": 1,
-                        "switching-pool-type": "blocking",
-                        "non-blocking-list": [
-                            {
-                                "nbl-number": 2,
-                                "lcp-list": [
-                                    "XPDR2-NETWORK1",
-                                    "XPDR2-CLIENT2"
-                                ],
-                                "interconnect-bandwidth": 0
-                            },
-                            {
-                                "nbl-number": 1,
-                                "lcp-list": [
-                                    "XPDR2-CLIENT1",
-                                    "XPDR2-NETWORK1"
-                                ],
-                                "interconnect-bandwidth": 0
-                            }
-                        ]
-                    }
-                ],
-                "mapping": [
-                    {
-                        "logical-connection-point": "XPDR2-CLIENT1",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "1/2/1/1-PLUG-CLIENT",
-                        "mpdr-restrictions": {
-                            "min-trib-slot": "1.1",
-                            "max-trib-slot": "1.20"
-                        },
-                        "supported-interface-capability": [
-                            "org-openroadm-port-types:if-100GE-ODU4",
-                            "org-openroadm-port-types:if-OCH-OTU4-ODU4"
-                        ],
-                        "port-oper-state": "InService",
-                        "port-direction": "bidirectional",
-                        "lcp-hash-val": "AK+Cna4EclRH",
-                        "supporting-port": "C1",
-                        "port-qual": "switch-client"
-                    },
-                    {
-                        "logical-connection-point": "XPDR1-NETWORK1",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "1/1/2-PLUG-NET",
-                        "supported-interface-capability": [
-                            "org-openroadm-port-types:if-otsi-otsigroup"
-                        ],
-                        "port-oper-state": "InService",
-                        "connection-map-lcp": "XPDR1-CLIENT1",
-                        "port-direction": "bidirectional",
-                        "xponder-type": "tpdr",
-                        "lcp-hash-val": "AIGiVAQ4gDil",
-                        "supporting-port": "L1",
-                        "port-qual": "xpdr-network"
-                    },
-                    {
-                        "logical-connection-point": "XPDR2-CLIENT2",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "1/2/1/2-PLUG-CLIENT",
-                        "mpdr-restrictions": {
-                            "min-trib-slot": "2.1",
-                            "max-trib-slot": "2.20"
+    "nodes": [
+        {
+            "node-id": "XPDR-A2",
+            "node-info": {
+                "node-clli": "NodeA",
+                "node-vendor": "vendorA",
+                "openroadm-version": "7.1",
+                "node-ip-address": "1.2.3.4",
+                "node-type": "xpdr",
+                "node-model": "model"
+            },
+            "switching-pool-lcp": [
+                {
+                    "switching-pool-number": 1,
+                    "switching-pool-type": "blocking",
+                    "non-blocking-list": [
+                        {
+                            "nbl-number": 2,
+                            "lcp-list": [
+                                "XPDR2-NETWORK1",
+                                "XPDR2-CLIENT2"
+                            ],
+                            "interconnect-bandwidth": 0
                         },
-                        "supported-interface-capability": [
-                            "org-openroadm-port-types:if-100GE-ODU4",
-                            "org-openroadm-port-types:if-OCH-OTU4-ODU4"
-                        ],
-                        "port-oper-state": "InService",
-                        "port-direction": "bidirectional",
-                        "lcp-hash-val": "AK+Cna4EclRE",
-                        "supporting-port": "C1",
-                        "port-qual": "switch-client"
-                    },
-                    {
-                        "logical-connection-point": "XPDR1-CLIENT1",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "1/1/1-PLUG-CLIENT",
-                        "supported-interface-capability": [
-                            "org-openroadm-port-types:if-400GE"
-                        ],
-                        "port-oper-state": "InService",
-                        "connection-map-lcp": "XPDR1-NETWORK1",
-                        "port-direction": "bidirectional",
-                        "lcp-hash-val": "AODABTVSOHH0",
-                        "supporting-port": "C1",
-                        "port-qual": "xpdr-client"
-                    },
-                    {
-                        "logical-connection-point": "XPDR2-NETWORK1",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "1/2/2-PLUG-NET",
-                        "supported-interface-capability": [
-                            "org-openroadm-port-types:if-otsi-otsigroup"
-                        ],
-                        "port-oper-state": "InService",
-                        "port-direction": "bidirectional",
-                        "xponder-type": "mpdr",
-                        "lcp-hash-val": "LY9PxYJqUbw=",
-                        "supporting-port": "L1",
-                        "port-qual": "switch-network"
-                    }
-                ],
-                "mc-capabilities": [
-                    {
-                        "mc-node-name": "XPDR-mcprofile",
-                        "center-freq-granularity": 3.125,
-                        "slot-width-granularity": 6.25
-                    }
-                ]
+                        {
+                            "nbl-number": 1,
+                            "lcp-list": [
+                                "XPDR2-CLIENT1",
+                                "XPDR2-NETWORK1"
+                            ],
+                            "interconnect-bandwidth": 0
+                        }
+                    ]
+                }
+            ],
+            "mapping": [
+                {
+                    "logical-connection-point": "XPDR2-CLIENT1",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "1/2/1/1-PLUG-CLIENT",
+                    "mpdr-restrictions": {
+                        "min-trib-slot": "1.1",
+                        "max-trib-slot": "1.20"
+                    },
+                    "supported-interface-capability": [
+                        "org-openroadm-port-types:if-100GE-ODU4",
+                        "org-openroadm-port-types:if-OCH-OTU4-ODU4"
+                    ],
+                    "port-oper-state": "InService",
+                    "port-direction": "bidirectional",
+                    "lcp-hash-val": "AK+Cna4EclRH",
+                    "supporting-port": "C1",
+                    "port-qual": "switch-client"
+                },
+                {
+                    "logical-connection-point": "XPDR1-NETWORK1",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "1/1/2-PLUG-NET",
+                    "supported-interface-capability": [
+                        "org-openroadm-port-types:if-otsi-otsigroup"
+                    ],
+                    "port-oper-state": "InService",
+                    "connection-map-lcp": "XPDR1-CLIENT1",
+                    "port-direction": "bidirectional",
+                    "xpdr-type": "tpdr",
+                    "lcp-hash-val": "AIGiVAQ4gDil",
+                    "supporting-port": "L1",
+                    "port-qual": "xpdr-network"
+                },
+                {
+                    "logical-connection-point": "XPDR2-CLIENT2",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "1/2/1/2-PLUG-CLIENT",
+                    "mpdr-restrictions": {
+                        "min-trib-slot": "2.1",
+                        "max-trib-slot": "2.20"
+                    },
+                    "supported-interface-capability": [
+                        "org-openroadm-port-types:if-100GE-ODU4",
+                        "org-openroadm-port-types:if-OCH-OTU4-ODU4"
+                    ],
+                    "port-oper-state": "InService",
+                    "port-direction": "bidirectional",
+                    "lcp-hash-val": "AK+Cna4EclRE",
+                    "supporting-port": "C1",
+                    "port-qual": "switch-client"
+                },
+                {
+                    "logical-connection-point": "XPDR1-CLIENT1",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "1/1/1-PLUG-CLIENT",
+                    "supported-interface-capability": [
+                        "org-openroadm-port-types:if-400GE"
+                    ],
+                    "port-oper-state": "InService",
+                    "connection-map-lcp": "XPDR1-NETWORK1",
+                    "port-direction": "bidirectional",
+                    "lcp-hash-val": "AODABTVSOHH0",
+                    "supporting-port": "C1",
+                    "port-qual": "xpdr-client"
+                },
+                {
+                    "logical-connection-point": "XPDR2-NETWORK1",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "1/2/2-PLUG-NET",
+                    "supported-interface-capability": [
+                        "org-openroadm-port-types:if-otsi-otsigroup"
+                    ],
+                    "port-oper-state": "InService",
+                    "port-direction": "bidirectional",
+                    "xpdr-type": "mpdr",
+                    "lcp-hash-val": "LY9PxYJqUbw=",
+                    "supporting-port": "L1",
+                    "port-qual": "switch-network"
+                }
+            ],
+            "mc-capabilities": [
+                {
+                    "mc-node-name": "XPDR-mcprofile",
+                    "center-freq-granularity": 3.125,
+                    "slot-width-granularity": 6.25
+                }
+            ]
+        },
+        {
+            "node-id": "ROADM-C1",
+            "node-info": {
+                "node-clli": "NodeC",
+                "node-vendor": "vendorA",
+                "openroadm-version": "2.2.1",
+                "node-ip-address": "127.0.0.13",
+                "node-type": "rdm",
+                "node-model": "model2"
             },
-            {
-                "node-id": "ROADM-C1",
-                "node-info": {
-                    "node-clli": "NodeC",
-                    "node-vendor": "vendorA",
-                    "openroadm-version": "2.2.1",
-                    "node-ip-address": "127.0.0.13",
-                    "node-type": "rdm",
-                    "node-model": "model2"
-                },
-                "cp-to-degree": [
-                    {
-                        "circuit-pack-name": "1/0/ETH-PLUG",
-                        "degree-number": 1,
-                        "interface-name": "1GE-interface-1"
-                    },
-                    {
-                        "circuit-pack-name": "2/0",
-                        "degree-number": 2,
-                        "interface-name": "1GE-interface-2"
-                    },
-                    {
-                        "circuit-pack-name": "2/0/ETH-PLUG",
-                        "degree-number": 2,
-                        "interface-name": "1GE-interface-2"
-                    },
-                    {
-                        "circuit-pack-name": "1/0",
-                        "degree-number": 1,
-                        "interface-name": "1GE-interface-1"
-                    }
-                ],
-                "mapping": [
-                    {
-                        "logical-connection-point": "SRG1-PP2-TXRX",
-                        "port-direction": "bidirectional",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "3/0",
-                        "supporting-port": "C2",
-                        "port-oper-state": "InService"
-                    },
-                    {
-                        "logical-connection-point": "SRG1-PP4-TXRX",
-                        "port-direction": "bidirectional",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "3/0",
-                        "supporting-port": "C4",
-                        "port-oper-state": "InService"
-                    },
-                    {
-                        "logical-connection-point": "DEG2-TTP-TXRX",
-                        "port-direction": "bidirectional",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "2/0",
-                        "supporting-port": "L1",
-                        "port-oper-state": "InService"
-                    },
-                    {
-                        "logical-connection-point": "SRG1-PP3-TXRX",
-                        "port-direction": "bidirectional",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "3/0",
-                        "supporting-port": "C3",
-                        "port-oper-state": "InService"
-                    },
-                    {
-                        "logical-connection-point": "DEG1-TTP-TXRX",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "1/0",
-                        "supporting-ots": "OTS-DEG1-TTP-TXRX",
-                        "port-oper-state": "InService",
-                        "port-direction": "bidirectional",
-                        "supporting-port": "L1",
-                        "supporting-oms": "OMS-DEG1-TTP-TXRX"
-                    },
-                    {
-                        "logical-connection-point": "SRG1-PP1-TXRX",
-                        "port-direction": "bidirectional",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "3/0",
-                        "supporting-port": "C1",
-                        "port-oper-state": "InService"
-                    }
-                ],
-                "mc-capabilities": [
-                    {
-                        "mc-node-name": "DEG2-TTP",
-                        "center-freq-granularity": 50,
-                        "slot-width-granularity": 50
-                    },
-                    {
-                        "mc-node-name": "DEG1-TTP",
-                        "center-freq-granularity": 50,
-                        "slot-width-granularity": 50
-                    },
-                    {
-                        "mc-node-name": "SRG1-PP",
-                        "center-freq-granularity": 50,
-                        "slot-width-granularity": 50
-                    }
-                ]
+            "cp-to-degree": [
+                {
+                    "circuit-pack-name": "1/0/ETH-PLUG",
+                    "degree-number": 1,
+                    "interface-name": "1GE-interface-1"
+                },
+                {
+                    "circuit-pack-name": "2/0",
+                    "degree-number": 2,
+                    "interface-name": "1GE-interface-2"
+                },
+                {
+                    "circuit-pack-name": "2/0/ETH-PLUG",
+                    "degree-number": 2,
+                    "interface-name": "1GE-interface-2"
+                },
+                {
+                    "circuit-pack-name": "1/0",
+                    "degree-number": 1,
+                    "interface-name": "1GE-interface-1"
+                }
+            ],
+            "mapping": [
+                {
+                    "logical-connection-point": "SRG1-PP2-TXRX",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "3/0",
+                    "supporting-port": "C2",
+                    "port-oper-state": "InService"
+                },
+                {
+                    "logical-connection-point": "SRG1-PP4-TXRX",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "3/0",
+                    "supporting-port": "C4",
+                    "port-oper-state": "InService"
+                },
+                {
+                    "logical-connection-point": "DEG2-TTP-TXRX",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "2/0",
+                    "supporting-port": "L1",
+                    "port-oper-state": "InService"
+                },
+                {
+                    "logical-connection-point": "SRG1-PP3-TXRX",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "3/0",
+                    "supporting-port": "C3",
+                    "port-oper-state": "InService"
+                },
+                {
+                    "logical-connection-point": "DEG1-TTP-TXRX",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "1/0",
+                    "supporting-ots": "OTS-DEG1-TTP-TXRX",
+                    "port-oper-state": "InService",
+                    "port-direction": "bidirectional",
+                    "supporting-port": "L1",
+                    "supporting-oms": "OMS-DEG1-TTP-TXRX"
+                },
+                {
+                    "logical-connection-point": "SRG1-PP1-TXRX",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "3/0",
+                    "supporting-port": "C1",
+                    "port-oper-state": "InService"
+                }
+            ],
+            "mc-capabilities": [
+                {
+                    "mc-node-name": "DEG2-TTP",
+                    "center-freq-granularity": 50,
+                    "slot-width-granularity": 50
+                },
+                {
+                    "mc-node-name": "DEG1-TTP",
+                    "center-freq-granularity": 50,
+                    "slot-width-granularity": 50
+                },
+                {
+                    "mc-node-name": "SRG1-PP",
+                    "center-freq-granularity": 50,
+                    "slot-width-granularity": 50
+                }
+            ]
+        },
+        {
+            "node-id": "XPDR-C2",
+            "node-info": {
+                "node-clli": "NodeC",
+                "node-vendor": "vendorA",
+                "openroadm-version": "7.1",
+                "node-ip-address": "1.2.3.4",
+                "node-type": "xpdr",
+                "node-model": "model"
             },
-            {
-                "node-id": "XPDR-C2",
-                "node-info": {
-                    "node-clli": "NodeC",
-                    "node-vendor": "vendorA",
-                    "openroadm-version": "7.1",
-                    "node-ip-address": "1.2.3.4",
-                    "node-type": "xpdr",
-                    "node-model": "model"
-                },
-                "switching-pool-lcp": [
-                    {
-                        "switching-pool-number": 1,
-                        "switching-pool-type": "blocking",
-                        "non-blocking-list": [
-                            {
-                                "nbl-number": 2,
-                                "lcp-list": [
-                                    "XPDR2-NETWORK1",
-                                    "XPDR2-CLIENT2"
-                                ],
-                                "interconnect-bandwidth": 0
-                            },
-                            {
-                                "nbl-number": 1,
-                                "lcp-list": [
-                                    "XPDR2-CLIENT1",
-                                    "XPDR2-NETWORK1"
-                                ],
-                                "interconnect-bandwidth": 0
-                            }
-                        ]
-                    }
-                ],
-                "mapping": [
-                    {
-                        "logical-connection-point": "XPDR2-CLIENT1",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "1/2/1/1-PLUG-CLIENT",
-                        "mpdr-restrictions": {
-                            "min-trib-slot": "1.1",
-                            "max-trib-slot": "1.20"
-                        },
-                        "supported-interface-capability": [
-                            "org-openroadm-port-types:if-100GE-ODU4",
-                            "org-openroadm-port-types:if-OCH-OTU4-ODU4"
-                        ],
-                        "port-oper-state": "InService",
-                        "port-direction": "bidirectional",
-                        "lcp-hash-val": "AP2/mp+mI1y5",
-                        "supporting-port": "C1",
-                        "port-qual": "switch-client"
-                    },
-                    {
-                        "logical-connection-point": "XPDR1-NETWORK1",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "1/1/2-PLUG-NET",
-                        "supported-interface-capability": [
-                            "org-openroadm-port-types:if-otsi-otsigroup"
-                        ],
-                        "port-oper-state": "InService",
-                        "connection-map-lcp": "XPDR1-CLIENT1",
-                        "port-direction": "bidirectional",
-                        "xponder-type": "tpdr",
-                        "lcp-hash-val": "ZbICgmaBrJM=",
-                        "supporting-port": "L1",
-                        "port-qual": "xpdr-network"
-                    },
-                    {
-                        "logical-connection-point": "XPDR2-CLIENT2",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "1/2/1/2-PLUG-CLIENT",
-                        "mpdr-restrictions": {
-                            "min-trib-slot": "2.1",
-                            "max-trib-slot": "2.20"
+            "switching-pool-lcp": [
+                {
+                    "switching-pool-number": 1,
+                    "switching-pool-type": "blocking",
+                    "non-blocking-list": [
+                        {
+                            "nbl-number": 2,
+                            "lcp-list": [
+                                "XPDR2-NETWORK1",
+                                "XPDR2-CLIENT2"
+                            ],
+                            "interconnect-bandwidth": 0
                         },
-                        "supported-interface-capability": [
-                            "org-openroadm-port-types:if-100GE-ODU4",
-                            "org-openroadm-port-types:if-OCH-OTU4-ODU4"
-                        ],
-                        "port-oper-state": "InService",
-                        "port-direction": "bidirectional",
-                        "lcp-hash-val": "AP2/mp+mI1y6",
-                        "supporting-port": "C1",
-                        "port-qual": "switch-client"
-                    },
-                    {
-                        "logical-connection-point": "XPDR1-CLIENT1",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "1/1/1-PLUG-CLIENT",
-                        "supported-interface-capability": [
-                            "org-openroadm-port-types:if-400GE"
-                        ],
-                        "port-oper-state": "InService",
-                        "connection-map-lcp": "XPDR1-NETWORK1",
-                        "port-direction": "bidirectional",
-                        "lcp-hash-val": "M5cViLS5z3o=",
-                        "supporting-port": "C1",
-                        "port-qual": "xpdr-client"
-                    },
-                    {
-                        "logical-connection-point": "XPDR2-NETWORK1",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "1/2/2-PLUG-NET",
-                        "supported-interface-capability": [
-                            "org-openroadm-port-types:if-otsi-otsigroup"
-                        ],
-                        "port-oper-state": "InService",
-                        "port-direction": "bidirectional",
-                        "xponder-type": "mpdr",
-                        "lcp-hash-val": "Nmbu2MNHvc4=",
-                        "supporting-port": "L1",
-                        "port-qual": "switch-network"
-                    }
-                ],
-                "mc-capabilities": [
-                    {
-                        "mc-node-name": "XPDR-mcprofile",
-                        "center-freq-granularity": 3.125,
-                        "slot-width-granularity": 6.25
-                    }
-                ]
+                        {
+                            "nbl-number": 1,
+                            "lcp-list": [
+                                "XPDR2-CLIENT1",
+                                "XPDR2-NETWORK1"
+                            ],
+                            "interconnect-bandwidth": 0
+                        }
+                    ]
+                }
+            ],
+            "mapping": [
+                {
+                    "logical-connection-point": "XPDR2-CLIENT1",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "1/2/1/1-PLUG-CLIENT",
+                    "mpdr-restrictions": {
+                        "min-trib-slot": "1.1",
+                        "max-trib-slot": "1.20"
+                    },
+                    "supported-interface-capability": [
+                        "org-openroadm-port-types:if-100GE-ODU4",
+                        "org-openroadm-port-types:if-OCH-OTU4-ODU4"
+                    ],
+                    "port-oper-state": "InService",
+                    "port-direction": "bidirectional",
+                    "lcp-hash-val": "AP2/mp+mI1y5",
+                    "supporting-port": "C1",
+                    "port-qual": "switch-client"
+                },
+                {
+                    "logical-connection-point": "XPDR1-NETWORK1",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "1/1/2-PLUG-NET",
+                    "supported-interface-capability": [
+                        "org-openroadm-port-types:if-otsi-otsigroup"
+                    ],
+                    "port-oper-state": "InService",
+                    "connection-map-lcp": "XPDR1-CLIENT1",
+                    "port-direction": "bidirectional",
+                    "xpdr-type": "tpdr",
+                    "lcp-hash-val": "ZbICgmaBrJM=",
+                    "supporting-port": "L1",
+                    "port-qual": "xpdr-network"
+                },
+                {
+                    "logical-connection-point": "XPDR2-CLIENT2",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "1/2/1/2-PLUG-CLIENT",
+                    "mpdr-restrictions": {
+                        "min-trib-slot": "2.1",
+                        "max-trib-slot": "2.20"
+                    },
+                    "supported-interface-capability": [
+                        "org-openroadm-port-types:if-100GE-ODU4",
+                        "org-openroadm-port-types:if-OCH-OTU4-ODU4"
+                    ],
+                    "port-oper-state": "InService",
+                    "port-direction": "bidirectional",
+                    "lcp-hash-val": "AP2/mp+mI1y6",
+                    "supporting-port": "C1",
+                    "port-qual": "switch-client"
+                },
+                {
+                    "logical-connection-point": "XPDR1-CLIENT1",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "1/1/1-PLUG-CLIENT",
+                    "supported-interface-capability": [
+                        "org-openroadm-port-types:if-400GE"
+                    ],
+                    "port-oper-state": "InService",
+                    "connection-map-lcp": "XPDR1-NETWORK1",
+                    "port-direction": "bidirectional",
+                    "lcp-hash-val": "M5cViLS5z3o=",
+                    "supporting-port": "C1",
+                    "port-qual": "xpdr-client"
+                },
+                {
+                    "logical-connection-point": "XPDR2-NETWORK1",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "1/2/2-PLUG-NET",
+                    "supported-interface-capability": [
+                        "org-openroadm-port-types:if-otsi-otsigroup"
+                    ],
+                    "port-oper-state": "InService",
+                    "port-direction": "bidirectional",
+                    "xpdr-type": "mpdr",
+                    "lcp-hash-val": "Nmbu2MNHvc4=",
+                    "supporting-port": "L1",
+                    "port-qual": "switch-network"
+                }
+            ],
+            "mc-capabilities": [
+                {
+                    "mc-node-name": "XPDR-mcprofile",
+                    "center-freq-granularity": 3.125,
+                    "slot-width-granularity": 6.25
+                }
+            ]
+        },
+        {
+            "node-id": "ROADM-A1",
+            "node-info": {
+                "node-clli": "NodeA",
+                "node-vendor": "vendorA",
+                "openroadm-version": "2.2.1",
+                "node-ip-address": "127.0.0.11",
+                "node-type": "rdm",
+                "node-model": "model2"
             },
-            {
-                "node-id": "ROADM-A1",
-                "node-info": {
-                    "node-clli": "NodeA",
-                    "node-vendor": "vendorA",
-                    "openroadm-version": "2.2.1",
-                    "node-ip-address": "127.0.0.11",
-                    "node-type": "rdm",
-                    "node-model": "model2"
-                },
-                "cp-to-degree": [
-                    {
-                        "circuit-pack-name": "1/0/ETH-PLUG",
-                        "degree-number": 1,
-                        "interface-name": "1GE-interface-1"
-                    },
-                    {
-                        "circuit-pack-name": "2/0",
-                        "degree-number": 2,
-                        "interface-name": "1GE-interface-2"
-                    },
-                    {
-                        "circuit-pack-name": "2/0/ETH-PLUG",
-                        "degree-number": 2,
-                        "interface-name": "1GE-interface-2"
-                    },
-                    {
-                        "circuit-pack-name": "1/0",
-                        "degree-number": 1,
-                        "interface-name": "1GE-interface-1"
-                    }
-                ],
-                "mapping": [
-                    {
-                        "logical-connection-point": "SRG3-PP1-TXRX",
-                        "port-direction": "bidirectional",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "5/0",
-                        "supporting-port": "C1",
-                        "port-oper-state": "InService"
-                    },
-                    {
-                        "logical-connection-point": "SRG1-PP2-TXRX",
-                        "port-direction": "bidirectional",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "3/0",
-                        "supporting-port": "C2",
-                        "port-oper-state": "InService"
-                    },
-                    {
-                        "logical-connection-point": "SRG3-PP4-TXRX",
-                        "port-direction": "bidirectional",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "5/0",
-                        "supporting-port": "C4",
-                        "port-oper-state": "InService"
-                    },
-                    {
-                        "logical-connection-point": "SRG1-PP4-TXRX",
-                        "port-direction": "bidirectional",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "3/0",
-                        "supporting-port": "C4",
-                        "port-oper-state": "InService"
-                    },
-                    {
-                        "logical-connection-point": "SRG3-PP3-TXRX",
-                        "port-direction": "bidirectional",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "5/0",
-                        "supporting-port": "C3",
-                        "port-oper-state": "InService"
-                    },
-                    {
-                        "logical-connection-point": "DEG2-TTP-TXRX",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "2/0",
-                        "supporting-ots": "OTS-DEG2-TTP-TXRX",
-                        "port-oper-state": "InService",
-                        "port-direction": "bidirectional",
-                        "supporting-port": "L1",
-                        "supporting-oms": "OMS-DEG2-TTP-TXRX"
-                    },
-                    {
-                        "logical-connection-point": "SRG1-PP3-TXRX",
-                        "port-direction": "bidirectional",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "3/0",
-                        "supporting-port": "C3",
-                        "port-oper-state": "InService"
-                    },
-                    {
-                        "logical-connection-point": "SRG3-PP2-TXRX",
-                        "port-direction": "bidirectional",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "5/0",
-                        "supporting-port": "C2",
-                        "port-oper-state": "InService"
-                    },
-                    {
-                        "logical-connection-point": "DEG1-TTP-TXRX",
-                        "port-direction": "bidirectional",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "1/0",
-                        "supporting-port": "L1",
-                        "port-oper-state": "InService"
-                    },
-                    {
-                        "logical-connection-point": "SRG1-PP1-TXRX",
-                        "port-direction": "bidirectional",
-                        "port-admin-state": "InService",
-                        "supporting-circuit-pack-name": "3/0",
-                        "supporting-port": "C1",
-                        "port-oper-state": "InService"
-                    }
-                ],
-                "mc-capabilities": [
-                    {
-                        "mc-node-name": "DEG2-TTP",
-                        "center-freq-granularity": 50,
-                        "slot-width-granularity": 50
-                    },
-                    {
-                        "mc-node-name": "DEG1-TTP",
-                        "center-freq-granularity": 50,
-                        "slot-width-granularity": 50
-                    },
-                    {
-                        "mc-node-name": "SRG3-PP",
-                        "center-freq-granularity": 50,
-                        "slot-width-granularity": 50
-                    },
-                    {
-                        "mc-node-name": "SRG1-PP",
-                        "center-freq-granularity": 50,
-                        "slot-width-granularity": 50
-                    }
-                ]
-            }
-        ]
-    }
+            "cp-to-degree": [
+                {
+                    "circuit-pack-name": "1/0/ETH-PLUG",
+                    "degree-number": 1,
+                    "interface-name": "1GE-interface-1"
+                },
+                {
+                    "circuit-pack-name": "2/0",
+                    "degree-number": 2,
+                    "interface-name": "1GE-interface-2"
+                },
+                {
+                    "circuit-pack-name": "2/0/ETH-PLUG",
+                    "degree-number": 2,
+                    "interface-name": "1GE-interface-2"
+                },
+                {
+                    "circuit-pack-name": "1/0",
+                    "degree-number": 1,
+                    "interface-name": "1GE-interface-1"
+                }
+            ],
+            "mapping": [
+                {
+                    "logical-connection-point": "SRG3-PP1-TXRX",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "5/0",
+                    "supporting-port": "C1",
+                    "port-oper-state": "InService"
+                },
+                {
+                    "logical-connection-point": "SRG1-PP2-TXRX",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "3/0",
+                    "supporting-port": "C2",
+                    "port-oper-state": "InService"
+                },
+                {
+                    "logical-connection-point": "SRG3-PP4-TXRX",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "5/0",
+                    "supporting-port": "C4",
+                    "port-oper-state": "InService"
+                },
+                {
+                    "logical-connection-point": "SRG1-PP4-TXRX",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "3/0",
+                    "supporting-port": "C4",
+                    "port-oper-state": "InService"
+                },
+                {
+                    "logical-connection-point": "SRG3-PP3-TXRX",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "5/0",
+                    "supporting-port": "C3",
+                    "port-oper-state": "InService"
+                },
+                {
+                    "logical-connection-point": "DEG2-TTP-TXRX",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "2/0",
+                    "supporting-ots": "OTS-DEG2-TTP-TXRX",
+                    "port-oper-state": "InService",
+                    "port-direction": "bidirectional",
+                    "supporting-port": "L1",
+                    "supporting-oms": "OMS-DEG2-TTP-TXRX"
+                },
+                {
+                    "logical-connection-point": "SRG1-PP3-TXRX",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "3/0",
+                    "supporting-port": "C3",
+                    "port-oper-state": "InService"
+                },
+                {
+                    "logical-connection-point": "SRG3-PP2-TXRX",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "5/0",
+                    "supporting-port": "C2",
+                    "port-oper-state": "InService"
+                },
+                {
+                    "logical-connection-point": "DEG1-TTP-TXRX",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "1/0",
+                    "supporting-port": "L1",
+                    "port-oper-state": "InService"
+                },
+                {
+                    "logical-connection-point": "SRG1-PP1-TXRX",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-circuit-pack-name": "3/0",
+                    "supporting-port": "C1",
+                    "port-oper-state": "InService"
+                }
+            ],
+            "mc-capabilities": [
+                {
+                    "mc-node-name": "DEG2-TTP",
+                    "center-freq-granularity": 50,
+                    "slot-width-granularity": 50
+                },
+                {
+                    "mc-node-name": "DEG1-TTP",
+                    "center-freq-granularity": 50,
+                    "slot-width-granularity": 50
+                },
+                {
+                    "mc-node-name": "SRG3-PP",
+                    "center-freq-granularity": 50,
+                    "slot-width-granularity": 50
+                },
+                {
+                    "mc-node-name": "SRG1-PP",
+                    "center-freq-granularity": 50,
+                    "slot-width-granularity": 50
+                }
+            ]
+        }
+    ]
 }
diff --git a/tests/sample_configs/portmapping-3-RDM-221.json b/tests/sample_configs/portmapping-3-RDM-221.json
new file mode 100644 (file)
index 0000000..fcc93e6
--- /dev/null
@@ -0,0 +1,353 @@
+{
+    "nodes": [
+        {
+            "node-id": "ROADM-C1",
+            "node-info": {
+                "node-type": "rdm",
+                "node-model": "model2",
+                "openroadm-version": "2.2.1",
+                "node-clli": "NodeC",
+                "node-vendor": "vendorA",
+                "node-ip-address": "127.0.0.13"
+            },
+            "cp-to-degree": [
+                {
+                    "circuit-pack-name": "1/0/ETH-PLUG",
+                    "interface-name": "1GE-interface-1",
+                    "degree-number": 1
+                },
+                {
+                    "circuit-pack-name": "2/0/ETH-PLUG",
+                    "interface-name": "1GE-interface-2",
+                    "degree-number": 2
+                },
+                {
+                    "circuit-pack-name": "2/0",
+                    "interface-name": "1GE-interface-2",
+                    "degree-number": 2
+                },
+                {
+                    "circuit-pack-name": "1/0",
+                    "interface-name": "1GE-interface-1",
+                    "degree-number": 1
+                }
+            ],
+            "mapping": [
+                {
+                    "logical-connection-point": "SRG1-PP3-TXRX",
+                    "port-oper-state": "InService",
+                    "supporting-circuit-pack-name": "3/0",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-port": "C3"
+                },
+                {
+                    "logical-connection-point": "SRG1-PP2-TXRX",
+                    "port-oper-state": "InService",
+                    "supporting-circuit-pack-name": "3/0",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-port": "C2"
+                },
+                {
+                    "logical-connection-point": "SRG1-PP4-TXRX",
+                    "port-oper-state": "InService",
+                    "supporting-circuit-pack-name": "3/0",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-port": "C4"
+                },
+                {
+                    "logical-connection-point": "SRG1-PP1-TXRX",
+                    "port-oper-state": "InService",
+                    "supporting-circuit-pack-name": "3/0",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-port": "C1"
+                },
+                {
+                    "logical-connection-point": "DEG1-TTP-TXRX",
+                    "port-oper-state": "InService",
+                    "supporting-oms": "OMS-DEG1-TTP-TXRX",
+                    "supporting-circuit-pack-name": "1/0",
+                    "supporting-ots": "OTS-DEG1-TTP-TXRX",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-port": "L1"
+                },
+                {
+                    "logical-connection-point": "DEG2-TTP-TXRX",
+                    "port-oper-state": "InService",
+                    "supporting-oms": "OMS-DEG2-TTP-TXRX",
+                    "supporting-circuit-pack-name": "2/0",
+                    "supporting-ots": "OTS-DEG2-TTP-TXRX",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-port": "L1"
+                }
+            ],
+            "mc-capabilities": [
+                {
+                    "mc-node-name": "DEG1-TTP",
+                    "slot-width-granularity": "50.0",
+                    "center-freq-granularity": "50.0"
+                },
+                {
+                    "mc-node-name": "DEG2-TTP",
+                    "slot-width-granularity": "50.0",
+                    "center-freq-granularity": "50.0"
+                },
+                {
+                    "mc-node-name": "SRG1-PP",
+                    "slot-width-granularity": "50.0",
+                    "center-freq-granularity": "50.0"
+                }
+            ]
+        },
+        {
+            "node-id": "ROADM-A1",
+            "node-info": {
+                "node-type": "rdm",
+                "node-model": "model2",
+                "openroadm-version": "2.2.1",
+                "node-clli": "NodeA",
+                "node-vendor": "vendorA",
+                "node-ip-address": "127.0.0.11"
+            },
+            "cp-to-degree": [
+                {
+                    "circuit-pack-name": "1/0/ETH-PLUG",
+                    "interface-name": "1GE-interface-1",
+                    "degree-number": 1
+                },
+                {
+                    "circuit-pack-name": "2/0/ETH-PLUG",
+                    "interface-name": "1GE-interface-2",
+                    "degree-number": 2
+                },
+                {
+                    "circuit-pack-name": "2/0",
+                    "interface-name": "1GE-interface-2",
+                    "degree-number": 2
+                },
+                {
+                    "circuit-pack-name": "1/0",
+                    "interface-name": "1GE-interface-1",
+                    "degree-number": 1
+                }
+            ],
+            "mapping": [
+                {
+                    "logical-connection-point": "SRG1-PP2-TXRX",
+                    "port-oper-state": "InService",
+                    "supporting-circuit-pack-name": "3/0",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-port": "C2"
+                },
+                {
+                    "logical-connection-point": "SRG1-PP4-TXRX",
+                    "port-oper-state": "InService",
+                    "supporting-circuit-pack-name": "3/0",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-port": "C4"
+                },
+                {
+                    "logical-connection-point": "SRG3-PP4-TXRX",
+                    "port-oper-state": "InService",
+                    "supporting-circuit-pack-name": "5/0",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-port": "C4"
+                },
+                {
+                    "logical-connection-point": "SRG3-PP3-TXRX",
+                    "port-oper-state": "InService",
+                    "supporting-circuit-pack-name": "5/0",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-port": "C3"
+                },
+                {
+                    "logical-connection-point": "DEG2-TTP-TXRX",
+                    "port-oper-state": "InService",
+                    "supporting-oms": "OMS-DEG2-TTP-TXRX",
+                    "supporting-circuit-pack-name": "2/0",
+                    "supporting-ots": "OTS-DEG2-TTP-TXRX",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-port": "L1"
+                },
+                {
+                    "logical-connection-point": "SRG1-PP3-TXRX",
+                    "port-oper-state": "InService",
+                    "supporting-circuit-pack-name": "3/0",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-port": "C3"
+                },
+                {
+                    "logical-connection-point": "SRG3-PP2-TXRX",
+                    "port-oper-state": "InService",
+                    "supporting-circuit-pack-name": "5/0",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-port": "C2"
+                },
+                {
+                    "logical-connection-point": "SRG1-PP1-TXRX",
+                    "port-oper-state": "InService",
+                    "supporting-circuit-pack-name": "3/0",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-port": "C1"
+                },
+                {
+                    "logical-connection-point": "DEG1-TTP-TXRX",
+                    "port-oper-state": "InService",
+                    "supporting-oms": "OMS-DEG1-TTP-TXRX",
+                    "supporting-circuit-pack-name": "1/0",
+                    "supporting-ots": "OTS-DEG1-TTP-TXRX",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-port": "L1"
+                },
+                {
+                    "logical-connection-point": "SRG3-PP1-TXRX",
+                    "port-oper-state": "InService",
+                    "supporting-circuit-pack-name": "5/0",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-port": "C1"
+                }
+            ],
+            "mc-capabilities": [
+                {
+                    "mc-node-name": "DEG2-TTP",
+                    "slot-width-granularity": "50.0",
+                    "center-freq-granularity": "50.0"
+                },
+                {
+                    "mc-node-name": "DEG1-TTP",
+                    "slot-width-granularity": "50.0",
+                    "center-freq-granularity": "50.0"
+                },
+                {
+                    "mc-node-name": "SRG3-PP",
+                    "slot-width-granularity": "50.0",
+                    "center-freq-granularity": "50.0"
+                },
+                {
+                    "mc-node-name": "SRG1-PP",
+                    "slot-width-granularity": "50.0",
+                    "center-freq-granularity": "50.0"
+                }
+            ]
+        },
+        {
+            "node-id": "ROADM-B1",
+            "node-info": {
+                "node-type": "rdm",
+                "node-model": "model2",
+                "openroadm-version": "2.2.1",
+                "node-clli": "NodeB",
+                "node-vendor": "vendorA",
+                "node-ip-address": "127.0.0.12"
+            },
+            "cp-to-degree": [
+                {
+                    "circuit-pack-name": "1/0/ETH-PLUG",
+                    "interface-name": "1GE-interface-1",
+                    "degree-number": 1
+                },
+                {
+                    "circuit-pack-name": "2/0/ETH-PLUG",
+                    "interface-name": "1GE-interface-2",
+                    "degree-number": 2
+                },
+                {
+                    "circuit-pack-name": "2/0",
+                    "interface-name": "1GE-interface-2",
+                    "degree-number": 2
+                },
+                {
+                    "circuit-pack-name": "1/0",
+                    "interface-name": "1GE-interface-1",
+                    "degree-number": 1
+                }
+            ],
+            "mapping": [
+                {
+                    "logical-connection-point": "SRG1-PP3-TXRX",
+                    "port-oper-state": "InService",
+                    "supporting-circuit-pack-name": "3/0",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-port": "C3"
+                },
+                {
+                    "logical-connection-point": "SRG1-PP2-TXRX",
+                    "port-oper-state": "InService",
+                    "supporting-circuit-pack-name": "3/0",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-port": "C2"
+                },
+                {
+                    "logical-connection-point": "SRG1-PP4-TXRX",
+                    "port-oper-state": "InService",
+                    "supporting-circuit-pack-name": "3/0",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-port": "C4"
+                },
+                {
+                    "logical-connection-point": "SRG1-PP1-TXRX",
+                    "port-oper-state": "InService",
+                    "supporting-circuit-pack-name": "3/0",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-port": "C1"
+                },
+                {
+                    "logical-connection-point": "DEG1-TTP-TXRX",
+                    "port-oper-state": "InService",
+                    "supporting-oms": "OMS-DEG1-TTP-TXRX",
+                    "supporting-circuit-pack-name": "1/0",
+                    "supporting-ots": "OTS-DEG1-TTP-TXRX",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-port": "L1"
+                },
+                {
+                    "logical-connection-point": "DEG2-TTP-TXRX",
+                    "port-oper-state": "InService",
+                    "supporting-oms": "OMS-DEG2-TTP-TXRX",
+                    "supporting-circuit-pack-name": "2/0",
+                    "supporting-ots": "OTS-DEG2-TTP-TXRX",
+                    "port-direction": "bidirectional",
+                    "port-admin-state": "InService",
+                    "supporting-port": "L1"
+                }
+            ],
+            "mc-capabilities": [
+                {
+                    "mc-node-name": "DEG1-TTP",
+                    "slot-width-granularity": "50.0",
+                    "center-freq-granularity": "50.0"
+                },
+                {
+                    "mc-node-name": "DEG2-TTP",
+                    "slot-width-granularity": "50.0",
+                    "center-freq-granularity": "50.0"
+                },
+                {
+                    "mc-node-name": "SRG1-PP",
+                    "slot-width-granularity": "50.0",
+                    "center-freq-granularity": "50.0"
+                }
+            ]
+        }
+    ]
+}
\ No newline at end of file
index 55c4d55e6bdc6dc0bb99237d94d1833da73e6d5b..8ea5b14c73b1d3df70b3243bc7c98be0e3448bd8 100644 (file)
@@ -1 +1,2 @@
-nose # LGPL v2 or later
+## Caution this file is in .gitignore
+pytest # MIT License
index 1d7a5c24b915dc2257e277354e24a9cead492a9a..1f37d860d061b356da8fe1ca87bc9a26f95cb821 100644 (file)
@@ -20,7 +20,7 @@ import sys
 sys.path.append('transportpce_tests/common/')
 # pylint: disable=wrong-import-position
 # pylint: disable=import-error
-import test_utils_rfc8040  # nopep8
+import test_utils  # nopep8
 
 
 class TransportPCEPortMappingTesting(unittest.TestCase):
@@ -30,33 +30,33 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
-        cls.processes = test_utils_rfc8040.start_tpce()
-        cls.processes = test_utils_rfc8040.start_sims([('xpdra', cls.NODE_VERSION), ('roadma', cls.NODE_VERSION)])
+        cls.processes = test_utils.start_tpce()
+        cls.processes = test_utils.start_sims([('xpdra', cls.NODE_VERSION), ('roadma', cls.NODE_VERSION)])
 
     @classmethod
     def tearDownClass(cls):
         # pylint: disable=not-an-iterable
         for process in cls.processes:
-            test_utils_rfc8040.shutdown_process(process)
+            test_utils.shutdown_process(process)
         print("all processes killed")
 
     def setUp(self):
         # pylint: disable=consider-using-f-string
         print("execution of {}".format(self.id().split(".")[-1]))
-        time.sleep(10)
+        time.sleep(1)
 
     def test_01_rdm_device_connection(self):
-        response = test_utils_rfc8040.mount_device("ROADMA01", ('roadma', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("ROADMA01", ('roadma', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_02_rdm_device_connected(self):
-        response = test_utils_rfc8040.check_device_connection("ROADMA01")
+        response = test_utils.check_device_connection("ROADMA01")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(response['connection-status'], 'connected')
         time.sleep(10)
 
     def test_03_rdm_portmapping_info(self):
-        response = test_utils_rfc8040.get_portmapping_node_info("ROADMA01")
+        response = test_utils.get_portmapping_node_attr("ROADMA01", "node-info", None)
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(
             {'node-type': 'rdm',
@@ -69,7 +69,7 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
         time.sleep(3)
 
     def test_04_rdm_portmapping_DEG1_TTP_TXRX(self):
-        response = test_utils_rfc8040.portmapping_request("ROADMA01", "DEG1-TTP-TXRX")
+        response = test_utils.get_portmapping_node_attr("ROADMA01", "mapping", "DEG1-TTP-TXRX")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {'supporting-port': 'L1', 'supporting-circuit-pack-name': '2/0',
@@ -78,7 +78,7 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
             response['mapping'])
 
     def test_05_rdm_portmapping_SRG1_PP7_TXRX(self):
-        response = test_utils_rfc8040.portmapping_request("ROADMA01", "SRG1-PP7-TXRX")
+        response = test_utils.get_portmapping_node_attr("ROADMA01", "mapping", "SRG1-PP7-TXRX")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {'supporting-port': 'C7', 'supporting-circuit-pack-name': '4/0',
@@ -87,7 +87,7 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
             response['mapping'])
 
     def test_06_rdm_portmapping_SRG3_PP1_TXRX(self):
-        response = test_utils_rfc8040.portmapping_request("ROADMA01", "SRG3-PP1-TXRX")
+        response = test_utils.get_portmapping_node_attr("ROADMA01", "mapping", "SRG3-PP1-TXRX")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {'supporting-port': 'C1', 'supporting-circuit-pack-name': '5/0',
@@ -96,17 +96,17 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
             response['mapping'])
 
     def test_07_xpdr_device_connection(self):
-        response = test_utils_rfc8040.mount_device("XPDRA01", ('xpdra', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("XPDRA01", ('xpdra', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_08_xpdr_device_connected(self):
-        response = test_utils_rfc8040.check_device_connection("XPDRA01")
+        response = test_utils.check_device_connection("XPDRA01")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(response['connection-status'], 'connected')
         time.sleep(10)
 
     def test_09_xpdr_portmapping_info(self):
-        response = test_utils_rfc8040.get_portmapping_node_info("XPDRA01")
+        response = test_utils.get_portmapping_node_attr("XPDRA01", "node-info", None)
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(
             {'node-type': 'xpdr',
@@ -119,56 +119,56 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
         time.sleep(3)
 
     def test_10_xpdr_portmapping_NETWORK1(self):
-        response = test_utils_rfc8040.portmapping_request("XPDRA01", "XPDR1-NETWORK1")
+        response = test_utils.get_portmapping_node_attr("XPDRA01", "mapping", "XPDR1-NETWORK1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {'supporting-port': '1', 'supporting-circuit-pack-name': '1/0/1-PLUG-NET',
              'logical-connection-point': 'XPDR1-NETWORK1', 'port-direction': 'bidirectional',
              'connection-map-lcp': 'XPDR1-CLIENT1', 'port-qual': 'xpdr-network',
-             'lcp-hash-val': 'OSvMgUyP+mE=', 'xponder-type': 'tpdr',
+             'lcp-hash-val': 'OSvMgUyP+mE=', 'xpdr-type': 'tpdr',
              'port-admin-state': 'InService', 'port-oper-state': 'InService'},
             response['mapping'])
 
     def test_11_xpdr_portmapping_NETWORK2(self):
-        response = test_utils_rfc8040.portmapping_request("XPDRA01", "XPDR1-NETWORK2")
+        response = test_utils.get_portmapping_node_attr("XPDRA01", "mapping", "XPDR1-NETWORK2")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {'supporting-port': '1', 'supporting-circuit-pack-name': '1/0/2-PLUG-NET',
              'logical-connection-point': 'XPDR1-NETWORK2', 'port-direction': 'bidirectional',
              'connection-map-lcp': 'XPDR1-CLIENT3', 'port-qual': 'xpdr-network',
-             'lcp-hash-val': 'OSvMgUyP+mI=', 'xponder-type': 'tpdr',
+             'lcp-hash-val': 'OSvMgUyP+mI=', 'xpdr-type': 'tpdr',
              'port-admin-state': 'InService', 'port-oper-state': 'InService'},
             response['mapping'])
 
     def test_12_xpdr_portmapping_CLIENT1(self):
-        response = test_utils_rfc8040.portmapping_request("XPDRA01", "XPDR1-CLIENT1")
+        response = test_utils.get_portmapping_node_attr("XPDRA01", "mapping", "XPDR1-CLIENT1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {'supporting-port': 'C1',
              'supporting-circuit-pack-name': '1/0/C1-PLUG-CLIENT',
              'logical-connection-point': 'XPDR1-CLIENT1', 'port-direction': 'bidirectional',
              'connection-map-lcp': 'XPDR1-NETWORK1', 'port-qual': 'xpdr-client',
-             'lcp-hash-val': 'AO9UFkY/TLYw', 'xponder-type': 'tpdr',
+             'lcp-hash-val': 'AO9UFkY/TLYw', 'xpdr-type': 'tpdr',
              'port-admin-state': 'InService', 'port-oper-state': 'InService'},
             response['mapping'])
 
     def test_13_xpdr_portmapping_CLIENT2(self):
-        response = test_utils_rfc8040.portmapping_request("XPDRA01", "XPDR1-CLIENT2")
+        response = test_utils.get_portmapping_node_attr("XPDRA01", "mapping", "XPDR1-CLIENT2")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {'supporting-port': 'C2',
              'supporting-circuit-pack-name': '1/0/C2-PLUG-CLIENT',
              'logical-connection-point': 'XPDR1-CLIENT2', 'port-direction': 'bidirectional',
              'port-qual': 'xpdr-client',
-             'lcp-hash-val': 'AO9UFkY/TLYz', 'xponder-type': 'tpdr',
+             'lcp-hash-val': 'AO9UFkY/TLYz', 'xpdr-type': 'tpdr',
              'port-admin-state': 'InService', 'port-oper-state': 'InService'},
             response['mapping'])
 
     def test_14_xpdr_portmapping_CLIENT3(self):
-        response = test_utils_rfc8040.portmapping_request("XPDRA01", "XPDR1-CLIENT3")
+        response = test_utils.get_portmapping_node_attr("XPDRA01", "mapping", "XPDR1-CLIENT3")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
-            {'supporting-port': 'C3', 'xponder-type': 'tpdr',
+            {'supporting-port': 'C3', 'xpdr-type': 'tpdr',
              'supporting-circuit-pack-name': '1/0/C3-PLUG-CLIENT',
              'logical-connection-point': 'XPDR1-CLIENT3',
              'connection-map-lcp': 'XPDR1-NETWORK2', 'port-direction': 'bidirectional',
@@ -177,10 +177,10 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
             response['mapping'])
 
     def test_15_xpdr_portmapping_CLIENT4(self):
-        response = test_utils_rfc8040.portmapping_request("XPDRA01", "XPDR1-CLIENT4")
+        response = test_utils.get_portmapping_node_attr("XPDRA01", "mapping", "XPDR1-CLIENT4")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
-            {'supporting-port': 'C4', 'xponder-type': 'tpdr',
+            {'supporting-port': 'C4', 'xpdr-type': 'tpdr',
              'supporting-circuit-pack-name': '1/0/C4-PLUG-CLIENT',
              'logical-connection-point': 'XPDR1-CLIENT4', 'port-direction': 'bidirectional',
              'port-qual': 'xpdr-client', 'lcp-hash-val': 'AO9UFkY/TLY1',
@@ -188,11 +188,11 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
             response['mapping'])
 
     def test_16_xpdr_device_disconnection(self):
-        response = test_utils_rfc8040.unmount_device("XPDRA01")
+        response = test_utils.unmount_device("XPDRA01")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_17_xpdr_device_disconnected(self):
-        response = test_utils_rfc8040.check_device_connection("XPDRA01")
+        response = test_utils.check_device_connection("XPDRA01")
         self.assertEqual(response['status_code'], requests.codes.conflict)
         self.assertIn(response['connection-status']['error-type'], ('protocol', 'application'))
         self.assertEqual(response['connection-status']['error-tag'], 'data-missing')
@@ -200,7 +200,7 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
                          'Request could not be completed because the relevant data model content does not exist')
 
     def test_18_xpdr_device_not_connected(self):
-        response = test_utils_rfc8040.get_portmapping_node_info("XPDRA01")
+        response = test_utils.get_portmapping_node_attr("XPDRA01", "node-info", None)
         self.assertEqual(response['status_code'], requests.codes.conflict)
         self.assertIn(response['node-info']['error-type'], ('protocol', 'application'))
         self.assertEqual(response['node-info']['error-tag'], 'data-missing')
@@ -208,11 +208,11 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
                          'Request could not be completed because the relevant data model content does not exist')
 
     def test_19_rdm_device_disconnection(self):
-        response = test_utils_rfc8040.unmount_device("ROADMA01")
+        response = test_utils.unmount_device("ROADMA01")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_20_rdm_device_disconnected(self):
-        response = test_utils_rfc8040.check_device_connection("ROADMA01")
+        response = test_utils.check_device_connection("ROADMA01")
         self.assertEqual(response['status_code'], requests.codes.conflict)
         self.assertIn(response['connection-status']['error-type'], ('protocol', 'application'))
         self.assertEqual(response['connection-status']['error-tag'], 'data-missing')
@@ -220,7 +220,7 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
                          'Request could not be completed because the relevant data model content does not exist')
 
     def test_21_rdm_device_not_connected(self):
-        response = test_utils_rfc8040.get_portmapping_node_info("ROADMA01")
+        response = test_utils.get_portmapping_node_attr("ROADMA01", "node-info", None)
         self.assertEqual(response['status_code'], requests.codes.conflict)
         self.assertIn(response['node-info']['error-type'], ('protocol', 'application'))
         self.assertEqual(response['node-info']['error-tag'], 'data-missing')
index 653ae84555ea42df5b59d77c6e953a74b3278a5c..84c4650ad575eb2f2e2d07cad4c875798f1c7682 100644 (file)
@@ -12,7 +12,6 @@
 # pylint: disable=no-member
 # pylint: disable=too-many-public-methods
 # a pylint false positive due to unittest
-# pylint: disable=no-self-use
 
 import time
 import unittest
@@ -22,7 +21,7 @@ import sys
 sys.path.append('transportpce_tests/common/')
 # pylint: disable=wrong-import-position
 # pylint: disable=import-error
-import test_utils_rfc8040  # nopep8
+import test_utils  # nopep8
 
 
 class TransportPCEtesting(unittest.TestCase):
@@ -32,48 +31,48 @@ class TransportPCEtesting(unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
-        cls.processes = test_utils_rfc8040.start_tpce()
-        cls.processes = test_utils_rfc8040.start_sims([('xpdra', cls.NODE_VERSION), ('roadma', cls.NODE_VERSION)])
+        cls.processes = test_utils.start_tpce()
+        cls.processes = test_utils.start_sims([('xpdra', cls.NODE_VERSION), ('roadma', cls.NODE_VERSION)])
 
     @classmethod
     def tearDownClass(cls):
         # pylint: disable=not-an-iterable
         for process in cls.processes:
-            test_utils_rfc8040.shutdown_process(process)
+            test_utils.shutdown_process(process)
         print("all processes killed")
 
     def setUp(self):
-        time.sleep(10)
+        time.sleep(2)
 
     # Connect the ROADMA
     def test_01_connect_rdm(self):
-        response = test_utils_rfc8040.mount_device("ROADMA01", ('roadma', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("ROADMA01", ('roadma', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     # Verify the termination points of the ROADMA
     def test_02_compare_Openroadm_topology_portmapping_rdm(self):
-        resTopo = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        resTopo = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(resTopo['status_code'], requests.codes.ok)
         for node in resTopo['network'][0]['node']:
             nodeId = node['node-id']
             nodeMapId = nodeId.split("-")[0]
-            response = test_utils_rfc8040.get_portmapping_node_info(nodeMapId)
+            response = test_utils.get_portmapping_node_attr(nodeMapId, "node-info", None)
             self.assertEqual(response['status_code'], requests.codes.ok)
             for tp in node['ietf-network-topology:termination-point']:
                 tpId = tp['tp-id']
                 if (not "CP" in tpId) and (not "CTP" in tpId):
-                    response2 = test_utils_rfc8040.portmapping_request(nodeMapId, tpId)
+                    response2 = test_utils.get_portmapping_node_attr(nodeMapId, "mapping", tpId)
                     self.assertEqual(response2['status_code'], requests.codes.ok)
 
     # Disconnect the ROADMA
     def test_03_disconnect_rdm(self):
-        response = test_utils_rfc8040.unmount_device("ROADMA01")
+        response = test_utils.unmount_device("ROADMA01")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
 #     #Connect the XPDRA
     def test_04_connect_xpdr(self):
-        response = test_utils_rfc8040.mount_device("XPDRA01", ('xpdra', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("XPDRA01", ('xpdra', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
 #     #Verify the termination points related to XPDR
     def test_05_compare_Openroadm_topology_portmapping_xpdr(self):
@@ -81,11 +80,10 @@ class TransportPCEtesting(unittest.TestCase):
 
     # Disconnect the XPDRA
     def test_06_disconnect_device(self):
-        response = test_utils_rfc8040.unmount_device("XPDRA01")
+        response = test_utils.unmount_device("XPDRA01")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
 
 if __name__ == "__main__":
     # logging.basicConfig(filename='./transportpce_tests/log/response.log',filemode='w',level=logging.DEBUG)
-    #logging.debug('I am there')
     unittest.main(verbosity=2)
index 1600fe200b2286e4aea8ed8c697ec83777fe8cb9..36ca1550140b9f3cd5d2240a544c6e7ee58f6bdb 100644 (file)
@@ -21,7 +21,7 @@ import sys
 sys.path.append('transportpce_tests/common/')
 # pylint: disable=wrong-import-position
 # pylint: disable=import-error
-import test_utils_rfc8040  # nopep8
+import test_utils  # nopep8
 
 
 class TransportPCETopologyTesting(unittest.TestCase):
@@ -98,32 +98,32 @@ class TransportPCETopologyTesting(unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
-        cls.processes = test_utils_rfc8040.start_tpce()
-        cls.processes = test_utils_rfc8040.start_sims([('xpdra', cls.NODE_VERSION), ('roadma', cls.NODE_VERSION),
-                                                       ('roadmb', cls.NODE_VERSION), ('roadmc', cls.NODE_VERSION)])
+        cls.processes = test_utils.start_tpce()
+        cls.processes = test_utils.start_sims([('xpdra', cls.NODE_VERSION), ('roadma', cls.NODE_VERSION),
+                                               ('roadmb', cls.NODE_VERSION), ('roadmc', cls.NODE_VERSION)])
 
     @classmethod
     def tearDownClass(cls):
         # pylint: disable=not-an-iterable
         for process in cls.processes:
-            test_utils_rfc8040.shutdown_process(process)
+            test_utils.shutdown_process(process)
         print("all processes killed")
 
     def setUp(self):
-        time.sleep(5)
+        time.sleep(2)
 
     def test_01_connect_ROADMA(self):
-        response = test_utils_rfc8040.mount_device("ROADMA01", ('roadma', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("ROADMA01", ('roadma', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_02_getClliNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('clli-network', 'config')
+        response = test_utils.get_ietf_network_request('clli-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(response['network'][0]['node'][0]['node-id'], 'NodeA')
         self.assertEqual(response['network'][0]['node'][0]['org-openroadm-clli-network:clli'], 'NodeA')
 
     def test_03_getOpenRoadmNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-network', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(response['network'][0]['node'][0]['node-id'], 'ROADMA01')
         self.assertEqual(response['network'][0]['node'][0]['supporting-node'][0]['network-ref'], 'clli-network')
@@ -132,7 +132,7 @@ class TransportPCETopologyTesting(unittest.TestCase):
         self.assertEqual(response['network'][0]['node'][0]['org-openroadm-network:model'], '2')
 
     def test_04_getLinks_OpenroadmTopology(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         # Tests related to links
         self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 10)
@@ -158,7 +158,7 @@ class TransportPCETopologyTesting(unittest.TestCase):
             self.assertEqual(len(link), 0)
 
     def test_05_getNodes_OpenRoadmTopology(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['node']), 4)
         listNode = ['ROADMA01-SRG1', 'ROADMA01-SRG3', 'ROADMA01-DEG1', 'ROADMA01-DEG2']
@@ -179,18 +179,18 @@ class TransportPCETopologyTesting(unittest.TestCase):
         self.assertEqual(len(listNode), 0)
 
     def test_06_connect_XPDRA(self):
-        response = test_utils_rfc8040.mount_device("XPDRA01", ('xpdra', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("XPDRA01", ('xpdra', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_07_getClliNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('clli-network', 'config')
+        response = test_utils.get_ietf_network_request('clli-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(response['network'][0]['node'][0]['node-id'], 'NodeA')
         self.assertEqual(response['network'][0]['node'][0]['org-openroadm-clli-network:clli'], 'NodeA')
 
     def test_08_getOpenRoadmNetwork(self):
         # pylint: disable=redundant-unittest-assert
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-network', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['node']), 2)
         for node in response['network'][0]['node']:
@@ -208,7 +208,7 @@ class TransportPCETopologyTesting(unittest.TestCase):
 
     def test_09_getNodes_OpenRoadmTopology(self):
         # pylint: disable=redundant-unittest-assert
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['node']), 5)
         listNode = ['XPDRA01-XPDR1', 'ROADMA01-SRG1', 'ROADMA01-SRG3', 'ROADMA01-DEG1', 'ROADMA01-DEG2']
@@ -230,9 +230,11 @@ class TransportPCETopologyTesting(unittest.TestCase):
                     elif tpType == 'XPONDER-NETWORK':
                         network += 1
                     if tpId == 'XPDR1-NETWORK2':
-                        self.assertEqual(tp['transportpce-topology:associated-connection-map-port'], 'XPDR1-CLIENT3')
+                        self.assertEqual(
+                            tp['org-openroadm-common-network:associated-connection-map-tp'], ['XPDR1-CLIENT3'])
                     elif tpId == 'XPDR1-CLIENT3':
-                        self.assertEqual(tp['transportpce-topology:associated-connection-map-port'], 'XPDR1-NETWORK2')
+                        self.assertEqual(
+                            tp['org-openroadm-common-network:associated-connection-map-tp'], ['XPDR1-NETWORK2'])
                 self.assertTrue(client == 4)
                 self.assertTrue(network == 2)
                 listNode.remove(nodeId)
@@ -253,7 +255,7 @@ class TransportPCETopologyTesting(unittest.TestCase):
     # Connect the tail XPDRA to ROADMA and vice versa
     def test_10_connect_tail_xpdr_rdm(self):
         # Connect the tail: XPDRA to ROADMA
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-networkutils', 'init-xpdr-rdm-links',
             {'links-input': {'xpdr-node': 'XPDRA01', 'xpdr-num': '1', 'network-num': '1',
                              'rdm-node': 'ROADMA01', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
@@ -261,14 +263,14 @@ class TransportPCETopologyTesting(unittest.TestCase):
 
     def test_11_connect_tail_rdm_xpdr(self):
         # Connect the tail: ROADMA to XPDRA
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-networkutils', 'init-rdm-xpdr-links',
             {'links-input': {'xpdr-node': 'XPDRA01', 'xpdr-num': '1', 'network-num': '1',
                              'rdm-node': 'ROADMA01', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
         self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_12_getLinks_OpenRoadmTopology(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 12)
         check_list = {'EXPRESS-LINK': ['ROADMA01-DEG2-DEG2-CTP-TXRXtoROADMA01-DEG1-DEG1-CTP-TXRX',
@@ -295,8 +297,8 @@ class TransportPCETopologyTesting(unittest.TestCase):
             self.assertEqual(len(link), 0)
 
     def test_13_connect_ROADMC(self):
-        response = test_utils_rfc8040.mount_device("ROADMC01", ('roadmc', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("ROADMC01", ('roadmc', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_14_omsAttributes_ROADMA_ROADMC(self):
         # Config ROADMA01-ROADMC01 oms-attributes
@@ -308,7 +310,7 @@ class TransportPCETopologyTesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils_rfc8040.add_oms_attr_request(
+        response = test_utils.add_oms_attr_request(
             "ROADMA01-DEG1-DEG1-TTP-TXRXtoROADMC01-DEG2-DEG2-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
 
@@ -322,12 +324,12 @@ class TransportPCETopologyTesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils_rfc8040.add_oms_attr_request(
+        response = test_utils.add_oms_attr_request(
             "ROADMC01-DEG2-DEG2-TTP-TXRXtoROADMA01-DEG1-DEG1-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
 
     def test_16_getClliNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('clli-network', 'config')
+        response = test_utils.get_ietf_network_request('clli-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         listNode = ['NodeA', 'NodeC']
         for node in response['network'][0]['node']:
@@ -338,7 +340,7 @@ class TransportPCETopologyTesting(unittest.TestCase):
         self.assertEqual(len(listNode), 0)
 
     def test_17_getOpenRoadmNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-network', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['node']), 3)
         listNode = ['XPDRA01', 'ROADMA01', 'ROADMC01']
@@ -360,7 +362,7 @@ class TransportPCETopologyTesting(unittest.TestCase):
         self.assertEqual(len(listNode), 0)
 
     def test_18_getROADMLinkOpenRoadmTopology(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 20)
         check_list = {'EXPRESS-LINK': ['ROADMA01-DEG2-DEG2-CTP-TXRXtoROADMA01-DEG1-DEG1-CTP-TXRX',
@@ -395,7 +397,7 @@ class TransportPCETopologyTesting(unittest.TestCase):
             self.assertEqual(len(link), 0)
 
     def test_19_getLinkOmsAttributesOpenRoadmTopology(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 20)
         R2RLink = ['ROADMA01-DEG1-DEG1-TTP-TXRXtoROADMC01-DEG2-DEG2-TTP-TXRX',
@@ -415,7 +417,7 @@ class TransportPCETopologyTesting(unittest.TestCase):
 
     def test_20_getNodes_OpenRoadmTopology(self):
         # pylint: disable=redundant-unittest-assert
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['node']), 8)
         listNode = ['XPDRA01-XPDR1',
@@ -467,8 +469,8 @@ class TransportPCETopologyTesting(unittest.TestCase):
         self.assertEqual(len(listNode), 0)
 
     def test_21_connect_ROADMB(self):
-        response = test_utils_rfc8040.mount_device("ROADMB01", ('roadmb', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("ROADMB01", ('roadmb', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_22_omsAttributes_ROADMA_ROADMB(self):
         # Config ROADMA01-ROADMB01 oms-attributes
@@ -480,7 +482,7 @@ class TransportPCETopologyTesting(unittest.TestCase):
                     "fiber-type": "smf",
                     "SRLG-length": 100000,
                     "pmd": 0.5}]}}
-        response = test_utils_rfc8040.add_oms_attr_request(
+        response = test_utils.add_oms_attr_request(
             "ROADMA01-DEG2-DEG2-TTP-TXRXtoROADMB01-DEG1-DEG1-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
 
@@ -494,7 +496,7 @@ class TransportPCETopologyTesting(unittest.TestCase):
                     "fiber-type": "smf",
                     "SRLG-length": 100000,
                     "pmd": 0.5}]}}
-        response = test_utils_rfc8040.add_oms_attr_request(
+        response = test_utils.add_oms_attr_request(
             "ROADMB01-DEG1-DEG1-TTP-TXRXtoROADMA01-DEG2-DEG2-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
 
@@ -508,7 +510,7 @@ class TransportPCETopologyTesting(unittest.TestCase):
                     "fiber-type": "smf",
                     "SRLG-length": 100000,
                     "pmd": 0.5}]}}
-        response = test_utils_rfc8040.add_oms_attr_request(
+        response = test_utils.add_oms_attr_request(
             "ROADMB01-DEG2-DEG2-TTP-TXRXtoROADMC01-DEG1-DEG1-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
 
@@ -522,12 +524,12 @@ class TransportPCETopologyTesting(unittest.TestCase):
                     "fiber-type": "smf",
                     "SRLG-length": 100000,
                     "pmd": 0.5}]}}
-        response = test_utils_rfc8040.add_oms_attr_request(
+        response = test_utils.add_oms_attr_request(
             "ROADMC01-DEG1-DEG1-TTP-TXRXtoROADMB01-DEG2-DEG2-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
 
     def test_26_getClliNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('clli-network', 'config')
+        response = test_utils.get_ietf_network_request('clli-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         listNode = ['NodeA', 'NodeB', 'NodeC']
         for node in response['network'][0]['node']:
@@ -538,7 +540,7 @@ class TransportPCETopologyTesting(unittest.TestCase):
         self.assertEqual(len(listNode), 0)
 
     def test_27_verifyDegree(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         listR2RLink = ['ROADMA01-DEG1-DEG1-TTP-TXRXtoROADMC01-DEG2-DEG2-TTP-TXRX',
                        'ROADMC01-DEG2-DEG2-TTP-TXRXtoROADMA01-DEG1-DEG1-TTP-TXRX',
@@ -555,7 +557,7 @@ class TransportPCETopologyTesting(unittest.TestCase):
         self.assertEqual(len(listR2RLink), 0)
 
     def test_28_verifyOppositeLinkTopology(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 34)
         for link in response['network'][0]['ietf-network-topology:link']:
@@ -565,7 +567,7 @@ class TransportPCETopologyTesting(unittest.TestCase):
             link_dest = link['destination']['dest-node']
             oppLink_id = link['org-openroadm-common-network:opposite-link']
             # Find the opposite link
-            res_oppLink = test_utils_rfc8040.get_ietf_network_link_request('openroadm-topology', oppLink_id, 'config')
+            res_oppLink = test_utils.get_ietf_network_link_request('openroadm-topology', oppLink_id, 'config')
             self.assertEqual(res_oppLink['status_code'], requests.codes.ok)
             self.assertEqual(res_oppLink['link']['org-openroadm-common-network:opposite-link'], link_id)
             self.assertEqual(res_oppLink['link']['source']['source-node'], link_dest)
@@ -578,7 +580,7 @@ class TransportPCETopologyTesting(unittest.TestCase):
                 self.assertEqual(oppLink_type, CHECK_DICT[link_type])
 
     def test_29_getLinkOmsAttributesOpenRoadmTopology(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         R2RLink = ['ROADMA01-DEG1-DEG1-TTP-TXRXtoROADMC01-DEG2-DEG2-TTP-TXRX',
                    'ROADMC01-DEG2-DEG2-TTP-TXRXtoROADMA01-DEG1-DEG1-TTP-TXRX',
@@ -601,22 +603,22 @@ class TransportPCETopologyTesting(unittest.TestCase):
 
     def test_30_disconnect_ROADMB(self):
         # Delete in the topology-netconf
-        response = test_utils_rfc8040.unmount_device("ROADMB01")
+        response = test_utils.unmount_device("ROADMB01")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
         # Delete in the clli-network
-        response = test_utils_rfc8040.del_ietf_network_node_request('clli-network', 'NodeB', 'config')
+        response = test_utils.del_ietf_network_node_request('clli-network', 'NodeB', 'config')
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_31_disconnect_ROADMC(self):
-        response = test_utils_rfc8040.unmount_device("ROADMC01")
+        response = test_utils.unmount_device("ROADMC01")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
         # Delete in the clli-network
-        response = test_utils_rfc8040.del_ietf_network_node_request('clli-network', 'NodeC', 'config')
+        response = test_utils.del_ietf_network_node_request('clli-network', 'NodeC', 'config')
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_32_getNodes_OpenRoadmTopology(self):
         # pylint: disable=redundant-unittest-assert
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['node']), 5)
         listNode = ['XPDRA01-XPDR1', 'ROADMA01-SRG1', 'ROADMA01-SRG3', 'ROADMA01-DEG1', 'ROADMA01-DEG2']
@@ -656,7 +658,7 @@ class TransportPCETopologyTesting(unittest.TestCase):
             self.assertNotEqual(node['node-id'], 'ROADMC01-DEG2')
 
     def test_33_getOpenRoadmNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-network', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['node']), 2)
         for node in response['network'][0]['node']:
@@ -664,29 +666,29 @@ class TransportPCETopologyTesting(unittest.TestCase):
             self.assertNotEqual(node['node-id'], 'ROADMB01')
 
     def test_34_getClliNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('clli-network', 'config')
+        response = test_utils.get_ietf_network_request('clli-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['node']), 1)
         self.assertNotEqual(response['network'][0]['node'][0]['org-openroadm-clli-network:clli'], 'NodeC')
 
     def test_35_disconnect_XPDRA(self):
-        response = test_utils_rfc8040.unmount_device("XPDRA01")
+        response = test_utils.unmount_device("XPDRA01")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_36_getClliNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('clli-network', 'config')
+        response = test_utils.get_ietf_network_request('clli-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['node']), 1)
         self.assertEqual(response['network'][0]['node'][0]['org-openroadm-clli-network:clli'], 'NodeA')
 
     def test_37_getOpenRoadmNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-network', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['node']), 1)
         self.assertNotEqual(response['network'][0]['node'][0]['node-id'], 'XPDRA01')
 
     def test_38_getNodes_OpenRoadmTopology(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['node']), 4)
         listNode = ['ROADMA01-SRG1', 'ROADMA01-SRG3', 'ROADMA01-DEG1', 'ROADMA01-DEG2']
@@ -707,12 +709,12 @@ class TransportPCETopologyTesting(unittest.TestCase):
 
     def test_39_disconnect_ROADM_XPDRA_link(self):
         # Link-1
-        response = test_utils_rfc8040.del_ietf_network_link_request(
+        response = test_utils.del_ietf_network_link_request(
             'openroadm-topology',
             'XPDRA01-XPDR1-XPDR1-NETWORK1toROADMA01-SRG1-SRG1-PP1-TXRX',
             'config')
         # Link-2
-        response2 = test_utils_rfc8040.del_ietf_network_link_request(
+        response2 = test_utils.del_ietf_network_link_request(
             'openroadm-topology',
             'ROADMA01-SRG1-SRG1-PP1-TXRXtoXPDRA01-XPDR1-XPDR1-NETWORK1',
             'config')
@@ -720,7 +722,7 @@ class TransportPCETopologyTesting(unittest.TestCase):
         self.assertIn(response2.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_40_getLinks_OpenRoadmTopology(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 16)
         check_list = {'EXPRESS-LINK': ['ROADMA01-DEG2-DEG2-CTP-TXRXtoROADMA01-DEG1-DEG1-CTP-TXRX',
@@ -752,24 +754,24 @@ class TransportPCETopologyTesting(unittest.TestCase):
             self.assertNotEqual(link['org-openroadm-common-network:link-type'], 'XPONDER-INPUT')
 
     def test_41_disconnect_ROADMA(self):
-        response = test_utils_rfc8040.unmount_device("ROADMA01")
+        response = test_utils.unmount_device("ROADMA01")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
         # Delete in the clli-network
-        response = test_utils_rfc8040.del_ietf_network_node_request('clli-network', 'NodeA', 'config')
+        response = test_utils.del_ietf_network_node_request('clli-network', 'NodeA', 'config')
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_42_getClliNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('clli-network', 'config')
+        response = test_utils.get_ietf_network_request('clli-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertNotIn('node', response['network'][0])
 
     def test_43_getOpenRoadmNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-network', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertNotIn('node', response['network'][0])
 
     def test_44_check_roadm2roadm_link_persistence(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertNotIn('node', response['network'][0])
         self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 6)
index 40f6bb96116b7f9afa07c8b2aa2e55c886e6010c..086fd4eae7ee331912a4aaeb6af03f5afcd0e1dc 100644 (file)
@@ -20,7 +20,7 @@ import sys
 sys.path.append('transportpce_tests/common/')
 # pylint: disable=wrong-import-position
 # pylint: disable=import-error
-import test_utils_rfc8040  # nopep8
+import test_utils  # nopep8
 
 
 class TransportPCERendererTesting(unittest.TestCase):
@@ -30,31 +30,31 @@ class TransportPCERendererTesting(unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
-        cls.processes = test_utils_rfc8040.start_tpce()
-        cls.processes = test_utils_rfc8040.start_sims([('xpdra', cls.NODE_VERSION), ('roadma', cls.NODE_VERSION)])
+        cls.processes = test_utils.start_tpce()
+        cls.processes = test_utils.start_sims([('xpdra', cls.NODE_VERSION), ('roadma', cls.NODE_VERSION)])
 
     @classmethod
     def tearDownClass(cls):
         # pylint: disable=not-an-iterable
         for process in cls.processes:
-            test_utils_rfc8040.shutdown_process(process)
+            test_utils.shutdown_process(process)
         print("all processes killed")
 
     def setUp(self):
         # pylint: disable=consider-using-f-string
         print("execution of {}".format(self.id().split(".")[-1]))
-        time.sleep(10)
+        time.sleep(2)
 
     def test_01_rdm_device_connected(self):
-        response = test_utils_rfc8040.mount_device("ROADMA01", ('roadma', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("ROADMA01", ('roadma', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_02_xpdr_device_connected(self):
-        response = test_utils_rfc8040.mount_device("XPDRA01", ('xpdra', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("XPDRA01", ('xpdra', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_03_rdm_portmapping(self):
-        response = test_utils_rfc8040.get_portmapping("ROADMA01")
+        response = test_utils.get_portmapping_node_attr("ROADMA01", None, None)
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {'supporting-port': 'L1', 'supporting-circuit-pack-name': '2/0',
@@ -68,13 +68,13 @@ class TransportPCERendererTesting(unittest.TestCase):
             response['nodes'][0]['mapping'])
 
     def test_04_xpdr_portmapping(self):
-        response = test_utils_rfc8040.get_portmapping("XPDRA01")
+        response = test_utils.get_portmapping_node_attr("XPDRA01", None, None)
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {'supporting-port': '1', 'supporting-circuit-pack-name': '1/0/1-PLUG-NET',
              'logical-connection-point': 'XPDR1-NETWORK1', 'port-direction': 'bidirectional',
              'connection-map-lcp': 'XPDR1-CLIENT1', 'port-qual': 'xpdr-network',
-             'lcp-hash-val': 'OSvMgUyP+mE=', 'xponder-type': 'tpdr',
+             'lcp-hash-val': 'OSvMgUyP+mE=', 'xpdr-type': 'tpdr',
              'port-admin-state': 'InService', 'port-oper-state': 'InService'},
             response['nodes'][0]['mapping'])
         self.assertIn(
@@ -82,12 +82,12 @@ class TransportPCERendererTesting(unittest.TestCase):
              'supporting-circuit-pack-name': '1/0/C1-PLUG-CLIENT',
              'logical-connection-point': 'XPDR1-CLIENT1', 'port-direction': 'bidirectional',
              'connection-map-lcp': 'XPDR1-NETWORK1', 'port-qual': 'xpdr-client',
-             'lcp-hash-val': 'AO9UFkY/TLYw', 'xponder-type': 'tpdr',
+             'lcp-hash-val': 'AO9UFkY/TLYw', 'xpdr-type': 'tpdr',
              'port-admin-state': 'InService', 'port-oper-state': 'InService'},
             response['nodes'][0]['mapping'])
 
     def test_05_service_path_create(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'service_test',
@@ -107,7 +107,7 @@ class TransportPCERendererTesting(unittest.TestCase):
         self.assertIn('Interfaces created successfully for nodes: ROADMA01', response['output']['result'])
 
     def test_06_service_path_create_rdm_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("ROADMA01", "interface", "DEG1-TTP-TXRX-713:720")
+        response = test_utils.check_node_attribute_request("ROADMA01", "interface", "DEG1-TTP-TXRX-713:720")
         self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
@@ -123,7 +123,7 @@ class TransportPCERendererTesting(unittest.TestCase):
             response['interface'][0]['org-openroadm-optical-channel-interfaces:och'])
 
     def test_07_service_path_create_rdm_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("ROADMA01", "interface", "SRG1-PP7-TXRX-713:720")
+        response = test_utils.check_node_attribute_request("ROADMA01", "interface", "SRG1-PP7-TXRX-713:720")
         self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
@@ -139,7 +139,7 @@ class TransportPCERendererTesting(unittest.TestCase):
             response['interface'][0]['org-openroadm-optical-channel-interfaces:och'])
 
     def test_08_service_path_create_rdm_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             "ROADMA01", "roadm-connections", "SRG1-PP7-TXRX-DEG1-TTP-TXRX-713:720")
         self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
@@ -153,7 +153,7 @@ class TransportPCERendererTesting(unittest.TestCase):
         self.assertDictEqual({'dst-if': 'DEG1-TTP-TXRX-713:720'}, response['roadm-connections'][0]['destination'])
 
     def test_09_service_path_create_xpdr_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDRA01", "interface", "XPDR1-NETWORK1-713:720")
+        response = test_utils.check_node_attribute_request("XPDRA01", "interface", "XPDR1-NETWORK1-713:720")
         self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
@@ -164,19 +164,14 @@ class TransportPCERendererTesting(unittest.TestCase):
                 'type': 'org-openroadm-interfaces:opticalChannel',
                 'supporting-port': '1'
             }, **response['interface'][0]), response['interface'][0])
-        self.assertIn(
-            response['interface'][0]['org-openroadm-optical-channel-interfaces:och'],
-            [{'rate': 'org-openroadm-optical-channel-interfaces:R100G',
-              'transmit-power': '-5',
-              'wavelength-number': 7,
-              'modulation-format': 'dp-qpsk'},
-             {'rate': 'org-openroadm-optical-channel-interfaces:R100G',
-              'transmit-power': -5,
-              'wavelength-number': 7,
-              'modulation-format': 'dp-qpsk'}])
+        intf = response['interface'][0]['org-openroadm-optical-channel-interfaces:och']
+        self.assertEqual(intf['rate'], 'org-openroadm-optical-channel-interfaces:R100G')
+        self.assertEqual(intf['modulation-format'], 'dp-qpsk')
+        self.assertEqual(intf['wavelength-number'], 7)
+        self.assertEqual(float(intf['transmit-power']), -5)
 
     def test_10_service_path_create_xpdr_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDRA01", "interface", "XPDR1-NETWORK1-OTU")
+        response = test_utils.check_node_attribute_request("XPDRA01", "interface", "XPDR1-NETWORK1-OTU")
         self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
@@ -193,7 +188,7 @@ class TransportPCERendererTesting(unittest.TestCase):
             response['interface'][0]['org-openroadm-otn-otu-interfaces:otu'])
 
     def test_11_service_path_create_xpdr_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDRA01", "interface", "XPDR1-NETWORK1-ODU")
+        response = test_utils.check_node_attribute_request("XPDRA01", "interface", "XPDR1-NETWORK1-ODU")
         self.assertEqual(response['status_code'], requests.codes.ok)
         # the 2 following statements replace self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
@@ -216,7 +211,7 @@ class TransportPCERendererTesting(unittest.TestCase):
                              response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
 
     def test_12_service_path_create_xpdr_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDRA01", "interface", "XPDR1-CLIENT1-ETHERNET")
+        response = test_utils.check_node_attribute_request("XPDRA01", "interface", "XPDR1-CLIENT1-ETHERNET")
         self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
@@ -236,13 +231,13 @@ class TransportPCERendererTesting(unittest.TestCase):
             response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet'])
 
     def test_13_service_path_create_xpdr_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDRA01", "circuit-packs", "1%2F0%2F1-PLUG-NET")
+        response = test_utils.check_node_attribute_request("XPDRA01", "circuit-packs", "1%2F0%2F1-PLUG-NET")
         # FIXME: https://jira.opendaylight.org/browse/TRNSPRTPCE-591
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('not-reserved-inuse', response['circuit-packs'][0]["equipment-state"])
 
     def test_14_service_path_delete(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'service_test',
@@ -262,45 +257,45 @@ class TransportPCERendererTesting(unittest.TestCase):
         self.assertDictEqual(response['output'], {'result': 'Request processed', 'success': True})
 
     def test_15_service_path_delete_rdm_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("ROADMA01", "interface", "DEG1-TTP-TXRX-713:720")
+        response = test_utils.check_node_attribute_request("ROADMA01", "interface", "DEG1-TTP-TXRX-713:720")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_16_service_path_delete_rdm_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("ROADMA01", "interface", "SRG1-PP7-TXRX-713:720")
+        response = test_utils.check_node_attribute_request("ROADMA01", "interface", "SRG1-PP7-TXRX-713:720")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_17_service_path_delete_rdm_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             "ROADMA01", "roadm-connections", "SRG1-PP7-TXRX-DEG1-TTP-TXRX-713:720")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_18_service_path_delete_xpdr_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDRA01", "interface", "XPDR1-NETWORK1-713:720")
+        response = test_utils.check_node_attribute_request("XPDRA01", "interface", "XPDR1-NETWORK1-713:720")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_19_service_path_delete_xpdr_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDRA01", "interface", "XPDR1-NETWORK1-OTU")
+        response = test_utils.check_node_attribute_request("XPDRA01", "interface", "XPDR1-NETWORK1-OTU")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_20_service_path_delete_xpdr_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDRA01", "interface", "XPDR1-NETWORK1-ODU")
+        response = test_utils.check_node_attribute_request("XPDRA01", "interface", "XPDR1-NETWORK1-ODU")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_21_service_path_delete_xpdr_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDRA01", "interface", "XPDR1-CLIENT1-ETHERNET")
+        response = test_utils.check_node_attribute_request("XPDRA01", "interface", "XPDR1-CLIENT1-ETHERNET")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_22_service_path_delete_xpdr_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDRA01", "circuit-packs", "1%2F0%2F1-PLUG-NET")
+        response = test_utils.check_node_attribute_request("XPDRA01", "circuit-packs", "1%2F0%2F1-PLUG-NET")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual('not-reserved-available', response["circuit-packs"][0]['equipment-state'])
 
     def test_23_rdm_device_disconnected(self):
-        response = test_utils_rfc8040.unmount_device("ROADMA01")
+        response = test_utils.unmount_device("ROADMA01")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_24_xpdr_device_disconnected(self):
-        response = test_utils_rfc8040.unmount_device("XPDRA01")
+        response = test_utils.unmount_device("XPDRA01")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
 
index 115b1f7f9e2eddb676a6c304fa6560ed235d77a7..b277c23c9750b1be77baa331b99be830b9acfa3d 100644 (file)
@@ -20,7 +20,7 @@ import sys
 sys.path.append('transportpce_tests/common/')
 # pylint: disable=wrong-import-position
 # pylint: disable=import-error
-import test_utils_rfc8040  # nopep8
+import test_utils  # nopep8
 
 
 class TransportOlmTesting(unittest.TestCase):
@@ -30,17 +30,17 @@ class TransportOlmTesting(unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
-        cls.processes = test_utils_rfc8040.start_tpce()
-        cls.processes = test_utils_rfc8040.start_sims([('xpdra', cls.NODE_VERSION),
-                                                       ('roadma-full', cls.NODE_VERSION),
-                                                       ('roadmc-full', cls.NODE_VERSION),
-                                                       ('xpdrc', cls.NODE_VERSION)])
+        cls.processes = test_utils.start_tpce()
+        cls.processes = test_utils.start_sims([('xpdra', cls.NODE_VERSION),
+                                               ('roadma-full', cls.NODE_VERSION),
+                                               ('roadmc-full', cls.NODE_VERSION),
+                                               ('xpdrc', cls.NODE_VERSION)])
 
     @classmethod
     def tearDownClass(cls):
         # pylint: disable=not-an-iterable
         for process in cls.processes:
-            test_utils_rfc8040.shutdown_process(process)
+            test_utils.shutdown_process(process)
         print("all processes killed")
 
     def setUp(self):
@@ -49,51 +49,51 @@ class TransportOlmTesting(unittest.TestCase):
         time.sleep(1)
 
     def test_01_xpdrA_device_connected(self):
-        response = test_utils_rfc8040.mount_device("XPDRA01", ('xpdra', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("XPDRA01", ('xpdra', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_02_xpdrC_device_connected(self):
-        response = test_utils_rfc8040.mount_device("XPDRC01", ('xpdrc', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("XPDRC01", ('xpdrc', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_03_rdmA_device_connected(self):
-        response = test_utils_rfc8040.mount_device("ROADMA01", ('roadma-full', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("ROADMA01", ('roadma-full', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_04_rdmC_device_connected(self):
-        response = test_utils_rfc8040.mount_device("ROADMC01", ('roadmc-full', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("ROADMC01", ('roadmc-full', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
-    def test_05_connect_xprdA_to_roadmA(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+    def test_05_connect_xpdrA_to_roadmA(self):
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-networkutils', 'init-xpdr-rdm-links',
             {'links-input': {'xpdr-node': 'XPDRA01', 'xpdr-num': '1', 'network-num': '1',
                              'rdm-node': 'ROADMA01', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
         self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_06_connect_roadmA_to_xpdrA(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-networkutils', 'init-rdm-xpdr-links',
             {'links-input': {'xpdr-node': 'XPDRA01', 'xpdr-num': '1', 'network-num': '1',
                              'rdm-node': 'ROADMA01', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
         self.assertEqual(response['status_code'], requests.codes.ok)
 
-    def test_07_connect_xprdC_to_roadmC(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+    def test_07_connect_xpdrC_to_roadmC(self):
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-networkutils', 'init-xpdr-rdm-links',
             {'links-input': {'xpdr-node': 'XPDRC01', 'xpdr-num': '1', 'network-num': '1',
                              'rdm-node': 'ROADMC01', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
         self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_08_connect_roadmC_to_xpdrC(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-networkutils', 'init-rdm-xpdr-links',
             {'links-input': {'xpdr-node': 'XPDRC01', 'xpdr-num': '1', 'network-num': '1',
                              'rdm-node': 'ROADMC01', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
         self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_09_create_OTS_ROADMA(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'create-ots-oms',
             {
                 'node-id': 'ROADMA01',
@@ -102,7 +102,7 @@ class TransportOlmTesting(unittest.TestCase):
         self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_10_create_OTS_ROADMC(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'create-ots-oms',
             {
                 'node-id': 'ROADMC01',
@@ -111,7 +111,7 @@ class TransportOlmTesting(unittest.TestCase):
         self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_11_get_PM_ROADMA(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-olm', 'get-pm',
             {
                 'node-id': 'ROADMA01',
@@ -122,21 +122,19 @@ class TransportOlmTesting(unittest.TestCase):
                 }
             })
         self.assertEqual(response['status_code'], requests.codes.ok)
-        self.assertIn({
-            'pmparameter-name': 'OpticalPowerOutput',
-            'pmparameter-value': '2.5'
-        }, response['output']['measurements'])
-        self.assertIn({
-            'pmparameter-name': 'OpticalReturnLoss',
-            'pmparameter-value': '49.9'
-        }, response['output']['measurements'])
-        self.assertIn({
-            'pmparameter-name': 'OpticalPowerInput',
-            'pmparameter-value': '3'
-        }, response['output']['measurements'])
+        measures = {}
+        for measure in response['output']['measurements']:
+            if bool(measure['pmparameter-name']) and bool(measure['pmparameter-value']):
+                measures[measure['pmparameter-name']] = float(measure['pmparameter-value'])
+        self.assertIn('OpticalPowerOutput', list(measures.keys()))
+        self.assertIn('OpticalReturnLoss', list(measures.keys()))
+        self.assertIn('OpticalPowerInput', list(measures.keys()))
+        self.assertEqual(measures['OpticalPowerOutput'], 2.5)
+        self.assertEqual(measures['OpticalReturnLoss'], 49.9)
+        self.assertEqual(measures['OpticalPowerInput'], 3.0)
 
     def test_12_get_PM_ROADMC(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-olm', 'get-pm',
             {
                 'node-id': 'ROADMC01',
@@ -147,21 +145,19 @@ class TransportOlmTesting(unittest.TestCase):
                 }
             })
         self.assertEqual(response['status_code'], requests.codes.ok)
-        self.assertIn({
-            'pmparameter-name': 'OpticalPowerOutput',
-            'pmparameter-value': '18.1'
-        }, response['output']['measurements'])
-        self.assertIn({
-            'pmparameter-name': 'OpticalReturnLoss',
-            'pmparameter-value': '48.8'
-        }, response['output']['measurements'])
-        self.assertIn({
-            'pmparameter-name': 'OpticalPowerInput',
-            'pmparameter-value': '-3.2'
-        }, response['output']['measurements'])
+        measures = {}
+        for measure in response['output']['measurements']:
+            if bool(measure['pmparameter-name']) and bool(measure['pmparameter-value']):
+                measures[measure['pmparameter-name']] = float(measure['pmparameter-value'])
+        self.assertIn('OpticalPowerOutput', list(measures.keys()))
+        self.assertIn('OpticalReturnLoss', list(measures.keys()))
+        self.assertIn('OpticalPowerInput', list(measures.keys()))
+        self.assertEqual(measures['OpticalPowerOutput'], 18.1)
+        self.assertEqual(measures['OpticalReturnLoss'], 48.8)
+        self.assertEqual(measures['OpticalPowerInput'], -3.2)
 
     def test_13_calculate_span_loss_base_ROADMA_ROADMC(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-olm', 'calculate-spanloss-base',
             {
                 'src-type': 'link',
@@ -177,7 +173,7 @@ class TransportOlmTesting(unittest.TestCase):
         time.sleep(5)
 
     def test_14_calculate_span_loss_base_all(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-olm', 'calculate-spanloss-base',
             {
                 'src-type': 'all'
@@ -196,25 +192,25 @@ class TransportOlmTesting(unittest.TestCase):
         time.sleep(5)
 
     def test_15_get_OTS_DEG1_TTP_TXRX_ROADMA(self):
-        response = test_utils_rfc8040.check_node_attribute2_request(
+        response = test_utils.check_node_attribute2_request(
             'ROADMA01', 'interface', 'OTS-DEG1-TTP-TXRX', 'org-openroadm-optical-transport-interfaces:ots')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(float(response['org-openroadm-optical-transport-interfaces:ots']['span-loss-transmit']), 5.7)
         self.assertEqual(float(response['org-openroadm-optical-transport-interfaces:ots']['span-loss-receive']), 15.1)
-        # FIXME test_utils_rfc8040.check_node_attribute2_request retrives values in config DS
+        # FIXME test_utils.check_node_attribute2_request retrives values in config DS
         #      but values are different (6 and 15) in nonconfig/operational DS and should not
         #      Honeynode simulator bug ?
         # Reopen similar issues found in RSPN tests at TRNSPRTPCE-591
 
     def test_16_get_OTS_DEG2_TTP_TXRX_ROADMC(self):
-        response = test_utils_rfc8040.check_node_attribute2_request(
+        response = test_utils.check_node_attribute2_request(
             'ROADMC01', 'interface', 'OTS-DEG2-TTP-TXRX', 'org-openroadm-optical-transport-interfaces:ots')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(float(response['org-openroadm-optical-transport-interfaces:ots']['span-loss-transmit']), 15.1)
         self.assertEqual(float(response['org-openroadm-optical-transport-interfaces:ots']['span-loss-receive']), 5.7)
 
     def test_17_servicePath_create_AToZ(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'test',
@@ -242,7 +238,7 @@ class TransportOlmTesting(unittest.TestCase):
         time.sleep(10)
 
     def test_18_servicePath_create_ZToA(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'test',
@@ -270,7 +266,7 @@ class TransportOlmTesting(unittest.TestCase):
         time.sleep(10)
 
     def test_19_service_power_setup_XPDRA_XPDRC(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-olm', 'service-power-setup',
             {
                 'service-name': 'test',
@@ -308,27 +304,27 @@ class TransportOlmTesting(unittest.TestCase):
         self.assertIn('Success', response['output']['result'])
 
     def test_20_get_interface_XPDRA_XPDR1_NETWORK1(self):
-        response = test_utils_rfc8040.check_node_attribute2_request(
+        response = test_utils.check_node_attribute2_request(
             'XPDRA01', 'interface', 'XPDR1-NETWORK1-761:768', 'org-openroadm-optical-channel-interfaces:och')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(float(response['org-openroadm-optical-channel-interfaces:och']['transmit-power']), 0)
         self.assertEqual(int(response['org-openroadm-optical-channel-interfaces:och']['wavelength-number']), 1)
 
     def test_21_get_roadmconnection_ROADMA(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             'ROADMA01', 'roadm-connections', 'SRG1-PP1-TXRX-DEG1-TTP-TXRX-761:768')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual("gainLoss", response['roadm-connections'][0]['opticalControlMode'])
         self.assertEqual(float(response['roadm-connections'][0]['target-output-power']), -3.3)
 
     def test_22_get_roadmconnection_ROADMC(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             'ROADMC01', 'roadm-connections', 'DEG2-TTP-TXRX-SRG1-PP1-TXRX-761:768')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual("power", response['roadm-connections'][0]['opticalControlMode'])
 
     def test_23_service_power_setup_XPDRC_XPDRA(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-olm', 'service-power-setup',
             {
                 'service-name': 'test',
@@ -366,21 +362,21 @@ class TransportOlmTesting(unittest.TestCase):
         self.assertIn('Success', response['output']['result'])
 
     def test_24_get_interface_XPDRC_XPDR1_NETWORK1(self):
-        response = test_utils_rfc8040.check_node_attribute2_request(
+        response = test_utils.check_node_attribute2_request(
             'XPDRC01', 'interface', 'XPDR1-NETWORK1-761:768', 'org-openroadm-optical-channel-interfaces:och')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(float(response['org-openroadm-optical-channel-interfaces:och']['transmit-power']), 0)
         self.assertEqual(int(response['org-openroadm-optical-channel-interfaces:och']['wavelength-number']), 1)
 
     def test_25_get_roadmconnection_ROADMC(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             'ROADMC01', 'roadm-connections', 'SRG1-PP1-TXRX-DEG2-TTP-TXRX-761:768')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual("gainLoss", response['roadm-connections'][0]['opticalControlMode'])
         self.assertEqual(float(response['roadm-connections'][0]['target-output-power']), -0.63)
 
     def test_26_service_power_turndown_XPDRA_XPDRC(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-olm', 'service-power-turndown',
             {
                 'service-name': 'test',
@@ -418,20 +414,20 @@ class TransportOlmTesting(unittest.TestCase):
         self.assertIn('Success', response['output']['result'])
 
     def test_27_get_roadmconnection_ROADMA(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             'ROADMA01', 'roadm-connections', 'SRG1-PP1-TXRX-DEG1-TTP-TXRX-761:768')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual("off", response['roadm-connections'][0]['opticalControlMode'])
         self.assertEqual(float(response['roadm-connections'][0]['target-output-power']), -60)
 
     def test_28_get_roadmconnection_ROADMC(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             'ROADMC01', 'roadm-connections', 'DEG2-TTP-TXRX-SRG1-PP1-TXRX-761:768')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual("off", response['roadm-connections'][0]['opticalControlMode'])
 
     def test_29_servicePath_delete_AToZ(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'test',
@@ -459,7 +455,7 @@ class TransportOlmTesting(unittest.TestCase):
         time.sleep(10)
 
     def test_30_servicePath_delete_ZToA(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'test',
@@ -486,24 +482,24 @@ class TransportOlmTesting(unittest.TestCase):
         self.assertIn('Request processed', response['output']['result'])
         time.sleep(10)
 
-    #"""to test case where SRG where the xpdr is connected to has no optical range data"""
+    # """to test case where SRG where the xpdr is connected to has no optical range data"""
 
-    def test_31_connect_xprdA_to_roadmA(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+    def test_31_connect_xpdrA_to_roadmA(self):
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-networkutils', 'init-xpdr-rdm-links',
             {'links-input': {'xpdr-node': 'XPDRA01', 'xpdr-num': '1', 'network-num': '2',
                              'rdm-node': 'ROADMA01', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
         self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_32_connect_roadmA_to_xpdrA(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-networkutils', 'init-rdm-xpdr-links',
             {'links-input': {'xpdr-node': 'XPDRA01', 'xpdr-num': '1', 'network-num': '2',
                              'rdm-node': 'ROADMA01', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
         self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_33_servicePath_create_AToZ(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'test2',
@@ -527,14 +523,14 @@ class TransportOlmTesting(unittest.TestCase):
         time.sleep(10)
 
     def test_34_get_interface_XPDRA_XPDR1_NETWORK2(self):
-        response = test_utils_rfc8040.check_node_attribute2_request(
+        response = test_utils.check_node_attribute2_request(
             'XPDRA01', 'interface', 'XPDR1-NETWORK2-753:760', 'org-openroadm-optical-channel-interfaces:och')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(float(response['org-openroadm-optical-channel-interfaces:och']['transmit-power']), -5)
         self.assertEqual(int(response['org-openroadm-optical-channel-interfaces:och']['wavelength-number']), 2)
 
     def test_35_servicePath_delete_AToZ(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'test2',
@@ -558,15 +554,15 @@ class TransportOlmTesting(unittest.TestCase):
         time.sleep(10)
 
     def test_36_xpdrA_device_disconnected(self):
-        response = test_utils_rfc8040.unmount_device("XPDRA01")
+        response = test_utils.unmount_device("XPDRA01")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_37_xpdrC_device_disconnected(self):
-        response = test_utils_rfc8040.unmount_device("XPDRC01")
+        response = test_utils.unmount_device("XPDRC01")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_38_calculate_span_loss_current(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-olm', 'calculate-spanloss-current',
             None)
         self.assertEqual(response['status_code'], requests.codes.ok)
@@ -575,11 +571,11 @@ class TransportOlmTesting(unittest.TestCase):
         time.sleep(5)
 
     def test_39_rdmA_device_disconnected(self):
-        response = test_utils_rfc8040.unmount_device("ROADMA01")
+        response = test_utils.unmount_device("ROADMA01")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_40_rdmC_device_disconnected(self):
-        response = test_utils_rfc8040.unmount_device("ROADMC01")
+        response = test_utils.unmount_device("ROADMC01")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
 
index 4397151129ef5f6dcd318c12f41aeab832f4dfdd..2b428ea0a5fb9087e848f30837ad2aeca6b84141 100644 (file)
@@ -24,7 +24,7 @@ import test_utils  # nopep8
 
 
 class TransportPCEFulltesting(unittest.TestCase):
-    cr_serv_sample_data = {"input": {
+    cr_serv_input_data = {
         "sdnc-request-header": {
             "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
             "rpc-action": "service-create",
@@ -56,6 +56,15 @@ class TransportPCEFulltesting(unittest.TestCase):
         "due-date": "2016-11-28T00:00:01Z",
         "operator-contact": "pw1234"
     }
+    del_serv_input_data = {
+        "sdnc-request-header": {
+            "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
+            "rpc-action": "service-delete",
+            "request-system-id": "appname",
+            "notification-url": "http://localhost:8585/NotificationServer/notify"},
+        "service-delete-req-info": {
+            "service-name": "TBD",
+            "tail-retention": "no"}
     }
     processes = None
     WAITING = 20
@@ -80,7 +89,7 @@ class TransportPCEFulltesting(unittest.TestCase):
         # pylint: disable=consider-using-f-string
         print("execution of {}".format(self.id().split(".")[-1]))
 
-     connect netconf devices
+     # connect netconf devices
     def test_01_connect_xpdrA(self):
         response = test_utils.mount_device("XPDRA01", ('xpdra', self.NODE_VERSION))
         self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
@@ -97,40 +106,40 @@ class TransportPCEFulltesting(unittest.TestCase):
         response = test_utils.mount_device("ROADMC01", ('roadmc-full', self.NODE_VERSION))
         self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
-    def test_05_connect_xprdA_N1_to_roadmA_PP1(self):
-        response = test_utils.connect_xpdr_to_rdm_request("XPDRA01", "1", "1",
-                                                          "ROADMA01", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully',
-                      res["output"]["result"])
+    def test_05_connect_xpdrA_N1_to_roadmA_PP1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDRA01', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADMA01', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_06_connect_roadmA_PP1_to_xpdrA_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("XPDRA01", "1", "1",
-                                                          "ROADMA01", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDRA01', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADMA01', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
         time.sleep(2)
 
-    def test_07_connect_xprdC_N1_to_roadmC_PP1(self):
-        response = test_utils.connect_xpdr_to_rdm_request("XPDRC01", "1", "1",
-                                                          "ROADMC01", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully',
-                      res["output"]["result"])
+    def test_07_connect_xpdrC_N1_to_roadmC_PP1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDRC01', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADMC01', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_08_connect_roadmC_PP1_to_xpdrC_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("XPDRC01", "1", "1",
-                                                          "ROADMC01", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDRC01', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADMC01', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_09_add_omsAttributes_ROADMA_ROADMC(self):
@@ -145,7 +154,8 @@ class TransportPCEFulltesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request("ROADMA01-DEG1-DEG1-TTP-TXRXtoROADMC01-DEG2-DEG2-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request("ROADMA01-DEG1-DEG1-TTP-TXRXtoROADMC01-DEG2-DEG2-TTP-TXRX",
+                                                   data)
         self.assertEqual(response.status_code, requests.codes.created)
 
     def test_10_add_omsAttributes_ROADMC_ROADMA(self):
@@ -160,106 +170,87 @@ class TransportPCEFulltesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request("ROADMC01-DEG2-DEG2-TTP-TXRXtoROADMA01-DEG1-DEG1-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request("ROADMC01-DEG2-DEG2-TTP-TXRXtoROADMA01-DEG1-DEG1-TTP-TXRX",
+                                                   data)
         self.assertEqual(response.status_code, requests.codes.created)
 
     # test service-create for Eth service from xpdr to xpdr
+
     def test_11_create_eth_service1(self):
-        self.cr_serv_sample_data["input"]["service-name"] = "service1"
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.cr_serv_input_data["service-name"] = "service1"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common'][
-                          'response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_12_get_eth_service1(self):
-        response = test_utils.get_service_list_request("services/service1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'],
-            'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service1')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'service')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service1')
+        self.assertEqual(response['services'][0]['connection-type'], 'service')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        time.sleep(1)
 
     def test_13_check_xc1_ROADMA(self):
-        response = test_utils.check_netconf_node_request(
-            "ROADMA01", "roadm-connections/SRG1-PP1-TXRX-DEG1-TTP-TXRX-761:768")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            "ROADMA01", "roadm-connections", "SRG1-PP1-TXRX-DEG1-TTP-TXRX-761:768")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
             dict({
                 'connection-number': 'SRG1-PP1-TXRX-DEG1-TTP-TXRX-761:768',
                 'wavelength-number': 1,
-                'opticalControlMode': 'gainLoss',
-                'target-output-power': -3.0
-            }, **res['roadm-connections'][0]),
-            res['roadm-connections'][0]
-        )
-        self.assertDictEqual(
-            {'src-if': 'SRG1-PP1-TXRX-761:768'},
-            res['roadm-connections'][0]['source'])
-        self.assertDictEqual(
-            {'dst-if': 'DEG1-TTP-TXRX-761:768'},
-            res['roadm-connections'][0]['destination'])
-        time.sleep(5)
+                'opticalControlMode': 'gainLoss'
+            }, **response['roadm-connections'][0]), response['roadm-connections'][0])
+        self.assertDictEqual({'src-if': 'SRG1-PP1-TXRX-761:768'}, response['roadm-connections'][0]['source'])
+        self.assertDictEqual({'dst-if': 'DEG1-TTP-TXRX-761:768'}, response['roadm-connections'][0]['destination'])
+        time.sleep(1)
 
     def test_14_check_xc1_ROADMC(self):
-        response = test_utils.check_netconf_node_request(
-            "ROADMC01", "roadm-connections/SRG1-PP1-TXRX-DEG2-TTP-TXRX-761:768")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            "ROADMC01", "roadm-connections", "SRG1-PP1-TXRX-DEG2-TTP-TXRX-761:768")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
             dict({
                 'connection-number': 'SRG1-PP1-TXRX-DEG2-TTP-TXRX-761:768',
                 'wavelength-number': 1,
-                'opticalControlMode': 'gainLoss',
-                'target-output-power': 2.0
-            }, **res['roadm-connections'][0]),
-            res['roadm-connections'][0]
-        )
-        self.assertDictEqual(
-            {'src-if': 'SRG1-PP1-TXRX-761:768'},
-            res['roadm-connections'][0]['source'])
-        self.assertDictEqual(
-            {'dst-if': 'DEG2-TTP-TXRX-761:768'},
-            res['roadm-connections'][0]['destination'])
-        time.sleep(5)
+                'opticalControlMode': 'gainLoss'
+            }, **response['roadm-connections'][0]), response['roadm-connections'][0])
+        self.assertDictEqual({'src-if': 'SRG1-PP1-TXRX-761:768'}, response['roadm-connections'][0]['source'])
+        self.assertDictEqual({'dst-if': 'DEG2-TTP-TXRX-761:768'}, response['roadm-connections'][0]['destination'])
+        time.sleep(1)
 
     def test_15_check_topo_XPDRA(self):
-        response = test_utils.get_ordm_topo_request("node/XPDRA01-XPDR1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'XPDRA01-XPDR1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'XPDR1-NETWORK1':
-                self.assertEqual({'frequency': 196.1,
-                                  'width': 40},
-                                 ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength'])
+                self.assertEqual(
+                    196.1,
+                    float(ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']['frequency']))
+                self.assertEqual(
+                    40.0,
+                    float(ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']['width']))
             elif ele['tp-id'] in ('XPDR1-CLIENT2', 'XPDR1-CLIENT1'):
                 self.assertNotIn('org-openroadm-network-topology:xpdr-client-attributes', dict.keys(ele))
             elif ele['tp-id'] == 'XPDR1-NETWORK2':
                 self.assertNotIn('org-openroadm-network-topology:xpdr-network-attributes', dict.keys(ele))
-        time.sleep(3)
+        time.sleep(1)
 
     def test_16_check_topo_ROADMA_SRG1(self):
-        response = test_utils.get_ordm_topo_request("node/ROADMA01-SRG1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADMA01-SRG1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'SRG1-PP1-TXRX':
                 freq_map = base64.b64decode(
@@ -268,17 +259,16 @@ class TransportPCEFulltesting(unittest.TestCase):
                 self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available")
             elif ele['tp-id'] == 'SRG1-PP2-TXRX':
                 self.assertNotIn('avail-freq-maps', dict.keys(ele))
-        time.sleep(3)
+        time.sleep(1)
 
     def test_17_check_topo_ROADMA_DEG1(self):
-        response = test_utils.get_ordm_topo_request("node/ROADMA01-DEG1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADMA01-DEG1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'DEG2-CTP-TXRX':
                 freq_map = base64.b64decode(
@@ -290,118 +280,110 @@ class TransportPCEFulltesting(unittest.TestCase):
                     ele['org-openroadm-network-topology:tx-ttp-attributes']['avail-freq-maps'][0]['freq-map'])
                 freq_map_array = [int(x) for x in freq_map]
                 self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available")
-        time.sleep(3)
+        time.sleep(1)
 
-    def test_18_connect_xprdA_N2_to_roadmA_PP2(self):
-        response = test_utils.connect_xpdr_to_rdm_request("XPDRA01", "1", "2",
-                                                          "ROADMA01", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully',
-                      res["output"]["result"])
+    def test_18_connect_xpdrA_N2_to_roadmA_PP2(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDRA01', 'xpdr-num': '1', 'network-num': '2',
+                             'rdm-node': 'ROADMA01', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_19_connect_roadmA_PP2_to_xpdrA_N2(self):
-        response = test_utils.connect_rdm_to_xpdr_request("XPDRA01", "1", "2",
-                                                          "ROADMA01", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDRA01', 'xpdr-num': '1', 'network-num': '2',
+                             'rdm-node': 'ROADMA01', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
         time.sleep(2)
 
-    def test_20_connect_xprdC_N2_to_roadmC_PP2(self):
-        response = test_utils.connect_xpdr_to_rdm_request("XPDRC01", "1", "2",
-                                                          "ROADMC01", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully',
-                      res["output"]["result"])
+    def test_20_connect_xpdrC_N2_to_roadmC_PP2(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDRC01', 'xpdr-num': '1', 'network-num': '2',
+                             'rdm-node': 'ROADMC01', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_21_connect_roadmC_PP2_to_xpdrC_N2(self):
-        response = test_utils.connect_rdm_to_xpdr_request("XPDRC01", "1", "2",
-                                                          "ROADMC01", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDRC01', 'xpdr-num': '1', 'network-num': '2',
+                             'rdm-node': 'ROADMC01', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_22_create_eth_service2(self):
-        self.cr_serv_sample_data["input"]["service-name"] = "service2"
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.cr_serv_input_data["service-name"] = "service2"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common'][
-                          'response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_23_get_eth_service2(self):
-        response = test_utils.get_service_list_request("services/service2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'],
-            'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service2')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'service')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service2")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service2')
+        self.assertEqual(response['services'][0]['connection-type'], 'service')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
         time.sleep(1)
 
     def test_24_check_xc2_ROADMA(self):
-        response = test_utils.check_netconf_node_request(
-            "ROADMA01", "roadm-connections/DEG1-TTP-TXRX-SRG1-PP2-TXRX-753:760")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            "ROADMA01", "roadm-connections", "DEG1-TTP-TXRX-SRG1-PP2-TXRX-753:760")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
             dict({
                 'connection-number': 'DEG1-TTP-TXRX-SRG1-PP2-TXRX-753:760',
                 'wavelength-number': 2,
                 'opticalControlMode': 'power'
-            }, **res['roadm-connections'][0]),
-            res['roadm-connections'][0]
-        )
-        self.assertDictEqual(
-            {'src-if': 'DEG1-TTP-TXRX-753:760'},
-            res['roadm-connections'][0]['source'])
-        self.assertDictEqual(
-            {'dst-if': 'SRG1-PP2-TXRX-753:760'},
-            res['roadm-connections'][0]['destination'])
+            }, **response['roadm-connections'][0]), response['roadm-connections'][0])
+        self.assertDictEqual({'src-if': 'DEG1-TTP-TXRX-753:760'}, response['roadm-connections'][0]['source'])
+        self.assertDictEqual({'dst-if': 'SRG1-PP2-TXRX-753:760'}, response['roadm-connections'][0]['destination'])
+        time.sleep(1)
 
     def test_25_check_topo_XPDRA(self):
-        response = test_utils.get_ordm_topo_request("node/XPDRA01-XPDR1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'XPDRA01-XPDR1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'XPDR1-NETWORK1':
-                self.assertEqual({'frequency': 196.1,
-                                  'width': 40},
-                                 ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength'])
+                self.assertEqual(
+                    196.1,
+                    float(ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']['frequency']))
+                self.assertEqual(
+                    40.0,
+                    float(ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']['width']))
             elif ele['tp-id'] == 'XPDR1-NETWORK2':
-                self.assertEqual({'frequency': 196.05,
-                                  'width': 40},
-                                 ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength'])
+                self.assertEqual(
+                    196.05,
+                    float(ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']['frequency']))
+                self.assertEqual(
+                    40.0,
+                    float(ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']['width']))
             elif ele['tp-id'] in ('XPDR1-CLIENT1', 'XPDR1-CLIENT2'):
                 self.assertNotIn('org-openroadm-network-topology:xpdr-client-attributes', dict.keys(ele))
-        time.sleep(10)
+        time.sleep(1)
 
     def test_26_check_topo_ROADMA_SRG1(self):
-        response = test_utils.get_ordm_topo_request("node/ROADMA01-SRG1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADMA01-SRG1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available")
         self.assertEqual(freq_map_array[94], 0, "Lambda 2 should not be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'SRG1-PP1-TXRX':
                 freq_map = base64.b64decode(
@@ -417,18 +399,17 @@ class TransportPCEFulltesting(unittest.TestCase):
                 self.assertEqual(freq_map_array[94], 0, "Lambda 2 should not be available")
             elif ele['tp-id'] == 'SRG1-PP3-TXRX':
                 self.assertNotIn('org-openroadm-network-topology:pp-attributes', dict.keys(ele))
-        time.sleep(10)
+        time.sleep(1)
 
     def test_27_check_topo_ROADMA_DEG1(self):
-        response = test_utils.get_ordm_topo_request("node/ROADMA01-DEG1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADMA01-DEG1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available")
         self.assertEqual(freq_map_array[94], 0, "Lambda 2 should not be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'DEG2-CTP-TXRX':
                 freq_map = base64.b64decode(
@@ -442,66 +423,65 @@ class TransportPCEFulltesting(unittest.TestCase):
                 freq_map_array = [int(x) for x in freq_map]
                 self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available")
                 self.assertEqual(freq_map_array[94], 0, "Lambda 2 should not be available")
-        time.sleep(10)
+        time.sleep(1)
 
     #     creation service test on a non-available resource
     def test_28_create_eth_service3(self):
-        self.cr_serv_sample_data["input"]["service-name"] = "service3"
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.cr_serv_input_data["service-name"] = "service3"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common'][
-                          'response-message'])
-        self.assertIn('200', res['output']['configuration-response-common'][
-            'response-code'])
+                      response['output']['configuration-response-common']['response-message'])
+        self.assertIn('200', response['output']['configuration-response-common']['response-code'])
         time.sleep(self.WAITING)
 
     # add a test that check the openroadm-service-list still only
     # contains 2 elements
 
     def test_29_delete_eth_service3(self):
-        response = test_utils.service_delete_request("service3")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service3"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Service \'service3\' does not exist in datastore',
-                      res['output']['configuration-response-common'][
-                          'response-message'])
-        self.assertIn('500', res['output']['configuration-response-common'][
-            'response-code'])
-        time.sleep(20)
+                      response['output']['configuration-response-common']['response-message'])
+        self.assertIn('500', response['output']['configuration-response-common']['response-code'])
+        time.sleep(3)
 
     def test_30_delete_eth_service1(self):
-        response = test_utils.service_delete_request("service1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service1"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common'][
-                          'response-message'])
-        time.sleep(20)
+                      response['output']['configuration-response-common']['response-message'])
+        time.sleep(self.WAITING)
 
     def test_31_delete_eth_service2(self):
-        response = test_utils.service_delete_request("service2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service2"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common'][
-                          'response-message'])
-        time.sleep(20)
+                      response['output']['configuration-response-common']['response-message'])
+        time.sleep(self.WAITING)
 
     def test_32_check_no_xc_ROADMA(self):
-        response = test_utils.check_netconf_node_request("ROADMA01", "")
-        res = response.json()
-        self.assertEqual(response.status_code, requests.codes.ok)
+        response = test_utils.check_node_request("ROADMA01")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertNotIn('roadm-connections',
-                         dict.keys(res['org-openroadm-device']))
+                         dict.keys(response['org-openroadm-device']))
         time.sleep(2)
 
     def test_33_check_topo_XPDRA(self):
-        response = test_utils.get_ordm_topo_request("node/XPDRA01-XPDR1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'XPDRA01-XPDR1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if (ele['org-openroadm-common-network:tp-type'] == 'XPONDER-CLIENT'
                     and ele['tp-id'] in ('XPDR1-CLIENT1', 'XPDR1-CLIENT3')):
@@ -515,18 +495,17 @@ class TransportPCEFulltesting(unittest.TestCase):
                 self.assertNotIn('wavelength', dict.keys(
                     ele['org-openroadm-network-topology:'
                         'xpdr-network-attributes']))
-        time.sleep(10)
+        time.sleep(1)
 
     def test_34_check_topo_ROADMA_SRG1(self):
-        response = test_utils.get_ordm_topo_request("node/ROADMA01-SRG1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADMA01-SRG1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[95], 255, "Lambda 1 should  be available")
         self.assertEqual(freq_map_array[94], 255, "Lambda 2 should  be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'SRG1-PP1-TXRX' or ele['tp-id'] == 'SRG1-PP2-TXRX':
                 freq_map = base64.b64decode(
@@ -542,18 +521,17 @@ class TransportPCEFulltesting(unittest.TestCase):
                 self.assertEqual(freq_map_array[94], 255, "Lambda 2 should  be available")
             else:
                 self.assertNotIn('org-openroadm-network-topology:pp-attributes', dict.keys(ele))
-        time.sleep(10)
+        time.sleep(1)
 
     def test_35_check_topo_ROADMA_DEG1(self):
-        response = test_utils.get_ordm_topo_request("node/ROADMA01-DEG1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADMA01-DEG1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available")
         self.assertEqual(freq_map_array[94], 255, "Lambda 2 should be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'DEG2-CTP-TXRX':
                 freq_map = base64.b64decode(
@@ -567,44 +545,38 @@ class TransportPCEFulltesting(unittest.TestCase):
                 freq_map_array = [int(x) for x in freq_map]
                 self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available")
                 self.assertEqual(freq_map_array[94], 255, "Lambda 2 should be available")
-        time.sleep(10)
+        time.sleep(1)
 
     # test service-create for Optical Channel (OC) service from srg-pp to srg-pp
+
     def test_36_create_oc_service1(self):
-        self.cr_serv_sample_data["input"]["service-name"] = "service1"
-        self.cr_serv_sample_data["input"]["connection-type"] = "roadm-line"
-        self.cr_serv_sample_data["input"]["service-a-end"]["node-id"] = "ROADMA01"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-format"] = "OC"
-        self.cr_serv_sample_data["input"]["service-z-end"]["node-id"] = "ROADMC01"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-format"] = "OC"
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.cr_serv_input_data["service-name"] = "service1"
+        self.cr_serv_input_data["connection-type"] = "roadm-line"
+        self.cr_serv_input_data["service-a-end"]["node-id"] = "ROADMA01"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "OC"
+        self.cr_serv_input_data["service-z-end"]["node-id"] = "ROADMC01"
+        self.cr_serv_input_data["service-z-end"]["service-format"] = "OC"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common'][
-                          'response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_37_get_oc_service1(self):
-        response = test_utils.get_service_list_request("services/service1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'],
-            'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service1')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'roadm-line')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service1')
+        self.assertEqual(response['services'][0]['connection-type'], 'roadm-line')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
         time.sleep(1)
 
     def test_38_check_xc1_ROADMA(self):
-        response = test_utils.check_netconf_node_request(
-            "ROADMA01", "roadm-connections/SRG1-PP1-TXRX-DEG1-TTP-TXRX-761:768")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            "ROADMA01", "roadm-connections", "SRG1-PP1-TXRX-DEG1-TTP-TXRX-761:768")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
             dict({
@@ -612,22 +584,15 @@ class TransportPCEFulltesting(unittest.TestCase):
                 'wavelength-number': 1,
                 'opticalControlMode': 'gainLoss',
                 'target-output-power': -3.0
-            }, **res['roadm-connections'][0]),
-            res['roadm-connections'][0]
-        )
-        self.assertDictEqual(
-            {'src-if': 'SRG1-PP1-TXRX-761:768'},
-            res['roadm-connections'][0]['source'])
-        self.assertDictEqual(
-            {'dst-if': 'DEG1-TTP-TXRX-761:768'},
-            res['roadm-connections'][0]['destination'])
-        time.sleep(7)
+            }, **response['roadm-connections'][0]), response['roadm-connections'][0])
+        self.assertDictEqual({'src-if': 'SRG1-PP1-TXRX-761:768'}, response['roadm-connections'][0]['source'])
+        self.assertDictEqual({'dst-if': 'DEG1-TTP-TXRX-761:768'}, response['roadm-connections'][0]['destination'])
+        time.sleep(1)
 
     def test_39_check_xc1_ROADMC(self):
-        response = test_utils.check_netconf_node_request(
-            "ROADMC01", "roadm-connections/SRG1-PP1-TXRX-DEG2-TTP-TXRX-761:768")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            "ROADMC01", "roadm-connections", "SRG1-PP1-TXRX-DEG2-TTP-TXRX-761:768")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
             dict({
@@ -635,52 +600,39 @@ class TransportPCEFulltesting(unittest.TestCase):
                 'wavelength-number': 1,
                 'opticalControlMode': 'gainLoss',
                 'target-output-power': 2.0
-            }, **res['roadm-connections'][0]),
-            res['roadm-connections'][0]
-        )
-        self.assertDictEqual(
-            {'src-if': 'SRG1-PP1-TXRX-761:768'},
-            res['roadm-connections'][0]['source'])
-        self.assertDictEqual(
-            {'dst-if': 'DEG2-TTP-TXRX-761:768'},
-            res['roadm-connections'][0]['destination'])
-        time.sleep(7)
+            }, **response['roadm-connections'][0]), response['roadm-connections'][0])
+        self.assertDictEqual({'src-if': 'SRG1-PP1-TXRX-761:768'}, response['roadm-connections'][0]['source'])
+        self.assertDictEqual({'dst-if': 'DEG2-TTP-TXRX-761:768'}, response['roadm-connections'][0]['destination'])
+        time.sleep(1)
 
     def test_40_create_oc_service2(self):
-        self.cr_serv_sample_data["input"]["service-name"] = "service2"
-        self.cr_serv_sample_data["input"]["connection-type"] = "roadm-line"
-        self.cr_serv_sample_data["input"]["service-a-end"]["node-id"] = "ROADMA01"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-format"] = "OC"
-        self.cr_serv_sample_data["input"]["service-z-end"]["node-id"] = "ROADMC01"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-format"] = "OC"
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.cr_serv_input_data["service-name"] = "service2"
+        self.cr_serv_input_data["connection-type"] = "roadm-line"
+        self.cr_serv_input_data["service-a-end"]["node-id"] = "ROADMA01"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "OC"
+        self.cr_serv_input_data["service-z-end"]["node-id"] = "ROADMC01"
+        self.cr_serv_input_data["service-z-end"]["service-format"] = "OC"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common'][
-                          'response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_41_get_oc_service2(self):
-        response = test_utils.get_service_list_request("services/service2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'],
-            'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service2')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'roadm-line')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service2")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service2')
+        self.assertEqual(response['services'][0]['connection-type'], 'roadm-line')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
         time.sleep(2)
 
     def test_42_check_xc2_ROADMA(self):
-        response = test_utils.check_netconf_node_request(
-            "ROADMA01", "roadm-connections/SRG1-PP2-TXRX-DEG1-TTP-TXRX-753:760")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            "ROADMA01", "roadm-connections", "SRG1-PP2-TXRX-DEG1-TTP-TXRX-753:760")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
             dict({
@@ -688,61 +640,59 @@ class TransportPCEFulltesting(unittest.TestCase):
                 'wavelength-number': 2,
                 'opticalControlMode': 'gainLoss',
                 'target-output-power': -3.0
-            }, **res['roadm-connections'][0]),
-            res['roadm-connections'][0]
-        )
-        self.assertDictEqual(
-            {'src-if': 'SRG1-PP2-TXRX-753:760'},
-            res['roadm-connections'][0]['source'])
-        self.assertDictEqual(
-            {'dst-if': 'DEG1-TTP-TXRX-753:760'},
-            res['roadm-connections'][0]['destination'])
-        time.sleep(2)
+            }, **response['roadm-connections'][0]), response['roadm-connections'][0])
+        self.assertDictEqual({'src-if': 'SRG1-PP2-TXRX-753:760'}, response['roadm-connections'][0]['source'])
+        self.assertDictEqual({'dst-if': 'DEG1-TTP-TXRX-753:760'}, response['roadm-connections'][0]['destination'])
+        time.sleep(1)
 
     def test_43_check_topo_ROADMA(self):
         self.test_26_check_topo_ROADMA_SRG1()
         self.test_27_check_topo_ROADMA_DEG1()
-        time.sleep(3)
+        time.sleep(1)
 
     def test_44_delete_oc_service1(self):
-        response = test_utils.service_delete_request("service1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service1"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common'][
-                          'response-message'])
-        time.sleep(20)
+                      response['output']['configuration-response-common']['response-message'])
+        time.sleep(self.WAITING)
 
     def test_45_delete_oc_service2(self):
-        response = test_utils.service_delete_request("service2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service2"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common'][
-                          'response-message'])
-        time.sleep(20)
+                      response['output']['configuration-response-common']['response-message'])
+        time.sleep(self.WAITING)
 
     def test_46_get_no_oc_services(self):
-        print("start test")
-        response = test_utils.get_service_list_request("")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-        res = response.json()
-        self.assertIn(
+        response = test_utils.get_ordm_serv_list_request()
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+        self.assertIn(response['service-list'], (
             {
+                "error-type": "protocol",
+                "error-tag": "data-missing",
+                "error-message":
+                    "Request could not be completed because the relevant data "
+                    "model content does not exist"
+            }, {
                 "error-type": "application",
                 "error-tag": "data-missing",
                 "error-message":
                     "Request could not be completed because the relevant data "
                     "model content does not exist"
-            },
-            res['errors']['error'])
+            }))
         time.sleep(1)
 
     def test_47_get_no_xc_ROADMA(self):
-        response = test_utils.check_netconf_node_request("ROADMA01", "")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertNotIn(['roadm-connections'][0], res['org-openroadm-device'])
+        response = test_utils.check_node_request("ROADMA01")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertNotIn('roadm-connections', dict.keys(response['org-openroadm-device']))
         time.sleep(1)
 
     def test_48_check_topo_ROADMA(self):
@@ -751,7 +701,7 @@ class TransportPCEFulltesting(unittest.TestCase):
 
     def test_49_loop_create_eth_service(self):
         # pylint: disable=consider-using-f-string
-        for i in range(1, 6):
+        for i in range(1, 4):
             print("iteration number {}".format(i))
             print("eth service creation")
             self.test_11_create_eth_service1()
@@ -763,13 +713,16 @@ class TransportPCEFulltesting(unittest.TestCase):
             self.test_30_delete_eth_service1()
 
     def test_50_loop_create_oc_service(self):
-        response = test_utils.get_service_list_request("services/service1")
-        if response.status_code != 404:
-            response = test_utils.service_delete_request("service1")
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service1")
+        if response['status_code'] != 404:
+            self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service1"
+            response = test_utils.transportpce_api_rpc_request(
+                'org-openroadm-service', 'service-delete',
+                self.del_serv_input_data)
             time.sleep(5)
 
         # pylint: disable=consider-using-f-string
-        for i in range(1, 6):
+        for i in range(1, 4):
             print("iteration number {}".format(i))
             print("oc service creation")
             self.test_36_create_oc_service1()
@@ -782,19 +735,19 @@ class TransportPCEFulltesting(unittest.TestCase):
 
     def test_51_disconnect_XPDRA(self):
         response = test_utils.unmount_device("XPDRA01")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_52_disconnect_XPDRC(self):
         response = test_utils.unmount_device("XPDRC01")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_53_disconnect_ROADMA(self):
         response = test_utils.unmount_device("ROADMA01")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_54_disconnect_ROADMC(self):
         response = test_utils.unmount_device("ROADMC01")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
 
 if __name__ == "__main__":
index 3e56063ec99819cff719fcf30adcc5cb64926e4d..e5b02e733e9300dd6952958113cee8ca84e91ba6 100644 (file)
@@ -20,7 +20,7 @@ import sys
 sys.path.append('transportpce_tests/common/')
 # pylint: disable=wrong-import-position
 # pylint: disable=import-error
-import test_utils_rfc8040  # nopep8
+import test_utils  # nopep8
 
 
 class TransportPCEPortMappingTesting(unittest.TestCase):
@@ -30,15 +30,15 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
-        cls.processes = test_utils_rfc8040.start_tpce()
-        cls.processes = test_utils_rfc8040.start_sims([('xpdra', cls.NODE_VERSION), ('roadma', cls.NODE_VERSION),
-                                                       ('spdra', cls.NODE_VERSION)])
+        cls.processes = test_utils.start_tpce()
+        cls.processes = test_utils.start_sims([('xpdra', cls.NODE_VERSION), ('roadma', cls.NODE_VERSION),
+                                               ('spdra', cls.NODE_VERSION)])
 
     @classmethod
     def tearDownClass(cls):
         # pylint: disable=not-an-iterable
         for process in cls.processes:
-            test_utils_rfc8040.shutdown_process(process)
+            test_utils.shutdown_process(process)
         print("all processes killed")
 
     def setUp(self):
@@ -47,16 +47,16 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
         time.sleep(1)
 
     def test_01_rdm_device_connection(self):
-        response = test_utils_rfc8040.mount_device("ROADM-A1", ('roadma', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("ROADM-A1", ('roadma', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_02_rdm_device_connected(self):
-        response = test_utils_rfc8040.check_device_connection("ROADM-A1")
+        response = test_utils.check_device_connection("ROADM-A1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(response['connection-status'], 'connected')
 
     def test_03_rdm_portmapping_info(self):
-        response = test_utils_rfc8040.get_portmapping_node_info("ROADM-A1")
+        response = test_utils.get_portmapping_node_attr("ROADM-A1", "node-info", None)
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(
             {'node-type': 'rdm',
@@ -68,7 +68,7 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
             response['node-info'])
 
     def test_04_rdm_portmapping_DEG1_TTP_TXRX(self):
-        response = test_utils_rfc8040.portmapping_request("ROADM-A1", "DEG1-TTP-TXRX")
+        response = test_utils.get_portmapping_node_attr("ROADM-A1", "mapping", "DEG1-TTP-TXRX")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {'supporting-port': 'L1', 'supporting-circuit-pack-name': '1/0',
@@ -77,7 +77,7 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
             response['mapping'])
 
     def test_05_rdm_portmapping_DEG2_TTP_TXRX_with_ots_oms(self):
-        response = test_utils_rfc8040.portmapping_request("ROADM-A1", "DEG2-TTP-TXRX")
+        response = test_utils.get_portmapping_node_attr("ROADM-A1", "mapping", "DEG2-TTP-TXRX")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {'supporting-port': 'L1', 'supporting-circuit-pack-name': '2/0',
@@ -88,7 +88,7 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
             response['mapping'])
 
     def test_06_rdm_portmapping_SRG1_PP3_TXRX(self):
-        response = test_utils_rfc8040.portmapping_request("ROADM-A1", "SRG1-PP3-TXRX")
+        response = test_utils.get_portmapping_node_attr("ROADM-A1", "mapping", "SRG1-PP3-TXRX")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {'supporting-port': 'C3', 'supporting-circuit-pack-name': '3/0',
@@ -97,7 +97,7 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
             response['mapping'])
 
     def test_07_rdm_portmapping_SRG3_PP1_TXRX(self):
-        response = test_utils_rfc8040.portmapping_request("ROADM-A1", "SRG3-PP1-TXRX")
+        response = test_utils.get_portmapping_node_attr("ROADM-A1", "mapping", "SRG3-PP1-TXRX")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {'supporting-port': 'C1', 'supporting-circuit-pack-name': '5/0',
@@ -106,16 +106,16 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
             response['mapping'])
 
     def test_08_xpdr_device_connection(self):
-        response = test_utils_rfc8040.mount_device("XPDR-A1", ('xpdra', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("XPDR-A1", ('xpdra', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_09_xpdr_device_connected(self):
-        response = test_utils_rfc8040.check_device_connection("XPDR-A1")
+        response = test_utils.check_device_connection("XPDR-A1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(response['connection-status'], 'connected')
 
     def test_10_xpdr_portmapping_info(self):
-        response = test_utils_rfc8040.get_portmapping_node_info("XPDR-A1")
+        response = test_utils.get_portmapping_node_attr("XPDR-A1", "node-info", None)
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(
             {'node-type': 'xpdr',
@@ -127,31 +127,31 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
             response['node-info'])
 
     def test_11_xpdr_portmapping_NETWORK1(self):
-        response = test_utils_rfc8040.portmapping_request("XPDR-A1", "XPDR1-NETWORK1")
+        response = test_utils.get_portmapping_node_attr("XPDR-A1", "mapping", "XPDR1-NETWORK1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {'supported-interface-capability': ['org-openroadm-port-types:if-OCH'],
              'supporting-port': '1', 'supporting-circuit-pack-name': '1/0/1-PLUG-NET',
              'logical-connection-point': 'XPDR1-NETWORK1', 'port-qual': 'xpdr-network',
              'port-direction': 'bidirectional', 'connection-map-lcp': 'XPDR1-CLIENT1',
-             'lcp-hash-val': 'AMkDwQ7xTmRI', 'xponder-type': 'tpdr',
+             'lcp-hash-val': 'AMkDwQ7xTmRI', 'xpdr-type': 'tpdr',
              'port-admin-state': 'InService', 'port-oper-state': 'InService'},
             response['mapping'])
 
     def test_12_xpdr_portmapping_XPDR2_NETWORK1(self):
-        response = test_utils_rfc8040.portmapping_request("XPDR-A1", "XPDR1-NETWORK2")
+        response = test_utils.get_portmapping_node_attr("XPDR-A1", "mapping", "XPDR1-NETWORK2")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {'supported-interface-capability': ['org-openroadm-port-types:if-OCH'],
              'supporting-port': '1', 'supporting-circuit-pack-name': '1/0/2-PLUG-NET',
              'logical-connection-point': 'XPDR1-NETWORK2', 'port-direction': 'bidirectional',
              'connection-map-lcp': 'XPDR1-CLIENT2', 'port-qual': 'xpdr-network',
-             'lcp-hash-val': 'AMkDwQ7xTmRL', 'xponder-type': 'tpdr',
+             'lcp-hash-val': 'AMkDwQ7xTmRL', 'xpdr-type': 'tpdr',
              'port-admin-state': 'InService', 'port-oper-state': 'InService'},
             response['mapping'])
 
     def test_13_xpdr_portmapping_XPDR1_CLIENT1(self):
-        response = test_utils_rfc8040.portmapping_request("XPDR-A1", "XPDR1-CLIENT1")
+        response = test_utils.get_portmapping_node_attr("XPDR-A1", "mapping", "XPDR1-CLIENT1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {'supported-interface-capability': ['org-openroadm-port-types:if-100GE'],
@@ -159,12 +159,12 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
              'supporting-circuit-pack-name': '1/0/1-PLUG-CLIENT',
              'logical-connection-point': 'XPDR1-CLIENT1', 'port-direction': 'bidirectional',
              'connection-map-lcp': 'XPDR1-NETWORK1', 'port-qual': 'xpdr-client',
-             'lcp-hash-val': 'AJUUr6I5fALj', 'xponder-type': 'tpdr',
+             'lcp-hash-val': 'AJUUr6I5fALj', 'xpdr-type': 'tpdr',
              'port-admin-state': 'InService', 'port-oper-state': 'InService'},
             response['mapping'])
 
     def test_14_xpdr_portmapping_XPDR1_CLIENT2(self):
-        response = test_utils_rfc8040.portmapping_request("XPDR-A1", "XPDR1-CLIENT2")
+        response = test_utils.get_portmapping_node_attr("XPDR-A1", "mapping", "XPDR1-CLIENT2")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {'supported-interface-capability': ['org-openroadm-port-types:if-100GE'],
@@ -172,21 +172,21 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
              'supporting-circuit-pack-name': '1/0/2-PLUG-CLIENT',
              'logical-connection-point': 'XPDR1-CLIENT2', 'port-direction': 'bidirectional',
              'connection-map-lcp': 'XPDR1-NETWORK2', 'port-qual': 'xpdr-client',
-             'lcp-hash-val': 'AJUUr6I5fALg', 'xponder-type': 'tpdr',
+             'lcp-hash-val': 'AJUUr6I5fALg', 'xpdr-type': 'tpdr',
              'port-admin-state': 'InService', 'port-oper-state': 'InService'},
             response['mapping'])
 
     def test_15_spdr_device_connection(self):
-        response = test_utils_rfc8040.mount_device("SPDR-SA1", ('spdra', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("SPDR-SA1", ('spdra', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_16_spdr_device_connected(self):
-        response = test_utils_rfc8040.check_device_connection("SPDR-SA1")
+        response = test_utils.check_device_connection("SPDR-SA1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(response['connection-status'], 'connected')
 
     def test_17_spdr_portmapping_info(self):
-        response = test_utils_rfc8040.get_portmapping_node_info("SPDR-SA1")
+        response = test_utils.get_portmapping_node_attr("SPDR-SA1", "node-info", None)
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(
             {'node-type': 'xpdr',
@@ -198,73 +198,78 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
             response['node-info'])
 
     def test_18_spdr_switching_pool_1(self):
-        response = test_utils_rfc8040.portmapping_switching_pool_request("SPDR-SA1", "1")
+        response = test_utils.get_portmapping_node_attr("SPDR-SA1", "switching-pool-lcp", "1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual("blocking",
-                         response['switching_pool'][0]['switching-pool-type'])
+                         response['switching-pool-lcp'][0]['switching-pool-type'])
         self.assertEqual(4,
-                         len(response['switching_pool'][0]['non-blocking-list']))
+                         len(response['switching-pool-lcp'][0]['non-blocking-list']))
         self.assertIn(
             {'nbl-number': 11,
-             'lcp-list': ['XPDR1-CLIENT1', 'XPDR1-NETWORK1'],
+             'lcp-list': ['XPDR1-NETWORK1', 'XPDR1-CLIENT1'],
              'interconnect-bandwidth-unit': 1000000000,
              'interconnect-bandwidth': 0},
-            response['switching_pool'][0]['non-blocking-list'])
+            response['switching-pool-lcp'][0]['non-blocking-list'])
 
     def test_19_spdr_switching_pool_2(self):
-        response = test_utils_rfc8040.portmapping_switching_pool_request("SPDR-SA1", "2")
+        response = test_utils.get_portmapping_node_attr("SPDR-SA1", "switching-pool-lcp", "2")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual("non-blocking",
-                         response['switching_pool'][0]['switching-pool-type'])
+                         response['switching-pool-lcp'][0]['switching-pool-type'])
         self.assertEqual(1,
-                         len(response['switching_pool'][0]['non-blocking-list']))
-        self.assertIn(
-            {'nbl-number': 2,
-             'lcp-list': ['XPDR2-NETWORK2', 'XPDR2-NETWORK3', 'XPDR2-CLIENT1',
-                          'XPDR2-CLIENT2', 'XPDR2-NETWORK1', 'XPDR2-CLIENT3',
-                          'XPDR2-CLIENT4', 'XPDR2-NETWORK4'],
-             'interconnect-bandwidth-unit': 1000000000,
-             'interconnect-bandwidth': 0},
-            response['switching_pool'][0]['non-blocking-list'])
+                         len(response['switching-pool-lcp'][0]['non-blocking-list']))
+        expected_sorted_list = ['XPDR2-CLIENT1', 'XPDR2-CLIENT2', 'XPDR2-CLIENT3', 'XPDR2-CLIENT4',
+                                'XPDR2-NETWORK1', 'XPDR2-NETWORK2', 'XPDR2-NETWORK3', 'XPDR2-NETWORK4']
+        expected_subset_response = {
+            "nbl-number": 2,
+            "interconnect-bandwidth-unit": 1000000000,
+            "interconnect-bandwidth": 0}
+        subset = {k: v for k, v in response['switching-pool-lcp'][0]['non-blocking-list'][0].items()
+                  if k in expected_subset_response}
+        self.assertDictEqual(subset, expected_subset_response)
+        self.assertEqual(sorted(response['switching-pool-lcp'][0]['non-blocking-list'][0]['lcp-list']),
+                         expected_sorted_list)
 
     def test_20_spdr_switching_pool_3(self):
-        response = test_utils_rfc8040.portmapping_switching_pool_request("SPDR-SA1", "3")
+        response = test_utils.get_portmapping_node_attr("SPDR-SA1", "switching-pool-lcp", "3")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual("blocking",
-                         response['switching_pool'][0]['switching-pool-type'])
+                         response['switching-pool-lcp'][0]['switching-pool-type'])
         self.assertEqual(4,
-                         len(response['switching_pool'][0]['non-blocking-list']))
+                         len(response['switching-pool-lcp'][0]['non-blocking-list']))
         self.assertIn(
             {'nbl-number': 83,
              'interconnect-bandwidth': 0,
              'interconnect-bandwidth-unit': 1000000000,
-             'lcp-list': ['XPDR3-NETWORK1', 'XPDR3-CLIENT3']},
-            response['switching_pool'][0]['non-blocking-list'])
+             'lcp-list': ['XPDR3-CLIENT3', 'XPDR3-NETWORK1']},
+            response['switching-pool-lcp'][0]['non-blocking-list'])
 
     def test_21_spdr_portmapping_mappings(self):
-        response = test_utils_rfc8040.get_portmapping("SPDR-SA1")
+        response = test_utils.get_portmapping_node_attr("SPDR-SA1", None, None)
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(18, len(response['nodes'][0]['mapping']))
 
     def test_22_spdr_portmapping_XPDR1_CLIENT1(self):
-        response = test_utils_rfc8040.portmapping_request("SPDR-SA1", "XPDR1-CLIENT1")
+        response = test_utils.get_portmapping_node_attr("SPDR-SA1", "mapping", "XPDR1-CLIENT1")
         self.assertEqual(response['status_code'], requests.codes.ok)
-        self.assertIn(
-            {"logical-connection-point": "XPDR1-CLIENT1",
-             "supporting-circuit-pack-name": "CP1-SFP1",
-             "supported-interface-capability": ["org-openroadm-port-types:if-10GE-ODU2e",
-                                                "org-openroadm-port-types:if-10GE-ODU2"],
-             "supporting-port": "CP1-SFP1-P1",
-             "lcp-hash-val": "FqlcrxV7p30=",
-             "port-direction": "bidirectional",
-             "port-admin-state": "InService",
-             "xponder-type": "mpdr",
-             "port-qual": "xpdr-client",
-             "port-oper-state": "InService"},
-            response['mapping'])
+        expected_subset_response = {
+            "logical-connection-point": "XPDR1-CLIENT1",
+            "supporting-circuit-pack-name": "CP1-SFP1",
+            "supporting-port": "CP1-SFP1-P1",
+            "lcp-hash-val": "FqlcrxV7p30=",
+            "port-direction": "bidirectional",
+            "port-admin-state": "InService",
+            "xpdr-type": "mpdr",
+            "port-qual": "xpdr-client",
+            "port-oper-state": "InService"}
+        expected_sorted_list = ["org-openroadm-port-types:if-10GE-ODU2",
+                                "org-openroadm-port-types:if-10GE-ODU2e"]
+        subset = {k: v for k, v in response['mapping'][0].items() if k in expected_subset_response}
+        self.assertDictEqual(subset, expected_subset_response)
+        self.assertEqual(sorted(response['mapping'][0]['supported-interface-capability']), expected_sorted_list)
 
     def test_23_spdr_portmapping_XPDR1_NETWORK1(self):
-        response = test_utils_rfc8040.portmapping_request("SPDR-SA1", "XPDR1-NETWORK1")
+        response = test_utils.get_portmapping_node_attr("SPDR-SA1", "mapping", "XPDR1-NETWORK1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {"logical-connection-point": "XPDR1-NETWORK1",
@@ -274,30 +279,32 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
              "lcp-hash-val": "Swfw02qXGyI=",
              "port-direction": "bidirectional",
              "port-admin-state": "InService",
-             "xponder-type": "mpdr",
+             "xpdr-type": "mpdr",
              "port-qual": "xpdr-network",
              "port-oper-state": "InService"},
             response['mapping'])
 
     def test_24_spdr_portmapping_XPDR2_CLIENT2(self):
-        response = test_utils_rfc8040.portmapping_request("SPDR-SA1", "XPDR2-CLIENT2")
+        response = test_utils.get_portmapping_node_attr("SPDR-SA1", "mapping", "XPDR2-CLIENT2")
         self.assertEqual(response['status_code'], requests.codes.ok)
-        self.assertIn(
-            {'logical-connection-point': 'XPDR2-CLIENT2',
-             'supporting-port': 'CP2-QSFP2-P1',
-             'lcp-hash-val': 'AN/WSSRXne3t',
-             'port-direction': 'bidirectional',
-             'xponder-type': 'switch',
-             'port-qual': 'switch-client',
-             'supporting-circuit-pack-name': 'CP2-QSFP2',
-             'port-admin-state': 'InService',
-             'port-oper-state': 'InService',
-             'supported-interface-capability': ['org-openroadm-port-types:if-100GE',
-                                                'org-openroadm-port-types:if-100GE-ODU4']},
-            response['mapping'])
+        expected_subset_response = {
+            'logical-connection-point': 'XPDR2-CLIENT2',
+            'supporting-port': 'CP2-QSFP2-P1',
+            'lcp-hash-val': 'AN/WSSRXne3t',
+            'port-direction': 'bidirectional',
+            'xpdr-type': 'switch',
+            'port-qual': 'switch-client',
+            'supporting-circuit-pack-name': 'CP2-QSFP2',
+            'port-admin-state': 'InService',
+            'port-oper-state': 'InService'}
+        expected_sorted_list = ['org-openroadm-port-types:if-100GE',
+                                'org-openroadm-port-types:if-100GE-ODU4']
+        subset = {k: v for k, v in response['mapping'][0].items() if k in expected_subset_response}
+        self.assertDictEqual(subset, expected_subset_response)
+        self.assertEqual(sorted(response['mapping'][0]['supported-interface-capability']), expected_sorted_list)
 
     def test_25_spdr_portmapping_XPDR2_NETWORK2(self):
-        response = test_utils_rfc8040.portmapping_request("SPDR-SA1", "XPDR2-NETWORK2")
+        response = test_utils.get_portmapping_node_attr("SPDR-SA1", "mapping", "XPDR2-NETWORK2")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {"logical-connection-point": "XPDR2-NETWORK2",
@@ -307,13 +314,13 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
              "lcp-hash-val": "exT821pFtOQ=",
              "port-direction": "bidirectional",
              "port-admin-state": "InService",
-             "xponder-type": "switch",
+             "xpdr-type": "switch",
              "port-qual": "switch-network",
              "port-oper-state": "InService"},
             response['mapping'])
 
     def test_26_spdr_portmapping_XPDR3_CLIENT3(self):
-        response = test_utils_rfc8040.portmapping_request("SPDR-SA1", "XPDR3-CLIENT3")
+        response = test_utils.get_portmapping_node_attr("SPDR-SA1", "mapping", "XPDR3-CLIENT3")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {"logical-connection-point": "XPDR3-CLIENT3",
@@ -323,13 +330,13 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
              "lcp-hash-val": "AKsQ/HRQdtdN",
              "port-direction": "bidirectional",
              "port-admin-state": "InService",
-             "xponder-type": "mpdr",
+             "xpdr-type": "mpdr",
              "port-qual": "xpdr-client",
              "port-oper-state": "InService"},
             response['mapping'])
 
     def test_27_spdr_portmapping_XPDR3_NETWORK1(self):
-        response = test_utils_rfc8040.portmapping_request("SPDR-SA1", "XPDR3-NETWORK1")
+        response = test_utils.get_portmapping_node_attr("SPDR-SA1", "mapping", "XPDR3-NETWORK1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {"logical-connection-point": "XPDR3-NETWORK1",
@@ -339,17 +346,17 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
              "lcp-hash-val": "ANnxoi7K8q30",
              "port-direction": "bidirectional",
              "port-admin-state": "InService",
-             "xponder-type": "mpdr",
+             "xpdr-type": "mpdr",
              "port-qual": "xpdr-network",
              "port-oper-state": "InService"},
             response['mapping'])
 
     def test_28_spdr_device_disconnection(self):
-        response = test_utils_rfc8040.unmount_device("SPDR-SA1")
+        response = test_utils.unmount_device("SPDR-SA1")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_29_xpdr_device_disconnected(self):
-        response = test_utils_rfc8040.check_device_connection("SPDR-SA1")
+        response = test_utils.check_device_connection("SPDR-SA1")
         self.assertEqual(response['status_code'], requests.codes.conflict)
         self.assertIn(response['connection-status']['error-type'], ('protocol', 'application'))
         self.assertEqual(response['connection-status']['error-tag'], 'data-missing')
@@ -357,11 +364,11 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
                          'Request could not be completed because the relevant data model content does not exist')
 
     def test_30_xpdr_device_disconnection(self):
-        response = test_utils_rfc8040.unmount_device("XPDR-A1")
+        response = test_utils.unmount_device("XPDR-A1")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_31_xpdr_device_disconnected(self):
-        response = test_utils_rfc8040.check_device_connection("XPDR-A1")
+        response = test_utils.check_device_connection("XPDR-A1")
         self.assertEqual(response['status_code'], requests.codes.conflict)
         self.assertIn(response['connection-status']['error-type'], ('protocol', 'application'))
         self.assertEqual(response['connection-status']['error-tag'], 'data-missing')
@@ -369,7 +376,7 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
                          'Request could not be completed because the relevant data model content does not exist')
 
     def test_32_xpdr_device_not_connected(self):
-        response = test_utils_rfc8040.get_portmapping_node_info("XPDR-A1")
+        response = test_utils.get_portmapping_node_attr("XPDR-A1", "node-info", None)
         self.assertEqual(response['status_code'], requests.codes.conflict)
         self.assertIn(response['node-info']['error-type'], ('protocol', 'application'))
         self.assertEqual(response['node-info']['error-tag'], 'data-missing')
@@ -377,11 +384,11 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
                          'Request could not be completed because the relevant data model content does not exist')
 
     def test_33_rdm_device_disconnection(self):
-        response = test_utils_rfc8040.unmount_device("ROADM-A1")
+        response = test_utils.unmount_device("ROADM-A1")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_34_rdm_device_disconnected(self):
-        response = test_utils_rfc8040.check_device_connection("ROADM-A1")
+        response = test_utils.check_device_connection("ROADM-A1")
         self.assertEqual(response['status_code'], requests.codes.conflict)
         self.assertIn(response['connection-status']['error-type'], ('protocol', 'application'))
         self.assertEqual(response['connection-status']['error-tag'], 'data-missing')
@@ -389,7 +396,7 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
                          'Request could not be completed because the relevant data model content does not exist')
 
     def test_35_rdm_device_not_connected(self):
-        response = test_utils_rfc8040.get_portmapping_node_info("ROADM-A1")
+        response = test_utils.get_portmapping_node_attr("ROADM-A1", "node-info", None)
         self.assertEqual(response['status_code'], requests.codes.conflict)
         self.assertIn(response['node-info']['error-type'], ('protocol', 'application'))
         self.assertEqual(response['node-info']['error-tag'], 'data-missing')
index 586b882f1868933b174bae4144b0974485f0f862..625b3c981eb4938e2f05fd664f20e244f9b66e16 100644 (file)
@@ -20,7 +20,7 @@ import sys
 sys.path.append('transportpce_tests/common/')
 # pylint: disable=wrong-import-position
 # pylint: disable=import-error
-import test_utils_rfc8040  # nopep8
+import test_utils  # nopep8
 
 
 class TransportPCEtesting(unittest.TestCase):
@@ -30,27 +30,27 @@ class TransportPCEtesting(unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
-        cls.processes = test_utils_rfc8040.start_tpce()
-        cls.processes = test_utils_rfc8040.start_sims([('xpdra', cls.NODE_VERSION), ('roadma', cls.NODE_VERSION)])
+        cls.processes = test_utils.start_tpce()
+        cls.processes = test_utils.start_sims([('xpdra', cls.NODE_VERSION), ('roadma', cls.NODE_VERSION)])
 
     @classmethod
     def tearDownClass(cls):
         # pylint: disable=not-an-iterable
         for process in cls.processes:
-            test_utils_rfc8040.shutdown_process(process)
+            test_utils.shutdown_process(process)
         print("all processes killed")
 
     def setUp(self):
-        time.sleep(10)
+        time.sleep(2)
 
     # Connect the ROADMA
     def test_01_connect_rdm(self):
-        response = test_utils_rfc8040.mount_device("ROADM-A1", ('roadma', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("ROADM-A1", ('roadma', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     # Verify the termination points of the ROADMA
     def test_02_compareOpenroadmTopologyPortMapping_rdm(self):
-        resTopo = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        resTopo = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(resTopo['status_code'], requests.codes.ok)
         nbMapCumul = 0
         nbMappings = 0
@@ -60,15 +60,15 @@ class TransportPCEtesting(unittest.TestCase):
             print("nodeId={}".format(nodeId))
             nodeMapId = nodeId.split("-")[0] + "-" + nodeId.split("-")[1]
             print("nodeMapId={}".format(nodeMapId))
-            response = test_utils_rfc8040.get_portmapping_node_info(nodeMapId)
+            response = test_utils.get_portmapping_node_attr(nodeMapId, "node-info", None)
             self.assertEqual(response['status_code'], requests.codes.ok)
-            responseMapList = test_utils_rfc8040.get_portmapping(nodeMapId)
+            responseMapList = test_utils.get_portmapping_node_attr(nodeMapId, None, None)
             nbMappings = len(responseMapList['nodes'][0]['mapping']) - nbMapCumul
             nbMapCurrent = 0
             for tp in node['ietf-network-topology:termination-point']:
                 tpId = tp['tp-id']
                 if (not "CP" in tpId) and (not "CTP" in tpId):
-                    responseMap = test_utils_rfc8040.portmapping_request(nodeMapId, tpId)
+                    responseMap = test_utils.get_portmapping_node_attr(nodeMapId, "mapping", tpId)
                     self.assertEqual(responseMap['status_code'], requests.codes.ok)
                     if responseMap['status_code'] == requests.codes.ok:
                         nbMapCurrent += 1
@@ -78,13 +78,13 @@ class TransportPCEtesting(unittest.TestCase):
 
     # Disconnect the ROADMA
     def test_03_disconnect_rdm(self):
-        response = test_utils_rfc8040.unmount_device("ROADM-A1")
+        response = test_utils.unmount_device("ROADM-A1")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
 #     #Connect the XPDRA
     def test_04_connect_xpdr(self):
-        response = test_utils_rfc8040.mount_device("XPDR-A1", ('xpdra', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("XPDR-A1", ('xpdra', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
 #     #Verify the termination points related to XPDR
     def test_05_compareOpenroadmTopologyPortMapping_xpdr(self):
@@ -92,11 +92,10 @@ class TransportPCEtesting(unittest.TestCase):
 
     # Disconnect the XPDRA
     def test_06_disconnect_device(self):
-        response = test_utils_rfc8040.unmount_device("XPDR-A1")
+        response = test_utils.unmount_device("XPDR-A1")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
 
 if __name__ == "__main__":
     # logging.basicConfig(filename='./transportpce_tests/log/response.log',filemode='w',level=logging.DEBUG)
-    #logging.debug('I am there')
     unittest.main(verbosity=2)
index 88ae14f69ea583e11aef79472de9071e62eaf1e0..964ee8a4e95bf1f3de4e9b66081c2a8597fe8299 100644 (file)
@@ -22,7 +22,7 @@ import sys
 sys.path.append('transportpce_tests/common/')
 # pylint: disable=wrong-import-position
 # pylint: disable=import-error
-import test_utils_rfc8040  # nopep8
+import test_utils  # nopep8
 
 
 class TransportPCEtesting(unittest.TestCase):
@@ -99,33 +99,33 @@ class TransportPCEtesting(unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
-        cls.processes = test_utils_rfc8040.start_tpce()
-        cls.processes = test_utils_rfc8040.start_sims([('xpdra', cls.NODE_VERSION), ('roadma', cls.NODE_VERSION),
-                                                       ('roadmb', cls.NODE_VERSION), ('roadmc', cls.NODE_VERSION)])
+        cls.processes = test_utils.start_tpce()
+        cls.processes = test_utils.start_sims([('xpdra', cls.NODE_VERSION), ('roadma', cls.NODE_VERSION),
+                                               ('roadmb', cls.NODE_VERSION), ('roadmc', cls.NODE_VERSION)])
 
     @classmethod
     def tearDownClass(cls):
         # pylint: disable=not-an-iterable
         for process in cls.processes:
-            test_utils_rfc8040.shutdown_process(process)
+            test_utils.shutdown_process(process)
         print("all processes killed")
 
     def setUp(self):
-        time.sleep(5)
+        time.sleep(2)
 
     def test_01_connect_ROADM_A1(self):
-        response = test_utils_rfc8040.mount_device("ROADM-A1", ('roadma', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("ROADM-A1", ('roadma', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_02_getClliNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('clli-network', 'config')
+        response = test_utils.get_ietf_network_request('clli-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         logging.info(response)
         self.assertEqual(response['network'][0]['node'][0]['node-id'], 'NodeA')
         self.assertEqual(response['network'][0]['node'][0]['org-openroadm-clli-network:clli'], 'NodeA')
 
     def test_03_getOpenRoadmNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-network', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(response['network'][0]['node'][0]['node-id'], 'ROADM-A1')
         self.assertEqual(response['network'][0]['node'][0]['supporting-node'][0]['network-ref'], 'clli-network')
@@ -135,7 +135,7 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_04_getLinks_OpenroadmTopology(self):
         # pylint: disable=redundant-unittest-assert
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 10)
         check_list = {'EXPRESS-LINK': ['ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX',
@@ -161,7 +161,7 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_05_getNodes_OpenRoadmTopology(self):
         # pylint: disable=redundant-unittest-assert
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['node']), 4)
         listNode = ['ROADM-A1-SRG1', 'ROADM-A1-SRG3', 'ROADM-A1-DEG1', 'ROADM-A1-DEG2']
@@ -181,18 +181,18 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertEqual(len(listNode), 0)
 
     def test_06_connect_XPDRA(self):
-        response = test_utils_rfc8040.mount_device("XPDR-A1", ('xpdra', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("XPDR-A1", ('xpdra', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_07_getClliNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('clli-network', 'config')
+        response = test_utils.get_ietf_network_request('clli-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(response['network'][0]['node'][0]['node-id'], 'NodeA')
         self.assertEqual(response['network'][0]['node'][0]['org-openroadm-clli-network:clli'], 'NodeA')
 
     def test_08_getOpenRoadmNetwork(self):
         # pylint: disable=redundant-unittest-assert
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-network', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         nbNode = len(response['network'][0]['node'])
         self.assertEqual(nbNode, 2)
@@ -211,7 +211,7 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_09_getNodes_OpenRoadmTopology(self):
         # pylint: disable=redundant-unittest-assert
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['node']), 5)
         listNode = ['XPDR-A1-XPDR1', 'ROADM-A1-SRG1', 'ROADM-A1-SRG3', 'ROADM-A1-DEG1', 'ROADM-A1-DEG2']
@@ -226,16 +226,18 @@ class TransportPCEtesting(unittest.TestCase):
                 client = 0
                 network = 0
                 for tp in node['ietf-network-topology:termination-point']:
-                    tpType = (tp['org-openroadm-common-network:tp-type'])
+                    tpType = tp['org-openroadm-common-network:tp-type']
                     tpId = tp['tp-id']
                     if tpType == 'XPONDER-CLIENT':
                         client += 1
                     elif tpType == 'XPONDER-NETWORK':
                         network += 1
                     if tpId == 'XPDR1-NETWORK2':
-                        self.assertEqual(tp['transportpce-topology:associated-connection-map-port'], 'XPDR1-CLIENT2')
+                        self.assertEqual(
+                            tp['org-openroadm-common-network:associated-connection-map-tp'], ['XPDR1-CLIENT2'])
                     if tpId == 'XPDR1-CLIENT2':
-                        self.assertEqual(tp['transportpce-topology:associated-connection-map-port'], 'XPDR1-NETWORK2')
+                        self.assertEqual(
+                            tp['org-openroadm-common-network:associated-connection-map-tp'], ['XPDR1-NETWORK2'])
                 self.assertEqual(client, 2)
                 self.assertEqual(network, 2)
                 listNode.remove(nodeId)
@@ -255,14 +257,14 @@ class TransportPCEtesting(unittest.TestCase):
     # Connect the tail XPDRA to ROADMA and vice versa
     def test_10_connect_tail_xpdr_rdm(self):
         # Connect the tail: XPDRA to ROADMA
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-networkutils', 'init-xpdr-rdm-links',
             {'links-input': {'xpdr-node': 'XPDR-A1', 'xpdr-num': '1', 'network-num': '1',
                              'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
         self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_11_connect_tail_rdm_xpdr(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-networkutils', 'init-rdm-xpdr-links',
             {'links-input': {'xpdr-node': 'XPDR-A1', 'xpdr-num': '1', 'network-num': '1',
                              'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
@@ -270,7 +272,7 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_12_getLinks_OpenRoadmTopology(self):
         # pylint: disable=redundant-unittest-assert
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 12)
         check_list = {'EXPRESS-LINK': ['ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX',
@@ -297,8 +299,8 @@ class TransportPCEtesting(unittest.TestCase):
             self.assertEqual(len(link), 0)
 
     def test_13_connect_ROADMC(self):
-        response = test_utils_rfc8040.mount_device("ROADM-C1", ('roadmc', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("ROADM-C1", ('roadmc', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_14_omsAttributes_ROADMA_ROADMC(self):
         # Config ROADMA-ROADMC oms-attributes
@@ -310,7 +312,7 @@ class TransportPCEtesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils_rfc8040.add_oms_attr_request(
+        response = test_utils.add_oms_attr_request(
             "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
 
@@ -325,13 +327,13 @@ class TransportPCEtesting(unittest.TestCase):
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
 
-        response = test_utils_rfc8040.add_oms_attr_request(
+        response = test_utils.add_oms_attr_request(
             "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
 
     def test_16_getClliNetwork(self):
         # pylint: disable=redundant-unittest-assert
-        response = test_utils_rfc8040.get_ietf_network_request('clli-network', 'config')
+        response = test_utils.get_ietf_network_request('clli-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         listNode = ['NodeA', 'NodeC']
         for node in response['network'][0]['node']:
@@ -343,7 +345,7 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_17_getOpenRoadmNetwork(self):
         # pylint: disable=redundant-unittest-assert
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-network', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         nbNode = len(response['network'][0]['node'])
         self.assertEqual(nbNode, 3)
@@ -367,7 +369,7 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_18_getROADMLinkOpenRoadmTopology(self):
         # pylint: disable=redundant-unittest-assert
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 20)
         check_list = {'EXPRESS-LINK': ['ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX',
@@ -402,7 +404,7 @@ class TransportPCEtesting(unittest.TestCase):
             self.assertEqual(len(link), 0)
 
     def test_19_getLinkOmsAttributesOpenRoadmTopology(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 20)
         R2RLink = ['ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX',
@@ -422,7 +424,7 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_20_getNodes_OpenRoadmTopology(self):
         # pylint: disable=redundant-unittest-assert
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['node']), 8)
         listNode = ['XPDR-A1-XPDR1',
@@ -440,7 +442,7 @@ class TransportPCEtesting(unittest.TestCase):
                 client = 0
                 network = 0
                 for tp in node['ietf-network-topology:termination-point']:
-                    tpType = (tp['org-openroadm-common-network:tp-type'])
+                    tpType = tp['org-openroadm-common-network:tp-type']
                     if tpType == 'XPONDER-CLIENT':
                         client += 1
                     elif tpType == 'XPONDER-NETWORK':
@@ -473,8 +475,8 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertEqual(len(listNode), 0)
 
     def test_21_connect_ROADMB(self):
-        response = test_utils_rfc8040.mount_device("ROADM-B1", ('roadmb', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("ROADM-B1", ('roadmb', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_22_omsAttributes_ROADMA_ROADMB(self):
         # Config ROADM-A1-ROADM-B1 oms-attributes
@@ -488,7 +490,7 @@ class TransportPCEtesting(unittest.TestCase):
                     "fiber-type": "smf",
                     "SRLG-length": 100000,
                     "pmd": 0.5}]}}
-        response = test_utils_rfc8040.add_oms_attr_request(
+        response = test_utils.add_oms_attr_request(
             "ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
 
@@ -504,7 +506,7 @@ class TransportPCEtesting(unittest.TestCase):
                     "fiber-type": "smf",
                     "SRLG-length": 100000,
                     "pmd": 0.5}]}}
-        response = test_utils_rfc8040.add_oms_attr_request(
+        response = test_utils.add_oms_attr_request(
             "ROADM-B1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG1-DEG1-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
 
@@ -520,7 +522,7 @@ class TransportPCEtesting(unittest.TestCase):
                     "fiber-type": "smf",
                     "SRLG-length": 100000,
                     "pmd": 0.5}]}}
-        response = test_utils_rfc8040.add_oms_attr_request(
+        response = test_utils.add_oms_attr_request(
             "ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
 
@@ -534,13 +536,13 @@ class TransportPCEtesting(unittest.TestCase):
                     "fiber-type": "smf",
                     "SRLG-length": 100000,
                     "pmd": 0.5}]}}
-        response = test_utils_rfc8040.add_oms_attr_request(
+        response = test_utils.add_oms_attr_request(
             "ROADM-C1-DEG2-DEG2-TTP-TXRXtoROADM-B1-DEG2-DEG2-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
 
     def test_26_getClliNetwork(self):
         # pylint: disable=redundant-unittest-assert
-        response = test_utils_rfc8040.get_ietf_network_request('clli-network', 'config')
+        response = test_utils.get_ietf_network_request('clli-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         listNode = ['NodeA', 'NodeB', 'NodeC']
         for node in response['network'][0]['node']:
@@ -551,7 +553,7 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertEqual(len(listNode), 0)
 
     def test_27_verifyDegree(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         listR2RLink = ['ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX',
                        'ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX',
@@ -568,7 +570,7 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertEqual(len(listR2RLink), 0)
 
     def test_28_verifyOppositeLinkTopology(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 30)
         for link in response['network'][0]['ietf-network-topology:link']:
@@ -578,7 +580,7 @@ class TransportPCEtesting(unittest.TestCase):
             link_dest = link['destination']['dest-node']
             oppLink_id = link['org-openroadm-common-network:opposite-link']
             # Find the opposite link
-            res_oppLink = test_utils_rfc8040.get_ietf_network_link_request('openroadm-topology', oppLink_id, 'config')
+            res_oppLink = test_utils.get_ietf_network_link_request('openroadm-topology', oppLink_id, 'config')
             self.assertEqual(res_oppLink['status_code'], requests.codes.ok)
             self.assertEqual(res_oppLink['link']['org-openroadm-common-network:opposite-link'], link_id)
             self.assertEqual(res_oppLink['link']['source']['source-node'], link_dest)
@@ -591,7 +593,7 @@ class TransportPCEtesting(unittest.TestCase):
                 self.assertEqual(oppLink_type, CHECK_DICT[link_type])
 
     def test_29_getLinkOmsAttributesOpenRoadmTopology(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         R2RLink = ['ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX',
                    'ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX',
@@ -614,23 +616,23 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_30_disconnect_ROADMB(self):
         # Delete in the topology-netconf
-        response = test_utils_rfc8040.unmount_device("ROADM-B1")
+        response = test_utils.unmount_device("ROADM-B1")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
         # Delete in the clli-network
-        response = test_utils_rfc8040.del_ietf_network_node_request('clli-network', 'NodeB', 'config')
+        response = test_utils.del_ietf_network_node_request('clli-network', 'NodeB', 'config')
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_31_disconnect_ROADMC(self):
         # Delete in the topology-netconf
-        response = test_utils_rfc8040.unmount_device("ROADM-C1")
+        response = test_utils.unmount_device("ROADM-C1")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
         # Delete in the clli-network
-        response = test_utils_rfc8040.del_ietf_network_node_request('clli-network', 'NodeC', 'config')
+        response = test_utils.del_ietf_network_node_request('clli-network', 'NodeC', 'config')
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_32_getNodes_OpenRoadmTopology(self):
         # pylint: disable=redundant-unittest-assert
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['node']), 5)
         listNode = ['XPDR-A1-XPDR1', 'ROADM-A1-SRG1', 'ROADM-A1-SRG3', 'ROADM-A1-DEG1', 'ROADM-A1-DEG2']
@@ -673,7 +675,7 @@ class TransportPCEtesting(unittest.TestCase):
             self.assertNotEqual(node['node-id'], 'ROADM-C1-DEG2')
 
     def test_33_getOpenRoadmNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-network', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         nbNode = len(response['network'][0]['node'])
         self.assertEqual(nbNode, 2)
@@ -682,29 +684,29 @@ class TransportPCEtesting(unittest.TestCase):
             self.assertNotEqual(node['node-id'], 'ROADM-B1')
 
     def test_34_getClliNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('clli-network', 'config')
+        response = test_utils.get_ietf_network_request('clli-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['node']), 1)
         self.assertNotEqual(response['network'][0]['node'][0]['org-openroadm-clli-network:clli'], 'NodeC')
 
     def test_35_disconnect_XPDRA(self):
-        response = test_utils_rfc8040.unmount_device("XPDR-A1")
+        response = test_utils.unmount_device("XPDR-A1")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_36_getClliNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('clli-network', 'config')
+        response = test_utils.get_ietf_network_request('clli-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['node']), 1)
         self.assertEqual(response['network'][0]['node'][0]['org-openroadm-clli-network:clli'], 'NodeA')
 
     def test_37_getOpenRoadmNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-network', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['node']), 1)
         self.assertNotEqual(response['network'][0]['node'][0]['node-id'], 'XPDR-A1')
 
     def test_38_getNodes_OpenRoadmTopology(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['node']), 4)
         listNode = ['ROADM-A1-SRG1', 'ROADM-A1-SRG3', 'ROADM-A1-DEG1', 'ROADM-A1-DEG2']
@@ -725,12 +727,12 @@ class TransportPCEtesting(unittest.TestCase):
 
     def test_39_disconnect_ROADM_XPDRA_link(self):
         # Link-1
-        response = test_utils_rfc8040.del_ietf_network_link_request(
+        response = test_utils.del_ietf_network_link_request(
             'openroadm-topology',
             'XPDR-A1-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP1-TXRX',
             'config')
         # Link-2
-        response2 = test_utils_rfc8040.del_ietf_network_link_request(
+        response2 = test_utils.del_ietf_network_link_request(
             'openroadm-topology',
             'ROADM-A1-SRG1-SRG1-PP1-TXRXtoXPDR-A1-XPDR1-XPDR1-NETWORK1',
             'config')
@@ -738,7 +740,7 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertIn(response2.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_40_getLinks_OpenRoadmTopology(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 16)
         check_list = {'EXPRESS-LINK': ['ROADM-A1-DEG2-DEG2-CTP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX',
@@ -770,24 +772,24 @@ class TransportPCEtesting(unittest.TestCase):
             self.assertNotEqual(link['org-openroadm-common-network:link-type'], 'XPONDER-INPUT')
 
     def test_41_disconnect_ROADMA(self):
-        response = test_utils_rfc8040.unmount_device("ROADM-A1")
+        response = test_utils.unmount_device("ROADM-A1")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
         # Delete in the clli-network
-        response = test_utils_rfc8040.del_ietf_network_node_request('clli-network', 'NodeA', 'config')
+        response = test_utils.del_ietf_network_node_request('clli-network', 'NodeA', 'config')
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_42_getClliNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('clli-network', 'config')
+        response = test_utils.get_ietf_network_request('clli-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertNotIn('node', response['network'][0])
 
     def test_43_getOpenRoadmNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-network', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertNotIn('node', response['network'][0])
 
     def test_44_check_roadm2roadm_link_persistence(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertNotIn('node', response['network'][0])
         self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 6)
index 9156c21c79374338a81282b74761e0186cfb608b..629c7a311dcc5444cd3f4da67a89871a054bcb41 100644 (file)
@@ -21,7 +21,7 @@ import sys
 sys.path.append('transportpce_tests/common/')
 # pylint: disable=wrong-import-position
 # pylint: disable=import-error
-import test_utils_rfc8040  # nopep8
+import test_utils  # nopep8
 
 
 class TransportPCEtesting(unittest.TestCase):
@@ -31,37 +31,37 @@ class TransportPCEtesting(unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
-        cls.processes = test_utils_rfc8040.start_tpce()
-        cls.processes = test_utils_rfc8040.start_sims([('spdra', cls.NODE_VERSION)])
+        cls.processes = test_utils.start_tpce()
+        cls.processes = test_utils.start_sims([('spdra', cls.NODE_VERSION)])
 
     @classmethod
     def tearDownClass(cls):
         # pylint: disable=not-an-iterable
         for process in cls.processes:
-            test_utils_rfc8040.shutdown_process(process)
+            test_utils.shutdown_process(process)
         print("all processes killed")
 
     def setUp(self):
-        time.sleep(5)
+        time.sleep(2)
 
     def test_01_connect_SPDR_SA1(self):
-        response = test_utils_rfc8040.mount_device("SPDR-SA1", ('spdra', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("SPDR-SA1", ('spdra', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
         time.sleep(10)
 
-        response = test_utils_rfc8040.check_device_connection("SPDR-SA1")
+        response = test_utils.check_device_connection("SPDR-SA1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(response['connection-status'], 'connected')
 
     def test_02_getClliNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('clli-network', 'config')
+        response = test_utils.get_ietf_network_request('clli-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         logging.info(response)
         self.assertEqual(response['network'][0]['node'][0]['node-id'], 'NodeSA')
         self.assertEqual(response['network'][0]['node'][0]['org-openroadm-clli-network:clli'], 'NodeSA')
 
     def test_03_getOpenRoadmNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-network', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(response['network'][0]['node'][0]['node-id'], 'SPDR-SA1')
         self.assertEqual(response['network'][0]['node'][0]['supporting-node'][0]['network-ref'], 'clli-network')
@@ -72,13 +72,13 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertEqual(response['network'][0]['node'][0]['org-openroadm-network:ip'], '1.2.3.4')
 
     def test_04_getLinks_OpenroadmTopology(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertNotIn('ietf-network-topology:link', response['network'][0])
 
     def test_05_getNodes_OpenRoadmTopology(self):
         # pylint: disable=redundant-unittest-assert
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('node', response['network'][0])
         self.assertEqual(len(response['network'][0]['node']), 3)
@@ -110,13 +110,13 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertEqual(len(listNode), 0)
 
     def test_06_getLinks_OtnTopology(self):
-        response = test_utils_rfc8040.get_ietf_network_request('otn-topology', 'config')
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertNotIn('ietf-network-topology:link', response['network'][0])
 
     def test_07_getNodes_OtnTopology(self):
         # pylint: disable=redundant-unittest-assert
-        response = test_utils_rfc8040.get_ietf_network_request('otn-topology', 'config')
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['node']), 3)
         listNode = ['SPDR-SA1-XPDR1', 'SPDR-SA1-XPDR2', 'SPDR-SA1-XPDR3']
@@ -203,26 +203,26 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertEqual(len(listNode), 0)
 
     def test_08_disconnect_SPDR_SA1(self):
-        response = test_utils_rfc8040.unmount_device("SPDR-SA1")
+        response = test_utils.unmount_device("SPDR-SA1")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_09_getClliNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('clli-network', 'config')
+        response = test_utils.get_ietf_network_request('clli-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(len(response['network'][0]['node']), 1)
         self.assertEqual(response['network'][0]['node'][0]['org-openroadm-clli-network:clli'], 'NodeSA')
 
     def test_10_getOpenRoadmNetwork(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-network', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-network', 'config')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertNotIn('node', response['network'][0])
 
     def test_11_getNodes_OpenRoadmTopology(self):
-        response = test_utils_rfc8040.get_ietf_network_request('openroadm-topology', 'config')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
         self.assertNotIn('node', response['network'][0])
 
     def test_12_getNodes_OtnTopology(self):
-        response = test_utils_rfc8040.get_ietf_network_request('otn-topology', 'config')
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
         self.assertNotIn('node', response['network'][0])
 
 
index 2d5674bc5b8119632abe81e3a8fd95a585b91402..371e6fb91c7dfb043240b682c3e6b51c119017bd 100644 (file)
@@ -19,7 +19,7 @@ import sys
 sys.path.append('transportpce_tests/common/')
 # pylint: disable=wrong-import-position
 # pylint: disable=import-error
-import test_utils_rfc8040  # nopep8
+import test_utils  # nopep8
 
 
 class TransportPCEPortMappingTesting(unittest.TestCase):
@@ -29,33 +29,33 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
-        cls.processes = test_utils_rfc8040.start_tpce()
-        cls.processes = test_utils_rfc8040.start_sims([('roadmd', cls.NODE_VERSION)])
+        cls.processes = test_utils.start_tpce()
+        cls.processes = test_utils.start_sims([('roadmd', cls.NODE_VERSION)])
 
     @classmethod
     def tearDownClass(cls):
         # pylint: disable=not-an-iterable
         for process in cls.processes:
-            test_utils_rfc8040.shutdown_process(process)
+            test_utils.shutdown_process(process)
         print("all processes killed")
 
     def setUp(self):
         # pylint: disable=consider-using-f-string
         print("execution of {}".format(self.id().split(".")[-1]))
-        time.sleep(10)
+        time.sleep(2)
 
     def test_01_rdm_device_connection(self):
-        response = test_utils_rfc8040.mount_device("ROADM-D1", ('roadmd', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("ROADM-D1", ('roadmd', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_02_rdm_device_connected(self):
-        response = test_utils_rfc8040.check_device_connection("ROADM-D1")
+        response = test_utils.check_device_connection("ROADM-D1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(response['connection-status'], 'connected')
         time.sleep(10)
 
     def test_03_rdm_portmapping_info(self):
-        response = test_utils_rfc8040.get_portmapping_node_info("ROADM-D1")
+        response = test_utils.get_portmapping_node_attr("ROADM-D1", "node-info", None)
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(
             {'node-type': 'rdm',
@@ -69,7 +69,7 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
 
     def test_04_rdm_deg1_lcp(self):
         # pylint: disable=line-too-long
-        response = test_utils_rfc8040.portmapping_mc_capa_request("ROADM-D1", "DEG1-TTP")
+        response = test_utils.get_portmapping_node_attr("ROADM-D1", "mc-capabilities", "DEG1-TTP")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(response['mc-capabilities'],
                       [[{'mc-node-name': 'DEG1-TTP', 'center-freq-granularity': '6.25', 'slot-width-granularity': '12.5'}],
@@ -78,7 +78,7 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
 
     def test_05_rdm_deg2_lcp(self):
         # pylint: disable=line-too-long
-        response = test_utils_rfc8040.portmapping_mc_capa_request("ROADM-D1", "DEG2-TTP")
+        response = test_utils.get_portmapping_node_attr("ROADM-D1", "mc-capabilities", "DEG2-TTP")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(response['mc-capabilities'],
                       [[{'mc-node-name': 'DEG2-TTP', 'center-freq-granularity': '6.25', 'slot-width-granularity': '12.5'}],
@@ -87,7 +87,7 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
 
     def test_06_rdm_srg1_lcp(self):
         # pylint: disable=line-too-long
-        response = test_utils_rfc8040.portmapping_mc_capa_request("ROADM-D1", "SRG1-PP")
+        response = test_utils.get_portmapping_node_attr("ROADM-D1", "mc-capabilities", "SRG1-PP")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(response['mc-capabilities'],
                       [[{'mc-node-name': 'SRG1-PP', 'center-freq-granularity': '6.25', 'slot-width-granularity': '12.5'}],
@@ -96,7 +96,7 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
 
     # Renderer interface creations
     def test_07_device_renderer(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'modulation-format': 'dp-qpsk',
@@ -123,7 +123,7 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
 
     # Get Degree MC interface and check
     def test_08_degree_mc_interface(self):
-        response = test_utils_rfc8040.check_node_attribute_request("ROADM-D1", "interface", "DEG1-TTP-TXRX-mc-749:763")
+        response = test_utils.check_node_attribute_request("ROADM-D1", "interface", "DEG1-TTP-TXRX-mc-749:763")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertDictEqual(
             dict({"name": "DEG1-TTP-TXRX-mc-749:763",
@@ -134,16 +134,15 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
                   "supporting-port": "L1",
                   "type": "org-openroadm-interfaces:mediaChannelTrailTerminationPoint"},
                  **response['interface'][0]), response['interface'][0])
-
         # Check the mc-ttp max and min-freq
-        self.assertIn(response['interface'][0]['org-openroadm-media-channel-interfaces:mc-ttp'],
-                      [{'min-freq': '196.00625', 'max-freq': '196.09375'},
-                       {'min-freq': 196.00625, 'max-freq': 196.09375}])
+        mcttp = response['interface'][0]['org-openroadm-media-channel-interfaces:mc-ttp']
+        self.assertEqual(float(mcttp['min-freq']), 196.00625)
+        self.assertEqual(float(mcttp['max-freq']), 196.09375)
         time.sleep(3)
 
     # get DEG-NMC interface and check
     def test_09_degree_nmc_interface(self):
-        response = test_utils_rfc8040.check_node_attribute_request("ROADM-D1", "interface", "DEG1-TTP-TXRX-nmc-749:763")
+        response = test_utils.check_node_attribute_request("ROADM-D1", "interface", "DEG1-TTP-TXRX-nmc-749:763")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertDictEqual(
             dict({"name": "DEG1-TTP-TXRX-nmc-749:763",
@@ -154,16 +153,14 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
                   "supporting-port": "L1",
                   "type": "org-openroadm-interfaces:networkMediaChannelConnectionTerminationPoint"},
                  **response['interface'][0]), response['interface'][0])
-
-        # Check the mc-ttp max and min-freq
-        self.assertIn(response['interface'][0]['org-openroadm-network-media-channel-interfaces:nmc-ctp'],
-                      [{'frequency': '196.05000', 'width': '80'},
-                       {'frequency': 196.05, 'width': 80}])
+        nmcctp = response['interface'][0]['org-openroadm-network-media-channel-interfaces:nmc-ctp']
+        self.assertEqual(float(nmcctp['frequency']), 196.05)
+        self.assertEqual(float(nmcctp['width']), 80)
         time.sleep(3)
 
     # get SRG-NMC interface
     def test_10_srg_nmc_interface(self):
-        response = test_utils_rfc8040.check_node_attribute_request("ROADM-D1", "interface", "SRG1-PP1-TXRX-nmc-749:763")
+        response = test_utils.check_node_attribute_request("ROADM-D1", "interface", "SRG1-PP1-TXRX-nmc-749:763")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(
             dict({"name": "SRG1-PP1-TXRX-nmc-749:763",
@@ -173,14 +170,14 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
                   "supporting-port": "C1",
                   "type": "org-openroadm-interfaces:networkMediaChannelConnectionTerminationPoint"},
                  **response['interface'][0]), response['interface'][0])
-        self.assertIn(response['interface'][0]['org-openroadm-network-media-channel-interfaces:nmc-ctp'],
-                      [{'frequency': '196.05000', 'width': '80'},
-                       {'frequency': 196.05, 'width': 80}])
+        nmcctp = response['interface'][0]['org-openroadm-network-media-channel-interfaces:nmc-ctp']
+        self.assertEqual(float(nmcctp['frequency']), 196.05)
+        self.assertEqual(float(nmcctp['width']), 80)
         time.sleep(3)
 
     # Create ROADM-connection
     def test_11_roadm_connection(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             "ROADM-D1", "roadm-connections", "SRG1-PP1-TXRX-DEG1-TTP-TXRX-749:763")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual("SRG1-PP1-TXRX-DEG1-TTP-TXRX-749:763",
@@ -195,31 +192,31 @@ class TransportPCEPortMappingTesting(unittest.TestCase):
 
     # delete ROADM connection
     def test_12_delete_roadm_connection(self):
-        response = test_utils_rfc8040.del_node_attribute_request(
+        response = test_utils.del_node_attribute_request(
             "ROADM-D1", "roadm-connections", "SRG1-PP1-TXRX-DEG1-TTP-TXRX-749:763")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
         time.sleep(3)
 
     # Delete NMC SRG interface
     def test_13_delete_srg_interface(self):
-        response = test_utils_rfc8040.del_node_attribute_request("ROADM-D1", "interface", "SRG1-PP1-TXRX-nmc-749:763")
+        response = test_utils.del_node_attribute_request("ROADM-D1", "interface", "SRG1-PP1-TXRX-nmc-749:763")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
         time.sleep(3)
 
     # Delete NMC Degree interface
     def test_14_delete_degree_interface(self):
-        response = test_utils_rfc8040.del_node_attribute_request("ROADM-D1", "interface", "DEG1-TTP-TXRX-nmc-749:763")
+        response = test_utils.del_node_attribute_request("ROADM-D1", "interface", "DEG1-TTP-TXRX-nmc-749:763")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
         time.sleep(3)
 
     # Delete MC Degree interface
     def test_15_delete_degree_interface(self):
-        response = test_utils_rfc8040.del_node_attribute_request("ROADM-D1", "interface", "DEG1-TTP-TXRX-mc-749:763")
+        response = test_utils.del_node_attribute_request("ROADM-D1", "interface", "DEG1-TTP-TXRX-mc-749:763")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
         time.sleep(3)
 
     def test_16_disconnect_ROADM_D1(self):
-        response = test_utils_rfc8040.unmount_device("ROADM-D1")
+        response = test_utils.unmount_device("ROADM-D1")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
 
index dc7680acd3cada617b2268e038a61ed313765515..ad159b9565bc0517e19b5764aa53b61517baf6b2 100644 (file)
@@ -20,7 +20,7 @@ import sys
 sys.path.append('transportpce_tests/common/')
 # pylint: disable=wrong-import-position
 # pylint: disable=import-error
-import test_utils_rfc8040  # nopep8
+import test_utils  # nopep8
 
 
 class TransportPCERendererTesting(unittest.TestCase):
@@ -30,26 +30,26 @@ class TransportPCERendererTesting(unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
-        cls.processes = test_utils_rfc8040.start_tpce()
-        cls.processes = test_utils_rfc8040.start_sims([('xpdra', cls.NODE_VERSION), ('roadma', cls.NODE_VERSION)])
+        cls.processes = test_utils.start_tpce()
+        cls.processes = test_utils.start_sims([('xpdra', cls.NODE_VERSION), ('roadma', cls.NODE_VERSION)])
 
     @classmethod
     def tearDownClass(cls):
         # pylint: disable=not-an-iterable
         for process in cls.processes:
-            test_utils_rfc8040.shutdown_process(process)
+            test_utils.shutdown_process(process)
         print("all processes killed")
 
     def test_01_rdm_device_connected(self):
-        response = test_utils_rfc8040.mount_device("ROADM-A1", ('roadma', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("ROADM-A1", ('roadma', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_02_xpdr_device_connected(self):
-        response = test_utils_rfc8040.mount_device("XPDR-A1", ('xpdra', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("XPDR-A1", ('xpdra', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_03_rdm_portmapping(self):
-        response = test_utils_rfc8040.get_portmapping("ROADM-A1")
+        response = test_utils.get_portmapping_node_attr("ROADM-A1", None, None)
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {'supporting-port': 'L1', 'supporting-circuit-pack-name': '1/0',
@@ -63,14 +63,14 @@ class TransportPCERendererTesting(unittest.TestCase):
             response['nodes'][0]['mapping'])
 
     def test_04_xpdr_portmapping(self):
-        response = test_utils_rfc8040.get_portmapping("XPDR-A1")
+        response = test_utils.get_portmapping_node_attr("XPDR-A1", None, None)
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {'supported-interface-capability': ['org-openroadm-port-types:if-OCH'],
              'supporting-port': '1', 'supporting-circuit-pack-name': '1/0/1-PLUG-NET',
              'logical-connection-point': 'XPDR1-NETWORK1', 'port-qual': 'xpdr-network',
              'port-direction': 'bidirectional', 'connection-map-lcp': 'XPDR1-CLIENT1',
-             'lcp-hash-val': 'AMkDwQ7xTmRI', 'xponder-type': 'tpdr',
+             'lcp-hash-val': 'AMkDwQ7xTmRI', 'xpdr-type': 'tpdr',
              'port-admin-state': 'InService', 'port-oper-state': 'InService'},
             response['nodes'][0]['mapping'])
         self.assertIn(
@@ -79,12 +79,12 @@ class TransportPCERendererTesting(unittest.TestCase):
              'supporting-circuit-pack-name': '1/0/1-PLUG-CLIENT',
              'logical-connection-point': 'XPDR1-CLIENT1', 'port-direction': 'bidirectional',
              'connection-map-lcp': 'XPDR1-NETWORK1', 'port-qual': 'xpdr-client',
-             'lcp-hash-val': 'AJUUr6I5fALj', 'xponder-type': 'tpdr',
+             'lcp-hash-val': 'AJUUr6I5fALj', 'xpdr-type': 'tpdr',
              'port-admin-state': 'InService', 'port-oper-state': 'InService'},
             response['nodes'][0]['mapping'])
 
     def test_05_service_path_create(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'service_test',
@@ -104,7 +104,7 @@ class TransportPCERendererTesting(unittest.TestCase):
         self.assertIn('Interfaces created successfully for nodes: ROADM-A1', response['output']['result'])
 
     def test_06_service_path_create_rdm_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("ROADM-A1", "interface", "DEG1-TTP-TXRX-nmc-713:720")
+        response = test_utils.check_node_attribute_request("ROADM-A1", "interface", "DEG1-TTP-TXRX-nmc-713:720")
         self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
@@ -116,12 +116,12 @@ class TransportPCERendererTesting(unittest.TestCase):
                  'supporting-port': 'L1'
                  }, **response['interface'][0]), response['interface'][0]
         )
-        self.assertIn(response['interface'][0]['org-openroadm-network-media-channel-interfaces:nmc-ctp'],
-                      [{'frequency': '195.8000', 'width': '40'},
-                       {'frequency': 195.8, 'width': 40}])
+        nmcctp = response['interface'][0]['org-openroadm-network-media-channel-interfaces:nmc-ctp']
+        self.assertEqual(float(nmcctp['frequency']), 195.8)
+        self.assertEqual(float(nmcctp['width']), 40)
 
     def test_07_service_path_create_rdm_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("ROADM-A1", "interface", "DEG1-TTP-TXRX-mc-713:720")
+        response = test_utils.check_node_attribute_request("ROADM-A1", "interface", "DEG1-TTP-TXRX-mc-713:720")
         self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
@@ -133,12 +133,12 @@ class TransportPCERendererTesting(unittest.TestCase):
                  'supporting-port': 'L1'
                  }, **response['interface'][0]), response['interface'][0]
         )
-        self.assertIn(response['interface'][0]['org-openroadm-media-channel-interfaces:mc-ttp'],
-                      [{'min-freq': '195.7750', 'max-freq': '195.8250'},
-                       {'min-freq': 195.775, 'max-freq': 195.825}])
+        mcttp = response['interface'][0]['org-openroadm-media-channel-interfaces:mc-ttp']
+        self.assertEqual(float(mcttp['min-freq']), 195.775)
+        self.assertEqual(float(mcttp['max-freq']), 195.825)
 
     def test_08_service_path_create_rdm_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("ROADM-A1", "interface", "SRG1-PP3-TXRX-nmc-713:720")
+        response = test_utils.check_node_attribute_request("ROADM-A1", "interface", "SRG1-PP3-TXRX-nmc-713:720")
         self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
@@ -150,17 +150,17 @@ class TransportPCERendererTesting(unittest.TestCase):
                  'supporting-port': 'C3'
                  }, **response['interface'][0]), response['interface'][0]
         )
-        self.assertIn(response['interface'][0]['org-openroadm-network-media-channel-interfaces:nmc-ctp'],
-                      [{'frequency': '195.8000', 'width': '40'},
-                       {'frequency': 195.8, 'width': 40}])
+        nmcctp = response['interface'][0]['org-openroadm-network-media-channel-interfaces:nmc-ctp']
+        self.assertEqual(float(nmcctp['frequency']), 195.8)
+        self.assertEqual(float(nmcctp['width']), 40)
 
     # -mc supporting interfaces must not be created for SRG, only degrees
     def test_09_service_path_create_rdm_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("ROADM-A1", "interface", "SRG1-PP3-TXRX-mc-713:720")
+        response = test_utils.check_node_attribute_request("ROADM-A1", "interface", "SRG1-PP3-TXRX-mc-713:720")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_10_service_path_create_rdm_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             "ROADM-A1", "roadm-connections", "SRG1-PP3-TXRX-DEG1-TTP-TXRX-713:720")
         self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
@@ -173,7 +173,7 @@ class TransportPCERendererTesting(unittest.TestCase):
         self.assertDictEqual({'dst-if': 'DEG1-TTP-TXRX-nmc-713:720'}, response['roadm-connections'][0]['destination'])
 
     def test_11_service_path_create_xpdr_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "interface", "XPDR1-NETWORK1-713:720")
+        response = test_utils.check_node_attribute_request("XPDR-A1", "interface", "XPDR1-NETWORK1-713:720")
         self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
@@ -185,15 +185,14 @@ class TransportPCERendererTesting(unittest.TestCase):
                  'supporting-port': '1'
                  }, **response['interface'][0]), response['interface'][0]
         )
-        self.assertIn(
-            response['interface'][0]['org-openroadm-optical-channel-interfaces:och'],
-            [{'rate': 'org-openroadm-common-types:R100G', 'transmit-power': '-5',
-              'modulation-format': 'dp-qpsk', 'frequency': '195.8000'},
-             {'rate': 'org-openroadm-common-types:R100G', 'transmit-power': -5,
-              'modulation-format': 'dp-qpsk', 'frequency': 195.8}])
+        intf = response['interface'][0]['org-openroadm-optical-channel-interfaces:och']
+        self.assertEqual(intf['rate'], 'org-openroadm-common-types:R100G')
+        self.assertEqual(intf['modulation-format'], 'dp-qpsk')
+        self.assertEqual(float(intf['frequency']), 195.8)
+        self.assertEqual(float(intf['transmit-power']), -5)
 
     def test_12_service_path_create_xpdr_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "interface", "XPDR1-NETWORK1-OTU")
+        response = test_utils.check_node_attribute_request("XPDR-A1", "interface", "XPDR1-NETWORK1-OTU")
         self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
@@ -211,7 +210,7 @@ class TransportPCERendererTesting(unittest.TestCase):
             response['interface'][0]['org-openroadm-otn-otu-interfaces:otu'])
 
     def test_13_service_path_create_xpdr_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "interface", "XPDR1-NETWORK1-ODU4")
+        response = test_utils.check_node_attribute_request("XPDR-A1", "interface", "XPDR1-NETWORK1-ODU4")
         self.assertEqual(response['status_code'], requests.codes.ok)
         # the 2 following statements replace self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
@@ -231,7 +230,7 @@ class TransportPCERendererTesting(unittest.TestCase):
                              response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
 
     def test_14_service_path_create_xpdr_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "interface", "XPDR1-CLIENT1-ETHERNET")
+        response = test_utils.check_node_attribute_request("XPDR-A1", "interface", "XPDR1-CLIENT1-ETHERNET")
         self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
@@ -249,19 +248,19 @@ class TransportPCERendererTesting(unittest.TestCase):
             response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet'])
 
     def test_15_service_path_create_xpdr_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "circuit-packs", "1%2F0%2F1-PLUG-NET")
+        response = test_utils.check_node_attribute_request("XPDR-A1", "circuit-packs", "1%2F0%2F1-PLUG-NET")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('not-reserved-inuse', response['circuit-packs'][0]['equipment-state'])
         # FIXME: https://jira.opendaylight.org/browse/TRNSPRTPCE-591
 
     def test_16_service_path_create_xpdr_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "circuit-packs", "1%2F0%2F1-PLUG-CLIENT")
+        response = test_utils.check_node_attribute_request("XPDR-A1", "circuit-packs", "1%2F0%2F1-PLUG-CLIENT")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('not-reserved-inuse', response['circuit-packs'][0]['equipment-state'])
         # FIXME: https://jira.opendaylight.org/browse/TRNSPRTPCE-591
 
     def test_17_service_path_delete(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'service_test',
@@ -281,63 +280,63 @@ class TransportPCERendererTesting(unittest.TestCase):
         self.assertDictEqual(response['output'], {'result': 'Request processed', 'success': True})
 
     def test_18_service_path_delete_rdm_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("ROADM-A1", "interface", "DEG1-TTP-TXRX-mc-713:720")
+        response = test_utils.check_node_attribute_request("ROADM-A1", "interface", "DEG1-TTP-TXRX-mc-713:720")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_19_service_path_delete_rdm_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("ROADM-A1", "interface", "DEG1-TTP-TXRX-nmc-713:720")
+        response = test_utils.check_node_attribute_request("ROADM-A1", "interface", "DEG1-TTP-TXRX-nmc-713:720")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_20_service_path_delete_rdm_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("ROADM-A1", "interface", "SRG1-PP3-TXRX-mc-713:720")
+        response = test_utils.check_node_attribute_request("ROADM-A1", "interface", "SRG1-PP3-TXRX-mc-713:720")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_21_service_path_delete_rdm_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("ROADM-A1", "interface", "SRG1-PP3-TXRX-nmc-713:720")
+        response = test_utils.check_node_attribute_request("ROADM-A1", "interface", "SRG1-PP3-TXRX-nmc-713:720")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_22_service_path_delete_rdm_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             "ROADM-A1", "interface", "SRG1-PP3-TXRX-DEG1-TTP-TXRX-713:720")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_23_service_path_delete_rdm_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             "ROADM-A1", "roadm-connections", "SRG1-PP3-TXRX-DEG1-TTP-TXRX-713:720")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_24_service_path_delete_xpdr_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "interface", "XPDR1-NETWORK1-713:720")
+        response = test_utils.check_node_attribute_request("XPDR-A1", "interface", "XPDR1-NETWORK1-713:720")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_25_service_path_delete_xpdr_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "interface", "XPDR1-NETWORK1-OTU")
+        response = test_utils.check_node_attribute_request("XPDR-A1", "interface", "XPDR1-NETWORK1-OTU")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_26_service_path_delete_xpdr_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "interface", "XPDR1-NETWORK1-ODU")
+        response = test_utils.check_node_attribute_request("XPDR-A1", "interface", "XPDR1-NETWORK1-ODU")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_27_service_path_delete_xpdr_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "interface", "XPDR1-CLIENT1-ETHERNET")
+        response = test_utils.check_node_attribute_request("XPDR-A1", "interface", "XPDR1-CLIENT1-ETHERNET")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_28_service_path_delete_xpdr_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "circuit-packs", "1%2F0%2F1-PLUG-NET")
+        response = test_utils.check_node_attribute_request("XPDR-A1", "circuit-packs", "1%2F0%2F1-PLUG-NET")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual('not-reserved-available', response["circuit-packs"][0]['equipment-state'])
 
     def test_29_service_path_delete_xpdr_check(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "circuit-packs", "1%2F0%2F1-PLUG-CLIENT")
+        response = test_utils.check_node_attribute_request("XPDR-A1", "circuit-packs", "1%2F0%2F1-PLUG-CLIENT")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual('not-reserved-available', response["circuit-packs"][0]['equipment-state'])
 
     def test_30_rdm_device_disconnected(self):
-        response = test_utils_rfc8040.unmount_device("ROADM-A1")
+        response = test_utils.unmount_device("ROADM-A1")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_31_xpdr_device_disconnected(self):
-        response = test_utils_rfc8040.unmount_device("XPDR-A1")
+        response = test_utils.unmount_device("XPDR-A1")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
 
index 096fddb8e78de0209f5570d650d354ceab25ce66..ec2f52441cd4c9199c8ea7645a26f93c9b1f68c3 100644 (file)
@@ -20,7 +20,7 @@ import sys
 sys.path.append('transportpce_tests/common/')
 # pylint: disable=wrong-import-position
 # pylint: disable=import-error
-import test_utils_rfc8040  # nopep8
+import test_utils  # nopep8
 
 
 class TransportPCEtesting(unittest.TestCase):
@@ -34,7 +34,7 @@ class TransportPCEtesting(unittest.TestCase):
                            "port-direction": "bidirectional",
                            "port-qual": "xpdr-network",
                            "supporting-circuit-pack-name": "CP1-CFP0",
-                           "xponder-type": "mpdr",
+                           "xpdr-type": "mpdr",
                            'lcp-hash-val': 'Swfw02qXGyI=',
                            'port-admin-state': 'InService',
                            'port-oper-state': 'InService'}
@@ -42,30 +42,30 @@ class TransportPCEtesting(unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
-        cls.processes = test_utils_rfc8040.start_tpce()
-        cls.processes = test_utils_rfc8040.start_sims([('spdra', cls.NODE_VERSION)])
+        cls.processes = test_utils.start_tpce()
+        cls.processes = test_utils.start_sims([('spdra', cls.NODE_VERSION)])
 
     @classmethod
     def tearDownClass(cls):
         # pylint: disable=not-an-iterable
         for process in cls.processes:
-            test_utils_rfc8040.shutdown_process(process)
+            test_utils.shutdown_process(process)
         print("all processes killed")
 
     def setUp(self):
-        time.sleep(5)
+        time.sleep(2)
 
     def test_01_connect_SPDR_SA1(self):
-        response = test_utils_rfc8040.mount_device("SPDR-SA1", ('spdra', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("SPDR-SA1", ('spdra', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
         time.sleep(10)
 
-        response = test_utils_rfc8040.check_device_connection("SPDR-SA1")
+        response = test_utils.check_device_connection("SPDR-SA1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(response['connection-status'], 'connected')
 
     def test_02_get_portmapping_CLIENT4(self):
-        response = test_utils_rfc8040.portmapping_request("SPDR-SA1", "XPDR1-CLIENT4")
+        response = test_utils.get_portmapping_node_attr("SPDR-SA1", "mapping", "XPDR1-CLIENT4")
         self.assertEqual(response['status_code'], requests.codes.ok)
         res_mapping = response['mapping'][0]
         self.assertEqual('CP1-SFP4-P1', res_mapping['supporting-port'])
@@ -81,14 +81,14 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertIn('org-openroadm-port-types:if-10GE', res_mapping['supported-interface-capability'])
 
     def test_03_get_portmapping_NETWORK1(self):
-        response = test_utils_rfc8040.portmapping_request("SPDR-SA1", "XPDR1-NETWORK1")
+        response = test_utils.get_portmapping_node_attr("SPDR-SA1", "mapping", "XPDR1-NETWORK1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             self.NETWORK1_CHECK_DICT,
             response['mapping'])
 
     def test_04_service_path_create_OCH_OTU4(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'service_test',
@@ -112,7 +112,7 @@ class TransportPCEtesting(unittest.TestCase):
              'och-interface-id': ['XPDR1-NETWORK1-761:768']}, response['output']['node-interface'])
 
     def test_05_get_portmapping_NETWORK1(self):
-        response = test_utils_rfc8040.portmapping_request("SPDR-SA1", "XPDR1-NETWORK1")
+        response = test_utils.get_portmapping_node_attr("SPDR-SA1", "mapping", "XPDR1-NETWORK1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.NETWORK1_CHECK_DICT["supporting-otu4"] = "XPDR1-NETWORK1-OTU"
         self.assertIn(
@@ -120,7 +120,7 @@ class TransportPCEtesting(unittest.TestCase):
             response['mapping'])
 
     def test_06_check_interface_och(self):
-        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-NETWORK1-761:768")
+        response = test_utils.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-NETWORK1-761:768")
         self.assertEqual(response['status_code'], requests.codes.ok)
 
         self.assertDictEqual(dict(response['interface'][0], **{'name': 'XPDR1-NETWORK1-761:768',
@@ -130,16 +130,14 @@ class TransportPCEtesting(unittest.TestCase):
                                                                'supporting-port': 'CP1-CFP0-P1'
                                                                }),
                              response['interface'][0])
-
-        self.assertIn(
-            response['interface'][0]['org-openroadm-optical-channel-interfaces:och'],
-            [{'frequency': '196.1000', 'rate': 'org-openroadm-common-types:R100G',
-              'transmit-power': '-5', 'modulation-format': 'dp-qpsk'},
-             {'frequency': 196.1, 'rate': 'org-openroadm-common-types:R100G',
-              'transmit-power': -5, 'modulation-format': 'dp-qpsk'}])
+        intf = response['interface'][0]['org-openroadm-optical-channel-interfaces:och']
+        self.assertEqual(intf['rate'], 'org-openroadm-common-types:R100G')
+        self.assertEqual(intf['modulation-format'], 'dp-qpsk')
+        self.assertEqual(float(intf['frequency']), 196.1)
+        self.assertEqual(float(intf['transmit-power']), -5)
 
     def test_07_check_interface_OTU(self):
-        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-NETWORK1-OTU")
+        response = test_utils.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-NETWORK1-OTU")
         self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-OTU',
                         'administrative-state': 'inService',
@@ -160,7 +158,7 @@ class TransportPCEtesting(unittest.TestCase):
                              response['interface'][0]['org-openroadm-otn-otu-interfaces:otu'])
 
     def test_08_otn_service_path_create_ODU4(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'otn-service-path',
             {
                 'service-name': 'service_ODU4',
@@ -177,7 +175,7 @@ class TransportPCEtesting(unittest.TestCase):
              'odu-interface-id': ['XPDR1-NETWORK1-ODU4']}, response['output']['node-interface'])
 
     def test_09_get_portmapping_NETWORK1(self):
-        response = test_utils_rfc8040.portmapping_request("SPDR-SA1", "XPDR1-NETWORK1")
+        response = test_utils.get_portmapping_node_attr("SPDR-SA1", "mapping", "XPDR1-NETWORK1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.NETWORK1_CHECK_DICT["supporting-odu4"] = "XPDR1-NETWORK1-ODU4"
         self.NETWORK1_CHECK_DICT["supporting-otu4"] = "XPDR1-NETWORK1-OTU"
@@ -186,7 +184,7 @@ class TransportPCEtesting(unittest.TestCase):
             response['mapping'])
 
     def test_10_check_interface_ODU4(self):
-        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-NETWORK1-ODU4")
+        response = test_utils.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-NETWORK1-ODU4")
         self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU4', 'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0', 'supporting-interface': 'XPDR1-NETWORK1-OTU',
@@ -207,7 +205,7 @@ class TransportPCEtesting(unittest.TestCase):
             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
 
     def test_11_otn_service_path_create_10GE(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'otn-service-path',
             {
                 'service-name': 'service1',
@@ -226,11 +224,11 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertIn('XPDR1-CLIENT4-ODU2e-x-XPDR1-NETWORK1-ODU2e',
                       response['output']['node-interface'][0]['connection-id'])
         self.assertIn('XPDR1-CLIENT4-ETHERNET10G', response['output']['node-interface'][0]['eth-interface-id'])
-        self.assertIn('XPDR1-NETWORK1-ODU2e', response['output']['node-interface'][0]['odu-interface-id'])
-        self.assertIn('XPDR1-CLIENT4-ODU2e', response['output']['node-interface'][0]['odu-interface-id'])
+        self.assertIn('XPDR1-NETWORK1-ODU2e:service1', response['output']['node-interface'][0]['odu-interface-id'])
+        self.assertIn('XPDR1-CLIENT4-ODU2e:service1', response['output']['node-interface'][0]['odu-interface-id'])
 
     def test_12_check_interface_10GE_CLIENT(self):
-        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-CLIENT4-ETHERNET10G")
+        response = test_utils.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-CLIENT4-ETHERNET10G")
         self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict = {'name': 'XPDR1-CLIENT4-ETHERNET10G',
                       'administrative-state': 'inService',
@@ -243,11 +241,11 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertEqual(10000, response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']['speed'])
 
     def test_13_check_interface_ODU2E_CLIENT(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
-            "SPDR-SA1", "interface", "XPDR1-CLIENT4-ODU2e")
+        response = test_utils.check_node_attribute_request(
+            "SPDR-SA1", "interface", "XPDR1-CLIENT4-ODU2e:service1")
         self.assertEqual(response['status_code'], requests.codes.ok)
 
-        input_dict_1 = {'name': 'XPDR1-CLIENT4-ODU2e',
+        input_dict_1 = {'name': 'XPDR1-CLIENT4-ODU2e:service1',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-SFP4',
                         'supporting-interface': 'XPDR1-CLIENT4-ETHERNET10G',
@@ -268,10 +266,10 @@ class TransportPCEtesting(unittest.TestCase):
             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
 
     def test_14_check_interface_ODU2E_NETWORK(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
-            "SPDR-SA1", "interface", "XPDR1-NETWORK1-ODU2e")
+        response = test_utils.check_node_attribute_request(
+            "SPDR-SA1", "interface", "XPDR1-NETWORK1-ODU2e:service1")
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e', 'administrative-state': 'inService',
+        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e:service1', 'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
                         'supporting-interface': 'XPDR1-NETWORK1-ODU4',
                         'type': 'org-openroadm-interfaces:otnOdu',
@@ -299,7 +297,7 @@ class TransportPCEtesting(unittest.TestCase):
                           'parent-odu-allocation']['trib-slots'])
 
     def test_15_check_ODU2E_connection(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             "SPDR-SA1", "odu-connection", "XPDR1-CLIENT4-ODU2e-x-XPDR1-NETWORK1-ODU2e")
         self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {
@@ -310,13 +308,13 @@ class TransportPCEtesting(unittest.TestCase):
 
         self.assertDictEqual(dict(response['odu-connection'][0], **input_dict_1),
                              response['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e'},
+        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e:service1'},
                              response['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR1-CLIENT4-ODU2e'},
+        self.assertDictEqual({'src-if': 'XPDR1-CLIENT4-ODU2e:service1'},
                              response['odu-connection'][0]['source'])
 
     def test_16_otn_service_path_delete_10GE(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'otn-service-path',
             {
                 'service-name': 'service1',
@@ -333,26 +331,26 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertTrue(response['output']['success'])
 
     def test_17_check_no_ODU2E_connection(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             "SPDR-SA1", "odu-connection", "XPDR1-CLIENT4-ODU2e-x-XPDR1-NETWORK1-ODU2e")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_18_check_no_interface_ODU2E_NETWORK(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
-            "SPDR-SA1", "interface", "XPDR1-NETWORK1-ODU2e")
+        response = test_utils.check_node_attribute_request(
+            "SPDR-SA1", "interface", "XPDR1-NETWORK1-ODU2e:service1")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_19_check_no_interface_ODU2E_CLIENT(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
-            "SPDR-SA1", "interface", "XPDR1-CLIENT4-ODU2e")
+        response = test_utils.check_node_attribute_request(
+            "SPDR-SA1", "interface", "XPDR1-CLIENT4-ODU2e:service1")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_20_check_no_interface_10GE_CLIENT(self):
-        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-CLIENT4-ETHERNET10G")
+        response = test_utils.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-CLIENT4-ETHERNET10G")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_21_otn_service_path_delete_ODU4(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'otn-service-path',
             {
                 'service-name': 'service_ODU4',
@@ -366,11 +364,11 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertTrue(response['output']['success'])
 
     def test_22_check_no_interface_ODU4(self):
-        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-NETWORK1-ODU4")
+        response = test_utils.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-NETWORK1-ODU4")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_23_service_path_delete_OCH_OTU4(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'service_test',
@@ -390,15 +388,15 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertTrue(response['output']['success'])
 
     def test_24_check_no_interface_OTU4(self):
-        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-NETWORK1-OTU")
+        response = test_utils.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-NETWORK1-OTU")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_25_check_no_interface_OCH(self):
-        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-NETWORK1-1")
+        response = test_utils.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-NETWORK1-1")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_26_disconnect_SPDR_SA1(self):
-        response = test_utils_rfc8040.unmount_device("SPDR-SA1")
+        response = test_utils.unmount_device("SPDR-SA1")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
 
index ecb7a9d3b784f1c4817a70daafc56ab845984899..c3a1dfdebcfd40d52eb93337db4d97dcdc38ddd3 100644 (file)
@@ -20,7 +20,7 @@ import sys
 sys.path.append('transportpce_tests/common/')
 # pylint: disable=wrong-import-position
 # pylint: disable=import-error
-import test_utils_rfc8040  # nopep8
+import test_utils  # nopep8
 
 
 class TransportPCEtesting(unittest.TestCase):
@@ -30,42 +30,42 @@ class TransportPCEtesting(unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
-        cls.processes = test_utils_rfc8040.start_tpce()
-        cls.processes = test_utils_rfc8040.start_sims([('spdra', cls.NODE_VERSION),
-                                                       ('spdrc', cls.NODE_VERSION)])
+        cls.processes = test_utils.start_tpce()
+        cls.processes = test_utils.start_sims([('spdra', cls.NODE_VERSION),
+                                               ('spdrc', cls.NODE_VERSION)])
 
     @classmethod
     def tearDownClass(cls):
         # pylint: disable=not-an-iterable
         for process in cls.processes:
-            test_utils_rfc8040.shutdown_process(process)
+            test_utils.shutdown_process(process)
         print("all processes killed")
 
     def setUp(self):
-        time.sleep(5)
+        time.sleep(2)
 
     def test_01_connect_SPDR_SA1(self):
-        response = test_utils_rfc8040.mount_device("SPDR-SA1", ('spdra', self.NODE_VERSION))
+        response = test_utils.mount_device("SPDR-SA1", ('spdra', self.NODE_VERSION))
         self.assertEqual(response.status_code, requests.codes.created,
-                         test_utils_rfc8040.CODE_SHOULD_BE_201)
-        time.sleep(10)
+                         test_utils.CODE_SHOULD_BE_201)
+        time.sleep(5)
 
-        response = test_utils_rfc8040.check_device_connection("SPDR-SA1")
+        response = test_utils.check_device_connection("SPDR-SA1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(response['connection-status'], 'connected')
 
     def test_02_connect_SPDR_SC1(self):
-        response = test_utils_rfc8040.mount_device("SPDR-SC1", ('spdrc', self.NODE_VERSION))
+        response = test_utils.mount_device("SPDR-SC1", ('spdrc', self.NODE_VERSION))
         self.assertEqual(response.status_code, requests.codes.created,
-                         test_utils_rfc8040.CODE_SHOULD_BE_201)
-        time.sleep(10)
+                         test_utils.CODE_SHOULD_BE_201)
+        time.sleep(5)
 
-        response = test_utils_rfc8040.check_device_connection("SPDR-SC1")
+        response = test_utils.check_device_connection("SPDR-SC1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(response['connection-status'], 'connected')
 
     def test_03_service_create_OTU4(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-renderer', 'service-implementation-request',
             {
                 'service-name': 'SPDRA-SPDRC-OTU4-ODU4',
@@ -166,10 +166,11 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Operation Successful',
                       response['output']['configuration-response-common']['response-message'])
+        time.sleep(2)
 
     # Test OCH-OTU interfaces on SPDR-A1
     def test_04_check_interface_och(self):
-        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-NETWORK1-761:768")
+        response = test_utils.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-NETWORK1-761:768")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertDictEqual(dict({'name': 'XPDR1-NETWORK1-761:768',
                                    'administrative-state': 'inService',
@@ -178,15 +179,14 @@ class TransportPCEtesting(unittest.TestCase):
                                    'supporting-port': 'CP1-CFP0-P1'
                                    }, **response['interface'][0]),
                              response['interface'][0])
-        self.assertIn(
-            response['interface'][0]['org-openroadm-optical-channel-interfaces:och'],
-            [{'frequency': '196.1000', 'rate': 'org-openroadm-common-types:R100G',
-              'transmit-power': '-5', 'modulation-format': 'dp-qpsk'},
-             {'frequency': 196.1, 'rate': 'org-openroadm-common-types:R100G',
-              'transmit-power': -5, 'modulation-format': 'dp-qpsk'}])
+        intf = response['interface'][0]['org-openroadm-optical-channel-interfaces:och']
+        self.assertEqual(intf['rate'], 'org-openroadm-common-types:R100G')
+        self.assertEqual(intf['modulation-format'], 'dp-qpsk')
+        self.assertEqual(float(intf['frequency']), 196.1)
+        self.assertEqual(float(intf['transmit-power']), -5)
 
     def test_05_check_interface_OTU(self):
-        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-NETWORK1-OTU")
+        response = test_utils.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-NETWORK1-OTU")
         self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-OTU',
                         'administrative-state': 'inService',
@@ -209,7 +209,7 @@ class TransportPCEtesting(unittest.TestCase):
 
     # Test OCH-OTU interfaces on SPDR-C1
     def test_06_check_interface_och(self):
-        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SC1", "interface", "XPDR1-NETWORK1-761:768")
+        response = test_utils.check_node_attribute_request("SPDR-SC1", "interface", "XPDR1-NETWORK1-761:768")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertDictEqual(dict({'name': 'XPDR1-NETWORK1-1',
                                    'administrative-state': 'inService',
@@ -218,15 +218,14 @@ class TransportPCEtesting(unittest.TestCase):
                                    'supporting-port': 'CP1-CFP0-P1'
                                    }, **response['interface'][0]),
                              response['interface'][0])
-        self.assertIn(
-            response['interface'][0]['org-openroadm-optical-channel-interfaces:och'],
-            [{'frequency': '196.1000', 'rate': 'org-openroadm-common-types:R100G',
-              'transmit-power': '-5', 'modulation-format': 'dp-qpsk'},
-             {'frequency': 196.1, 'rate': 'org-openroadm-common-types:R100G',
-              'transmit-power': -5, 'modulation-format': 'dp-qpsk'}])
+        intf = response['interface'][0]['org-openroadm-optical-channel-interfaces:och']
+        self.assertEqual(intf['rate'], 'org-openroadm-common-types:R100G')
+        self.assertEqual(intf['modulation-format'], 'dp-qpsk')
+        self.assertEqual(float(intf['frequency']), 196.1)
+        self.assertEqual(float(intf['transmit-power']), -5)
 
     def test_07_check_interface_OTU(self):
-        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SC1", "interface", "XPDR1-NETWORK1-OTU")
+        response = test_utils.check_node_attribute_request("SPDR-SC1", "interface", "XPDR1-NETWORK1-OTU")
         self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-OTU',
                         'administrative-state': 'inService',
@@ -249,7 +248,7 @@ class TransportPCEtesting(unittest.TestCase):
 
     # Test creation of ODU4 service
     def test_08_service_create_ODU4(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-renderer', 'service-implementation-request',
             {
                 'service-name':
@@ -345,10 +344,11 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Operation Successful',
                       response['output']['configuration-response-common']['response-message'])
+        time.sleep(2)
 
     # Test ODU4 interfaces on SPDR-A1 and SPDR-C1
     def test_09_check_interface_ODU4(self):
-        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-NETWORK1-ODU4")
+        response = test_utils.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-NETWORK1-ODU4")
         self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU4',
                         'administrative-state': 'inService',
@@ -375,7 +375,7 @@ class TransportPCEtesting(unittest.TestCase):
             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
 
     def test_10_check_interface_ODU4(self):
-        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SC1", "interface", "XPDR1-NETWORK1-ODU4")
+        response = test_utils.check_node_attribute_request("SPDR-SC1", "interface", "XPDR1-NETWORK1-ODU4")
         self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU4',
                         'administrative-state': 'inService',
@@ -403,7 +403,7 @@ class TransportPCEtesting(unittest.TestCase):
 
     # Test creation of 10G service
     def test_11_service_create_10GE(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-renderer', 'service-implementation-request',
             {
                 'service-name': 'SPDRA-SPDRC-10G',
@@ -501,10 +501,11 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Operation Successful',
                       response['output']['configuration-response-common']['response-message'])
+        time.sleep(2)
 
     # Test the interfaces on SPDR-A1
     def test_12_check_interface_10GE_CLIENT(self):
-        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-CLIENT1-ETHERNET10G")
+        response = test_utils.check_node_attribute_request("SPDR-SA1", "interface", "XPDR1-CLIENT1-ETHERNET10G")
         self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict = {'name': 'XPDR1-CLIENT1-ETHERNET10G',
                       'administrative-state': 'inService',
@@ -517,10 +518,10 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertEqual(response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']['speed'], 10000)
 
     def test_13_check_interface_ODU2E_CLIENT(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
-            "SPDR-SA1", "interface", "XPDR1-CLIENT1-ODU2e")
+        response = test_utils.check_node_attribute_request(
+            "SPDR-SA1", "interface", "XPDR1-CLIENT1-ODU2e:SPDRA-SPDRC-10G")
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e',
+        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e:SPDRA-SPDRC-10G',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-SFP4',
                         'supporting-interface': 'XPDR1-CLIENT1-ETHERNET10G',
@@ -541,7 +542,7 @@ class TransportPCEtesting(unittest.TestCase):
             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
 
     def test_14_check_ODU2E_connection(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             "SPDR-SA1",
             "odu-connection", "XPDR1-CLIENT1-ODU2e-x-XPDR1-NETWORK1-ODU2e")
         self.assertEqual(response['status_code'], requests.codes.ok)
@@ -552,16 +553,16 @@ class TransportPCEtesting(unittest.TestCase):
         }
         self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
                              response['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e'},
+        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e:SPDRA-SPDRC-10G'},
                              response['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e'},
+        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e:SPDRA-SPDRC-10G'},
                              response['odu-connection'][0]['source'])
 
     def test_15_check_interface_ODU2E_NETWORK(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
-            "SPDR-SA1", "interface", "XPDR1-NETWORK1-ODU2e")
+        response = test_utils.check_node_attribute_request(
+            "SPDR-SA1", "interface", "XPDR1-NETWORK1-ODU2e:SPDRA-SPDRC-10G")
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e',
+        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e-SPDRA:SPDRC-10G',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
                         'supporting-interface': 'XPDR1-NETWORK1-ODU4',
@@ -589,10 +590,10 @@ class TransportPCEtesting(unittest.TestCase):
 
     # Test the interfaces on SPDR-C1
     def test_16_check_interface_ODU2E_NETWORK(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
-            "SPDR-SC1", "interface", "XPDR1-NETWORK1-ODU2e")
+        response = test_utils.check_node_attribute_request(
+            "SPDR-SC1", "interface", "XPDR1-NETWORK1-ODU2e:SPDRA-SPDRC-10G")
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e',
+        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e:SPDRA-SPDRC-10G',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
                         'supporting-interface': 'XPDR1-NETWORK1-ODU4',
@@ -619,7 +620,7 @@ class TransportPCEtesting(unittest.TestCase):
                           'parent-odu-allocation']['trib-slots'])
 
     def test_17_check_interface_10GE_CLIENT(self):
-        response = test_utils_rfc8040.check_node_attribute_request("SPDR-SC1", "interface", "XPDR1-CLIENT1-ETHERNET10G")
+        response = test_utils.check_node_attribute_request("SPDR-SC1", "interface", "XPDR1-CLIENT1-ETHERNET10G")
         self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict = {'name': 'XPDR1-CLIENT1-ETHERNET10G',
                       'administrative-state': 'inService',
@@ -632,10 +633,10 @@ class TransportPCEtesting(unittest.TestCase):
         self.assertEqual(response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']['speed'], 10000)
 
     def test_18_check_interface_ODU2E_CLIENT(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
-            "SPDR-SC1", "interface", "XPDR1-CLIENT1-ODU2e")
+        response = test_utils.check_node_attribute_request(
+            "SPDR-SC1", "interface", "XPDR1-CLIENT1-ODU2e:SPDRA-SPDRC-10G")
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e',
+        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e-SPDRA-SPDRC-10G',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-SFP4',
                         'supporting-interface': 'XPDR1-CLIENT1-ETHERNET10G',
@@ -655,7 +656,7 @@ class TransportPCEtesting(unittest.TestCase):
             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
 
     def test_19_check_ODU2E_connection(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             "SPDR-SC1",
             "odu-connection", "XPDR1-CLIENT1-ODU2e-x-XPDR1-NETWORK1-ODU2e")
         self.assertEqual(response['status_code'], requests.codes.ok)
@@ -666,16 +667,16 @@ class TransportPCEtesting(unittest.TestCase):
         }
         self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
                              response['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e'},
+        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e:SPDRA-SPDRC-10G'},
                              response['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e'},
+        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e:SPDRA-SPDRC-10G'},
                              response['odu-connection'][0]['source'])
 
     def test_20_check_interface_ODU2E_NETWORK(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
-            "SPDR-SC1", "interface", "XPDR1-NETWORK1-ODU2e")
+        response = test_utils.check_node_attribute_request(
+            "SPDR-SC1", "interface", "XPDR1-NETWORK1-ODU2e:SPDRA-SPDRC-10G")
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e',
+        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e:SPDRA-SPDRC-10G',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
                         'supporting-interface': 'XPDR1-NETWORK1-ODU4',
@@ -707,11 +708,11 @@ class TransportPCEtesting(unittest.TestCase):
     # TODO: Delete interfaces (SPDR-A1, SPDR-C1)
 
     def test_21_disconnect_SPDR_SA1(self):
-        response = test_utils_rfc8040.unmount_device("SPDR-SA1")
+        response = test_utils.unmount_device("SPDR-SA1")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_22_disconnect_SPDR_SC1(self):
-        response = test_utils_rfc8040.unmount_device("SPDR-SC1")
+        response = test_utils.unmount_device("SPDR-SC1")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
 
index b8e3c9d9355cb06b866ac388932cc2904ece3244..55c4eaf52d31ebdf7bc927f9555eebb41cc9f9ff 100644 (file)
@@ -20,7 +20,7 @@ import sys
 sys.path.append('transportpce_tests/common/')
 # pylint: disable=wrong-import-position
 # pylint: disable=import-error
-import test_utils_rfc8040  # nopep8
+import test_utils  # nopep8
 
 
 class TransportOlmTesting(unittest.TestCase):
@@ -30,17 +30,17 @@ class TransportOlmTesting(unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
-        cls.processes = test_utils_rfc8040.start_tpce()
-        cls.processes = test_utils_rfc8040.start_sims([('xpdra', cls.NODE_VERSION),
-                                                       ('roadma', cls.NODE_VERSION),
-                                                       ('roadmc', cls.NODE_VERSION),
-                                                       ('xpdrc', cls.NODE_VERSION)])
+        cls.processes = test_utils.start_tpce()
+        cls.processes = test_utils.start_sims([('xpdra', cls.NODE_VERSION),
+                                               ('roadma', cls.NODE_VERSION),
+                                               ('roadmc', cls.NODE_VERSION),
+                                               ('xpdrc', cls.NODE_VERSION)])
 
     @classmethod
     def tearDownClass(cls):
         # pylint: disable=not-an-iterable
         for process in cls.processes:
-            test_utils_rfc8040.shutdown_process(process)
+            test_utils.shutdown_process(process)
         print("all processes killed")
 
     def setUp(self):
@@ -49,51 +49,51 @@ class TransportOlmTesting(unittest.TestCase):
         time.sleep(1)
 
     def test_01_xpdrA_device_connected(self):
-        response = test_utils_rfc8040.mount_device("XPDR-A1", ('xpdra', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("XPDR-A1", ('xpdra', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_02_xpdrC_device_connected(self):
-        response = test_utils_rfc8040.mount_device("XPDR-C1", ('xpdrc', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("XPDR-C1", ('xpdrc', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_03_rdmA_device_connected(self):
-        response = test_utils_rfc8040.mount_device("ROADM-A1", ('roadma', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("ROADM-A1", ('roadma', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_04_rdmC_device_connected(self):
-        response = test_utils_rfc8040.mount_device("ROADM-C1", ('roadmc', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils_rfc8040.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("ROADM-C1", ('roadmc', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
-    def test_05_connect_xprdA_to_roadmA(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+    def test_05_connect_xpdrA_to_roadmA(self):
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-networkutils', 'init-xpdr-rdm-links',
             {'links-input': {'xpdr-node': 'XPDR-A1', 'xpdr-num': '1', 'network-num': '1',
                              'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
         self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_06_connect_roadmA_to_xpdrA(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-networkutils', 'init-rdm-xpdr-links',
             {'links-input': {'xpdr-node': 'XPDR-A1', 'xpdr-num': '1', 'network-num': '1',
                              'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
         self.assertEqual(response['status_code'], requests.codes.ok)
 
-    def test_07_connect_xprdC_to_roadmC(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+    def test_07_connect_xpdrC_to_roadmC(self):
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-networkutils', 'init-xpdr-rdm-links',
             {'links-input': {'xpdr-node': 'XPDR-C1', 'xpdr-num': '1', 'network-num': '1',
                              'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
         self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_08_connect_roadmC_to_xpdrC(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-networkutils', 'init-rdm-xpdr-links',
             {'links-input': {'xpdr-node': 'XPDR-C1', 'xpdr-num': '1', 'network-num': '1',
                              'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
         self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_09_create_OTS_ROADMA(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'create-ots-oms',
             {
                 'node-id': 'ROADM-A1',
@@ -102,7 +102,7 @@ class TransportOlmTesting(unittest.TestCase):
         self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_10_create_OTS_ROADMC(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'create-ots-oms',
             {
                 'node-id': 'ROADM-C1',
@@ -111,7 +111,7 @@ class TransportOlmTesting(unittest.TestCase):
         self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_11_get_PM_ROADMA(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-olm', 'get-pm',
             {
                 'node-id': 'ROADM-A1',
@@ -123,21 +123,19 @@ class TransportOlmTesting(unittest.TestCase):
 
             })
         self.assertEqual(response['status_code'], requests.codes.ok)
-        self.assertIn({
-            'pmparameter-name': 'OpticalPowerOutput',
-            'pmparameter-value': '2.5'
-        }, response['output']['measurements'])
-        self.assertIn({
-            'pmparameter-name': 'OpticalReturnLoss',
-            'pmparameter-value': '40'
-        }, response['output']['measurements'])
-        self.assertIn({
-            'pmparameter-name': 'OpticalPowerInput',
-            'pmparameter-value': '-21.1'
-        }, response['output']['measurements'])
+        measures = {}
+        for measure in response['output']['measurements']:
+            if bool(measure['pmparameter-name']) and bool(measure['pmparameter-value']):
+                measures[measure['pmparameter-name']] = float(measure['pmparameter-value'])
+        self.assertIn('OpticalPowerOutput', list(measures.keys()))
+        self.assertIn('OpticalReturnLoss', list(measures.keys()))
+        self.assertIn('OpticalPowerInput', list(measures.keys()))
+        self.assertEqual(measures['OpticalPowerOutput'], 2.5)
+        self.assertEqual(measures['OpticalReturnLoss'], 40)
+        self.assertEqual(measures['OpticalPowerInput'], -21.1)
 
     def test_12_get_PM_ROADMC(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-olm', 'get-pm',
             {
                 'node-id': 'ROADM-C1',
@@ -148,21 +146,19 @@ class TransportOlmTesting(unittest.TestCase):
                 }
             })
         self.assertEqual(response['status_code'], requests.codes.ok)
-        self.assertIn({
-            'pmparameter-name': 'OpticalPowerOutput',
-            'pmparameter-value': '4.6'
-        }, response['output']['measurements'])
-        self.assertIn({
-            'pmparameter-name': 'OpticalReturnLoss',
-            'pmparameter-value': '49.1'
-        }, response['output']['measurements'])
-        self.assertIn({
-            'pmparameter-name': 'OpticalPowerInput',
-            'pmparameter-value': '-15.1'
-        }, response['output']['measurements'])
+        measures = {}
+        for measure in response['output']['measurements']:
+            if bool(measure['pmparameter-name']) and bool(measure['pmparameter-value']):
+                measures[measure['pmparameter-name']] = float(measure['pmparameter-value'])
+        self.assertIn('OpticalPowerOutput', list(measures.keys()))
+        self.assertIn('OpticalReturnLoss', list(measures.keys()))
+        self.assertIn('OpticalPowerInput', list(measures.keys()))
+        self.assertEqual(measures['OpticalPowerOutput'], 4.6)
+        self.assertEqual(measures['OpticalReturnLoss'], 49.1)
+        self.assertEqual(measures['OpticalPowerInput'], -15.1)
 
     def test_13_calculate_span_loss_base_ROADMA_ROADMC(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-olm', 'calculate-spanloss-base',
             {
                 'src-type': 'link',
@@ -178,7 +174,7 @@ class TransportOlmTesting(unittest.TestCase):
         time.sleep(5)
 
     def test_14_calculate_span_loss_base_all(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-olm', 'calculate-spanloss-base',
             {
                 'src-type': 'all'
@@ -197,21 +193,21 @@ class TransportOlmTesting(unittest.TestCase):
         time.sleep(5)
 
     def test_15_get_OTS_DEG2_TTP_TXRX_ROADMA(self):
-        response = test_utils_rfc8040.check_node_attribute2_request(
+        response = test_utils.check_node_attribute2_request(
             'ROADM-A1', 'interface', 'OTS-DEG2-TTP-TXRX', 'org-openroadm-optical-transport-interfaces:ots')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(float(response['org-openroadm-optical-transport-interfaces:ots']['span-loss-transmit']), 17.6)
         self.assertEqual(float(response['org-openroadm-optical-transport-interfaces:ots']['span-loss-receive']), 25.7)
 
     def test_16_get_OTS_DEG1_TTP_TXRX_ROADMC(self):
-        response = test_utils_rfc8040.check_node_attribute2_request(
+        response = test_utils.check_node_attribute2_request(
             'ROADM-C1', 'interface', 'OTS-DEG1-TTP-TXRX', 'org-openroadm-optical-transport-interfaces:ots')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(float(response['org-openroadm-optical-transport-interfaces:ots']['span-loss-transmit']), 25.7)
         self.assertEqual(float(response['org-openroadm-optical-transport-interfaces:ots']['span-loss-receive']), 17.6)
 
     def test_17_servicePath_create_AToZ(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'test',
@@ -239,7 +235,7 @@ class TransportOlmTesting(unittest.TestCase):
         time.sleep(10)
 
     def test_18_servicePath_create_ZToA(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'test',
@@ -267,7 +263,7 @@ class TransportOlmTesting(unittest.TestCase):
         time.sleep(10)
 
     def test_19_service_power_setup_XPDRA_XPDRC(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-olm', 'service-power-setup',
             {
                 'service-name': 'test',
@@ -301,27 +297,27 @@ class TransportOlmTesting(unittest.TestCase):
         self.assertIn('Success', response['output']['result'])
 
     def test_20_get_interface_XPDRA_XPDR1_NETWORK1(self):
-        response = test_utils_rfc8040.check_node_attribute2_request(
+        response = test_utils.check_node_attribute2_request(
             'XPDR-A1', 'interface', 'XPDR1-NETWORK1-761:768', 'org-openroadm-optical-channel-interfaces:och')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(float(response['org-openroadm-optical-channel-interfaces:och']['transmit-power']), -5)
         self.assertEqual(float(response['org-openroadm-optical-channel-interfaces:och']['frequency']), 196.1)
 
     def test_21_get_roadmconnection_ROADMA(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             'ROADM-A1', 'roadm-connections', 'SRG1-PP1-TXRX-DEG2-TTP-TXRX-761:768')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual("gainLoss", response['roadm-connections'][0]['opticalControlMode'])
         self.assertEqual(float(response['roadm-connections'][0]['target-output-power']), 0.21)
 
     def test_22_get_roadmconnection_ROADMC(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             'ROADM-C1', 'roadm-connections', 'DEG1-TTP-TXRX-SRG1-PP1-TXRX-761:768')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual("power", response['roadm-connections'][0]['opticalControlMode'])
 
     def test_23_service_power_setup_XPDRC_XPDRA(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-olm', 'service-power-setup',
             {
                 'service-name': 'test',
@@ -355,21 +351,21 @@ class TransportOlmTesting(unittest.TestCase):
         self.assertIn('Success', response['output']['result'])
 
     def test_24_get_interface_XPDRC_XPDR1_NETWORK1(self):
-        response = test_utils_rfc8040.check_node_attribute2_request(
+        response = test_utils.check_node_attribute2_request(
             'XPDR-C1', 'interface', 'XPDR1-NETWORK1-761:768', 'org-openroadm-optical-channel-interfaces:och')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(float(response['org-openroadm-optical-channel-interfaces:och']['transmit-power']), -5)
         self.assertEqual(float(response['org-openroadm-optical-channel-interfaces:och']['frequency']), 196.1)
 
     def test_25_get_roadmconnection_ROADMC(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             'ROADM-C1', 'roadm-connections', 'SRG1-PP1-TXRX-DEG1-TTP-TXRX-761:768')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual("gainLoss", response['roadm-connections'][0]['opticalControlMode'])
         self.assertEqual(float(response['roadm-connections'][0]['target-output-power']), 2.0)
 
     def test_26_service_power_turndown_XPDRA_XPDRC(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-olm', 'service-power-turndown',
             {
                 'service-name': 'test',
@@ -403,20 +399,20 @@ class TransportOlmTesting(unittest.TestCase):
         self.assertIn('Success', response['output']['result'])
 
     def test_27_get_roadmconnection_ROADMA(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             'ROADM-A1', 'roadm-connections', 'SRG1-PP1-TXRX-DEG2-TTP-TXRX-761:768')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual("off", response['roadm-connections'][0]['opticalControlMode'])
         self.assertEqual(float(response['roadm-connections'][0]['target-output-power']), -60)
 
     def test_28_get_roadmconnection_ROADMC(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             'ROADM-C1', 'roadm-connections', 'DEG1-TTP-TXRX-SRG1-PP1-TXRX-761:768')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual("off", response['roadm-connections'][0]['opticalControlMode'])
 
     def test_29_servicePath_delete_AToZ(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'test',
@@ -444,7 +440,7 @@ class TransportOlmTesting(unittest.TestCase):
         time.sleep(10)
 
     def test_30_servicePath_delete_ZToA(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'test',
@@ -471,24 +467,24 @@ class TransportOlmTesting(unittest.TestCase):
         self.assertIn('Request processed', response['output']['result'])
         time.sleep(10)
 
-   #"""to test case where SRG where the xpdr is connected to has no optical range data"""
+   # """to test case where SRG where the xpdr is connected to has no optical range data"""
 
-    def test_31_connect_xprdA_to_roadmA(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+    def test_31_connect_xpdrA_to_roadmA(self):
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-networkutils', 'init-xpdr-rdm-links',
             {'links-input': {'xpdr-node': 'XPDR-A1', 'xpdr-num': '1', 'network-num': '2',
                              'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
         self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_32_connect_roadmA_to_xpdrA(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-networkutils', 'init-rdm-xpdr-links',
             {'links-input': {'xpdr-node': 'XPDR-A1', 'xpdr-num': '1', 'network-num': '2',
                              'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
         self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_33_servicePath_create_AToZ(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'test2',
@@ -512,14 +508,14 @@ class TransportOlmTesting(unittest.TestCase):
         time.sleep(10)
 
     def test_34_get_interface_XPDRA_XPDR1_NETWORK2(self):
-        response = test_utils_rfc8040.check_node_attribute2_request(
+        response = test_utils.check_node_attribute2_request(
             'XPDR-A1', 'interface', 'XPDR1-NETWORK2-753:760', 'org-openroadm-optical-channel-interfaces:och')
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(float(response['org-openroadm-optical-channel-interfaces:och']['transmit-power']), -5)
 #         self.assertEqual(2, response['org-openroadm-optical-channel-interfaces:och']['wavelength-number'])
 
     def test_35_servicePath_delete_AToZ(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'test2',
@@ -543,15 +539,15 @@ class TransportOlmTesting(unittest.TestCase):
         time.sleep(10)
 
     def test_36_xpdrA_device_disconnected(self):
-        response = test_utils_rfc8040.unmount_device("XPDR-A1")
+        response = test_utils.unmount_device("XPDR-A1")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_37_xpdrC_device_disconnected(self):
-        response = test_utils_rfc8040.unmount_device("XPDR-C1")
+        response = test_utils.unmount_device("XPDR-C1")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_38_calculate_span_loss_current(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-olm', 'calculate-spanloss-current',
             None)
         self.assertEqual(response['status_code'], requests.codes.ok)
@@ -560,11 +556,11 @@ class TransportOlmTesting(unittest.TestCase):
         time.sleep(5)
 
     def test_39_rdmA_device_disconnected(self):
-        response = test_utils_rfc8040.unmount_device("ROADM-A1")
+        response = test_utils.unmount_device("ROADM-A1")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_40_rdmC_device_disconnected(self):
-        response = test_utils_rfc8040.unmount_device("ROADM-C1")
+        response = test_utils.unmount_device("ROADM-C1")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
 
index fab75217983c8dd09f860fd5995d73ae61a6c15b..4da4d80b07032775082a8838b9b9704372b65550 100644 (file)
@@ -31,7 +31,7 @@ class TransportPCEtesting(unittest.TestCase):
     WAITING = 20  # nominal value is 300
     NODE_VERSION = '2.2.1'
 
-    cr_serv_sample_data = {"input": {
+    cr_serv_input_data = {
         "sdnc-request-header": {
             "request-id": "request-1",
             "rpc-action": "service-create",
@@ -123,6 +123,16 @@ class TransportPCEtesting(unittest.TestCase):
         "due-date": "2018-06-15T00:00:01Z",
         "operator-contact": "pw1234"
     }
+
+    del_serv_input_data = {
+        "sdnc-request-header": {
+            "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
+            "rpc-action": "service-delete",
+            "request-system-id": "appname",
+            "notification-url": "http://localhost:8585/NotificationServer/notify"},
+        "service-delete-req-info": {
+            "service-name": "TBD",
+            "tail-retention": "no"}
     }
 
     @classmethod
@@ -141,7 +151,7 @@ class TransportPCEtesting(unittest.TestCase):
         print("all processes killed")
 
     def setUp(self):
-        time.sleep(5)
+        time.sleep(2)
 
     def test_01_connect_spdrA(self):
         response = test_utils.mount_device("SPDR-SA1", ('spdra', self.NODE_VERSION))
@@ -164,40 +174,32 @@ class TransportPCEtesting(unittest.TestCase):
                          requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_05_connect_sprdA_1_N1_to_roadmA_PP1(self):
-        response = test_utils.connect_xpdr_to_rdm_request("SPDR-SA1", "1", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully',
-                      res["output"]["result"])
-        time.sleep(2)
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'SPDR-SA1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_06_connect_roadmA_PP1_to_spdrA_1_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("SPDR-SA1", "1", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully',
-                      res["output"]["result"])
-        time.sleep(2)
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'SPDR-SA1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_07_connect_sprdC_1_N1_to_roadmC_PP1(self):
-        response = test_utils.connect_xpdr_to_rdm_request("SPDR-SC1", "1", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully',
-                      res["output"]["result"])
-        time.sleep(2)
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'SPDR-SC1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_08_connect_roadmC_PP1_to_spdrC_1_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("SPDR-SC1", "1", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully',
-                      res["output"]["result"])
-        time.sleep(2)
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'SPDR-SC1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_09_add_omsAttributes_ROADMA_ROADMC(self):
         # Config ROADMA-ROADMC oms-attributes
@@ -233,60 +235,57 @@ class TransportPCEtesting(unittest.TestCase):
 
 # test service-create for OCH-OTU4 service from spdr to spdr
     def test_11_check_otn_topology(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nbNode = len(res['network'][0]['node'])
-        self.assertEqual(nbNode, 6, 'There should be 6 nodes')
-        self.assertNotIn('ietf-network-topology:link', res['network'][0])
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['node']), 6)
+        self.assertNotIn('ietf-network-topology:link', response['network'][0])
 
     def test_12_create_OCH_OTU4_service(self):
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         time.sleep(self.WAITING)
 
     def test_13_get_OCH_OTU4_service1(self):
-        response = test_utils.get_service_list_request(
-            "services/service1-OCH-OTU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ordm_serv_list_attr_request(
+            "services", "service1-OCH-OTU4")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
+            response['services'][0]['administrative-state'], 'inService')
         self.assertEqual(
-            res['services'][0]['service-name'], 'service1-OCH-OTU4')
+            response['services'][0]['service-name'], 'service1-OCH-OTU4')
         self.assertEqual(
-            res['services'][0]['connection-type'], 'infrastructure')
+            response['services'][0]['connection-type'], 'infrastructure')
         self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+            response['services'][0]['lifecycle-state'], 'planned')
 
     # Check correct configuration of devices
     def test_14_check_interface_och_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-NETWORK1-761:768")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-761:768')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertDictEqual(dict({'name': 'XPDR1-NETWORK1-761:768',
                                    'administrative-state': 'inService',
                                    'supporting-circuit-pack-name': 'CP1-CFP0',
                                    'type': 'org-openroadm-interfaces:opticalChannel',
                                    'supporting-port': 'CP1-CFP0-P1'
-                                   }, **res['interface'][0]),
-                             res['interface'][0])
-
-        self.assertDictEqual(
-            {'frequency': 196.1, 'rate': 'org-openroadm-common-types:R100G',
-             'transmit-power': -5, 'modulation-format': 'dp-qpsk'},
-            res['interface'][0]['org-openroadm-optical-channel-interfaces:och'])
+                                   }, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertEqual('org-openroadm-common-types:R100G',
+                         response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['rate'])
+        self.assertEqual('dp-qpsk',
+                         response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['modulation-format'])
+        self.assertEqual(196.1,
+                         float(response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['frequency']))
+        self.assertEqual(
+            -5,
+            float(response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['transmit-power']))
 
     def test_15_check_interface_OTU4_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-NETWORK1-OTU")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-OTU')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-OTU',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
@@ -301,36 +300,36 @@ class TransportPCEtesting(unittest.TestCase):
                         'rate': 'org-openroadm-otn-common-types:OTU4',
                         'fec': 'scfec'
                         }
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-
-        self.assertDictEqual(input_dict_2,
-                             res['interface'][0]
-                             ['org-openroadm-otn-otu-interfaces:otu'])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2, **response['interface'][0]['org-openroadm-otn-otu-interfaces:otu']),
+                             response['interface'][0]['org-openroadm-otn-otu-interfaces:otu'])
 
     def test_16_check_interface_och_spdrc(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR1-NETWORK1-761:768")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR1-NETWORK1-761:768')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertDictEqual(dict({'name': 'XPDR1-NETWORK1-761:768',
                                    'administrative-state': 'inService',
                                    'supporting-circuit-pack-name': 'CP1-CFP0',
                                    'type': 'org-openroadm-interfaces:opticalChannel',
                                    'supporting-port': 'CP1-CFP0-P1'
-                                   }, **res['interface'][0]),
-                             res['interface'][0])
-
-        self.assertDictEqual(
-            {'frequency': 196.1, 'rate': 'org-openroadm-common-types:R100G',
-             'transmit-power': -5, 'modulation-format': 'dp-qpsk'},
-            res['interface'][0]['org-openroadm-optical-channel-interfaces:och'])
+                                   }, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertEqual('org-openroadm-common-types:R100G',
+                         response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['rate'])
+        self.assertEqual('dp-qpsk',
+                         response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['modulation-format'])
+        self.assertEqual(196.1,
+                         float(response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['frequency']))
+        self.assertEqual(
+            -5,
+            float(response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['transmit-power']))
 
     def test_17_check_interface_OTU4_spdrc(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR1-NETWORK1-OTU")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR1-NETWORK1-OTU')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-OTU',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
@@ -345,44 +344,36 @@ class TransportPCEtesting(unittest.TestCase):
                         'rate': 'org-openroadm-otn-common-types:OTU4',
                         'fec': 'scfec'
                         }
-
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-
-        self.assertDictEqual(input_dict_2,
-                             res['interface'][0]
-                             ['org-openroadm-otn-otu-interfaces:otu'])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2, **response['interface'][0]['org-openroadm-otn-otu-interfaces:otu']),
+                             response['interface'][0]['org-openroadm-otn-otu-interfaces:otu'])
 
     def test_18_check_no_interface_ODU4_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-        res = response.json()
-        self.assertIn(
-            {"error-type": "application", "error-tag": "data-missing",
-             "error-message": "Request could not be completed because the relevant data model content does not exist"},
-            res['errors']['error'])
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_19_check_openroadm_topo_spdra(self):
-        response = test_utils.get_ordm_topo_request("node/SPDR-SA1-XPDR1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        ele = res['node'][0]['ietf-network-topology:termination-point'][0]
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'SPDR-SA1-XPDR1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        ele = response['node']['ietf-network-topology:termination-point'][0]
         self.assertEqual('XPDR1-NETWORK1', ele['tp-id'])
-        self.assertEqual({'frequency': 196.1,
-                          'width': 40},
-                         ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength'])
-        time.sleep(3)
+        self.assertEqual(
+            196.1,
+            float(ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']['frequency']))
+        self.assertEqual(
+            40,
+            float(ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']['width']))
 
     def test_20_check_openroadm_topo_ROADMA_SRG(self):
-        response = test_utils.get_ordm_topo_request("node/ROADM-A1-SRG1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADM-A1-SRG1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'SRG1-PP1-TXRX':
                 freq_map = base64.b64decode(
@@ -391,17 +382,15 @@ class TransportPCEtesting(unittest.TestCase):
                 self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available")
             if ele['tp-id'] == 'SRG1-PP2-TXRX':
                 self.assertNotIn('avail-freq-maps', dict.keys(ele))
-        time.sleep(3)
 
     def test_21_check_openroadm_topo_ROADMA_DEG(self):
-        response = test_utils.get_ordm_topo_request("node/ROADM-A1-DEG2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADM-A1-DEG2', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'DEG2-CTP-TXRX':
                 freq_map = base64.b64decode(
@@ -413,20 +402,17 @@ class TransportPCEtesting(unittest.TestCase):
                     ele['org-openroadm-network-topology:tx-ttp-attributes']['avail-freq-maps'][0]['freq-map'])
                 freq_map_array = [int(x) for x in freq_map]
                 self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available")
-        time.sleep(3)
 
     def test_22_check_otn_topo_otu4_links(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nb_links = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nb_links, 2)
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 2)
         listLinkId = ['OTU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1',
                       'OTU4-SPDR-SC1-XPDR1-XPDR1-NETWORK1toSPDR-SA1-XPDR1-XPDR1-NETWORK1']
-        for link in res['network'][0]['ietf-network-topology:link']:
+        for link in response['network'][0]['ietf-network-topology:link']:
             self.assertIn(link['link-id'], listLinkId)
             self.assertEqual(
-                link['transportpce-topology:otn-link-type'], 'OTU4')
+                link['transportpce-networkutils:otn-link-type'], 'OTU4')
             self.assertEqual(
                 link['org-openroadm-common-network:link-type'], 'OTN-LINK')
             self.assertEqual(
@@ -438,41 +424,37 @@ class TransportPCEtesting(unittest.TestCase):
 
 # test service-create for ODU4 service from spdr to spdr
     def test_23_create_ODU4_service(self):
-        self.cr_serv_sample_data["input"]["service-name"] = "service1-ODU4"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-format"] = "ODU"
-        del self.cr_serv_sample_data["input"]["service-a-end"]["otu-service-rate"]
-        self.cr_serv_sample_data["input"]["service-a-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODU4"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-format"] = "ODU"
-        del self.cr_serv_sample_data["input"]["service-z-end"]["otu-service-rate"]
-        self.cr_serv_sample_data["input"]["service-z-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODU4"
-
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+        self.cr_serv_input_data["service-name"] = "service1-ODU4"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "ODU"
+        del self.cr_serv_input_data["service-a-end"]["otu-service-rate"]
+        self.cr_serv_input_data["service-a-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODU4"
+        self.cr_serv_input_data["service-z-end"]["service-format"] = "ODU"
+        del self.cr_serv_input_data["service-z-end"]["otu-service-rate"]
+        self.cr_serv_input_data["service-z-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODU4"
+
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         time.sleep(self.WAITING)
 
     def test_24_get_ODU4_service1(self):
-        response = test_utils.get_service_list_request(
-            "services/service1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ordm_serv_list_attr_request(
+            "services", "service1-ODU4")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
+            response['services'][0]['administrative-state'], 'inService')
         self.assertEqual(
-            res['services'][0]['service-name'], 'service1-ODU4')
+            response['services'][0]['service-name'], 'service1-ODU4')
         self.assertEqual(
-            res['services'][0]['connection-type'], 'infrastructure')
+            response['services'][0]['connection-type'], 'infrastructure')
         self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+            response['services'][0]['lifecycle-state'], 'planned')
 
     def test_25_check_interface_ODU4_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
@@ -490,21 +472,20 @@ class TransportPCEtesting(unittest.TestCase):
                         'tx-dapi': 'AMf1n5hK6Xkk',
                         'tx-sapi': 'H/OelLynehI='}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
                                   **input_dict_2),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
                              )
         self.assertDictEqual(
             {'payload-type': '21', 'exp-payload-type': '21'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
 
     def test_26_check_interface_ODU4_spdrc(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR1-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR1-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
@@ -522,23 +503,21 @@ class TransportPCEtesting(unittest.TestCase):
                         'expected-sapi': 'H/OelLynehI=',
                         'expected-dapi': 'AMf1n5hK6Xkk'
                         }
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
                                   **input_dict_2),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
                              )
         self.assertDictEqual(
             {'payload-type': '21', 'exp-payload-type': '21'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
 
     def test_27_check_otn_topo_links(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nb_links = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nb_links, 4)
-        for link in res['network'][0]['ietf-network-topology:link']:
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 4)
+        for link in response['network'][0]['ietf-network-topology:link']:
             linkId = link['link-id']
             if (linkId in ('OTU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1',
                            'OTU4-SPDR-SC1-XPDR1-XPDR1-NETWORK1toSPDR-SA1-XPDR1-XPDR1-NETWORK1')):
@@ -553,7 +532,7 @@ class TransportPCEtesting(unittest.TestCase):
                 self.assertEqual(
                     link['org-openroadm-otn-network-topology:used-bandwidth'], 0)
                 self.assertEqual(
-                    link['transportpce-topology:otn-link-type'], 'ODTU4')
+                    link['transportpce-networkutils:otn-link-type'], 'ODTU4')
                 self.assertEqual(
                     link['org-openroadm-common-network:link-type'], 'OTN-LINK')
                 self.assertIn(link['org-openroadm-common-network:opposite-link'],
@@ -563,9 +542,9 @@ class TransportPCEtesting(unittest.TestCase):
                 self.fail("this link should not exist")
 
     def test_28_check_otn_topo_tp(self):
-        response = test_utils.get_otn_topo_request()
-        res = response.json()
-        for node in res['network'][0]['node']:
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        for node in response['network'][0]['node']:
             if node['node-id'] in ('SPDR-SA1-XPDR1', 'SPDR-SC1-XPDR1'):
                 tpList = node['ietf-network-topology:termination-point']
                 for tp in tpList:
@@ -579,65 +558,60 @@ class TransportPCEtesting(unittest.TestCase):
 
 # test service-create for 10GE service from spdr to spdr
     def test_29_create_10GE_service(self):
-        self.cr_serv_sample_data["input"]["service-name"] = "service1-10GE"
-        self.cr_serv_sample_data["input"]["connection-type"] = "service"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-rate"] = "10"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-format"] = "Ethernet"
-        del self.cr_serv_sample_data["input"]["service-a-end"]["odu-service-rate"]
-        self.cr_serv_sample_data["input"]["service-a-end"]["ethernet-encoding"] = "10GBASE-R"
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-rate"] = "10"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-format"] = "Ethernet"
-        del self.cr_serv_sample_data["input"]["service-z-end"]["odu-service-rate"]
-        self.cr_serv_sample_data["input"]["service-z-end"]["ethernet-encoding"] = "10GBASE-R"
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+        self.cr_serv_input_data["service-name"] = "service1-10GE"
+        self.cr_serv_input_data["connection-type"] = "service"
+        self.cr_serv_input_data["service-a-end"]["service-rate"] = "10"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "Ethernet"
+        del self.cr_serv_input_data["service-a-end"]["odu-service-rate"]
+        self.cr_serv_input_data["service-a-end"]["ethernet-encoding"] = "10GBASE-R"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
+        self.cr_serv_input_data["service-z-end"]["service-rate"] = "10"
+        self.cr_serv_input_data["service-z-end"]["service-format"] = "Ethernet"
+        del self.cr_serv_input_data["service-z-end"]["odu-service-rate"]
+        self.cr_serv_input_data["service-z-end"]["ethernet-encoding"] = "10GBASE-R"
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         time.sleep(self.WAITING)
 
     def test_30_get_10GE_service1(self):
-        response = test_utils.get_service_list_request(
-            "services/service1-10GE")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ordm_serv_list_attr_request(
+            "services", "service1-10GE")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
+            response['services'][0]['administrative-state'], 'inService')
         self.assertEqual(
-            res['services'][0]['service-name'], 'service1-10GE')
+            response['services'][0]['service-name'], 'service1-10GE')
         self.assertEqual(
-            res['services'][0]['connection-type'], 'service')
+            response['services'][0]['connection-type'], 'service')
         self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+            response['services'][0]['lifecycle-state'], 'planned')
 
     def test_31_check_interface_10GE_CLIENT_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-CLIENT1-ETHERNET10G")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-CLIENT1-ETHERNET10G')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict = {'name': 'XPDR1-CLIENT1-ETHERNET10G',
                       'administrative-state': 'inService',
                       'supporting-circuit-pack-name': 'CP1-SFP4',
                       'type': 'org-openroadm-interfaces:ethernetCsmacd',
                       'supporting-port': 'CP1-SFP4-P1'
                       }
-        self.assertDictEqual(dict(input_dict, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(
-            {'speed': 10000},
-            res['interface'][0]['org-openroadm-ethernet-interfaces:ethernet'])
+        self.assertDictEqual(dict(input_dict, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertEqual(
+            10000,
+            response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']['speed'])
 
     def test_32_check_interface_ODU2E_CLIENT_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-CLIENT1-ODU2e")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e',
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-CLIENT1-ODU2e:service1-10GE')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e:service1-10GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-SFP4',
                         'supporting-interface': 'XPDR1-CLIENT1-ETHERNET10G',
@@ -648,21 +622,20 @@ class TransportPCEtesting(unittest.TestCase):
             'rate': 'org-openroadm-otn-common-types:ODU2e',
             'monitoring-mode': 'terminated'}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(
             {'payload-type': '03', 'exp-payload-type': '03'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
 
     def test_33_check_interface_ODU2E_NETWORK_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-NETWORK1-ODU2e")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e',
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-ODU2e:service1-10GE')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e:service1-10GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
                         'supporting-interface': 'XPDR1-NETWORK1-ODU4',
@@ -674,60 +647,56 @@ class TransportPCEtesting(unittest.TestCase):
             'monitoring-mode': 'monitored'}
         input_dict_3 = {'trib-port-number': 1}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(dict(input_dict_3,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
                                       'parent-odu-allocation']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation'])
-        self.assertIn(1, res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation'])
+        self.assertIn(1, response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
                       ['trib-slots'])
 
     def test_34_check_ODU2E_connection_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1",
-            "odu-connection/XPDR1-CLIENT1-ODU2e-x-XPDR1-NETWORK1-ODU2e")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'odu-connection', 'XPDR1-CLIENT1-ODU2e-x-XPDR1-NETWORK1-ODU2e')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {
             'connection-name':
             'XPDR1-CLIENT1-ODU2e-x-XPDR1-NETWORK1-ODU2e',
             'direction': 'bidirectional'
         }
 
-        self.assertDictEqual(dict(input_dict_1, **res['odu-connection'][0]),
-                             res['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e'},
-                             res['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e'},
-                             res['odu-connection'][0]['source'])
+        self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
+                             response['odu-connection'][0])
+        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e:service1-10GE'},
+                             response['odu-connection'][0]['destination'])
+        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e:service1-10GE'},
+                             response['odu-connection'][0]['source'])
 
     def test_35_check_interface_10GE_CLIENT_spdrc(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR1-CLIENT1-ETHERNET10G")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR1-CLIENT1-ETHERNET10G')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict = {'name': 'XPDR1-CLIENT1-ETHERNET10G',
                       'administrative-state': 'inService',
                       'supporting-circuit-pack-name': 'CP1-SFP4',
                       'type': 'org-openroadm-interfaces:ethernetCsmacd',
                       'supporting-port': 'CP1-SFP4-P1'
                       }
-        self.assertDictEqual(dict(input_dict, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(
-            {'speed': 10000},
-            res['interface'][0]['org-openroadm-ethernet-interfaces:ethernet'])
+        self.assertDictEqual(dict(input_dict, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertEqual(
+            10000,
+            response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']['speed'])
 
     def test_36_check_interface_ODU2E_CLIENT_spdrc(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR1-CLIENT1-ODU2e")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e',
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR1-CLIENT1-ODU2e:service1-10GE')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e:service1-10GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-SFP4',
                         'supporting-interface': 'XPDR1-CLIENT1-ETHERNET10G',
@@ -738,21 +707,20 @@ class TransportPCEtesting(unittest.TestCase):
             'rate': 'org-openroadm-otn-common-types:ODU2e',
             'monitoring-mode': 'terminated'}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(
             {'payload-type': '03', 'exp-payload-type': '03'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
 
     def test_37_check_interface_ODU2E_NETWORK_spdrc(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR1-NETWORK1-ODU2e")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e',
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR1-NETWORK1-ODU2e:service1-10GE')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e:service1-10GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
                         'supporting-interface': 'XPDR1-NETWORK1-ODU4',
@@ -765,47 +733,43 @@ class TransportPCEtesting(unittest.TestCase):
 
         input_dict_3 = {'trib-port-number': 1}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(dict(input_dict_3,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
                                       'parent-odu-allocation']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
             'parent-odu-allocation'])
         self.assertIn(1,
-                      res['interface'][0][
+                      response['interface'][0][
                           'org-openroadm-otn-odu-interfaces:odu'][
                           'parent-odu-allocation']['trib-slots'])
 
     def test_38_check_ODU2E_connection_spdrc(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1",
-            "odu-connection/XPDR1-CLIENT1-ODU2e-x-XPDR1-NETWORK1-ODU2e")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'odu-connection', 'XPDR1-CLIENT1-ODU2e-x-XPDR1-NETWORK1-ODU2e')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {
             'connection-name':
             'XPDR1-CLIENT1-ODU2e-x-XPDR1-NETWORK1-ODU2e',
             'direction': 'bidirectional'
         }
 
-        self.assertDictEqual(dict(input_dict_1, **res['odu-connection'][0]),
-                             res['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e'},
-                             res['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e'},
-                             res['odu-connection'][0]['source'])
+        self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
+                             response['odu-connection'][0])
+        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e:service1-10GE'},
+                             response['odu-connection'][0]['destination'])
+        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e:service1-10GE'},
+                             response['odu-connection'][0]['source'])
 
     def test_39_check_otn_topo_links(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nb_links = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nb_links, 4)
-        for link in res['network'][0]['ietf-network-topology:link']:
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 4)
+        for link in response['network'][0]['ietf-network-topology:link']:
             linkId = link['link-id']
             if (linkId in ('ODU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1',
                            'ODU4-SPDR-SC1-XPDR1-XPDR1-NETWORK1toSPDR-SA1-XPDR1-XPDR1-NETWORK1')):
@@ -815,9 +779,9 @@ class TransportPCEtesting(unittest.TestCase):
                     link['org-openroadm-otn-network-topology:used-bandwidth'], 10000)
 
     def test_40_check_otn_topo_tp(self):
-        response = test_utils.get_otn_topo_request()
-        res = response.json()
-        for node in res['network'][0]['node']:
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        for node in response['network'][0]['node']:
             if node['node-id'] in ('SPDR-SA1-XPDR1', 'SPDR-SC1-XPDR1'):
                 tpList = node['ietf-network-topology:termination-point']
                 for tp in tpList:
@@ -833,49 +797,43 @@ class TransportPCEtesting(unittest.TestCase):
                             1, xpdrTpPortConAt['odtu-tpn-pool'][0]['tpn-pool'])
 
     def test_41_delete_10GE_service(self):
-        response = test_utils.service_delete_request("service1-10GE")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service1-10GE"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         time.sleep(self.WAITING)
 
     def test_42_check_service_list(self):
-        response = test_utils.get_service_list_request("")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(len(res['service-list']['services']), 2)
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_request()
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['service-list']['services']), 2)
 
     def test_43_check_no_ODU2e_connection_spdra(self):
-        response = test_utils.check_netconf_node_request("SPDR-SA1", "")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertNotIn(['odu-connection'][0], res['org-openroadm-device'])
-        time.sleep(1)
+        response = test_utils.check_node_request("SPDR-SA1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertNotIn(['odu-connection'][0], response['org-openroadm-device'])
 
     def test_44_check_no_interface_ODU2E_NETWORK_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-NETWORK1-ODU2e-service1")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-ODU2e-service1')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_45_check_no_interface_ODU2E_CLIENT_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-CLIENT1-ODU2e-service1")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-CLIENT1-ODU2e-service1')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_46_check_no_interface_10GE_CLIENT_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-CLIENT1-ETHERNET10G")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-CLIENT1-ETHERNET10G')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_47_check_otn_topo_links(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nb_links = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nb_links, 4)
-        for link in res['network'][0]['ietf-network-topology:link']:
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 4)
+        for link in response['network'][0]['ietf-network-topology:link']:
             linkId = link['link-id']
             if (linkId in ('ODU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1',
                            'ODU4-SPDR-SC1-XPDR1-XPDR1-NETWORK1toSPDR-SA1-XPDR1-XPDR1-NETWORK1')):
@@ -885,9 +843,9 @@ class TransportPCEtesting(unittest.TestCase):
                     link['org-openroadm-otn-network-topology:used-bandwidth'], 0)
 
     def test_48_check_otn_topo_tp(self):
-        response = test_utils.get_otn_topo_request()
-        res = response.json()
-        for node in res['network'][0]['node']:
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        for node in response['network'][0]['node']:
             if node['node-id'] in ('SPDR-SA1-XPDR1', 'SPDR-SC1-XPDR1'):
                 tpList = node['ietf-network-topology:termination-point']
                 for tp in tpList:
@@ -898,32 +856,30 @@ class TransportPCEtesting(unittest.TestCase):
                             len(xpdrTpPortConAt['odtu-tpn-pool'][0]['tpn-pool']), 80)
 
     def test_49_delete_ODU4_service(self):
-        response = test_utils.service_delete_request("service1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service1-ODU4"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         time.sleep(self.WAITING)
 
     def test_50_check_service_list(self):
-        response = test_utils.get_service_list_request("")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(len(res['service-list']['services']), 1)
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_request()
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['service-list']['services']), 1)
 
     def test_51_check_no_interface_ODU4_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_52_check_otn_topo_links(self):
         self.test_22_check_otn_topo_otu4_links()
 
     def test_53_check_otn_topo_tp(self):
-        response = test_utils.get_otn_topo_request()
-        res = response.json()
-        for node in res['network'][0]['node']:
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        for node in response['network'][0]['node']:
             if node['node-id'] in ('SPDR-SA1-XPDR1', 'SPDR-SC1-XPDR1'):
                 tpList = node['ietf-network-topology:termination-point']
                 for tp in tpList:
@@ -934,58 +890,48 @@ class TransportPCEtesting(unittest.TestCase):
                             'odtu-tpn-pool', dict.keys(xpdrTpPortConAt))
 
     def test_54_delete_OCH_OTU4_service(self):
-        response = test_utils.service_delete_request("service1-OCH-OTU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service1-OCH-OTU4"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         time.sleep(self.WAITING)
 
     def test_55_get_no_service(self):
-        response = test_utils.get_service_list_request("")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-        res = response.json()
-        self.assertIn(
-            {"error-type": "application", "error-tag": "data-missing",
-             "error-message": "Request could not be completed because the relevant data model content does not exist"},
-            res['errors']['error'])
-        time.sleep(1)
+        response = test_utils.get_ordm_serv_list_request()
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_56_check_no_interface_OTU4_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-NETWORK1-OTU")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-OTU')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_57_check_no_interface_OCH_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-NETWORK1-1")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-1')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_58_getLinks_OtnTopology(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertNotIn('ietf-network-topology:link', res['network'][0])
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertNotIn('ietf-network-topology:link', response['network'][0])
 
     def test_59_check_openroadm_topo_spdra(self):
-        response = test_utils.get_ordm_topo_request("node/SPDR-SA1-XPDR1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        tp = res['node'][0]['ietf-network-topology:termination-point'][0]
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'SPDR-SA1-XPDR1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        tp = response['node']['ietf-network-topology:termination-point'][0]
         self.assertEqual('XPDR1-NETWORK1', tp['tp-id'])
         self.assertNotIn('wavelength', dict.keys(
             tp['org-openroadm-network-topology:xpdr-network-attributes']))
-        time.sleep(3)
 
     def test_60_check_openroadm_topo_ROADMA_SRG(self):
-        response = test_utils.get_ordm_topo_request("node/ROADM-A1-SRG1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADM-A1-SRG1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'SRG1-PP1-TXRX':
                 freq_map = base64.b64decode(
@@ -995,14 +941,13 @@ class TransportPCEtesting(unittest.TestCase):
         time.sleep(3)
 
     def test_61_check_openroadm_topo_ROADMA_DEG(self):
-        response = test_utils.get_ordm_topo_request("node/ROADM-A1-DEG2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADM-A1-DEG2', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'DEG2-CTP-TXRX':
                 freq_map = base64.b64decode(
@@ -1017,183 +962,164 @@ class TransportPCEtesting(unittest.TestCase):
         time.sleep(3)
 
     def test_62_connect_sprdA_3_N1_to_roadmA_PP2(self):
-        response = test_utils.connect_xpdr_to_rdm_request("SPDR-SA1", "3", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully',
-                      res["output"]["result"])
-        time.sleep(2)
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'SPDR-SA1', 'xpdr-num': '3', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_63_connect_roadmA_PP2_to_spdrA_3_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("SPDR-SA1", "3", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully',
-                      res["output"]["result"])
-        time.sleep(2)
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'SPDR-SA1', 'xpdr-num': '3', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_64_connect_sprdC_3_N1_to_roadmC_PP2(self):
-        response = test_utils.connect_xpdr_to_rdm_request("SPDR-SC1", "3", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully',
-                      res["output"]["result"])
-        time.sleep(2)
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'SPDR-SC1', 'xpdr-num': '3', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_65_connect_roadmC_PP2_to_spdrC_3_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("SPDR-SC1", "3", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully',
-                      res["output"]["result"])
-        time.sleep(2)
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'SPDR-SC1', 'xpdr-num': '3', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
 
     def test_66_create_OCH_OTU4_service_2(self):
         # pylint: disable=line-too-long
-        self.cr_serv_sample_data["input"]["service-name"] = "service2-OCH-OTU4"
-        self.cr_serv_sample_data["input"]["connection-type"] = "infrastructure"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-rate"] = "100"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-format"] = "OTU"
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR3"
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR3-NETWORK1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR3"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR3-NETWORK1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["otu-service-rate"] = "org-openroadm-otn-common-types:OTU4"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-rate"] = "100"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-format"] = "OTU"
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR3"
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR3-NETWORK1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR3"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR3-NETWORK1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["otu-service-rate"] = "org-openroadm-otn-common-types:OTU4"
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+        self.cr_serv_input_data["service-name"] = "service2-OCH-OTU4"
+        self.cr_serv_input_data["connection-type"] = "infrastructure"
+        self.cr_serv_input_data["service-a-end"]["service-rate"] = "100"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "OTU"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR3"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR3-NETWORK1"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR3"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR3-NETWORK1"
+        self.cr_serv_input_data["service-a-end"]["otu-service-rate"] = "org-openroadm-otn-common-types:OTU4"
+        self.cr_serv_input_data["service-z-end"]["service-rate"] = "100"
+        self.cr_serv_input_data["service-z-end"]["service-format"] = "OTU"
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR3"
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR3-NETWORK1"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR3"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR3-NETWORK1"
+        self.cr_serv_input_data["service-z-end"]["otu-service-rate"] = "org-openroadm-otn-common-types:OTU4"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         time.sleep(self.WAITING)
 
     def test_67_get_OCH_OTU4_service2(self):
-        response = test_utils.get_service_list_request(
-            "services/service2-OCH-OTU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ordm_serv_list_attr_request(
+            "services", "service2-OCH-OTU4")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
+            response['services'][0]['administrative-state'], 'inService')
         self.assertEqual(
-            res['services'][0]['service-name'], 'service2-OCH-OTU4')
+            response['services'][0]['service-name'], 'service2-OCH-OTU4')
         self.assertEqual(
-            res['services'][0]['connection-type'], 'infrastructure')
+            response['services'][0]['connection-type'], 'infrastructure')
         self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+            response['services'][0]['lifecycle-state'], 'planned')
 
     def test_68_create_ODU4_service_2(self):
         # pylint: disable=line-too-long
-        self.cr_serv_sample_data["input"]["service-name"] = "service2-ODU4"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-format"] = "ODU"
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR3"
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR3-NETWORK1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR3"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR3-NETWORK1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODU4"
-        del self.cr_serv_sample_data["input"]["service-a-end"]["otu-service-rate"]
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-format"] = "ODU"
-        self.cr_serv_sample_data["input"]["service-z-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODU4"
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR3"
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR3-NETWORK1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR3"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR3-NETWORK1"
-        del self.cr_serv_sample_data["input"]["service-z-end"]["otu-service-rate"]
-
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+        self.cr_serv_input_data["service-name"] = "service2-ODU4"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "ODU"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR3"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR3-NETWORK1"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR3"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR3-NETWORK1"
+        self.cr_serv_input_data["service-a-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODU4"
+        del self.cr_serv_input_data["service-a-end"]["otu-service-rate"]
+        self.cr_serv_input_data["service-z-end"]["service-format"] = "ODU"
+        self.cr_serv_input_data["service-z-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODU4"
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR3"
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR3-NETWORK1"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR3"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR3-NETWORK1"
+        del self.cr_serv_input_data["service-z-end"]["otu-service-rate"]
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         time.sleep(self.WAITING)
 
     def test_69_get_ODU4_service2(self):
-        response = test_utils.get_service_list_request(
-            "services/service2-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ordm_serv_list_attr_request(
+            "services", "service2-ODU4")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
+            response['services'][0]['administrative-state'], 'inService')
         self.assertEqual(
-            res['services'][0]['service-name'], 'service2-ODU4')
+            response['services'][0]['service-name'], 'service2-ODU4')
         self.assertEqual(
-            res['services'][0]['connection-type'], 'infrastructure')
+            response['services'][0]['connection-type'], 'infrastructure')
         self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+            response['services'][0]['lifecycle-state'], 'planned')
 
     def test_70_create_1GE_service(self):
         # pylint: disable=line-too-long
-        self.cr_serv_sample_data["input"]["service-name"] = "service1-1GE"
-        self.cr_serv_sample_data["input"]["connection-type"] = "service"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-rate"] = "1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-format"] = "Ethernet"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-rate"] = "1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-format"] = "Ethernet"
-        del self.cr_serv_sample_data["input"]["service-a-end"]["odu-service-rate"]
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR3"
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR3-CLIENT1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR3"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR3-CLIENT1"
-        del self.cr_serv_sample_data["input"]["service-z-end"]["odu-service-rate"]
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR3"
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR3-CLIENT1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR3"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR3-CLIENT1"
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+        self.cr_serv_input_data["service-name"] = "service1-1GE"
+        self.cr_serv_input_data["connection-type"] = "service"
+        self.cr_serv_input_data["service-a-end"]["service-rate"] = "1"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "Ethernet"
+        self.cr_serv_input_data["service-z-end"]["service-rate"] = "1"
+        self.cr_serv_input_data["service-z-end"]["service-format"] = "Ethernet"
+        del self.cr_serv_input_data["service-a-end"]["odu-service-rate"]
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR3"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR3-CLIENT1"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR3"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR3-CLIENT1"
+        del self.cr_serv_input_data["service-z-end"]["odu-service-rate"]
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR3"
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR3-CLIENT1"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR3"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR3-CLIENT1"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         time.sleep(self.WAITING)
 
     def test_71_get_1GE_service1(self):
-        response = test_utils.get_service_list_request("services/service1-1GE")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ordm_serv_list_attr_request(
+            "services", "service1-1GE")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
+            response['services'][0]['administrative-state'], 'inService')
         self.assertEqual(
-            res['services'][0]['service-name'], 'service1-1GE')
+            response['services'][0]['service-name'], 'service1-1GE')
         self.assertEqual(
-            res['services'][0]['connection-type'], 'service')
+            response['services'][0]['connection-type'], 'service')
         self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+            response['services'][0]['lifecycle-state'], 'planned')
 
     def test_72_check_interface_1GE_CLIENT_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR3-CLIENT1-ETHERNET1G")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR3-CLIENT1-ETHERNET1G')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict = {'name': 'XPDR3-CLIENT1-ETHERNET1G',
                       'administrative-state': 'inService',
                       'supporting-circuit-pack-name': 'CP1-SFP4',
                       'type': 'org-openroadm-interfaces:ethernetCsmacd',
                       'supporting-port': 'CP1-SFP4-P1'
                       }
-        self.assertDictEqual(dict(input_dict, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(
-            {'speed': 1000},
-            res['interface'][0]['org-openroadm-ethernet-interfaces:ethernet'])
+        self.assertDictEqual(dict(input_dict, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertEqual(
+            1000,
+            response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']['speed'])
 
     def test_73_check_interface_ODU0_CLIENT_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR3-CLIENT1-ODU0")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        input_dict_1 = {'name': 'XPDR3-CLIENT1-ODU0',
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR3-CLIENT1-ODU0:service1-1GE')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR3-CLIENT1-ODU0:service1-1GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP3-SFP1',
                         'supporting-interface': 'XPDR3-CLIENT1-ETHERNET1G',
@@ -1203,22 +1129,20 @@ class TransportPCEtesting(unittest.TestCase):
             'odu-function': 'org-openroadm-otn-common-types:ODU-TTP-CTP',
             'rate': 'org-openroadm-otn-common-types:ODU0',
             'monitoring-mode': 'terminated'}
-
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(
             {'payload-type': '07', 'exp-payload-type': '07'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
 
     def test_74_check_interface_ODU0_NETWORK_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR3-NETWORK1-ODU0")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        input_dict_1 = {'name': 'XPDR3-NETWORK1-ODU0',
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR3-NETWORK1-ODU0:service1-1GE')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR3-NETWORK1-ODU0:service1-1GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP3-CFP0',
                         'supporting-interface': 'XPDR3-NETWORK1-ODU4',
@@ -1229,61 +1153,55 @@ class TransportPCEtesting(unittest.TestCase):
             'rate': 'org-openroadm-otn-common-types:ODU0',
             'monitoring-mode': 'monitored'}
         input_dict_3 = {'trib-port-number': 1}
-
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(dict(input_dict_3,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
                                       'parent-odu-allocation']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation'])
-        self.assertIn(1, res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation'])
+        self.assertIn(1, response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
                       ['trib-slots'])
 
     def test_75_check_ODU0_connection_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1",
-            "odu-connection/XPDR3-CLIENT1-ODU0-x-XPDR3-NETWORK1-ODU0")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'odu-connection', 'XPDR3-CLIENT1-ODU0-x-XPDR3-NETWORK1-ODU0')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {
             'connection-name':
             'XPDR3-CLIENT1-ODU0-x-XPDR3-NETWORK1-ODU0',
             'direction': 'bidirectional'
         }
-
-        self.assertDictEqual(dict(input_dict_1, **res['odu-connection'][0]),
-                             res['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR3-NETWORK1-ODU0'},
-                             res['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR3-CLIENT1-ODU0'},
-                             res['odu-connection'][0]['source'])
+        self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
+                             response['odu-connection'][0])
+        self.assertDictEqual({'dst-if': 'XPDR3-NETWORK1-ODU0:service1-1GE'},
+                             response['odu-connection'][0]['destination'])
+        self.assertDictEqual({'src-if': 'XPDR3-CLIENT1-ODU0:service1-1GE'},
+                             response['odu-connection'][0]['source'])
 
     def test_76_check_interface_1GE_CLIENT_spdrc(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR3-CLIENT1-ETHERNET1G")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR3-CLIENT1-ETHERNET1G')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict = {'name': 'XPDR3-CLIENT1-ETHERNET1G',
                       'administrative-state': 'inService',
                       'supporting-circuit-pack-name': 'CP3-SFP1',
                       'type': 'org-openroadm-interfaces:ethernetCsmacd',
                       'supporting-port': 'CP3-SFP1-P1'
                       }
-        self.assertDictEqual(dict(input_dict, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(
-            {'speed': 1000},
-            res['interface'][0]['org-openroadm-ethernet-interfaces:ethernet'])
+        self.assertDictEqual(dict(input_dict, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertEqual(
+            1000,
+            response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']['speed'])
 
     def test_77_check_interface_ODU0_CLIENT_spdrc(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR3-CLIENT1-ODU0")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        input_dict_1 = {'name': 'XPDR3-CLIENT1-ODU0',
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR3-CLIENT1-ODU0:service1-1GE')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR3-CLIENT1-ODU0:service1-1GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP3-SFP1',
                         'supporting-interface': 'XPDR3-CLIENT1-ETHERNET1G',
@@ -1293,22 +1211,20 @@ class TransportPCEtesting(unittest.TestCase):
             'odu-function': 'org-openroadm-otn-common-types:ODU-TTP-CTP',
             'rate': 'org-openroadm-otn-common-types:ODU0',
             'monitoring-mode': 'terminated'}
-
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(
             {'payload-type': '07', 'exp-payload-type': '07'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
 
     def test_78_check_interface_ODU0_NETWORK_spdrc(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR3-NETWORK1-ODU0")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        input_dict_1 = {'name': 'XPDR3-NETWORK1-ODU0',
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR3-NETWORK1-ODU0:service1-1GE')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR3-NETWORK1-ODU0:service1-1GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP3-CFP0',
                         'supporting-interface': 'XPDR3-NETWORK1-ODU4',
@@ -1318,50 +1234,43 @@ class TransportPCEtesting(unittest.TestCase):
             'odu-function': 'org-openroadm-otn-common-types:ODU-CTP',
             'rate': 'org-openroadm-otn-common-types:ODU0',
             'monitoring-mode': 'monitored'}
-
         input_dict_3 = {'trib-port-number': 1}
-
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(dict(input_dict_3,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
                                       'parent-odu-allocation']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
             'parent-odu-allocation'])
         self.assertIn(1,
-                      res['interface'][0][
+                      response['interface'][0][
                           'org-openroadm-otn-odu-interfaces:odu'][
                           'parent-odu-allocation']['trib-slots'])
 
     def test_79_check_ODU0_connection_spdrc(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1",
-            "odu-connection/XPDR3-CLIENT1-ODU0-x-XPDR3-NETWORK1-ODU0")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'odu-connection', 'XPDR3-CLIENT1-ODU0-x-XPDR3-NETWORK1-ODU0')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {
             'connection-name':
             'XPDR3-CLIENT1-ODU0-x-XPDR3-NETWORK1-ODU0',
             'direction': 'bidirectional'
         }
-
-        self.assertDictEqual(dict(input_dict_1, **res['odu-connection'][0]),
-                             res['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR3-NETWORK1-ODU0'},
-                             res['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR3-CLIENT1-ODU0'},
-                             res['odu-connection'][0]['source'])
+        self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
+                             response['odu-connection'][0])
+        self.assertDictEqual({'dst-if': 'XPDR3-NETWORK1-ODU0:service1-1GE'},
+                             response['odu-connection'][0]['destination'])
+        self.assertDictEqual({'src-if': 'XPDR3-CLIENT1-ODU0:service1-1GE'},
+                             response['odu-connection'][0]['source'])
 
     def test_80_check_otn_topo_links(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nb_links = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nb_links, 4)
-        for link in res['network'][0]['ietf-network-topology:link']:
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 4)
+        for link in response['network'][0]['ietf-network-topology:link']:
             linkId = link['link-id']
             if (linkId in ('ODU4-SPDR-SA1-XPDR3-XPDR3-NETWORK1toSPDR-SC1-XPDR3-XPDR3-NETWORK1',
                            'ODU4-SPDR-SC1-XPDR3-XPDR3-NETWORK1toSPDR-SA1-XPDR3-XPDR3-NETWORK1')):
@@ -1371,9 +1280,9 @@ class TransportPCEtesting(unittest.TestCase):
                     link['org-openroadm-otn-network-topology:used-bandwidth'], 1000)
 
     def test_81_check_otn_topo_tp(self):
-        response = test_utils.get_otn_topo_request()
-        res = response.json()
-        for node in res['network'][0]['node']:
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        for node in response['network'][0]['node']:
             if node['node-id'] in ('SPDR-SA1-XPDR3', 'SPDR-SC1-XPDR3'):
                 tpList = node['ietf-network-topology:termination-point']
                 for tp in tpList:
@@ -1389,49 +1298,43 @@ class TransportPCEtesting(unittest.TestCase):
                             1, xpdrTpPortConAt['odtu-tpn-pool'][0]['tpn-pool'])
 
     def test_82_delete_1GE_service(self):
-        response = test_utils.service_delete_request("service1-1GE")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service1-1GE"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         time.sleep(self.WAITING)
 
     def test_83_check_service_list(self):
-        response = test_utils.get_service_list_request("")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(len(res['service-list']['services']), 2)
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_request()
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['service-list']['services']), 2)
 
     def test_84_check_no_ODU0_connection_spdra(self):
-        response = test_utils.check_netconf_node_request("SPDR-SA1", "")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertNotIn(['odu-connection'][0], res['org-openroadm-device'])
-        time.sleep(1)
+        response = test_utils.check_node_request("SPDR-SA1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertNotIn(['odu-connection'][0], response['org-openroadm-device'])
 
     def test_85_check_no_interface_ODU0_NETWORK_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR3-NETWORK1-ODU0-service1")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR3-NETWORK1-ODU0:service1-1GE')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_86_check_no_interface_ODU0_CLIENT_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR3-CLIENT1-ODU0-service1")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR3-CLIENT1-ODU0:service1-1GE')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_87_check_no_interface_10GE_CLIENT_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR3-CLIENT1-ETHERNET1G")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR3-CLIENT1-ETHERNET1G')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_88_check_otn_topo_links(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nb_links = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nb_links, 4)
-        for link in res['network'][0]['ietf-network-topology:link']:
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 4)
+        for link in response['network'][0]['ietf-network-topology:link']:
             linkId = link['link-id']
             if (linkId in ('ODU4-SPDR-SA1-XPDR3-XPDR3-NETWORK1toSPDR-SC1-XPDR3-XPDR3-NETWORK1',
                            'ODU4-SPDR-SC1-XPDR3-XPDR3-NETWORK1toSPDR-SA1-XPDR3-XPDR3-NETWORK1')):
@@ -1441,9 +1344,9 @@ class TransportPCEtesting(unittest.TestCase):
                     link['org-openroadm-otn-network-topology:used-bandwidth'], 0)
 
     def test_89_check_otn_topo_tp(self):
-        response = test_utils.get_otn_topo_request()
-        res = response.json()
-        for node in res['network'][0]['node']:
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        for node in response['network'][0]['node']:
             if node['node-id'] in ('SPDR-SA1-XPDR3', 'SPDR-SC1-XPDR3'):
                 tpList = node['ietf-network-topology:termination-point']
                 for tp in tpList:
@@ -1454,59 +1357,53 @@ class TransportPCEtesting(unittest.TestCase):
                             len(xpdrTpPortConAt['odtu-tpn-pool'][0]['tpn-pool']), 80)
 
     def test_90_delete_ODU4_service(self):
-        response = test_utils.service_delete_request("service2-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service2-ODU4"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         time.sleep(self.WAITING)
 
     def test_91_delete_OCH_OTU4_service(self):
-        response = test_utils.service_delete_request("service2-OCH-OTU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service2-OCH-OTU4"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         time.sleep(self.WAITING)
 
     def test_92_disconnect_xponders_from_roadm(self):
-        url = "{}/config/ietf-network:networks/network/openroadm-topology/ietf-network-topology:link/"
-        response = test_utils.get_ordm_topo_request("")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        links = res['network'][0]['ietf-network-topology:link']
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        links = response['network'][0]['ietf-network-topology:link']
         for link in links:
             if link["org-openroadm-common-network:link-type"] in ('XPONDER-OUTPUT', 'XPONDER-INPUT'):
-                link_name = link["link-id"]
-                response = test_utils.delete_request(url+link_name)
-                self.assertEqual(response.status_code, requests.codes.ok)
+                response = test_utils.del_ietf_network_link_request(
+                    'openroadm-topology', link['link-id'], 'config')
+                self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_93_check_openroadm_topology(self):
-        response = test_utils.get_ordm_topo_request("")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        links = res['network'][0]['ietf-network-topology:link']
-        self.assertEqual(18, len(links), 'Topology should contain 18 links')
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(18,
+                         len(response['network'][0]['ietf-network-topology:link']),
+                         'Topology should contain 18 links')
 
     def test_94_disconnect_spdrA(self):
         response = test_utils.unmount_device("SPDR-SA1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_95_disconnect_spdrC(self):
         response = test_utils.unmount_device("SPDR-SC1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_96_disconnect_roadmA(self):
         response = test_utils.unmount_device("ROADM-A1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_97_disconnect_roadmC(self):
         response = test_utils.unmount_device("ROADM-C1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
 
 if __name__ == "__main__":
index ce56cf0d2020ac6290dbcb8e590fe73e95461e12..624f0930ea47bbcca8f873b05b2ec5d7121aed5f 100644 (file)
@@ -26,7 +26,7 @@ import test_utils  # nopep8
 class TransportPCEFulltesting(unittest.TestCase):
 
     processes = None
-    cr_serv_sample_data = {"input": {
+    cr_serv_input_data = {
         "sdnc-request-header": {
             "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
             "rpc-action": "service-create",
@@ -117,6 +117,16 @@ class TransportPCEFulltesting(unittest.TestCase):
         "due-date": "2016-11-28T00:00:01Z",
         "operator-contact": "pw1234"
     }
+
+    del_serv_input_data = {
+        "sdnc-request-header": {
+            "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
+            "rpc-action": "service-delete",
+            "request-system-id": "appname",
+            "notification-url": "http://localhost:8585/NotificationServer/notify"},
+        "service-delete-req-info": {
+            "service-name": "TBD",
+            "tail-retention": "no"}
     }
 
     WAITING = 20  # nominal value is 300
@@ -157,68 +167,76 @@ class TransportPCEFulltesting(unittest.TestCase):
         response = test_utils.mount_device("ROADM-C1", ('roadmc', self.NODE_VERSION))
         self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
-    def test_05_connect_xprdA_N1_to_roadmA_PP1(self):
-        response = test_utils.connect_xpdr_to_rdm_request("XPDR-A1", "1", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully', res["output"]["result"])
+    def test_05_connect_xpdrA_N1_to_roadmA_PP1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDR-A1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_06_connect_roadmA_PP1_to_xpdrA_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("XPDR-A1", "1", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully', res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDR-A1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
         time.sleep(2)
 
-    def test_07_connect_xprdC_xpdr1_N1_to_roadmC_PP1(self):
-        response = test_utils.connect_xpdr_to_rdm_request("XPDR-C1", "1", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully', res["output"]["result"])
+    def test_07_connect_xpdrC_xpdr1_N1_to_roadmC_PP1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDR-C1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
         time.sleep(2)
 
-    def test_08_connect_roadmC_PP1_to_xpdrC_xprd1_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("XPDR-C1", "1", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully', res["output"]["result"])
+    def test_08_connect_roadmC_PP1_to_xpdrC_xpdr1_N1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDR-C1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
         time.sleep(2)
 
-    def test_09_connect_xprdA_N2_to_roadmA_PP2(self):
-        response = test_utils.connect_xpdr_to_rdm_request("XPDR-A1", "1", "2",
-                                                          "ROADM-A1", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully', res["output"]["result"])
+    def test_09_connect_xpdrA_N2_to_roadmA_PP2(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDR-A1', 'xpdr-num': '1', 'network-num': '2',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_10_connect_roadmA_PP2_to_xpdrA_N2(self):
-        response = test_utils.connect_rdm_to_xpdr_request("XPDR-A1", "1", "2",
-                                                          "ROADM-A1", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully', res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDR-A1', 'xpdr-num': '1', 'network-num': '2',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
         time.sleep(2)
 
-    def test_11_connect_xprdC_xpdr2_N1_to_roadmC_PP2(self):
-        response = test_utils.connect_xpdr_to_rdm_request("XPDR-C1", "2", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully', res["output"]["result"])
+    def test_11_connect_xpdrC_xpdr2_N1_to_roadmC_PP2(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDR-C1', 'xpdr-num': '2', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_12_connect_roadmC_PP2_to_xpdrC_xpdr2_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("XPDR-C1", "2", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully', res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDR-C1', 'xpdr-num': '2', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_13_add_omsAttributes_ROADMA_ROADMC(self):
@@ -233,7 +251,8 @@ class TransportPCEFulltesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request("ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request("ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX",
+                                                   data)
         self.assertEqual(response.status_code, requests.codes.created)
 
     def test_14_add_omsAttributes_ROADMC_ROADMA(self):
@@ -248,102 +267,86 @@ class TransportPCEFulltesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request("ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request("ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX",
+                                                   data)
         self.assertEqual(response.status_code, requests.codes.created)
 
 # test service-create for Eth service from xpdr to xpdr
     def test_15_create_eth_service2(self):
-        self.cr_serv_sample_data["input"]["service-name"] = "service2"
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.cr_serv_input_data["service-name"] = "service2"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
-    def test_16_get_eth_service1(self):
-        response = test_utils.get_service_list_request("services/service2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service2')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'service')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+    def test_16_get_eth_service2(self):
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service2")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service2')
+        self.assertEqual(response['services'][0]['connection-type'], 'service')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        time.sleep(1)
 
     def test_17_check_xc1_ROADMA(self):
-        response = test_utils.check_netconf_node_request(
-            "ROADM-A1", "roadm-connections/SRG1-PP1-TXRX-DEG2-TTP-TXRX-761:768")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            "ROADM-A1", "roadm-connections", "SRG1-PP1-TXRX-DEG2-TTP-TXRX-761:768")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
             dict({
                 'connection-name': 'SRG1-PP1-TXRX-DEG2-TTP-TXRX-761:768',
                 'opticalControlMode': 'gainLoss',
                 'target-output-power': -3.0
-            }, **res['roadm-connections'][0]),
-            res['roadm-connections'][0]
-        )
-        self.assertDictEqual(
-            {'src-if': 'SRG1-PP1-TXRX-nmc-761:768'},
-            res['roadm-connections'][0]['source'])
-        self.assertDictEqual(
-            {'dst-if': 'DEG2-TTP-TXRX-nmc-761:768'},
-            res['roadm-connections'][0]['destination'])
-        time.sleep(5)
+            }, **response['roadm-connections'][0]), response['roadm-connections'][0])
+        self.assertDictEqual({'src-if': 'SRG1-PP1-TXRX-nmc-761:768'}, response['roadm-connections'][0]['source'])
+        self.assertDictEqual({'dst-if': 'DEG2-TTP-TXRX-nmc-761:768'}, response['roadm-connections'][0]['destination'])
+        time.sleep(1)
 
     def test_18_check_xc1_ROADMC(self):
-        response = test_utils.check_netconf_node_request(
-            "ROADM-C1", "roadm-connections/SRG1-PP2-TXRX-DEG1-TTP-TXRX-761:768")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            "ROADM-C1", "roadm-connections", "SRG1-PP2-TXRX-DEG1-TTP-TXRX-761:768")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
             dict({
                 'connection-name': 'SRG1-PP2-TXRX-DEG1-TTP-TXRX-761:768',
                 'opticalControlMode': 'gainLoss',
                 'target-output-power': -3.0
-            }, **res['roadm-connections'][0]),
-            res['roadm-connections'][0]
-        )
-        self.assertDictEqual(
-            {'src-if': 'SRG1-PP2-TXRX-nmc-761:768'},
-            res['roadm-connections'][0]['source'])
-        self.assertDictEqual(
-            {'dst-if': 'DEG1-TTP-TXRX-nmc-761:768'},
-            res['roadm-connections'][0]['destination'])
-        time.sleep(5)
+            }, **response['roadm-connections'][0]), response['roadm-connections'][0])
+        self.assertDictEqual({'src-if': 'SRG1-PP2-TXRX-nmc-761:768'}, response['roadm-connections'][0]['source'])
+        self.assertDictEqual({'dst-if': 'DEG1-TTP-TXRX-nmc-761:768'}, response['roadm-connections'][0]['destination'])
+        time.sleep(1)
 
     def test_19_check_topo_XPDRA(self):
-        response = test_utils.get_ordm_topo_request("node/XPDR-A1-XPDR1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'XPDR-A1-XPDR1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'XPDR1-NETWORK1':
-                self.assertEqual({'frequency': 196.1,
-                                  'width': 40},
-                                 ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength'])
+                self.assertEqual(
+                    196.1,
+                    float(ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']['frequency']))
+                self.assertEqual(
+                    40.0,
+                    float(ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']['width']))
             elif ele['tp-id'] in ('XPDR1-CLIENT1', 'XPDR1-CLIENT2'):
                 self.assertNotIn('org-openroadm-network-topology:xpdr-client-attributes', dict.keys(ele))
             elif ele['tp-id'] == 'XPDR1-NETWORK2':
                 self.assertIn('org-openroadm-network-topology:xpdr-network-attributes', dict.keys(ele))
-        time.sleep(3)
+        time.sleep(1)
 
     def test_20_check_topo_ROADMA_SRG1(self):
-        response = test_utils.get_ordm_topo_request("node/ROADM-A1-SRG1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADM-A1-SRG1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
-        self.assertEqual(freq_map_array[95], 0, "Index 1 should not be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available")
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'SRG1-PP1-TXRX':
                 freq_map = base64.b64decode(
@@ -352,17 +355,16 @@ class TransportPCEFulltesting(unittest.TestCase):
                 self.assertEqual(freq_map_array[95], 0, "Index 1 should not be available")
             elif ele['tp-id'] == 'SRG1-PP2-TXRX':
                 self.assertNotIn('avail-freq-maps', dict.keys(ele))
-        time.sleep(3)
+        time.sleep(1)
 
     def test_21_check_topo_ROADMA_DEG2(self):
-        response = test_utils.get_ordm_topo_request("node/ROADM-A1-DEG2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADM-A1-DEG2', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
-        self.assertEqual(freq_map_array[95], 0, "Index 1 should not be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available")
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'DEG2-CTP-TXRX':
                 freq_map = base64.b64decode(
@@ -374,85 +376,74 @@ class TransportPCEFulltesting(unittest.TestCase):
                     ele['org-openroadm-network-topology:tx-ttp-attributes']['avail-freq-maps'][0]['freq-map'])
                 freq_map_array = [int(x) for x in freq_map]
                 self.assertEqual(freq_map_array[95], 0, "Index 1 should not be available")
-        time.sleep(3)
+        time.sleep(1)
 
     def test_22_create_eth_service1(self):
-        self.cr_serv_sample_data["input"]["service-name"] = "service1"
-        del self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-device-name"]
-        del self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-name"]
-        del self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-device-name"]
-        del self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-name"]
-        del self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-device-name"]
-        del self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-name"]
-        del self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-device-name"]
-        del self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-name"]
-
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.cr_serv_input_data["service-name"] = "service1"
+        del self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-device-name"]
+        del self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-name"]
+        del self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-device-name"]
+        del self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-name"]
+        del self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-device-name"]
+        del self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-name"]
+        del self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-device-name"]
+        del self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-name"]
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_23_get_eth_service1(self):
-        response = test_utils.get_service_list_request("services/service1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'],
-            'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service1')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'service')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service1')
+        self.assertEqual(response['services'][0]['connection-type'], 'service')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
         time.sleep(1)
 
     def test_24_check_xc1_ROADMA(self):
-        response = test_utils.check_netconf_node_request(
-            "ROADM-A1", "roadm-connections/DEG2-TTP-TXRX-SRG1-PP2-TXRX-753:760")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            "ROADM-A1", "roadm-connections", "DEG2-TTP-TXRX-SRG1-PP2-TXRX-753:760")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
             dict({
                 'connection-name': 'DEG2-TTP-TXRX-SRG1-PP2-TXRX-753:760',
                 'opticalControlMode': 'power'
-            }, **res['roadm-connections'][0]),
-            res['roadm-connections'][0]
-        )
-        self.assertDictEqual(
-            {'src-if': 'DEG2-TTP-TXRX-nmc-753:760'},
-            res['roadm-connections'][0]['source'])
-        self.assertDictEqual(
-            {'dst-if': 'SRG1-PP2-TXRX-nmc-753:760'},
-            res['roadm-connections'][0]['destination'])
+            }, **response['roadm-connections'][0]), response['roadm-connections'][0])
+        self.assertDictEqual({'src-if': 'DEG2-TTP-TXRX-nmc-753:760'}, response['roadm-connections'][0]['source'])
+        self.assertDictEqual({'dst-if': 'SRG1-PP2-TXRX-nmc-753:760'}, response['roadm-connections'][0]['destination'])
+        time.sleep(1)
 
     def test_25_check_topo_XPDRA(self):
-        response = test_utils.get_ordm_topo_request("node/XPDR-A1-XPDR1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'XPDR-A1-XPDR1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'XPDR1-NETWORK2':
-                self.assertEqual({'frequency': 196.05,
-                                  'width': 40},
-                                 ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength'])
+                self.assertEqual(
+                    196.05,
+                    float(ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']['frequency']))
+                self.assertEqual(
+                    40.0,
+                    float(ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']['width']))
             elif ele['tp-id'] in ('XPDR1-CLIENT1'):
                 self.assertNotIn('org-openroadm-network-topology:xpdr-client-attributes', dict.keys(ele))
-        time.sleep(10)
+        time.sleep(1)
 
     def test_26_check_topo_ROADMA_SRG1(self):
-        response = test_utils.get_ordm_topo_request("node/ROADM-A1-SRG1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADM-A1-SRG1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available")
         self.assertEqual(freq_map_array[94], 0, "Lambda 2 should not be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'SRG1-PP1-TXRX':
                 freq_map = base64.b64decode(
@@ -468,18 +459,17 @@ class TransportPCEFulltesting(unittest.TestCase):
                 self.assertEqual(freq_map_array[94], 0, "Lambda 2 should not be available")
             elif ele['tp-id'] == 'SRG1-PP3-TXRX':
                 self.assertNotIn('org-openroadm-network-topology:pp-attributes', dict.keys(ele))
-        time.sleep(10)
+        time.sleep(1)
 
     def test_27_check_topo_ROADMA_DEG2(self):
-        response = test_utils.get_ordm_topo_request("node/ROADM-A1-DEG2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADM-A1-DEG2', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available")
         self.assertEqual(freq_map_array[94], 0, "Lambda 2 should not be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'DEG2-CTP-TXRX':
                 freq_map = base64.b64decode(
@@ -493,77 +483,82 @@ class TransportPCEFulltesting(unittest.TestCase):
                 freq_map_array = [int(x) for x in freq_map]
                 self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available")
                 self.assertEqual(freq_map_array[94], 0, "Lambda 2 should not be available")
-        time.sleep(10)
+        time.sleep(1)
 
 #     creation service test on a non-available resource
     def test_28_create_eth_service3(self):
-        self.cr_serv_sample_data["input"]["service-name"] = "service3"
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.cr_serv_input_data["service-name"] = "service3"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
-        self.assertIn('200', res['output']['configuration-response-common']['response-code'])
+                      response['output']['configuration-response-common']['response-message'])
+        self.assertIn('200', response['output']['configuration-response-common']['response-code'])
         time.sleep(self.WAITING)
 
 # add a test that check the openroadm-service-list still only contains 2 elements
     def test_29_delete_eth_service3(self):
-        response = test_utils.service_delete_request("service3")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service3"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Service \'service3\' does not exist in datastore',
-                      res['output']['configuration-response-common']['response-message'])
-        self.assertIn('500', res['output']['configuration-response-common']['response-code'])
-        time.sleep(20)
+                      response['output']['configuration-response-common']['response-message'])
+        self.assertIn('500', response['output']['configuration-response-common']['response-code'])
+        time.sleep(3)
 
     def test_30_delete_eth_service1(self):
-        response = test_utils.service_delete_request("service1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service1"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
-        time.sleep(20)
+                      response['output']['configuration-response-common']['response-message'])
+        time.sleep(self.WAITING)
 
     def test_31_delete_eth_service2(self):
-        response = test_utils.service_delete_request("service2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service2"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
-        time.sleep(20)
+                      response['output']['configuration-response-common']['response-message'])
+        time.sleep(self.WAITING)
 
     def test_32_check_no_xc_ROADMA(self):
-        response = test_utils.check_netconf_node_request("ROADM-A1", "")
-        res = response.json()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        self.assertNotIn('roadm-connections', dict.keys(res['org-openroadm-device']))
+        response = test_utils.check_node_request("ROADM-A1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertNotIn('roadm-connections',
+                         dict.keys(response['org-openroadm-device']))
         time.sleep(2)
 
     def test_33_check_topo_XPDRA(self):
-        response = test_utils.get_ordm_topo_request("node/XPDR-A1-XPDR1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'XPDR-A1-XPDR1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['org-openroadm-common-network:tp-type'] == 'XPONDER-CLIENT':
                 self.assertNotIn('org-openroadm-network-topology:xpdr-client-attributes', dict.keys(ele))
             elif ele['org-openroadm-common-network:tp-type'] == 'XPONDER-NETWORK':
                 self.assertIn('tail-equipment-id',
                               dict.keys(ele['org-openroadm-network-topology:xpdr-network-attributes']))
-                self.assertNotIn('wavelength', dict.keys(
-                    ele['org-openroadm-network-topology:xpdr-network-attributes']))
-        time.sleep(10)
+                self.assertNotIn('wavelength',
+                                 dict.keys(ele['org-openroadm-network-topology:xpdr-network-attributes']))
+        time.sleep(1)
 
     def test_34_check_topo_ROADMA_SRG1(self):
-        response = test_utils.get_ordm_topo_request("node/ROADM-A1-SRG1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADM-A1-SRG1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[95], 255, "Index 1 should  be available")
         self.assertEqual(freq_map_array[94], 255, "Index 2 should  be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] in ('SRG1-PP1-TXRX', 'SRG1-PP2-TXRX'):
                 freq_map = base64.b64decode(
@@ -579,18 +574,17 @@ class TransportPCEFulltesting(unittest.TestCase):
                 self.assertEqual(freq_map_array[94], 255, "Index 2 should  be available")
             else:
                 self.assertNotIn('org-openroadm-network-topology:pp-attributes', dict.keys(ele))
-        time.sleep(10)
+        time.sleep(1)
 
     def test_35_check_topo_ROADMA_DEG2(self):
-        response = test_utils.get_ordm_topo_request("node/ROADM-A1-DEG2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADM-A1-DEG2', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available")
         self.assertEqual(freq_map_array[94], 255, "Lambda 2 should be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'DEG2-CTP-TXRX':
                 freq_map = base64.b64decode(
@@ -604,143 +598,111 @@ class TransportPCEFulltesting(unittest.TestCase):
                 freq_map_array = [int(x) for x in freq_map]
                 self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available")
                 self.assertEqual(freq_map_array[94], 255, "Lambda 2 should be available")
-        time.sleep(10)
+        time.sleep(1)
 
 # test service-create for Optical Channel (OC) service from srg-pp to srg-pp
     def test_36_create_oc_service1(self):
-        self.cr_serv_sample_data["input"]["service-name"] = "service1"
-        self.cr_serv_sample_data["input"]["connection-type"] = "roadm-line"
-        self.cr_serv_sample_data["input"]["service-a-end"]["node-id"] = "ROADM-A1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-format"] = "OC"
-        self.cr_serv_sample_data["input"]["service-z-end"]["node-id"] = "ROADM-C1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-format"] = "OC"
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.cr_serv_input_data["service-name"] = "service1"
+        self.cr_serv_input_data["connection-type"] = "roadm-line"
+        self.cr_serv_input_data["service-a-end"]["node-id"] = "ROADM-A1"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "OC"
+        self.cr_serv_input_data["service-z-end"]["node-id"] = "ROADM-C1"
+        self.cr_serv_input_data["service-z-end"]["service-format"] = "OC"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_37_get_oc_service1(self):
-        response = test_utils.get_service_list_request("services/service1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'],
-            'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service1')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'roadm-line')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service1')
+        self.assertEqual(response['services'][0]['connection-type'], 'roadm-line')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
         time.sleep(1)
 
     def test_38_check_xc1_ROADMA(self):
-        response = test_utils.check_netconf_node_request(
-            "ROADM-A1", "roadm-connections/SRG1-PP1-TXRX-DEG2-TTP-TXRX-761:768")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            "ROADM-A1", "roadm-connections", "SRG1-PP1-TXRX-DEG2-TTP-TXRX-761:768")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
             dict({
                 'connection-name': 'SRG1-PP1-TXRX-DEG2-TTP-TXRX-761:768',
                 'opticalControlMode': 'gainLoss',
                 'target-output-power': -3.0
-            }, **res['roadm-connections'][0]),
-            res['roadm-connections'][0]
-        )
-        self.assertDictEqual(
-            {'src-if': 'SRG1-PP1-TXRX-nmc-761:768'},
-            res['roadm-connections'][0]['source'])
-        self.assertDictEqual(
-            {'dst-if': 'DEG2-TTP-TXRX-nmc-761:768'},
-            res['roadm-connections'][0]['destination'])
-        time.sleep(7)
+            }, **response['roadm-connections'][0]), response['roadm-connections'][0])
+        self.assertDictEqual({'src-if': 'SRG1-PP1-TXRX-nmc-761:768'}, response['roadm-connections'][0]['source'])
+        self.assertDictEqual({'dst-if': 'DEG2-TTP-TXRX-nmc-761:768'}, response['roadm-connections'][0]['destination'])
+        time.sleep(1)
 
     def test_39_check_xc1_ROADMC(self):
-        response = test_utils.check_netconf_node_request(
-            "ROADM-C1", "roadm-connections/SRG1-PP1-TXRX-DEG1-TTP-TXRX-761:768")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            "ROADM-C1", "roadm-connections", "SRG1-PP1-TXRX-DEG1-TTP-TXRX-761:768")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
             dict({
                 'connection-name': 'SRG1-PP1-TXRX-DEG1-TTP-TXRX-761:768',
                 'opticalControlMode': 'gainLoss',
                 'target-output-power': -3.0
-            }, **res['roadm-connections'][0]),
-            res['roadm-connections'][0]
-        )
-        self.assertDictEqual(
-            {'src-if': 'SRG1-PP1-TXRX-nmc-761:768'},
-            res['roadm-connections'][0]['source'])
-        self.assertDictEqual(
-            {'dst-if': 'DEG1-TTP-TXRX-nmc-761:768'},
-            res['roadm-connections'][0]['destination'])
-        time.sleep(7)
+            }, **response['roadm-connections'][0]), response['roadm-connections'][0])
+        self.assertDictEqual({'src-if': 'SRG1-PP1-TXRX-nmc-761:768'}, response['roadm-connections'][0]['source'])
+        self.assertDictEqual({'dst-if': 'DEG1-TTP-TXRX-nmc-761:768'}, response['roadm-connections'][0]['destination'])
+        time.sleep(1)
 
     def test_40_create_oc_service2(self):
-        self.cr_serv_sample_data["input"]["service-name"] = "service2"
-        self.cr_serv_sample_data["input"]["connection-type"] = "roadm-line"
-        self.cr_serv_sample_data["input"]["service-a-end"]["node-id"] = "ROADM-A1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-format"] = "OC"
-        self.cr_serv_sample_data["input"]["service-z-end"]["node-id"] = "ROADM-C1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-format"] = "OC"
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.cr_serv_input_data["service-name"] = "service2"
+        self.cr_serv_input_data["connection-type"] = "roadm-line"
+        self.cr_serv_input_data["service-a-end"]["node-id"] = "ROADM-A1"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "OC"
+        self.cr_serv_input_data["service-z-end"]["node-id"] = "ROADM-C1"
+        self.cr_serv_input_data["service-z-end"]["service-format"] = "OC"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_41_get_oc_service2(self):
-        response = test_utils.get_service_list_request("services/service2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'],
-            'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service2')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'roadm-line')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service2")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service2')
+        self.assertEqual(response['services'][0]['connection-type'], 'roadm-line')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        time.sleep(1)
 
     def test_42_check_xc2_ROADMA(self):
-        response = test_utils.check_netconf_node_request(
-            "ROADM-A1", "roadm-connections/SRG1-PP2-TXRX-DEG2-TTP-TXRX-753:760")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            "ROADM-A1", "roadm-connections", "SRG1-PP2-TXRX-DEG2-TTP-TXRX-753:760")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
         self.assertDictEqual(
             dict({
                 'connection-name': 'SRG1-PP2-TXRX-DEG2-TTP-TXRX-753:760',
                 'opticalControlMode': 'gainLoss',
                 'target-output-power': -3.0
-            }, **res['roadm-connections'][0]),
-            res['roadm-connections'][0]
-        )
-        self.assertDictEqual(
-            {'src-if': 'SRG1-PP2-TXRX-nmc-753:760'},
-            res['roadm-connections'][0]['source'])
-        self.assertDictEqual(
-            {'dst-if': 'DEG2-TTP-TXRX-nmc-753:760'},
-            res['roadm-connections'][0]['destination'])
-        time.sleep(2)
+            }, **response['roadm-connections'][0]), response['roadm-connections'][0])
+        self.assertDictEqual({'src-if': 'SRG1-PP2-TXRX-nmc-753:760'}, response['roadm-connections'][0]['source'])
+        self.assertDictEqual({'dst-if': 'DEG2-TTP-TXRX-nmc-753:760'}, response['roadm-connections'][0]['destination'])
+        time.sleep(1)
 
     def test_43_check_topo_ROADMA(self):
-        response = test_utils.get_ordm_topo_request("node/ROADM-A1-SRG1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADM-A1-SRG1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available")
         self.assertEqual(freq_map_array[94], 0, "Lambda 2 should not be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'SRG1-PP1-TXRX':
                 freq_map = base64.b64decode(
@@ -756,42 +718,53 @@ class TransportPCEFulltesting(unittest.TestCase):
                 self.assertEqual(freq_map_array[94], 0, "Lambda 2 should not be available")
             elif ele['tp-id'] == 'SRG1-PP3-TXRX':
                 self.assertNotIn('org-openroadm-network-topology:pp-attributes', dict.keys(ele))
-        time.sleep(10)
+        time.sleep(1)
         self.test_27_check_topo_ROADMA_DEG2()
-        time.sleep(3)
+        time.sleep(1)
 
     def test_44_delete_oc_service1(self):
-        response = test_utils.service_delete_request("service1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service1"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
-        time.sleep(20)
+                      response['output']['configuration-response-common']['response-message'])
+        time.sleep(self.WAITING)
 
     def test_45_delete_oc_service2(self):
-        response = test_utils.service_delete_request("service2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service2"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
-        time.sleep(20)
+                      response['output']['configuration-response-common']['response-message'])
+        time.sleep(self.WAITING)
 
     def test_46_get_no_oc_services(self):
-        print("start test")
-        response = test_utils.get_service_list_request("")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-        res = response.json()
-        self.assertIn(
-            {"error-type": "application", "error-tag": "data-missing",
-             "error-message": "Request could not be completed because the relevant data model content does not exist"},
-            res['errors']['error'])
+        response = test_utils.get_ordm_serv_list_request()
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+        self.assertIn(response['service-list'], (
+            {
+                "error-type": "protocol",
+                "error-tag": "data-missing",
+                "error-message":
+                    "Request could not be completed because the relevant data "
+                    "model content does not exist"
+            }, {
+                "error-type": "application",
+                "error-tag": "data-missing",
+                "error-message":
+                    "Request could not be completed because the relevant data "
+                    "model content does not exist"
+            }))
         time.sleep(1)
 
     def test_47_get_no_xc_ROADMA(self):
-        response = test_utils.check_netconf_node_request("ROADM-A1", "")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertNotIn(['roadm-connections'][0], res['org-openroadm-device'])
+        response = test_utils.check_node_request("ROADM-A1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertNotIn('roadm-connections', dict.keys(response['org-openroadm-device']))
         time.sleep(1)
 
     def test_48_check_topo_ROADMA(self):
@@ -812,15 +785,18 @@ class TransportPCEFulltesting(unittest.TestCase):
             self.test_44_delete_oc_service1()
 
     def test_50_loop_create_eth_service(self):
-        response = test_utils.get_service_list_request("services/service1")
-        if response.status_code != requests.codes.not_found:
-            response = test_utils.service_delete_request("service1")
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service1")
+        if response['status_code'] != 404:
+            self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service1"
+            response = test_utils.transportpce_api_rpc_request(
+                'org-openroadm-service', 'service-delete',
+                self.del_serv_input_data)
             time.sleep(5)
-        self.cr_serv_sample_data["input"]["connection-type"] = "service"
-        self.cr_serv_sample_data["input"]["service-a-end"]["node-id"] = "XPDR-A1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-format"] = "Ethernet"
-        self.cr_serv_sample_data["input"]["service-z-end"]["node-id"] = "XPDR-C1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-format"] = "Ethernet"
+        self.cr_serv_input_data["connection-type"] = "service"
+        self.cr_serv_input_data["service-a-end"]["node-id"] = "XPDR-A1"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "Ethernet"
+        self.cr_serv_input_data["service-z-end"]["node-id"] = "XPDR-C1"
+        self.cr_serv_input_data["service-z-end"]["service-format"] = "Ethernet"
         for i in range(1, 3):
             # pylint: disable=consider-using-f-string
             print("iteration number {}".format(i))
@@ -833,19 +809,19 @@ class TransportPCEFulltesting(unittest.TestCase):
 
     def test_51_disconnect_XPDRA(self):
         response = test_utils.unmount_device("XPDR-A1")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_52_disconnect_XPDRC(self):
         response = test_utils.unmount_device("XPDR-C1")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_53_disconnect_ROADMA(self):
         response = test_utils.unmount_device("ROADM-A1")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_54_disconnect_ROADMC(self):
         response = test_utils.unmount_device("ROADM-C1")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
 
 if __name__ == "__main__":
index 4169b086090ab881ea32bb8cbd10b480d292a67a..c3529c085773d1b097bcf1ed706fae2d88378494 100644 (file)
@@ -31,7 +31,7 @@ class TransportPCEtesting(unittest.TestCase):
     WAITING = 20  # nominal value is 300
     NODE_VERSION = '2.2.1'
 
-    cr_serv_sample_data = {"input": {
+    cr_serv_input_data = {
         "sdnc-request-header": {
             "request-id": "request-1",
             "rpc-action": "service-create",
@@ -123,6 +123,16 @@ class TransportPCEtesting(unittest.TestCase):
         "due-date": "2018-06-15T00:00:01Z",
         "operator-contact": "pw1234"
     }
+
+    del_serv_input_data = {
+        "sdnc-request-header": {
+            "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
+            "rpc-action": "service-delete",
+            "request-system-id": "appname",
+            "notification-url": "http://localhost:8585/NotificationServer/notify"},
+        "service-delete-req-info": {
+            "service-name": "TBD",
+            "tail-retention": "no"}
     }
 
     @classmethod
@@ -176,75 +186,75 @@ class TransportPCEtesting(unittest.TestCase):
                          requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_007_connect_sprdA_2_N1_to_roadmA_PP3(self):
-        response = test_utils.connect_xpdr_to_rdm_request("SPDR-SA1", "2", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP3-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'SPDR-SA1', 'xpdr-num': '2', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP3-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_008_connect_roadmA_PP3_to_spdrA_2_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("SPDR-SA1", "2", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP3-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'SPDR-SA1', 'xpdr-num': '2', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP3-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_009_connect_sprdC_2_N1_to_roadmC_PP3(self):
-        response = test_utils.connect_xpdr_to_rdm_request("SPDR-SC1", "2", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP3-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'SPDR-SC1', 'xpdr-num': '2', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP3-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_010_connect_roadmC_PP3_to_spdrC_2_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("SPDR-SC1", "2", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP3-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'SPDR-SC1', 'xpdr-num': '2', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP3-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_011_connect_sprdB_2_N1_to_roadmB_PP1(self):
-        response = test_utils.connect_xpdr_to_rdm_request("SPDR-SB1", "2", "1",
-                                                          "ROADM-B1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'SPDR-SB1', 'xpdr-num': '2', 'network-num': '1',
+                             'rdm-node': 'ROADM-B1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_012_connect_roadmB_PP1_to_spdrB_2_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("SPDR-SB1", "2", "1",
-                                                          "ROADM-B1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'SPDR-SB1', 'xpdr-num': '2', 'network-num': '1',
+                             'rdm-node': 'ROADM-B1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_013_connect_sprdB_2_N2_to_roadmB_PP2(self):
-        response = test_utils.connect_xpdr_to_rdm_request("SPDR-SB1", "2", "2",
-                                                          "ROADM-B1", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'SPDR-SB1', 'xpdr-num': '2', 'network-num': '2',
+                             'rdm-node': 'ROADM-B1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_014_connect_roadmB_PP2_to_spdrB_2_N2(self):
-        response = test_utils.connect_rdm_to_xpdr_request("SPDR-SB1", "2", "2",
-                                                          "ROADM-B1", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'SPDR-SB1', 'xpdr-num': '2', 'network-num': '2',
+                             'rdm-node': 'ROADM-B1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_015_add_omsAttributes_ROADMA_ROADMB(self):
@@ -259,8 +269,8 @@ class TransportPCEtesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request(
-            "ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request("ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX",
+                                                   data)
         self.assertEqual(response.status_code, requests.codes.created)
 
     def test_016_add_omsAttributes_ROADMB_ROADMA(self):
@@ -275,8 +285,8 @@ class TransportPCEtesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request(
-            "ROADM-B1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG1-DEG1-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request("ROADM-B1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG1-DEG1-TTP-TXRX",
+                                                   data)
         self.assertEqual(response.status_code, requests.codes.created)
 
     def test_017_add_omsAttributes_ROADMB_ROADMC(self):
@@ -291,8 +301,8 @@ class TransportPCEtesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request(
-            "ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request("ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX",
+                                                   data)
         self.assertEqual(response.status_code, requests.codes.created)
 
     def test_018_add_omsAttributes_ROADMC_ROADMB(self):
@@ -307,137 +317,145 @@ class TransportPCEtesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request(
-            "ROADM-C1-DEG2-DEG2-TTP-TXRXtoROADM-B1-DEG2-DEG2-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request("ROADM-C1-DEG2-DEG2-TTP-TXRXtoROADM-B1-DEG2-DEG2-TTP-TXRX",
+                                                   data)
         self.assertEqual(response.status_code, requests.codes.created)
 
     def test_019_create_OTS_ROADMA_DEG1(self):
-        response = test_utils.create_ots_oms_request("ROADM-A1", "DEG1-TTP-TXRX")
-        time.sleep(10)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-device-renderer', 'create-ots-oms',
+            {
+                'node-id': 'ROADM-A1',
+                'logical-connection-point': 'DEG1-TTP-TXRX'
+            })
+        # time.sleep(10)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Interfaces OTS-DEG1-TTP-TXRX - OMS-DEG1-TTP-TXRX successfully created on node ROADM-A1',
-                      res["output"]["result"])
+                      response["output"]["result"])
 
     def test_020_create_OTS_ROADMB_DEG1(self):
-        response = test_utils.create_ots_oms_request("ROADM-B1", "DEG1-TTP-TXRX")
-        time.sleep(10)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-device-renderer', 'create-ots-oms',
+            {
+                'node-id': 'ROADM-B1',
+                'logical-connection-point': 'DEG1-TTP-TXRX'
+            })
+        # time.sleep(10)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Interfaces OTS-DEG1-TTP-TXRX - OMS-DEG1-TTP-TXRX successfully created on node ROADM-B1',
-                      res["output"]["result"])
+                      response["output"]["result"])
 
     def test_021_create_OTS_ROADMB_DEG2(self):
-        response = test_utils.create_ots_oms_request("ROADM-B1", "DEG2-TTP-TXRX")
-        time.sleep(10)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-device-renderer', 'create-ots-oms',
+            {
+                'node-id': 'ROADM-B1',
+                'logical-connection-point': 'DEG2-TTP-TXRX'
+            })
+        # time.sleep(10)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Interfaces OTS-DEG2-TTP-TXRX - OMS-DEG2-TTP-TXRX successfully created on node ROADM-B1',
-                      res["output"]["result"])
+                      response["output"]["result"])
 
     def test_022_create_OTS_ROADMC_DEG2(self):
-        response = test_utils.create_ots_oms_request("ROADM-C1", "DEG2-TTP-TXRX")
-        time.sleep(10)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-device-renderer', 'create-ots-oms',
+            {
+                'node-id': 'ROADM-C1',
+                'logical-connection-point': 'DEG2-TTP-TXRX'
+            })
+        # time.sleep(10)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Interfaces OTS-DEG2-TTP-TXRX - OMS-DEG2-TTP-TXRX successfully created on node ROADM-C1',
-                      res["output"]["result"])
+                      response["output"]["result"])
 
     def test_023_calculate_span_loss_base_all(self):
-        url = "{}/operations/transportpce-olm:calculate-spanloss-base"
-        data = {
-            "input": {
-                "src-type": "all"
-            }
-        }
-        response = test_utils.post_request(url, data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Success',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-olm', 'calculate-spanloss-base',
+            {
+                'src-type': 'all'
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Success', response["output"]["result"])
         self.assertIn({
             "spanloss": "25.7",
             "link-id": "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX"
-        }, res["output"]["spans"])
+        }, response["output"]["spans"])
         self.assertIn({
             "spanloss": "17.6",
             "link-id": "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX"
-        }, res["output"]["spans"])
+        }, response["output"]["spans"])
         self.assertIn({
             "spanloss": "23.6",
             "link-id": "ROADM-B1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG1-DEG1-TTP-TXRX"
-        }, res["output"]["spans"])
+        }, response["output"]["spans"])
         self.assertIn({
             "spanloss": "23.6",
             "link-id": "ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX"
-        }, res["output"]["spans"])
+        }, response["output"]["spans"])
         self.assertIn({
             "spanloss": "25.7",
             "link-id": "ROADM-C1-DEG2-DEG2-TTP-TXRXtoROADM-B1-DEG2-DEG2-TTP-TXRX"
-        }, res["output"]["spans"])
+        }, response["output"]["spans"])
         self.assertIn({
             "spanloss": "17.6",
             "link-id": "ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX"
-        }, res["output"]["spans"])
+        }, response["output"]["spans"])
         time.sleep(5)
 
     def test_024_check_otn_topology(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nbNode = len(res['network'][0]['node'])
-        self.assertEqual(nbNode, 9, 'There should be 9 nodes')
-        self.assertNotIn('ietf-network-topology:link', res['network'][0],
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['node']), 9, 'There should be 9 nodes')
+        self.assertNotIn('ietf-network-topology:link', response['network'][0],
                          'otn-topology should have no link')
 
 # test service-create for OCH-OTU4 service from spdrA to spdrB
     def test_025_create_OCH_OTU4_service_AB(self):
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_026_get_OCH_OTU4_service_AB(self):
-        response = test_utils.get_service_list_request(
-            "services/service-OCH-OTU4-AB")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service-OCH-OTU4-AB')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'infrastructure')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service-OCH-OTU4-AB")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service-OCH-OTU4-AB')
+        self.assertEqual(response['services'][0]['connection-type'], 'infrastructure')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        time.sleep(1)
 
 # Check correct configuration of devices
     def test_027_check_interface_och_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR2-NETWORK1-761:768")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR2-NETWORK1-761:768')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertDictEqual(dict({'name': 'XPDR2-NETWORK1-761:768',
                                    'administrative-state': 'inService',
                                    'supporting-circuit-pack-name': 'CP5-CFP',
                                    'type': 'org-openroadm-interfaces:opticalChannel',
                                    'supporting-port': 'CP5-CFP-P1'
-                                   }, **res['interface'][0]),
-                             res['interface'][0])
-
-        self.assertDictEqual(
-            {'frequency': 196.1, 'rate': 'org-openroadm-common-types:R100G',
-             'transmit-power': -5, 'modulation-format': 'dp-qpsk'},
-            res['interface'][0]['org-openroadm-optical-channel-interfaces:och'])
+                                   }, **response['interface'][0]),
+                             response['interface'][0])
+
+        self.assertEqual('org-openroadm-common-types:R100G',
+                         response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['rate'])
+        self.assertEqual('dp-qpsk',
+                         response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['modulation-format'])
+        self.assertEqual(196.1,
+                         float(response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['frequency']))
+        self.assertEqual(
+            -5,
+            float(response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['transmit-power']))
 
     def test_028_check_interface_OTU4_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR2-NETWORK1-OTU")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR2-NETWORK1-OTU')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-OTU',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP5-CFP',
@@ -452,44 +470,45 @@ class TransportPCEtesting(unittest.TestCase):
                         'rate': 'org-openroadm-otn-common-types:OTU4',
                         'fec': 'scfec'
                         }
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-
-        self.assertDictEqual(input_dict_2,
-                             res['interface'][0]
-                             ['org-openroadm-otn-otu-interfaces:otu'])
-        response2 = test_utils.check_netconf_node_request(
-            "SPDR-SB1", "interface/XPDR2-NETWORK1-OTU/otu")
-        self.assertEqual(response2.status_code, requests.codes.ok)
-        res2 = response2.json()['org-openroadm-otn-otu-interfaces:otu']
-        self.assertEqual(input_dict_2['tx-sapi'], res2['tx-dapi'])
-        self.assertEqual(input_dict_2['tx-sapi'], res2['expected-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['tx-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['expected-dapi'])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2, **response['interface'][0]['org-openroadm-otn-otu-interfaces:otu']),
+                             response['interface'][0]['org-openroadm-otn-otu-interfaces:otu'])
+
+        response2 = test_utils.check_node_attribute2_request(
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK1-OTU', 'org-openroadm-otn-otu-interfaces:otu')
+        self.assertEqual(response2['status_code'], requests.codes.ok)
+        self.assertEqual(input_dict_2['tx-sapi'], response2['org-openroadm-otn-otu-interfaces:otu']['tx-dapi'])
+        self.assertEqual(input_dict_2['tx-sapi'], response2['org-openroadm-otn-otu-interfaces:otu']['expected-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'], response2['org-openroadm-otn-otu-interfaces:otu']['tx-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'], response2['org-openroadm-otn-otu-interfaces:otu']['expected-dapi'])
 
     def test_029_check_interface_och_spdrB(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SB1", "interface/XPDR2-NETWORK1-761:768")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK1-761:768')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertDictEqual(dict({'name': 'XPDR2-NETWORK1-761:768',
                                    'administrative-state': 'inService',
                                    'supporting-circuit-pack-name': 'CP5-CFP',
                                    'type': 'org-openroadm-interfaces:opticalChannel',
                                    'supporting-port': 'CP5-CFP-P1'
-                                   }, **res['interface'][0]),
-                             res['interface'][0])
-
-        self.assertDictEqual(
-            {'frequency': 196.1, 'rate': 'org-openroadm-common-types:R100G',
-             'transmit-power': -5, 'modulation-format': 'dp-qpsk'},
-            res['interface'][0]['org-openroadm-optical-channel-interfaces:och'])
+                                   }, **response['interface'][0]),
+                             response['interface'][0])
+
+        self.assertEqual('org-openroadm-common-types:R100G',
+                         response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['rate'])
+        self.assertEqual('dp-qpsk',
+                         response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['modulation-format'])
+        self.assertEqual(196.1,
+                         float(response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['frequency']))
+        self.assertEqual(
+            -5,
+            float(response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['transmit-power']))
 
     def test_030_check_interface_OTU4_spdrB(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SB1", "interface/XPDR2-NETWORK1-OTU")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK1-OTU')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-OTU',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP5-CFP',
@@ -504,54 +523,61 @@ class TransportPCEtesting(unittest.TestCase):
                         'rate': 'org-openroadm-otn-common-types:OTU4',
                         'fec': 'scfec'
                         }
-
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-
-        self.assertDictEqual(input_dict_2,
-                             res['interface'][0]
-                             ['org-openroadm-otn-otu-interfaces:otu'])
-        response2 = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR2-NETWORK1-OTU/otu")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res2 = response2.json()['org-openroadm-otn-otu-interfaces:otu']
-        self.assertEqual(input_dict_2['tx-sapi'], res2['tx-dapi'])
-        self.assertEqual(input_dict_2['tx-sapi'], res2['expected-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['tx-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['expected-dapi'])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2, **response['interface'][0]['org-openroadm-otn-otu-interfaces:otu']),
+                             response['interface'][0]['org-openroadm-otn-otu-interfaces:otu'])
+
+        response2 = test_utils.check_node_attribute2_request(
+            'SPDR-SA1', 'interface', 'XPDR2-NETWORK1-OTU', 'org-openroadm-otn-otu-interfaces:otu')
+        self.assertEqual(response2['status_code'], requests.codes.ok)
+        self.assertEqual(input_dict_2['tx-sapi'], response2['org-openroadm-otn-otu-interfaces:otu']['tx-dapi'])
+        self.assertEqual(input_dict_2['tx-sapi'], response2['org-openroadm-otn-otu-interfaces:otu']['expected-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'], response2['org-openroadm-otn-otu-interfaces:otu']['tx-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'], response2['org-openroadm-otn-otu-interfaces:otu']['expected-dapi'])
 
     def test_031_check_no_interface_ODU4_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR2-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-        res = response.json()
-        self.assertIn(
-            {"error-type": "application", "error-tag": "data-missing",
-             "error-message": "Request could not be completed because the relevant data model content does not exist"},
-            res['errors']['error'])
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR2-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+        self.assertIn(response['interface'], (
+            {
+                "error-type": "protocol",
+                "error-tag": "data-missing",
+                "error-message":
+                    "Request could not be completed because the relevant data "
+                    "model content does not exist"
+            }, {
+                "error-type": "application",
+                "error-tag": "data-missing",
+                "error-message":
+                    "Request could not be completed because the relevant data "
+                    "model content does not exist"
+            }))
 
     def test_032_check_openroadm_topo_spdra(self):
-        response = test_utils.get_ordm_topo_request("node/SPDR-SA1-XPDR2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        ele = res['node'][0]['ietf-network-topology:termination-point'][0]
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'SPDR-SA1-XPDR2', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        ele = response['node']['ietf-network-topology:termination-point'][0]
         self.assertEqual('XPDR2-NETWORK1', ele['tp-id'])
-        self.assertEqual({'frequency': 196.1,
-                          'width': 40},
-                         ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength'])
+        self.assertEqual(
+            196.1,
+            float(ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']['frequency']))
+        self.assertEqual(
+            40,
+            float(ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']['width']))
         self.assertEqual('ROADM-A1-SRG1--SRG1-PP3-TXRX',
                          ele['org-openroadm-network-topology:xpdr-network-attributes']['tail-equipment-id'])
-        time.sleep(3)
+        time.sleep(1)
 
     def test_033_check_openroadm_topo_ROADMA_SRG(self):
-        response = test_utils.get_ordm_topo_request("node/ROADM-A1-SRG1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADM-A1-SRG1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'SRG1-PP3-TXRX':
                 freq_map = base64.b64decode(
@@ -560,17 +586,16 @@ class TransportPCEtesting(unittest.TestCase):
                 self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available")
             if ele['tp-id'] == 'SRG1-PP2-TXRX':
                 self.assertNotIn('avail-freq-maps', dict.keys(ele))
-        time.sleep(3)
+        time.sleep(1)
 
     def test_034_check_openroadm_topo_ROADMA_DEG1(self):
-        response = test_utils.get_ordm_topo_request("node/ROADM-A1-DEG1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADM-A1-DEG1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'DEG1-CTP-TXRX':
                 freq_map = base64.b64decode(
@@ -582,20 +607,18 @@ class TransportPCEtesting(unittest.TestCase):
                     ele['org-openroadm-network-topology:tx-ttp-attributes']['avail-freq-maps'][0]['freq-map'])
                 freq_map_array = [int(x) for x in freq_map]
                 self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available")
-        time.sleep(3)
+        time.sleep(1)
 
     def test_035_check_otn_topo_otu4_links(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nb_links = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nb_links, 2)
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 2)
         listLinkId = ['OTU4-SPDR-SA1-XPDR2-XPDR2-NETWORK1toSPDR-SB1-XPDR2-XPDR2-NETWORK1',
                       'OTU4-SPDR-SB1-XPDR2-XPDR2-NETWORK1toSPDR-SA1-XPDR2-XPDR2-NETWORK1']
-        for link in res['network'][0]['ietf-network-topology:link']:
+        for link in response['network'][0]['ietf-network-topology:link']:
             self.assertIn(link['link-id'], listLinkId)
             self.assertEqual(
-                link['transportpce-topology:otn-link-type'], 'OTU4')
+                link['transportpce-networkutils:otn-link-type'], 'OTU4')
             self.assertEqual(
                 link['org-openroadm-common-network:link-type'], 'OTN-LINK')
             self.assertEqual(
@@ -609,67 +632,63 @@ class TransportPCEtesting(unittest.TestCase):
 # test service-create for OCH-OTU4 service from spdrB to spdrC
 
     def test_036_create_OCH_OTU4_service_BC(self):
-        # pylint: disable=line-too-long
-        self.cr_serv_sample_data["input"]["service-name"] = "service-OCH-OTU4-BC"
-        self.cr_serv_sample_data["input"]["service-a-end"]["node-id"] = "SPDR-SB1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["clli"] = "NodeSB"
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SB1-XPDR2"
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK2"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SB1-XPDR2"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK2"
-        self.cr_serv_sample_data["input"]["service-z-end"]["node-id"] = "SPDR-SC1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["clli"] = "NodeSC"
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR2"
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR2"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK1"
-
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.cr_serv_input_data["service-name"] = "service-OCH-OTU4-BC"
+        self.cr_serv_input_data["service-a-end"]["node-id"] = "SPDR-SB1"
+        self.cr_serv_input_data["service-a-end"]["clli"] = "NodeSB"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SB1-XPDR2"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK2"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SB1-XPDR2"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK2"
+        self.cr_serv_input_data["service-z-end"]["node-id"] = "SPDR-SC1"
+        self.cr_serv_input_data["service-z-end"]["clli"] = "NodeSC"
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR2"
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK1"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR2"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK1"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_037_get_OCH_OTU4_service_BC(self):
-        response = test_utils.get_service_list_request(
-            "services/service-OCH-OTU4-BC")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service-OCH-OTU4-BC')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'infrastructure')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service-OCH-OTU4-BC")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service-OCH-OTU4-BC')
+        self.assertEqual(response['services'][0]['connection-type'], 'infrastructure')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        time.sleep(1)
 
 # Check correct configuration of devices
     def test_038_check_interface_och_spdrB(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SB1", "interface/XPDR2-NETWORK2-753:760")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK2-753:760')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertDictEqual(dict({'name': 'XPDR2-NETWORK1-753:760',
                                    'administrative-state': 'inService',
                                    'supporting-circuit-pack-name': 'CP6-CFP',
                                    'type': 'org-openroadm-interfaces:opticalChannel',
                                    'supporting-port': 'CP1-CFP0-P1'
-                                   }, **res['interface'][0]),
-                             res['interface'][0])
-
-        self.assertDictEqual(
-            {'frequency': 196.05, 'rate': 'org-openroadm-common-types:R100G',
-             'transmit-power': -5, 'modulation-format': 'dp-qpsk'},
-            res['interface'][0]['org-openroadm-optical-channel-interfaces:och'])
+                                   }, **response['interface'][0]),
+                             response['interface'][0])
+
+        self.assertEqual('org-openroadm-common-types:R100G',
+                         response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['rate'])
+        self.assertEqual('dp-qpsk',
+                         response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['modulation-format'])
+        self.assertEqual(196.05,
+                         float(response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['frequency']))
+        self.assertEqual(
+            -5,
+            float(response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['transmit-power']))
 
     def test_039_check_interface_OTU4_spdrB(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SB1", "interface/XPDR2-NETWORK2-OTU")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK2-OTU')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK2-OTU',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP6-CFP',
@@ -684,44 +703,45 @@ class TransportPCEtesting(unittest.TestCase):
                         'rate': 'org-openroadm-otn-common-types:OTU4',
                         'fec': 'scfec'
                         }
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-
-        self.assertDictEqual(input_dict_2,
-                             res['interface'][0]
-                             ['org-openroadm-otn-otu-interfaces:otu'])
-        response2 = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR2-NETWORK1-OTU/otu")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res2 = response2.json()['org-openroadm-otn-otu-interfaces:otu']
-        self.assertEqual(input_dict_2['tx-sapi'], res2['tx-dapi'])
-        self.assertEqual(input_dict_2['tx-sapi'], res2['expected-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['tx-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['expected-dapi'])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2, **response['interface'][0]['org-openroadm-otn-otu-interfaces:otu']),
+                             response['interface'][0]['org-openroadm-otn-otu-interfaces:otu'])
+
+        response2 = test_utils.check_node_attribute2_request(
+            'SPDR-SC1', 'interface', 'XPDR2-NETWORK1-OTU', 'org-openroadm-otn-otu-interfaces:otu')
+        self.assertEqual(response2['status_code'], requests.codes.ok)
+        self.assertEqual(input_dict_2['tx-sapi'], response2['org-openroadm-otn-otu-interfaces:otu']['tx-dapi'])
+        self.assertEqual(input_dict_2['tx-sapi'], response2['org-openroadm-otn-otu-interfaces:otu']['expected-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'], response2['org-openroadm-otn-otu-interfaces:otu']['tx-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'], response2['org-openroadm-otn-otu-interfaces:otu']['expected-dapi'])
 
     def test_040_check_interface_och_spdrC(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR2-NETWORK1-753:760")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertDictEqual(dict({'name': 'XPDR2-NETWORK1-761:768',
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR2-NETWORK1-753:760')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertDictEqual(dict({'name': 'XPDR2-NETWORK1-753:760',
                                    'administrative-state': 'inService',
                                    'supporting-circuit-pack-name': 'CP5-CFP',
                                    'type': 'org-openroadm-interfaces:opticalChannel',
                                    'supporting-port': 'CP5-CFP-P1'
-                                   }, **res['interface'][0]),
-                             res['interface'][0])
-
-        self.assertDictEqual(
-            {'frequency': 196.05, 'rate': 'org-openroadm-common-types:R100G',
-             'transmit-power': -5, 'modulation-format': 'dp-qpsk'},
-            res['interface'][0]['org-openroadm-optical-channel-interfaces:och'])
+                                   }, **response['interface'][0]),
+                             response['interface'][0])
+
+        self.assertEqual('org-openroadm-common-types:R100G',
+                         response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['rate'])
+        self.assertEqual('dp-qpsk',
+                         response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['modulation-format'])
+        self.assertEqual(196.05,
+                         float(response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['frequency']))
+        self.assertEqual(
+            -5,
+            float(response['interface'][0]['org-openroadm-optical-channel-interfaces:och']['transmit-power']))
 
     def test_041_check_interface_OTU4_spdrC(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR2-NETWORK1-OTU")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR2-NETWORK1-OTU')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-OTU',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP5-CFP',
@@ -736,67 +756,76 @@ class TransportPCEtesting(unittest.TestCase):
                         'rate': 'org-openroadm-otn-common-types:OTU4',
                         'fec': 'scfec'
                         }
-
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-
-        self.assertDictEqual(input_dict_2,
-                             res['interface'][0]
-                             ['org-openroadm-otn-otu-interfaces:otu'])
-        response2 = test_utils.check_netconf_node_request(
-            "SPDR-SB1", "interface/XPDR2-NETWORK2-OTU/otu")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res2 = response2.json()['org-openroadm-otn-otu-interfaces:otu']
-        self.assertEqual(input_dict_2['tx-sapi'], res2['tx-dapi'])
-        self.assertEqual(input_dict_2['tx-sapi'], res2['expected-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['tx-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['expected-dapi'])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2, **response['interface'][0]['org-openroadm-otn-otu-interfaces:otu']),
+                             response['interface'][0]['org-openroadm-otn-otu-interfaces:otu'])
+
+        response2 = test_utils.check_node_attribute2_request(
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK2-OTU', 'org-openroadm-otn-otu-interfaces:otu')
+        self.assertEqual(response2['status_code'], requests.codes.ok)
+        self.assertEqual(input_dict_2['tx-sapi'], response2['org-openroadm-otn-otu-interfaces:otu']['tx-dapi'])
+        self.assertEqual(input_dict_2['tx-sapi'], response2['org-openroadm-otn-otu-interfaces:otu']['expected-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'], response2['org-openroadm-otn-otu-interfaces:otu']['tx-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'], response2['org-openroadm-otn-otu-interfaces:otu']['expected-dapi'])
 
     def test_042_check_no_interface_ODU4_spdrB(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SB1", "interface/XPDR2-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-        res = response.json()
-        self.assertIn(
-            {"error-type": "application", "error-tag": "data-missing",
-             "error-message": "Request could not be completed because the relevant data model content does not exist"},
-            res['errors']['error'])
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+        self.assertIn(response['interface'], (
+            {
+                "error-type": "protocol",
+                "error-tag": "data-missing",
+                "error-message":
+                    "Request could not be completed because the relevant data "
+                    "model content does not exist"
+            }, {
+                "error-type": "application",
+                "error-tag": "data-missing",
+                "error-message":
+                    "Request could not be completed because the relevant data "
+                    "model content does not exist"
+            }))
 
     def test_043_check_openroadm_topo_spdrB(self):
-        response = test_utils.get_ordm_topo_request("node/SPDR-SB1-XPDR2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'SPDR-SB1-XPDR2', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         # pylint: disable=consider-using-f-string
         for ele in liste_tp:
             if ele['tp-id'] == 'XPDR2-NETWORK1':
-                self.assertEqual({'frequency': 196.1,
-                                  'width': 40},
-                                 ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength'])
+                self.assertEqual(
+                    196.1,
+                    float(ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']['frequency']))
+                self.assertEqual(
+                    40,
+                    float(ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']['width']))
                 self.assertEqual('ROADM-B1-SRG1--SRG1-PP1-TXRX',
                                  ele['org-openroadm-network-topology:xpdr-network-attributes']['tail-equipment-id'])
             elif ele['tp-id'] == 'XPDR2-NETWORK2':
-                self.assertEqual({'frequency': 196.05,
-                                  'width': 40},
-                                 ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength'])
+                self.assertEqual(
+                    196.05,
+                    float(ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']['frequency']))
+                self.assertEqual(
+                    40,
+                    float(ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']['width']))
                 self.assertEqual('ROADM-B1-SRG1--SRG1-PP2-TXRX',
                                  ele['org-openroadm-network-topology:xpdr-network-attributes']['tail-equipment-id'])
             else:
-                print("ele = {}".format(ele))
                 self.assertNotIn('org-openroadm-network-topology:xpdr-network-attributes', dict.keys(ele))
-        time.sleep(3)
+        time.sleep(1)
 
     def test_044_check_openroadm_topo_ROADMB_SRG1(self):
-        response = test_utils.get_ordm_topo_request("node/ROADM-B1-SRG1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADM-B1-SRG1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[95], 0, "Lambda 1 should not be available")
         self.assertEqual(freq_map_array[94], 0, "Lambda 2 should not be available")
         self.assertEqual(freq_map_array[93], 255, "Lambda 3 should be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'SRG1-PP1-TXRX':
                 freq_map = base64.b64decode(
@@ -810,17 +839,16 @@ class TransportPCEtesting(unittest.TestCase):
                 self.assertEqual(freq_map_array[94], 0, "Lambda 2 should not be available")
             if ele['tp-id'] == 'SRG1-PP3-TXRX':
                 self.assertNotIn('avail-freq-maps', dict.keys(ele))
-        time.sleep(3)
+        time.sleep(1)
 
     def test_045_check_openroadm_topo_ROADMB_DEG2(self):
-        response = test_utils.get_ordm_topo_request("node/ROADM-B1-DEG2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADM-B1-DEG2', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[94], 0, "Lambda 2 should not be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'DEG2-CTP-TXRX':
                 freq_map = base64.b64decode(
@@ -832,22 +860,20 @@ class TransportPCEtesting(unittest.TestCase):
                     ele['org-openroadm-network-topology:tx-ttp-attributes']['avail-freq-maps'][0]['freq-map'])
                 freq_map_array = [int(x) for x in freq_map]
                 self.assertEqual(freq_map_array[94], 0, "Lambda 1 should not be available")
-        time.sleep(3)
+        time.sleep(1)
 
     def test_046_check_otn_topo_otu4_links(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nb_links = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nb_links, 4)
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 4)
         listLinkId = ['OTU4-SPDR-SA1-XPDR2-XPDR2-NETWORK1toSPDR-SB1-XPDR2-XPDR2-NETWORK1',
                       'OTU4-SPDR-SB1-XPDR2-XPDR2-NETWORK1toSPDR-SA1-XPDR2-XPDR2-NETWORK1',
                       'OTU4-SPDR-SB1-XPDR2-XPDR2-NETWORK2toSPDR-SC1-XPDR2-XPDR2-NETWORK1',
                       'OTU4-SPDR-SC1-XPDR2-XPDR2-NETWORK1toSPDR-SB1-XPDR2-XPDR2-NETWORK2']
-        for link in res['network'][0]['ietf-network-topology:link']:
+        for link in response['network'][0]['ietf-network-topology:link']:
             self.assertIn(link['link-id'], listLinkId)
             self.assertEqual(
-                link['transportpce-topology:otn-link-type'], 'OTU4')
+                link['transportpce-networkutils:otn-link-type'], 'OTU4')
             self.assertEqual(
                 link['org-openroadm-common-network:link-type'], 'OTN-LINK')
             self.assertEqual(
@@ -857,81 +883,74 @@ class TransportPCEtesting(unittest.TestCase):
             self.assertIn(
                 link['org-openroadm-common-network:opposite-link'], listLinkId)
 
+
 # test service-create for 100GE service from spdrA to spdrC via spdrB
+
+
     def test_047_create_100GE_service_ABC(self):
-        # pylint: disable=line-too-long
-        self.cr_serv_sample_data["input"]["service-name"] = "service-100GE-ABC"
-        self.cr_serv_sample_data["input"]["connection-type"] = "service"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-format"] = "Ethernet"
-        self.cr_serv_sample_data["input"]["service-a-end"]["node-id"] = "SPDR-SA1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["clli"] = "NodeSA"
-        del self.cr_serv_sample_data["input"]["service-a-end"]["otu-service-rate"]
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR2"
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR2"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-format"] = "Ethernet"
-        self.cr_serv_sample_data["input"]["service-z-end"]["node-id"] = "SPDR-SC1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["clli"] = "NodeSC"
-        del self.cr_serv_sample_data["input"]["service-z-end"]["otu-service-rate"]
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR2"
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR2"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
-
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.cr_serv_input_data["service-name"] = "service-100GE-ABC"
+        self.cr_serv_input_data["connection-type"] = "service"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "Ethernet"
+        self.cr_serv_input_data["service-a-end"]["node-id"] = "SPDR-SA1"
+        self.cr_serv_input_data["service-a-end"]["clli"] = "NodeSA"
+        del self.cr_serv_input_data["service-a-end"]["otu-service-rate"]
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR2"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR2"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
+        self.cr_serv_input_data["service-z-end"]["service-format"] = "Ethernet"
+        self.cr_serv_input_data["service-z-end"]["node-id"] = "SPDR-SC1"
+        self.cr_serv_input_data["service-z-end"]["clli"] = "NodeSC"
+        del self.cr_serv_input_data["service-z-end"]["otu-service-rate"]
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR2"
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR2"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_048_get_100GE_service_ABC(self):
-        response = test_utils.get_service_list_request(
-            "services/service-100GE-ABC")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service-100GE-ABC')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'service')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service-100GE-ABC")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service-100GE-ABC')
+        self.assertEqual(response['services'][0]['connection-type'], 'service')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        time.sleep(1)
 
     def test_049_check_interface_100GE_CLIENT_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR2-CLIENT1-ETHERNET")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR2-CLIENT1-ETHERNET')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict = {'name': 'XPDR2-CLIENT1-ETHERNET',
                       'administrative-state': 'inService',
                       'supporting-circuit-pack-name': 'CP2-QSFP1',
                       'type': 'org-openroadm-interfaces:ethernetCsmacd',
                       'supporting-port': 'CP2-QSFP1-P1'
                       }
-        self.assertDictEqual(dict(input_dict, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(
-            {'speed': 100000,
-             'fec': 'off'},
-            res['interface'][0]['org-openroadm-ethernet-interfaces:ethernet'])
+        self.assertDictEqual(dict(input_dict, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertEqual(100000, response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']['speed'])
+        self.assertEqual('off', response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']['fec'])
 
     def test_050_check_interface_ODU4_CLIENT_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR2-CLIENT1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR2-CLIENT1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-CLIENT1-ODU4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP2-QSFP1',
                         'supporting-interface': 'XPDR2-CLIENT1-ETHERNET',
                         'type': 'org-openroadm-interfaces:otnOdu',
                         'supporting-port': 'CP2-QSFP1-P1'}
+        # SAPI/DAPI are added in the Otu4 renderer
         input_dict_2 = {
-            'odu-function': 'org-openroadm-otn-common-types:ODU-TTP-CTP',
+            'odu-function': 'org-openroadm-otn-common-types:ODU-TTP',
             'rate': 'org-openroadm-otn-common-types:ODU4',
             'monitoring-mode': 'terminated',
             'expected-dapi': 'AItaZ6nmyaKJ',
@@ -939,28 +958,32 @@ class TransportPCEtesting(unittest.TestCase):
             'tx-dapi': 'AKFnJJaijWiz',
             'tx-sapi': 'AItaZ6nmyaKJ'}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
+                                  **input_dict_2),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
+                             )
         self.assertDictEqual(
             {'payload-type': '21', 'exp-payload-type': '21'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
-        response2 = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR2-CLIENT1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res2 = response2.json()['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
-        self.assertEqual(input_dict_2['tx-sapi'], res2['tx-dapi'])
-        self.assertEqual(input_dict_2['tx-sapi'], res2['expected-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['tx-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['expected-dapi'])
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+
+        response2 = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR2-CLIENT1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(input_dict_2['tx-sapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['tx-dapi'])
+        self.assertEqual(input_dict_2['tx-sapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['expected-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['tx-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['expected-dapi'])
 
     def test_051_check_interface_ODU4_NETWORK_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR2-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR2-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP5-CFP',
@@ -973,56 +996,51 @@ class TransportPCEtesting(unittest.TestCase):
             'rate': 'org-openroadm-otn-common-types:ODU4',
             'monitoring-mode': 'monitored'}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
+                                  **input_dict_2),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
+                             )
         self.assertNotIn('opu',
-                         dict.keys(res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']))
+                         dict.keys(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']))
 
     def test_052_check_ODU4_connection_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1",
-            "odu-connection/XPDR2-CLIENT1-ODU4-x-XPDR2-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'odu-connection', 'XPDR2-CLIENT1-ODU4-x-XPDR2-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {
             'connection-name':
             'XPDR2-CLIENT1-ODU4-x-XPDR2-NETWORK1-ODU4',
             'direction': 'bidirectional'
         }
 
-        self.assertDictEqual(dict(input_dict_1, **res['odu-connection'][0]),
-                             res['odu-connection'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
+                             response['odu-connection'][0])
         self.assertDictEqual({'dst-if': 'XPDR2-NETWORK1-ODU4'},
-                             res['odu-connection'][0]['destination'])
+                             response['odu-connection'][0]['destination'])
         self.assertDictEqual({'src-if': 'XPDR2-CLIENT1-ODU4'},
-                             res['odu-connection'][0]['source'])
+                             response['odu-connection'][0]['source'])
 
     def test_053_check_interface_100GE_CLIENT_spdrc(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR2-CLIENT1-ETHERNET")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR2-CLIENT1-ETHERNET')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict = {'name': 'XPDR2-CLIENT1-ETHERNET',
                       'administrative-state': 'inService',
                       'supporting-circuit-pack-name': 'CP2-QSFP1',
                       'type': 'org-openroadm-interfaces:ethernetCsmacd',
                       'supporting-port': 'CP2-QSFP1-P1'
                       }
-        self.assertDictEqual(dict(input_dict, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(
-            {'speed': 100000,
-             'fec': 'off'},
-            res['interface'][0]['org-openroadm-ethernet-interfaces:ethernet'])
+        self.assertDictEqual(dict(input_dict, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertEqual(100000, response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']['speed'])
+        self.assertEqual('off', response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']['fec'])
 
     def test_054_check_interface_ODU4_CLIENT_spdrc(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR2-CLIENT1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR2-CLIENT1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-CLIENT1-ODU4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP2-QSFP1',
@@ -1040,28 +1058,32 @@ class TransportPCEtesting(unittest.TestCase):
             'tx-dapi': 'AItaZ6nmyaKJ',
             'tx-sapi': 'AKFnJJaijWiz'}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
+                                  **input_dict_2),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
+                             )
         self.assertDictEqual(
             {'payload-type': '21', 'exp-payload-type': '21'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
-        response2 = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR2-CLIENT1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res2 = response2.json()['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
-        self.assertEqual(input_dict_2['tx-sapi'], res2['tx-dapi'])
-        self.assertEqual(input_dict_2['tx-sapi'], res2['expected-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['tx-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['expected-dapi'])
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+
+        response2 = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR2-CLIENT1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(input_dict_2['tx-sapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['tx-dapi'])
+        self.assertEqual(input_dict_2['tx-sapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['expected-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['tx-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['expected-dapi'])
 
     def test_055_check_interface_ODU4_NETWORK_spdrc(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR2-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR2-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP5-CFP',
@@ -1074,38 +1096,36 @@ class TransportPCEtesting(unittest.TestCase):
             'rate': 'org-openroadm-otn-common-types:ODU4',
             'monitoring-mode': 'monitored'}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
+                                  **input_dict_2),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
+                             )
         self.assertNotIn('opu',
-                         dict.keys(res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']))
+                         dict.keys(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']))
 
     def test_056_check_ODU4_connection_spdrc(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1",
-            "odu-connection/XPDR2-CLIENT1-ODU4-x-XPDR2-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'odu-connection', 'XPDR2-CLIENT1-ODU4-x-XPDR2-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {
             'connection-name':
             'XPDR2-CLIENT1-ODU4-x-XPDR2-NETWORK1-ODU4',
             'direction': 'bidirectional'
         }
 
-        self.assertDictEqual(dict(input_dict_1, **res['odu-connection'][0]),
-                             res['odu-connection'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
+                             response['odu-connection'][0])
         self.assertDictEqual({'dst-if': 'XPDR2-NETWORK1-ODU4'},
-                             res['odu-connection'][0]['destination'])
+                             response['odu-connection'][0]['destination'])
         self.assertDictEqual({'src-if': 'XPDR2-CLIENT1-ODU4'},
-                             res['odu-connection'][0]['source'])
+                             response['odu-connection'][0]['source'])
 
     def test_057_check_interface_ODU4_NETWORK1_spdrb(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SB1", "interface/XPDR2-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP5-CFP',
@@ -1116,20 +1136,20 @@ class TransportPCEtesting(unittest.TestCase):
             'rate': 'org-openroadm-otn-common-types:ODU4',
             'monitoring-mode': 'monitored'}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
+                                  **input_dict_2),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
+                             )
         self.assertNotIn('opu',
-                         dict.keys(res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']))
+                         dict.keys(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']))
 
     def test_058_check_interface_ODU4_NETWORK2_spdrb(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SB1", "interface/XPDR2-NETWORK2-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU4',
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK2-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR2-NETWORK2-ODU4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP6-CFP',
                         'type': 'org-openroadm-interfaces:otnOdu',
@@ -1139,147 +1159,154 @@ class TransportPCEtesting(unittest.TestCase):
             'rate': 'org-openroadm-otn-common-types:ODU4',
             'monitoring-mode': 'monitored'}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
+                                  **input_dict_2),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
+                             )
         self.assertNotIn('opu',
-                         dict.keys(res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']))
+                         dict.keys(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']))
 
     def test_059_check_ODU4_connection_spdrb(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SB1",
-            "odu-connection/XPDR2-NETWORK1-ODU4-x-XPDR2-NETWORK2-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SB1', 'odu-connection', 'XPDR2-NETWORK1-ODU4-x-XPDR2-NETWORK2-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {
             'connection-name':
             'XPDR2-NETWORK1-ODU4-x-XPDR2-NETWORK2-ODU4',
             'direction': 'bidirectional'
         }
 
-        self.assertDictEqual(dict(input_dict_1, **res['odu-connection'][0]),
-                             res['odu-connection'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
+                             response['odu-connection'][0])
         self.assertDictEqual({'dst-if': 'XPDR2-NETWORK2-ODU4'},
-                             res['odu-connection'][0]['destination'])
+                             response['odu-connection'][0]['destination'])
         self.assertDictEqual({'src-if': 'XPDR2-NETWORK1-ODU4'},
-                             res['odu-connection'][0]['source'])
+                             response['odu-connection'][0]['source'])
 
     def test_060_check_otn_topo_links(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nb_links = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nb_links, 4)
-        for link in res['network'][0]['ietf-network-topology:link']:
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 4)
+        for link in response['network'][0]['ietf-network-topology:link']:
             self.assertEqual(
                 link['org-openroadm-otn-network-topology:available-bandwidth'], 0)
             self.assertEqual(
                 link['org-openroadm-otn-network-topology:used-bandwidth'], 100000)
 
     def test_061_delete_service_100GE_ABC(self):
-        response = test_utils.service_delete_request("service-100GE-ABC")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service-100GE-ABC"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_062_check_service_list(self):
-        response = test_utils.get_service_list_request("")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(len(res['service-list']['services']), 2)
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_request()
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['service-list']['services']), 2)
+        time.sleep(1)
 
     def test_063_check_no_ODU4_connection_spdra(self):
-        response = test_utils.check_netconf_node_request("SPDR-SA1", "")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertNotIn(['odu-connection'][0], res['org-openroadm-device'])
+        response = test_utils.check_node_request("SPDR-SA1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertNotIn(['odu-connection'][0], response['org-openroadm-device'])
         time.sleep(1)
 
     def test_064_check_no_interface_ODU4_NETWORK_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR2-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR2-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_065_check_no_interface_ODU4_CLIENT_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR2-CLIENT1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR2-CLIENT1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_066_check_no_interface_100GE_CLIENT_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR2-CLIENT1-ETHERNET")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR2-CLIENT1-ETHERNET')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_067_check_otn_topo_links(self):
         self.test_046_check_otn_topo_otu4_links()
 
     def test_068_delete_OCH_OTU4_service_AB(self):
-        response = test_utils.service_delete_request("service-OCH-OTU4-AB")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service-OCH-OTU4-AB"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_069_delete_OCH_OTU4_service_BC(self):
-        response = test_utils.service_delete_request("service-OCH-OTU4-BC")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service-OCH-OTU4-BC"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_070_get_no_service(self):
-        response = test_utils.get_service_list_request("")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-        res = response.json()
-        self.assertIn(
-            {"error-type": "application", "error-tag": "data-missing",
-             "error-message": "Request could not be completed because the relevant data model content does not exist"},
-            res['errors']['error'])
+        response = test_utils.get_ordm_serv_list_request()
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+        self.assertIn(response['service-list'], (
+            {
+                "error-type": "protocol",
+                "error-tag": "data-missing",
+                "error-message":
+                    "Request could not be completed because the relevant data "
+                    "model content does not exist"
+            }, {
+                "error-type": "application",
+                "error-tag": "data-missing",
+                "error-message":
+                    "Request could not be completed because the relevant data "
+                    "model content does not exist"
+            }))
         time.sleep(1)
 
     def test_071_check_no_interface_OTU4_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR2-NETWORK1-OTU")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR2-NETWORK1-OTU')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_072_check_no_interface_OCH_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR2-NETWORK1-761:768")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR2-NETWORK1-761:768')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_073_getLinks_OtnTopology(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertNotIn('ietf-network-topology:link', res['network'][0])
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertNotIn('ietf-network-topology:link', response['network'][0])
 
     def test_074_check_openroadm_topo_spdra(self):
-        response = test_utils.get_ordm_topo_request("node/SPDR-SA1-XPDR2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        tp = res['node'][0]['ietf-network-topology:termination-point'][0]
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'SPDR-SA1-XPDR2', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        tp = response['node']['ietf-network-topology:termination-point'][0]
         self.assertEqual('XPDR2-NETWORK1', tp['tp-id'])
         self.assertNotIn('wavelength', dict.keys(
             tp['org-openroadm-network-topology:xpdr-network-attributes']))
-        time.sleep(3)
+        time.sleep(1)
 
     def test_075_check_openroadm_topo_ROADMB_SRG1(self):
-        response = test_utils.get_ordm_topo_request("node/ROADM-B1-SRG1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADM-B1-SRG1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available")
         self.assertEqual(freq_map_array[94], 255, "Lambda 1 should be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'SRG1-PP1-TXRX':
                 freq_map = base64.b64decode(
@@ -1291,17 +1318,16 @@ class TransportPCEtesting(unittest.TestCase):
                     ele['org-openroadm-network-topology:pp-attributes']['avail-freq-maps'][0]['freq-map'])
                 freq_map_array = [int(x) for x in freq_map]
                 self.assertEqual(freq_map_array[94], 255, "Lambda 1 should be available")
-        time.sleep(3)
+        time.sleep(1)
 
     def test_076_check_openroadm_topo_ROADMB_DEG1(self):
-        response = test_utils.get_ordm_topo_request("node/ROADM-B1-DEG1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADM-B1-DEG1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'DEG1-CTP-TXRX':
                 freq_map = base64.b64decode(
@@ -1313,17 +1339,16 @@ class TransportPCEtesting(unittest.TestCase):
                     ele['org-openroadm-network-topology:tx-ttp-attributes']['avail-freq-maps'][0]['freq-map'])
                 freq_map_array = [int(x) for x in freq_map]
                 self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available")
-        time.sleep(3)
+        time.sleep(1)
 
     def test_077_check_openroadm_topo_ROADMB_DEG2(self):
-        response = test_utils.get_ordm_topo_request("node/ROADM-B1-DEG2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADM-B1-DEG2', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'DEG2-CTP-TXRX':
                 freq_map = base64.b64decode(
@@ -1335,43 +1360,37 @@ class TransportPCEtesting(unittest.TestCase):
                     ele['org-openroadm-network-topology:tx-ttp-attributes']['avail-freq-maps'][0]['freq-map'])
                 freq_map_array = [int(x) for x in freq_map]
                 self.assertEqual(freq_map_array[95], 255, "Lambda 1 should be available")
-        time.sleep(3)
+        time.sleep(1)
 
     def test_078_disconnect_xponders_from_roadm(self):
-        url = "{}/config/ietf-network:networks/network/openroadm-topology/ietf-network-topology:link/"
-        response = test_utils.get_ordm_topo_request("")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        links = res['network'][0]['ietf-network-topology:link']
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        links = response['network'][0]['ietf-network-topology:link']
         for link in links:
             if (link["org-openroadm-common-network:link-type"] in ('XPONDER-OUTPUT', 'XPONDER-INPUT')
                     and ('SPDR-SB1' in link['link-id'] or 'ROADM-B1' in link['link-id'])):
-                link_name = link["link-id"]
-                response = test_utils.delete_request(url+link_name)
-                self.assertEqual(response.status_code, requests.codes.ok)
+                response = test_utils.del_ietf_network_link_request(
+                    'openroadm-topology', link['link-id'], 'config')
+                self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_079_disconnect_spdrB(self):
         response = test_utils.unmount_device("SPDR-SB1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_080_disconnect_roadmB(self):
         response = test_utils.unmount_device("ROADM-B1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_081_remove_roadm_to_roadm_links(self):
-        url = "{}/config/ietf-network:networks/network/openroadm-topology/ietf-network-topology:link/"
-        response = test_utils.get_ordm_topo_request("")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        links = res['network'][0]['ietf-network-topology:link']
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        links = response['network'][0]['ietf-network-topology:link']
         for link in links:
             if (link["org-openroadm-common-network:link-type"] == "ROADM-TO-ROADM"
                     and 'ROADM-B1' in link['link-id']):
-                link_name = link["link-id"]
-                response = test_utils.delete_request(url+link_name)
-                self.assertEqual(response.status_code, requests.codes.ok)
+                response = test_utils.del_ietf_network_link_request(
+                    'openroadm-topology', link['link-id'], 'config')
+                self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_082_add_omsAttributes_ROADMA_ROADMC(self):
         # Config ROADMA-ROADMC oms-attributes
@@ -1385,8 +1404,8 @@ class TransportPCEtesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request(
-            "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request("ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX",
+                                                   data)
         self.assertEqual(response.status_code, requests.codes.created)
 
     def test_083_add_omsAttributes_ROADMC_ROADMA(self):
@@ -1401,98 +1420,86 @@ class TransportPCEtesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request(
-            "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request("ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX",
+                                                   data)
         self.assertEqual(response.status_code, requests.codes.created)
 
     def test_084_create_OCH_OTU4_service_AC(self):
-        # pylint: disable=line-too-long
-        self.cr_serv_sample_data["input"]["service-name"] = "service-OCH-OTU4-AC"
-        self.cr_serv_sample_data["input"]["connection-type"] = "infrastructure"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-rate"] = "100"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-format"] = "OTU"
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR2"
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR2"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["otu-service-rate"] = "org-openroadm-otn-common-types:OTU4"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-rate"] = "100"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-format"] = "OTU"
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR2"
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR2"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["otu-service-rate"] = "org-openroadm-otn-common-types:OTU4"
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.cr_serv_input_data["service-name"] = "service-OCH-OTU4-AC"
+        self.cr_serv_input_data["connection-type"] = "infrastructure"
+        self.cr_serv_input_data["service-a-end"]["service-rate"] = "100"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "OTU"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR2"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK1"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR2"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK1"
+        self.cr_serv_input_data["service-a-end"]["otu-service-rate"] = "org-openroadm-otn-common-types:OTU4"
+        self.cr_serv_input_data["service-z-end"]["service-rate"] = "100"
+        self.cr_serv_input_data["service-z-end"]["service-format"] = "OTU"
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR2"
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK1"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR2"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK1"
+        self.cr_serv_input_data["service-z-end"]["otu-service-rate"] = "org-openroadm-otn-common-types:OTU4"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_085_get_OCH_OTU4_service_AC(self):
-        response = test_utils.get_service_list_request(
-            "services/service-OCH-OTU4-AC")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service-OCH-OTU4-AC')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'infrastructure')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service-OCH-OTU4-AC")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service-OCH-OTU4-AC')
+        self.assertEqual(response['services'][0]['connection-type'], 'infrastructure')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        time.sleep(1)
 
 # test service-create for 100GE service from spdrA to spdrC via spdrB
     def test_086_create_100GE_service_AC(self):
-        # pylint: disable=line-too-long
-        self.cr_serv_sample_data["input"]["service-name"] = "service-100GE-AC"
-        self.cr_serv_sample_data["input"]["connection-type"] = "service"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-format"] = "Ethernet"
-        self.cr_serv_sample_data["input"]["service-a-end"]["node-id"] = "SPDR-SA1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["clli"] = "NodeSA"
-        del self.cr_serv_sample_data["input"]["service-a-end"]["otu-service-rate"]
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR2"
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR2"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-format"] = "Ethernet"
-        self.cr_serv_sample_data["input"]["service-z-end"]["node-id"] = "SPDR-SC1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["clli"] = "NodeSC"
-        del self.cr_serv_sample_data["input"]["service-z-end"]["otu-service-rate"]
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR2"
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR2"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
-
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.cr_serv_input_data["service-name"] = "service-100GE-AC"
+        self.cr_serv_input_data["connection-type"] = "service"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "Ethernet"
+        self.cr_serv_input_data["service-a-end"]["node-id"] = "SPDR-SA1"
+        self.cr_serv_input_data["service-a-end"]["clli"] = "NodeSA"
+        del self.cr_serv_input_data["service-a-end"]["otu-service-rate"]
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR2"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR2"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
+        self.cr_serv_input_data["service-z-end"]["service-format"] = "Ethernet"
+        self.cr_serv_input_data["service-z-end"]["node-id"] = "SPDR-SC1"
+        self.cr_serv_input_data["service-z-end"]["clli"] = "NodeSC"
+        del self.cr_serv_input_data["service-z-end"]["otu-service-rate"]
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR2"
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR2"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
+
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_087_get_100GE_service_AC(self):
-        response = test_utils.get_service_list_request("services/service-100GE-AC")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service-100GE-AC')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'service')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service-100GE-AC")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service-100GE-AC')
+        self.assertEqual(response['services'][0]['connection-type'], 'service')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        time.sleep(1)
 
     def test_088_check_interface_OTU4_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR2-NETWORK1-OTU")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR2-NETWORK1-OTU')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-OTU',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP5-CFP',
@@ -1507,26 +1514,23 @@ class TransportPCEtesting(unittest.TestCase):
                         'rate': 'org-openroadm-otn-common-types:OTU4',
                         'fec': 'scfec'
                         }
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-
-        self.assertDictEqual(input_dict_2,
-                             res['interface'][0]
-                             ['org-openroadm-otn-otu-interfaces:otu'])
-        response2 = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR2-NETWORK1-OTU/otu")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res2 = response2.json()['org-openroadm-otn-otu-interfaces:otu']
-        self.assertEqual(input_dict_2['tx-sapi'], res2['tx-dapi'])
-        self.assertEqual(input_dict_2['tx-sapi'], res2['expected-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['tx-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['expected-dapi'])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2, **response['interface'][0]['org-openroadm-otn-otu-interfaces:otu']),
+                             response['interface'][0]['org-openroadm-otn-otu-interfaces:otu'])
+
+        response2 = test_utils.check_node_attribute2_request(
+            'SPDR-SC1', 'interface', 'XPDR2-NETWORK1-OTU', 'org-openroadm-otn-otu-interfaces:otu')
+        self.assertEqual(response2['status_code'], requests.codes.ok)
+        self.assertEqual(input_dict_2['tx-sapi'], response2['org-openroadm-otn-otu-interfaces:otu']['tx-dapi'])
+        self.assertEqual(input_dict_2['tx-sapi'], response2['org-openroadm-otn-otu-interfaces:otu']['expected-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'], response2['org-openroadm-otn-otu-interfaces:otu']['tx-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'], response2['org-openroadm-otn-otu-interfaces:otu']['expected-dapi'])
 
     def test_089_check_interface_OTU4_spdrC(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR2-NETWORK1-OTU")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR2-NETWORK1-OTU')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-OTU',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP5-CFP',
@@ -1541,20 +1545,18 @@ class TransportPCEtesting(unittest.TestCase):
                         'rate': 'org-openroadm-otn-common-types:OTU4',
                         'fec': 'scfec'
                         }
-
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(input_dict_2,
-                             res['interface'][0]
-                             ['org-openroadm-otn-otu-interfaces:otu'])
-        response2 = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR2-NETWORK1-OTU/otu")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res2 = response2.json()['org-openroadm-otn-otu-interfaces:otu']
-        self.assertEqual(input_dict_2['tx-sapi'], res2['tx-dapi'])
-        self.assertEqual(input_dict_2['tx-sapi'], res2['expected-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['tx-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['expected-dapi'])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2, **response['interface'][0]['org-openroadm-otn-otu-interfaces:otu']),
+                             response['interface'][0]['org-openroadm-otn-otu-interfaces:otu'])
+
+        response2 = test_utils.check_node_attribute2_request(
+            'SPDR-SA1', 'interface', 'XPDR2-NETWORK1-OTU', 'org-openroadm-otn-otu-interfaces:otu')
+        self.assertEqual(response2['status_code'], requests.codes.ok)
+        self.assertEqual(input_dict_2['tx-sapi'], response2['org-openroadm-otn-otu-interfaces:otu']['tx-dapi'])
+        self.assertEqual(input_dict_2['tx-sapi'], response2['org-openroadm-otn-otu-interfaces:otu']['expected-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'], response2['org-openroadm-otn-otu-interfaces:otu']['tx-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'], response2['org-openroadm-otn-otu-interfaces:otu']['expected-dapi'])
 
     def test_090_check_configuration_spdra(self):
         self.test_049_check_interface_100GE_CLIENT_spdra()
@@ -1569,31 +1571,30 @@ class TransportPCEtesting(unittest.TestCase):
         self.test_056_check_ODU4_connection_spdrc()
 
     def test_092_check_otn_topo_links(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nb_links = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nb_links, 2)
-        for link in res['network'][0]['ietf-network-topology:link']:
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 2)
+        for link in response['network'][0]['ietf-network-topology:link']:
             self.assertEqual(
                 link['org-openroadm-otn-network-topology:available-bandwidth'], 0)
             self.assertEqual(
                 link['org-openroadm-otn-network-topology:used-bandwidth'], 100000)
 
     def test_093_delete_100GE_service_AC(self):
-        response = test_utils.service_delete_request("service-100GE-AC")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service-100GE-AC"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_094_check_service_list(self):
-        response = test_utils.get_service_list_request("")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(len(res['service-list']['services']), 1)
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_request()
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['service-list']['services']), 1)
+        time.sleep(1)
 
     def test_095_check_configuration_spdra(self):
         self.test_063_check_no_ODU4_connection_spdra()
@@ -1602,48 +1603,40 @@ class TransportPCEtesting(unittest.TestCase):
         self.test_066_check_no_interface_100GE_CLIENT_spdra()
 
     def test_096_check_otn_topo_links(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nb_links = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nb_links, 2)
-        for link in res['network'][0]['ietf-network-topology:link']:
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 2)
+        for link in response['network'][0]['ietf-network-topology:link']:
             self.assertEqual(
                 link['org-openroadm-otn-network-topology:available-bandwidth'], 100000)
             self.assertEqual(
                 link['org-openroadm-otn-network-topology:used-bandwidth'], 0)
 
     def test_097_disconnect_xponders_from_roadm(self):
-        url = "{}/config/ietf-network:networks/network/openroadm-topology/ietf-network-topology:link/"
-        response = test_utils.get_ordm_topo_request("")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        links = res['network'][0]['ietf-network-topology:link']
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        links = response['network'][0]['ietf-network-topology:link']
         for link in links:
             if link["org-openroadm-common-network:link-type"] in ('XPONDER-OUTPUT', 'XPONDER-INPUT'):
-                link_name = link["link-id"]
-                response = test_utils.delete_request(url+link_name)
-                self.assertEqual(response.status_code, requests.codes.ok)
+                response = test_utils.del_ietf_network_link_request(
+                    'openroadm-topology', link['link-id'], 'config')
+                self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_098_disconnect_spdrA(self):
         response = test_utils.unmount_device("SPDR-SA1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_099_disconnect_spdrC(self):
         response = test_utils.unmount_device("SPDR-SC1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_100_disconnect_roadmA(self):
         response = test_utils.unmount_device("ROADM-A1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_101_disconnect_roadmC(self):
         response = test_utils.unmount_device("ROADM-C1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
 
 if __name__ == "__main__":
index 388c4fa25079c21999fca09b64aef081ccd284ff..c0c6505561e01168324eac41a676245ea59fd592 100644 (file)
@@ -30,7 +30,7 @@ class TransportPCEtesting(unittest.TestCase):
     WAITING = 20  # nominal value is 300
     NODE_VERSION = '2.2.1'
 
-    cr_serv_sample_data = {"input": {
+    cr_serv_input_data = {
         "sdnc-request-header": {
             "request-id": "request-1",
             "rpc-action": "service-create",
@@ -122,6 +122,15 @@ class TransportPCEtesting(unittest.TestCase):
         "due-date": "2018-06-15T00:00:01Z",
         "operator-contact": "pw1234"
     }
+    del_serv_input_data = {
+        "sdnc-request-header": {
+            "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
+            "rpc-action": "service-delete",
+            "request-system-id": "appname",
+            "notification-url": "http://localhost:8585/NotificationServer/notify"},
+        "service-delete-req-info": {
+            "service-name": "TBD",
+            "tail-retention": "no"}
     }
 
     @classmethod
@@ -175,75 +184,75 @@ class TransportPCEtesting(unittest.TestCase):
                          requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_007_connect_sprdA_1_N1_to_roadmA_PP1(self):
-        response = test_utils.connect_xpdr_to_rdm_request("SPDR-SA1", "1", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'SPDR-SA1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_008_connect_roadmA_PP1_to_spdrA_1_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("SPDR-SA1", "1", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'SPDR-SA1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_009_connect_sprdC_1_N1_to_roadmC_PP1(self):
-        response = test_utils.connect_xpdr_to_rdm_request("SPDR-SC1", "1", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'SPDR-SC1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_010_connect_roadmC_PP1_to_spdrC_1_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("SPDR-SC1", "1", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'SPDR-SC1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_011_connect_sprdB_2_N1_to_roadmB_PP1(self):
-        response = test_utils.connect_xpdr_to_rdm_request("SPDR-SB1", "2", "1",
-                                                          "ROADM-B1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'SPDR-SB1', 'xpdr-num': '2', 'network-num': '1',
+                             'rdm-node': 'ROADM-B1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_012_connect_roadmB_PP1_to_spdrB_2_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("SPDR-SB1", "2", "1",
-                                                          "ROADM-B1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'SPDR-SB1', 'xpdr-num': '2', 'network-num': '1',
+                             'rdm-node': 'ROADM-B1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_013_connect_sprdB_2_N2_to_roadmB_PP2(self):
-        response = test_utils.connect_xpdr_to_rdm_request("SPDR-SB1", "2", "2",
-                                                          "ROADM-B1", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'SPDR-SB1', 'xpdr-num': '2', 'network-num': '2',
+                             'rdm-node': 'ROADM-B1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_014_connect_roadmB_PP2_to_spdrB_2_N2(self):
-        response = test_utils.connect_rdm_to_xpdr_request("SPDR-SB1", "2", "2",
-                                                          "ROADM-B1", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'SPDR-SB1', 'xpdr-num': '2', 'network-num': '2',
+                             'rdm-node': 'ROADM-B1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_015_add_omsAttributes_ROADMA_ROADMB(self):
@@ -258,8 +267,8 @@ class TransportPCEtesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request(
-            "ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request("ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX",
+                                                   data)
         self.assertEqual(response.status_code, requests.codes.created)
 
     def test_016_add_omsAttributes_ROADMB_ROADMA(self):
@@ -274,8 +283,8 @@ class TransportPCEtesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request(
-            "ROADM-B1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG1-DEG1-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request("ROADM-B1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG1-DEG1-TTP-TXRX",
+                                                   data)
         self.assertEqual(response.status_code, requests.codes.created)
 
     def test_017_add_omsAttributes_ROADMB_ROADMC(self):
@@ -290,8 +299,8 @@ class TransportPCEtesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request(
-            "ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request("ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX",
+                                                   data)
         self.assertEqual(response.status_code, requests.codes.created)
 
     def test_018_add_omsAttributes_ROADMC_ROADMB(self):
@@ -306,125 +315,124 @@ class TransportPCEtesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request(
-            "ROADM-C1-DEG2-DEG2-TTP-TXRXtoROADM-B1-DEG2-DEG2-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request("ROADM-C1-DEG2-DEG2-TTP-TXRXtoROADM-B1-DEG2-DEG2-TTP-TXRX",
+                                                   data)
         self.assertEqual(response.status_code, requests.codes.created)
 
     def test_019_create_OTS_ROADMA_DEG1(self):
-        response = test_utils.create_ots_oms_request("ROADM-A1", "DEG1-TTP-TXRX")
-        time.sleep(10)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-device-renderer', 'create-ots-oms',
+            {
+                'node-id': 'ROADM-A1',
+                'logical-connection-point': 'DEG1-TTP-TXRX'
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Interfaces OTS-DEG1-TTP-TXRX - OMS-DEG1-TTP-TXRX successfully created on node ROADM-A1',
-                      res["output"]["result"])
+                      response["output"]["result"])
 
     def test_020_create_OTS_ROADMB_DEG1(self):
-        response = test_utils.create_ots_oms_request("ROADM-B1", "DEG1-TTP-TXRX")
-        time.sleep(10)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-device-renderer', 'create-ots-oms',
+            {
+                'node-id': 'ROADM-B1',
+                'logical-connection-point': 'DEG1-TTP-TXRX'
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Interfaces OTS-DEG1-TTP-TXRX - OMS-DEG1-TTP-TXRX successfully created on node ROADM-B1',
-                      res["output"]["result"])
+                      response["output"]["result"])
 
     def test_021_create_OTS_ROADMB_DEG2(self):
-        response = test_utils.create_ots_oms_request("ROADM-B1", "DEG2-TTP-TXRX")
-        time.sleep(10)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-device-renderer', 'create-ots-oms',
+            {
+                'node-id': 'ROADM-B1',
+                'logical-connection-point': 'DEG2-TTP-TXRX'
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Interfaces OTS-DEG2-TTP-TXRX - OMS-DEG2-TTP-TXRX successfully created on node ROADM-B1',
-                      res["output"]["result"])
+                      response["output"]["result"])
 
     def test_022_create_OTS_ROADMC_DEG2(self):
-        response = test_utils.create_ots_oms_request("ROADM-C1", "DEG2-TTP-TXRX")
-        time.sleep(10)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-device-renderer', 'create-ots-oms',
+            {
+                'node-id': 'ROADM-C1',
+                'logical-connection-point': 'DEG2-TTP-TXRX'
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Interfaces OTS-DEG2-TTP-TXRX - OMS-DEG2-TTP-TXRX successfully created on node ROADM-C1',
-                      res["output"]["result"])
+                      response["output"]["result"])
 
     def test_023_calculate_span_loss_base_all(self):
-        url = "{}/operations/transportpce-olm:calculate-spanloss-base"
-        data = {
-            "input": {
-                "src-type": "all"
-            }
-        }
-        response = test_utils.post_request(url, data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Success',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-olm', 'calculate-spanloss-base',
+            {
+                'src-type': 'all'
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Success', response["output"]["result"])
         self.assertIn({
             "spanloss": "25.7",
             "link-id": "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX"
-        }, res["output"]["spans"])
+        }, response["output"]["spans"])
         self.assertIn({
             "spanloss": "17.6",
             "link-id": "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX"
-        }, res["output"]["spans"])
+        }, response["output"]["spans"])
         self.assertIn({
             "spanloss": "23.6",
             "link-id": "ROADM-B1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG1-DEG1-TTP-TXRX"
-        }, res["output"]["spans"])
+        }, response["output"]["spans"])
         self.assertIn({
             "spanloss": "23.6",
             "link-id": "ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX"
-        }, res["output"]["spans"])
+        }, response["output"]["spans"])
         self.assertIn({
             "spanloss": "25.7",
             "link-id": "ROADM-C1-DEG2-DEG2-TTP-TXRXtoROADM-B1-DEG2-DEG2-TTP-TXRX"
-        }, res["output"]["spans"])
+        }, response["output"]["spans"])
         self.assertIn({
             "spanloss": "17.6",
             "link-id": "ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX"
-        }, res["output"]["spans"])
+        }, response["output"]["spans"])
         time.sleep(5)
 
     def test_024_check_otn_topology(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nbNode = len(res['network'][0]['node'])
-        self.assertEqual(nbNode, 9, 'There should be 9 nodes')
-        self.assertNotIn('ietf-network-topology:link', res['network'][0],
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['node']), 9, 'There should be 9 nodes')
+        self.assertNotIn('ietf-network-topology:link', response['network'][0],
                          'otn-topology should have no link')
 
 # test service-create for OCH-OTU4 service from spdrA to spdrB
     def test_025_create_OCH_OTU4_service_AB(self):
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_026_get_OCH_OTU4_service_AB(self):
-        response = test_utils.get_service_list_request(
-            "services/service-OCH-OTU4-AB")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service-OCH-OTU4-AB')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'infrastructure')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service-OCH-OTU4-AB")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service-OCH-OTU4-AB')
+        self.assertEqual(response['services'][0]['connection-type'], 'infrastructure')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        time.sleep(1)
 
     def test_027_check_otn_topo_otu4_links(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nb_links = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nb_links, 2)
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 2)
         listLinkId = ['OTU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SB1-XPDR2-XPDR2-NETWORK1',
                       'OTU4-SPDR-SB1-XPDR2-XPDR2-NETWORK1toSPDR-SA1-XPDR1-XPDR1-NETWORK1']
-        for link in res['network'][0]['ietf-network-topology:link']:
+        for link in response['network'][0]['ietf-network-topology:link']:
             self.assertIn(link['link-id'], listLinkId)
             self.assertEqual(
-                link['transportpce-topology:otn-link-type'], 'OTU4')
+                link['transportpce-networkutils:otn-link-type'], 'OTU4')
             self.assertEqual(
                 link['org-openroadm-common-network:link-type'], 'OTN-LINK')
             self.assertEqual(
@@ -436,57 +444,48 @@ class TransportPCEtesting(unittest.TestCase):
 
 # test service-create for OCH-OTU4 service from spdrB to spdrC
     def test_028_create_OCH_OTU4_service_BC(self):
-        # pylint: disable=line-too-long
-        self.cr_serv_sample_data["input"]["service-name"] = "service-OCH-OTU4-BC"
-        self.cr_serv_sample_data["input"]["service-a-end"]["node-id"] = "SPDR-SB1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["clli"] = "NodeSB"
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SB1-XPDR2"
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK2"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SB1-XPDR2"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK2"
-        self.cr_serv_sample_data["input"]["service-z-end"]["node-id"] = "SPDR-SC1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["clli"] = "NodeSC"
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-NETWORK1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-NETWORK1"
-
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.cr_serv_input_data["service-name"] = "service-OCH-OTU4-BC"
+        self.cr_serv_input_data["service-a-end"]["node-id"] = "SPDR-SB1"
+        self.cr_serv_input_data["service-a-end"]["clli"] = "NodeSB"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SB1-XPDR2"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK2"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SB1-XPDR2"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK2"
+        self.cr_serv_input_data["service-z-end"]["node-id"] = "SPDR-SC1"
+        self.cr_serv_input_data["service-z-end"]["clli"] = "NodeSC"
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR1"
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-NETWORK1"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR1"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-NETWORK1"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_029_get_OCH_OTU4_service_BC(self):
-        response = test_utils.get_service_list_request(
-            "services/service-OCH-OTU4-BC")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service-OCH-OTU4-BC')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'infrastructure')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service-OCH-OTU4-BC")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service-OCH-OTU4-BC')
+        self.assertEqual(response['services'][0]['connection-type'], 'infrastructure')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        time.sleep(1)
 
     def test_030_check_otn_topo_otu4_links(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nb_links = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nb_links, 4)
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 4)
         listLinkId = ['OTU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SB1-XPDR2-XPDR2-NETWORK1',
                       'OTU4-SPDR-SB1-XPDR2-XPDR2-NETWORK1toSPDR-SA1-XPDR1-XPDR1-NETWORK1',
                       'OTU4-SPDR-SB1-XPDR2-XPDR2-NETWORK2toSPDR-SC1-XPDR1-XPDR1-NETWORK1',
                       'OTU4-SPDR-SC1-XPDR1-XPDR1-NETWORK1toSPDR-SB1-XPDR2-XPDR2-NETWORK2']
-        for link in res['network'][0]['ietf-network-topology:link']:
+        for link in response['network'][0]['ietf-network-topology:link']:
             self.assertIn(link['link-id'], listLinkId)
             self.assertEqual(
-                link['transportpce-topology:otn-link-type'], 'OTU4')
+                link['transportpce-networkutils:otn-link-type'], 'OTU4')
             self.assertEqual(
                 link['org-openroadm-common-network:link-type'], 'OTN-LINK')
             self.assertEqual(
@@ -496,62 +495,57 @@ class TransportPCEtesting(unittest.TestCase):
             self.assertIn(
                 link['org-openroadm-common-network:opposite-link'], listLinkId)
 
+
 # test service-create for ODU4 service from spdrA to spdrC via spdrB
+
+
     def test_031_create_ODU4_service(self):
-        # pylint: disable=line-too-long
-        self.cr_serv_sample_data["input"]["service-name"] = "service-ODU4-ABC"
-        self.cr_serv_sample_data["input"]["service-a-end"]["node-id"] = "SPDR-SA1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["clli"] = "NodeSA"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-format"] = "ODU"
-        del self.cr_serv_sample_data["input"]["service-a-end"]["otu-service-rate"]
-        self.cr_serv_sample_data["input"]["service-a-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODU4"
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-NETWORK1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-NETWORK1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["node-id"] = "SPDR-SC1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["clli"] = "NodeSC"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-format"] = "ODU"
-        del self.cr_serv_sample_data["input"]["service-z-end"]["otu-service-rate"]
-        self.cr_serv_sample_data["input"]["service-z-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODU4"
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-NETWORK1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-NETWORK1"
-
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.cr_serv_input_data["service-name"] = "service-ODU4-ABC"
+        self.cr_serv_input_data["service-a-end"]["node-id"] = "SPDR-SA1"
+        self.cr_serv_input_data["service-a-end"]["clli"] = "NodeSA"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "ODU"
+        del self.cr_serv_input_data["service-a-end"]["otu-service-rate"]
+        self.cr_serv_input_data["service-a-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODU4"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR1"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-NETWORK1"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR1"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-NETWORK1"
+        self.cr_serv_input_data["service-z-end"]["node-id"] = "SPDR-SC1"
+        self.cr_serv_input_data["service-z-end"]["clli"] = "NodeSC"
+        self.cr_serv_input_data["service-z-end"]["service-format"] = "ODU"
+        del self.cr_serv_input_data["service-z-end"]["otu-service-rate"]
+        self.cr_serv_input_data["service-z-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODU4"
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR1"
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-NETWORK1"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR1"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-NETWORK1"
+
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_032_get_ODU4_service_ABC(self):
-        response = test_utils.get_service_list_request(
-            "services/service-ODU4-ABC")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service-ODU4-ABC')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'infrastructure')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service-ODU4-ABC")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service-ODU4-ABC')
+        self.assertEqual(response['services'][0]['connection-type'], 'infrastructure')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        time.sleep(1)
 
     def test_033_check_interface_ODU4_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
                         'type': 'org-openroadm-interfaces:otnOdu',
                         'supporting-port': 'CP1-CFP0-P1'}
-        #      SAPI/DAPI are added in the Otu4 renderer
         input_dict_2 = {'odu-function': 'org-openroadm-otn-common-types:ODU-TTP',
                         'rate': 'org-openroadm-otn-common-types:ODU4',
                         'expected-dapi': 'H/OelLynehI=',
@@ -559,64 +553,59 @@ class TransportPCEtesting(unittest.TestCase):
                         'tx-dapi': 'AMf1n5hK6Xkk',
                         'tx-sapi': 'H/OelLynehI='}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
                                   **input_dict_2),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
-                             )
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(
             {'payload-type': '21', 'exp-payload-type': '21'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
-        response2 = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR1-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res2 = response2.json()['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
-        self.assertEqual(input_dict_2['tx-sapi'], res2['tx-dapi'])
-        self.assertEqual(input_dict_2['tx-sapi'], res2['expected-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['tx-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['expected-dapi'])
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+
+        response2 = test_utils.check_node_attribute2_request(
+            'SPDR-SC1', 'interface', 'XPDR1-NETWORK1-ODU4', 'org-openroadm-otn-odu-interfaces:odu')
+        self.assertEqual(response2['status_code'], requests.codes.ok)
+        self.assertEqual(input_dict_2['tx-sapi'], response2['org-openroadm-otn-odu-interfaces:odu']['tx-dapi'])
+        self.assertEqual(input_dict_2['tx-sapi'], response2['org-openroadm-otn-odu-interfaces:odu']['expected-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'], response2['org-openroadm-otn-odu-interfaces:odu']['tx-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'], response2['org-openroadm-otn-odu-interfaces:odu']['expected-dapi'])
 
     def test_034_check_interface_ODU4_spdrc(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR1-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR1-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
                         'type': 'org-openroadm-interfaces:otnOdu',
                         'supporting-port': 'CP1-CFP0-P1'}
-        # SAPI/DAPI are added in the Otu4 renderer
         input_dict_2 = {'odu-function': 'org-openroadm-otn-common-types:ODU-TTP',
                         'rate': 'org-openroadm-otn-common-types:ODU4',
                         'expected-dapi': 'AMf1n5hK6Xkk',
                         'expected-sapi': 'H/OelLynehI=',
                         'tx-dapi': 'H/OelLynehI=',
                         'tx-sapi': 'AMf1n5hK6Xkk'}
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
                                   **input_dict_2),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
-                             )
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(
             {'payload-type': '21', 'exp-payload-type': '21'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
-        response2 = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res2 = response2.json()['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
-        self.assertEqual(input_dict_2['tx-sapi'], res2['tx-dapi'])
-        self.assertEqual(input_dict_2['tx-sapi'], res2['expected-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['tx-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['expected-dapi'])
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+
+        response2 = test_utils.check_node_attribute2_request(
+            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-ODU4', 'org-openroadm-otn-odu-interfaces:odu')
+        self.assertEqual(response2['status_code'], requests.codes.ok)
+        self.assertEqual(input_dict_2['tx-sapi'], response2['org-openroadm-otn-odu-interfaces:odu']['tx-dapi'])
+        self.assertEqual(input_dict_2['tx-sapi'], response2['org-openroadm-otn-odu-interfaces:odu']['expected-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'], response2['org-openroadm-otn-odu-interfaces:odu']['tx-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'], response2['org-openroadm-otn-odu-interfaces:odu']['expected-dapi'])
 
     def test_035_check_interface_ODU4_NETWORK1_spdrb(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SB1", "interface/XPDR2-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP5-CFP',
@@ -626,20 +615,18 @@ class TransportPCEtesting(unittest.TestCase):
             'odu-function': 'org-openroadm-otn-common-types:ODU-CTP',
             'rate': 'org-openroadm-otn-common-types:ODU4',
             'monitoring-mode': 'monitored'}
-
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertNotIn('opu',
-                         dict.keys(res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']))
+                         dict.keys(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']))
 
     def test_036_check_interface_ODU4_NETWORK2_spdrb(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SB1", "interface/XPDR2-NETWORK2-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK2-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP6-CFP',
@@ -650,40 +637,35 @@ class TransportPCEtesting(unittest.TestCase):
             'rate': 'org-openroadm-otn-common-types:ODU4',
             'monitoring-mode': 'monitored'}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertNotIn('opu',
-                         dict.keys(res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']))
+                         dict.keys(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']))
 
     def test_037_check_ODU4_connection_spdrb(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SB1",
-            "odu-connection/XPDR2-NETWORK1-ODU4-x-XPDR2-NETWORK2-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SB1', 'odu-connection', 'XPDR2-NETWORK1-ODU4-x-XPDR2-NETWORK2-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {
-            'connection-name':
-            'XPDR2-NETWORK1-ODU4-x-XPDR2-NETWORK2-ODU4',
+            'connection-name': 'XPDR2-NETWORK1-ODU4-x-XPDR2-NETWORK2-ODU4',
             'direction': 'bidirectional'
         }
 
-        self.assertDictEqual(dict(input_dict_1, **res['odu-connection'][0]),
-                             res['odu-connection'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
+                             response['odu-connection'][0])
         self.assertDictEqual({'dst-if': 'XPDR2-NETWORK2-ODU4'},
-                             res['odu-connection'][0]['destination'])
+                             response['odu-connection'][0]['destination'])
         self.assertDictEqual({'src-if': 'XPDR2-NETWORK1-ODU4'},
-                             res['odu-connection'][0]['source'])
+                             response['odu-connection'][0]['source'])
 
     def test_038_check_otn_topo_links(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nb_links = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nb_links, 6)
-        for link in res['network'][0]['ietf-network-topology:link']:
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 6)
+        for link in response['network'][0]['ietf-network-topology:link']:
             if 'OTU4' in link['link-id']:
                 self.assertEqual(
                     link['org-openroadm-otn-network-topology:available-bandwidth'], 0)
@@ -695,7 +677,7 @@ class TransportPCEtesting(unittest.TestCase):
                 self.assertEqual(
                     link['org-openroadm-otn-network-topology:used-bandwidth'], 0)
                 self.assertEqual(
-                    link['transportpce-topology:otn-link-type'], 'ODTU4')
+                    link['transportpce-networkutils:otn-link-type'], 'ODTU4')
                 self.assertEqual(
                     link['org-openroadm-common-network:link-type'], 'OTN-LINK')
                 self.assertIn(link['org-openroadm-common-network:opposite-link'],
@@ -705,9 +687,9 @@ class TransportPCEtesting(unittest.TestCase):
                 self.fail("this link should not exist")
 
     def test_039_check_otn_topo_tp(self):
-        response = test_utils.get_otn_topo_request()
-        res = response.json()
-        for node in res['network'][0]['node']:
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        for node in response['network'][0]['node']:
             if node['node-id'] == 'SPDR-SA1-XPDR1' or node['node-id'] == 'SPDR-SC1-XPDR1':
                 tpList = node['ietf-network-topology:termination-point']
                 for tp in tpList:
@@ -719,65 +701,59 @@ class TransportPCEtesting(unittest.TestCase):
                         self.assertEqual(xpdrTpPortConAt['odtu-tpn-pool'][0]['odtu-type'],
                                          'org-openroadm-otn-common-types:ODTU4.ts-Allocated')
 
+
 # test service-create for 10GE service from spdr to spdr
+
+
     def test_040_create_10GE_service(self):
-        self.cr_serv_sample_data["input"]["service-name"] = "service1-10GE"
-        self.cr_serv_sample_data["input"]["connection-type"] = "service"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-rate"] = "10"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-format"] = "Ethernet"
-        del self.cr_serv_sample_data["input"]["service-a-end"]["odu-service-rate"]
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-rate"] = "10"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-format"] = "Ethernet"
-        del self.cr_serv_sample_data["input"]["service-z-end"]["odu-service-rate"]
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.cr_serv_input_data["service-name"] = "service1-10GE"
+        self.cr_serv_input_data["connection-type"] = "service"
+        self.cr_serv_input_data["service-a-end"]["service-rate"] = "10"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "Ethernet"
+        del self.cr_serv_input_data["service-a-end"]["odu-service-rate"]
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
+        self.cr_serv_input_data["service-z-end"]["service-rate"] = "10"
+        self.cr_serv_input_data["service-z-end"]["service-format"] = "Ethernet"
+        del self.cr_serv_input_data["service-z-end"]["odu-service-rate"]
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_041_get_10GE_service1(self):
-        response = test_utils.get_service_list_request(
-            "services/service1-10GE")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service1-10GE')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'service')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service1-10GE")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service1-10GE')
+        self.assertEqual(response['services'][0]['connection-type'], 'service')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        time.sleep(1)
 
     def test_042_check_interface_10GE_CLIENT_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-CLIENT1-ETHERNET10G")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-CLIENT1-ETHERNET10G')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict = {'name': 'XPDR1-CLIENT1-ETHERNET10G',
                       'administrative-state': 'inService',
                       'supporting-circuit-pack-name': 'CP1-SFP4',
                       'type': 'org-openroadm-interfaces:ethernetCsmacd',
                       'supporting-port': 'CP1-SFP4-P1'
                       }
-        self.assertDictEqual(dict(input_dict, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(
-            {'speed': 10000},
-            res['interface'][0]['org-openroadm-ethernet-interfaces:ethernet'])
+        self.assertDictEqual(dict(input_dict, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertEqual(10000, response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']['speed'])
 
     def test_043_check_interface_ODU2E_CLIENT_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-CLIENT1-ODU2e")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e',
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-CLIENT1-ODU2e:service1-10GE')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e:service1-10GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-SFP4',
                         'supporting-interface': 'XPDR1-CLIENT1-ETHERNET10G',
@@ -792,29 +768,33 @@ class TransportPCEtesting(unittest.TestCase):
             'tx-dapi': 'BcwI5xz79t8=',
             'tx-sapi': 'B68VWipZAU0='}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
+                                  **input_dict_2),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
+                             )
         self.assertDictEqual(
             {'payload-type': '03', 'exp-payload-type': '03'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
-        response2 = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR1-CLIENT1-ODU2e")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res2 = response2.json()['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
-        self.assertEqual(input_dict_2['tx-sapi'], res2['tx-dapi'])
-        self.assertEqual(input_dict_2['tx-sapi'], res2['expected-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['tx-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['expected-dapi'])
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+
+        response2 = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR1-CLIENT1-ODU2e:service1-10GE')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(input_dict_2['tx-sapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['tx-dapi'])
+        self.assertEqual(input_dict_2['tx-sapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['expected-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['tx-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['expected-dapi'])
 
     def test_044_check_interface_ODU2E_NETWORK_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-NETWORK1-ODU2e")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e',
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-ODU2e:service1-10GE')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e:service1-10GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
                         'supporting-interface': 'XPDR1-NETWORK1-ODU4',
@@ -826,60 +806,54 @@ class TransportPCEtesting(unittest.TestCase):
             'monitoring-mode': 'monitored'}
         input_dict_3 = {'trib-port-number': 1}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
+                                  **input_dict_2),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
+                             )
         self.assertDictEqual(dict(input_dict_3,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
-                                      'parent-odu-allocation']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation'])
-        self.assertIn(1, res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
+                                  ['parent-odu-allocation']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation'])
+        self.assertIn(1, response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
                       ['trib-slots'])
 
     def test_045_check_ODU2E_connection_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1",
-            "odu-connection/XPDR1-CLIENT1-ODU2e-x-XPDR1-NETWORK1-ODU2e")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'odu-connection', 'XPDR1-CLIENT1-ODU2e-x-XPDR1-NETWORK1-ODU2e')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {
             'connection-name':
             'XPDR1-CLIENT1-ODU2e-x-XPDR1-NETWORK1-ODU2e',
             'direction': 'bidirectional'
         }
-
-        self.assertDictEqual(dict(input_dict_1, **res['odu-connection'][0]),
-                             res['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e'},
-                             res['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e'},
-                             res['odu-connection'][0]['source'])
+        self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
+                             response['odu-connection'][0])
+        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e:service1-10GE'},
+                             response['odu-connection'][0]['destination'])
+        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e:service1-10GE'},
+                             response['odu-connection'][0]['source'])
 
     def test_046_check_interface_10GE_CLIENT_spdrc(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR1-CLIENT1-ETHERNET10G")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR1-CLIENT1-ETHERNET10G')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict = {'name': 'XPDR1-CLIENT1-ETHERNET10G',
                       'administrative-state': 'inService',
                       'supporting-circuit-pack-name': 'CP1-SFP4',
                       'type': 'org-openroadm-interfaces:ethernetCsmacd',
                       'supporting-port': 'CP1-SFP4-P1'
                       }
-        self.assertDictEqual(dict(input_dict, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(
-            {'speed': 10000},
-            res['interface'][0]['org-openroadm-ethernet-interfaces:ethernet'])
+        self.assertDictEqual(dict(input_dict, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertEqual(10000, response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']['speed'])
 
     def test_047_check_interface_ODU2E_CLIENT_spdrc(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR1-CLIENT1-ODU2e")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e',
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR1-CLIENT1-ODU2e:service1-10GE')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR1-CLIENT1-ODU2e:service1-10GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-SFP4',
                         'supporting-interface': 'XPDR1-CLIENT1-ETHERNET10G',
@@ -894,29 +868,33 @@ class TransportPCEtesting(unittest.TestCase):
             'tx-dapi': 'B68VWipZAU0=',
             'tx-sapi': 'BcwI5xz79t8='}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
+                                  **input_dict_2),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
+                             )
         self.assertDictEqual(
             {'payload-type': '03', 'exp-payload-type': '03'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
-        response2 = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-CLIENT1-ODU2e")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res2 = response2.json()['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
-        self.assertEqual(input_dict_2['tx-sapi'], res2['tx-dapi'])
-        self.assertEqual(input_dict_2['tx-sapi'], res2['expected-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['tx-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['expected-dapi'])
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+
+        response2 = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-CLIENT1-ODU2e:service1-10GE')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(input_dict_2['tx-sapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['tx-dapi'])
+        self.assertEqual(input_dict_2['tx-sapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['expected-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['tx-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['expected-dapi'])
 
     def test_048_check_interface_ODU2E_NETWORK_spdrc(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR1-NETWORK1-ODU2e")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e',
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR1-NETWORK1-ODU2e:service1-10GE')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU2e:service1-10GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
                         'supporting-interface': 'XPDR1-NETWORK1-ODU4',
@@ -928,47 +906,40 @@ class TransportPCEtesting(unittest.TestCase):
             'monitoring-mode': 'monitored'}
         input_dict_3 = {'trib-port-number': 1}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
+                                  **input_dict_2),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
+                             )
         self.assertDictEqual(dict(input_dict_3,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
-                                      'parent-odu-allocation']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
-            'parent-odu-allocation'])
-        self.assertIn(1,
-                      res['interface'][0][
-                          'org-openroadm-otn-odu-interfaces:odu'][
-                          'parent-odu-allocation']['trib-slots'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
+                                  ['parent-odu-allocation']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation'])
+        self.assertIn(1, response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
+                      ['trib-slots'])
 
     def test_049_check_ODU2E_connection_spdrc(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1",
-            "odu-connection/XPDR1-CLIENT1-ODU2e-x-XPDR1-NETWORK1-ODU2e")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'odu-connection', 'XPDR1-CLIENT1-ODU2e-x-XPDR1-NETWORK1-ODU2e')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {
             'connection-name':
             'XPDR1-CLIENT1-ODU2e-x-XPDR1-NETWORK1-ODU2e',
             'direction': 'bidirectional'
         }
-
-        self.assertDictEqual(dict(input_dict_1, **res['odu-connection'][0]),
-                             res['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e'},
-                             res['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e'},
-                             res['odu-connection'][0]['source'])
+        self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
+                             response['odu-connection'][0])
+        self.assertDictEqual({'dst-if': 'XPDR1-NETWORK1-ODU2e:service1-10GE'},
+                             response['odu-connection'][0]['destination'])
+        self.assertDictEqual({'src-if': 'XPDR1-CLIENT1-ODU2e:service1-10GE'},
+                             response['odu-connection'][0]['source'])
 
     def test_050_check_otn_topo_links(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nb_links = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nb_links, 6)
-        for link in res['network'][0]['ietf-network-topology:link']:
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 6)
+        for link in response['network'][0]['ietf-network-topology:link']:
             linkId = link['link-id']
             if (linkId in ('ODTU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1',
                            'ODTU4-SPDR-SC1-XPDR1-XPDR1-NETWORK1toSPDR-SA1-XPDR1-XPDR1-NETWORK1')):
@@ -978,9 +949,9 @@ class TransportPCEtesting(unittest.TestCase):
                     link['org-openroadm-otn-network-topology:used-bandwidth'], 10000)
 
     def test_051_check_otn_topo_tp(self):
-        response = test_utils.get_otn_topo_request()
-        res = response.json()
-        for node in res['network'][0]['node']:
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        for node in response['network'][0]['node']:
             if node['node-id'] == 'SPDR-SA1-XPDR1' or node['node-id'] == 'SPDR-SC1-XPDR1':
                 tpList = node['ietf-network-topology:termination-point']
                 for tp in tpList:
@@ -996,49 +967,47 @@ class TransportPCEtesting(unittest.TestCase):
                             1, xpdrTpPortConAt['odtu-tpn-pool'][0]['tpn-pool'])
 
     def test_052_delete_10GE_service(self):
-        response = test_utils.service_delete_request("service1-10GE")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service1-10GE"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_053_check_service_list(self):
-        response = test_utils.get_service_list_request("")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(len(res['service-list']['services']), 3)
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_request()
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['service-list']['services']), 3)
+        time.sleep(1)
 
     def test_054_check_no_ODU2e_connection_spdra(self):
-        response = test_utils.check_netconf_node_request("SPDR-SA1", "")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertNotIn(['odu-connection'][0], res['org-openroadm-device'])
+        response = test_utils.check_node_request("SPDR-SA1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertNotIn(['odu-connection'][0], response['org-openroadm-device'])
         time.sleep(1)
 
     def test_055_check_no_interface_ODU2E_NETWORK_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-NETWORK1-ODU2e")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-ODU2e:service1-10GE')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_056_check_no_interface_ODU2E_CLIENT_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-CLIENT1-ODU2e")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-CLIENT1-ODU2e:service1-10GE')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_057_check_no_interface_10GE_CLIENT_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-CLIENT1-ETHERNET10G")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-CLIENT1-ETHERNET10G')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_058_check_otn_topo_links(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nb_links = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nb_links, 6)
-        for link in res['network'][0]['ietf-network-topology:link']:
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 6)
+        for link in response['network'][0]['ietf-network-topology:link']:
             linkId = link['link-id']
             if (linkId in ('ODTU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1',
                            'ODTU4-SPDR-SC1-XPDR1-XPDR1-NETWORK1toSPDR-SA1-XPDR1-XPDR1-NETWORK1')):
@@ -1048,9 +1017,9 @@ class TransportPCEtesting(unittest.TestCase):
                     link['org-openroadm-otn-network-topology:used-bandwidth'], 0)
 
     def test_059_check_otn_topo_tp(self):
-        response = test_utils.get_otn_topo_request()
-        res = response.json()
-        for node in res['network'][0]['node']:
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        for node in response['network'][0]['node']:
             if (node['node-id'] == 'SPDR-SA1-XPDR1' or node['node-id'] == 'SPDR-SC1-XPDR1'):
                 tpList = node['ietf-network-topology:termination-point']
                 for tp in tpList:
@@ -1061,52 +1030,52 @@ class TransportPCEtesting(unittest.TestCase):
                             len(xpdrTpPortConAt['odtu-tpn-pool'][0]['tpn-pool']), 80)
 
     def test_060_delete_ODU4_service(self):
-        response = test_utils.service_delete_request("service-ODU4-ABC")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service-ODU4-ABC"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_061_check_service_list(self):
-        response = test_utils.get_service_list_request("")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(len(res['service-list']['services']), 2)
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_request()
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['service-list']['services']), 2)
+        time.sleep(1)
 
     def test_062_check_no_interface_ODU4_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_063_check_no_interface_ODU4_spdrb(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SB1", "interface/XPDR2-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SB1", "interface/XPDR2-NETWORK2-ODU4")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK2-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_064_check_no_ODU4_connection_spdrb(self):
-        response = test_utils.check_netconf_node_request("SPDR-SB1", "")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertNotIn(['odu-connection'][0], res['org-openroadm-device'])
+        response = test_utils.check_node_request("SPDR-SB1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertNotIn(['odu-connection'][0], response['org-openroadm-device'])
         time.sleep(1)
 
     def test_065_check_no_interface_ODU4_spdrc(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR1-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR1-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_066_check_otn_topo_links(self):
         self.test_030_check_otn_topo_otu4_links()
 
     def test_067_check_otn_topo_tp(self):
-        response = test_utils.get_otn_topo_request()
-        res = response.json()
-        for node in res['network'][0]['node']:
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        for node in response['network'][0]['node']:
             if node['node-id'] == 'SPDR-SA1-XPDR1' or node['node-id'] == 'SPDR-SC1-XPDR1':
                 tpList = node['ietf-network-topology:termination-point']
                 for tp in tpList:
@@ -1118,53 +1087,46 @@ class TransportPCEtesting(unittest.TestCase):
 
 # test service-create for ODU4 service from spdrA to spdrB
     def test_068_create_ODU4_service_AB(self):
-        # pylint: disable=line-too-long
-        self.cr_serv_sample_data["input"]["service-name"] = "service-ODU4-AB"
-        self.cr_serv_sample_data["input"]["connection-type"] = "infrastructure"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-rate"] = "100"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-format"] = "ODU"
-        self.cr_serv_sample_data["input"]["service-a-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODU4"
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-NETWORK1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-NETWORK1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["node-id"] = "SPDR-SB1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["clli"] = "NodeSB"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-rate"] = "100"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-format"] = "ODU"
-        self.cr_serv_sample_data["input"]["service-z-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODU4"
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SB1-XPDR2"
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SB1-XPDR2"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK1"
-
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.cr_serv_input_data["service-name"] = "service-ODU4-AB"
+        self.cr_serv_input_data["connection-type"] = "infrastructure"
+        self.cr_serv_input_data["service-a-end"]["service-rate"] = "100"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "ODU"
+        self.cr_serv_input_data["service-a-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODU4"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR1"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-NETWORK1"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR1"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-NETWORK1"
+        self.cr_serv_input_data["service-z-end"]["node-id"] = "SPDR-SB1"
+        self.cr_serv_input_data["service-z-end"]["clli"] = "NodeSB"
+        self.cr_serv_input_data["service-a-end"]["service-rate"] = "100"
+        self.cr_serv_input_data["service-z-end"]["service-format"] = "ODU"
+        self.cr_serv_input_data["service-z-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODU4"
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SB1-XPDR2"
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK1"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SB1-XPDR2"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK1"
+
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_069_get_ODU4_service_AB(self):
-        response = test_utils.get_service_list_request(
-            "services/service-ODU4-AB")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service-ODU4-AB')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'infrastructure')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service-ODU4-AB")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service-ODU4-AB')
+        self.assertEqual(response['services'][0]['connection-type'], 'infrastructure')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        time.sleep(1)
 
     def test_070_check_interface_ODU4_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
@@ -1178,29 +1140,32 @@ class TransportPCEtesting(unittest.TestCase):
                         'tx-dapi': 'X+8cRNi+HbE=',
                         'tx-sapi': 'H/OelLynehI='}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
                                   **input_dict_2),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
                              )
         self.assertDictEqual(
             {'payload-type': '21', 'exp-payload-type': '21'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
-        response2 = test_utils.check_netconf_node_request(
-            "SPDR-SB1", "interface/XPDR2-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res2 = response2.json()['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
-        self.assertEqual(input_dict_2['tx-sapi'], res2['tx-dapi'])
-        self.assertEqual(input_dict_2['tx-sapi'], res2['expected-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['tx-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['expected-dapi'])
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+
+        response2 = test_utils.check_node_attribute_request(
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(input_dict_2['tx-sapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['tx-dapi'])
+        self.assertEqual(input_dict_2['tx-sapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['expected-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['tx-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['expected-dapi'])
 
     def test_071_check_interface_ODU4_spdrb_N1(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SB1", "interface/XPDR2-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
@@ -1214,66 +1179,66 @@ class TransportPCEtesting(unittest.TestCase):
                         'tx-dapi': 'H/OelLynehI=',
                         'tx-sapi': 'X+8cRNi+HbE='}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
                                   **input_dict_2),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
                              )
         self.assertDictEqual(
             {'payload-type': '21', 'exp-payload-type': '21'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
-        response2 = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res2 = response2.json()['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
-        self.assertEqual(input_dict_2['tx-sapi'], res2['tx-dapi'])
-        self.assertEqual(input_dict_2['tx-sapi'], res2['expected-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['tx-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['expected-dapi'])
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+        response2 = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(input_dict_2['tx-sapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['tx-dapi'])
+        self.assertEqual(input_dict_2['tx-sapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['expected-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['tx-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['expected-dapi'])
 
 # test service-create for ODU4 service from spdrB to spdrC
     def test_072_create_ODU4_service_BC(self):
-        # pylint: disable=line-too-long
-        self.cr_serv_sample_data["input"]["service-name"] = "service-ODU4-BC"
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SB1-XPDR2"
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK2"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SB1-XPDR2"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK2"
-        self.cr_serv_sample_data["input"]["service-z-end"]["node-id"] = "SPDR-SC1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["clli"] = "NodeSC"
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-NETWORK1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-NETWORK1"
-
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.cr_serv_input_data["service-name"] = "service-ODU4-BC"
+        self.cr_serv_input_data["service-a-end"]["node-id"] = "SPDR-SB1"
+        self.cr_serv_input_data["service-a-end"]["clli"] = "NodeSB"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "ODU"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SB1-XPDR2"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK2"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SB1-XPDR2"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-NETWORK2"
+        self.cr_serv_input_data["service-z-end"]["node-id"] = "SPDR-SC1"
+        self.cr_serv_input_data["service-z-end"]["clli"] = "NodeSC"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "ODU"
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR1"
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-NETWORK1"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR1"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-NETWORK1"
+
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_073_get_ODU4_service_AB(self):
-        response = test_utils.get_service_list_request(
-            "services/service-ODU4-BC")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service-ODU4-BC')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'infrastructure')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service-ODU4-BC")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service-ODU4-BC')
+        self.assertEqual(response['services'][0]['connection-type'], 'infrastructure')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        time.sleep(1)
 
     def test_074_check_interface_ODU4_spdrb_N2(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SB1", "interface/XPDR2-NETWORK2-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK2-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
@@ -1287,29 +1252,31 @@ class TransportPCEtesting(unittest.TestCase):
                         'tx-dapi': 'AMf1n5hK6Xkk',
                         'tx-sapi': 'X+8cRNi+HbI='}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
                                   **input_dict_2),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
                              )
         self.assertDictEqual(
             {'payload-type': '21', 'exp-payload-type': '21'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
-        response2 = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR1-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res2 = response2.json()['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
-        self.assertEqual(input_dict_2['tx-sapi'], res2['tx-dapi'])
-        self.assertEqual(input_dict_2['tx-sapi'], res2['expected-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['tx-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['expected-dapi'])
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+        response2 = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR1-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(input_dict_2['tx-sapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['tx-dapi'])
+        self.assertEqual(input_dict_2['tx-sapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['expected-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['tx-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['expected-dapi'])
 
     def test_075_check_interface_ODU4_spdrc(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SC1", "interface/XPDR1-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SC1', 'interface', 'XPDR1-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-ODU4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
@@ -1322,48 +1289,58 @@ class TransportPCEtesting(unittest.TestCase):
                         'expected-sapi': 'X+8cRNi+HbI=',
                         'tx-dapi': 'X+8cRNi+HbI=',
                         'tx-sapi': 'AMf1n5hK6Xkk'}
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'],
                                   **input_dict_2),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
                              )
         self.assertDictEqual(
             {'payload-type': '21', 'exp-payload-type': '21'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
-        response2 = test_utils.check_netconf_node_request(
-            "SPDR-SB1", "interface/XPDR2-NETWORK2-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res2 = response2.json()['interface'][0]['org-openroadm-otn-odu-interfaces:odu']
-        self.assertEqual(input_dict_2['tx-sapi'], res2['tx-dapi'])
-        self.assertEqual(input_dict_2['tx-sapi'], res2['expected-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['tx-sapi'])
-        self.assertEqual(input_dict_2['tx-dapi'], res2['expected-dapi'])
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+        response2 = test_utils.check_node_attribute_request(
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK2-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(input_dict_2['tx-sapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['tx-dapi'])
+        self.assertEqual(input_dict_2['tx-sapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['expected-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['tx-sapi'])
+        self.assertEqual(input_dict_2['tx-dapi'],
+                         response2['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['expected-dapi'])
+
 
 # test service-create for 10GE service from spdr to spdr
+
+
     def test_076_create_10GE_service_ABC(self):
-        # pylint: disable=line-too-long
-        self.cr_serv_sample_data["input"]["service-name"] = "service1-10GE"
-        self.cr_serv_sample_data["input"]["connection-type"] = "service"
-        self.cr_serv_sample_data["input"]["service-a-end"]["node-id"] = "SPDR-SA1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["clli"] = "NodeSA"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-rate"] = "10"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-format"] = "Ethernet"
-        del self.cr_serv_sample_data["input"]["service-a-end"]["odu-service-rate"]
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-rate"] = "10"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-format"] = "Ethernet"
-        del self.cr_serv_sample_data["input"]["service-z-end"]["odu-service-rate"]
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.cr_serv_input_data["service-name"] = "service1-10GE"
+        self.cr_serv_input_data["connection-type"] = "service"
+        self.cr_serv_input_data["service-a-end"]["node-id"] = "SPDR-SA1"
+        self.cr_serv_input_data["service-a-end"]["clli"] = "NodeSA"
+        self.cr_serv_input_data["service-a-end"]["service-rate"] = "10"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "Ethernet"
+        del self.cr_serv_input_data["service-a-end"]["odu-service-rate"]
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR1"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SA1-XPDR1"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
+        self.cr_serv_input_data["service-z-end"]["node-id"] = "SPDR-SC1"
+        self.cr_serv_input_data["service-z-end"]["clli"] = "NodeSC"
+        self.cr_serv_input_data["service-z-end"]["service-rate"] = "10"
+        self.cr_serv_input_data["service-z-end"]["service-format"] = "Ethernet"
+        del self.cr_serv_input_data["service-z-end"]["odu-service-rate"]
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR1"
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-device-name"] = "SPDR-SC1-XPDR1"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_077_check_configuration_spdra_spdrc(self):
@@ -1377,11 +1354,10 @@ class TransportPCEtesting(unittest.TestCase):
         self.test_049_check_ODU2E_connection_spdrc()
 
     def test_078_check_interface_ODU2E_NETWORK1_spdrb(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SB1", "interface/XPDR2-NETWORK1-ODU2e")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU2e',
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK1-ODU2e:service1-10GE')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU2e:service1-10GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
                         'supporting-interface': 'XPDR2-NETWORK1-ODU4',
@@ -1393,24 +1369,23 @@ class TransportPCEtesting(unittest.TestCase):
             'monitoring-mode': 'monitored'}
         input_dict_3 = {'trib-port-number': 1}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(dict(input_dict_3,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
                                       'parent-odu-allocation']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation'])
-        self.assertIn(1, res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation'])
+        self.assertIn(1, response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
                       ['trib-slots'])
 
     def test_079_check_interface_ODU2E_NETWORK2_spdrb(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SB1", "interface/XPDR2-NETWORK2-ODU2e")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        input_dict_1 = {'name': 'XPDR2-NETWORK2-ODU2e',
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK2-ODU2e:service1-10GE')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR2-NETWORK2-ODU2e:service1-10GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': 'CP1-CFP0',
                         'supporting-interface': 'XPDR2-NETWORK2-ODU4',
@@ -1422,44 +1397,39 @@ class TransportPCEtesting(unittest.TestCase):
             'monitoring-mode': 'monitored'}
         input_dict_3 = {'trib-port-number': 1}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(dict(input_dict_3,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
                                       'parent-odu-allocation']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation'])
-        self.assertIn(1, res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation'])
+        self.assertIn(1, response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
                       ['trib-slots'])
 
     def test_080_check_ODU2E_connection_spdrb(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SB1",
-            "odu-connection/XPDR2-NETWORK1-ODU2e-x-XPDR2-NETWORK2-ODU2e")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SB1', 'odu-connection', 'XPDR2-NETWORK1-ODU2e-x-XPDR2-NETWORK2-ODU2e')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {
             'connection-name':
             'XPDR2-NETWORK1-ODU2e-x-XPDR2-NETWORK2-ODU2e',
             'direction': 'bidirectional'
         }
-
-        self.assertDictEqual(dict(input_dict_1, **res['odu-connection'][0]),
-                             res['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR2-NETWORK2-ODU2e'},
-                             res['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR2-NETWORK1-ODU2e'},
-                             res['odu-connection'][0]['source'])
+        self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
+                             response['odu-connection'][0])
+        self.assertDictEqual({'dst-if': 'XPDR2-NETWORK2-ODU2e:service1-10GE'},
+                             response['odu-connection'][0]['destination'])
+        self.assertDictEqual({'src-if': 'XPDR2-NETWORK1-ODU2e:service1-10GE'},
+                             response['odu-connection'][0]['source'])
 
     def test_081_check_otn_topo_links(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nb_links = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nb_links, 8)
-        for link in res['network'][0]['ietf-network-topology:link']:
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 8)
+        for link in response['network'][0]['ietf-network-topology:link']:
             linkId = link['link-id']
             if (linkId in ('ODTU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SB1-XPDR2-XPDR2-NETWORK1',
                            'ODTU4-SPDR-SB1-XPDR2-XPDR2-NETWORK1toSPDR-SA1-XPDR1-XPDR1-NETWORK1',
@@ -1474,19 +1444,20 @@ class TransportPCEtesting(unittest.TestCase):
         self.test_051_check_otn_topo_tp()
 
     def test_083_delete_10GE_service(self):
-        response = test_utils.service_delete_request("service1-10GE")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service1-10GE"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_084_check_service_list(self):
-        response = test_utils.get_service_list_request("")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(len(res['service-list']['services']), 4)
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_request()
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['service-list']['services']), 4)
+        time.sleep(1)
 
     def test_085_check_configuration_spdra(self):
         self.test_054_check_no_ODU2e_connection_spdra()
@@ -1495,29 +1466,26 @@ class TransportPCEtesting(unittest.TestCase):
         self.test_057_check_no_interface_10GE_CLIENT_spdra()
 
     def test_086_check_no_ODU2e_connection_spdrb(self):
-        response = test_utils.check_netconf_node_request("SPDR-SB1", "")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertNotIn(['odu-connection'][0], res['org-openroadm-device'])
+        response = test_utils.check_node_request("SPDR-SB1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertNotIn(['odu-connection'][0], response['org-openroadm-device'])
         time.sleep(1)
 
     def test_087_check_no_interface_ODU2E_NETWORK1_spdrb(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SB1", "interface/XPDR2-NETWORK1-ODU2e")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK1-ODU2e-service1-10GE')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_088_check_no_interface_ODU2E_NETWORK2_spdrb(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SB1", "interface/XPDR2-NETWORK2-ODU2e")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SB1', 'interface', 'XPDR2-NETWORK2-ODU2e-service1-10GE')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_089_check_otn_topo_links(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nb_links = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nb_links, 8)
-        for link in res['network'][0]['ietf-network-topology:link']:
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 8)
+        for link in response['network'][0]['ietf-network-topology:link']:
             linkId = link['link-id']
             if (linkId in ('ODTU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SB1-XPDR2-XPDR2-NETWORK1',
                            'ODTU4-SPDR-SB1-XPDR2-XPDR2-NETWORK1toSPDR-SA1-XPDR1-XPDR1-NETWORK1',
@@ -1532,19 +1500,23 @@ class TransportPCEtesting(unittest.TestCase):
         self.test_059_check_otn_topo_tp()
 
     def test_091_delete_ODU4_service_AB(self):
-        response = test_utils.service_delete_request("service-ODU4-AB")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service-ODU4-AB"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_092_delete_ODU4_service_BC(self):
-        response = test_utils.service_delete_request("service-ODU4-BC")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service-ODU4-BC"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_093_check_global_config(self):
@@ -1557,96 +1529,98 @@ class TransportPCEtesting(unittest.TestCase):
         self.test_067_check_otn_topo_tp()
 
     def test_094_delete_OCH_OTU4_service_AB(self):
-        response = test_utils.service_delete_request("service-OCH-OTU4-AB")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service-OCH-OTU4-AB"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_095_delete_OCH_OTU4_service_BC(self):
-        response = test_utils.service_delete_request("service-OCH-OTU4-BC")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service-OCH-OTU4-BC"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_096_get_no_service(self):
-        response = test_utils.get_service_list_request("")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-        res = response.json()
-        self.assertIn(
-            {"error-type": "application", "error-tag": "data-missing",
-             "error-message": "Request could not be completed because the relevant data model content does not exist"},
-            res['errors']['error'])
+        response = test_utils.get_ordm_serv_list_request()
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+        self.assertIn(response['service-list'], (
+            {
+                "error-type": "protocol",
+                "error-tag": "data-missing",
+                "error-message":
+                    "Request could not be completed because the relevant data "
+                    "model content does not exist"
+            }, {
+                "error-type": "application",
+                "error-tag": "data-missing",
+                "error-message":
+                    "Request could not be completed because the relevant data "
+                    "model content does not exist"
+            }))
         time.sleep(1)
 
     def test_097_check_no_interface_OTU4_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-NETWORK1-OTU")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-OTU')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_098_check_no_interface_OCH_spdra(self):
-        response = test_utils.check_netconf_node_request(
-            "SPDR-SA1", "interface/XPDR1-NETWORK1-1")
-        self.assertEqual(response.status_code, requests.codes.conflict)
+        response = test_utils.check_node_attribute_request(
+            'SPDR-SA1', 'interface', 'XPDR1-NETWORK1-1')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_099_getLinks_OtnTopology(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertNotIn('ietf-network-topology:link', res['network'][0])
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertNotIn('ietf-network-topology:link', response['network'][0])
 
     def test_100_disconnect_xponders_from_roadm(self):
-        url = "{}/config/ietf-network:networks/network/openroadm-topology/ietf-network-topology:link/"
-        response = test_utils.get_ordm_topo_request("")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        links = res['network'][0]['ietf-network-topology:link']
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        links = response['network'][0]['ietf-network-topology:link']
         for link in links:
-            if (link["org-openroadm-common-network:link-type"] == "XPONDER-OUTPUT" or
-                    link["org-openroadm-common-network:link-type"] == "XPONDER-INPUT"):
-                link_name = link["link-id"]
-                response = test_utils.delete_request(url+link_name)
-                self.assertEqual(response.status_code, requests.codes.ok)
+            if link["org-openroadm-common-network:link-type"] in ('XPONDER-OUTPUT', 'XPONDER-INPUT'):
+                response = test_utils.del_ietf_network_link_request(
+                    'openroadm-topology', link['link-id'], 'config')
+                self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_101_check_openroadm_topology(self):
-        response = test_utils.get_ordm_topo_request("")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        links = res['network'][0]['ietf-network-topology:link']
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        links = response['network'][0]['ietf-network-topology:link']
         self.assertEqual(28, len(links), 'Topology should contain 28 links')
 
     def test_102_disconnect_spdrA(self):
         response = test_utils.unmount_device("SPDR-SA1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_103_disconnect_spdrC(self):
         response = test_utils.unmount_device("SPDR-SC1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_104_disconnect_spdrB(self):
         response = test_utils.unmount_device("SPDR-SB1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_105_disconnect_roadmA(self):
         response = test_utils.unmount_device("ROADM-A1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_106_disconnect_roadmB(self):
         response = test_utils.unmount_device("ROADM-B1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_107_disconnect_roadmC(self):
         response = test_utils.unmount_device("ROADM-C1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
 
 if __name__ == "__main__":
index a7bf2b9490e898c02227e17223366f6123c4bf49..2be241411b41c551989936c062726324ab57e876 100644 (file)
@@ -19,7 +19,7 @@ import sys
 sys.path.append('transportpce_tests/common')
 # pylint: disable=wrong-import-position
 # pylint: disable=import-error
-import test_utils_rfc8040  # nopep8
+import test_utils  # nopep8
 
 
 class TransportPCE400GPortMappingTesting(unittest.TestCase):
@@ -29,14 +29,14 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
-        cls.processes = test_utils_rfc8040.start_tpce()
-        cls.processes = test_utils_rfc8040.start_sims([('xpdra2', cls.NODE_VERSION)])
+        cls.processes = test_utils.start_tpce()
+        cls.processes = test_utils.start_sims([('xpdra2', cls.NODE_VERSION)])
 
     @classmethod
     def tearDownClass(cls):
         # pylint: disable=not-an-iterable
         for process in cls.processes:
-            test_utils_rfc8040.shutdown_process(process)
+            test_utils.shutdown_process(process)
         print("all processes killed")
 
     def setUp(self):
@@ -45,20 +45,20 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
         time.sleep(1)
 
     def test_01_xpdr_device_connection(self):
-        response = test_utils_rfc8040.mount_device("XPDR-A2",
-                                                   ('xpdra2', self.NODE_VERSION))
+        response = test_utils.mount_device("XPDR-A2",
+                                           ('xpdra2', self.NODE_VERSION))
         self.assertEqual(response.status_code, requests.codes.created,
-                         test_utils_rfc8040.CODE_SHOULD_BE_201)
+                         test_utils.CODE_SHOULD_BE_201)
 
     # Check if the node appears in the ietf-network topology
     def test_02_xpdr_device_connected(self):
-        response = test_utils_rfc8040.check_device_connection("XPDR-A2")
+        response = test_utils.check_device_connection("XPDR-A2")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(response['connection-status'], 'connected')
 
     # Check node info in the port-mappings
     def test_03_xpdr_portmapping_info(self):
-        response = test_utils_rfc8040.get_portmapping_node_info("XPDR-A2")
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "node-info", None)
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual(
             {'node-type': 'xpdr',
@@ -71,7 +71,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
 
     # Check the if-capabilities and the other details for network
     def test_04_tpdr_portmapping_NETWORK1(self):
-        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR1-NETWORK1")
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR1-NETWORK1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {'supported-interface-capability':
@@ -85,12 +85,12 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
              'lcp-hash-val': 'AIGiVAQ4gDil',
              'port-admin-state': 'InService',
              'port-oper-state': 'InService',
-             'xponder-type': 'tpdr'
+             'xpdr-type': 'tpdr'
              },
             response['mapping'])
 
     def test_05_tpdr_portmapping_CLIENT1(self):
-        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR1-CLIENT1")
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR1-CLIENT1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {'supported-interface-capability': ['org-openroadm-port-types:if-400GE'],
@@ -103,14 +103,14 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
              'lcp-hash-val': 'AODABTVSOHH0',
              'port-admin-state': 'InService',
              'port-oper-state': 'InService',
-             'xponder-type': 'tpdr'
+             'xpdr-type': 'tpdr'
              },
             response['mapping']
         )
 
     # Check the port-mapping for the switch-client and switch-network port-quals
     def test_06_mpdr_portmapping_NETWORK1(self):
-        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR2-NETWORK1")
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR2-NETWORK1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn(
             {'supported-interface-capability':
@@ -123,12 +123,12 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
              'lcp-hash-val': 'LY9PxYJqUbw=',
              'port-admin-state': 'InService',
              'port-oper-state': 'InService',
-             'xponder-type': 'mpdr'
+             'xpdr-type': 'mpdr'
              },
             response['mapping'])
 
     def test_07_mpdr_portmapping_CLIENT1(self):
-        res = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR2-CLIENT1")
+        res = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR2-CLIENT1")
         self.assertEqual(res['status_code'], requests.codes.ok)
         self.assertIn('org-openroadm-port-types:if-100GE-ODU4',
                       res['mapping'][0]['supported-interface-capability'])
@@ -142,39 +142,37 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
         self.assertEqual('AK+Cna4EclRH', res['mapping'][0]['lcp-hash-val'])
         self.assertEqual('InService', res['mapping'][0]['port-admin-state'])
         self.assertEqual('InService', res['mapping'][0]['port-oper-state'])
-        self.assertEqual('mpdr', res['mapping'][0]['xponder-type'])
-        self.assertEqual({
-            "min-trib-slot": "1.1",
-            "max-trib-slot": "1.20"
-        }, res['mapping'][0]['mpdr-restrictions'])
+        self.assertEqual('mpdr', res['mapping'][0]['xpdr-type'])
+        self.assertEqual(1.1, float(res['mapping'][0]['mpdr-restrictions']['min-trib-slot']))
+        self.assertEqual(1.2, float(res['mapping'][0]['mpdr-restrictions']['max-trib-slot']))
 
     # Added test to check mc-capability-profile for a transponder
     def test_08_check_mccapprofile(self):
-        res = test_utils_rfc8040.portmapping_mc_capa_request("XPDR-A2", "XPDR-mcprofile")
+        res = test_utils.get_portmapping_node_attr("XPDR-A2", "mc-capabilities", "XPDR-mcprofile")
         self.assertEqual(res['status_code'], requests.codes.ok)
         self.assertEqual(res['mc-capabilities'][0]['mc-node-name'], 'XPDR-mcprofile')
-        self.assertEqual(str(res['mc-capabilities'][0]['center-freq-granularity']), '3.125')
-        self.assertEqual(str(res['mc-capabilities'][0]['slot-width-granularity']), '6.25')
+        self.assertEqual(float(res['mc-capabilities'][0]['center-freq-granularity']), 3.125)
+        self.assertEqual(float(res['mc-capabilities'][0]['slot-width-granularity']), 6.25)
 
     def test_09_mpdr_switching_pool(self):
-        response = test_utils_rfc8040.portmapping_switching_pool_request("XPDR-A2", "1")
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "switching-pool-lcp", "1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertEqual("blocking",
-                         response['switching_pool'][0]['switching-pool-type'])
+                         response['switching-pool-lcp'][0]['switching-pool-type'])
         self.assertEqual(2,
-                         len(response['switching_pool'][0]['non-blocking-list']))
+                         len(response['switching-pool-lcp'][0]['non-blocking-list']))
         self.assertIn(
             {'nbl-number': 2,
              'interconnect-bandwidth': 0,
-             'lcp-list': ['XPDR2-NETWORK1', 'XPDR2-CLIENT2']},
-            response['switching_pool'][0]['non-blocking-list'])
+             'lcp-list': ['XPDR2-CLIENT2', 'XPDR2-NETWORK1']},
+            response['switching-pool-lcp'][0]['non-blocking-list'])
 
     def test_10_xpdr_device_disconnection(self):
-        response = test_utils_rfc8040.unmount_device("XPDR-A2")
+        response = test_utils.unmount_device("XPDR-A2")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_11_xpdr_device_disconnected(self):
-        response = test_utils_rfc8040.check_device_connection("XPDR-A2")
+        response = test_utils.check_device_connection("XPDR-A2")
         self.assertEqual(response['status_code'], requests.codes.conflict)
         self.assertIn(response['connection-status']['error-type'], ('protocol', 'application'))
         self.assertEqual(response['connection-status']['error-tag'], 'data-missing')
@@ -182,7 +180,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
                          'Request could not be completed because the relevant data model content does not exist')
 
     def test_12_xpdr_device_not_connected(self):
-        response = test_utils_rfc8040.get_portmapping_node_info("XPDR-A2")
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "node-info", None)
         self.assertEqual(response['status_code'], requests.codes.conflict)
         self.assertIn(response['node-info']['error-type'], ('protocol', 'application'))
         self.assertEqual(response['node-info']['error-tag'], 'data-missing')
index b7510bc42e4e8d89879dae409540568b808a2cd9..ee3c47efdff34cf6c4f3803d6aff028e059ac340 100644 (file)
@@ -19,7 +19,7 @@ import sys
 sys.path.append('transportpce_tests/common')
 # pylint: disable=wrong-import-position
 # pylint: disable=import-error
-import test_utils_rfc8040  # nopep8
+import test_utils  # nopep8
 
 
 class TransportPCE400GPortMappingTesting(unittest.TestCase):
@@ -33,7 +33,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
                            "port-direction": "bidirectional",
                            "port-qual": "switch-network",
                            "supporting-circuit-pack-name": "1/2/2-PLUG-NET",
-                           "xponder-type": "mpdr",
+                           "xpdr-type": "mpdr",
                            'lcp-hash-val': 'LY9PxYJqUbw=',
                            'port-admin-state': 'InService',
                            'port-oper-state': 'InService'}
@@ -41,32 +41,32 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
 
     @classmethod
     def setUpClass(cls):
-        cls.processes = test_utils_rfc8040.start_tpce()
-        cls.processes = test_utils_rfc8040.start_sims([('xpdra2', cls.NODE_VERSION)])
+        cls.processes = test_utils.start_tpce()
+        cls.processes = test_utils.start_sims([('xpdra2', cls.NODE_VERSION)])
 
     @classmethod
     def tearDownClass(cls):
         # pylint: disable=not-an-iterable
         for process in cls.processes:
-            test_utils_rfc8040.shutdown_process(process)
+            test_utils.shutdown_process(process)
         print("all processes killed")
 
     def setUp(self):
         # pylint: disable=consider-using-f-string
         print("execution of {}".format(self.id().split(".")[-1]))
-        time.sleep(10)
+        time.sleep(2)
 
     def test_01_xpdr_device_connection(self):
-        response = test_utils_rfc8040.mount_device("XPDR-A2",
-                                                   ('xpdra2', self.NODE_VERSION))
+        response = test_utils.mount_device("XPDR-A2",
+                                           ('xpdra2', self.NODE_VERSION))
         self.assertEqual(response.status_code, requests.codes.created,
-                         test_utils_rfc8040.CODE_SHOULD_BE_201)
+                         test_utils.CODE_SHOULD_BE_201)
 
     # Check if the node appears in the ietf-network topology
     # this test has been removed, since it already exists in port-mapping
     # 1a) create a OTUC2 device renderer
     def test_02_service_path_create_otuc2(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'service_OTUC2',
@@ -91,7 +91,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
             response['output']['node-interface'])
 
     def test_03_get_portmapping_network1(self):
-        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR2-NETWORK1")
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR2-NETWORK1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.NETWORK2_CHECK_DICT["supporting-otucn"] = "XPDR2-NETWORK1-OTUC2"
         self.assertIn(
@@ -100,7 +100,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
 
     def test_04_check_interface_otsi(self):
         # pylint: disable=line-too-long
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-755:768")
+        response = test_utils.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-755:768")
         self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-755:768',
                         'administrative-state': 'inService',
@@ -124,7 +124,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
                              response['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi']['flexo'])
 
     def test_05_check_interface_otsig(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             "XPDR-A2", "interface", "XPDR2-NETWORK1-OTSIGROUP-200G")
         self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-OTSIGROUP-200G',
@@ -143,7 +143,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
                              response['interface'][0]['org-openroadm-otsi-group-interfaces:otsi-group'])
 
     def test_06_check_interface_otuc2(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             "XPDR-A2", "interface", "XPDR2-NETWORK1-OTUC2")
         self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-OTUC2',
@@ -166,7 +166,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
 
     # 1b) create a ODUC2 device renderer
     def test_07_otn_service_path_create_oduc2(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'otn-service-path',
             {
                 'service-name': 'service_ODUC2',
@@ -182,7 +182,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
              'odu-interface-id': ['XPDR2-NETWORK1-ODUC2']}, response['output']['node-interface'])
 
     def test_08_get_portmapping_network1(self):
-        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR2-NETWORK1")
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR2-NETWORK1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.NETWORK2_CHECK_DICT["supporting-oducn"] = "XPDR2-NETWORK1-ODUC2"
         self.assertIn(
@@ -190,7 +190,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
             response['mapping'])
 
     def test_09_check_interface_oduc2(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-ODUC2")
+        response = test_utils.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-ODUC2")
         self.assertEqual(response['status_code'], requests.codes.ok)
 
         input_dict_1 = {'name': 'XPDR2-NETWORK1-ODUC2',
@@ -221,7 +221,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
 
     # 1c) create Ethernet device renderer
     def test_10_otn_service_path_create_100ge(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'otn-service-path',
             {
                 'service-name': 'service_Ethernet',
@@ -238,13 +238,13 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
         self.assertIn('XPDR2-CLIENT1-ODU4-x-XPDR2-NETWORK1-ODU4',
                       response['output']['node-interface'][0]['connection-id'])
         self.assertIn('XPDR2-CLIENT1-ETHERNET-100G', response['output']['node-interface'][0]['eth-interface-id'])
-        self.assertIn('XPDR2-NETWORK1-ODU4',
+        self.assertIn('XPDR2-NETWORK1-ODU4:service_Ethernet',
                       response['output']['node-interface'][0]['odu-interface-id'])
-        self.assertIn('XPDR2-CLIENT1-ODU4',
+        self.assertIn('XPDR2-CLIENT1-ODU4:service_Ethernet',
                       response['output']['node-interface'][0]['odu-interface-id'])
 
     def test_11_check_interface_100ge_client(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             "XPDR-A2", "interface", "XPDR2-CLIENT1-ETHERNET-100G")
         self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-CLIENT1-ETHERNET-100G',
@@ -261,10 +261,10 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
                              response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet'])
 
     def test_12_check_interface_odu4_client(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
-            "XPDR-A2", "interface", "XPDR2-CLIENT1-ODU4")
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR2-CLIENT1-ODU4:service_Ethernet")
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR2-CLIENT1-ODU4',
+        input_dict_1 = {'name': 'XPDR2-CLIENT1-ODU4:service_Ethernet',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/2/1/1-PLUG-CLIENT',
                         'supporting-interface-list': 'XPDR2-CLIENT1-ETHERNET-100G',
@@ -285,10 +285,10 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
 
     def test_13_check_interface_odu4_network(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
-            "XPDR-A2", "interface", "XPDR2-NETWORK1-ODU4")
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR2-NETWORK1-ODU4:service_Ethernet")
         self.assertEqual(response['status_code'], requests.codes.ok)
-        input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU4',
+        input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU4:service_Ethernet',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
                         'supporting-interface-list': 'XPDR2-NETWORK1-ODUC2',
@@ -315,26 +315,26 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
                       ['opucn-trib-slots'])
 
     def test_14_check_odu_connection_xpdra2(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             "XPDR-A2",
             "odu-connection", "XPDR2-CLIENT1-ODU4-x-XPDR2-NETWORK1-ODU4")
         self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {
             'connection-name':
-            'XPDR2-CLIENT1-ODU4-x-XPDR2-NETWORK1-ODU4',
+            'XPDR2-NETWORK1-ODU4-x-XPDR2-CLIENT1-ODU4',
             'direction': 'bidirectional'
         }
 
         self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
                              response['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR2-NETWORK1-ODU4'},
+        self.assertDictEqual({'dst-if': 'XPDR2-NETWORK1-ODU4:service_Ethernet'},
                              response['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR2-CLIENT1-ODU4'},
+        self.assertDictEqual({'src-if': 'XPDR2-CLIENT1-ODU4:service_Ethernet'},
                              response['odu-connection'][0]['source'])
 
     # 1d) Delete Ethernet device interfaces
     def test_15_otn_service_path_delete_100ge(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'otn-service-path',
             {
                 'service-name': 'service_Ethernet',
@@ -350,29 +350,29 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
         self.assertIn('Request processed', response['output']['result'])
 
     def test_16_check_no_odu_connection(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             "XPDR-A2",
             "odu-connection", "XPDR2-CLIENT1-ODU4-x-XPDR2-NETWORK1-ODU4")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_17_check_no_interface_odu_network(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
-            "XPDR-A2", "interface", "XPDR2-NETWORK1-ODU4")
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR2-NETWORK1-ODU4:service_Ethernet")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_18_check_no_interface_odu_client(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
-            "XPDR-A2", "interface", "XPDR2-CLIENT1-ODU4")
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR2-CLIENT1-ODU4:service_Ethernet")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_19_check_no_interface_100ge_client(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             "XPDR-A2", "interface", "XPDR2-CLIENT1-ETHERNET-100G")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     # 1e) Delete ODUC2 device interfaces
     def test_20_otn_service_path_delete_oduc2(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'otn-service-path',
             {
                 'service-name': 'service_ODUC2',
@@ -387,18 +387,18 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
         del self.NETWORK2_CHECK_DICT["supporting-oducn"]
 
     def test_21_check_no_interface_oduc2(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-ODUC2")
+        response = test_utils.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-ODUC2")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     # Check if port-mapping data is updated, where the supporting-oducn is deleted
     def test_21a_check_no_oduc2(self):
-        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR2-NETWORK1")
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR2-NETWORK1")
         self.assertRaises(KeyError, lambda: response["supporting-oducn"])
 
     # 1f) Delete OTUC2 device interfaces
 
     def test_22_service_path_delete_otuc2(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'service_OTUC2',
@@ -418,25 +418,25 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
         del self.NETWORK2_CHECK_DICT["supporting-otucn"]
 
     def test_23_check_no_interface_otuc2(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "interface", "XPDR2-NETWORK1-OTUC2")
+        response = test_utils.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-OTUC2")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_24_check_no_interface_otsig(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
-            "XPDR-A1", "interface", "XPDR2-NETWORK1-OTSIGROUP-200G")
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR2-NETWORK1-OTSIGROUP-200G")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_25_check_no_interface_otsi(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "interface", "XPDR2-NETWORK1-755:768")
+        response = test_utils.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-755:768")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_25a_check_no_otuc2(self):
-        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR2-NETWORK1")
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR2-NETWORK1")
         self.assertRaises(KeyError, lambda: response["supporting-otucn"])
 
     # 2a) create a OTUC3 device renderer
     def test_26_service_path_create_otuc3(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'service_OTUC3',
@@ -453,15 +453,17 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
             })
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Interfaces created successfully for nodes: ', response['output']['result'])
-        self.assertIn(
-            {'node-id': 'XPDR-A2',
-             'otu-interface-id': ['XPDR2-NETWORK1-OTUC3'],
-             'och-interface-id': ['XPDR2-NETWORK1-755:768',
-                                  'XPDR2-NETWORK1-OTSIGROUP-300G']},
-            response['output']['node-interface'])
+        expected_subset_response = {
+            'node-id': 'XPDR-A2',
+            'otu-interface-id': ['XPDR2-NETWORK1-OTUC3']}
+        expected_sorted_list = ['XPDR2-NETWORK1-755:768',
+                                'XPDR2-NETWORK1-OTSIGROUP-300G']
+        subset = {k: v for k, v in response['output']['node-interface'][0].items() if k in expected_subset_response}
+        self.assertDictEqual(subset, expected_subset_response)
+        self.assertEqual(sorted(response['output']['node-interface'][0]['och-interface-id']), expected_sorted_list)
 
     def test_27_get_portmapping_network1(self):
-        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR2-NETWORK1")
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR2-NETWORK1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.NETWORK2_CHECK_DICT["supporting-otucn"] = "XPDR2-NETWORK1-OTUC3"
         self.assertIn(
@@ -470,7 +472,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
 
     def test_28_check_interface_otsi(self):
         # pylint: disable=line-too-long
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-755:768")
+        response = test_utils.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-755:768")
         self.assertEqual(response['status_code'], requests.codes.ok)
 
         input_dict_1 = {'name': 'XPDR2-NETWORK1-755:768',
@@ -495,7 +497,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
                              response['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi']['flexo'])
 
     def test_29_check_interface_otsig(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             "XPDR-A2", "interface", "XPDR2-NETWORK1-OTSIGROUP-300G")
         self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-OTSIGROUP-300G',
@@ -514,7 +516,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
                              response['interface'][0]['org-openroadm-otsi-group-interfaces:otsi-group'])
 
     def test_30_check_interface_otuc3(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             "XPDR-A2", "interface", "XPDR2-NETWORK1-OTUC3")
         self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-OTUC3',
@@ -537,7 +539,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
 
     # 2b) create a ODUC3 device renderer
     def test_31_otn_service_path_create_oduc3(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'otn-service-path',
             {
                 'service-name': 'service_ODUC3',
@@ -553,7 +555,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
              'odu-interface-id': ['XPDR2-NETWORK1-ODUC3']}, response['output']['node-interface'])
 
     def test_32_get_portmapping_network1(self):
-        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR2-NETWORK1")
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR2-NETWORK1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.NETWORK2_CHECK_DICT["supporting-oducn"] = "XPDR2-NETWORK1-ODUC3"
         self.assertIn(
@@ -561,7 +563,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
             response['mapping'])
 
     def test_33_check_interface_oduc3(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-ODUC3")
+        response = test_utils.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-ODUC3")
         self.assertEqual(response['status_code'], requests.codes.ok)
 
         input_dict_1 = {'name': 'XPDR2-NETWORK1-ODUC3',
@@ -597,7 +599,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
 
     # 2e) Delete ODUC3 device interfaces
     def test_34_otn_service_path_delete_oduc3(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'otn-service-path',
             {
                 'service-name': 'service_ODUC3',
@@ -611,16 +613,16 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
         del self.NETWORK2_CHECK_DICT["supporting-oducn"]
 
     def test_35_check_no_interface_oduc3(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-ODUC3")
+        response = test_utils.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-ODUC3")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_35a_check_no_oduc3(self):
-        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR2-NETWORK1")
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR2-NETWORK1")
         self.assertRaises(KeyError, lambda: response["supporting-oducn"])
 
     # 2f) Delete OTUC3 device interfaces
     def test_36_service_path_delete_otuc3(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'service_OTUC3',
@@ -640,25 +642,25 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
         del self.NETWORK2_CHECK_DICT["supporting-otucn"]
 
     def test_37_check_no_interface_otuc3(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "interface", "XPDR2-NETWORK1-OTUC3")
-        self.assertEqual(response['status_code'], requests.codes.conflict)
+        response = test_utils.check_node_attribute_request("XPDR-A1", "interface", "XPDR2-NETWORK1-OTUC3")
+        self.assertIn(response['status_code'], (requests.codes.conflict, requests.codes.service_unavailable))
 
     def test_38_check_no_interface_otsig(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             "XPDR-A1", "interface", "XPDR2-NETWORK1-OTSIGROUP-300G")
-        self.assertEqual(response['status_code'], requests.codes.conflict)
+        self.assertIn(response['status_code'], (requests.codes.conflict, requests.codes.service_unavailable))
 
     def test_39_check_no_interface_otsi(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "interface", "XPDR2-NETWORK1-755:768")
-        self.assertEqual(response['status_code'], requests.codes.conflict)
+        response = test_utils.check_node_attribute_request("XPDR-A1", "interface", "XPDR2-NETWORK1-755:768")
+        self.assertIn(response['status_code'], (requests.codes.conflict, requests.codes.service_unavailable))
 
     def test_39a_check_no_otuc3(self):
-        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR2-NETWORK1")
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR2-NETWORK1")
         self.assertRaises(KeyError, lambda: response["supporting-otucn"])
 
     # 3a) create a OTUC4 device renderer
     def test_40_service_path_create_otuc4(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'service_OTUC4',
@@ -675,15 +677,17 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
             })
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Interfaces created successfully for nodes: ', response['output']['result'])
-        self.assertIn(
-            {'node-id': 'XPDR-A2',
-             'otu-interface-id': ['XPDR2-NETWORK1-OTUC4'],
-             'och-interface-id': ['XPDR2-NETWORK1-755:768',
-                                  'XPDR2-NETWORK1-OTSIGROUP-400G']},
-            response['output']['node-interface'])
+        expected_subset_response = {
+            'node-id': 'XPDR-A2',
+            'otu-interface-id': ['XPDR2-NETWORK1-OTUC4']}
+        expected_sorted_list = ['XPDR2-NETWORK1-755:768',
+                                'XPDR2-NETWORK1-OTSIGROUP-400G']
+        subset = {k: v for k, v in response['output']['node-interface'][0].items() if k in expected_subset_response}
+        self.assertDictEqual(subset, expected_subset_response)
+        self.assertEqual(sorted(response['output']['node-interface'][0]['och-interface-id']), expected_sorted_list)
 
     def test_41_get_portmapping_network1(self):
-        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR2-NETWORK1")
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR2-NETWORK1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.NETWORK2_CHECK_DICT["supporting-otucn"] = "XPDR2-NETWORK1-OTUC4"
         self.assertIn(
@@ -692,7 +696,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
 
     def test_42_check_interface_otsi(self):
         # pylint: disable=line-too-long
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-755:768")
+        response = test_utils.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-755:768")
         self.assertEqual(response['status_code'], requests.codes.ok)
 
         input_dict_1 = {'name': 'XPDR2-NETWORK1-755:768',
@@ -717,7 +721,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
                              response['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi']['flexo'])
 
     def test_43_check_interface_otsig(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             "XPDR-A2", "interface", "XPDR2-NETWORK1-OTSIGROUP-400G")
         self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-OTSIGROUP-400G',
@@ -736,7 +740,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
                              response['interface'][0]['org-openroadm-otsi-group-interfaces:otsi-group'])
 
     def test_44_check_interface_otuc4(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             "XPDR-A2", "interface", "XPDR2-NETWORK1-OTUC4")
         self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-OTUC4',
@@ -759,7 +763,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
 
     # 3b) create a ODUC4 device renderer
     def test_45_otn_service_path_create_oduc3(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'otn-service-path',
             {
                 'service-name': 'service_ODUC4',
@@ -775,7 +779,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
              'odu-interface-id': ['XPDR2-NETWORK1-ODUC4']}, response['output']['node-interface'])
 
     def test_46_get_portmapping_network1(self):
-        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR2-NETWORK1")
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR2-NETWORK1")
         self.assertEqual(response['status_code'], requests.codes.ok)
         self.NETWORK2_CHECK_DICT["supporting-oducn"] = "XPDR2-NETWORK1-ODUC4"
         self.assertIn(
@@ -783,7 +787,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
             response['mapping'])
 
     def test_47_check_interface_oduc4(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-ODUC4")
+        response = test_utils.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-ODUC4")
         self.assertEqual(response['status_code'], requests.codes.ok)
 
         input_dict_1 = {'name': 'XPDR2-NETWORK1-ODUC4',
@@ -819,7 +823,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
 
     # 3e) Delete ODUC4 device interfaces
     def test_48_otn_service_path_delete_oduc4(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'otn-service-path',
             {
                 'service-name': 'service_ODUC4',
@@ -833,16 +837,16 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
         del self.NETWORK2_CHECK_DICT["supporting-oducn"]
 
     def test_49_check_no_interface_oduc4(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-ODUC4")
+        response = test_utils.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-ODUC4")
         self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_49a_check_no_oduc4(self):
-        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR2-NETWORK1")
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR2-NETWORK1")
         self.assertRaises(KeyError, lambda: response["supporting-oducn"])
 
     # 3f) Delete OTUC4 device interfaces
     def test_50_service_path_delete_otuc4(self):
-        response = test_utils_rfc8040.transportpce_api_rpc_request(
+        response = test_utils.transportpce_api_rpc_request(
             'transportpce-device-renderer', 'service-path',
             {
                 'service-name': 'service_OTUC4',
@@ -862,29 +866,29 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
         del self.NETWORK2_CHECK_DICT["supporting-otucn"]
 
     def test_51_check_no_interface_otuc4(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "interface", "XPDR2-NETWORK1-OTUC4")
-        self.assertEqual(response['status_code'], requests.codes.conflict)
+        response = test_utils.check_node_attribute_request("XPDR-A1", "interface", "XPDR2-NETWORK1-OTUC4")
+        self.assertIn(response['status_code'], (requests.codes.conflict, requests.codes.service_unavailable))
 
     def test_52_check_no_interface_otsig(self):
-        response = test_utils_rfc8040.check_node_attribute_request(
+        response = test_utils.check_node_attribute_request(
             "XPDR-A1", "interface", "XPDR2-NETWORK1-OTSIGROUP-400G")
-        self.assertEqual(response['status_code'], requests.codes.conflict)
+        self.assertIn(response['status_code'], (requests.codes.conflict, requests.codes.service_unavailable))
 
     def test_53_check_no_interface_otsi(self):
-        response = test_utils_rfc8040.check_node_attribute_request("XPDR-A1", "interface", "XPDR2-NETWORK1-755:768")
-        self.assertEqual(response['status_code'], requests.codes.conflict)
+        response = test_utils.check_node_attribute_request("XPDR-A1", "interface", "XPDR2-NETWORK1-755:768")
+        self.assertIn(response['status_code'], (requests.codes.conflict, requests.codes.service_unavailable))
 
     def test_53a_check_no_otuc4(self):
-        response = test_utils_rfc8040.portmapping_request("XPDR-A2", "XPDR2-NETWORK1")
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR2-NETWORK1")
         self.assertRaises(KeyError, lambda: response["supporting-otucn"])
 
     # Disconnect the XPDR
     def test_54_xpdr_device_disconnection(self):
-        response = test_utils_rfc8040.unmount_device("XPDR-A2")
+        response = test_utils.unmount_device("XPDR-A2")
         self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_55_xpdr_device_disconnected(self):
-        response = test_utils_rfc8040.check_device_connection("XPDR-A2")
+        response = test_utils.check_device_connection("XPDR-A2")
         self.assertEqual(response['status_code'], requests.codes.conflict)
         self.assertIn(response['connection-status']['error-type'], ('protocol', 'application'))
         self.assertEqual(response['connection-status']['error-tag'], 'data-missing')
@@ -892,7 +896,7 @@ class TransportPCE400GPortMappingTesting(unittest.TestCase):
                          'Request could not be completed because the relevant data model content does not exist')
 
     def test_56_xpdr_device_not_connected(self):
-        response = test_utils_rfc8040.get_portmapping_node_info("XPDR-A2")
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "node-info", None)
         self.assertEqual(response['status_code'], requests.codes.conflict)
         self.assertIn(response['node-info']['error-type'], ('protocol', 'application'))
         self.assertEqual(response['node-info']['error-tag'], 'data-missing')
diff --git a/tests/transportpce_tests/7.1/test03_renderer_or_modes.py b/tests/transportpce_tests/7.1/test03_renderer_or_modes.py
new file mode 100644 (file)
index 0000000..c3d0490
--- /dev/null
@@ -0,0 +1,774 @@
+#!/usr/bin/env python
+##############################################################################
+# Copyright (c) 2022 AT&T, Inc. and others.  All rights reserved.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+# pylint: disable=no-member
+# pylint: disable=too-many-public-methods
+
+# pylint: disable=wrong-import-order
+import sys
+import time
+import unittest
+
+import requests
+
+sys.path.append("transportpce_tests/common")
+# pylint: disable=wrong-import-position
+# pylint: disable=import-error
+import test_utils  # nopep8
+
+
+class TransportPCE400GPortMappingTesting(unittest.TestCase):
+
+    processes = None
+    NETWORK1_CHECK_DICT = {"logical-connection-point": "XPDR3-NETWORK1",
+                           "supporting-port": "L1",
+                           "supported-interface-capability": [
+                               "org-openroadm-port-types:if-otsi-otsigroup"
+                           ],
+                           "port-direction": "bidirectional",
+                           "port-qual": "xpdr-network",
+                           "supporting-circuit-pack-name": "1/1/4-PLUG-NET",
+                           "xpdr-type": "tpdr",
+                           "port-admin-state": "InService",
+                           "port-oper-state": "InService"}
+    CLIENT_CAPABILITIES = ["org-openroadm-port-types:if-100GE",
+                           "org-openroadm-port-types:if-OCH-OTU4-ODU4"]
+    NODE_VERSION = "7.1"
+
+    @classmethod
+    def setUpClass(cls):
+        cls.processes = test_utils.start_tpce()
+        cls.processes = test_utils.start_sims([("xpdra2", cls.NODE_VERSION),
+                                               ("xpdrc2", cls.NODE_VERSION)])
+
+    @classmethod
+    def tearDownClass(cls):
+        # pylint: disable=not-an-iterable
+        for process in cls.processes:
+            test_utils.shutdown_process(process)
+        print("all processes killed")
+
+    def setUp(self):
+        # pylint: disable=consider-using-f-string
+        print("execution of {}".format(self.id().split(".")[-1]))
+        time.sleep(2)
+
+    def test_01_xpdr_device_connection(self):
+        response = test_utils.mount_device("XPDR-A2",
+                                           ("xpdra2", self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created,
+                         test_utils.CODE_SHOULD_BE_201)
+
+    def test_01a_xpdr_device_connection(self):
+        response = test_utils.mount_device("XPDR-C2",
+                                           ("xpdrc2", self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created,
+                         test_utils.CODE_SHOULD_BE_201)
+
+    # Check the correct capabilities for the client ports (if-100GE, if-100GE-ODU4,
+    # if-OCH-OTU4-ODU4)
+    def test_02_check_client_capabilities(self):
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR3-CLIENT1")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        self.assertEqual(
+            self.CLIENT_CAPABILITIES,
+            sorted(response["mapping"][0]["supported-interface-capability"]))
+
+    def test_03_check_client_capabilities(self):
+        response = test_utils.get_portmapping_node_attr("XPDR-C2", "mapping", "XPDR3-CLIENT1")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        self.assertEqual(
+            self.CLIENT_CAPABILITIES,
+            sorted(response["mapping"][0]["supported-interface-capability"]))
+
+    def test_04_100g_ofec_service_path_create(self):
+        response = test_utils.transportpce_api_rpc_request(
+            "transportpce-device-renderer", "service-path",
+            {
+                "service-name": "service_100GE_ofec",
+                "wave-number": "0",
+                "modulation-format": "dp-qpsk",
+                "operation": "create",
+                "nodes": [{
+                    "node-id": "XPDR-A2",
+                    "src-tp": "XPDR3-CLIENT1",
+                    "dest-tp": "XPDR3-NETWORK1"
+                },
+                    {
+                    "node-id": "XPDR-C2",
+                    "src-tp": "XPDR3-CLIENT1",
+                    "dest-tp": "XPDR3-NETWORK1"
+                }],
+                "center-freq": 193.0,
+                "nmc-width": 37.5,
+                "min-freq": 192.975,
+                "max-freq": 193.025,
+                "lower-spectral-slot-number": 265,
+                "higher-spectral-slot-number": 272,
+            })
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        self.assertIn("Interfaces created successfully for nodes: ", response["output"]["result"])
+        # node-interface is list which does not preserve the order
+        a_side = "XPDR-A2"
+        z_side = "XPDR-C2"
+        if response["output"]["node-interface"][0]["node-id"] == z_side:
+            a_side, z_side = z_side, a_side
+        self.assertEqual(
+            {"node-id": a_side,
+             "otu-interface-id": [
+                 "XPDR3-NETWORK1-OTUC1"
+             ],
+             "odu-interface-id": [
+                 "XPDR3-NETWORK1-ODU4",
+                 "XPDR3-NETWORK1-ODUC1"
+             ],
+             "och-interface-id": [
+                 "XPDR3-NETWORK1-265:272",
+                 "XPDR3-NETWORK1-OTSIGROUP-100G"
+             ],
+             "eth-interface-id": [
+                 "XPDR3-CLIENT1-ETHERNET"
+             ]},
+            {x: (sorted(response["output"]["node-interface"][0][x])
+                 if isinstance(response["output"]["node-interface"][0][x], list)
+                 else response["output"]["node-interface"][0][x])
+             for x in response["output"]["node-interface"][0].keys()})
+        self.assertEqual(
+            {"node-id": z_side,
+             "otu-interface-id": [
+                 "XPDR3-NETWORK1-OTUC1"
+             ],
+             "odu-interface-id": [
+                 "XPDR3-NETWORK1-ODU4",
+                 "XPDR3-NETWORK1-ODUC1"
+             ],
+             "och-interface-id": [
+                 "XPDR3-NETWORK1-265:272",
+                 "XPDR3-NETWORK1-OTSIGROUP-100G"
+             ],
+             "eth-interface-id": [
+                 "XPDR3-CLIENT1-ETHERNET"
+             ]},
+            {x: (sorted(response["output"]["node-interface"][1][x])
+                 if isinstance(response["output"]["node-interface"][1][x], list)
+                 else response["output"]["node-interface"][1][x])
+             for x in response["output"]["node-interface"][1].keys()})
+
+    def test_05_get_portmapping_network1(self):
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR3-NETWORK1")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        self.NETWORK1_CHECK_DICT["supporting-otucn"] = "XPDR3-NETWORK1-OTUC1"
+        self.NETWORK1_CHECK_DICT["lcp-hash-val"] = "FDvaQIf2Z08="
+        self.NETWORK1_CHECK_DICT["connection-map-lcp"] = "XPDR3-CLIENT1"
+        self.assertIn(
+            self.NETWORK1_CHECK_DICT,
+            response["mapping"])
+
+    def test_06_get_portmapping_network1(self):
+        response = test_utils.get_portmapping_node_attr("XPDR-C2", "mapping", "XPDR3-NETWORK1")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        self.NETWORK1_CHECK_DICT["supporting-otucn"] = "XPDR3-NETWORK1-OTUC1"
+        self.NETWORK1_CHECK_DICT["lcp-hash-val"] = "AJpkaVmZKJk5"
+        self.NETWORK1_CHECK_DICT["connection-map-lcp"] = "XPDR3-CLIENT1"
+        self.assertIn(
+            self.NETWORK1_CHECK_DICT,
+            response["mapping"])
+
+    def test_07_check_interface_otsi(self):
+        # pylint: disable=line-too-long
+        response = test_utils.check_node_attribute_request("XPDR-A2", "interface", "XPDR3-NETWORK1-265:272")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        input_dict_1 = {"name": "XPDR3-NETWORK1-265:272",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/4-PLUG-NET",
+                        "type": "org-openroadm-interfaces:otsi",
+                        "supporting-port": "L1"}
+        input_dict_2 = {
+            "frequency": 193.00000,
+            "otsi-rate": "org-openroadm-common-optical-channel-types:R100G-otsi",
+            "fec": "org-openroadm-common-types:ofec",
+            "transmit-power": -5,
+            "provision-mode": "explicit",
+            "modulation-format": "dp-qpsk"}
+
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response["interface"][0]["org-openroadm-optical-tributary-signal-interfaces:otsi"]),
+                             response["interface"][0]["org-openroadm-optical-tributary-signal-interfaces:otsi"])
+        self.assertDictEqual({"foic-type": "org-openroadm-common-optical-channel-types:foic1.4", "iid": [1]},
+                             response["interface"][0]["org-openroadm-optical-tributary-signal-interfaces:otsi"]["flexo"])
+
+    def test_08_check_interface_otsi(self):
+        # pylint: disable=line-too-long
+        response = test_utils.check_node_attribute_request("XPDR-C2", "interface", "XPDR3-NETWORK1-265:272")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        input_dict_1 = {"name": "XPDR3-NETWORK1-265:272",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/4-PLUG-NET",
+                        "type": "org-openroadm-interfaces:otsi",
+                        "supporting-port": "L1"}
+        input_dict_2 = {
+            "frequency": 193.00000,
+            "otsi-rate": "org-openroadm-common-optical-channel-types:R100G-otsi",
+            "fec": "org-openroadm-common-types:ofec",
+            "transmit-power": -5,
+            "provision-mode": "explicit",
+            "modulation-format": "dp-qpsk"}
+
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response["interface"][0]["org-openroadm-optical-tributary-signal-interfaces:otsi"]),
+                             response["interface"][0]["org-openroadm-optical-tributary-signal-interfaces:otsi"])
+        self.assertDictEqual({"foic-type": "org-openroadm-common-optical-channel-types:foic1.4", "iid": [1]},
+                             response["interface"][0]["org-openroadm-optical-tributary-signal-interfaces:otsi"]["flexo"])
+
+    def test_09_check_interface_otsig(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR3-NETWORK1-OTSIGROUP-100G")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        input_dict_1 = {"name": "XPDR3-NETWORK1-OTSIGROUP-100G",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/4-PLUG-NET",
+                        ["supporting-interface-list"][0]: "XPDR3-NETWORK1-265:272",
+                        "type": "org-openroadm-interfaces:otsi-group",
+                        "supporting-port": "L1"}
+        input_dict_2 = {"group-id": 1,
+                        "group-rate": "org-openroadm-common-optical-channel-types:R100G-otsi"}
+
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response["interface"][0]["org-openroadm-otsi-group-interfaces:otsi-group"]),
+                             response["interface"][0]["org-openroadm-otsi-group-interfaces:otsi-group"])
+
+    def test_10_check_interface_otsig(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-C2", "interface", "XPDR3-NETWORK1-OTSIGROUP-100G")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        input_dict_1 = {"name": "XPDR3-NETWORK1-OTSIGROUP-100G",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/4-PLUG-NET",
+                        ["supporting-interface-list"][0]: "XPDR3-NETWORK1-265:272",
+                        "type": "org-openroadm-interfaces:otsi-group",
+                        "supporting-port": "L1"}
+        input_dict_2 = {"group-id": 1,
+                        "group-rate": "org-openroadm-common-optical-channel-types:R100G-otsi"}
+
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response["interface"][0]["org-openroadm-otsi-group-interfaces:otsi-group"]),
+                             response["interface"][0]["org-openroadm-otsi-group-interfaces:otsi-group"])
+
+    def test_11_check_interface_otuc1(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR3-NETWORK1-OTUC1")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        input_dict_1 = {"name": "XPDR3-NETWORK1-OTUC1",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/4-PLUG_NET",
+                        ["supporting-interface-list"][0]: "XPDR3-NETWORK1-OTSIGROUP-100G",
+                        "type": "org-openroadm-interfaces:otnOtu",
+                        "supporting-port": "L1"}
+        input_dict_2 = {"rate": "org-openroadm-otn-common-types:OTUCn",
+                        "degthr-percentage": 100,
+                        "tim-detect-mode": "Disabled",
+                        "otucn-n-rate": 1,
+                        "degm-intervals": 2}
+
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response["interface"][0]["org-openroadm-otn-otu-interfaces:otu"]),
+                             response["interface"][0]["org-openroadm-otn-otu-interfaces:otu"])
+
+    def test_12_check_interface_otuc1(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-C2", "interface", "XPDR3-NETWORK1-OTUC1")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        input_dict_1 = {"name": "XPDR3-NETWORK1-OTUC1",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/4-PLUG_NET",
+                        ["supporting-interface-list"][0]: "XPDR3-NETWORK1-OTSIGROUP-100G",
+                        "type": "org-openroadm-interfaces:otnOtu",
+                        "supporting-port": "L1"}
+        input_dict_2 = {"rate": "org-openroadm-otn-common-types:OTUCn",
+                        "degthr-percentage": 100,
+                        "tim-detect-mode": "Disabled",
+                        "otucn-n-rate": 1,
+                        "degm-intervals": 2}
+
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response["interface"][0]["org-openroadm-otn-otu-interfaces:otu"]),
+                             response["interface"][0]["org-openroadm-otn-otu-interfaces:otu"])
+
+    def test_13_check_interface_oduc1(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR3-NETWORK1-ODUC1")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        input_dict_1 = {"name": "XPDR3-NETWORK1-ODUC1",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/4-PLUG_NET",
+                        "supporting-interface-list": "XPDR3-NETWORK1-OTUC1",
+                        "type": "org-openroadm-interfaces:otnOdu",
+                        "supporting-port": "L1"}
+
+        input_dict_2 = {"odu-function": "org-openroadm-otn-common-types:ODU-TTP",
+                        "rate": "org-openroadm-otn-common-types:ODUCn",
+                        "degm-intervals": 2,
+                        "degthr-percentage": 100,
+                        "monitoring-mode": "terminated",
+                        "oducn-n-rate": 1
+                        }
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2, **response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"]),
+                             response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"])
+        self.assertDictEqual(
+            {"payload-type": "22", "exp-payload-type": "22"},
+            response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"]["opu"])
+
+    def test_14_check_interface_oduc1(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-C2", "interface", "XPDR3-NETWORK1-ODUC1")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+
+        input_dict_1 = {"name": "XPDR3-NETWORK1-ODUC1",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/4-PLUG_NET",
+                        "supporting-interface-list": "XPDR3-NETWORK1-OTUC1",
+                        "type": "org-openroadm-interfaces:otnOdu",
+                        "supporting-port": "L1"}
+
+        input_dict_2 = {"odu-function": "org-openroadm-otn-common-types:ODU-TTP",
+                        "rate": "org-openroadm-otn-common-types:ODUCn",
+                        "degm-intervals": 2,
+                        "degthr-percentage": 100,
+                        "monitoring-mode": "terminated",
+                        "oducn-n-rate": 1
+                        }
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2, **response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"]),
+                             response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"])
+        self.assertDictEqual(
+            {"payload-type": "22", "exp-payload-type": "22"},
+            response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"]["opu"])
+
+    def test_15_check_interface_odu4(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR3-NETWORK1-ODU4")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+
+        input_dict_1 = {"name": "XPDR3-NETWORK1-ODU4",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/4-PLUG_NET",
+                        "supporting-interface-list": "XPDR3-NETWORK1-ODUC1",
+                        "type": "org-openroadm-interfaces:otnOdu",
+                        "supporting-port": "L1"}
+
+        input_dict_2 = {"odu-function": "org-openroadm-otn-common-types:ODU-TTP-CTP",
+                        "rate": "org-openroadm-otn-common-types:ODU4",
+                        "degm-intervals": 2,
+                        "degthr-percentage": 100,
+                        "monitoring-mode": "terminated"
+                        }
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2, **response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"]),
+                             response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"])
+        self.assertDictEqual(
+            {"payload-type": "07", "exp-payload-type": "07"},
+            response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"]["opu"])
+
+        # TODO: Check the trib-port numbering
+
+    def test_16_check_interface_odu4(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-C2", "interface", "XPDR3-NETWORK1-ODU4")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+
+        input_dict_1 = {"name": "XPDR3-NETWORK1-ODU4",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/4-PLUG_NET",
+                        "supporting-interface-list": "XPDR3-NETWORK1-ODUC1",
+                        "type": "org-openroadm-interfaces:otnOdu",
+                        "supporting-port": "L1"}
+
+        input_dict_2 = {"odu-function": "org-openroadm-otn-common-types:ODU-TTP-CTP",
+                        "rate": "org-openroadm-otn-common-types:ODU4",
+                        "degm-intervals": 2,
+                        "degthr-percentage": 100,
+                        "monitoring-mode": "terminated"
+                        }
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2, **response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"]),
+                             response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"])
+        self.assertDictEqual(
+            {"payload-type": "07", "exp-payload-type": "07"},
+            response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"]["opu"])
+
+        # TODO: Check the trib-port numbering
+
+    def test_17_check_interface_100ge_client(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR3-CLIENT1-ETHERNET")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        input_dict_1 = {"name": "XPDR3-CLIENT1-ETHERNET-100G",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/3-PLUG-CLIENT",
+                        "type": "org-openroadm-interfaces:ethernetCsmacd",
+                        "supporting-port": "C1"
+                        }
+        input_dict_2 = {"speed": 100000,
+                        "fec": "org-openroadm-common-types:off"}
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response["interface"][0]["org-openroadm-ethernet-interfaces:ethernet"]),
+                             response["interface"][0]["org-openroadm-ethernet-interfaces:ethernet"])
+
+    def test_18_check_interface_100ge_client(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-C2", "interface", "XPDR3-CLIENT1-ETHERNET")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        input_dict_1 = {"name": "XPDR3-CLIENT1-ETHERNET-100G",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/3-PLUG-CLIENT",
+                        "type": "org-openroadm-interfaces:ethernetCsmacd",
+                        "supporting-port": "C1"
+                        }
+        input_dict_2 = {"speed": 100000,
+                        "fec": "org-openroadm-common-types:off"}
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response["interface"][0]["org-openroadm-ethernet-interfaces:ethernet"]),
+                             response["interface"][0]["org-openroadm-ethernet-interfaces:ethernet"])
+
+    # Delete the service path
+    def test_19_service_path_delete_100ge(self):
+        response = test_utils.transportpce_api_rpc_request(
+            "transportpce-device-renderer", "service-path",
+            {
+                "service-name": "service_100GE_ofec",
+                "wave-number": "0",
+                "modulation-format": "dp-qpsk",
+                "operation": "delete",
+                "nodes": [{
+                    "node-id": "XPDR-A2",
+                    "src-tp": "XPDR3-CLIENT1",
+                    "dest-tp": "XPDR3-NETWORK1"
+                },
+                    {
+                    "node-id": "XPDR-C2",
+                    "src-tp": "XPDR3-CLIENT1",
+                    "dest-tp": "XPDR3-NETWORK1"
+                }],
+                "center-freq": 193.0,
+                "nmc-width": 37.5,
+                "min-freq": 192.975,
+                "max-freq": 193.025,
+                "lower-spectral-slot-number": 265,
+                "higher-spectral-slot-number": 272,
+            })
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        self.assertIn("Request processed", response["output"]["result"])
+
+    def test_20_check_no_interface_100ge_client(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR3-CLIENT1-ETHERNET")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_21_check_no_interface_100ge_client(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-C2", "interface", "XPDR3-CLIENT1-ETHERNET")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_22_check_no_interface_odu4(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR3-NETWORK1-ODU4")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_23_check_no_interface_odu4(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-C2", "interface", "XPDR3-NETWORK1-ODU4")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_24_check_no_interface_otuc2(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR3-NETWORK1-ODUC1")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_25_check_no_interface_otuc2(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-C2", "interface", "XPDR3-NETWORK1-ODUC1")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    # Check if port-mapping data is updated, where the supporting-otucn is deleted
+    def test_26_check_no_otuc1(self):
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR3-NETWORK1")
+        self.assertRaises(KeyError, lambda: response["supporting-otucn"])
+
+    def test_27_check_no_otuc1(self):
+        response = test_utils.get_portmapping_node_attr("XPDR-C2", "mapping", "XPDR3-NETWORK1")
+        self.assertRaises(KeyError, lambda: response["supporting-otucn"])
+
+    def test_28_check_no_interface_otsig(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR3-NETWORK1-OTSIGROUP-100G")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_29_check_no_interface_otsig(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-C2", "interface", "XPDR3-NETWORK1-OTSIGROUP-100G")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_30_check_no_interface_otsi(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR3-NETWORK1-265:272")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_31_check_no_interface_otsi(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-C2", "interface", "XPDR3-NETWORK1-265:272")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    # 200G 31.6 Gbaud mode for muxponder, with qam16
+    def test_32_service_path_create_otuc2(self):
+        response = test_utils.transportpce_api_rpc_request(
+            "transportpce-device-renderer", "service-path",
+            {
+                "service-name": "service_OTUC2",
+                "wave-number": "0",
+                "modulation-format": "dp-qam16",
+                "operation": "create",
+                "nodes": [{
+                    "node-id": "XPDR-A2",
+                    "dest-tp": "XPDR2-NETWORK1"
+                },
+                    {
+                    "node-id": "XPDR-C2",
+                    "dest-tp": "XPDR2-NETWORK1"
+                }],
+                "center-freq": 193.0,
+                "nmc-width": 37.5,
+                "min-freq": 192.975,
+                "max-freq": 193.025,
+                "lower-spectral-slot-number": 265,
+                "higher-spectral-slot-number": 272,
+            })
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        self.assertIn("Interfaces created successfully for nodes: ", response["output"]["result"])
+        # node-interface is list which does not preserve the order
+        a_side = "XPDR-A2"
+        z_side = "XPDR-C2"
+        if response["output"]["node-interface"][0]["node-id"] == z_side:
+            a_side, z_side = z_side, a_side
+        self.assertEqual(
+            {"node-id": a_side,
+             "otu-interface-id": [
+                 "XPDR2-NETWORK1-OTUC2"
+             ],
+             "och-interface-id": [
+                 "XPDR2-NETWORK1-OTSIGROUP-200G",
+                 "XPDR2-NETWORK1-265:272"
+             ]},
+            response["output"]["node-interface"][0])
+        self.assertEqual(
+            {"node-id": z_side,
+             "otu-interface-id": [
+                 "XPDR2-NETWORK1-OTUC2"
+             ],
+             "och-interface-id": [
+                 "XPDR2-NETWORK1-OTSIGROUP-200G",
+                 "XPDR2-NETWORK1-265:272"
+             ]},
+            response["output"]["node-interface"][1])
+        # Update the network dict variable for mpdr
+        self.NETWORK1_CHECK_DICT["logical-connection-point"] = "XPDR2-NETWORK1"
+        self.NETWORK1_CHECK_DICT["supporting-circuit-pack-name"] = "1/2/2-PLUG-NET"
+        self.NETWORK1_CHECK_DICT["port-qual"] = "switch-network"
+        self.NETWORK1_CHECK_DICT["xpdr-type"] = "mpdr"
+        self.NETWORK1_CHECK_DICT["lcp-hash-val"] = "LY9PxYJqUbw="
+
+    def test_33_get_portmapping_network1(self):
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR2-NETWORK1")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        self.NETWORK1_CHECK_DICT["supporting-otucn"] = "XPDR2-NETWORK1-OTUC2"
+        del self.NETWORK1_CHECK_DICT["connection-map-lcp"]
+        self.assertIn(
+            self.NETWORK1_CHECK_DICT,
+            response["mapping"])
+
+    def test_34_check_interface_otsi(self):
+        # pylint: disable=line-too-long
+        response = test_utils.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-265:272")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        input_dict_1 = {"name": "XPDR2-NETWORK1-265:272",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/2/2-PLUG-NET",
+                        "type": "org-openroadm-interfaces:otsi",
+                        "supporting-port": "L1"}
+        input_dict_2 = {
+            "frequency": 193.00000,
+            "otsi-rate": "org-openroadm-common-optical-channel-types:R200G-otsi",
+            "fec": "org-openroadm-common-types:ofec",
+            "transmit-power": -5,
+            "provision-mode": "explicit",
+            "modulation-format": "dp-qam16"}
+
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response["interface"][0]["org-openroadm-optical-tributary-signal-interfaces:otsi"]),
+                             response["interface"][0]["org-openroadm-optical-tributary-signal-interfaces:otsi"])
+        self.assertDictEqual({"foic-type": "org-openroadm-common-optical-channel-types:foic2.8", "iid": [1, 2]},
+                             response["interface"][0]["org-openroadm-optical-tributary-signal-interfaces:otsi"]["flexo"])
+
+    def test_35_check_interface_otsig(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR2-NETWORK1-OTSIGROUP-200G")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        input_dict_1 = {"name": "XPDR2-NETWORK1-OTSIGROUP-200G",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/2/2-PLUG-NET",
+                        ["supporting-interface-list"][0]: "XPDR2-NETWORK1-265:272",
+                        "type": "org-openroadm-interfaces:otsi-group",
+                        "supporting-port": "L1"}
+        input_dict_2 = {"group-id": 1,
+                        "group-rate": "org-openroadm-common-optical-channel-types:R200G-otsi"}
+
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response["interface"][0]["org-openroadm-otsi-group-interfaces:otsi-group"]),
+                             response["interface"][0]["org-openroadm-otsi-group-interfaces:otsi-group"])
+
+    def test_36_check_interface_otuc2(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR2-NETWORK1-OTUC2")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        input_dict_1 = {"name": "XPDR2-NETWORK1-OTUC2",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/2/2-PLUG-NET",
+                        ["supporting-interface-list"][0]: "XPDR2-NETWORK1-OTSIGROUP-200G",
+                        "type": "org-openroadm-interfaces:otnOtu",
+                        "supporting-port": "L1"}
+        input_dict_2 = {"rate": "org-openroadm-otn-common-types:OTUCn",
+                        "degthr-percentage": 100,
+                        "tim-detect-mode": "Disabled",
+                        "otucn-n-rate": 2,
+                        "degm-intervals": 2}
+
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response["interface"][0]["org-openroadm-otn-otu-interfaces:otu"]),
+                             response["interface"][0]["org-openroadm-otn-otu-interfaces:otu"])
+
+    # We do not need other test cases for the otn-service-path (ODUC2 and Ethernet)
+    # as there is no change in code and are covered in test02_otn_renderer
+
+    def test_37_service_path_delete_otuc2(self):
+        response = test_utils.transportpce_api_rpc_request(
+            "transportpce-device-renderer", "service-path",
+            {
+                "modulation-format": "dp-qam16",
+                "operation": "delete",
+                "service-name": "service_OTUC2",
+                "wave-number": "0",
+                "center-freq": 193.0,
+                "nmc-width": 37.5,
+                "min-freq": 192.975,
+                "max-freq": 193.025,
+                "lower-spectral-slot-number": 265,
+                "higher-spectral-slot-number": 272,
+                "nodes": [
+                    {
+                        "node-id": "XPDR-A2",
+                        "dest-tp": "XPDR2-NETWORK1"
+                    },
+                    {
+                        "node-id": "XPDR-C2",
+                        "dest-tp": "XPDR2-NETWORK1"
+                    }
+                ]
+            })
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        self.assertIn("Request processed", response["output"]["result"])
+        del self.NETWORK1_CHECK_DICT["supporting-otucn"]
+
+    def test_38_check_no_interface_otuc2(self):
+        response = test_utils.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-OTUC2")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_39_check_no_interface_otsig(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR2-NETWORK1-OTSIGROUP-200G")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_40_check_no_interface_otsi(self):
+        response = test_utils.check_node_attribute_request("XPDR-A2", "interface", "XPDR2-NETWORK1-755:768")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_41_check_no_otuc2(self):
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR2-NETWORK1")
+        self.assertRaises(KeyError, lambda: response["supporting-otucn"])
+
+    # Disconnect the XPDR
+    def test_42_xpdr_device_disconnection(self):
+        response = test_utils.unmount_device("XPDR-A2")
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
+
+    def test_43_xpdr_device_disconnected(self):
+        response = test_utils.check_device_connection("XPDR-A2")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+        self.assertIn(response["connection-status"]["error-type"], ("protocol", "application"))
+        self.assertEqual(response["connection-status"]["error-tag"], "data-missing")
+        self.assertEqual(response["connection-status"]["error-message"],
+                         "Request could not be completed because the relevant data model content does not exist")
+
+    def test_44_xpdr_device_not_connected(self):
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "node-info", None)
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+        self.assertIn(response["node-info"]["error-type"], ("protocol", "application"))
+        self.assertEqual(response["node-info"]["error-tag"], "data-missing")
+        self.assertEqual(response["node-info"]["error-message"],
+                         "Request could not be completed because the relevant data model content does not exist")
+
+    def test_45_xpdr_device_disconnection(self):
+        response = test_utils.unmount_device("XPDR-C2")
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
+
+    def test_46_xpdr_device_disconnected(self):
+        response = test_utils.check_device_connection("XPDR-C2")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+        self.assertIn(response["connection-status"]["error-type"], ("protocol", "application"))
+        self.assertEqual(response["connection-status"]["error-tag"], "data-missing")
+        self.assertEqual(response["connection-status"]["error-message"],
+                         "Request could not be completed because the relevant data model content does not exist")
+
+    def test_47_xpdr_device_not_connected(self):
+        response = test_utils.get_portmapping_node_attr("XPDR-C2", "node-info", None)
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+        self.assertIn(response["node-info"]["error-type"], ("protocol", "application"))
+        self.assertEqual(response["node-info"]["error-tag"], "data-missing")
+        self.assertEqual(response["node-info"]["error-message"],
+                         "Request could not be completed because the relevant data model content does not exist")
+
+
+if __name__ == "__main__":
+    unittest.main(verbosity=2)
diff --git a/tests/transportpce_tests/7.1/test04_renderer_regen_mode.py b/tests/transportpce_tests/7.1/test04_renderer_regen_mode.py
new file mode 100644 (file)
index 0000000..b9b467f
--- /dev/null
@@ -0,0 +1,330 @@
+#!/usr/bin/env python
+##############################################################################
+# Copyright (c) 2023 AT&T, Inc. and others.  All rights reserved.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+# pylint: disable=no-member
+# pylint: disable=too-many-public-methods
+
+# pylint: disable=wrong-import-order
+import sys
+import time
+import unittest
+
+import requests
+
+sys.path.append("transportpce_tests/common")
+# pylint: disable=wrong-import-position
+# pylint: disable=import-error
+import test_utils  # nopep8
+
+
+class TransportPCE400GPortMappingTesting(unittest.TestCase):
+
+    processes = None
+    NETWORK1_CHECK_DICT = {"logical-connection-point": "XPDR4-NETWORK1",
+                           "supporting-port": "L1",
+                           "supported-interface-capability": [
+                               "org-openroadm-port-types:if-otsi-otsigroup"
+                           ],
+                           "port-direction": "bidirectional",
+                           "port-qual": "xpdr-network",
+                           "supporting-circuit-pack-name": "1/1/6-PLUG-NET",
+                           "xpdr-type": "regen",
+                           "port-admin-state": "InService",
+                           "port-oper-state": "InService",
+                           "regen-profiles": {
+                               "regen-profile": [
+                                   "OTUC4-REGEN",
+                                   "OTUC2-REGEN",
+                                   "OTUC3-REGEN"
+                               ]
+                           }
+                           }
+    SUBSET_NETWORK1_CHECK_DICT = {"logical-connection-point": "XPDR4-NETWORK1",
+                                  "supporting-port": "L1",
+                                  "port-direction": "bidirectional",
+                                  "port-qual": "xpdr-network",
+                                  "supporting-circuit-pack-name": "1/1/6-PLUG-NET",
+                                  "xpdr-type": "regen",
+                                  "port-admin-state": "InService",
+                                  "port-oper-state": "InService"
+                                  }
+    REGEN_CAPABILITIES = ["OTUC2-REGEN",
+                          "OTUC3-REGEN",
+                          "OTUC4-REGEN",
+                          ]
+    SUP_INT_CAPA = ["org-openroadm-port-types:if-otsi-otsigroup"]
+    NODE_VERSION = "7.1"
+
+    @classmethod
+    def setUpClass(cls):
+        cls.processes = test_utils.start_tpce()
+        cls.processes = test_utils.start_sims([("xpdra2", cls.NODE_VERSION)])
+
+    @classmethod
+    def tearDownClass(cls):
+        # pylint: disable=not-an-iterable
+        for process in cls.processes:
+            test_utils.shutdown_process(process)
+        print("all processes killed")
+
+    def setUp(self):
+        # pylint: disable=consider-using-f-string
+        print("execution of {}".format(self.id().split(".")[-1]))
+        time.sleep(2)
+
+    def test_01_xpdr_device_connection(self):
+        response = test_utils.mount_device("XPDR-A2",
+                                           ("xpdra2", self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created,
+                         test_utils.CODE_SHOULD_BE_201)
+    # Check the xpdr-type as regen
+
+    def test_02_check_xpdr_type(self):
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR4-NETWORK1")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        self.assertEqual(
+            "regen", response["mapping"][0]["xpdr-type"])
+        self.assertEqual(
+            self.REGEN_CAPABILITIES,
+            sorted(response["mapping"][0]["regen-profiles"]["regen-profile"]))
+
+    # Check the xpdr-type as regen
+
+    def test_03_check_xpdr_type(self):
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR4-NETWORK2")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        self.assertEqual(
+            "regen", response["mapping"][0]["xpdr-type"])
+        self.assertEqual(
+            self.REGEN_CAPABILITIES,
+            sorted(response["mapping"][0]["regen-profiles"]["regen-profile"]))
+
+    def test_04_400g_regen_service_path_create(self):
+        response = test_utils.transportpce_api_rpc_request(
+            "transportpce-device-renderer", "service-path",
+            {
+                "service-name": "service_400g_regen",
+                "wave-number": "0",
+                "modulation-format": "dp-qam16",
+                "operation": "create",
+                "nodes": [
+                    {
+                        "node-id": "XPDR-A2",
+                        "src-tp": "XPDR4-NETWORK1",
+                        "dest-tp": "XPDR4-NETWORK2"
+                    }
+                ],
+                "center-freq": 195.0,
+                "nmc-width": 75,
+                "mc-width": 87.5,
+                "min-freq": 194.95625,
+                "max-freq": 195.04375,
+                "lower-spectral-slot-number": 582,
+                "higher-spectral-slot-number": 595,
+            })
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        self.assertIn("Interfaces created successfully for nodes: ", response["output"]["result"])
+
+        self.assertEqual(
+            {"node-id": "XPDR-A2",
+             "otu-interface-id": [
+                 "XPDR4-NETWORK1-OTUC4",
+                 "XPDR4-NETWORK2-OTUC4"
+             ],
+             "odu-interface-id": [
+                 "XPDR4-NETWORK1-ODUC4",
+                 "XPDR4-NETWORK2-ODUC4"
+             ],
+             "och-interface-id": [
+                 "XPDR4-NETWORK1-582:595",
+                 "XPDR4-NETWORK1-OTSIGROUP-400G",
+                 "XPDR4-NETWORK2-582:595",
+                 "XPDR4-NETWORK2-OTSIGROUP-400G",
+             ]},
+            {x: (sorted(response["output"]["node-interface"][0][x])
+                 if isinstance(response["output"]["node-interface"][0][x], list)
+                 else response["output"]["node-interface"][0][x])
+             for x in response["output"]["node-interface"][0].keys()})
+
+    def test_05_get_portmapping_network1(self):
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR4-NETWORK1")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        self.SUBSET_NETWORK1_CHECK_DICT["supporting-otucn"] = "XPDR4-NETWORK1-OTUC4"
+        self.SUBSET_NETWORK1_CHECK_DICT["lcp-hash-val"] = "AKkLPpWaa8x+"
+        self.SUBSET_NETWORK1_CHECK_DICT["connection-map-lcp"] = "XPDR4-NETWORK2"
+        subset = {k: v for k, v in response["mapping"][0].items() if k in self.SUBSET_NETWORK1_CHECK_DICT}
+        self.assertDictEqual(subset, self.SUBSET_NETWORK1_CHECK_DICT)
+        self.assertEqual(sorted(response["mapping"][0]["regen-profiles"]["regen-profile"]),
+                         self.REGEN_CAPABILITIES)
+        self.assertEqual(sorted(response["mapping"][0]["supported-interface-capability"]),
+                         self.SUP_INT_CAPA)
+
+    def test_06_get_portmapping_network1(self):
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR4-NETWORK2")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        self.SUBSET_NETWORK1_CHECK_DICT["logical-connection-point"] = "XPDR4-NETWORK2"
+        self.SUBSET_NETWORK1_CHECK_DICT["supporting-otucn"] = "XPDR4-NETWORK2-OTUC4"
+        self.SUBSET_NETWORK1_CHECK_DICT["lcp-hash-val"] = "AKkLPpWaa8x9"
+        self.SUBSET_NETWORK1_CHECK_DICT["connection-map-lcp"] = "XPDR4-NETWORK1"
+        self.SUBSET_NETWORK1_CHECK_DICT["supporting-circuit-pack-name"] = "1/1/5-PLUG-NET"
+        subset = {k: v for k, v in response["mapping"][0].items() if k in self.SUBSET_NETWORK1_CHECK_DICT}
+        self.assertDictEqual(subset, self.SUBSET_NETWORK1_CHECK_DICT)
+        self.assertEqual(sorted(response["mapping"][0]["regen-profiles"]["regen-profile"]),
+                         self.REGEN_CAPABILITIES)
+        self.assertEqual(sorted(response["mapping"][0]["supported-interface-capability"]),
+                         self.SUP_INT_CAPA)
+
+    def test_07_check_interface_oduc4(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR4-NETWORK1-ODUC4")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+
+        input_dict_1 = {"name": "XPDR4-NETWORK1-ODUC4",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/6-PLUG_NET",
+                        "supporting-interface-list": "XPDR4-NETWORK1-OTUC4",
+                        "type": "org-openroadm-interfaces:otnOdu",
+                        "supporting-port": "L1"}
+
+        input_dict_2 = {"odu-function": "org-openroadm-otn-common-types:ODU-CTP",
+                        "rate": "org-openroadm-otn-common-types:ODUCn",
+                        "degm-intervals": 2,
+                        "degthr-percentage": 100,
+                        "monitoring-mode": "not-terminated"
+                        }
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2, **response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"]),
+                             response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"])
+
+    def test_08_check_interface_oduc4(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR4-NETWORK2-ODUC4")
+        self.assertEqual(response["status_code"], requests.codes.ok)
+
+        input_dict_1 = {"name": "XPDR4-NETWORK2-ODUC4",
+                        "administrative-state": "inService",
+                        "supporting-circuit-pack-name": "1/1/5-PLUG_NET",
+                        "supporting-interface-list": "XPDR4-NETWORK2-ODUC4",
+                        "type": "org-openroadm-interfaces:otnOdu",
+                        "supporting-port": "L1"}
+
+        input_dict_2 = {"odu-function": "org-openroadm-otn-common-types:ODU-CTP",
+                        "rate": "org-openroadm-otn-common-types:ODUCn",
+                        "degm-intervals": 2,
+                        "degthr-percentage": 100,
+                        "monitoring-mode": "not-terminated"
+                        }
+        self.assertDictEqual(dict(input_dict_1, **response["interface"][0]),
+                             response["interface"][0])
+        self.assertDictEqual(dict(input_dict_2, **response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"]),
+                             response["interface"][0]["org-openroadm-otn-odu-interfaces:odu"])
+
+    # Delete the service path
+
+    def test_09_service_path_delete_regen(self):
+        response = test_utils.transportpce_api_rpc_request(
+            "transportpce-device-renderer", "service-path",
+            {
+                "modulation-format": "dp-qam16",
+                "operation": "delete",
+                "service-name": "test1_regen",
+                "wave-number": "0",
+                "center-freq": 195.0,
+                "nmc-width": 75,
+                "mc-width": 87.5,
+                "min-freq": 194.95625,
+                "max-freq": 195.04375,
+                "lower-spectral-slot-number": 582,
+                "higher-spectral-slot-number": 595,
+                "nodes": [
+                    {
+                        "node-id": "XPDR-A2",
+                        "src-tp": "XPDR4-NETWORK1",
+                        "dest-tp": "XPDR4-NETWORK2"
+                    }
+                ]
+            })
+        self.assertEqual(response["status_code"], requests.codes.ok)
+        self.assertIn("Request processed", response["output"]["result"])
+
+    def test_10_check_no_interface_oduc4(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR4-NETWORK1-ODUC4")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_11_check_no_interface_oduc4(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR4-NETWORK2-ODUC4")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_12_check_no_interface_otuc4(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR4-NETWORK1-OTUC1")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_13_check_no_interface_otuc4(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR4-NETWORK2-OTUC1")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    # Check if port-mapping data is updated, where the supporting-otucn is deleted
+    def test_14_check_no_otuc4(self):
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR4-NETWORK1")
+        self.assertRaises(KeyError, lambda: response["supporting-otucn"])
+
+    def test_15_check_no_otuc4(self):
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "mapping", "XPDR4-NETWORK1")
+        self.assertRaises(KeyError, lambda: response["supporting-otucn"])
+
+    def test_16_check_no_interface_otsig(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR4-NETWORK1-OTSIGROUP-400G")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_17_check_no_interface_otsig(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR4-NETWORK2-OTSIGROUP-400G")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_18_check_no_interface_otsi(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR4-NETWORK1-582:595")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    def test_19_check_no_interface_otsi(self):
+        response = test_utils.check_node_attribute_request(
+            "XPDR-A2", "interface", "XPDR4-NETWORK2-582:595")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+
+    # Disconnect the XPDR
+    def test_20_xpdr_device_disconnection(self):
+        response = test_utils.unmount_device("XPDR-A2")
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
+
+    def test_21_xpdr_device_disconnected(self):
+        response = test_utils.check_device_connection("XPDR-A2")
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+        self.assertIn(response["connection-status"]["error-type"], ("protocol", "application"))
+        self.assertEqual(response["connection-status"]["error-tag"], "data-missing")
+        self.assertEqual(response["connection-status"]["error-message"],
+                         "Request could not be completed because the relevant data model content does not exist")
+
+    def test_22_xpdr_device_not_connected(self):
+        response = test_utils.get_portmapping_node_attr("XPDR-A2", "node-info", None)
+        self.assertEqual(response["status_code"], requests.codes.conflict)
+        self.assertIn(response["node-info"]["error-type"], ("protocol", "application"))
+        self.assertEqual(response["node-info"]["error-tag"], "data-missing")
+        self.assertEqual(response["node-info"]["error-message"],
+                         "Request could not be completed because the relevant data model content does not exist")
+
+
+if __name__ == "__main__":
+    unittest.main(verbosity=2)
index cb7294af65d0847262f2875b348381fda5155481..5eef9402223464cb8bb694129a70ade302f566e2 100644 (file)
@@ -8,28 +8,29 @@
 # http://www.apache.org/licenses/LICENSE-2.0
 ##############################################################################
 
+# pylint: disable=line-too-long
 SIMS = {
-    ('xpdra', '1.2.1'): {'port': '17830', 'configfile': 'oper-XPDRA.xml', 'logfile': 'xpdra-121.log'},
-    ('roadma', '1.2.1'): {'port': '17831', 'configfile': 'oper-ROADMA.xml', 'logfile': 'roadma-121.log'},
-    ('roadmb', '1.2.1'): {'port': '17832', 'configfile': 'oper-ROADMB.xml', 'logfile': 'roadmb-121.log'},
-    ('roadmc', '1.2.1'): {'port': '17833', 'configfile': 'oper-ROADMC.xml', 'logfile': 'roadmc-121.log'},
-    ('xpdrc', '1.2.1'): {'port': '17834', 'configfile': 'oper-XPDRC.xml', 'logfile': 'xpdrc-121.log'},
-    ('roadma-full', '1.2.1'): {'port': '17821', 'configfile': 'oper-ROADMA-full.xml', 'logfile': 'roadma-121.log'},
-    ('roadmc-full', '1.2.1'): {'port': '17823', 'configfile': 'oper-ROADMC-full.xml', 'logfile': 'roadmc-121.log'},
-    ('xpdra', '2.2.1'): {'port': '17840', 'configfile': 'oper-XPDRA.xml', 'logfile': 'xpdra-221.log'},
-    ('roadma', '2.2.1'): {'port': '17841', 'configfile': 'oper-ROADMA.xml', 'logfile': 'roadma-221.log'},
-    ('roadmb', '2.2.1'): {'port': '17842', 'configfile': 'oper-ROADMB.xml', 'logfile': 'roadmb-221.log'},
-    ('roadmc', '2.2.1'): {'port': '17843', 'configfile': 'oper-ROADMC.xml', 'logfile': 'roadmc-221.log'},
-    ('roadmd', '2.2.1'): {'port': '17847', 'configfile': 'oper-ROADMD.xml', 'logfile': 'roadmd-221.log'},
-    ('xpdrc', '2.2.1'): {'port': '17844', 'configfile': 'oper-XPDRC.xml', 'logfile': 'xpdrc-221.log'},
-    ('spdra', '2.2.1'): {'port': '17845', 'configfile': 'oper-SPDRA.xml', 'logfile': 'spdra-221.log'},
-    ('spdrc', '2.2.1'): {'port': '17846', 'configfile': 'oper-SPDRC.xml', 'logfile': 'spdrc-221.log'},
-    ('spdrb', '2.2.1'): {'port': '17848', 'configfile': 'oper-SPDRB.xml', 'logfile': 'spdrb-221.log'},
-    ('xpdra', '7.1'): {'port': '17850', 'configfile': 'oper-XPDRA.xml', 'logfile': 'xpdra-71.log'},
-    ('roadma', '7.1'): {'port': '17851', 'configfile': 'oper-ROADMA.xml', 'logfile': 'roadma-71.log'},
-    ('roadmb', '7.1'): {'port': '17852', 'configfile': 'oper-ROADMB.xml', 'logfile': 'roadmb-71.log'},
-    ('roadmc', '7.1'): {'port': '17853', 'configfile': 'oper-ROADMC.xml', 'logfile': 'roadmc-71.log'},
-    ('xpdrc', '7.1'): {'port': '17854', 'configfile': 'oper-XPDRC.xml', 'logfile': 'xpdrc-71.log'},
-    ('xpdra2', '7.1'): {'port': '17857', 'configfile': 'oper-XPDRA2.xml', 'logfile': 'xpdra2-71.log'},
-    ('xpdrc2', '7.1'): {'port': '17858', 'configfile': 'oper-XPDRC2.xml', 'logfile': 'xpdrc2-71.log'}
+    ('xpdra', '1.2.1'): {'port': '17830', 'configfile': 'oper-XPDRA.xml', 'logfile': 'xpdra-121.log', 'restconf_baseurl': 'http://127.0.0.1:8130/restconf'},
+    ('roadma', '1.2.1'): {'port': '17831', 'configfile': 'oper-ROADMA.xml', 'logfile': 'roadma-121.log', 'restconf_baseurl': 'http://127.0.0.1:8131/restconf'},
+    ('roadmb', '1.2.1'): {'port': '17832', 'configfile': 'oper-ROADMB.xml', 'logfile': 'roadmb-121.log', 'restconf_baseurl': 'http://127.0.0.1:8132/restconf'},
+    ('roadmc', '1.2.1'): {'port': '17833', 'configfile': 'oper-ROADMC.xml', 'logfile': 'roadmc-121.log', 'restconf_baseurl': 'http://127.0.0.1:8133/restconf'},
+    ('xpdrc', '1.2.1'): {'port': '17834', 'configfile': 'oper-XPDRC.xml', 'logfile': 'xpdrc-121.log', 'restconf_baseurl': 'http://127.0.0.1:8134/restconf'},
+    ('roadma-full', '1.2.1'): {'port': '17821', 'configfile': 'oper-ROADMA-full.xml', 'logfile': 'roadma-121.log', 'restconf_baseurl': 'http://127.0.0.1:8121/restconf'},
+    ('roadmc-full', '1.2.1'): {'port': '17823', 'configfile': 'oper-ROADMC-full.xml', 'logfile': 'roadmc-121.log', 'restconf_baseurl': 'http://127.0.0.1:8123/restconf'},
+    ('xpdra', '2.2.1'): {'port': '17840', 'configfile': 'oper-XPDRA.xml', 'logfile': 'xpdra-221.log', 'restconf_baseurl': 'http://127.0.0.1:8140/restconf'},
+    ('roadma', '2.2.1'): {'port': '17841', 'configfile': 'oper-ROADMA.xml', 'logfile': 'roadma-221.log', 'restconf_baseurl': 'http://127.0.0.1:8141/restconf'},
+    ('roadmb', '2.2.1'): {'port': '17842', 'configfile': 'oper-ROADMB.xml', 'logfile': 'roadmb-221.log', 'restconf_baseurl': 'http://127.0.0.1:8142/restconf'},
+    ('roadmc', '2.2.1'): {'port': '17843', 'configfile': 'oper-ROADMC.xml', 'logfile': 'roadmc-221.log', 'restconf_baseurl': 'http://127.0.0.1:8143/restconf'},
+    ('roadmd', '2.2.1'): {'port': '17847', 'configfile': 'oper-ROADMD.xml', 'logfile': 'roadmd-221.log', 'restconf_baseurl': 'http://127.0.0.1:8147/restconf'},
+    ('xpdrc', '2.2.1'): {'port': '17844', 'configfile': 'oper-XPDRC.xml', 'logfile': 'xpdrc-221.log', 'restconf_baseurl': 'http://127.0.0.1:8144/restconf'},
+    ('spdra', '2.2.1'): {'port': '17845', 'configfile': 'oper-SPDRA.xml', 'logfile': 'spdra-221.log', 'restconf_baseurl': 'http://127.0.0.1:8145/restconf'},
+    ('spdrc', '2.2.1'): {'port': '17846', 'configfile': 'oper-SPDRC.xml', 'logfile': 'spdrc-221.log', 'restconf_baseurl': 'http://127.0.0.1:8146/restconf'},
+    ('spdrb', '2.2.1'): {'port': '17848', 'configfile': 'oper-SPDRB.xml', 'logfile': 'spdrb-221.log', 'restconf_baseurl': 'http://127.0.0.1:8148/restconf'},
+    ('xpdra', '7.1'): {'port': '17850', 'configfile': 'oper-XPDRA.xml', 'logfile': 'xpdra-71.log', 'restconf_baseurl': 'http://127.0.0.1:8150/restconf'},
+    ('roadma', '7.1'): {'port': '17851', 'configfile': 'oper-ROADMA.xml', 'logfile': 'roadma-71.log', 'restconf_baseurl': 'http://127.0.0.1:8151/restconf'},
+    ('roadmb', '7.1'): {'port': '17852', 'configfile': 'oper-ROADMB.xml', 'logfile': 'roadmb-71.log', 'restconf_baseurl': 'http://127.0.0.1:8152/restconf'},
+    ('roadmc', '7.1'): {'port': '17853', 'configfile': 'oper-ROADMC.xml', 'logfile': 'roadmc-71.log', 'restconf_baseurl': 'http://127.0.0.1:8153/restconf'},
+    ('xpdrc', '7.1'): {'port': '17854', 'configfile': 'oper-XPDRC.xml', 'logfile': 'xpdrc-71.log', 'restconf_baseurl': 'http://127.0.0.1:8154/restconf'},
+    ('xpdra2', '7.1'): {'port': '17857', 'configfile': 'oper-XPDRA2.xml', 'logfile': 'xpdra2-71.log', 'restconf_baseurl': 'http://127.0.0.1:8157/restconf'},
+    ('xpdrc2', '7.1'): {'port': '17858', 'configfile': 'oper-XPDRC2.xml', 'logfile': 'xpdrc2-71.log', 'restconf_baseurl': 'http://127.0.0.1:8158/restconf'}
 }
index 2a7dee015fe96bc3b147f47e3723507a10dec43d..b43346f87cef9ca3bb277a1d590cda21c18be54d 100644 (file)
@@ -1,7 +1,7 @@
 #!/usr/bin/env python
 
 ##############################################################################
-# Copyright (c) 2020 Orange, Inc. and others.  All rights reserved.
+# Copyright (c) 2021 Orange, Inc. and others.  All rights reserved.
 #
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Apache License, Version 2.0
@@ -10,7 +10,6 @@
 ##############################################################################
 
 # pylint: disable=no-member
-# pylint: disable=too-many-arguments
 
 import json
 import os
@@ -23,84 +22,184 @@ import time
 
 import psutil
 import requests
+import urllib.parse
+
+from dict2xml import dict2xml
+from netconf_client.connect import connect_ssh
+from netconf_client.ncclient import Manager
+
 
 # pylint: disable=import-error
 import simulators
 
 SIMS = simulators.SIMS
 
-HONEYNODE_OK_START_MSG = "Netconf SSH endpoint started successfully at 0.0.0.0"
-KARAF_OK_START_MSG = re.escape(
-    "Blueprint container for bundle org.opendaylight.netconf.restconf")+".* was successfully created"
+HONEYNODE_OK_START_MSG = 'Netconf SSH endpoint started successfully at 0.0.0.0'
+LIGHTYNODE_OK_START_MSG = 'Data tree change listeners registered'
+KARAF_OK_START_MSG = "Transportpce controller started"
 LIGHTY_OK_START_MSG = re.escape("lighty.io and RESTCONF-NETCONF started")
 
-ODL_LOGIN = "admin"
-ODL_PWD = "admin"
-NODES_LOGIN = "admin"
-NODES_PWD = "admin"
-URL_CONFIG_NETCONF_TOPO = "{}/config/network-topology:network-topology/topology/topology-netconf/"
-URL_CONFIG_ORDM_TOPO = "{}/config/ietf-network:networks/network/openroadm-topology/"
-URL_CONFIG_OTN_TOPO = "{}/config/ietf-network:networks/network/otn-topology/"
-URL_CONFIG_CLLI_NET = "{}/config/ietf-network:networks/network/clli-network/"
-URL_CONFIG_ORDM_NET = "{}/config/ietf-network:networks/network/openroadm-network/"
-URL_PORTMAPPING = "{}/config/transportpce-portmapping:network/nodes/"
-URL_OPER_SERV_LIST = "{}/operational/org-openroadm-service:service-list/"
-URL_GET_NBINOTIFICATIONS_PROCESS_SERV = "{}/operations/nbi-notifications:get-notifications-process-service/"
-URL_GET_NBINOTIFICATIONS_ALARM_SERV = "{}/operations/nbi-notifications:get-notifications-alarm-service/"
-URL_SERV_CREATE = "{}/operations/org-openroadm-service:service-create"
-URL_SERV_DELETE = "{}/operations/org-openroadm-service:service-delete"
-URL_SERVICE_PATH = "{}/operations/transportpce-device-renderer:service-path"
-URL_OTN_SERVICE_PATH = "{}/operations/transportpce-device-renderer:otn-service-path"
-URL_TAPI_CREATE_CONNECTIVITY = "{}/operations/tapi-connectivity:create-connectivity-service"
-URL_TAPI_DELETE_CONNECTIVITY = "{}/operations/tapi-connectivity:delete-connectivity-service"
-URL_CREATE_OTS_OMS = "{}/operations/transportpce-device-renderer:create-ots-oms"
-URL_PATH_COMPUTATION_REQUEST = "{}/operations/transportpce-pce:path-computation-request"
-URL_FULL_PORTMAPPING = "{}/config/transportpce-portmapping:network"
-URL_TAPI_TOPOLOGY_DETAILS = "{}/operations/tapi-topology:get-topology-details"
-URL_TAPI_NODE_DETAILS = "{}/operations/tapi-topology:get-node-details"
-URL_TAPI_SIP_LIST = "{}/operations/tapi-common:get-service-interface-point-list"
-URL_TAPI_SERVICE_LIST = "{}/operations/tapi-connectivity:get-connectivity-service-list"
+ODL_LOGIN = 'admin'
+ODL_PWD = 'admin'
+NODES_LOGIN = 'admin'
+NODES_PWD = 'admin'
 
 TYPE_APPLICATION_JSON = {'Content-Type': 'application/json', 'Accept': 'application/json'}
 TYPE_APPLICATION_XML = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}
 
+REQUEST_TIMEOUT = 10
+
 CODE_SHOULD_BE_200 = 'Http status code should be 200'
 CODE_SHOULD_BE_201 = 'Http status code should be 201'
+T100GE = 'Transponder 100GE'
+T0_MULTILAYER_TOPO = 'T0 - Multi-layer topology'
+T0_FULL_MULTILAYER_TOPO = 'T0 - Full Multi-layer topology'
+T100GE_UUID = 'cf51c729-3699-308a-a7d0-594c6a62ebbb'
+T0_MULTILAYER_TOPO_UUID = '747c670e-7a07-3dab-b379-5b1cd17402a3'
+T0_FULL_MULTILAYER_TOPO_UUID = '393f09a4-0a0b-3d82-a4f6-1fbbc14ca1a7'
 
-SIM_LOG_DIRECTORY = os.path.join(os.path.dirname(os.path.realpath(__file__)), "log")
+SIM_LOG_DIRECTORY = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'log')
 
 process_list = []
 
+if 'USE_ODL_ALT_RESTCONF_PORT' in os.environ:
+    RESTCONF_PORT = os.environ['USE_ODL_ALT_RESTCONF_PORT']
+else:
+    RESTCONF_PORT = 8181
+
+RESTCONF_PATH_PREFIX = {'rfc8040': '/rests',
+                        'draft-bierman02': '/restconf'}
 
-if "USE_ODL_ALT_RESTCONF_PORT" in os.environ:
-    RESTCONF_BASE_URL = "http://localhost:" + os.environ['USE_ODL_ALT_RESTCONF_PORT'] + "/restconf"
+if 'USE_ODL_RESTCONF_VERSION' in os.environ:
+    RESTCONF_VERSION = os.environ['USE_ODL_RESTCONF_VERSION']
+    if RESTCONF_VERSION not in RESTCONF_PATH_PREFIX:
+        print('unsupported RESTCONF version ' + RESTCONF_VERSION)
+        sys.exit(3)
 else:
-    RESTCONF_BASE_URL = "http://localhost:8181/restconf"
+    RESTCONF_VERSION = 'rfc8040'
+
+RESTCONF_BASE_URL = 'http://localhost:' + str(RESTCONF_PORT) + RESTCONF_PATH_PREFIX[RESTCONF_VERSION]
 
-if "USE_ODL_ALT_KARAF_INSTALL_DIR" in os.environ:
+if 'USE_ODL_ALT_KARAF_INSTALL_DIR' in os.environ:
     KARAF_INSTALLDIR = os.environ['USE_ODL_ALT_KARAF_INSTALL_DIR']
 else:
-    KARAF_INSTALLDIR = "karaf"
+    KARAF_INSTALLDIR = 'karaf'
 
 KARAF_LOG = os.path.join(
     os.path.dirname(os.path.realpath(__file__)),
-    "..", "..", "..", KARAF_INSTALLDIR, "target", "assembly", "data", "log", "karaf.log")
+    '..', '..', '..', KARAF_INSTALLDIR, 'target', 'assembly', 'data', 'log', 'karaf.log')
 
-if "USE_LIGHTY" in os.environ and os.environ['USE_LIGHTY'] == 'True':
+if 'USE_LIGHTY' in os.environ and os.environ['USE_LIGHTY'] == 'True':
     TPCE_LOG = 'odl-' + str(os.getpid()) + '.log'
 else:
     TPCE_LOG = KARAF_LOG
 
+if 'USE_SIMS' not in os.environ:
+    SIMS_TO_USE = 'lightynode'
+    SIMS_TYPE = 'lightynode'
+else:
+    SIMS_TO_USE = os.environ['USE_SIMS']
+    print("Forcing to use SIMS " + SIMS_TO_USE)
+    if SIMS_TO_USE != 'None' or 'SIMS_TYPE' not in os.environ:
+        SIMS_TYPE = SIMS_TO_USE
+    else:
+        SIMS_TYPE = os.environ['SIMS_TYPE']
+        print("Forcing to use SIMS type" + SIMS_TYPE)
+
+
+#
+# Basic HTTP operations
+#
+
+
+def get_request(url):
+    return requests.request(
+        'GET', url.format(RESTCONF_BASE_URL),
+        headers=TYPE_APPLICATION_JSON,
+        auth=(ODL_LOGIN, ODL_PWD),
+        timeout=REQUEST_TIMEOUT)
+
+
+def put_request(url, data):
+    return requests.request(
+        'PUT', url.format(RESTCONF_BASE_URL),
+        data=json.dumps(data),
+        headers=TYPE_APPLICATION_JSON,
+        auth=(ODL_LOGIN, ODL_PWD),
+        timeout=REQUEST_TIMEOUT)
+
+
+def delete_request(url):
+    return requests.request(
+        'DELETE', url.format(RESTCONF_BASE_URL),
+        headers=TYPE_APPLICATION_JSON,
+        auth=(ODL_LOGIN, ODL_PWD),
+        timeout=REQUEST_TIMEOUT)
+
+
+def post_request(url, data):
+    if data:
+        return requests.request(
+            "POST", url.format(RESTCONF_BASE_URL),
+            data=json.dumps(data),
+            headers=TYPE_APPLICATION_JSON,
+            auth=(ODL_LOGIN, ODL_PWD),
+            timeout=REQUEST_TIMEOUT)
+    return requests.request(
+        "POST", url.format(RESTCONF_BASE_URL),
+        headers=TYPE_APPLICATION_JSON,
+        auth=(ODL_LOGIN, ODL_PWD),
+        timeout=REQUEST_TIMEOUT)
+
+#
+# Process management
+#
+
+
+def start_honeynode(log_file: str, sim):
+    executable = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                              '..', '..', 'honeynode', sim[1], 'honeynode-simulator', 'honeycomb-tpce')
+    sample_directory = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                    '..', '..', 'sample_configs', 'openroadm', sim[1])
+    if os.path.isfile(executable):
+        with open(log_file, 'w', encoding='utf-8') as outfile:
+            return subprocess.Popen(
+                [executable, SIMS[sim]['port'], os.path.join(sample_directory, SIMS[sim]['configfile'])],
+                stdout=outfile, stderr=outfile)
+    return None
+
+
+def start_lightynode(log_file: str, sim):
+    executable = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                              '..', '..', 'lightynode', 'lightynode-openroadm-device', 'start-device.sh')
+    sample_directory = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                    '..', '..', 'sample_configs', 'openroadm', sim[1])
+    if os.path.isfile(executable):
+        with open(log_file, 'w', encoding='utf-8') as outfile:
+            return subprocess.Popen(
+                [executable, "-v" + sim[1], "-p" + SIMS[sim]['port'], "-f" + os.path.join(sample_directory,
+                                                                                          SIMS[sim]['configfile'])],
+                stdout=outfile, stderr=outfile)
+    return None
+
 
 def start_sims(sims_list):
+    if SIMS_TO_USE == 'None':
+        return None
+    if SIMS_TO_USE == 'honeynode':
+        start_msg = HONEYNODE_OK_START_MSG
+        start_method = start_honeynode
+    else:
+        start_msg = LIGHTYNODE_OK_START_MSG
+        start_method = start_lightynode
     for sim in sims_list:
-        print("starting simulator " + sim[0] + " in OpenROADM device version " + sim[1] + "...")
+        print('starting simulator ' + sim[0] + ' in OpenROADM device version ' + sim[1] + '...')
         log_file = os.path.join(SIM_LOG_DIRECTORY, SIMS[sim]['logfile'])
-        process = start_honeynode(log_file, sim)
-        if wait_until_log_contains(log_file, HONEYNODE_OK_START_MSG, 100):
-            print("simulator for " + sim[0] + " started")
+        process = start_method(log_file, sim)
+        if wait_until_log_contains(log_file, start_msg, 100):
+            print('simulator for ' + sim[0] + ' started')
         else:
-            print("simulator for " + sim[0] + " failed to start")
+            print('simulator for ' + sim[0] + ' failed to start')
             shutdown_process(process)
             for pid in process_list:
                 shutdown_process(pid)
@@ -110,17 +209,20 @@ def start_sims(sims_list):
 
 
 def start_tpce():
-    print("starting OpenDaylight...")
-    if "USE_LIGHTY" in os.environ and os.environ['USE_LIGHTY'] == 'True':
+    if 'NO_ODL_STARTUP' in os.environ:
+        print('No OpenDaylight instance to start!')
+        return []
+    print('starting OpenDaylight...')
+    if 'USE_LIGHTY' in os.environ and os.environ['USE_LIGHTY'] == 'True':
         process = start_lighty()
         start_msg = LIGHTY_OK_START_MSG
     else:
         process = start_karaf()
         start_msg = KARAF_OK_START_MSG
-    if wait_until_log_contains(TPCE_LOG, start_msg, time_to_wait=300):
-        print("OpenDaylight started !")
+    if wait_until_log_contains(TPCE_LOG, start_msg, time_to_wait=100):
+        print('OpenDaylight started !')
     else:
-        print("OpenDaylight failed to start !")
+        print('OpenDaylight failed to start !')
         shutdown_process(process)
         for pid in process_list:
             shutdown_process(pid)
@@ -130,463 +232,547 @@ def start_tpce():
 
 
 def start_karaf():
-    print("starting KARAF TransportPCE build...")
+    print('starting KARAF TransportPCE build...')
     executable = os.path.join(
         os.path.dirname(os.path.realpath(__file__)),
-        "..", "..", "..", KARAF_INSTALLDIR, "target", "assembly", "bin", "karaf")
+        '..', '..', '..', KARAF_INSTALLDIR, 'target', 'assembly', 'bin', 'karaf')
     with open('odl.log', 'w', encoding='utf-8') as outfile:
         return subprocess.Popen(
-            ["sh", executable, "server"], stdout=outfile, stderr=outfile, stdin=None)
+            ['sh', executable, 'server'], stdout=outfile, stderr=outfile, stdin=None)
 
 
 def start_lighty():
-    print("starting LIGHTY.IO TransportPCE build...")
+    print('starting LIGHTY.IO TransportPCE build...')
     executable = os.path.join(
         os.path.dirname(os.path.realpath(__file__)),
-        "..", "..", "..", "lighty", "target", "tpce",
-        "clean-start-controller.sh")
+        '..', '..', '..', 'lighty', 'target', 'tpce',
+        'clean-start-controller.sh')
     with open(TPCE_LOG, 'w', encoding='utf-8') as outfile:
         return subprocess.Popen(
-            ["sh", executable], stdout=outfile, stderr=outfile, stdin=None)
+            ['sh', executable], stdout=outfile, stderr=outfile, stdin=None)
 
 
 def install_karaf_feature(feature_name: str):
-    print("installing feature " + feature_name)
+    print('installing feature ' + feature_name)
     executable = os.path.join(
         os.path.dirname(os.path.realpath(__file__)),
-        "..", "..", "..", KARAF_INSTALLDIR, "target", "assembly", "bin", "client")
-    return subprocess.run([executable],
+        '..', '..', '..', KARAF_INSTALLDIR, 'target', 'assembly', 'bin', 'client')
+# FIXME: https://jira.opendaylight.org/browse/TRNSPRTPCE-701
+# -b option needed below because of Karaf client bug reporte in the JIRA ticket mentioned above
+    return subprocess.run([executable, '-b'],
                           input='feature:install ' + feature_name + '\n feature:list | grep '
-                          + feature_name + ' \n logout \n',
+                          + feature_name + ' \n',
                           universal_newlines=True, check=False)
 
 
-def get_request(url):
-    return requests.request(
-        "GET", url.format(RESTCONF_BASE_URL),
-        headers=TYPE_APPLICATION_JSON,
-        auth=(ODL_LOGIN, ODL_PWD))
-
-
-def post_request(url, data):
-    if data:
-        print(json.dumps(data))
-        return requests.request(
-            "POST", url.format(RESTCONF_BASE_URL),
-            data=json.dumps(data),
-            headers=TYPE_APPLICATION_JSON,
-            auth=(ODL_LOGIN, ODL_PWD))
-
-    return requests.request(
-        "POST", url.format(RESTCONF_BASE_URL),
-        headers=TYPE_APPLICATION_JSON,
-        auth=(ODL_LOGIN, ODL_PWD))
-
-
-def post_xmlrequest(url, data):
-    if data:
-        return requests.request(
-            "POST", url.format(RESTCONF_BASE_URL),
-            data=data,
-            headers=TYPE_APPLICATION_XML,
-            auth=(ODL_LOGIN, ODL_PWD))
-    return None
-
-
-def put_request(url, data):
-    return requests.request(
-        "PUT", url.format(RESTCONF_BASE_URL),
-        data=json.dumps(data),
-        headers=TYPE_APPLICATION_JSON,
-        auth=(ODL_LOGIN, ODL_PWD))
+def shutdown_process(process):
+    if process is not None:
+        for child in psutil.Process(process.pid).children():
+            child.send_signal(signal.SIGINT)
+            child.wait()
+        process.send_signal(signal.SIGINT)
 
 
-def put_xmlrequest(url, data):
-    return requests.request(
-        "PUT", url.format(RESTCONF_BASE_URL),
-        data=data,
-        headers=TYPE_APPLICATION_XML,
-        auth=(ODL_LOGIN, ODL_PWD))
+def wait_until_log_contains(log_file, regexp, time_to_wait=60):
+    # pylint: disable=lost-exception
+    # pylint: disable=consider-using-with
+    stringfound = False
+    line = None
+    try:
+        with TimeOut(seconds=time_to_wait):
+            while not os.path.exists(log_file):
+                time.sleep(0.2)
+            with open(log_file, 'r', encoding='utf-8') as filelogs:
+                filelogs.seek(0, 2)
+                print("Searching for pattern '" + regexp + "' in " + os.path.basename(log_file), end='... ', flush=True)
+                compiled_regexp = re.compile(regexp)
+                while True:
+                    line = filelogs.readline()
+                    if compiled_regexp.search(line):
+                        print('Pattern found!', end=' ')
+                        stringfound = True
+                        break
+                    if not line:
+                        time.sleep(0.1)
+        return stringfound
+    except TimeoutError:
+        print('Pattern not found after ' + str(time_to_wait), end=' seconds! ', flush=True)
+        return stringfound
+    except PermissionError:
+        print('Permission Error when trying to access the log file', end=' ... ', flush=True)
+        return stringfound
 
 
-def put_jsonrequest(url, data):
-    return requests.request(
-        "PUT", url.format(RESTCONF_BASE_URL),
-        data=data,
-        headers=TYPE_APPLICATION_JSON,
-        auth=(ODL_LOGIN, ODL_PWD))
+class TimeOut:
+    def __init__(self, seconds=1, error_message='Timeout'):
+        self.seconds = seconds
+        self.error_message = error_message
 
+    def handle_timeout(self, signum, frame):
+        raise TimeoutError(self.error_message)
 
-def rawput_request(url, data):
-    return requests.request(
-        "PUT", url.format(RESTCONF_BASE_URL),
-        data=data,
-        headers=TYPE_APPLICATION_JSON,
-        auth=(ODL_LOGIN, ODL_PWD))
+    def __enter__(self):
+        signal.signal(signal.SIGALRM, self.handle_timeout)
+        signal.alarm(self.seconds)
 
+    def __exit__(self, type, value, traceback):
+        # pylint: disable=W0622
+        signal.alarm(0)
 
-def rawpost_request(url, data):
-    return requests.request(
-        "POST", url.format(RESTCONF_BASE_URL),
-        data=data,
-        headers=TYPE_APPLICATION_JSON,
-        auth=(ODL_LOGIN, ODL_PWD))
+#
+# Basic NetCONF device operations
+#
 
 
-def delete_request(url):
-    return requests.request(
-        "DELETE", url.format(RESTCONF_BASE_URL),
-        headers=TYPE_APPLICATION_JSON,
-        auth=(ODL_LOGIN, ODL_PWD))
-
-
-def mount_device(node_id, sim):
-    url = URL_CONFIG_NETCONF_TOPO + "node/" + node_id
-    body = {"node": [{
-        "node-id": node_id,
-        "netconf-node-topology:username": NODES_LOGIN,
-        "netconf-node-topology:password": NODES_PWD,
-        "netconf-node-topology:host": "127.0.0.1",
-        "netconf-node-topology:port": SIMS[sim]['port'],
-        "netconf-node-topology:tcp-only": "false",
-        "netconf-node-topology:pass-through": {}}]}
-    response = put_request(url, body)
-    if wait_until_log_contains(TPCE_LOG, re.escape("Triggering notification stream NETCONF for node " + node_id), 180):
-        print("Node " + node_id + " correctly added to tpce topology", end='... ', flush=True)
+def mount_device(node: str, sim: str):
+    url = {'rfc8040': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}',
+           'draft-bierman02': '{}/config/network-topology:network-topology/topology/topology-netconf/node/{}'}
+    body = {'node': [{
+            "node-id": node,
+            "netconf-node-topology:host": "127.0.0.1",
+            "netconf-node-topology:port": SIMS[sim]['port'],
+            "netconf-node-topology:login-password-unencrypted": {
+                "netconf-node-topology:username": NODES_LOGIN,
+                "netconf-node-topology:password": NODES_PWD
+            },
+            "netconf-node-topology:tcp-only": "false",
+            "netconf-node-topology:reconnect-on-changed-schema": "false",
+            "netconf-node-topology:connection-timeout-millis": "20000",
+            "netconf-node-topology:default-request-timeout-millis": "60000",
+            "netconf-node-topology:max-connection-attempts": "0",
+            "netconf-node-topology:keepalive-delay": "120"}]}
+    response = put_request(url[RESTCONF_VERSION].format('{}', node), body)
+    if wait_until_log_contains(TPCE_LOG, 'Triggering notification stream NETCONF for node ' + node, 180):
+        print('Node ' + node + ' correctly added to tpce topology', end='... ', flush=True)
     else:
-        print("Node " + node_id + " still not added to tpce topology", end='... ', flush=True)
+        print('Node ' + node + ' still not added to tpce topology', end='... ', flush=True)
         if response.status_code == requests.codes.ok:
-            print("It was probably loaded at start-up", end='... ', flush=True)
+            print('It was probably loaded at start-up', end='... ', flush=True)
         # TODO an else-clause to abort test would probably be nice here
     return response
 
 
-def mount_tapi_device(node_id, sim):
-    url = URL_CONFIG_NETCONF_TOPO + "node/" + node_id
-    body = {"node": [{
-        "node-id": node_id,
-        "netconf-node-topology:username": NODES_LOGIN,
-        "netconf-node-topology:password": NODES_PWD,
-        "netconf-node-topology:host": "127.0.0.1",
-        "netconf-node-topology:port": SIMS[sim]['port'],
-        "netconf-node-topology:tcp-only": "false",
-        "netconf-node-topology:pass-through": {}}]}
-    response = put_request(url, body)
-    if wait_until_log_contains(TPCE_LOG, re.escape(f"TAPI node for or node {node_id} successfully merged"), 200):
-        print("Node " + node_id + " correctly added to tpce topology", end='... ', flush=True)
+def unmount_device(node: str):
+    url = {'rfc8040': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}',
+           'draft-bierman02': '{}/config/network-topology:network-topology/topology/topology-netconf/node/{}'}
+    response = delete_request(url[RESTCONF_VERSION].format('{}', node))
+    if wait_until_log_contains(TPCE_LOG, re.escape("onDeviceDisConnected: " + node), 180):
+        print('Node ' + node + ' correctly deleted from tpce topology', end='... ', flush=True)
     else:
-        print("Node " + node_id + " still not added to tpce topology", end='... ', flush=True)
-        if response.status_code == requests.codes.ok:
-            print("It was probably loaded at start-up", end='... ', flush=True)
-        # TODO an else-clause to abort test would probably be nice here
+        print('Node ' + node + ' still not deleted from tpce topology', end='... ', flush=True)
     return response
 
 
-def unmount_device(node_id):
-    url = URL_CONFIG_NETCONF_TOPO + "node/" + node_id
-    response = delete_request(url)
-    if wait_until_log_contains(TPCE_LOG, re.escape("onDeviceDisConnected: " + node_id), 180):
-        print("Node " + node_id + " correctly deleted from tpce topology", end='... ', flush=True)
+def check_device_connection(node: str):
+    url = {'rfc8040': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}?content=nonconfig',
+           'draft-bierman02': '{}/operational/network-topology:network-topology/topology/topology-netconf/node/{}'}
+    response = get_request(url[RESTCONF_VERSION].format('{}', node))
+    res = response.json()
+    return_key = {'rfc8040': 'network-topology:node',
+                  'draft-bierman02': 'node'}
+    if return_key[RESTCONF_VERSION] in res.keys():
+        connection_status = res[return_key[RESTCONF_VERSION]][0]['netconf-node-topology:connection-status']
     else:
-        print("Node " + node_id + " still not deleted from tpce topology", end='... ', flush=True)
-    return response
-
-
-def connect_xpdr_to_rdm_request(xpdr_node: str, xpdr_num: str, network_num: str,
-                                rdm_node: str, srg_num: str, termination_num: str):
-    url = "{}/operations/transportpce-networkutils:init-xpdr-rdm-links"
-    data = {
-        "networkutils:input": {
-            "networkutils:links-input": {
-                "networkutils:xpdr-node": xpdr_node,
-                "networkutils:xpdr-num": xpdr_num,
-                "networkutils:network-num": network_num,
-                "networkutils:rdm-node": rdm_node,
-                "networkutils:srg-num": srg_num,
-                "networkutils:termination-point-num": termination_num
-            }
-        }
-    }
-    return post_request(url, data)
-
-
-def connect_rdm_to_xpdr_request(xpdr_node: str, xpdr_num: str, network_num: str,
-                                rdm_node: str, srg_num: str, termination_num: str):
-    url = "{}/operations/transportpce-networkutils:init-rdm-xpdr-links"
-    data = {
-        "networkutils:input": {
-            "networkutils:links-input": {
-                "networkutils:xpdr-node": xpdr_node,
-                "networkutils:xpdr-num": xpdr_num,
-                "networkutils:network-num": network_num,
-                "networkutils:rdm-node": rdm_node,
-                "networkutils:srg-num": srg_num,
-                "networkutils:termination-point-num": termination_num
-            }
-        }
-    }
-    return post_request(url, data)
-
-
-def connect_xpdr_to_rdm_tapi_request(xpdr_node: str, xpdr_num: str, rdm_node: str, srg_num: str):
-    url = "{}/operations/transportpce-tapinetworkutils:init-xpdr-rdm-tapi-link"
-    data = {
-        "input": {
-            "xpdr-node": xpdr_node,
-            "network-tp": xpdr_num,
-            "rdm-node": rdm_node,
-            "add-drop-tp": srg_num
-        }
-    }
-    return post_request(url, data)
-
-
-def check_netconf_node_request(node: str, suffix: str):
-    url = URL_CONFIG_NETCONF_TOPO + (
-        "node/" + node + "/yang-ext:mount/org-openroadm-device:org-openroadm-device/" + suffix
-    )
-    return get_request(url)
-
-
-def get_netconf_oper_request(node: str):
-    url = "{}/operational/network-topology:network-topology/topology/topology-netconf/node/" + node
-    return get_request(url)
-
-
-def get_ordm_topo_request(suffix: str):
-    url = URL_CONFIG_ORDM_TOPO + suffix
-    return get_request(url)
-
-
-def add_oms_attr_request(link: str, attr):
-    url = URL_CONFIG_ORDM_TOPO + (
-        "ietf-network-topology:link/" + link + "/org-openroadm-network-topology:OMS-attributes/span"
-    )
-    return put_request(url, attr)
-
-
-def del_oms_attr_request(link: str):
-    url = URL_CONFIG_ORDM_TOPO + (
-        "ietf-network-topology:link/" + link + "/org-openroadm-network-topology:OMS-attributes/span"
-    )
-    return delete_request(url)
-
-
-def get_clli_net_request():
-    return get_request(URL_CONFIG_CLLI_NET)
-
-
-def get_ordm_net_request():
-    return get_request(URL_CONFIG_ORDM_NET)
-
-
-def get_otn_topo_request():
-    return get_request(URL_CONFIG_OTN_TOPO)
-
-
-def del_link_request(link: str):
-    url = URL_CONFIG_ORDM_TOPO + ("ietf-network-topology:link/" + link)
-    return delete_request(url)
-
-
-def del_node_request(node: str):
-    url = URL_CONFIG_CLLI_NET + ("node/" + node)
-    return delete_request(url)
-
-
-def portmapping_request(suffix: str):
-    url = URL_PORTMAPPING + suffix
-    return get_request(url)
+        connection_status = res['errors']['error'][0]
+    return {'status_code': response.status_code,
+            'connection-status': connection_status}
+
+
+def check_node_request(node: str):
+    # pylint: disable=line-too-long
+    url = {'rfc8040': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}/yang-ext:mount/org-openroadm-device:org-openroadm-device?content=config',  # nopep8
+           'draft-bierman02': '{}/config/network-topology:network-topology/topology/topology-netconf/node/{}/yang-ext:mount/org-openroadm-device:org-openroadm-device'}  # nopep8
+    response = get_request(url[RESTCONF_VERSION].format('{}', node))
+    res = response.json()
+    return_key = {'rfc8040': 'org-openroadm-device:org-openroadm-device',
+                  'draft-bierman02': 'org-openroadm-device'}
+    if return_key[RESTCONF_VERSION] in res.keys():
+        response_attribute = res[return_key[RESTCONF_VERSION]]
+    else:
+        response_attribute = res['errors']['error'][0]
+    return {'status_code': response.status_code,
+            'org-openroadm-device': response_attribute}
+
+
+def check_node_attribute_request(node: str, attribute: str, attribute_value: str):
+    # pylint: disable=line-too-long
+    url = {'rfc8040': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}/yang-ext:mount/org-openroadm-device:org-openroadm-device/{}={}?content=nonconfig',  # nopep8
+           'draft-bierman02': '{}/operational/network-topology:network-topology/topology/topology-netconf/node/{}/yang-ext:mount/org-openroadm-device:org-openroadm-device/{}/{}'}  # nopep8
+    response = get_request(url[RESTCONF_VERSION].format('{}', node, attribute, attribute_value))
+    res = response.json()
+    return_key = {'rfc8040': 'org-openroadm-device:' + attribute,
+                  'draft-bierman02': attribute}
+    if return_key[RESTCONF_VERSION] in res.keys():
+        response_attribute = res[return_key[RESTCONF_VERSION]]
+    elif 'errors' in res.keys():
+        response_attribute = res['errors']['error'][0]
+    else:
+        # status code 400 invalid request
+        response_attribute = res['message'] + ' ' + res['url']
+        print(response_attribute)
+    return {'status_code': response.status_code,
+            attribute: response_attribute}
+
+
+def check_node_attribute2_request(node: str, attribute: str, attribute_value: str, attribute2: str):
+    # pylint: disable=line-too-long
+    url = {'rfc8040': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}/yang-ext:mount/org-openroadm-device:org-openroadm-device/{}={}/{}?content=config',  # nopep8
+           'draft-bierman02': '{}/config/network-topology:network-topology/topology/topology-netconf/node/{}/yang-ext:mount/org-openroadm-device:org-openroadm-device/{}/{}/{}'}  # nopep8
+    response = get_request(url[RESTCONF_VERSION].format('{}', node, attribute, attribute_value, attribute2))
+    res = response.json()
+    if attribute2 in res.keys():
+        response_attribute = res[attribute2]
+    else:
+        response_attribute = res['errors']['error'][0]
+    return {'status_code': response.status_code,
+            attribute2: response_attribute}
 
 
-def get_notifications_process_service_request(attr):
-    return post_request(URL_GET_NBINOTIFICATIONS_PROCESS_SERV, attr)
+def del_node_attribute_request(node: str, attribute: str, attribute_value: str):
+    # pylint: disable=line-too-long
+    url = {'rfc8040': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}/yang-ext:mount/org-openroadm-device:org-openroadm-device/{}={}',  # nopep8
+           'draft-bierman02': '{}/config/network-topology:network-topology/topology/topology-netconf/node/{}/yang-ext:mount/org-openroadm-device:org-openroadm-device/{}/{}'}  # nopep8
+    response = delete_request(url[RESTCONF_VERSION].format('{}', node, attribute, attribute_value))
+    return response
 
+#
+# Portmapping operations
+#
 
-def get_notifications_alarm_service_request(attr):
-    return post_request(URL_GET_NBINOTIFICATIONS_ALARM_SERV, attr)
 
+def post_portmapping(payload: str):
+    url = {'rfc8040': '{}/data/transportpce-portmapping:network',
+           'draft-bierman02': '{}/config/transportpce-portmapping:network'}
+    json_payload = json.loads(payload)
+    response = post_request(url[RESTCONF_VERSION].format('{}'), json_payload)
+    return {'status_code': response.status_code}
 
-def get_service_list_request(suffix: str):
-    url = URL_OPER_SERV_LIST + suffix
-    return get_request(url)
 
+def del_portmapping():
+    url = {'rfc8040': '{}/data/transportpce-portmapping:network',
+           'draft-bierman02': '{}/config/transportpce-portmapping:network'}
+    response = delete_request(url[RESTCONF_VERSION].format('{}'))
+    return {'status_code': response.status_code}
 
-def service_create_request(attr):
-    return post_request(URL_SERV_CREATE, attr)
 
+def get_portmapping_node_attr(node: str, attr: str, value: str):
+    # pylint: disable=consider-using-f-string
+    url = {'rfc8040': '{}/data/transportpce-portmapping:network/nodes={}',
+           'draft-bierman02': '{}/config/transportpce-portmapping:network/nodes/{}'}
+    target_url = url[RESTCONF_VERSION].format('{}', node)
+    if attr is not None:
+        target_url = (target_url + '/{}').format('{}', attr)
+        if value is not None:
+            suffix = {'rfc8040': '={}', 'draft-bierman02': '/{}'}
+            target_url = (target_url + suffix[RESTCONF_VERSION]).format('{}', value)
+    else:
+        attr = 'nodes'
+    response = get_request(target_url)
+    res = response.json()
+    return_key = {'rfc8040': 'transportpce-portmapping:' + attr,
+                  'draft-bierman02': attr}
+    if return_key[RESTCONF_VERSION] in res.keys():
+        return_output = res[return_key[RESTCONF_VERSION]]
+    else:
+        return_output = res['errors']['error'][0]
+    return {'status_code': response.status_code,
+            attr: return_output}
 
-def service_delete_request(servicename: str,
-                           requestid="e3028bae-a90f-4ddd-a83f-cf224eba0e58",
-                           notificationurl="http://localhost:8585/NotificationServer/notify"):
-    attr = {"input": {
-        "sdnc-request-header": {
-            "request-id": requestid,
-            "rpc-action": "service-delete",
-            "request-system-id": "appname",
-            "notification-url": notificationurl},
-        "service-delete-req-info": {
-            "service-name": servicename,
-            "tail-retention": "no"}}}
-    return post_request(URL_SERV_DELETE, attr)
+#
+# Topology operations
+#
 
 
-def service_path_request(operation: str, servicename: str, wavenumber: str, nodes, centerfreq: str,
-                         slotwidth: int, minfreq: float, maxfreq: float, lowerslotnumber: int,
-                         higherslotnumber: int, modulation_format="dp-qpsk"):
-    attr = {"renderer:input": {
-        "renderer:service-name": servicename,
-        "renderer:wave-number": wavenumber,
-        "renderer:modulation-format": modulation_format,
-        "renderer:operation": operation,
-        "renderer:nodes": nodes,
-        "renderer:center-freq": centerfreq,
-        "renderer:nmc-width": slotwidth,
-        "renderer:min-freq": minfreq,
-        "renderer:max-freq": maxfreq,
-        "renderer:lower-spectral-slot-number": lowerslotnumber,
-        "renderer:higher-spectral-slot-number": higherslotnumber}}
-    return post_request(URL_SERVICE_PATH, attr)
+def get_ietf_network_request(network: str, content: str):
+    url = {'rfc8040': '{}/data/ietf-network:networks/network={}?content={}',
+           'draft-bierman02': '{}/{}/ietf-network:networks/network/{}'}
+    if RESTCONF_VERSION in ('rfc8040'):
+        format_args = ('{}', network, content)
+    elif content == 'config':
+        format_args = ('{}', content, network)
+    else:
+        format_args = ('{}', 'operational', network)
+    response = get_request(url[RESTCONF_VERSION].format(*format_args))
+    if bool(response):
+        res = response.json()
+        return_key = {'rfc8040': 'ietf-network:network',
+                      'draft-bierman02': 'network'}
+        networks = res[return_key[RESTCONF_VERSION]]
+    else:
+        networks = None
+    return {'status_code': response.status_code,
+            'network': networks}
 
 
-def otn_service_path_request(operation: str, servicename: str, servicerate: str, serviceformat: str, nodes,
-                             eth_attr=None):
-    attr = {"service-name": servicename,
-            "operation": operation,
-            "service-rate": servicerate,
-            "service-format": serviceformat,
-            "nodes": nodes}
-    if eth_attr:
-        attr.update(eth_attr)
-    return post_request(URL_OTN_SERVICE_PATH, {"renderer:input": attr})
+def put_ietf_network(network: str, payload: str):
+    url = {'rfc8040': '{}/data/ietf-network:networks/network={}',
+           'draft-bierman02': '{}/config/ietf-network:networks/network/{}'}
+    json_payload = json.loads(payload)
+    response = put_request(url[RESTCONF_VERSION].format('{}', network), json_payload)
+    return {'status_code': response.status_code}
 
 
-def create_ots_oms_request(nodeid: str, lcp: str):
-    attr = {"input": {
-        "node-id": nodeid,
-        "logical-connection-point": lcp}}
-    return post_request(URL_CREATE_OTS_OMS, attr)
+def del_ietf_network(network: str):
+    url = {'rfc8040': '{}/data/ietf-network:networks/network={}',
+           'draft-bierman02': '{}/config/ietf-network:networks/network/{}'}
+    response = delete_request(url[RESTCONF_VERSION].format('{}', network))
+    return {'status_code': response.status_code}
 
 
-def path_computation_request(requestid: str, servicename: str, serviceaend, servicezend,
-                             hardconstraints=None, softconstraints=None, metric="hop-count", other_attr=None):
-    attr = {"service-name": servicename,
-            "resource-reserve": "true",
-            "service-handler-header": {"request-id": requestid},
-            "service-a-end": serviceaend,
-            "service-z-end": servicezend,
-            "pce-routing-metric": metric}
-    if hardconstraints:
-        attr.update({"hard-constraints": hardconstraints})
-    if softconstraints:
-        attr.update({"soft-constraints": softconstraints})
-    if other_attr:
-        attr.update(other_attr)
-    return post_request(URL_PATH_COMPUTATION_REQUEST, {"input": attr})
+def get_ietf_network_link_request(network: str, link: str, content: str):
+    url = {'rfc8040': '{}/data/ietf-network:networks/network={}/ietf-network-topology:link={}?content={}',
+           'draft-bierman02': '{}/{}/ietf-network:networks/network/{}/ietf-network-topology:link/{}'}
+    if RESTCONF_VERSION in ('rfc8040'):
+        format_args = ('{}', network, link, content)
+    elif content == 'config':
+        format_args = ('{}', content, network, link)
+    else:
+        format_args = ('{}', 'operational', network, link)
+    response = get_request(url[RESTCONF_VERSION].format(*format_args))
+    res = response.json()
+    return_key = {'rfc8040': 'ietf-network-topology:link',
+                  'draft-bierman02': 'ietf-network-topology:link'}
+    link = res[return_key[RESTCONF_VERSION]][0]
+    return {'status_code': response.status_code,
+            'link': link}
+
+
+def del_ietf_network_link_request(network: str, link: str, content: str):
+    url = {'rfc8040': '{}/data/ietf-network:networks/network={}/ietf-network-topology:link={}?content={}',
+           'draft-bierman02': '{}/{}/ietf-network:networks/network/{}/ietf-network-topology:link/{}'}
+    if RESTCONF_VERSION in ('rfc8040'):
+        format_args = ('{}', network, link, content)
+    elif content == 'config':
+        format_args = ('{}', content, network, link)
+    else:
+        format_args = ('{}', 'operational', network, link)
+    response = delete_request(url[RESTCONF_VERSION].format(*format_args))
+    return response
 
 
-def tapi_create_connectivity_request(topologyidorname):
-    return post_request(URL_TAPI_CREATE_CONNECTIVITY, topologyidorname)
+def add_oms_attr_request(link: str, oms_attr: str):
+    url = {'rfc8040': '{}/data/ietf-network:networks/network={}/ietf-network-topology:link={}',
+           'draft-bierman02': '{}/config/ietf-network:networks/network/{}/ietf-network-topology:link/{}'}
+    url2 = url[RESTCONF_VERSION] + '/org-openroadm-network-topology:OMS-attributes/span'
+    network = 'openroadm-topology'
+    response = put_request(url2.format('{}', network, link), oms_attr)
+    return response
 
 
-def tapi_delete_connectivity_request(serviceidorname):
-    attr = {
-        "input": {
-            "service-id-or-name": serviceidorname}}
-    return post_request(URL_TAPI_DELETE_CONNECTIVITY, attr)
+def del_oms_attr_request(link: str,):
+    url = {'rfc8040': '{}/data/ietf-network:networks/network={}/ietf-network-topology:link={}',
+           'draft-bierman02': '{}/config/ietf-network:networks/network/{}/ietf-network-topology:link/{}'}
+    url2 = url[RESTCONF_VERSION] + '/org-openroadm-network-topology:OMS-attributes/span'
+    network = 'openroadm-topology'
+    response = delete_request(url2.format('{}', network, link))
+    return response
 
 
-def tapi_get_topology_details_request(topologyidorname):
-    attr = {
-        "input": {
-            "topology-id-or-name": topologyidorname}}
-    return post_request(URL_TAPI_TOPOLOGY_DETAILS, attr)
+def get_ietf_network_node_request(network: str, node: str, content: str):
+    url = {'rfc8040': '{}/data/ietf-network:networks/network={}/node={}?content={}',
+           'draft-bierman02': '{}/{}/ietf-network:networks/network/{}/node/{}'}
+    if RESTCONF_VERSION in ('rfc8040'):
+        format_args = ('{}', network, node, content)
+    elif content == 'config':
+        format_args = ('{}', content, network, node)
+    else:
+        format_args = ('{}', 'operational', network, node)
+    response = get_request(url[RESTCONF_VERSION].format(*format_args))
+    if bool(response):
+        res = response.json()
+        return_key = {'rfc8040': 'ietf-network:node',
+                      'draft-bierman02': 'node'}
+        node = res[return_key[RESTCONF_VERSION]][0]
+    else:
+        node = None
+    return {'status_code': response.status_code,
+            'node': node}
+
+
+def del_ietf_network_node_request(network: str, node: str, content: str):
+    url = {'rfc8040': '{}/data/ietf-network:networks/network={}/node={}?content={}',
+           'draft-bierman02': '{}/{}/ietf-network:networks/network/{}/node/{}'}
+    if RESTCONF_VERSION in ('rfc8040'):
+        format_args = ('{}', network, node, content)
+    elif content == 'config':
+        format_args = ('{}', content, network, node)
+    else:
+        format_args = ('{}', 'operational', network, node)
+    response = delete_request(url[RESTCONF_VERSION].format(*format_args))
+    return response
 
 
-def tapi_get_node_details_request(topologyidorname, nodeidorname):
-    attr = {
-        "input": {
-            "topology-id-or-name": topologyidorname,
-            "node-id-or-name": nodeidorname}}
-    return post_request(URL_TAPI_NODE_DETAILS, attr)
-
-
-def tapi_get_sip_details_request():
-    return post_request(URL_TAPI_SIP_LIST, "")
-
-
-def tapi_get_service_list_request():
-    return post_request(URL_TAPI_SERVICE_LIST, "")
+#
+# Service list operations
+#
 
 
-def shutdown_process(process):
-    if process is not None:
-        for child in psutil.Process(process.pid).children():
-            child.send_signal(signal.SIGINT)
-            child.wait()
-        process.send_signal(signal.SIGINT)
+def get_ordm_serv_list_request():
+    url = {'rfc8040': '{}/data/org-openroadm-service:service-list?content=nonconfig',
+           'draft-bierman02': '{}/operational/org-openroadm-service:service-list/'}
+    response = get_request(url[RESTCONF_VERSION])
+    res = response.json()
+    return_key = {'rfc8040': 'org-openroadm-service:service-list',
+                  'draft-bierman02': 'service-list'}
+    if return_key[RESTCONF_VERSION] in res.keys():
+        response_attribute = res[return_key[RESTCONF_VERSION]]
+    else:
+        response_attribute = res['errors']['error'][0]
+    return {'status_code': response.status_code,
+            'service-list': response_attribute}
+
+
+def get_ordm_serv_list_attr_request(attribute: str, value: str):
+    url = {'rfc8040': '{}/data/org-openroadm-service:service-list/{}={}?content=nonconfig',
+           'draft-bierman02': '{}/operational/org-openroadm-service:service-list/{}/{}'}
+    format_args = ('{}', attribute, value)
+    response = get_request(url[RESTCONF_VERSION].format(*format_args))
+    res = response.json()
+    return_key = {'rfc8040': 'org-openroadm-service:' + attribute,
+                  'draft-bierman02': attribute}
+    if return_key[RESTCONF_VERSION] in res.keys():
+        response_attribute = res[return_key[RESTCONF_VERSION]]
+    else:
+        response_attribute = res['errors']['error'][0]
+    return {'status_code': response.status_code,
+            attribute: response_attribute}
+
+
+def get_serv_path_list_attr(attribute: str, value: str):
+    url = {'rfc8040': '{}/data/transportpce-service-path:service-path-list/{}={}?content=nonconfig',
+           'draft-bierman02': '{}/operational/transportpce-service-path:service-path-list/{}/{}'}
+    response = get_request(url[RESTCONF_VERSION].format('{}', attribute, value))
+    res = response.json()
+    return_key = {'rfc8040': 'transportpce-service-path:' + attribute,
+                  'draft-bierman02': attribute}
+    if return_key[RESTCONF_VERSION] in res.keys():
+        response_attribute = res[return_key[RESTCONF_VERSION]]
+    else:
+        response_attribute = res['errors']['error'][0]
+    return {'status_code': response.status_code,
+            attribute: response_attribute}
 
 
-def start_honeynode(log_file: str, sim):
-    executable = os.path.join(os.path.dirname(os.path.realpath(__file__)),
-                              "..", "..", "honeynode", sim[1], "honeynode-simulator", "honeycomb-tpce")
-    sample_directory = os.path.join(os.path.dirname(os.path.realpath(__file__)),
-                                    "..", "..", "sample_configs", "openroadm", sim[1])
-    if os.path.isfile(executable):
-        with open(log_file, 'w', encoding='utf-8') as outfile:
-            return subprocess.Popen(
-                [executable, SIMS[sim]['port'], os.path.join(sample_directory, SIMS[sim]['configfile'])],
-                stdout=outfile, stderr=outfile)
-    return None
+#
+# TransportPCE internal API RPCs
+#
 
 
-def wait_until_log_contains(log_file, regexp, time_to_wait=60):
-    # pylint: disable=lost-exception
-    # pylint: disable=consider-using-with
-    stringfound = False
-    filefound = False
-    line = None
-    try:
-        with TimeOut(seconds=time_to_wait):
-            while not os.path.exists(log_file):
-                time.sleep(0.2)
-            filelogs = open(log_file, 'r', encoding='utf-8')
-            filelogs.seek(0, 2)
-            filefound = True
-            print("Searching for pattern '" + regexp + "' in " + os.path.basename(log_file), end='... ', flush=True)
-            compiled_regexp = re.compile(regexp)
-            while True:
-                line = filelogs.readline()
-                if compiled_regexp.search(line):
-                    print("Pattern found!", end=' ')
-                    stringfound = True
-                    break
-                if not line:
-                    time.sleep(0.1)
-    except TimeoutError:
-        print("Pattern not found after " + str(time_to_wait), end=" seconds! ", flush=True)
-    except PermissionError:
-        print("Permission Error when trying to access the log file", end=" ... ", flush=True)
-    finally:
-        if filefound:
-            filelogs.close()
+def prepend_dict_keys(input_dict: dict, prefix: str):
+    return_dict = {}
+    for key, value in input_dict.items():
+        newkey = prefix + key
+        if isinstance(value, dict):
+            return_dict[newkey] = prepend_dict_keys(value, prefix)
+            # TODO: perhaps some recursion depth limit or another solution has to be considered here
+            # even if recursion depth is given by the input_dict argument
+            # direct (self-)recursive functions may carry unwanted side-effects such as ressource consumptions
         else:
-            print("log file does not exist or is not accessible... ", flush=True)
-        return stringfound
+            return_dict[newkey] = value
+    return return_dict
 
 
-class TimeOut:
-    def __init__(self, seconds=1, error_message='Timeout'):
-        self.seconds = seconds
-        self.error_message = error_message
+def transportpce_api_rpc_request(api_module: str, rpc: str, payload: dict):
+    # pylint: disable=consider-using-f-string
+    url = "{}/operations/{}:{}".format('{}', api_module, rpc)
+    if payload is None:
+        data = None
+    elif RESTCONF_VERSION == 'draft-bierman02':
+        data = prepend_dict_keys({'input': payload}, api_module + ':')
+    else:
+        data = {'input': payload}
+    response = post_request(url, data)
+    if response.status_code == requests.codes.no_content:
+        return_output = None
+    else:
+        res = response.json()
+        return_key = {'rfc8040': api_module + ':output',
+                      'draft-bierman02': 'output'}
+        if response.status_code == requests.codes.internal_server_error:
+            return_output = res
+        else:
+            return_output = res[return_key[RESTCONF_VERSION]]
+    return {'status_code': response.status_code,
+            'output': return_output}
 
-    def handle_timeout(self, signum, frame):
-        raise TimeoutError(self.error_message)
+#
+# simulators datastore operations
+#
 
-    def __enter__(self):
-        signal.signal(signal.SIGALRM, self.handle_timeout)
-        signal.alarm(self.seconds)
 
-    def __exit__(self, type, value, traceback):
-        # pylint: disable=W0622
-        signal.alarm(0)
+def sims_update_cp_port(sim: tuple, circuitpack: str, port: str, payload: dict):
+    if SIMS_TYPE == 'lightynode':
+        return sims_update_cp_port_ntcf(sim, circuitpack, payload)
+    if SIMS_TYPE == 'honeynode':
+        return sims_update_cp_port_rest(sim, circuitpack, port, payload)
+    return False
+
+
+def sims_update_cp_port_rest(sim: tuple, circuitpack: str, port: str, payload: dict):
+    # pylint: disable=consider-using-f-string
+    url = "{}/config/org-openroadm-device:org-openroadm-device/circuit-packs/{}/ports/{}".format(
+        SIMS[sim]['restconf_baseurl'],
+        urllib.parse.quote(circuitpack, safe=''),
+        urllib.parse.quote(port, safe=''))
+    body = {"ports": [payload]}
+    response = requests.request("PUT",
+                                url,
+                                data=json.dumps(body),
+                                headers=TYPE_APPLICATION_JSON,
+                                auth=(ODL_LOGIN, ODL_PWD),
+                                timeout=REQUEST_TIMEOUT)
+    return response.status_code == requests.codes.ok
+
+
+def sims_update_cp_port_ntcf(sim: tuple, circuitpack: str, payload: dict):
+    body = {"circuit-packs": {"circuit-pack-name": circuitpack, "ports": payload}}
+    xml_body = '<config><org-openroadm-device xmlns="http://org/openroadm/device">'
+    xml_body += dict2xml(body, indent="  ")
+    xml_body += '</org-openroadm-device></config>'
+    with connect_ssh(host='127.0.0.1',
+                     port=int(SIMS[sim]['port']),
+                     username=NODES_LOGIN,
+                     password=NODES_PWD) as session:
+        mgr = Manager(session, timeout=120)
+        mgr.edit_config(xml_body, target="candidate", default_operation="merge")
+        return True
+    return False
+
+
+def sims_update_pm_interact(sim: tuple, payload: dict):
+    if SIMS_TYPE == 'lightynode':
+        return sims_update_pm_interact_ntcf(sim, payload)
+    if SIMS_TYPE == 'honeynode':
+        return sims_update_pm_interact_rest(sim, payload)
+    return False
+
+
+def sims_update_pm_interact_rest(sim: tuple, payload: dict):
+    # pylint: disable=consider-using-f-string
+    url = "{}/operations/pm-handling:pm-interact".format(SIMS[sim]['restconf_baseurl'])
+    body = {"input": payload}
+    response = requests.request("POST",
+                                url,
+                                data=json.dumps(body),
+                                headers=TYPE_APPLICATION_JSON,
+                                auth=(ODL_LOGIN, ODL_PWD),
+                                timeout=REQUEST_TIMEOUT)
+    return response.status_code == requests.codes.ok
+
+
+def sims_update_pm_interact_ntcf(sim: tuple, payload: dict):
+    # pylint: disable=line-too-long
+    xml_body = '<pm-interact xmlns="http://honeynode-simulator/pm-handling">'
+    xml_body += dict2xml(payload, indent="  ")
+    xml_body += '</pm-interact>'
+    new_xml = xml_body.replace("<pm-resource-instance>/org-openroadm-device:org-openroadm-device/org-openroadm-device:interface[org-openroadm-device:name='OTS-DEG2-TTP-TXRX']</pm-resource-instance>",
+                               "<pm-resource-instance xmlns:a=\"http://org/openroadm/device\">/a:org-openroadm-device/a:interface[a:name='OTS-DEG2-TTP-TXRX']</pm-resource-instance>")
+    with connect_ssh(host='127.0.0.1',
+                     port=int(SIMS[sim]['port']),
+                     username=NODES_LOGIN,
+                     password=NODES_PWD) as session:
+        mgr = Manager(session, timeout=120)
+        reply = mgr.dispatch(new_xml)
+    if "netconf_client.ncclient.RPCReply" in str(reply):
+        return True
+    return False
diff --git a/tests/transportpce_tests/common/test_utils_rfc8040.py b/tests/transportpce_tests/common/test_utils_rfc8040.py
deleted file mode 100644 (file)
index 785f2a6..0000000
+++ /dev/null
@@ -1,543 +0,0 @@
-#!/usr/bin/env python
-
-##############################################################################
-# Copyright (c) 2021 Orange, Inc. and others.  All rights reserved.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-# pylint: disable=no-member
-
-import json
-import os
-# pylint: disable=wrong-import-order
-import sys
-import re
-import signal
-import subprocess
-import time
-
-import psutil
-import requests
-
-# pylint: disable=import-error
-import simulators
-
-SIMS = simulators.SIMS
-
-HONEYNODE_OK_START_MSG = 'Netconf SSH endpoint started successfully at 0.0.0.0'
-KARAF_OK_START_MSG = re.escape(
-    "Blueprint container for bundle org.opendaylight.netconf.restconf")+".* was successfully created"
-LIGHTY_OK_START_MSG = re.escape("lighty.io and RESTCONF-NETCONF started")
-
-ODL_LOGIN = 'admin'
-ODL_PWD = 'admin'
-NODES_LOGIN = 'admin'
-NODES_PWD = 'admin'
-
-TYPE_APPLICATION_JSON = {'Content-Type': 'application/json', 'Accept': 'application/json'}
-TYPE_APPLICATION_XML = {'Content-Type': 'application/xml', 'Accept': 'application/xml'}
-
-CODE_SHOULD_BE_200 = 'Http status code should be 200'
-CODE_SHOULD_BE_201 = 'Http status code should be 201'
-
-SIM_LOG_DIRECTORY = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'log')
-
-process_list = []
-
-if 'USE_ODL_ALT_RESTCONF_PORT' in os.environ:
-    RESTCONF_PORT = os.environ['USE_ODL_ALT_RESTCONF_PORT']
-else:
-    RESTCONF_PORT = 8181
-
-RESTCONF_PATH_PREFIX = {'rfc8040': '/rests',
-                        'draft-bierman02': '/restconf'}
-if 'USE_ODL_RESTCONF_VERSION' in os.environ:
-    RESTCONF_VERSION = os.environ['USE_ODL_RESTCONF_VERSION']
-    if RESTCONF_VERSION not in RESTCONF_PATH_PREFIX:
-        print('unsupported RESTCONF version ' + RESTCONF_VERSION)
-        sys.exit(3)
-else:
-    RESTCONF_VERSION = 'rfc8040'
-
-RESTCONF_BASE_URL = 'http://localhost:' + str(RESTCONF_PORT) + RESTCONF_PATH_PREFIX[RESTCONF_VERSION]
-
-if 'USE_ODL_ALT_KARAF_INSTALL_DIR' in os.environ:
-    KARAF_INSTALLDIR = os.environ['USE_ODL_ALT_KARAF_INSTALL_DIR']
-else:
-    KARAF_INSTALLDIR = 'karaf'
-
-KARAF_LOG = os.path.join(
-    os.path.dirname(os.path.realpath(__file__)),
-    '..', '..', '..', KARAF_INSTALLDIR, 'target', 'assembly', 'data', 'log', 'karaf.log')
-
-if 'USE_LIGHTY' in os.environ and os.environ['USE_LIGHTY'] == 'True':
-    TPCE_LOG = 'odl-' + str(os.getpid()) + '.log'
-else:
-    TPCE_LOG = KARAF_LOG
-
-#
-# Basic HTTP operations
-#
-
-
-def get_request(url):
-    return requests.request(
-        'GET', url.format(RESTCONF_BASE_URL),
-        headers=TYPE_APPLICATION_JSON,
-        auth=(ODL_LOGIN, ODL_PWD))
-
-
-def put_request(url, data):
-    return requests.request(
-        'PUT', url.format(RESTCONF_BASE_URL),
-        data=json.dumps(data),
-        headers=TYPE_APPLICATION_JSON,
-        auth=(ODL_LOGIN, ODL_PWD))
-
-
-def delete_request(url):
-    return requests.request(
-        'DELETE', url.format(RESTCONF_BASE_URL),
-        headers=TYPE_APPLICATION_JSON,
-        auth=(ODL_LOGIN, ODL_PWD))
-
-
-def post_request(url, data):
-    if data:
-        print(json.dumps(data))
-        return requests.request(
-            "POST", url.format(RESTCONF_BASE_URL),
-            data=json.dumps(data),
-            headers=TYPE_APPLICATION_JSON,
-            auth=(ODL_LOGIN, ODL_PWD))
-    return requests.request(
-        "POST", url.format(RESTCONF_BASE_URL),
-        headers=TYPE_APPLICATION_JSON,
-        auth=(ODL_LOGIN, ODL_PWD))
-
-#
-# Process management
-#
-
-
-def start_sims(sims_list):
-    for sim in sims_list:
-        print('starting simulator ' + sim[0] + ' in OpenROADM device version ' + sim[1] + '...')
-        log_file = os.path.join(SIM_LOG_DIRECTORY, SIMS[sim]['logfile'])
-        process = start_honeynode(log_file, sim)
-        if wait_until_log_contains(log_file, HONEYNODE_OK_START_MSG, 100):
-            print('simulator for ' + sim[0] + ' started')
-        else:
-            print('simulator for ' + sim[0] + ' failed to start')
-            shutdown_process(process)
-            for pid in process_list:
-                shutdown_process(pid)
-            sys.exit(3)
-        process_list.append(process)
-    return process_list
-
-
-def start_tpce():
-    print('starting OpenDaylight...')
-    if 'USE_LIGHTY' in os.environ and os.environ['USE_LIGHTY'] == 'True':
-        process = start_lighty()
-        start_msg = LIGHTY_OK_START_MSG
-    else:
-        process = start_karaf()
-        start_msg = KARAF_OK_START_MSG
-    if wait_until_log_contains(TPCE_LOG, start_msg, time_to_wait=300):
-        print('OpenDaylight started !')
-    else:
-        print('OpenDaylight failed to start !')
-        shutdown_process(process)
-        for pid in process_list:
-            shutdown_process(pid)
-        sys.exit(1)
-    process_list.append(process)
-    return process_list
-
-
-def start_karaf():
-    print('starting KARAF TransportPCE build...')
-    executable = os.path.join(
-        os.path.dirname(os.path.realpath(__file__)),
-        '..', '..', '..', KARAF_INSTALLDIR, 'target', 'assembly', 'bin', 'karaf')
-    with open('odl.log', 'w', encoding='utf-8') as outfile:
-        return subprocess.Popen(
-            ['sh', executable, 'server'], stdout=outfile, stderr=outfile, stdin=None)
-
-
-def start_lighty():
-    print('starting LIGHTY.IO TransportPCE build...')
-    executable = os.path.join(
-        os.path.dirname(os.path.realpath(__file__)),
-        '..', '..', '..', 'lighty', 'target', 'tpce',
-        'clean-start-controller.sh')
-    with open(TPCE_LOG, 'w', encoding='utf-8') as outfile:
-        return subprocess.Popen(
-            ['sh', executable], stdout=outfile, stderr=outfile, stdin=None)
-
-
-def install_karaf_feature(feature_name: str):
-    print('installing feature ' + feature_name)
-    executable = os.path.join(
-        os.path.dirname(os.path.realpath(__file__)),
-        '..', '..', '..', KARAF_INSTALLDIR, 'target', 'assembly', 'bin', 'client')
-    return subprocess.run([executable],
-                          input='feature:install ' + feature_name + '\n feature:list | grep '
-                          + feature_name + ' \n logout \n',
-                          universal_newlines=True, check=False)
-
-
-def shutdown_process(process):
-    if process is not None:
-        for child in psutil.Process(process.pid).children():
-            child.send_signal(signal.SIGINT)
-            child.wait()
-        process.send_signal(signal.SIGINT)
-
-
-def start_honeynode(log_file: str, sim):
-    executable = os.path.join(os.path.dirname(os.path.realpath(__file__)),
-                              '..', '..', 'honeynode', sim[1], 'honeynode-simulator', 'honeycomb-tpce')
-    sample_directory = os.path.join(os.path.dirname(os.path.realpath(__file__)),
-                                    '..', '..', 'sample_configs', 'openroadm', sim[1])
-    if os.path.isfile(executable):
-        with open(log_file, 'w', encoding='utf-8') as outfile:
-            return subprocess.Popen(
-                [executable, SIMS[sim]['port'], os.path.join(sample_directory, SIMS[sim]['configfile'])],
-                stdout=outfile, stderr=outfile)
-    return None
-
-
-def wait_until_log_contains(log_file, regexp, time_to_wait=60):
-    # pylint: disable=lost-exception
-    # pylint: disable=consider-using-with
-    stringfound = False
-    filefound = False
-    line = None
-    try:
-        with TimeOut(seconds=time_to_wait):
-            while not os.path.exists(log_file):
-                time.sleep(0.2)
-            filelogs = open(log_file, 'r', encoding='utf-8')
-            filelogs.seek(0, 2)
-            filefound = True
-            print("Searching for pattern '" + regexp + "' in " + os.path.basename(log_file), end='... ', flush=True)
-            compiled_regexp = re.compile(regexp)
-            while True:
-                line = filelogs.readline()
-                if compiled_regexp.search(line):
-                    print('Pattern found!', end=' ')
-                    stringfound = True
-                    break
-                if not line:
-                    time.sleep(0.1)
-    except TimeoutError:
-        print('Pattern not found after ' + str(time_to_wait), end=' seconds! ', flush=True)
-    except PermissionError:
-        print('Permission Error when trying to access the log file', end=' ... ', flush=True)
-    finally:
-        if filefound:
-            filelogs.close()
-        else:
-            print('log file does not exist or is not accessible... ', flush=True)
-        return stringfound
-
-
-class TimeOut:
-    def __init__(self, seconds=1, error_message='Timeout'):
-        self.seconds = seconds
-        self.error_message = error_message
-
-    def handle_timeout(self, signum, frame):
-        raise TimeoutError(self.error_message)
-
-    def __enter__(self):
-        signal.signal(signal.SIGALRM, self.handle_timeout)
-        signal.alarm(self.seconds)
-
-    def __exit__(self, type, value, traceback):
-        # pylint: disable=W0622
-        signal.alarm(0)
-
-#
-# Basic NetCONF device operations
-#
-
-
-def mount_device(node: str, sim: str):
-    url = {'rfc8040': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}',
-           'draft-bierman02': '{}/config/network-topology:network-topology/topology/topology-netconf/node/{}'}
-    body = {'node': [{
-        'node-id': node,
-        'netconf-node-topology:username': NODES_LOGIN,
-        'netconf-node-topology:password': NODES_PWD,
-        'netconf-node-topology:host': '127.0.0.1',
-        'netconf-node-topology:port': SIMS[sim]['port'],
-        'netconf-node-topology:tcp-only': 'false',
-        'netconf-node-topology:pass-through': {}}]}
-    response = put_request(url[RESTCONF_VERSION].format('{}', node), body)
-    if wait_until_log_contains(TPCE_LOG, re.escape('Triggering notification stream NETCONF for node ' + node), 180):
-        print('Node ' + node + ' correctly added to tpce topology', end='... ', flush=True)
-    else:
-        print('Node ' + node + ' still not added to tpce topology', end='... ', flush=True)
-        if response.status_code == requests.codes.ok:
-            print('It was probably loaded at start-up', end='... ', flush=True)
-        # TODO an else-clause to abort test would probably be nice here
-    return response
-
-
-def unmount_device(node: str):
-    url = {'rfc8040': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}',
-           'draft-bierman02': '{}/config/network-topology:network-topology/topology/topology-netconf/node/{}'}
-    response = delete_request(url[RESTCONF_VERSION].format('{}', node))
-    if wait_until_log_contains(TPCE_LOG, re.escape("onDeviceDisConnected: " + node), 180):
-        print('Node ' + node + ' correctly deleted from tpce topology', end='... ', flush=True)
-    else:
-        print('Node ' + node + ' still not deleted from tpce topology', end='... ', flush=True)
-    return response
-
-
-def check_device_connection(node: str):
-    url = {'rfc8040': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}?content=nonconfig',
-           'draft-bierman02': '{}/operational/network-topology:network-topology/topology/topology-netconf/node/{}'}
-    response = get_request(url[RESTCONF_VERSION].format('{}', node))
-    res = response.json()
-    return_key = {'rfc8040': 'network-topology:node',
-                  'draft-bierman02': 'node'}
-    if return_key[RESTCONF_VERSION] in res.keys():
-        connection_status = res[return_key[RESTCONF_VERSION]][0]['netconf-node-topology:connection-status']
-    else:
-        connection_status = res['errors']['error'][0]
-    return {'status_code': response.status_code,
-            'connection-status': connection_status}
-
-
-def check_node_attribute_request(node: str, attribute: str, attribute_value: str):
-    # pylint: disable=line-too-long
-    url = {'rfc8040': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}/yang-ext:mount/org-openroadm-device:org-openroadm-device/{}={}?content=nonconfig',  # nopep8
-           'draft-bierman02': '{}/operational/network-topology:network-topology/topology/topology-netconf/node/{}/yang-ext:mount/org-openroadm-device:org-openroadm-device/{}/{}'}  # nopep8
-    response = get_request(url[RESTCONF_VERSION].format('{}', node, attribute, attribute_value))
-    res = response.json()
-    return_key = {'rfc8040': 'org-openroadm-device:' + attribute,
-                  'draft-bierman02': attribute}
-    if return_key[RESTCONF_VERSION] in res.keys():
-        response_attribute = res[return_key[RESTCONF_VERSION]]
-    else:
-        response_attribute = res['errors']['error'][0]
-    return {'status_code': response.status_code,
-            attribute: response_attribute}
-
-
-def check_node_attribute2_request(node: str, attribute: str, attribute_value: str, attribute2: str):
-    # pylint: disable=line-too-long
-    url = {'rfc8040': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}/yang-ext:mount/org-openroadm-device:org-openroadm-device/{}={}/{}?content=config',  # nopep8
-           'draft-bierman02': '{}/config/network-topology:network-topology/topology/topology-netconf/node/{}/yang-ext:mount/org-openroadm-device:org-openroadm-device/{}/{}/{}'}  # nopep8
-    response = get_request(url[RESTCONF_VERSION].format('{}', node, attribute, attribute_value, attribute2))
-    res = response.json()
-    if attribute2 in res.keys():
-        response_attribute = res[attribute2]
-    else:
-        response_attribute = res['errors']['error'][0]
-    return {'status_code': response.status_code,
-            attribute2: response_attribute}
-
-
-def del_node_attribute_request(node: str, attribute: str, attribute_value: str):
-    # pylint: disable=line-too-long
-    url = {'rfc8040': '{}/data/network-topology:network-topology/topology=topology-netconf/node={}/yang-ext:mount/org-openroadm-device:org-openroadm-device/{}={}',  # nopep8
-           'draft-bierman02': '{}/config/network-topology:network-topology/topology/topology-netconf/node/{}/yang-ext:mount/org-openroadm-device:org-openroadm-device/{}/{}'}  # nopep8
-    response = delete_request(url[RESTCONF_VERSION].format('{}', node, attribute, attribute_value))
-    return response
-
-#
-# Portmapping operations
-#
-
-
-def get_portmapping(node: str):
-    url = {'rfc8040': '{}/data/transportpce-portmapping:network/nodes={}',
-           'draft-bierman02': '{}/config/transportpce-portmapping:network/nodes/{}'}
-    response = get_request(url[RESTCONF_VERSION].format('{}', node))
-    res = response.json()
-    return_key = {'rfc8040': 'transportpce-portmapping:nodes',
-                  'draft-bierman02': 'nodes'}
-    nodes = res[return_key[RESTCONF_VERSION]]
-    return {'status_code': response.status_code,
-            'nodes': nodes}
-
-
-def get_portmapping_node_info(node: str):
-    url = {'rfc8040': '{}/data/transportpce-portmapping:network/nodes={}/node-info',
-           'draft-bierman02': '{}/config/transportpce-portmapping:network/nodes/{}/node-info'}
-    response = get_request(url[RESTCONF_VERSION].format('{}', node))
-    res = response.json()
-    return_key = {'rfc8040': 'transportpce-portmapping:node-info',
-                  'draft-bierman02': 'node-info'}
-    if return_key[RESTCONF_VERSION] in res.keys():
-        node_info = res[return_key[RESTCONF_VERSION]]
-    else:
-        node_info = res['errors']['error'][0]
-    return {'status_code': response.status_code,
-            'node-info': node_info}
-
-
-def portmapping_request(node: str, mapping: str):
-    url = {'rfc8040': '{}/data/transportpce-portmapping:network/nodes={}/mapping={}',
-           'draft-bierman02': '{}/config/transportpce-portmapping:network/nodes/{}/mapping/{}'}
-    response = get_request(url[RESTCONF_VERSION].format('{}', node, mapping))
-    res = response.json()
-    return_key = {'rfc8040': 'transportpce-portmapping:mapping',
-                  'draft-bierman02': 'mapping'}
-    mapping = res[return_key[RESTCONF_VERSION]]
-    return {'status_code': response.status_code,
-            'mapping': mapping}
-
-
-def portmapping_switching_pool_request(node: str, switching_pool: str):
-    url = {'rfc8040': '{}/data/transportpce-portmapping:network/nodes={}/switching-pool-lcp={}',
-           'draft-bierman02': '{}/config/transportpce-portmapping:network/nodes/{}/switching-pool-lcp/{}'}
-    response = get_request(url[RESTCONF_VERSION].format('{}', node, switching_pool))
-    res = response.json()
-    return_key = {'rfc8040': 'transportpce-portmapping:switching-pool-lcp',
-                  'draft-bierman02': 'switching-pool-lcp'}
-    switching_pool = res[return_key[RESTCONF_VERSION]]
-    return {'status_code': response.status_code,
-            'switching_pool': switching_pool}
-
-
-def portmapping_mc_capa_request(node: str, mc_capa: str):
-    url = {'rfc8040': '{}/data/transportpce-portmapping:network/nodes={}/mc-capabilities={}',
-           'draft-bierman02': '{}/config/transportpce-portmapping:network/nodes/{}/mc-capabilities/{}'}
-    response = get_request(url[RESTCONF_VERSION].format('{}', node, mc_capa))
-    res = response.json()
-    return_key = {'rfc8040': 'transportpce-portmapping:mc-capabilities',
-                  'draft-bierman02': 'mc-capabilities'}
-    capabilities = res[return_key[RESTCONF_VERSION]]
-    return {'status_code': response.status_code,
-            'mc-capabilities': capabilities}
-
-#
-# Topology operations
-#
-
-
-def get_ietf_network_request(network: str, content: str):
-    url = {'rfc8040': '{}/data/ietf-network:networks/network={}?content={}',
-           'draft-bierman02': '{}/{}/ietf-network:networks/network/{}'}
-    if RESTCONF_VERSION == 'rfc8040':
-        format_args = ('{}', network, content)
-    elif content == 'config':
-        format_args = ('{}', content, network)
-    else:
-        format_args = ('{}', 'operational', network)
-    response = get_request(url[RESTCONF_VERSION].format(*format_args))
-    res = response.json()
-    return_key = {'rfc8040': 'ietf-network:network',
-                  'draft-bierman02': 'network'}
-    networks = res[return_key[RESTCONF_VERSION]]
-    return {'status_code': response.status_code,
-            'network': networks}
-
-
-def get_ietf_network_link_request(network: str, link: str, content: str):
-    url = {'rfc8040': '{}/data/ietf-network:networks/network={}/ietf-network-topology:link={}?content={}',
-           'draft-bierman02': '{}/{}/ietf-network:networks/network/{}/ietf-network-topology:link/{}'}
-    if RESTCONF_VERSION == 'rfc8040':
-        format_args = ('{}', network, link, content)
-    elif content == 'config':
-        format_args = ('{}', content, network, link)
-    else:
-        format_args = ('{}', 'operational', network, link)
-    response = get_request(url[RESTCONF_VERSION].format(*format_args))
-    res = response.json()
-    return_key = {'rfc8040': 'ietf-network-topology:link',
-                  'draft-bierman02': 'ietf-network-topology:link'}
-    link = res[return_key[RESTCONF_VERSION]][0]
-    return {'status_code': response.status_code,
-            'link': link}
-
-
-def del_ietf_network_link_request(network: str, link: str, content: str):
-    url = {'rfc8040': '{}/data/ietf-network:networks/network={}/ietf-network-topology:link={}?content={}',
-           'draft-bierman02': '{}/{}/ietf-network:networks/network/{}/ietf-network-topology:link/{}'}
-    if RESTCONF_VERSION == 'rfc8040':
-        format_args = ('{}', network, link, content)
-    elif content == 'config':
-        format_args = ('{}', content, network, link)
-    else:
-        format_args = ('{}', 'operational', network, link)
-    response = delete_request(url[RESTCONF_VERSION].format(*format_args))
-    return response
-
-
-def add_oms_attr_request(link: str, oms_attr: str):
-    url = {'rfc8040': '{}/data/ietf-network:networks/network={}/ietf-network-topology:link={}',
-           'draft-bierman02': '{}/config/ietf-network:networks/network/{}/ietf-network-topology:link/{}'}
-    url2 = url[RESTCONF_VERSION] + '/org-openroadm-network-topology:OMS-attributes/span'
-    network = 'openroadm-topology'
-    response = put_request(url2.format('{}', network, link), oms_attr)
-    return response
-
-
-def del_oms_attr_request(link: str,):
-    url = {'rfc8040': '{}/data/ietf-network:networks/network={}/ietf-network-topology:link={}',
-           'draft-bierman02': '{}/config/ietf-network:networks/network/{}/ietf-network-topology:link/{}'}
-    url2 = url[RESTCONF_VERSION] + '/org-openroadm-network-topology:OMS-attributes/span'
-    network = 'openroadm-topology'
-    response = delete_request(url2.format('{}', network, link))
-    return response
-
-
-def del_ietf_network_node_request(network: str, node: str, content: str):
-    url = {'rfc8040': '{}/data/ietf-network:networks/network={}/node={}?content={}',
-           'draft-bierman02': '{}/{}/ietf-network:networks/network/{}/node/{}'}
-    if RESTCONF_VERSION == 'rfc8040':
-        format_args = ('{}', network, node, content)
-    elif content == 'config':
-        format_args = ('{}', content, network, node)
-    else:
-        format_args = ('{}', 'operational', network, node)
-    response = delete_request(url[RESTCONF_VERSION].format(*format_args))
-    return response
-
-#
-# TransportPCE internal API RPCs
-#
-
-
-def prepend_dict_keys(input_dict: dict, prefix: str):
-    return_dict = {}
-    for key, value in input_dict.items():
-        newkey = prefix + key
-        if isinstance(value, dict):
-            return_dict[newkey] = prepend_dict_keys(value, prefix)
-            # TODO: perhaps some recursion depth limit or another solution has to be considered here
-            # even if recursion depth is given by the input_dict argument
-            # direct (self-)recursive functions may carry unwanted side-effects such as ressource consumptions
-        else:
-            return_dict[newkey] = value
-    return return_dict
-
-
-def transportpce_api_rpc_request(api_module: str, rpc: str, payload: dict):
-    # pylint: disable=consider-using-f-string
-    url = "{}/operations/{}:{}".format('{}', api_module, rpc)
-    if payload is None:
-        data = None
-    elif RESTCONF_VERSION == 'draft-bierman02':
-        data = prepend_dict_keys({'input': payload}, api_module + ':')
-    else:
-        data = {'input': payload}
-    response = post_request(url, data)
-    res = response.json()
-    return_key = {'rfc8040': api_module + ':output',
-                  'draft-bierman02': 'output'}
-    return_output = res[return_key[RESTCONF_VERSION]]
-    return {'status_code': response.status_code,
-            'output': return_output}
index 9f735f86dfe57df8868486ab0a0359ba230a4a64..bb28a3cf074b2d1dcc06b69ae2431c58c14592ed 100644 (file)
@@ -10,7 +10,6 @@
 
 # pylint: disable=no-member
 # pylint: disable=too-many-public-methods
-import json
 import unittest
 import time
 import requests
@@ -25,7 +24,7 @@ import test_utils  # nopep8
 class TransportPCEFulltesting(unittest.TestCase):
 
     processes = None
-    cr_serv_sample_data = {"input": {
+    cr_serv_input_data = {
         "sdnc-request-header": {
             "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
             "rpc-action": "service-create",
@@ -40,34 +39,8 @@ class TransportPCEFulltesting(unittest.TestCase):
             "node-id": "XPDRA01",
             "service-format": "Ethernet",
             "clli": "SNJSCAMCJP8",
-                    "tx-direction": [{
-                        "port": {
-                            "port-type": "fixed",
-                            "port-rack": "000000.00",
-                            "port-shelf": "Chassis#1"
-                        },
-                        "lgx": {
-                            "lgx-device-name": "Some lgx-device-name",
-                            "lgx-port-name": "Some lgx-port-name",
-                            "lgx-port-rack": "000000.00",
-                            "lgx-port-shelf": "00"
-                        },
-                        "index": 0
-                    }],
-            "rx-direction": [{
-                "port": {
-                    "port-type": "fixed",
-                    "port-rack": "000000.00",
-                    "port-shelf": "Chassis#1"
-                },
-                "lgx": {
-                    "lgx-device-name": "Some lgx-device-name",
-                    "lgx-port-name": "Some lgx-port-name",
-                    "lgx-port-rack": "000000.00",
-                    "lgx-port-shelf": "00"
-                },
-                "index": 0
-            }],
+            "tx-direction": [{"index": 0}],
+            "rx-direction": [{"index": 0}],
             "optic-type": "gray"
         },
         "service-z-end": {
@@ -75,39 +48,23 @@ class TransportPCEFulltesting(unittest.TestCase):
             "node-id": "XPDR-C1",
             "service-format": "Ethernet",
             "clli": "SNJSCAMCJT4",
-                    "tx-direction": [{
-                        "port": {
-                            "port-type": "fixed",
-                            "port-rack": "000000.00",
-                            "port-shelf": "Chassis#1"
-                        },
-                        "lgx": {
-                            "lgx-device-name": "Some lgx-device-name",
-                            "lgx-port-name": "Some lgx-port-name",
-                            "lgx-port-rack": "000000.00",
-                            "lgx-port-shelf": "00"
-                        },
-                        "index": 0
-                    }],
-            "rx-direction": [{
-                "port": {
-                    "port-type": "fixed",
-                    "port-rack": "000000.00",
-                    "port-shelf": "Chassis#1"
-                },
-                "lgx": {
-                    "lgx-device-name": "Some lgx-device-name",
-                    "lgx-port-name": "Some lgx-port-name",
-                    "lgx-port-rack": "000000.00",
-                    "lgx-port-shelf": "00"
-                },
-                "index": 0
-            }],
+            "tx-direction": [{"index": 0}],
+            "rx-direction": [{"index": 0}],
             "optic-type": "gray"
         },
         "due-date": "2016-11-28T00:00:01Z",
         "operator-contact": "pw1234"
     }
+
+    del_serv_input_data = {
+        "sdnc-request-header": {
+            "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
+            "rpc-action": "service-delete",
+            "request-system-id": "appname",
+            "notification-url": "http://localhost:8585/NotificationServer/notify"},
+        "service-delete-req-info": {
+            "service-name": "TBD",
+            "tail-retention": "no"}
     }
 
     WAITING = 25  # nominal value is 300
@@ -129,7 +86,7 @@ class TransportPCEFulltesting(unittest.TestCase):
         for process in cls.processes:
             test_utils.shutdown_process(process)
         print("all processes killed")
-        time.sleep(10)
+        time.sleep(3)
 
     def setUp(self):  # instruction executed before each test method
         # pylint: disable=consider-using-f-string
@@ -137,51 +94,55 @@ class TransportPCEFulltesting(unittest.TestCase):
 
     def test_01_connect_xpdrA(self):
         response = test_utils.mount_device("XPDRA01", ('xpdra', self.NODE_VERSION_121))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+        self.assertEqual(response.status_code,
+                         requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_02_connect_xpdrC(self):
         response = test_utils.mount_device("XPDR-C1", ('xpdrc', self.NODE_VERSION_71))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+        self.assertEqual(response.status_code,
+                         requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_03_connect_rdmA(self):
         response = test_utils.mount_device("ROADM-A1", ('roadma', self.NODE_VERSION_221))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+        self.assertEqual(response.status_code,
+                         requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_04_connect_rdmC(self):
         response = test_utils.mount_device("ROADM-C1", ('roadmc', self.NODE_VERSION_221))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
-
-    def test_05_connect_xprdA_N1_to_roadmA_PP1(self):
-        response = test_utils.connect_xpdr_to_rdm_request("XPDRA01", "1", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully', res["output"]["result"])
-        time.sleep(2)
+        self.assertEqual(response.status_code,
+                         requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
-    def test_06_connect_roadmA_PP1_to_xpdrA_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("XPDRA01", "1", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully', res["output"]["result"])
-        time.sleep(2)
+    def test_05_connect_xpdrA_N1_to_roadmA_PP1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDRA01', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
 
-    def test_07_connect_xprdC_N1_to_roadmC_PP1(self):
-        response = test_utils.connect_xpdr_to_rdm_request("XPDR-C1", "1", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully', res["output"]["result"])
-        time.sleep(2)
+    def test_06_connect_roadmA_PP1_to_xpdrA_N1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDRA01', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
+
+    def test_07_connect_xpdrC_N1_to_roadmC_PP1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDR-C1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
 
     def test_08_connect_roadmC_PP1_to_xpdrC_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("XPDR-C1", "1", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully', res["output"]["result"])
-        time.sleep(2)
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDR-C1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
 
     def test_09_add_omsAttributes_ROADMA_ROADMC(self):
         # Config ROADMA-ROADMC oms-attributes
@@ -195,7 +156,8 @@ class TransportPCEFulltesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request("ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request(
+            "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
 
     def test_10_add_omsAttributes_ROADMC_ROADMA(self):
@@ -210,53 +172,46 @@ class TransportPCEFulltesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request("ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request(
+            "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
 
 # test service-create for Eth service from xpdr to xpdr
     def test_11_create_eth_service1(self):
-        self.cr_serv_sample_data["input"]["service-name"] = "service1"
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_12_get_eth_service1(self):
-        response = test_utils.get_service_list_request("services/service1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service1')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'service')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_attr_request(
+            "services", "service1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['connection-type'], 'service')
+        self.assertEqual(response['services'][0]['service-name'], 'service1')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        time.sleep(1)
 
     def test_13_change_status_line_port_xpdra(self):
-        url = "{}/config/org-openroadm-device:org-openroadm-device/circuit-packs/1%2F0%2F1-PLUG-NET/ports/1"
-        body = {"ports": [{
+        self.assertTrue(test_utils.sims_update_cp_port(('xpdra', self.NODE_VERSION_121), '1/0/1-PLUG-NET', '1',
+                                                       {
             "port-name": "1",
             "logical-connection-point": "XPDR1-NETWORK1",
             "port-type": "CFP2",
             "circuit-id": "XPDRA-NETWORK",
             "administrative-state": "outOfService",
-            "port-qual": "xpdr-network"}]}
-        response = requests.request("PUT", url.format("http://127.0.0.1:8130/restconf"),
-                                    data=json.dumps(body), headers=test_utils.TYPE_APPLICATION_JSON,
-                                    auth=(test_utils.ODL_LOGIN, test_utils.ODL_PWD))
-        self.assertEqual(response.status_code, requests.codes.ok)
+            "port-qual": "xpdr-network"
+        }))
         time.sleep(2)
 
     def test_14_check_update_portmapping(self):
-        response = test_utils.portmapping_request("XPDRA01")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        mapping_list = res['nodes'][0]['mapping']
+        response = test_utils.get_portmapping_node_attr("XPDRA01", None, None)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        mapping_list = response['nodes'][0]['mapping']
         for mapping in mapping_list:
             if mapping['logical-connection-point'] == 'XPDR1-NETWORK1':
                 self.assertEqual(mapping['port-oper-state'], 'OutOfService',
@@ -271,11 +226,9 @@ class TransportPCEFulltesting(unittest.TestCase):
         time.sleep(1)
 
     def test_15_check_update_openroadm_topo(self):
-        url = test_utils.URL_CONFIG_ORDM_TOPO
-        response = test_utils.get_request(url)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        node_list = res['network'][0]['node']
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        node_list = response['network'][0]['node']
         nb_updated_tp = 0
         for node in node_list:
             self.assertEqual(node['org-openroadm-common-network:operational-state'], 'inService')
@@ -291,7 +244,7 @@ class TransportPCEFulltesting(unittest.TestCase):
                     self.assertEqual(tp['org-openroadm-common-network:administrative-state'], 'inService')
         self.assertEqual(nb_updated_tp, 1, "Only one termination-point should have been modified")
 
-        link_list = res['network'][0]['ietf-network-topology:link']
+        link_list = response['network'][0]['ietf-network-topology:link']
         updated_links = ['XPDRA01-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP1-TXRX',
                          'ROADM-A1-SRG1-SRG1-PP1-TXRXtoXPDRA01-XPDR1-XPDR1-NETWORK1']
         nb_updated_link = 0
@@ -307,33 +260,28 @@ class TransportPCEFulltesting(unittest.TestCase):
         time.sleep(1)
 
     def test_16_check_update_service1(self):
-        response = test_utils.get_service_list_request("services/service1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(res['services'][0]['operational-state'], 'outOfService')
-        self.assertEqual(res['services'][0]['administrative-state'], 'outOfService')
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['operational-state'], 'outOfService')
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
         time.sleep(1)
 
     def test_17_restore_status_line_port_xpdra(self):
-        url = "{}/config/org-openroadm-device:org-openroadm-device/circuit-packs/1%2F0%2F1-PLUG-NET/ports/1"
-        body = {"ports": [{
+        self.assertTrue(test_utils.sims_update_cp_port(('xpdra', self.NODE_VERSION_121), '1/0/1-PLUG-NET', '1',
+                                                       {
             "port-name": "1",
             "logical-connection-point": "XPDR1-NETWORK1",
             "port-type": "CFP2",
             "circuit-id": "XPDRA-NETWORK",
             "administrative-state": "inService",
-            "port-qual": "xpdr-network"}]}
-        response = requests.request("PUT", url.format("http://127.0.0.1:8130/restconf"),
-                                    data=json.dumps(body), headers=test_utils.TYPE_APPLICATION_JSON,
-                                    auth=(test_utils.ODL_LOGIN, test_utils.ODL_PWD))
-        self.assertEqual(response.status_code, requests.codes.ok)
+            "port-qual": "xpdr-network"
+        }))
         time.sleep(2)
 
     def test_18_check_update_portmapping_ok(self):
-        response = test_utils.portmapping_request("XPDRA01")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        mapping_list = res['nodes'][0]['mapping']
+        response = test_utils.get_portmapping_node_attr("XPDRA01", None, None)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        mapping_list = response['nodes'][0]['mapping']
         for mapping in mapping_list:
             self.assertEqual(mapping['port-oper-state'], 'InService',
                              "Operational State should be 'InService'")
@@ -342,11 +290,9 @@ class TransportPCEFulltesting(unittest.TestCase):
         time.sleep(1)
 
     def test_19_check_update_openroadm_topo_ok(self):
-        url = test_utils.URL_CONFIG_ORDM_TOPO
-        response = test_utils.get_request(url)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        node_list = res['network'][0]['node']
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        node_list = response['network'][0]['node']
         for node in node_list:
             self.assertEqual(node['org-openroadm-common-network:operational-state'], 'inService')
             self.assertEqual(node['org-openroadm-common-network:administrative-state'], 'inService')
@@ -355,7 +301,7 @@ class TransportPCEFulltesting(unittest.TestCase):
                 self.assertEqual(tp['org-openroadm-common-network:operational-state'], 'inService')
                 self.assertEqual(tp['org-openroadm-common-network:administrative-state'], 'inService')
 
-        link_list = res['network'][0]['ietf-network-topology:link']
+        link_list = response['network'][0]['ietf-network-topology:link']
         for link in link_list:
             self.assertEqual(link['org-openroadm-common-network:operational-state'], 'inService')
             self.assertEqual(link['org-openroadm-common-network:administrative-state'], 'inService')
@@ -365,25 +311,21 @@ class TransportPCEFulltesting(unittest.TestCase):
         self.test_12_get_eth_service1()
 
     def test_21_change_status_port_roadma_srg(self):
-        url = "{}/config/org-openroadm-device:org-openroadm-device/circuit-packs/3%2F0/ports/C1"
-        body = {"ports": [{
+        self.assertTrue(test_utils.sims_update_cp_port(('roadma', self.NODE_VERSION_221), '3/0', 'C1',
+                                                       {
             "port-name": "C1",
             "logical-connection-point": "SRG1-PP1",
             "port-type": "client",
             "circuit-id": "SRG1",
             "administrative-state": "outOfService",
-            "port-qual": "roadm-external"}]}
-        response = requests.request("PUT", url.format("http://127.0.0.1:8141/restconf"),
-                                    data=json.dumps(body), headers=test_utils.TYPE_APPLICATION_JSON,
-                                    auth=(test_utils.ODL_LOGIN, test_utils.ODL_PWD))
-        self.assertEqual(response.status_code, requests.codes.ok)
+            "port-qual": "roadm-external"
+        }))
         time.sleep(2)
 
     def test_22_check_update_portmapping(self):
-        response = test_utils.portmapping_request("ROADM-A1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        mapping_list = res['nodes'][0]['mapping']
+        response = test_utils.get_portmapping_node_attr("ROADM-A1", None, None)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        mapping_list = response['nodes'][0]['mapping']
         for mapping in mapping_list:
             if mapping['logical-connection-point'] == 'SRG1-PP1-TXRX':
                 self.assertEqual(mapping['port-oper-state'], 'OutOfService',
@@ -398,11 +340,9 @@ class TransportPCEFulltesting(unittest.TestCase):
         time.sleep(1)
 
     def test_23_check_update_openroadm_topo(self):
-        url = test_utils.URL_CONFIG_ORDM_TOPO
-        response = test_utils.get_request(url)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        node_list = res['network'][0]['node']
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        node_list = response['network'][0]['node']
         nb_updated_tp = 0
         for node in node_list:
             self.assertEqual(node['org-openroadm-common-network:operational-state'], 'inService')
@@ -418,7 +358,7 @@ class TransportPCEFulltesting(unittest.TestCase):
                     self.assertEqual(tp['org-openroadm-common-network:administrative-state'], 'inService')
         self.assertEqual(nb_updated_tp, 1, "Only one termination-point should have been modified")
 
-        link_list = res['network'][0]['ietf-network-topology:link']
+        link_list = response['network'][0]['ietf-network-topology:link']
         updated_links = ['XPDRA01-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP1-TXRX',
                          'ROADM-A1-SRG1-SRG1-PP1-TXRXtoXPDRA01-XPDR1-XPDR1-NETWORK1']
         nb_updated_link = 0
@@ -434,18 +374,15 @@ class TransportPCEFulltesting(unittest.TestCase):
         time.sleep(1)
 
     def test_24_restore_status_port_roadma_srg(self):
-        url = "{}/config/org-openroadm-device:org-openroadm-device/circuit-packs/3%2F0/ports/C1"
-        body = {"ports": [{
+        self.assertTrue(test_utils.sims_update_cp_port(('roadma', self.NODE_VERSION_221), '3/0', 'C1',
+                                                       {
             "port-name": "C1",
             "logical-connection-point": "SRG1-PP1",
             "port-type": "client",
             "circuit-id": "SRG1",
             "administrative-state": "inService",
-            "port-qual": "roadm-external"}]}
-        response = requests.request("PUT", url.format("http://127.0.0.1:8141/restconf"),
-                                    data=json.dumps(body), headers=test_utils.TYPE_APPLICATION_JSON,
-                                    auth=(test_utils.ODL_LOGIN, test_utils.ODL_PWD))
-        self.assertEqual(response.status_code, requests.codes.ok)
+            "port-qual": "roadm-external"
+        }))
         time.sleep(2)
 
     def test_25_check_update_portmapping_ok(self):
@@ -458,25 +395,21 @@ class TransportPCEFulltesting(unittest.TestCase):
         self.test_12_get_eth_service1()
 
     def test_28_change_status_line_port_roadma_deg(self):
-        url = "{}/config/org-openroadm-device:org-openroadm-device/circuit-packs/2%2F0/ports/L1"
-        body = {"ports": [{
+        self.assertTrue(test_utils.sims_update_cp_port(('roadma', self.NODE_VERSION_221), '2/0', 'L1',
+                                                       {
             "port-name": "L1",
             "logical-connection-point": "DEG2-TTP-TXRX",
             "port-type": "LINE",
             "circuit-id": "1",
             "administrative-state": "outOfService",
-            "port-qual": "roadm-external"}]}
-        response = requests.request("PUT", url.format("http://127.0.0.1:8141/restconf"),
-                                    data=json.dumps(body), headers=test_utils.TYPE_APPLICATION_JSON,
-                                    auth=(test_utils.ODL_LOGIN, test_utils.ODL_PWD))
-        self.assertEqual(response.status_code, requests.codes.ok)
+            "port-qual": "roadm-external"
+        }))
         time.sleep(2)
 
     def test_29_check_update_portmapping(self):
-        response = test_utils.portmapping_request("ROADM-A1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        mapping_list = res['nodes'][0]['mapping']
+        response = test_utils.get_portmapping_node_attr("ROADM-A1", None, None)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        mapping_list = response['nodes'][0]['mapping']
         for mapping in mapping_list:
             if mapping['logical-connection-point'] == 'DEG2-TTP-TXRX':
                 self.assertEqual(mapping['port-oper-state'], 'OutOfService',
@@ -491,11 +424,9 @@ class TransportPCEFulltesting(unittest.TestCase):
         time.sleep(1)
 
     def test_30_check_update_openroadm_topo(self):
-        url = test_utils.URL_CONFIG_ORDM_TOPO
-        response = test_utils.get_request(url)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        node_list = res['network'][0]['node']
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        node_list = response['network'][0]['node']
         nb_updated_tp = 0
         for node in node_list:
             self.assertEqual(node['org-openroadm-common-network:operational-state'], 'inService')
@@ -511,7 +442,7 @@ class TransportPCEFulltesting(unittest.TestCase):
                     self.assertEqual(tp['org-openroadm-common-network:administrative-state'], 'inService')
         self.assertEqual(nb_updated_tp, 1, "Only one termination-point should have been modified")
 
-        link_list = res['network'][0]['ietf-network-topology:link']
+        link_list = response['network'][0]['ietf-network-topology:link']
         updated_links = ['ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX',
                          'ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX']
         nb_updated_link = 0
@@ -527,18 +458,15 @@ class TransportPCEFulltesting(unittest.TestCase):
         time.sleep(1)
 
     def test_31_restore_status_line_port_roadma_srg(self):
-        url = "{}/config/org-openroadm-device:org-openroadm-device/circuit-packs/2%2F0/ports/L1"
-        body = {"ports": [{
+        self.assertTrue(test_utils.sims_update_cp_port(('roadma', self.NODE_VERSION_221), '2/0', 'L1',
+                                                       {
             "port-name": "L1",
             "logical-connection-point": "DEG2-TTP-TXRX",
             "port-type": "LINE",
             "circuit-id": "1",
             "administrative-state": "inService",
-            "port-qual": "roadm-external"}]}
-        response = requests.request("PUT", url.format("http://127.0.0.1:8141/restconf"),
-                                    data=json.dumps(body), headers=test_utils.TYPE_APPLICATION_JSON,
-                                    auth=(test_utils.ODL_LOGIN, test_utils.ODL_PWD))
-        self.assertEqual(response.status_code, requests.codes.ok)
+            "port-qual": "roadm-external"
+        }))
         time.sleep(2)
 
     def test_32_check_update_portmapping_ok(self):
@@ -551,23 +479,19 @@ class TransportPCEFulltesting(unittest.TestCase):
         self.test_12_get_eth_service1()
 
     def test_35_change_status_line_port_xpdrc(self):
-        url = "{}/config/org-openroadm-device:org-openroadm-device/circuit-packs/1%2F0%2F1-PLUG-NET/ports/1"
-        body = {"ports": [{
+        self.assertTrue(test_utils.sims_update_cp_port(('xpdrc', self.NODE_VERSION_71), '1/0/1-PLUG-NET', '1',
+                                                       {
             "port-name": "1",
             "port-type": "CFP2",
             "administrative-state": "outOfService",
-            "port-qual": "xpdr-network"}]}
-        response = requests.request("PUT", url.format("http://127.0.0.1:8154/restconf"),
-                                    data=json.dumps(body), headers=test_utils.TYPE_APPLICATION_JSON,
-                                    auth=(test_utils.ODL_LOGIN, test_utils.ODL_PWD))
-        self.assertEqual(response.status_code, requests.codes.ok)
+            "port-qual": "xpdr-network"
+        }))
         time.sleep(2)
 
     def test_36_check_update_portmapping(self):
-        response = test_utils.portmapping_request("XPDR-C1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        mapping_list = res['nodes'][0]['mapping']
+        response = test_utils.get_portmapping_node_attr("XPDR-C1", None, None)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        mapping_list = response['nodes'][0]['mapping']
         for mapping in mapping_list:
             if mapping['logical-connection-point'] == 'XPDR1-NETWORK1':
                 self.assertEqual(mapping['port-oper-state'], 'OutOfService',
@@ -582,11 +506,9 @@ class TransportPCEFulltesting(unittest.TestCase):
         time.sleep(1)
 
     def test_37_check_update_openroadm_topo(self):
-        url = test_utils.URL_CONFIG_ORDM_TOPO
-        response = test_utils.get_request(url)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        node_list = res['network'][0]['node']
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        node_list = response['network'][0]['node']
         nb_updated_tp = 0
         for node in node_list:
             self.assertEqual(node['org-openroadm-common-network:operational-state'], 'inService')
@@ -602,7 +524,7 @@ class TransportPCEFulltesting(unittest.TestCase):
                     self.assertEqual(tp['org-openroadm-common-network:administrative-state'], 'inService')
         self.assertEqual(nb_updated_tp, 1, "Only one termination-point should have been modified")
 
-        link_list = res['network'][0]['ietf-network-topology:link']
+        link_list = response['network'][0]['ietf-network-topology:link']
         updated_links = ['XPDR-C1-XPDR1-XPDR1-NETWORK1toROADM-C1-SRG1-SRG1-PP1-TXRX',
                          'ROADM-C1-SRG1-SRG1-PP1-TXRXtoXPDR-C1-XPDR1-XPDR1-NETWORK1']
         nb_updated_link = 0
@@ -618,16 +540,13 @@ class TransportPCEFulltesting(unittest.TestCase):
         time.sleep(1)
 
     def test_38_restore_status_line_port_xpdrc(self):
-        url = "{}/config/org-openroadm-device:org-openroadm-device/circuit-packs/1%2F0%2F1-PLUG-NET/ports/1"
-        body = {"ports": [{
+        self.assertTrue(test_utils.sims_update_cp_port(('xpdrc', self.NODE_VERSION_71), '1/0/1-PLUG-NET', '1',
+                                                       {
             "port-name": "1",
             "port-type": "CFP2",
             "administrative-state": "inService",
-            "port-qual": "xpdr-network"}]}
-        response = requests.request("PUT", url.format("http://127.0.0.1:8154/restconf"),
-                                    data=json.dumps(body), headers=test_utils.TYPE_APPLICATION_JSON,
-                                    auth=(test_utils.ODL_LOGIN, test_utils.ODL_PWD))
-        self.assertEqual(response.status_code, requests.codes.ok)
+            "port-qual": "xpdr-network"
+        }))
         time.sleep(2)
 
     def test_39_check_update_portmapping_ok(self):
@@ -640,25 +559,21 @@ class TransportPCEFulltesting(unittest.TestCase):
         self.test_12_get_eth_service1()
 
     def test_42_change_status_port_roadma_srg(self):
-        url = "{}/config/org-openroadm-device:org-openroadm-device/circuit-packs/3%2F0/ports/C2"
-        body = {"ports": [{
+        self.assertTrue(test_utils.sims_update_cp_port(('roadma', self.NODE_VERSION_221), '3/0', 'C2',
+                                                       {
             "port-name": "C2",
             "logical-connection-point": "SRG1-PP2",
             "port-type": "client",
             "circuit-id": "SRG1",
             "administrative-state": "outOfService",
-            "port-qual": "roadm-external"}]}
-        response = requests.request("PUT", url.format("http://127.0.0.1:8141/restconf"),
-                                    data=json.dumps(body), headers=test_utils.TYPE_APPLICATION_JSON,
-                                    auth=(test_utils.ODL_LOGIN, test_utils.ODL_PWD))
-        self.assertEqual(response.status_code, requests.codes.ok)
+            "port-qual": "roadm-external"
+        }))
         time.sleep(2)
 
     def test_43_check_update_portmapping(self):
-        response = test_utils.portmapping_request("ROADM-A1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        mapping_list = res['nodes'][0]['mapping']
+        response = test_utils.get_portmapping_node_attr("ROADM-A1", None, None)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        mapping_list = response['nodes'][0]['mapping']
         for mapping in mapping_list:
             if mapping['logical-connection-point'] == 'SRG1-PP2-TXRX':
                 self.assertEqual(mapping['port-oper-state'], 'OutOfService',
@@ -673,11 +588,9 @@ class TransportPCEFulltesting(unittest.TestCase):
         time.sleep(1)
 
     def test_44_check_update_openroadm_topo(self):
-        url = test_utils.URL_CONFIG_ORDM_TOPO
-        response = test_utils.get_request(url)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        node_list = res['network'][0]['node']
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        node_list = response['network'][0]['node']
         nb_updated_tp = 0
         for node in node_list:
             self.assertEqual(node['org-openroadm-common-network:operational-state'], 'inService')
@@ -693,7 +606,7 @@ class TransportPCEFulltesting(unittest.TestCase):
                     self.assertEqual(tp['org-openroadm-common-network:administrative-state'], 'inService')
         self.assertEqual(nb_updated_tp, 1, "Only one termination-point should have been modified")
 
-        link_list = res['network'][0]['ietf-network-topology:link']
+        link_list = response['network'][0]['ietf-network-topology:link']
         nb_updated_link = 0
         for link in link_list:
             self.assertEqual(link['org-openroadm-common-network:operational-state'], 'inService')
@@ -705,40 +618,40 @@ class TransportPCEFulltesting(unittest.TestCase):
         self.test_12_get_eth_service1()
 
     def test_46_delete_eth_service1(self):
-        response = test_utils.service_delete_request("service1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service1"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_47_disconnect_xponders_from_roadm(self):
-        url = "{}/config/ietf-network:networks/network/openroadm-topology/ietf-network-topology:link/"
-        response = test_utils.get_ordm_topo_request("")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        links = res['network'][0]['ietf-network-topology:link']
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        links = response['network'][0]['ietf-network-topology:link']
         for link in links:
             if link["org-openroadm-common-network:link-type"] in ('XPONDER-OUTPUT', 'XPONDER-INPUT'):
-                link_name = link["link-id"]
-                response = test_utils.delete_request(url+link_name)
-                self.assertEqual(response.status_code, requests.codes.ok)
+                response = test_utils.del_ietf_network_link_request(
+                    'openroadm-topology', link['link-id'], 'config')
+                self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_48_disconnect_XPDRA(self):
         response = test_utils.unmount_device("XPDRA01")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_49_disconnect_XPDRC(self):
         response = test_utils.unmount_device("XPDR-C1")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_50_disconnect_ROADMA(self):
         response = test_utils.unmount_device("ROADM-A1")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_51_disconnect_ROADMC(self):
         response = test_utils.unmount_device("ROADM-C1")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
 
 if __name__ == "__main__":
index 51dc2e60ba2bc940f6d203f8c191461ee3afc16d..5b1ad0bd8cb805a727c778781bac107917838b4b 100644 (file)
@@ -33,7 +33,7 @@ class TransportPCEtesting(unittest.TestCase):
     NODE_VERSION_221 = '2.2.1'
     NODE_VERSION_71 = '7.1'
 
-    cr_serv_sample_data = {"input": {
+    cr_serv_input_data = {
         "sdnc-request-header": {
             "request-id": "request-1",
             "rpc-action": "service-create",
@@ -125,6 +125,16 @@ class TransportPCEtesting(unittest.TestCase):
         "due-date": "2018-06-15T00:00:01Z",
         "operator-contact": "pw1234"
     }
+
+    del_serv_input_data = {
+        "sdnc-request-header": {
+            "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
+            "rpc-action": "service-delete",
+            "request-system-id": "appname",
+            "notification-url": "http://localhost:8585/NotificationServer/notify"},
+        "service-delete-req-info": {
+            "service-name": "TBD",
+            "tail-retention": "no"}
     }
 
     @classmethod
@@ -143,65 +153,61 @@ class TransportPCEtesting(unittest.TestCase):
         print("all processes killed")
 
     def setUp(self):
-        time.sleep(2)
+        time.sleep(1)
 
-    def test_01_connect_xpdra2(self):
+    def test_001_connect_xpdra2(self):
         response = test_utils.mount_device("XPDR-A2", ('xpdra2', self.NODE_VERSION_71))
         self.assertEqual(response.status_code,
                          requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
-    def test_02_connect_xpdrc2(self):
+    def test_002_connect_xpdrc2(self):
         response = test_utils.mount_device("XPDR-C2", ('xpdrc2', self.NODE_VERSION_71))
         self.assertEqual(response.status_code,
                          requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
-    def test_03_connect_rdma(self):
+    def test_003_connect_rdma(self):
         response = test_utils.mount_device("ROADM-A1", ('roadma', self.NODE_VERSION_221))
         self.assertEqual(response.status_code,
                          requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
-    def test_04_connect_rdmc(self):
+    def test_004_connect_rdmc(self):
         response = test_utils.mount_device("ROADM-C1", ('roadmc', self.NODE_VERSION_221))
         self.assertEqual(response.status_code,
                          requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
-    def test_05_connect_xprda2_2_N1_to_roadma_PP2(self):
-        response = test_utils.connect_xpdr_to_rdm_request("XPDR-A2", "2", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully',
-                      res["output"]["result"])
-        time.sleep(2)
-
-    def test_06_connect_roadma_PP2_to_xpdra2_2_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("XPDR-A2", "2", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully',
-                      res["output"]["result"])
-        time.sleep(2)
-
-    def test_07_connect_xprdc2_2_N1_to_roadmc_PP2(self):
-        response = test_utils.connect_xpdr_to_rdm_request("XPDR-C2", "2", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully',
-                      res["output"]["result"])
-        time.sleep(2)
-
-    def test_08_connect_roadmc_PP2_to_xpdrc2_2_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("XPDR-C2", "2", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully',
-                      res["output"]["result"])
-        time.sleep(2)
-
-    def test_09_add_omsAttributes_roadma_roadmc(self):
+    def test_005_connect_xpdra2_2_N1_to_roadma_PP2(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDR-A2', 'xpdr-num': '2', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
+
+    def test_006_connect_roadma_PP2_to_xpdra2_2_N1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDR-A2', 'xpdr-num': '2', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
+
+    def test_007_connect_xpdrc2_2_N1_to_roadmc_PP2(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDR-C2', 'xpdr-num': '2', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
+
+    def test_008_connect_roadmc_PP2_to_xpdrc2_2_N1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDR-C2', 'xpdr-num': '2', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
+
+    def test_009_add_omsAttributes_roadma_roadmc(self):
         # Config ROADMA-ROADMC oms-attributes
         data = {"span": {
             "auto-spanloss": "true",
@@ -217,7 +223,7 @@ class TransportPCEtesting(unittest.TestCase):
             "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
 
-    def test_10_add_omsAttributes_roadmc_roadma(self):
+    def test_010_add_omsAttributes_roadmc_roadma(self):
         # Config ROADMC-ROADMA oms-attributes
         data = {"span": {
             "auto-spanloss": "true",
@@ -233,72 +239,59 @@ class TransportPCEtesting(unittest.TestCase):
             "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
 
-# test service-create for OCH-OTU4 service from xpdra2 to xpdrc2
-    def test_11_check_otn_topology(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nbNode = len(res['network'][0]['node'])
-        self.assertEqual(nbNode, 4, 'There should be 4 nodes')
-        self.assertNotIn('ietf-network-topology:link', res['network'][0])
-
-    def test_12_create_OTUC4_service(self):
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    # test service-create for OCH-OTU4 service from xpdra2 to xpdrc2
+    def test_011_check_otn_topology(self):
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['node']), 7, 'There should be 7 nodes')
+        self.assertNotIn('ietf-network-topology:link', response['network'][0])
+
+    def test_012_create_OTUC4_service(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
-    def test_13_get_OTUC4_service1(self):
-        response = test_utils.get_service_list_request(
-            "services/service1-OTUC4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service1-OTUC4')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'infrastructure')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        self.assertEqual(
-            res['services'][0]['service-layer'], 'wdm')
-        self.assertEqual(
-            res['services'][0]['service-a-end']['service-rate'], 400)
-        self.assertEqual(
-            res['services'][0]['service-a-end']['otu-service-rate'], 'org-openroadm-otn-common-types:OTUCn')
-        time.sleep(2)
-        self.assertEqual(
-            res['services'][0]['service-z-end']['otu-service-rate'], 'org-openroadm-otn-common-types:OTUCn')
-        time.sleep(2)
+    def test_013_get_OTUC4_service1(self):
+        response = test_utils.get_ordm_serv_list_attr_request(
+            "services", "service1-OTUC4")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service1-OTUC4')
+        self.assertEqual(response['services'][0]['connection-type'], 'infrastructure')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        self.assertEqual(response['services'][0]['service-layer'], 'wdm')
+        self.assertEqual(response['services'][0]['service-a-end']['service-rate'], 400)
+        self.assertEqual(response['services'][0]['service-a-end']['otu-service-rate'],
+                         'org-openroadm-otn-common-types:OTUCn')
+        self.assertEqual(response['services'][0]['service-z-end']['otu-service-rate'],
+                         'org-openroadm-otn-common-types:OTUCn')
 
     # Check correct configuration of devices
-    def test_14_check_interface_otsi_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR2-NETWORK1-755:768")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_014_check_interface_otsi_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR2-NETWORK1-755:768')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertDictEqual(dict({'name': 'XPDR2-NETWORK1-755:768',
                                    'administrative-state': 'inService',
                                    'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
                                    'type': 'org-openroadm-interfaces:otsi',
                                    'supporting-port': 'L1'
-                                   }, **res['interface'][0]),
-                             res['interface'][0])
-
+                                   }, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(
             dict({'frequency': 196.0812, 'otsi-rate': 'org-openroadm-common-optical-channel-types:R400G-otsi',
                   'transmit-power': -5, 'modulation-format': 'dp-qam16'},
-                 **res['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi']),
-            res['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi'])
-
-    def test_15_check_interface_OTSI_GROUP_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR2-NETWORK1-OTSIGROUP-400G")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+                 **response['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi']),
+            response['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi'])
+
+    def test_015_check_interface_OTSI_GROUP_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR2-NETWORK1-OTSIGROUP-400G')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-OTSIGROUP-400G',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
@@ -309,18 +302,17 @@ class TransportPCEtesting(unittest.TestCase):
         input_dict_2 = {"group-id": 1,
                         "group-rate": "org-openroadm-common-optical-channel-types:R400G-otsi"
                         }
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(input_dict_2, **res['interface'][0]
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2, **response['interface'][0]
                                   ['org-openroadm-otsi-group-interfaces:otsi-group']),
-                             res['interface'][0]
+                             response['interface'][0]
                              ['org-openroadm-otsi-group-interfaces:otsi-group'])
 
-    def test_16_check_interface_OTUC4_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR2-NETWORK1-OTUC4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_016_check_interface_OTUC4_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR2-NETWORK1-OTUC4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-OTUC4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
@@ -337,36 +329,34 @@ class TransportPCEtesting(unittest.TestCase):
                         'degm-intervals': 2,
                         'otucn-n-rate': 4
                         }
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(input_dict_2, **res['interface'][0]['org-openroadm-otn-otu-interfaces:otu']),
-                             res['interface'][0]
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2, **response['interface'][0]['org-openroadm-otn-otu-interfaces:otu']),
+                             response['interface'][0]
                              ['org-openroadm-otn-otu-interfaces:otu'])
 
-    def test_17_check_interface_otsi_xpdrc2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-C2", "interface/XPDR2-NETWORK1-755:768")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_017_check_interface_otsi_xpdrc2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-C2', 'interface', 'XPDR2-NETWORK1-755:768')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertDictEqual(dict({'name': 'XPDR2-NETWORK1-755:768',
                                    'administrative-state': 'inService',
                                    'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
                                    'type': 'org-openroadm-interfaces:otsi',
                                    'supporting-port': 'L1'
-                                   }, **res['interface'][0]),
-                             res['interface'][0])
+                                   }, **response['interface'][0]),
+                             response['interface'][0])
 
         self.assertDictEqual(
             dict({'frequency': 196.0812, 'otsi-rate': 'org-openroadm-common-optical-channel-types:R400G-otsi',
                   'transmit-power': -5, 'modulation-format': 'dp-qam16'},
-                 **res['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi']),
-            res['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi'])
-
-    def test_18_check_interface_OTSI_GROUP_xpdrc2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-C2", "interface/XPDR2-NETWORK1-OTSIGROUP-400G")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+                 **response['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi']),
+            response['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi'])
+
+    def test_018_check_interface_OTSI_GROUP_xpdrc2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-C2', 'interface', 'XPDR2-NETWORK1-OTSIGROUP-400G')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-OTSIGROUP-400G',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
@@ -377,18 +367,17 @@ class TransportPCEtesting(unittest.TestCase):
         input_dict_2 = {"group-id": 1,
                         "group-rate": "org-openroadm-common-optical-channel-types:R400G-otsi"
                         }
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(input_dict_2, **res['interface'][0]
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2, **response['interface'][0]
                                   ['org-openroadm-otsi-group-interfaces:otsi-group']),
-                             res['interface'][0]
+                             response['interface'][0]
                              ['org-openroadm-otsi-group-interfaces:otsi-group'])
 
-    def test_19_check_interface_OTUC4_xpdrc2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-C2", "interface/XPDR2-NETWORK1-OTUC4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_019_check_interface_OTUC4_xpdrc2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-C2', 'interface', 'XPDR2-NETWORK1-OTUC4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-OTUC4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
@@ -406,100 +395,80 @@ class TransportPCEtesting(unittest.TestCase):
                         'otucn-n-rate': 4
                         }
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
 
-        self.assertDictEqual(dict(input_dict_2, **res['interface'][0]['org-openroadm-otn-otu-interfaces:otu']),
-                             res['interface'][0]
+        self.assertDictEqual(dict(input_dict_2, **response['interface'][0]['org-openroadm-otn-otu-interfaces:otu']),
+                             response['interface'][0]
                              ['org-openroadm-otn-otu-interfaces:otu'])
 
-    def test_20_check_no_interface_ODUC4_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR2-NETWORK1-ODUC4")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-        res = response.json()
-        self.assertIn(
-            {"error-type": "application", "error-tag": "data-missing",
-             "error-message": "Request could not be completed because the relevant data model content does not exist"},
-            res['errors']['error'])
-
-    def test_21_check_openroadm_topo_xpdra2(self):
-        response = test_utils.get_ordm_topo_request("node/XPDR-A2-XPDR2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        ele = res['node'][0]['ietf-network-topology:termination-point'][0]
+    def test_020_check_no_interface_ODUC4_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR2-NETWORK1-ODUC4')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    def test_021_check_openroadm_topo_xpdra2(self):
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'XPDR-A2-XPDR2', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        ele = response['node']['ietf-network-topology:termination-point'][0]
         self.assertEqual('XPDR2-NETWORK1', ele['tp-id'])
-        self.assertEqual({'frequency': 196.08125,
-                          'width': 75},
-                         ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength'])
-        time.sleep(3)
-
-    def test_22_check_otn_topo_OTUC4_links(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nb_links = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nb_links, 2)
+        self.assertEqual(
+            196.08125,
+            float(ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']['frequency']))
+        self.assertEqual(
+            75.0,
+            float(ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']['width']))
+
+    def test_022_check_otn_topo_OTUC4_links(self):
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 2)
         listLinkId = ['OTUC4-XPDR-A2-XPDR2-XPDR2-NETWORK1toXPDR-C2-XPDR2-XPDR2-NETWORK1',
                       'OTUC4-XPDR-C2-XPDR2-XPDR2-NETWORK1toXPDR-A2-XPDR2-XPDR2-NETWORK1']
-        for link in res['network'][0]['ietf-network-topology:link']:
+        for link in response['network'][0]['ietf-network-topology:link']:
             self.assertIn(link['link-id'], listLinkId)
-            self.assertEqual(
-                link['transportpce-topology:otn-link-type'], 'OTUC4')
-            self.assertEqual(
-                link['org-openroadm-common-network:link-type'], 'OTN-LINK')
-            self.assertEqual(
-                link['org-openroadm-otn-network-topology:available-bandwidth'], 400000)
-            self.assertEqual(
-                link['org-openroadm-otn-network-topology:used-bandwidth'], 0)
-            self.assertIn(
-                link['org-openroadm-common-network:opposite-link'], listLinkId)
-
-# test service-create for ODU4 service from xpdra2 to xpdrc2
-    def test_23_create_ODUC4_service(self):
-        self.cr_serv_sample_data["input"]["service-name"] = "service1-ODUC4"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-format"] = "ODU"
-        del self.cr_serv_sample_data["input"]["service-a-end"]["otu-service-rate"]
-        self.cr_serv_sample_data["input"]["service-a-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODUCn"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-format"] = "ODU"
-        del self.cr_serv_sample_data["input"]["service-z-end"]["otu-service-rate"]
-        self.cr_serv_sample_data["input"]["service-z-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODUCn"
-
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+            self.assertEqual(link['transportpce-networkutils:otn-link-type'], 'OTUC4')
+            self.assertEqual(link['org-openroadm-common-network:link-type'], 'OTN-LINK')
+            self.assertEqual(link['org-openroadm-otn-network-topology:available-bandwidth'], 400000)
+            self.assertEqual(link['org-openroadm-otn-network-topology:used-bandwidth'], 0)
+            self.assertIn(link['org-openroadm-common-network:opposite-link'], listLinkId)
+
+    # test service-create for ODU4 service from xpdra2 to xpdrc2
+    def test_023_create_ODUC4_service(self):
+        self.cr_serv_input_data["service-name"] = "service1-ODUC4"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "ODU"
+        del self.cr_serv_input_data["service-a-end"]["otu-service-rate"]
+        self.cr_serv_input_data["service-a-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODUCn"
+        self.cr_serv_input_data["service-z-end"]["service-format"] = "ODU"
+        del self.cr_serv_input_data["service-z-end"]["otu-service-rate"]
+        self.cr_serv_input_data["service-z-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODUCn"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
-    def test_24_get_ODUC4_service1(self):
-        response = test_utils.get_service_list_request(
-            "services/service1-ODUC4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service1-ODUC4')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'infrastructure')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        self.assertEqual(
-            res['services'][0]['service-layer'], 'wdm')
-        self.assertEqual(
-            res['services'][0]['service-a-end']['service-rate'], 400)
-        self.assertEqual(
-            res['services'][0]['service-a-end']['odu-service-rate'], 'org-openroadm-otn-common-types:ODUCn')
-        self.assertEqual(
-            res['services'][0]['service-z-end']['odu-service-rate'], 'org-openroadm-otn-common-types:ODUCn')
-        time.sleep(2)
-
-    def test_25_check_interface_ODUC4_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR2-NETWORK1-ODUC4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_024_get_ODUC4_service1(self):
+        response = test_utils.get_ordm_serv_list_attr_request(
+            "services", "service1-ODUC4")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['service-name'], 'service1-ODUC4')
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['connection-type'], 'infrastructure')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        self.assertEqual(response['services'][0]['service-layer'], 'wdm')
+        self.assertEqual(response['services'][0]['service-a-end']['service-rate'], 400)
+        self.assertEqual(response['services'][0]['service-a-end']['odu-service-rate'],
+                         'org-openroadm-otn-common-types:ODUCn')
+        self.assertEqual(response['services'][0]['service-z-end']['odu-service-rate'],
+                         'org-openroadm-otn-common-types:ODUCn')
+
+    def test_025_check_interface_ODUC4_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR2-NETWORK1-ODUC4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-ODUC4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
@@ -514,19 +483,18 @@ class TransportPCEtesting(unittest.TestCase):
                         'tx-dapi': 'Nmbu2MNHvc4=',
                         'tx-sapi': 'LY9PxYJqUbw='}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(input_dict_2, **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2, **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(
             {'payload-type': '22', 'exp-payload-type': '22'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
 
-    def test_26_check_interface_ODUC4_xpdrc2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-C2", "interface/XPDR2-NETWORK1-ODUC4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_026_check_interface_ODUC4_xpdrc2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-C2', 'interface', 'XPDR2-NETWORK1-ODUC4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-NETWORK1-ODUC4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
@@ -541,21 +509,19 @@ class TransportPCEtesting(unittest.TestCase):
                         'expected-sapi': 'LY9PxYJqUbw=',
                         'expected-dapi': 'LY9PxYJqUbw='
                         }
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(input_dict_2, **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2, **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(
             {'payload-type': '22', 'exp-payload-type': '22'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
-
-    def test_27_check_otn_topo_links(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nb_links = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nb_links, 4)
-        for link in res['network'][0]['ietf-network-topology:link']:
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+
+    def test_027_check_otn_topo_links(self):
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 4)
+        for link in response['network'][0]['ietf-network-topology:link']:
             linkId = link['link-id']
             if (linkId in ('OTUC4-XPDR-A2-XPDR2-XPDR2-NETWORK1toXPDR-C2-XPDR2-XPDR2-NETWORK1',
                            'OTUC4-XPDR-C2-XPDR2-XPDR2-NETWORK1toXPDR-A2-XPDR2-XPDR2-NETWORK1')):
@@ -570,7 +536,7 @@ class TransportPCEtesting(unittest.TestCase):
                 self.assertEqual(
                     link['org-openroadm-otn-network-topology:used-bandwidth'], 0)
                 self.assertEqual(
-                    link['transportpce-topology:otn-link-type'], 'ODUC4')
+                    link['transportpce-networkutils:otn-link-type'], 'ODUC4')
                 self.assertEqual(
                     link['org-openroadm-common-network:link-type'], 'OTN-LINK')
                 self.assertIn(link['org-openroadm-common-network:opposite-link'],
@@ -579,10 +545,10 @@ class TransportPCEtesting(unittest.TestCase):
             else:
                 self.fail("this link should not exist")
 
-    def test_28_check_otn_topo_tp(self):
-        response = test_utils.get_otn_topo_request()
-        res = response.json()
-        for node in res['network'][0]['node']:
+    def test_028_check_otn_topo_tp(self):
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        for node in response['network'][0]['node']:
             if node['node-id'] in ('XPDR-A2-XPDR2', 'XPDR-C2-XPDR2'):
                 tpList = node['ietf-network-topology:termination-point']
                 for tp in tpList:
@@ -594,47 +560,41 @@ class TransportPCEtesting(unittest.TestCase):
                         self.assertEqual(xpdrTpPortConAt['odtu-tpn-pool'][0]['odtu-type'],
                                          'org-openroadm-otn-common-types:ODTU4.ts-Allocated')
 
-# test service-create for 100GE service 1 from xpdra2 to xpdrc2
-    def test_29_create_100GE_service_1(self):
-        self.cr_serv_sample_data["input"]["service-name"] = "service-100GE"
-        self.cr_serv_sample_data["input"]["connection-type"] = "service"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-rate"] = "100"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-format"] = "Ethernet"
-        del self.cr_serv_sample_data["input"]["service-a-end"]["odu-service-rate"]
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-rate"] = "100"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-format"] = "Ethernet"
-        del self.cr_serv_sample_data["input"]["service-z-end"]["odu-service-rate"]
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    # test service-create for 100GE service 1 from xpdra2 to xpdrc2
+    def test_029_create_100GE_service_1(self):
+        self.cr_serv_input_data["service-name"] = "service-100GE"
+        self.cr_serv_input_data["connection-type"] = "service"
+        self.cr_serv_input_data["service-a-end"]["service-rate"] = "100"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "Ethernet"
+        del self.cr_serv_input_data["service-a-end"]["odu-service-rate"]
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
+        self.cr_serv_input_data["service-z-end"]["service-rate"] = "100"
+        self.cr_serv_input_data["service-z-end"]["service-format"] = "Ethernet"
+        del self.cr_serv_input_data["service-z-end"]["odu-service-rate"]
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
-    def test_30_get_100GE_service_1(self):
-        response = test_utils.get_service_list_request(
-            "services/service-100GE")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service-100GE')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'service')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
-
-    def test_31_check_interface_100GE_CLIENT_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR2-CLIENT1-ETHERNET-100G")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_030_get_100GE_service_1(self):
+        response = test_utils.get_ordm_serv_list_attr_request(
+            "services", "service-100GE")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service-100GE')
+        self.assertEqual(response['services'][0]['connection-type'], 'service')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+
+    def test_031_check_interface_100GE_CLIENT_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR2-CLIENT1-ETHERNET-100G')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-CLIENT1-ETHERNET-100G',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/2/1/1-PLUG-CLIENT',
@@ -642,17 +602,17 @@ class TransportPCEtesting(unittest.TestCase):
                         'supporting-port': 'C1'
                         }
         input_dict_2 = {'speed': 100000}
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(input_dict_2, **res['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']),
-                             res['interface'][0]['org-openroadm-ethernet-interfaces:ethernet'])
-
-    def test_32_check_interface_ODU4_CLIENT_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR2-CLIENT1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        input_dict_1 = {'name': 'XPDR2-CLIENT1-ODU4',
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(
+            dict(input_dict_2, **response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']),
+            response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet'])
+
+    def test_032_check_interface_ODU4_CLIENT_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR2-CLIENT1-ODU4:service-100GE')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR2-CLIENT1-ODU4:service-100GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/2/1/1-PLUG-CLIENT',
                         'supporting-interface-list': 'XPDR2-CLIENT1-ETHERNET-100G',
@@ -663,21 +623,20 @@ class TransportPCEtesting(unittest.TestCase):
             'rate': 'org-openroadm-otn-common-types:ODU4',
             'monitoring-mode': 'terminated'}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(
             {'payload-type': '07', 'exp-payload-type': '07'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
-
-    def test_33_check_interface_ODU4_NETWORK_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR2-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU4',
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+
+    def test_033_check_interface_ODU4_NETWORK_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR2-NETWORK1-ODU4:service-100GE')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU4:service-100GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
                         'supporting-interface-list': 'XPDR2-NETWORK1-ODUC4',
@@ -689,44 +648,41 @@ class TransportPCEtesting(unittest.TestCase):
             'monitoring-mode': 'not-terminated'}
         input_dict_3 = {'trib-port-number': 1}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(dict(input_dict_3,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
                                       'parent-odu-allocation']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation'])
-        self.assertIn('1.1', res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation'])
+        self.assertIn('1.1', response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
                       ['opucn-trib-slots'])
-        self.assertIn('1.20', res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
+        self.assertIn('1.20', response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
                       ['opucn-trib-slots'])
 
-    def test_34_check_ODU4_connection_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2",
-            "odu-connection/XPDR2-CLIENT1-ODU4-x-XPDR2-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_034_check_ODU4_connection_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'odu-connection', 'XPDR2-CLIENT1-ODU4-x-XPDR2-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {
             'connection-name':
             'XPDR2-CLIENT1-ODU4-x-XPDR2-NETWORK1-ODU4',
             'direction': 'bidirectional'
         }
 
-        self.assertDictEqual(dict(input_dict_1, **res['odu-connection'][0]),
-                             res['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR2-NETWORK1-ODU4'},
-                             res['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR2-CLIENT1-ODU4'},
-                             res['odu-connection'][0]['source'])
-
-    def test_35_check_interface_100GE_CLIENT_xpdrc2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-C2", "interface/XPDR2-CLIENT1-ETHERNET-100G")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
+                             response['odu-connection'][0])
+        self.assertDictEqual({'dst-if': 'XPDR2-NETWORK1-ODU4:service-100GE'},
+                             response['odu-connection'][0]['destination'])
+        self.assertDictEqual({'src-if': 'XPDR2-CLIENT1-ODU4:service-100GE'},
+                             response['odu-connection'][0]['source'])
+
+    def test_035_check_interface_100GE_CLIENT_xpdrc2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-C2', 'interface', 'XPDR2-CLIENT1-ETHERNET-100G')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR2-CLIENT1-ETHERNET-100G',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/2/1/1-PLUG-CLIENT',
@@ -734,17 +690,17 @@ class TransportPCEtesting(unittest.TestCase):
                         'supporting-port': 'C1'
                         }
         input_dict_2 = {'speed': 100000}
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(input_dict_2, **res['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']),
-                             res['interface'][0]['org-openroadm-ethernet-interfaces:ethernet'])
-
-    def test_36_check_interface_ODU4_CLIENT_xpdrc2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-C2", "interface/XPDR2-CLIENT1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        input_dict_1 = {'name': 'XPDR2-CLIENT1-ODU4',
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(
+            dict(input_dict_2, **response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']),
+            response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet'])
+
+    def test_036_check_interface_ODU4_CLIENT_xpdrc2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-C2', 'interface', 'XPDR2-CLIENT1-ODU4:service-100GE')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR2-CLIENT1-ODU4:service-100GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/2/1/1-PLUG-CLIENT',
                         'supporting-interface-list': 'XPDR2-CLIENT1-ETHERNET-100G',
@@ -755,21 +711,20 @@ class TransportPCEtesting(unittest.TestCase):
             'rate': 'org-openroadm-otn-common-types:ODU4',
             'monitoring-mode': 'terminated'}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(
             {'payload-type': '07', 'exp-payload-type': '07'},
-            res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
-
-    def test_37_check_interface_ODU4_NETWORK_xpdrc2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-C2", "interface/XPDR2-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU4',
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+
+    def test_037_check_interface_ODU4_NETWORK_xpdrc2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-C2', 'interface', 'XPDR2-NETWORK1-ODU4:service-100GE')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU4:service-100GE',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
                         'supporting-interface-list': 'XPDR2-NETWORK1-ODUC4',
@@ -782,51 +737,47 @@ class TransportPCEtesting(unittest.TestCase):
 
         input_dict_3 = {'trib-port-number': 1}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(dict(input_dict_3,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
                                       'parent-odu-allocation']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
             'parent-odu-allocation'])
         self.assertIn('1.1',
-                      res['interface'][0][
+                      response['interface'][0][
                           'org-openroadm-otn-odu-interfaces:odu'][
                           'parent-odu-allocation']['opucn-trib-slots'])
         self.assertIn('1.20',
-                      res['interface'][0][
+                      response['interface'][0][
                           'org-openroadm-otn-odu-interfaces:odu'][
                           'parent-odu-allocation']['opucn-trib-slots'])
 
-    def test_38_check_ODU4_connection_xpdrc2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-C2",
-            "odu-connection/XPDR2-CLIENT1-ODU4-x-XPDR2-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_038_check_ODU4_connection_xpdrc2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-C2', 'odu-connection', 'XPDR2-CLIENT1-ODU4-x-XPDR2-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {
             'connection-name':
             'XPDR2-CLIENT1-ODU4-x-XPDR2-NETWORK1-ODU4',
             'direction': 'bidirectional'
         }
 
-        self.assertDictEqual(dict(input_dict_1, **res['odu-connection'][0]),
-                             res['odu-connection'][0])
-        self.assertDictEqual({'dst-if': 'XPDR2-NETWORK1-ODU4'},
-                             res['odu-connection'][0]['destination'])
-        self.assertDictEqual({'src-if': 'XPDR2-CLIENT1-ODU4'},
-                             res['odu-connection'][0]['source'])
-
-    def test_39_check_otn_topo_links(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nb_links = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nb_links, 4)
-        for link in res['network'][0]['ietf-network-topology:link']:
+        self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
+                             response['odu-connection'][0])
+        self.assertDictEqual({'dst-if': 'XPDR2-NETWORK1-ODU4:service-100GE'},
+                             response['odu-connection'][0]['destination'])
+        self.assertDictEqual({'src-if': 'XPDR2-CLIENT1-ODU4:service-100GE'},
+                             response['odu-connection'][0]['source'])
+
+    def test_039_check_otn_topo_links(self):
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 4)
+        for link in response['network'][0]['ietf-network-topology:link']:
             linkId = link['link-id']
             if (linkId in ('ODUC4-XPDR-A2-XPDR2-XPDR2-NETWORK1toXPDR-C2-XPDR2-XPDR2-NETWORK1',
                            'ODUC4-XPDR-C2-XPDR2-XPDR2-NETWORK1toXPDR-A2-XPDR2-XPDR2-NETWORK1')):
@@ -835,10 +786,10 @@ class TransportPCEtesting(unittest.TestCase):
                 self.assertEqual(
                     link['org-openroadm-otn-network-topology:used-bandwidth'], 100000)
 
-    def test_40_check_otn_topo_tp(self):
-        response = test_utils.get_otn_topo_request()
-        res = response.json()
-        for node in res['network'][0]['node']:
+    def test_040_check_otn_topo_tp(self):
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        for node in response['network'][0]['node']:
             if node['node-id'] in ('XPDR-A2-XPDR2', 'XPDR-C2-XPDR2'):
                 tpList = node['ietf-network-topology:termination-point']
                 for tp in tpList:
@@ -853,54 +804,45 @@ class TransportPCEtesting(unittest.TestCase):
                         self.assertNotIn(
                             1, xpdrTpPortConAt['odtu-tpn-pool'][0]['tpn-pool'])
 
-# test service-create for 100GE service 2 from xpdra2 to xpdrc2
-    def test_41_create_100GE_service_2(self):
-        self.cr_serv_sample_data["input"]["service-name"] = "service-100GE2"
-        self.cr_serv_sample_data["input"]["connection-type"] = "service"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-rate"] = "100"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-format"] = "Ethernet"
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT2"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT2"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-rate"] = "100"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-format"] = "Ethernet"
-        self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT2"
-        self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT2"
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    # test service-create for 100GE service 2 from xpdra2 to xpdrc2
+    def test_041_create_100GE_service_2(self):
+        self.cr_serv_input_data["service-name"] = "service-100GE2"
+        self.cr_serv_input_data["connection-type"] = "service"
+        self.cr_serv_input_data["service-a-end"]["service-rate"] = "100"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "Ethernet"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT2"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT2"
+        self.cr_serv_input_data["service-z-end"]["service-rate"] = "100"
+        self.cr_serv_input_data["service-z-end"]["service-format"] = "Ethernet"
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT2"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT2"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
-    def test_42_get_100GE_service_2(self):
-        response = test_utils.get_service_list_request(
-            "services/service-100GE2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service-100GE2')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'service')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
-
-    def test_43_check_service_list(self):
-        response = test_utils.get_service_list_request("")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(len(res['service-list']['services']), 4)
-        time.sleep(2)
-
-    def test_44_check_otn_topo_links(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nb_links = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nb_links, 4)
-        for link in res['network'][0]['ietf-network-topology:link']:
+    def test_042_get_100GE_service_2(self):
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service-100GE2")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service-100GE2')
+        self.assertEqual(response['services'][0]['connection-type'], 'service')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        time.sleep(1)
+
+    def test_043_check_service_list(self):
+        response = test_utils.get_ordm_serv_list_request()
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['service-list']['services']), 4)
+
+    def test_044_check_otn_topo_links(self):
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 4)
+        for link in response['network'][0]['ietf-network-topology:link']:
             linkId = link['link-id']
             if (linkId in ('ODUC4-XPDR-A2-XPDR2-XPDR2-NETWORK1toXPDR-C2-XPDR2-XPDR2-NETWORK1',
                            'ODUC4-XPDR-C2-XPDR2-XPDR2-NETWORK1toXPDR-A2-XPDR2-XPDR2-NETWORK1')):
@@ -909,10 +851,10 @@ class TransportPCEtesting(unittest.TestCase):
                 self.assertEqual(
                     link['org-openroadm-otn-network-topology:used-bandwidth'], 200000)
 
-    def test_45_check_otn_topo_tp(self):
-        response = test_utils.get_otn_topo_request()
-        res = response.json()
-        for node in res['network'][0]['node']:
+    def test_045_check_otn_topo_tp(self):
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        for node in response['network'][0]['node']:
             if node['node-id'] in ('XPDR-A2-XPDR2', 'XPDR-C2-XPDR2'):
                 tpList = node['ietf-network-topology:termination-point']
                 for tp in tpList:
@@ -927,58 +869,56 @@ class TransportPCEtesting(unittest.TestCase):
                         self.assertNotIn(
                             2, xpdrTpPortConAt['odtu-tpn-pool'][0]['tpn-pool'])
 
-    def test_46_delete_100GE_service_2(self):
-        response = test_utils.service_delete_request("service-100GE2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_046_delete_100GE_service_2(self):
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service-100GE2"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
-    def test_47_delete_100GE_service_1(self):
-        response = test_utils.service_delete_request("service-100GE")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_047_delete_100GE_service_1(self):
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service-100GE"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
-    def test_48_check_service_list(self):
-        response = test_utils.get_service_list_request("")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(len(res['service-list']['services']), 2)
-        time.sleep(2)
-
-    def test_49_check_no_ODU4_connection_xpdra2(self):
-        response = test_utils.check_netconf_node_request("XPDR-A2", "")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertNotIn(['odu-connection'][0], res['org-openroadm-device'])
-        time.sleep(1)
-
-    def test_50_check_no_interface_ODU4_NETWORK_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR2-NETWORK1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-
-    def test_51_check_no_interface_ODU4_CLIENT_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR2-CLIENT1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-
-    def test_52_check_no_interface_100GE_CLIENT_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR2-CLIENT1-ETHERNET-100G")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-
-    def test_53_check_otn_topo_links(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nb_links = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nb_links, 4)
-        for link in res['network'][0]['ietf-network-topology:link']:
+    def test_048_check_service_list(self):
+        response = test_utils.get_ordm_serv_list_request()
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['service-list']['services']), 2)
+
+    def test_049_check_no_ODU4_connection_xpdra2(self):
+        response = test_utils.check_node_request("XPDR-A2")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertNotIn(['odu-connection'][0], response['org-openroadm-device'])
+
+    def test_050_check_no_interface_ODU4_NETWORK_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR2-NETWORK1-ODU4:service-100GE')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    def test_051_check_no_interface_ODU4_CLIENT_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR2-CLIENT1-ODU4:service-100GE')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    def test_052_check_no_interface_100GE_CLIENT_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR2-CLIENT1-ETHERNET-100G')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    def test_053_check_otn_topo_links(self):
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 4)
+        for link in response['network'][0]['ietf-network-topology:link']:
             linkId = link['link-id']
             if (linkId in ('ODUC4-XPDR-A2-XPDR2-XPDR2-NETWORK1toXPDR-C2-XPDR2-XPDR2-NETWORK1',
                            'ODUC4-XPDR-C2-XPDR2-XPDR2-NETWORK1toXPDR-A2-XPDR2-XPDR2-NETWORK1')):
@@ -987,10 +927,10 @@ class TransportPCEtesting(unittest.TestCase):
                 self.assertEqual(
                     link['org-openroadm-otn-network-topology:used-bandwidth'], 0)
 
-    def test_54_check_otn_topo_tp(self):
-        response = test_utils.get_otn_topo_request()
-        res = response.json()
-        for node in res['network'][0]['node']:
+    def test_054_check_otn_topo_tp(self):
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        for node in response['network'][0]['node']:
             if node['node-id'] in ('XPDR-A2-XPDR2', 'XPDR-C2-XPDR2'):
                 tpList = node['ietf-network-topology:termination-point']
                 for tp in tpList:
@@ -1000,33 +940,287 @@ class TransportPCEtesting(unittest.TestCase):
                         self.assertEqual(
                             len(xpdrTpPortConAt['odtu-tpn-pool'][0]['tpn-pool']), 4)
 
-    def test_55_delete_ODUC4_service(self):
-        response = test_utils.service_delete_request("service1-ODUC4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    # test service-create for 100GE service 3 from xpdra2 client1 to xpdrc2 client2
+    def test_055_create_100GE_service_3(self):
+        self.cr_serv_input_data["service-name"] = "service-100GE3"
+        self.cr_serv_input_data["connection-type"] = "service"
+        self.cr_serv_input_data["service-a-end"]["service-rate"] = "100"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "Ethernet"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT1"
+        self.cr_serv_input_data["service-z-end"]["service-rate"] = "100"
+        self.cr_serv_input_data["service-z-end"]["service-format"] = "Ethernet"
+        self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT2"
+        self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR2-CLIENT2"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('PCE calculation in progress',
+                      response['output']['configuration-response-common']['response-message'])
+        time.sleep(self.WAITING)
+
+    def test_056_get_100GE_service_3(self):
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service-100GE3")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service-100GE3')
+        self.assertEqual(response['services'][0]['connection-type'], 'service')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        time.sleep(1)
+
+    def test_057_check_service_list(self):
+        response = test_utils.get_ordm_serv_list_request()
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['service-list']['services']), 3)
+
+    def test_058_check_interface_100GE_CLIENT_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR2-CLIENT1-ETHERNET-100G')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR2-CLIENT1-ETHERNET-100G',
+                        'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': '1/2/1/1-PLUG-CLIENT',
+                        'type': 'org-openroadm-interfaces:ethernetCsmacd',
+                        'supporting-port': 'C1'
+                        }
+        input_dict_2 = {'speed': 100000}
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(
+            dict(input_dict_2, **response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']),
+            response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet'])
+
+    def test_059_check_interface_ODU4_CLIENT_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR2-CLIENT1-ODU4:service-100GE3')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR2-CLIENT1-ODU4:service-100GE3',
+                        'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': '1/2/1/1-PLUG-CLIENT',
+                        'supporting-interface-list': 'XPDR2-CLIENT1-ETHERNET-100GE3',
+                        'type': 'org-openroadm-interfaces:otnOdu',
+                        'supporting-port': 'C1'}
+        input_dict_2 = {
+            'odu-function': 'org-openroadm-otn-common-types:ODU-TTP-CTP',
+            'rate': 'org-openroadm-otn-common-types:ODU4',
+            'monitoring-mode': 'terminated'}
+
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+        self.assertDictEqual(
+            {'payload-type': '07', 'exp-payload-type': '07'},
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+
+    def test_060_check_interface_ODU4_NETWORK_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR2-NETWORK1-ODU4:service-100GE3')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU4:service-100GE3',
+                        'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
+                        'supporting-interface-list': 'XPDR2-NETWORK1-ODUC4',
+                        'type': 'org-openroadm-interfaces:otnOdu',
+                        'supporting-port': 'L1'}
+        input_dict_2 = {
+            'odu-function': 'org-openroadm-otn-common-types:ODU-CTP',
+            'rate': 'org-openroadm-otn-common-types:ODU4',
+            'monitoring-mode': 'not-terminated'}
+        input_dict_3 = {'trib-port-number': 1}
+
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+        self.assertDictEqual(dict(input_dict_3,
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
+                                      'parent-odu-allocation']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation'])
+        self.assertIn('1.1', response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
+                      ['opucn-trib-slots'])
+        self.assertIn('1.20', response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
+                      ['opucn-trib-slots'])
+
+    def test_061_check_ODU4_connection_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'odu-connection', 'XPDR2-CLIENT1-ODU4-x-XPDR2-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {
+            'connection-name':
+            'XPDR2-CLIENT1-ODU4-x-XPDR2-NETWORK1-ODU4',
+            'direction': 'bidirectional'
+        }
+
+        self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
+                             response['odu-connection'][0])
+        self.assertDictEqual({'dst-if': 'XPDR2-NETWORK1-ODU4:service-100GE3'},
+                             response['odu-connection'][0]['destination'])
+        self.assertDictEqual({'src-if': 'XPDR2-CLIENT1-ODU4:service-100GE3'},
+                             response['odu-connection'][0]['source'])
+
+    def test_062_check_interface_100GE_CLIENT_xpdrc2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-C2', 'interface', 'XPDR2-CLIENT2-ETHERNET-100G')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR2-CLIENT2-ETHERNET-100G',
+                        'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': '1/2/1/2-PLUG-CLIENT',
+                        'type': 'org-openroadm-interfaces:ethernetCsmacd',
+                        'supporting-port': 'C1'
+                        }
+        input_dict_2 = {'speed': 100000}
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(
+            dict(input_dict_2, **response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']),
+            response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet'])
+
+    def test_063_check_interface_ODU4_CLIENT_xpdrc2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-C2', 'interface', 'XPDR2-CLIENT2-ODU4:service-100GE3')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR2-CLIENT1-ODU4:service-100GE3',
+                        'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': '1/2/1/2-PLUG-CLIENT',
+                        'supporting-interface-list': 'XPDR2-CLIENT2-ETHERNET-100GE3',
+                        'type': 'org-openroadm-interfaces:otnOdu',
+                        'supporting-port': 'C1'}
+        input_dict_2 = {
+            'odu-function': 'org-openroadm-otn-common-types:ODU-TTP-CTP',
+            'rate': 'org-openroadm-otn-common-types:ODU4',
+            'monitoring-mode': 'terminated'}
+
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+        self.assertDictEqual(
+            {'payload-type': '07', 'exp-payload-type': '07'},
+            response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+
+    def test_064_check_interface_ODU4_NETWORK_xpdrc2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-C2', 'interface', 'XPDR2-NETWORK1-ODU4:service-100GE3')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {'name': 'XPDR2-NETWORK1-ODU4:service-100GE3',
+                        'administrative-state': 'inService',
+                        'supporting-circuit-pack-name': '1/2/2-PLUG-NET',
+                        'supporting-interface-list': 'XPDR2-NETWORK1-ODUC4',
+                        'type': 'org-openroadm-interfaces:otnOdu',
+                        'supporting-port': 'C1'}
+        input_dict_2 = {
+            'odu-function': 'org-openroadm-otn-common-types:ODU-CTP',
+            'rate': 'org-openroadm-otn-common-types:ODU4',
+            'monitoring-mode': 'not-terminated'}
+
+        input_dict_3 = {'trib-port-number': 1}
+
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(dict(input_dict_2,
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+        self.assertDictEqual(dict(input_dict_3,
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
+                                      'parent-odu-allocation']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
+            'parent-odu-allocation'])
+        self.assertIn('1.1',
+                      response['interface'][0][
+                          'org-openroadm-otn-odu-interfaces:odu'][
+                          'parent-odu-allocation']['opucn-trib-slots'])
+        self.assertIn('1.20',
+                      response['interface'][0][
+                          'org-openroadm-otn-odu-interfaces:odu'][
+                          'parent-odu-allocation']['opucn-trib-slots'])
+
+    def test_065_check_ODU4_connection_xpdrc2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-C2', 'odu-connection', 'XPDR2-CLIENT2-ODU4-x-XPDR2-NETWORK1-ODU4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        input_dict_1 = {
+            'connection-name':
+            'XPDR2-CLIENT2-ODU4-x-XPDR2-NETWORK1-ODU4',
+            'direction': 'bidirectional'
+        }
+
+        self.assertDictEqual(dict(input_dict_1, **response['odu-connection'][0]),
+                             response['odu-connection'][0])
+        self.assertDictEqual({'dst-if': 'XPDR2-NETWORK1-ODU4:service-100GE3'},
+                             response['odu-connection'][0]['destination'])
+        self.assertDictEqual({'src-if': 'XPDR2-CLIENT2-ODU4:service-100GE3'},
+                             response['odu-connection'][0]['source'])
+
+    def test_066_check_otn_topo_links(self):
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 4)
+        for link in response['network'][0]['ietf-network-topology:link']:
+            linkId = link['link-id']
+            if (linkId in ('ODUC4-XPDR-A2-XPDR2-XPDR2-NETWORK1toXPDR-C2-XPDR2-XPDR2-NETWORK1',
+                           'ODUC4-XPDR-C2-XPDR2-XPDR2-NETWORK1toXPDR-A2-XPDR2-XPDR2-NETWORK1')):
+                self.assertEqual(
+                    link['org-openroadm-otn-network-topology:available-bandwidth'], 300000)
+                self.assertEqual(
+                    link['org-openroadm-otn-network-topology:used-bandwidth'], 100000)
+
+    def test_067_check_otn_topo_tp(self):
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        for node in response['network'][0]['node']:
+            if node['node-id'] in ('XPDR-A2-XPDR2', 'XPDR-C2-XPDR2'):
+                tpList = node['ietf-network-topology:termination-point']
+                for tp in tpList:
+                    if tp['tp-id'] == 'XPDR2-NETWORK1':
+                        xpdrTpPortConAt = tp['org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes']
+                        self.assertEqual(len(xpdrTpPortConAt['ts-pool']), 60)
+                        tsPoolList = list(range(1, 20))
+                        self.assertNotIn(tsPoolList, xpdrTpPortConAt['ts-pool'])
+                        self.assertEqual(len(xpdrTpPortConAt['odtu-tpn-pool'][0]['tpn-pool']), 3)
+                        self.assertNotIn(1, xpdrTpPortConAt['odtu-tpn-pool'][0]['tpn-pool'])
+
+    def test_068_delete_100GE_service_3(self):
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service-100GE3"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Renderer service delete in progress',
+                      response['output']['configuration-response-common']['response-message'])
+        time.sleep(self.WAITING)
+
+    def test_069_delete_ODUC4_service(self):
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service1-ODUC4"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
-    def test_56_check_service_list(self):
-        response = test_utils.get_service_list_request("")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(len(res['service-list']['services']), 1)
-        time.sleep(2)
-
-    def test_57_check_no_interface_ODU4_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR2-NETWORK1-ODUC4")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-
-    def test_58_check_otn_topo_links(self):
-        self.test_22_check_otn_topo_OTUC4_links()
-
-    def test_59_check_otn_topo_tp(self):
-        response = test_utils.get_otn_topo_request()
-        res = response.json()
-        for node in res['network'][0]['node']:
+    def test_070_check_service_list(self):
+        response = test_utils.get_ordm_serv_list_request()
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['service-list']['services']), 1)
+
+    def test_071_check_no_interface_ODU4_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR2-NETWORK1-ODUC4')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    def test_072_check_otn_topo_links(self):
+        self.test_022_check_otn_topo_OTUC4_links()
+
+    def test_073_check_otn_topo_tp(self):
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        for node in response['network'][0]['node']:
             if node['node-id'] in ('XPDR-A2-XPDR2', 'XPDR-C2-XPDR2'):
                 tpList = node['ietf-network-topology:termination-point']
                 for tp in tpList:
@@ -1034,183 +1228,171 @@ class TransportPCEtesting(unittest.TestCase):
                         self.assertNotIn('org-openroadm-otn-network-topology:xpdr-tp-port-connection-attributes',
                                          dict.keys(tp))
 
-    def test_60_delete_OTUC4_service(self):
-        response = test_utils.service_delete_request("service1-OTUC4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_074_delete_OTUC4_service(self):
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service1-OTUC4"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
-    def test_61_get_no_service(self):
-        response = test_utils.get_service_list_request("")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-        res = response.json()
-        self.assertIn(
-            {"error-type": "application", "error-tag": "data-missing",
-             "error-message": "Request could not be completed because the relevant data model content does not exist"},
-            res['errors']['error'])
-        time.sleep(1)
-
-    def test_62_check_no_interface_OTUC4_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR2-NETWORK1-OTUC4")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-
-    def test_63_check_no_interface_OTSI_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR2-NETWORK1-755:768")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-
-    def test_64_check_no_interface_OTSIG_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR2-NETWORK1-OTSIGROUP-400G")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-
-    def test_65_getLinks_OtnTopology(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertNotIn('ietf-network-topology:link', res['network'][0])
-
-    def test_66_check_openroadm_topo_xpdra2(self):
-        response = test_utils.get_ordm_topo_request("node/XPDR-A2-XPDR2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        tp = res['node'][0]['ietf-network-topology:termination-point'][0]
+    def test_075_get_no_service(self):
+        response = test_utils.get_ordm_serv_list_request()
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+        self.assertIn(response['service-list'], (
+            {
+                "error-type": "protocol",
+                "error-tag": "data-missing",
+                "error-message":
+                    "Request could not be completed because the relevant data "
+                    "model content does not exist"
+            }, {
+                "error-type": "application",
+                "error-tag": "data-missing",
+                "error-message":
+                    "Request could not be completed because the relevant data "
+                    "model content does not exist"
+            }))
+
+    def test_076_check_no_interface_OTUC4_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR2-NETWORK1-OTUC4')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    def test_077_check_no_interface_OTSI_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR2-NETWORK1-755:768')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    def test_078_check_no_interface_OTSIG_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR2-NETWORK1-OTSIGROUP-400G')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    def test_079_getLinks_OtnTopology(self):
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertNotIn('ietf-network-topology:link', response['network'][0])
+
+    def test_080_check_openroadm_topo_xpdra2(self):
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'XPDR-A2-XPDR2', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        tp = response['node']['ietf-network-topology:termination-point'][0]
         self.assertEqual('XPDR2-NETWORK1', tp['tp-id'])
         self.assertNotIn('wavelength', dict.keys(
             tp['org-openroadm-network-topology:xpdr-network-attributes']))
-        time.sleep(3)
 
-    def test_67_check_openroadm_topology(self):
-        response = test_utils.get_ordm_topo_request("")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        links = res['network'][0]['ietf-network-topology:link']
+    def test_081_check_openroadm_topology(self):
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        links = response['network'][0]['ietf-network-topology:link']
         self.assertEqual(22, len(links), 'Topology should contain 22 links')
 
-    def test_68_connect_xprda2_1_N1_to_roadma_PP2(self):
-        response = test_utils.connect_xpdr_to_rdm_request("XPDR-A2", "1", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully',
-                      res["output"]["result"])
-        time.sleep(2)
-
-    def test_69_connect_roadma_PP2_to_xpdra2_1_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("XPDR-A2", "1", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully',
-                      res["output"]["result"])
-        time.sleep(2)
-
-    def test_70_connect_xprdc2_1_N1_to_roadmc_PP2(self):
-        response = test_utils.connect_xpdr_to_rdm_request("XPDR-C2", "1", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully',
-                      res["output"]["result"])
-        time.sleep(2)
-
-    def test_71_connect_roadmc_PP2_to_xpdrc2_1_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("XPDR-C2", "1", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully',
-                      res["output"]["result"])
-        time.sleep(2)
-
-
-# test service-create for 400GE service from xpdra2 to xpdrc2
-
-
-    def test_72_create_400GE_service(self):
-        self.cr_serv_sample_data["input"]["service-name"] = "service-400GE"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-rate"] = "400"
-        self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
-        self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-rate"] = "400"
-        del self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-name"]
-        del self.cr_serv_sample_data["input"]["service-a-end"]["tx-direction"][0]["port"]["port-device-name"]
-        del self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-name"]
-        del self.cr_serv_sample_data["input"]["service-a-end"]["rx-direction"][0]["port"]["port-device-name"]
-        del self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-name"]
-        del self.cr_serv_sample_data["input"]["service-z-end"]["tx-direction"][0]["port"]["port-device-name"]
-        del self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-name"]
-        del self.cr_serv_sample_data["input"]["service-z-end"]["rx-direction"][0]["port"]["port-device-name"]
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_082_connect_xpdra2_1_N1_to_roadma_PP2(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDR-A2', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
+
+    def test_083_connect_roadma_PP2_to_xpdra2_1_N1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDR-A2', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
+
+    def test_084_connect_xpdrc2_1_N1_to_roadmc_PP2(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDR-C2', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
+
+    def test_085_connect_roadmc_PP2_to_xpdrc2_1_N1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDR-C2', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
+
+    # test service-create for 400GE service from xpdra2 to xpdrc2
+    def test_086_create_400GE_service(self):
+        self.cr_serv_input_data["service-name"] = "service-400GE"
+        self.cr_serv_input_data["service-a-end"]["service-rate"] = "400"
+        self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
+        self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-name"] = "XPDR1-CLIENT1"
+        self.cr_serv_input_data["service-z-end"]["service-rate"] = "400"
+        del self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-name"]
+        del self.cr_serv_input_data["service-a-end"]["tx-direction"][0]["port"]["port-device-name"]
+        del self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-name"]
+        del self.cr_serv_input_data["service-a-end"]["rx-direction"][0]["port"]["port-device-name"]
+        del self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-name"]
+        del self.cr_serv_input_data["service-z-end"]["tx-direction"][0]["port"]["port-device-name"]
+        del self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-name"]
+        del self.cr_serv_input_data["service-z-end"]["rx-direction"][0]["port"]["port-device-name"]
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        time.sleep(self.WAITING)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
-    def test_73_get_400GE_service(self):
-        response = test_utils.get_service_list_request(
-            "services/service-400GE")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service-400GE')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'service')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
-
-    def test_74_check_xc1_roadma(self):
-        response = test_utils.check_netconf_node_request(
-            "ROADM-A1", "roadm-connections/SRG1-PP1-TXRX-DEG2-TTP-TXRX-755:768")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        # the following statement replaces self.assertDictContainsSubset deprecated in python 3.2
+    def test_087_get_400GE_service(self):
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service-400GE")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service-400GE')
+        self.assertEqual(response['services'][0]['connection-type'], 'service')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        time.sleep(1)
+
+    def test_088_check_xc1_roadma(self):
+        response = test_utils.check_node_attribute_request(
+            "ROADM-A1", "roadm-connections", "SRG1-PP1-TXRX-DEG2-TTP-TXRX-755:768")
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertDictEqual(
             dict({
                 'connection-name': 'SRG1-PP1-TXRX-DEG2-TTP-TXRX-761:768',
                 'opticalControlMode': 'gainLoss',
                 'target-output-power': -3.0
-            }, **res['roadm-connections'][0]),
-            res['roadm-connections'][0]
-        )
-        self.assertDictEqual(
-            {'src-if': 'SRG1-PP1-TXRX-nmc-755:768'},
-            res['roadm-connections'][0]['source'])
-        self.assertDictEqual(
-            {'dst-if': 'DEG2-TTP-TXRX-nmc-755:768'},
-            res['roadm-connections'][0]['destination'])
-        time.sleep(5)
-
-    def test_75_check_topo_xpdra2(self):
-        response = test_utils.get_ordm_topo_request("node/XPDR-A2-XPDR1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+            }, **response['roadm-connections'][0]), response['roadm-connections'][0])
+        self.assertDictEqual({'src-if': 'SRG1-PP1-TXRX-nmc-755:768'}, response['roadm-connections'][0]['source'])
+        self.assertDictEqual({'dst-if': 'DEG2-TTP-TXRX-nmc-755:768'}, response['roadm-connections'][0]['destination'])
+        time.sleep(1)
+
+    def test_089_check_topo_xpdra2(self):
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'XPDR-A2-XPDR1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'XPDR1-NETWORK1':
-                self.assertEqual({'frequency': 196.08125,
-                                  'width': 75},
-                                 ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength'])
+                self.assertEqual(
+                    196.08125,
+                    float(ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']['frequency']))
+                self.assertEqual(
+                    75.0,
+                    float(ele['org-openroadm-network-topology:xpdr-network-attributes']['wavelength']['width']))
             if ele['tp-id'] == 'XPDR1-CLIENT1':
                 self.assertNotIn('org-openroadm-network-topology:xpdr-client-attributes', dict.keys(ele))
-        time.sleep(3)
+        time.sleep(1)
 
-    def test_76_check_topo_roadma_SRG1(self):
-        response = test_utils.get_ordm_topo_request("node/ROADM-A1-SRG1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_090_check_topo_roadma_SRG1(self):
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADM-A1-SRG1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:srg-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[95], 0, "Index 1 should not be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'SRG1-PP1-TXRX':
                 freq_map = base64.b64decode(
@@ -1219,17 +1401,16 @@ class TransportPCEtesting(unittest.TestCase):
                 self.assertEqual(freq_map_array[95], 0, "Index 1 should not be available")
             if ele['tp-id'] == 'SRG1-PP2-TXRX':
                 self.assertNotIn('avail-freq-maps', dict.keys(ele))
-        time.sleep(3)
+        time.sleep(1)
 
-    def test_77_check_topo_roadma_DEG1(self):
-        response = test_utils.get_ordm_topo_request("node/ROADM-A1-DEG2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_091_check_topo_roadma_DEG1(self):
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADM-A1-DEG2', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         freq_map = base64.b64decode(
-            res['node'][0]['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
+            response['node']['org-openroadm-network-topology:degree-attributes']['avail-freq-maps'][0]['freq-map'])
         freq_map_array = [int(x) for x in freq_map]
         self.assertEqual(freq_map_array[95], 0, "Index 1 should not be available")
-        liste_tp = res['node'][0]['ietf-network-topology:termination-point']
+        liste_tp = response['node']['ietf-network-topology:termination-point']
         for ele in liste_tp:
             if ele['tp-id'] == 'DEG2-CTP-TXRX':
                 freq_map = base64.b64decode(
@@ -1241,13 +1422,12 @@ class TransportPCEtesting(unittest.TestCase):
                     ele['org-openroadm-network-topology:tx-ttp-attributes']['avail-freq-maps'][0]['freq-map'])
                 freq_map_array = [int(x) for x in freq_map]
                 self.assertEqual(freq_map_array[95], 0, "Index 1 should not be available")
-        time.sleep(3)
+        time.sleep(1)
 
-    def test_78_check_interface_400GE_CLIENT_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR1-CLIENT1-ETHERNET")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_092_check_interface_400GE_CLIENT_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR1-CLIENT1-ETHERNET')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-CLIENT1-ETHERNET',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/1/1-PLUG-CLIENT',
@@ -1255,16 +1435,16 @@ class TransportPCEtesting(unittest.TestCase):
                         'supporting-port': 'C1'
                         }
         input_dict_2 = {'speed': 400000}
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(input_dict_2, **res['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']),
-                             res['interface'][0]['org-openroadm-ethernet-interfaces:ethernet'])
-
-    def test_79_check_interface_OTSI_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR1-NETWORK1-755:768")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(
+            dict(input_dict_2, **response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet']),
+            response['interface'][0]['org-openroadm-ethernet-interfaces:ethernet'])
+
+    def test_093_check_interface_OTSI_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR1-NETWORK1-755:768')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-755:768',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/1/2-PLUG-NET',
@@ -1278,19 +1458,19 @@ class TransportPCEtesting(unittest.TestCase):
             "provision-mode": "explicit",
             "modulation-format": "dp-qam16"}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
-        self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi']),
-                             res['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi'])
-        self.assertDictEqual({"foic-type": "org-openroadm-common-optical-channel-types:foic4.8", "iid": [1, 2, 3, 4]},
-                             res['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi']['flexo'])
-
-    def test_80_check_interface_OTSI_GROUP_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR1-NETWORK1-OTSIGROUP-400G")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
+        self.assertDictEqual(
+            dict(input_dict_2, **response['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi']),
+            response['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi'])
+        self.assertDictEqual(
+            {"foic-type": "org-openroadm-common-optical-channel-types:foic4.8", "iid": [1, 2, 3, 4]},
+            response['interface'][0]['org-openroadm-optical-tributary-signal-interfaces:otsi']['flexo'])
+
+    def test_094_check_interface_OTSI_GROUP_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR1-NETWORK1-OTSIGROUP-400G')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-OTSIGROUP-400G',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/1/2-PLUG-NET',
@@ -1300,17 +1480,16 @@ class TransportPCEtesting(unittest.TestCase):
         input_dict_2 = {"group-id": 1,
                         "group-rate": "org-openroadm-common-optical-channel-types:R400G-otsi"}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otsi-group-interfaces:otsi-group']),
-                             res['interface'][0]['org-openroadm-otsi-group-interfaces:otsi-group'])
-
-    def test_81_check_interface_OTUC4_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR1-NETWORK1-OTUC4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+                                  **response['interface'][0]['org-openroadm-otsi-group-interfaces:otsi-group']),
+                             response['interface'][0]['org-openroadm-otsi-group-interfaces:otsi-group'])
+
+    def test_095_check_interface_OTUC4_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR1-NETWORK1-OTUC4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-OTUC4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/1/2-PLUG-NET',
@@ -1327,17 +1506,16 @@ class TransportPCEtesting(unittest.TestCase):
                         "otucn-n-rate": 4,
                         "degm-intervals": 2}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-otu-interfaces:otu']),
-                             res['interface'][0]['org-openroadm-otn-otu-interfaces:otu'])
-
-    def test_82_check_interface_ODUC4_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR1-NETWORK1-ODUC4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+                                  **response['interface'][0]['org-openroadm-otn-otu-interfaces:otu']),
+                             response['interface'][0]['org-openroadm-otn-otu-interfaces:otu'])
+
+    def test_096_check_interface_ODUC4_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR1-NETWORK1-ODUC4')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-ODUC4',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/1/2-PLUG-NET',
@@ -1355,21 +1533,20 @@ class TransportPCEtesting(unittest.TestCase):
                         "oducn-n-rate": 4}
         input_dict_3 = {"exp-payload-type": "22", "payload-type": "22"}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(dict(input_dict_3,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
-        self.assertEqual('XPDR1-NETWORK1-OTUC4', res['interface'][0]['supporting-interface-list'][0])
-
-    def test_82a_check_interface_ODUFLEX_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR1-NETWORK1-ODUFLEX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+        self.assertEqual('XPDR1-NETWORK1-OTUC4', response['interface'][0]['supporting-interface-list'][0])
+
+    def test_097_check_interface_ODUFLEX_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR1-NETWORK1-ODUFLEX')
+        self.assertEqual(response['status_code'], requests.codes.ok)
         input_dict_1 = {'name': 'XPDR1-NETWORK1-ODUFLEX',
                         'administrative-state': 'inService',
                         'supporting-circuit-pack-name': '1/1/2-PLUG-NET',
@@ -1389,110 +1566,115 @@ class TransportPCEtesting(unittest.TestCase):
         input_dict_3 = {"exp-payload-type": "32", "payload-type": "32"}
         input_dict_4 = {'trib-port-number': 1}
 
-        self.assertDictEqual(dict(input_dict_1, **res['interface'][0]),
-                             res['interface'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['interface'][0]),
+                             response['interface'][0])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'])
         self.assertDictEqual(dict(input_dict_3,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu']),
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['opu'])
         self.assertDictEqual(dict(input_dict_4,
-                                  **res['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
+                                  **response['interface'][0]['org-openroadm-otn-odu-interfaces:odu'][
                                       'parent-odu-allocation']),
-                             res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation'])
-        self.assertIn('1.1', res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
+                             response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation'])
+        self.assertIn('1.1', response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
                       ['opucn-trib-slots'])
-        self.assertIn('1.20', res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
+        self.assertIn('1.20', response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
                       ['opucn-trib-slots'])
-        self.assertIn('2.1', res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
+        self.assertIn('2.1', response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
                       ['opucn-trib-slots'])
-        self.assertIn('2.20', res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
+        self.assertIn('2.20', response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
                       ['opucn-trib-slots'])
-        self.assertIn('3.1', res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
+        self.assertIn('3.1', response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
                       ['opucn-trib-slots'])
-        self.assertIn('3.20', res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
+        self.assertIn('3.20', response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
                       ['opucn-trib-slots'])
-        self.assertIn('4.1', res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
+        self.assertIn('4.1', response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
                       ['opucn-trib-slots'])
-        self.assertIn('4.20', res['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
+        self.assertIn('4.20', response['interface'][0]['org-openroadm-otn-odu-interfaces:odu']['parent-odu-allocation']
                       ['opucn-trib-slots'])
-        self.assertEqual('XPDR1-NETWORK1-ODUC4', res['interface'][0]['supporting-interface-list'][0])
-
-    def test_83_delete_400GE_service(self):
-        response = test_utils.service_delete_request("service-400GE")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.assertEqual('XPDR1-NETWORK1-ODUC4', response['interface'][0]['supporting-interface-list'][0])
+
+    def test_098_delete_400GE_service(self):
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service-400GE"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
-    def test_84_get_no_service(self):
-        response = test_utils.get_service_list_request("")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-        res = response.json()
-        self.assertIn(
-            {"error-type": "application", "error-tag": "data-missing",
-             "error-message": "Request could not be completed because the relevant data model content does not exist"},
-            res['errors']['error'])
+    def test_099_get_no_service(self):
+        response = test_utils.get_ordm_serv_list_request()
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+        self.assertIn(response['service-list'], (
+            {
+                "error-type": "protocol",
+                "error-tag": "data-missing",
+                "error-message":
+                    "Request could not be completed because the relevant data "
+                    "model content does not exist"
+            }, {
+                "error-type": "application",
+                "error-tag": "data-missing",
+                "error-message":
+                    "Request could not be completed because the relevant data "
+                    "model content does not exist"
+            }))
         time.sleep(1)
 
-    def test_85_check_no_interface_ODUC4_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR1-NETWORK1-ODUC4")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-
-    def test_86_check_no_interface_OTUC4_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR1-NETWORK1-OTUC4")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-
-    def test_87_check_no_interface_OTSI_GROUP_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR1-NETWORK1-OTSIGROUP-400G")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-
-    def test_88_check_no_interface_OTSI_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR1-NETWORK1-755:768")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-
-    def test_89_check_no_interface_400GE_CLIENT_xpdra2(self):
-        response = test_utils.check_netconf_node_request(
-            "XPDR-A2", "interface/XPDR1-CLIENT1-ETHERNET")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-
-    def test_90_disconnect_xponders_from_roadm(self):
-        url = "{}/config/ietf-network:networks/network/openroadm-topology/ietf-network-topology:link/"
-        response = test_utils.get_ordm_topo_request("")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        links = res['network'][0]['ietf-network-topology:link']
+    def test_100_check_no_interface_ODUC4_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR1-NETWORK1-ODUC4')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    def test_101_check_no_interface_OTUC4_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR1-NETWORK1-OTUC4')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    def test_102_check_no_interface_OTSI_GROUP_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR1-NETWORK1-OTSIGROUP-400G')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    def test_103_check_no_interface_OTSI_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR1-NETWORK1-755:768')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    def test_104_check_no_interface_400GE_CLIENT_xpdra2(self):
+        response = test_utils.check_node_attribute_request(
+            'XPDR-A2', 'interface', 'XPDR1-CLIENT1-ETHERNET')
+        self.assertEqual(response['status_code'], requests.codes.conflict)
+
+    def test_105_disconnect_xponders_from_roadm(self):
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        links = response['network'][0]['ietf-network-topology:link']
         for link in links:
             if link["org-openroadm-common-network:link-type"] in ('XPONDER-OUTPUT', 'XPONDER-INPUT'):
-                link_name = link["link-id"]
-                response = test_utils.delete_request(url+link_name)
-                self.assertEqual(response.status_code, requests.codes.ok)
+                response = test_utils.del_ietf_network_link_request(
+                    'openroadm-topology', link['link-id'], 'config')
+                self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
-    def test_91_disconnect_xpdra2(self):
+    def test_106_disconnect_xpdra2(self):
         response = test_utils.unmount_device("XPDR-A2")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
-    def test_92_disconnect_xpdrc2(self):
+    def test_107_disconnect_xpdrc2(self):
         response = test_utils.unmount_device("XPDR-C2")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
-    def test_93_disconnect_roadmA(self):
+    def test_108_disconnect_roadmA(self):
         response = test_utils.unmount_device("ROADM-A1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
-    def test_94_disconnect_roadmC(self):
+    def test_109_disconnect_roadmC(self):
         response = test_utils.unmount_device("ROADM-C1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
 
 if __name__ == "__main__":
diff --git a/tests/transportpce_tests/hybrid/test03_autonomous_reroute.py b/tests/transportpce_tests/hybrid/test03_autonomous_reroute.py
new file mode 100644 (file)
index 0000000..e51f290
--- /dev/null
@@ -0,0 +1,1257 @@
+#!/usr/bin/env python
+
+##############################################################################
+# Copyright (c) 2022 Orange, Inc. and others.  All rights reserved.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+# pylint: disable=invalid-name
+# pylint: disable=no-member
+# pylint: disable=too-many-public-methods
+# pylint: disable=too-many-lines
+
+import unittest
+import time
+import requests
+# pylint: disable=wrong-import-order
+import sys
+
+sys.path.append('transportpce_tests/common/')
+# pylint: disable=wrong-import-position
+# pylint: disable=import-error
+import test_utils  # nopep8
+
+
+class TransportPCEtesting(unittest.TestCase):
+    processes = None
+    WAITING = 20  # nominal value is 300
+    NODE_VERSION_221 = '2.2.1'
+    NODE_VERSION_71 = '7.1'
+
+    cr_serv_input_data = {
+        "sdnc-request-header": {
+            "request-id": "request-1",
+            "rpc-action": "service-create",
+            "request-system-id": "appname"
+        },
+        "service-name": "service1",
+        "common-id": "commonId",
+        "connection-type": "service",
+        "service-resiliency": {
+            "resiliency": "org-openroadm-common-service-types:restorable"
+        },
+        "service-a-end": {
+            "service-rate": "400",
+            "node-id": "XPDR-A2",
+            "service-format": "Ethernet",
+            "clli": "NodeA",
+            "tx-direction": [
+                {
+                    "index": 0
+                }
+            ],
+            "rx-direction": [
+                {
+                    "index": 0
+                }
+            ],
+            "optic-type": "gray"
+        },
+        "service-z-end": {
+            "service-rate": "400",
+            "node-id": "XPDR-C2",
+            "service-format": "Ethernet",
+            "clli": "NodeC",
+            "tx-direction": [
+                {
+                    "index": 0
+                }
+            ],
+            "rx-direction": [
+                {
+                    "index": 0
+                }
+            ],
+            "optic-type": "gray"
+        },
+        "due-date": "2018-06-15T00:00:01Z",
+        "operator-contact": "pw1234"
+    }
+
+    del_serv_input_data = {
+        "sdnc-request-header": {
+            "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
+            "rpc-action": "service-delete",
+            "request-system-id": "appname",
+            "notification-url": "http://localhost:8585/NotificationServer/notify"},
+        "service-delete-req-info": {
+            "service-name": "TBD",
+            "tail-retention": "no"}
+    }
+
+    service_path_service_1_AtoZ = [
+        {
+            "id": "16",
+            "resource": {
+                "state": "inService",
+                "tp-id": "SRG1-CP-TXRX",
+                "tp-node-id": "ROADM-C1-SRG1"
+            }
+        },
+        {
+            "id": "17",
+            "resource": {
+                "state": "inService",
+                "node-id": "ROADM-C1-SRG1"
+            }
+        },
+        {
+            "id": "14",
+            "resource": {
+                "state": "inService",
+                "tp-id": "DEG1-CTP-TXRX",
+                "tp-node-id": "ROADM-C1-DEG1"
+            }
+        },
+        {
+            "id": "15",
+            "resource": {
+                "state": "inService",
+                "link-id": "ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX"
+            }
+        },
+        {
+            "id": "18",
+            "resource": {
+                "state": "inService",
+                "tp-id": "SRG1-PP1-TXRX",
+                "tp-node-id": "ROADM-C1-SRG1"
+            }
+        },
+        {
+            "id": "19",
+            "resource": {
+                "state": "inService",
+                "link-id": "ROADM-C1-SRG1-SRG1-PP1-TXRXtoXPDR-C2-XPDR1-XPDR1-NETWORK1"
+            }
+        },
+        {
+            "id": "1",
+            "resource": {
+                "state": "inService",
+                "node-id": "XPDR-A2-XPDR1"
+            }
+        },
+        {
+            "id": "2",
+            "resource": {
+                "state": "inService",
+                "tp-id": "XPDR1-NETWORK1",
+                "tp-node-id": "XPDR-A2-XPDR1"
+            }
+        },
+        {
+            "id": "0",
+            "resource": {
+                "state": "inService",
+                "tp-id": "XPDR1-CLIENT1",
+                "tp-node-id": "XPDR-A2-XPDR1"
+            }
+        },
+        {
+            "id": "5",
+            "resource": {
+                "state": "inService",
+                "node-id": "ROADM-A1-SRG1"
+            }
+        },
+        {
+            "id": "6",
+            "resource": {
+                "state": "inService",
+                "tp-id": "SRG1-CP-TXRX",
+                "tp-node-id": "ROADM-A1-SRG1"
+            }
+        },
+        {
+            "id": "3",
+            "resource": {
+                "state": "inService",
+                "link-id": "XPDR-A2-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP1-TXRX"
+            }
+        },
+        {
+            "id": "4",
+            "resource": {
+                "state": "inService",
+                "tp-id": "SRG1-PP1-TXRX",
+                "tp-node-id": "ROADM-A1-SRG1"
+            }
+        },
+        {
+            "id": "9",
+            "resource": {
+                "state": "inService",
+                "node-id": "ROADM-A1-DEG2"
+            }
+        },
+        {
+            "id": "7",
+            "resource": {
+                "state": "inService",
+                "link-id": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX"
+            }
+        },
+        {
+            "id": "8",
+            "resource": {
+                "state": "inService",
+                "tp-id": "DEG2-CTP-TXRX",
+                "tp-node-id": "ROADM-A1-DEG2"
+            }
+        },
+        {
+            "id": "20",
+            "resource": {
+                "state": "inService",
+                "tp-id": "XPDR1-NETWORK1",
+                "tp-node-id": "XPDR-C2-XPDR1"
+            }
+        },
+        {
+            "id": "12",
+            "resource": {
+                "state": "inService",
+                "tp-id": "DEG1-TTP-TXRX",
+                "tp-node-id": "ROADM-C1-DEG1"
+            }
+        },
+        {
+            "id": "13",
+            "resource": {
+                "state": "inService",
+                "node-id": "ROADM-C1-DEG1"
+            }
+        },
+        {
+            "id": "10",
+            "resource": {
+                "state": "inService",
+                "tp-id": "DEG2-TTP-TXRX",
+                "tp-node-id": "ROADM-A1-DEG2"
+            }
+        },
+        {
+            "id": "21",
+            "resource": {
+                "state": "inService",
+                "node-id": "XPDR-C2-XPDR1"
+            }
+        },
+        {
+            "id": "11",
+            "resource": {
+                "state": "inService",
+                "link-id": "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX"
+            }
+        },
+        {
+            "id": "22",
+            "resource": {
+                "state": "inService",
+                "tp-id": "XPDR1-CLIENT1",
+                "tp-node-id": "XPDR-C2-XPDR1"
+            }
+        }
+    ]
+
+    service_path_service_1_rerouted_AtoZ = [
+        {
+            "id": "27",
+            "resource": {
+                "state": "inService",
+                "link-id": "ROADM-C1-SRG1-SRG1-PP1-TXRXtoXPDR-C2-XPDR1-XPDR1-NETWORK1"
+            }
+        },
+        {
+            "id": "28",
+            "resource": {
+                "state": "inService",
+                "tp-id": "XPDR1-NETWORK1",
+                "tp-node-id": "XPDR-C2-XPDR1"
+            }
+        },
+        {
+            "id": "25",
+            "resource": {
+                "state": "inService",
+                "node-id": "ROADM-C1-SRG1"
+            }
+        },
+        {
+            "id": "26",
+            "resource": {
+                "state": "inService",
+                "tp-id": "SRG1-PP1-TXRX",
+                "tp-node-id": "ROADM-C1-SRG1"
+            }
+        },
+        {
+            "id": "29",
+            "resource": {
+                "state": "inService",
+                "node-id": "XPDR-C2-XPDR1"
+            }
+        },
+        {
+            "id": "30",
+            "resource": {
+                "state": "inService",
+                "tp-id": "XPDR1-CLIENT1",
+                "tp-node-id": "XPDR-C2-XPDR1"
+            }
+        },
+        {
+            "id": "12",
+            "resource": {
+                "state": "inService",
+                "tp-id": "DEG1-TTP-TXRX",
+                "tp-node-id": "ROADM-B1-DEG1"
+            }
+        },
+        {
+            "id": "13",
+            "resource": {
+                "state": "inService",
+                "node-id": "ROADM-B1-DEG1"
+            }
+        },
+        {
+            "id": "10",
+            "resource": {
+                "state": "inService",
+                "tp-id": "DEG1-TTP-TXRX",
+                "tp-node-id": "ROADM-A1-DEG1"
+            }
+        },
+        {
+            "id": "11",
+            "resource": {
+                "state": "inService",
+                "link-id": "ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX"
+            }
+        },
+        {
+            "id": "16",
+            "resource": {
+                "state": "inService",
+                "tp-id": "DEG2-CTP-TXRX",
+                "tp-node-id": "ROADM-B1-DEG2"
+            }
+        },
+        {
+            "id": "17",
+            "resource": {
+                "state": "inService",
+                "node-id": "ROADM-B1-DEG2"
+            }
+        },
+        {
+            "id": "14",
+            "resource": {
+                "state": "inService",
+                "tp-id": "DEG1-CTP-TXRX",
+                "tp-node-id": "ROADM-B1-DEG1"
+            }
+        },
+        {
+            "id": "15",
+            "resource": {
+                "state": "inService",
+                "link-id": "ROADM-B1-DEG1-DEG1-CTP-TXRXtoROADM-B1-DEG2-DEG2-CTP-TXRX"
+            }
+        },
+        {
+            "id": "18",
+            "resource": {
+                "state": "inService",
+                "tp-id": "DEG2-TTP-TXRX",
+                "tp-node-id": "ROADM-B1-DEG2"
+            }
+        },
+        {
+            "id": "19",
+            "resource": {
+                "state": "inService",
+                "link-id": "ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX"
+            }
+        },
+        {
+            "id": "1",
+            "resource": {
+                "state": "inService",
+                "node-id": "XPDR-A2-XPDR1"
+            }
+        },
+        {
+            "id": "2",
+            "resource": {
+                "state": "inService",
+                "tp-id": "XPDR1-NETWORK1",
+                "tp-node-id": "XPDR-A2-XPDR1"
+            }
+        },
+        {
+            "id": "0",
+            "resource": {
+                "state": "inService",
+                "tp-id": "XPDR1-CLIENT1",
+                "tp-node-id": "XPDR-A2-XPDR1"
+            }
+        },
+        {
+            "id": "5",
+            "resource": {
+                "state": "inService",
+                "node-id": "ROADM-A1-SRG1"
+            }
+        },
+        {
+            "id": "6",
+            "resource": {
+                "state": "inService",
+                "tp-id": "SRG1-CP-TXRX",
+                "tp-node-id": "ROADM-A1-SRG1"
+            }
+        },
+        {
+            "id": "3",
+            "resource": {
+                "state": "inService",
+                "link-id": "XPDR-A2-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP1-TXRX"
+            }
+        },
+        {
+            "id": "4",
+            "resource": {
+                "state": "inService",
+                "tp-id": "SRG1-PP1-TXRX",
+                "tp-node-id": "ROADM-A1-SRG1"
+            }
+        },
+        {
+            "id": "9",
+            "resource": {
+                "state": "inService",
+                "node-id": "ROADM-A1-DEG1"
+            }
+        },
+        {
+            "id": "7",
+            "resource": {
+                "state": "inService",
+                "link-id": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG1-DEG1-CTP-TXRX"
+            }
+        },
+        {
+            "id": "8",
+            "resource": {
+                "state": "inService",
+                "tp-id": "DEG1-CTP-TXRX",
+                "tp-node-id": "ROADM-A1-DEG1"
+            }
+        },
+        {
+            "id": "20",
+            "resource": {
+                "state": "inService",
+                "tp-id": "DEG2-TTP-TXRX",
+                "tp-node-id": "ROADM-C1-DEG2"
+            }
+        },
+        {
+            "id": "23",
+            "resource": {
+                "state": "inService",
+                "link-id": "ROADM-C1-DEG2-DEG2-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX"
+            }
+        },
+        {
+            "id": "24",
+            "resource": {
+                "state": "inService",
+                "tp-id": "SRG1-CP-TXRX",
+                "tp-node-id": "ROADM-C1-SRG1"
+            }
+        },
+        {
+            "id": "21",
+            "resource": {
+                "state": "inService",
+                "node-id": "ROADM-C1-DEG2"
+            }
+        },
+        {
+            "id": "22",
+            "resource": {
+                "state": "inService",
+                "tp-id": "DEG2-CTP-TXRX",
+                "tp-node-id": "ROADM-C1-DEG2"
+            }
+        }
+    ]
+
+    service_path_service_2_AtoZ = [
+        {
+            "id": "16",
+            "resource": {
+                "state": "inService",
+                "tp-id": "SRG1-CP-TXRX",
+                "tp-node-id": "ROADM-C1-SRG1"
+            }
+        },
+        {
+            "id": "17",
+            "resource": {
+                "state": "inService",
+                "node-id": "ROADM-C1-SRG1"
+            }
+        },
+        {
+            "id": "14",
+            "resource": {
+                "state": "inService",
+                "tp-id": "DEG1-CTP-TXRX",
+                "tp-node-id": "ROADM-C1-DEG1"
+            }
+        },
+        {
+            "id": "15",
+            "resource": {
+                "state": "inService",
+                "link-id": "ROADM-C1-DEG1-DEG1-CTP-TXRXtoROADM-C1-SRG1-SRG1-CP-TXRX"
+            }
+        },
+        {
+            "id": "18",
+            "resource": {
+                "state": "inService",
+                "tp-id": "SRG1-PP2-TXRX",
+                "tp-node-id": "ROADM-C1-SRG1"
+            }
+        },
+        {
+            "id": "19",
+            "resource": {
+                "state": "inService",
+                "link-id": "ROADM-C1-SRG1-SRG1-PP2-TXRXtoXPDR-C2-XPDR3-XPDR3-NETWORK1"
+            }
+        },
+        {
+            "id": "1",
+            "resource": {
+                "state": "inService",
+                "node-id": "XPDR-A2-XPDR3"
+            }
+        },
+        {
+            "id": "2",
+            "resource": {
+                "state": "inService",
+                "tp-id": "XPDR3-NETWORK1",
+                "tp-node-id": "XPDR-A2-XPDR3"
+            }
+        },
+        {
+            "id": "0",
+            "resource": {
+                "state": "inService",
+                "tp-id": "XPDR3-CLIENT1",
+                "tp-node-id": "XPDR-A2-XPDR3"
+            }
+        },
+        {
+            "id": "5",
+            "resource": {
+                "state": "inService",
+                "node-id": "ROADM-A1-SRG1"
+            }
+        },
+        {
+            "id": "6",
+            "resource": {
+                "state": "inService",
+                "tp-id": "SRG1-CP-TXRX",
+                "tp-node-id": "ROADM-A1-SRG1"
+            }
+        },
+        {
+            "id": "3",
+            "resource": {
+                "state": "inService",
+                "link-id": "XPDR-A2-XPDR3-XPDR3-NETWORK1toROADM-A1-SRG1-SRG1-PP2-TXRX"
+            }
+        },
+        {
+            "id": "4",
+            "resource": {
+                "state": "inService",
+                "tp-id": "SRG1-PP2-TXRX",
+                "tp-node-id": "ROADM-A1-SRG1"
+            }
+        },
+        {
+            "id": "9",
+            "resource": {
+                "state": "inService",
+                "node-id": "ROADM-A1-DEG2"
+            }
+        },
+        {
+            "id": "7",
+            "resource": {
+                "state": "inService",
+                "link-id": "ROADM-A1-SRG1-SRG1-CP-TXRXtoROADM-A1-DEG2-DEG2-CTP-TXRX"
+            }
+        },
+        {
+            "id": "8",
+            "resource": {
+                "state": "inService",
+                "tp-id": "DEG2-CTP-TXRX",
+                "tp-node-id": "ROADM-A1-DEG2"
+            }
+        },
+        {
+            "id": "20",
+            "resource": {
+                "state": "inService",
+                "tp-id": "XPDR3-NETWORK1",
+                "tp-node-id": "XPDR-C2-XPDR3"
+            }
+        },
+        {
+            "id": "12",
+            "resource": {
+                "state": "inService",
+                "tp-id": "DEG1-TTP-TXRX",
+                "tp-node-id": "ROADM-C1-DEG1"
+            }
+        },
+        {
+            "id": "13",
+            "resource": {
+                "state": "inService",
+                "node-id": "ROADM-C1-DEG1"
+            }
+        },
+        {
+            "id": "10",
+            "resource": {
+                "state": "inService",
+                "tp-id": "DEG2-TTP-TXRX",
+                "tp-node-id": "ROADM-A1-DEG2"
+            }
+        },
+        {
+            "id": "21",
+            "resource": {
+                "state": "inService",
+                "node-id": "XPDR-C2-XPDR3"
+            }
+        },
+        {
+            "id": "11",
+            "resource": {
+                "state": "inService",
+                "link-id": "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX"
+            }
+        },
+        {
+            "id": "22",
+            "resource": {
+                "state": "inService",
+                "tp-id": "XPDR3-CLIENT1",
+                "tp-node-id": "XPDR-C2-XPDR3"
+            }
+        }
+    ]
+
+    pm_handling_degrade_body = {
+        "rpc-action": "set",
+        "pm-to-be-set-or-created": {
+            "current-pm-entry": [
+                {
+                    "pm-resource-instance": "/org-openroadm-device:org-openroadm-device/org-openroadm-device"
+                                            ":interface[org-openroadm-device:name='OTS-DEG2-TTP-TXRX']",
+                    "pm-resource-type": "interface",
+                    "pm-resource-type-extension": "",
+                    "current-pm": [
+                        {
+                            "type": "opticalPowerInput",
+                            "extension": "",
+                            "location": "nearEnd",
+                            "direction": "rx",
+                            "measurement": [
+                                {
+                                    "granularity": "15min",
+                                    "pmParameterValue": -30,
+                                    "pmParameterUnit": "dBm",
+                                    "validity": "complete"
+                                },
+                                {
+                                    "granularity": "24Hour",
+                                    "pmParameterValue": -21.3,
+                                    "pmParameterUnit": "dBm",
+                                    "validity": "complete"
+                                }
+                            ]
+                        }
+                    ]
+                }
+            ]
+        }
+    }
+
+    pm_handling_recover_body = {
+        "rpc-action": "clear",
+        "pm-to-get-clear-or-delete": {
+            "current-pm-entry": [
+                {
+                    "pm-resource-instance": "/org-openroadm-device:org-openroadm-device/org-openroadm-device"
+                                            ":interface[org-openroadm-device:name='OTS-DEG2-TTP-TXRX']",
+                    "pm-resource-type": "interface",
+                    "pm-resource-type-extension": "",
+                    "current-pm": [
+                        {
+                            "type": "opticalPowerInput",
+                            "extension": "",
+                            "location": "nearEnd",
+                            "direction": "rx"
+                        }
+                    ]
+                }
+            ]
+        }
+    }
+
+    @classmethod
+    def setUpClass(cls):
+        cls.processes = test_utils.start_tpce()
+        cls.processes = test_utils.start_sims([('xpdra2', cls.NODE_VERSION_71),
+                                               ('roadma', cls.NODE_VERSION_221),
+                                               ('roadmb', cls.NODE_VERSION_221),
+                                               ('roadmc', cls.NODE_VERSION_221),
+                                               ('xpdrc2', cls.NODE_VERSION_71)])
+
+    @classmethod
+    def tearDownClass(cls):
+        # pylint: disable=not-an-iterable
+        for process in cls.processes:
+            test_utils.shutdown_process(process)
+        print("all processes killed")
+
+    def setUp(self):
+        time.sleep(1)
+
+    def test_01_connect_xpdra2(self):
+        response = test_utils.mount_device("XPDR-A2", ('xpdra2', self.NODE_VERSION_71))
+        self.assertEqual(response.status_code,
+                         requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+
+    def test_02_connect_xpdrc2(self):
+        response = test_utils.mount_device("XPDR-C2", ('xpdrc2', self.NODE_VERSION_71))
+        self.assertEqual(response.status_code,
+                         requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+
+    def test_03_connect_rdma(self):
+        response = test_utils.mount_device("ROADM-A1", ('roadma', self.NODE_VERSION_221))
+        self.assertEqual(response.status_code,
+                         requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+
+    def test_04_connect_rdmb(self):
+        response = test_utils.mount_device("ROADM-B1", ('roadmb', self.NODE_VERSION_221))
+        self.assertEqual(response.status_code,
+                         requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+
+    def test_05_connect_rdmc(self):
+        response = test_utils.mount_device("ROADM-C1", ('roadmc', self.NODE_VERSION_221))
+        self.assertEqual(response.status_code,
+                         requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+
+    def test_06_connect_xpdra2_1_N1_to_roadma_PP1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDR-A2', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
+
+    def test_07_connect_roadma_PP1_to_xpdra2_1_N1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDR-A2', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
+
+    def test_08_connect_xpdrc2_1_N1_to_roadmc_PP1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDR-C2', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
+
+    def test_09_connect_roadmc_PP1_to_xpdrc2_1_N1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDR-C2', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
+
+    def test_10_add_omsAttributes_roadma_roadmc(self):
+        # Config ROADMA-ROADMC oms-attributes
+        data = {"span": {
+            "auto-spanloss": "true",
+            "spanloss-base": 11.4,
+            "spanloss-current": 12,
+            "engineered-spanloss": 12.2,
+            "link-concatenation": [{
+                "SRLG-Id": 0,
+                "fiber-type": "smf",
+                "SRLG-length": 100000,
+                "pmd": 0.5}]}}
+        response = test_utils.add_oms_attr_request("ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX", data)
+        self.assertEqual(response.status_code, requests.codes.created)
+
+    def test_11_add_omsAttributes_roadmc_roadma(self):
+        # Config ROADMC-ROADMA oms-attributes
+        data = {"span": {
+            "auto-spanloss": "true",
+            "spanloss-base": 11.4,
+            "spanloss-current": 12,
+            "engineered-spanloss": 12.2,
+            "link-concatenation": [{
+                "SRLG-Id": 0,
+                "fiber-type": "smf",
+                "SRLG-length": 100000,
+                "pmd": 0.5}]}}
+        response = test_utils.add_oms_attr_request("ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX", data)
+        self.assertEqual(response.status_code, requests.codes.created)
+
+    # test service-create for Eth service from xpdr to xpdr with service-resiliency
+    def test_12_create_eth_service1_with_service_resiliency_restorable(self):
+        self.cr_serv_input_data["service-name"] = "service1"
+        response = test_utils.transportpce_api_rpc_request('org-openroadm-service', 'service-create',
+                                                           self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('PCE calculation in progress',
+                      response['output']['configuration-response-common']['response-message'])
+        time.sleep(self.WAITING)
+
+    def test_13_get_eth_service1(self):
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service1')
+        self.assertEqual(response['services'][0]['connection-type'], 'service')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        self.assertEqual(response['services'][0]['service-resiliency']['resiliency'],
+                         'org-openroadm-common-service-types:restorable')
+        time.sleep(1)
+
+    # Degrade ROADM-A1-ROADM-C1 link
+    def test_14_set_pm_ROADMA_OTS_DEG2_TTP_TXRX_OpticalPowerInput(self):
+        self.assertTrue(test_utils.sims_update_pm_interact(('roadma', self.NODE_VERSION_221),
+                                                           self.pm_handling_degrade_body))
+        time.sleep(2)
+
+    def test_15_get_eth_service1(self):
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['operational-state'], 'outOfService')
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service1')
+        self.assertEqual(response['services'][0]['connection-type'], 'service')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        self.assertEqual(response['services'][0]['service-resiliency']['resiliency'],
+                         'org-openroadm-common-service-types:restorable')
+        time.sleep(1)
+
+    def test_16_service_reroute_service1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-reroute',
+            {
+                "sdnc-request-header": {
+                    "request-id": "request-1",
+                    "rpc-action": "service-reroute",
+                    "request-system-id": "appname"
+                },
+                "service-name": "service1",
+                "service-resiliency": {
+                    "resiliency": "org-openroadm-common-service-types:restorable"
+                }
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('500', response['output']['configuration-response-common']['response-code'])
+        self.assertIn('No path available by PCE',
+                      response['output']['configuration-response-common']['response-message'])
+        time.sleep(2)
+
+    # Restore ROADM-A1-ROADM-C1 link
+    def test_17_clear_pm_ROADMA_OTS_DEG2_TTP_TXRX_OpticalPowerInput(self):
+        self.assertTrue(test_utils.sims_update_pm_interact(('roadma', self.NODE_VERSION_221),
+                                                           self.pm_handling_recover_body))
+        time.sleep(2)
+
+    def test_18_get_eth_service1(self):
+        self.test_13_get_eth_service1()
+
+    def test_19_connect_xpdra2_3_N1_to_roadma_PP2(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDR-A2', 'xpdr-num': '3', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
+        time.sleep(2)
+
+    def test_20_connect_roadma_PP2_to_xpdra2_3_N1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDR-A2', 'xpdr-num': '3', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
+        time.sleep(2)
+
+    def test_21_connect_xpdrc2_3_N1_to_roadmc_PP2(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDR-C2', 'xpdr-num': '3', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
+        time.sleep(2)
+
+    def test_22_connect_roadmc_PP2_to_xpdrc2_3_N1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDR-C2', 'xpdr-num': '3', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
+        time.sleep(2)
+
+    def test_23_add_omsAttributes_roadma_roadmb(self):
+        # Config ROADMA-ROADMB oms-attributes
+        data = {"span": {
+            "auto-spanloss": "true",
+            "spanloss-base": 11.4,
+            "spanloss-current": 12,
+            "engineered-spanloss": 12.2,
+            "link-concatenation": [{
+                "SRLG-Id": 0,
+                "fiber-type": "smf",
+                "SRLG-length": 100000,
+                "pmd": 0.5}]}}
+        response = test_utils.add_oms_attr_request("ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX", data)
+        self.assertEqual(response.status_code, requests.codes.created)
+
+    def test_24_add_omsAttributes_roadmb_roadma(self):
+        # Config ROADMB-ROADMA oms-attributes
+        data = {"span": {
+            "auto-spanloss": "true",
+            "spanloss-base": 11.4,
+            "spanloss-current": 12,
+            "engineered-spanloss": 12.2,
+            "link-concatenation": [{
+                "SRLG-Id": 0,
+                "fiber-type": "smf",
+                "SRLG-length": 100000,
+                "pmd": 0.5}]}}
+        response = test_utils.add_oms_attr_request("ROADM-B1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG1-DEG1-TTP-TXRX", data)
+        self.assertEqual(response.status_code, requests.codes.created)
+
+    def test_25_add_omsAttributes_roadmb_roadmc(self):
+        # Config ROADMB-ROADMC oms-attributes
+        data = {"span": {
+            "auto-spanloss": "true",
+            "spanloss-base": 11.4,
+            "spanloss-current": 12,
+            "engineered-spanloss": 12.2,
+            "link-concatenation": [{
+                "SRLG-Id": 0,
+                "fiber-type": "smf",
+                "SRLG-length": 100000,
+                "pmd": 0.5}]}}
+        response = test_utils.add_oms_attr_request("ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX", data)
+        self.assertEqual(response.status_code, requests.codes.created)
+
+    def test_26_add_omsAttributes_roadmc_roadmb(self):
+        # Config ROADMC-ROADMB oms-attributes
+        data = {"span": {
+            "auto-spanloss": "true",
+            "spanloss-base": 11.4,
+            "spanloss-current": 12,
+            "engineered-spanloss": 12.2,
+            "link-concatenation": [{
+                "SRLG-Id": 0,
+                "fiber-type": "smf",
+                "SRLG-length": 100000,
+                "pmd": 0.5}]}}
+        response = test_utils.add_oms_attr_request("ROADM-C1-DEG2-DEG2-TTP-TXRXtoROADM-B1-DEG2-DEG2-TTP-TXRX", data)
+        self.assertEqual(response.status_code, requests.codes.created)
+
+    def test_27_create_OTS_ROADMA_DEG1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-device-renderer', 'create-ots-oms',
+            {
+                'node-id': 'ROADM-A1',
+                'logical-connection-point': 'DEG1-TTP-TXRX'
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Interfaces OTS-DEG1-TTP-TXRX - OMS-DEG1-TTP-TXRX successfully created on node ROADM-A1',
+                      response["output"]["result"])
+
+    def test_28_create_OTS_ROADMC_DEG2(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-device-renderer', 'create-ots-oms',
+            {
+                'node-id': 'ROADM-C1',
+                'logical-connection-point': 'DEG2-TTP-TXRX'
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Interfaces OTS-DEG2-TTP-TXRX - OMS-DEG2-TTP-TXRX successfully created on node ROADM-C1',
+                      response["output"]["result"])
+
+    def test_29_create_OTS_ROADMB_DEG1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-device-renderer', 'create-ots-oms',
+            {
+                'node-id': 'ROADM-B1',
+                'logical-connection-point': 'DEG1-TTP-TXRX'
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Interfaces OTS-DEG1-TTP-TXRX - OMS-DEG1-TTP-TXRX successfully created on node ROADM-B1',
+                      response["output"]["result"])
+
+    def test_30_create_OTS_ROADMB_DEG2(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-device-renderer', 'create-ots-oms',
+            {
+                'node-id': 'ROADM-B1',
+                'logical-connection-point': 'DEG2-TTP-TXRX'
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Interfaces OTS-DEG2-TTP-TXRX - OMS-DEG2-TTP-TXRX successfully created on node ROADM-B1',
+                      response["output"]["result"])
+
+    def test_31_calculate_span_loss_base_all(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-olm', 'calculate-spanloss-base',
+            {
+                'src-type': 'all'
+            })
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Success', response["output"]["result"])
+        self.assertIn({
+            "spanloss": "25.7",
+            "link-id": "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX"
+        }, response["output"]["spans"])
+        self.assertIn({
+            "spanloss": "17.6",
+            "link-id": "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX"
+        }, response["output"]["spans"])
+        self.assertIn({
+            "spanloss": "23.6",
+            "link-id": "ROADM-B1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG1-DEG1-TTP-TXRX"
+        }, response["output"]["spans"])
+        self.assertIn({
+            "spanloss": "23.6",
+            "link-id": "ROADM-A1-DEG1-DEG1-TTP-TXRXtoROADM-B1-DEG1-DEG1-TTP-TXRX"
+        }, response["output"]["spans"])
+        self.assertIn({
+            "spanloss": "25.7",
+            "link-id": "ROADM-C1-DEG2-DEG2-TTP-TXRXtoROADM-B1-DEG2-DEG2-TTP-TXRX"
+        }, response["output"]["spans"])
+        self.assertIn({
+            "spanloss": "17.6",
+            "link-id": "ROADM-B1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG2-DEG2-TTP-TXRX"
+        }, response["output"]["spans"])
+        time.sleep(1)
+
+    def test_32_get_service_path_service_1(self):
+        response = test_utils.get_serv_path_list_attr("service-paths", "service1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertCountEqual(self.service_path_service_1_AtoZ,
+                              response['service-paths'][0]['path-description']['aToZ-direction']['aToZ'])
+
+    # test service-create for Eth service from xpdr to xpdr without service-resiliency
+    def test_33_create_eth_service2_without_service_resiliency(self):
+        self.cr_serv_input_data["service-name"] = "service2"
+        del self.cr_serv_input_data["service-resiliency"]
+        response = test_utils.transportpce_api_rpc_request('org-openroadm-service', 'service-create',
+                                                           self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('PCE calculation in progress',
+                      response['output']['configuration-response-common']['response-message'])
+        time.sleep(self.WAITING)
+
+    def test_34_get_eth_service2(self):
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service2")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['operational-state'], 'inService')
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service2')
+        self.assertEqual(response['services'][0]['connection-type'], 'service')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        self.assertNotIn('service-resiliency', response['services'][0])
+        time.sleep(1)
+
+    def test_35_get_service_path_service_2(self):
+        response = test_utils.get_serv_path_list_attr("service-paths", "service2")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertCountEqual(
+            self.service_path_service_2_AtoZ,
+            response['service-paths'][0]['path-description']['aToZ-direction']['aToZ'])
+
+    # Degrade ROADM-A1-ROADM-C1 link
+    def test_36_set_pm_ROADMA_OTS_DEG2_TTP_TXRX_OpticalPowerInput(self):
+        self.test_14_set_pm_ROADMA_OTS_DEG2_TTP_TXRX_OpticalPowerInput()
+        time.sleep(self.WAITING * 2)
+
+    def test_37_get_eth_service1(self):
+        self.test_13_get_eth_service1()
+
+    def test_38_get_service_path_service_1(self):
+        response = test_utils.get_serv_path_list_attr("service-paths", "service1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertCountEqual(
+            self.service_path_service_1_rerouted_AtoZ,
+            response['service-paths'][0]['path-description']['aToZ-direction']['aToZ'])
+
+    def test_39_get_eth_service2(self):
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service2")
+        self.assertEqual(response['services'][0]['operational-state'], 'outOfService')
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service2')
+        self.assertEqual(response['services'][0]['connection-type'], 'service')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        self.assertNotIn('service-resiliency', response['services'])
+        time.sleep(1)
+
+    def test_40_get_service_path_service_2(self):
+        response = test_utils.get_serv_path_list_attr("service-paths", "service2")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        index1 = self.service_path_service_2_AtoZ.index(
+            {
+                'id': '10',
+                'resource': {
+                    'state': 'inService',
+                    'tp-id': 'DEG2-TTP-TXRX',
+                    'tp-node-id': 'ROADM-A1-DEG2'
+                }
+            }
+        )
+        index2 = self.service_path_service_2_AtoZ.index(
+            {
+                'id': '11',
+                'resource': {
+                    'state': 'inService',
+                    'link-id': 'ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX'
+                }
+            }
+        )
+        service_path_expected = self.service_path_service_2_AtoZ[:index1] + [{
+            'id': '10',
+            'resource': {
+                'state': 'outOfService',
+                'tp-id': 'DEG2-TTP-TXRX',
+                'tp-node-id': 'ROADM-A1-DEG2'
+            }
+        }] + self.service_path_service_2_AtoZ[index1 + 1:index2] + [{
+            'id': '11',
+            'resource': {
+                'state': 'outOfService',
+                'link-id': 'ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX'
+            }
+        }] + self.service_path_service_2_AtoZ[index2 + 1:]
+        self.assertCountEqual(service_path_expected,
+                              response['service-paths'][0]['path-description']['aToZ-direction']['aToZ'])
+
+    # Restore ROADM-A1-ROADM-C1 link
+    def test_41_clear_pm_ROADMA_OTS_DEG2_TTP_TXRX_OpticalPowerInput(self):
+        self.test_17_clear_pm_ROADMA_OTS_DEG2_TTP_TXRX_OpticalPowerInput()
+
+    def test_42_get_eth_service1(self):
+        self.test_13_get_eth_service1()
+
+    def test_43_get_service_path_service_1(self):
+        self.test_38_get_service_path_service_1()
+
+    def test_44_get_eth_service2(self):
+        self.test_34_get_eth_service2()
+
+    def test_45_get_service_path_service_2(self):
+        self.test_35_get_service_path_service_2()
+
+    def test_46_delete_eth_service2(self):
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service2"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Renderer service delete in progress',
+                      response['output']['configuration-response-common']['response-message'])
+        time.sleep(self.WAITING)
+
+    def test_47_delete_eth_service1(self):
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service1"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Renderer service delete in progress',
+                      response['output']['configuration-response-common']['response-message'])
+        time.sleep(self.WAITING)
+
+    def test_48_disconnect_xponders_from_roadm(self):
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        links = response['network'][0]['ietf-network-topology:link']
+        for link in links:
+            if link["org-openroadm-common-network:link-type"] in ('XPONDER-OUTPUT', 'XPONDER-INPUT'):
+                response = test_utils.del_ietf_network_link_request(
+                    'openroadm-topology', link['link-id'], 'config')
+                self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
+
+    def test_49_disconnect_xpdra2(self):
+        response = test_utils.unmount_device("XPDR-A2")
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
+
+    def test_50_disconnect_xpdrc2(self):
+        response = test_utils.unmount_device("XPDR-C2")
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
+
+    def test_51_disconnect_roadmA(self):
+        response = test_utils.unmount_device("ROADM-A1")
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
+
+    def test_52_disconnect_roadmB(self):
+        response = test_utils.unmount_device("ROADM-B1")
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
+
+    def test_53_disconnect_roadmC(self):
+        response = test_utils.unmount_device("ROADM-C1")
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
+
+
+if __name__ == "__main__":
+    unittest.main(verbosity=2)
index 6477c54f45355766f3f5a99a41e6ea41365c0bf2..a1b1b94839fc55e1480a02202ac45ff78b1d2438 100644 (file)
@@ -24,6 +24,26 @@ import test_utils  # nopep8
 
 
 class TransportPCEtesting(unittest.TestCase):
+    path_computation_input_data = {
+        "service-name": "service-1",
+        "resource-reserve": "true",
+        "service-handler-header": {
+            "request-id": "request1"
+        },
+        "service-a-end": {
+            "service-rate": "100",
+            "clli": "NodeA",
+            "service-format": "Ethernet",
+            "node-id": "XPDRA01"
+        },
+        "service-z-end": {
+            "service-rate": "100",
+            "clli": "NodeC",
+            "service-format": "Ethernet",
+            "node-id": "XPDRC01"
+        },
+        "pce-routing-metric": "hop-count"
+    }
 
     simple_topo_bi_dir_data = None
     simple_topo_uni_dir_data = None
@@ -35,20 +55,21 @@ class TransportPCEtesting(unittest.TestCase):
     def setUpClass(cls):
         # pylint: disable=bare-except
         sample_files_parsed = False
+        time.sleep(10)
         try:
             TOPO_BI_DIR_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)),
-                                            "..", "..", "sample_configs", "honeynode-topo.xml")
+                                            "..", "..", "sample_configs", "honeynode-topo.json")
             with open(TOPO_BI_DIR_FILE, 'r', encoding='utf-8') as topo_bi_dir:
                 cls.simple_topo_bi_dir_data = topo_bi_dir.read()
 
             TOPO_UNI_DIR_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)),
-                                             "..", "..", "sample_configs", "NW-simple-topology.xml")
+                                             "..", "..", "sample_configs", "NW-simple-topology.json")
 
             with open(TOPO_UNI_DIR_FILE, 'r', encoding='utf-8') as topo_uni_dir:
                 cls.simple_topo_uni_dir_data = topo_uni_dir.read()
 
             TOPO_UNI_DIR_COMPLEX_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)),
-                                                     "..", "..", "sample_configs", "NW-for-test-5-4.xml")
+                                                     "..", "..", "sample_configs", "NW-for-test-5-4.json")
             with open(TOPO_UNI_DIR_COMPLEX_FILE, 'r', encoding='utf-8') as topo_uni_dir_complex:
                 cls.complex_topo_uni_dir_data = topo_uni_dir_complex.read()
             PORT_MAPPING_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)),
@@ -70,9 +91,13 @@ class TransportPCEtesting(unittest.TestCase):
                 print("sample files content loaded")
 
         cls.processes = test_utils.start_tpce()
+        time.sleep(5)
 
     @classmethod
     def tearDownClass(cls):
+        # clean datastores
+        test_utils.del_portmapping()
+        test_utils.del_ietf_network('openroadm-topology')
         # pylint: disable=not-an-iterable
         for process in cls.processes:
             test_utils.shutdown_process(process)
@@ -81,315 +106,257 @@ class TransportPCEtesting(unittest.TestCase):
     def setUp(self):  # instruction executed before each test method
         time.sleep(1)
 
-     # Load port mapping
-    def test_00_load_port_mapping(self):
-        response = test_utils.rawpost_request(test_utils.URL_FULL_PORTMAPPING, self.port_mapping_data)
-        self.assertEqual(response.status_code, requests.codes.no_content)
-        time.sleep(2)
+    # Load port mapping
+    def test_01_load_port_mapping(self):
+        response = test_utils.post_portmapping(self.port_mapping_data)
+        self.assertIn(response['status_code'], (requests.codes.created, requests.codes.no_content))
+        time.sleep(1)
 
-     # Load simple bidirectional topology
-    def test_01_load_simple_topology_bi(self):
-        response = test_utils.put_xmlrequest(test_utils.URL_CONFIG_ORDM_TOPO, self.simple_topo_bi_dir_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        time.sleep(2)
+    # Load simple bidirectional topology
+    def test_02_load_simple_topology_bi(self):
+        response = test_utils.put_ietf_network('openroadm-topology', self.simple_topo_bi_dir_data)
+        self.assertIn(response['status_code'], (requests.codes.ok, requests.codes.no_content))
+        time.sleep(1)
 
     # Get existing nodeId
-    def test_02_get_nodeId(self):
-        response = test_utils.get_ordm_topo_request("node/ROADMA01-SRG1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['node'][0]['node-id'], 'ROADMA01-SRG1')
+    def test_03_get_nodeId(self):
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'ROADMA01-SRG1', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['node']['node-id'], 'ROADMA01-SRG1')
         time.sleep(1)
 
     # Get existing linkId
-    def test_03_get_linkId(self):
-        response = test_utils.get_ordm_topo_request("link/XPDRA01-XPDR1-XPDR1-NETWORK1toROADMA01-SRG1-SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['ietf-network-topology:link'][0]['link-id'],
-            'XPDRA01-XPDR1-XPDR1-NETWORK1toROADMA01-SRG1-SRG1-PP1-TXRX')
+    def test_04_get_linkId(self):
+        response = test_utils.get_ietf_network_link_request(
+            'openroadm-topology', 'XPDRA01-XPDR1-XPDR1-NETWORK1toROADMA01-SRG1-SRG1-PP1-TXRX', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['link']['link-id'], 'XPDRA01-XPDR1-XPDR1-NETWORK1toROADMA01-SRG1-SRG1-PP1-TXRX')
         time.sleep(1)
 
     # Path Computation success
-    def test_04_path_computation_xpdr_bi(self):
-        response = test_utils.path_computation_request("request-1", "service-1",
-                                                       {"node-id": "XPDRA01", "service-rate": "100",
-                                                           "service-format": "Ethernet", "clli": "nodeA"},
-                                                       {"node-id": "XPDRC01", "service-rate": "100",
-                                                           "service-format": "Ethernet", "clli": "nodeC"})
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_05_path_computation_xpdr_bi(self):
+        response = test_utils.transportpce_api_rpc_request('transportpce-pce',
+                                                           'path-computation-request',
+                                                           self.path_computation_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Path is calculated',
-                      res['output']['configuration-response-common']['response-message'])
-        time.sleep(5)
+                      response['output']['configuration-response-common']['response-message'])
+        time.sleep(2)
 
     # Path Computation success
-    def test_05_path_computation_rdm_bi(self):
-        response = test_utils.path_computation_request("request-1", "service-1",
-                                                       {"node-id": "ROADMA01", "service-rate": "100",
-                                                           "service-format": "Ethernet", "clli": "NodeA"},
-                                                       {"node-id": "ROADMC01", "service-rate": "100",
-                                                           "service-format": "Ethernet", "clli": "NodeC"})
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_06_path_computation_rdm_bi(self):
+        self.path_computation_input_data["service-a-end"]["node-id"] = "ROADMA01"
+        self.path_computation_input_data["service-z-end"]["node-id"] = "ROADMC01"
+        response = test_utils.transportpce_api_rpc_request('transportpce-pce',
+                                                           'path-computation-request',
+                                                           self.path_computation_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Path is calculated',
-                      res['output']['configuration-response-common']['response-message'])
-        time.sleep(5)
-
-    # Delete topology
-    def test_06_delete_simple_topology_bi(self):
-        response = test_utils.delete_request(test_utils.URL_CONFIG_ORDM_TOPO)
-        self.assertEqual(response.status_code, requests.codes.ok)
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(2)
 
-    # Test deleted topology
-    def test_07_test_topology_simple_bi_deleted(self):
-        response = test_utils.get_ordm_topo_request("node/ROADMA01-SRG1")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-        time.sleep(1)
-
     # Load simple bidirectional topology
-    def test_08_load_simple_topology_uni(self):
-        response = test_utils.put_xmlrequest(test_utils.URL_CONFIG_ORDM_TOPO, self.simple_topo_uni_dir_data)
-        self.assertEqual(response.status_code, 201)
-        time.sleep(2)
+    def test_07_load_simple_topology_uni(self):
+        response = test_utils.put_ietf_network('openroadm-topology', self.simple_topo_uni_dir_data)
+        self.assertIn(response['status_code'], (requests.codes.ok, requests.codes.no_content))
+        time.sleep(1)
 
     # Get existing nodeId
-    def test_09_get_nodeId(self):
-        response = test_utils.get_ordm_topo_request("node/XPONDER-1-2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['node'][0]['node-id'],
-            'XPONDER-1-2')
+    def test_08_get_nodeId(self):
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'XPONDER-1-2', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['node']['node-id'], 'XPONDER-1-2')
         time.sleep(1)
 
     # Get existing linkId
-    def test_10_get_linkId(self):
-        response = test_utils.get_ordm_topo_request("link/XPONDER-1-2XPDR-NW1-TX-toOpenROADM-1-2-SRG1-SRG1-PP1-RX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['ietf-network-topology:link'][0]['link-id'],
-            'XPONDER-1-2XPDR-NW1-TX-toOpenROADM-1-2-SRG1-SRG1-PP1-RX')
+    def test_09_get_linkId(self):
+        response = test_utils.get_ietf_network_link_request(
+            'openroadm-topology', 'XPONDER-1-2XPDR-NW1-TX-toOpenROADM-1-2-SRG1-SRG1-PP1-RX', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['link']['link-id'], 'XPONDER-1-2XPDR-NW1-TX-toOpenROADM-1-2-SRG1-SRG1-PP1-RX')
         time.sleep(1)
 
     # Path Computation success
-    def test_11_path_computation_xpdr_uni(self):
-        response = test_utils.path_computation_request("request-1", "service-1",
-                                                       {"node-id": "XPONDER-1-2", "service-rate": "100",
-                                                           "service-format": "Ethernet", "clli": "ORANGE1"},
-                                                       {"node-id": "XPONDER-3-2", "service-rate": "100",
-                                                           "service-format": "Ethernet", "clli": "ORANGE3"})
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_10_path_computation_xpdr_uni(self):
+        self.path_computation_input_data["service-a-end"]["node-id"] = "XPONDER-1-2"
+        self.path_computation_input_data["service-a-end"]["clli"] = "ORANGE1"
+        self.path_computation_input_data["service-z-end"]["node-id"] = "XPONDER-3-2"
+        self.path_computation_input_data["service-z-end"]["clli"] = "ORANGE3"
+        response = test_utils.transportpce_api_rpc_request('transportpce-pce',
+                                                           'path-computation-request',
+                                                           self.path_computation_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Path is calculated',
-                      res['output']['configuration-response-common']['response-message'])
-        time.sleep(5)
+                      response['output']['configuration-response-common']['response-message'])
+        time.sleep(2)
 
     # Path Computation success
-    def test_12_path_computation_rdm_uni(self):
-        response = test_utils.path_computation_request("request1", "service1",
-                                                       {"service-rate": "100", "service-format": "Ethernet",
-                                                           "clli": "cll21", "node-id": "OpenROADM-2-1"},
-                                                       {"service-rate": "100", "service-format": "Ethernet",
-                                                           "clli": "ncli22", "node-id": "OpenROADM-2-2"})
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_11_path_computation_rdm_uni(self):
+        self.path_computation_input_data["service-a-end"]["node-id"] = "OpenROADM-2-1"
+        self.path_computation_input_data["service-a-end"]["clli"] = "cll21"
+        self.path_computation_input_data["service-z-end"]["node-id"] = "OpenROADM-2-2"
+        self.path_computation_input_data["service-z-end"]["clli"] = "ncli22"
+        response = test_utils.transportpce_api_rpc_request('transportpce-pce',
+                                                           'path-computation-request',
+                                                           self.path_computation_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Path is calculated',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         # ZtoA path test
-        atozList = len(res['output']['response-parameters']['path-description']['aToZ-direction']['aToZ'])
-        ztoaList = len(res['output']['response-parameters']['path-description']['zToA-direction']['zToA'])
+        atozList = len(response['output']['response-parameters']['path-description']['aToZ-direction']['aToZ'])
+        ztoaList = len(response['output']['response-parameters']['path-description']['zToA-direction']['zToA'])
         self.assertEqual(atozList, 15)
         self.assertEqual(ztoaList, 15)
         for i in range(0, 15):
-            atoz = res['output']['response-parameters']['path-description']['aToZ-direction']['aToZ'][i]
-            ztoa = res['output']['response-parameters']['path-description']['zToA-direction']['zToA'][i]
+            atoz = response['output']['response-parameters']['path-description']['aToZ-direction']['aToZ'][i]
+            ztoa = response['output']['response-parameters']['path-description']['zToA-direction']['zToA'][i]
             if atoz['id'] == '14':
                 self.assertEqual(atoz['resource']['tp-id'], 'SRG1-PP1-TX')
             if ztoa['id'] == '0':
                 self.assertEqual(ztoa['resource']['tp-id'], 'SRG1-PP1-RX')
-        time.sleep(5)
-
-    # Delete topology
-    def test_13_delete_simple_topology(self):
-        response = test_utils.delete_request(test_utils.URL_CONFIG_ORDM_TOPO)
-        self.assertEqual(response.status_code, requests.codes.ok)
         time.sleep(2)
 
-    # Test deleted topology
-    def test_14_test_topology_simple_deleted(self):
-        response = test_utils.get_ordm_topo_request("node/XPONDER-1-2")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-        time.sleep(1)
-
     # Load complex topology
-    def test_15_load_complex_topology(self):
-        response = test_utils.put_xmlrequest(test_utils.URL_CONFIG_ORDM_TOPO, self.complex_topo_uni_dir_data)
-        self.assertEqual(response.status_code, 201)
-        time.sleep(2)
+    def test_12_load_complex_topology(self):
+        response = test_utils.put_ietf_network('openroadm-topology', self.complex_topo_uni_dir_data)
+        self.assertIn(response['status_code'], (requests.codes.ok, requests.codes.no_content))
+        time.sleep(1)
 
     # Get existing nodeId
-    def test_16_get_nodeId(self):
-        response = test_utils.get_ordm_topo_request("node/XPONDER-3-2")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['node'][0]['node-id'],
-            'XPONDER-3-2')
+    def test_13_get_nodeId(self):
+        response = test_utils.get_ietf_network_node_request('openroadm-topology', 'XPONDER-3-2', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['node']['node-id'], 'XPONDER-3-2')
         time.sleep(1)
 
     # Test failed path computation
-    def test_17_fail_path_computation(self):
-        response = test_utils.post_request(test_utils.URL_PATH_COMPUTATION_REQUEST,
-                                           {"input": {"service-handler-header": {"request-id": "request-1"}}})
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_14_fail_path_computation(self):
+        del self.path_computation_input_data["service-name"]
+        del self.path_computation_input_data["service-a-end"]
+        del self.path_computation_input_data["service-z-end"]
+        response = test_utils.transportpce_api_rpc_request('transportpce-pce',
+                                                           'path-computation-request',
+                                                           self.path_computation_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Service Name is not set',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(2)
 
     # Test1 success path computation
-    def test_18_success1_path_computation(self):
-        response = test_utils.path_computation_request("request1", "service1",
-                                                       {"service-format": "Ethernet", "service-rate": "100",
-                                                        "clli": "ORANGE2", "node-id": "XPONDER-2-2"},
-                                                       {"service-format": "Ethernet", "service-rate": "100",
-                                                           "clli": "ORANGE1", "node-id": "XPONDER-1-2"},
-                                                       {"customer-code": ["Some customer-code"],
-                                                           "co-routing": {
-                                                           "service-identifier-list": [
-                                                               {
-                                                                   "service-identifier": "Some existing-service",
-                                                               }
-                                                           ]
-                                                       }
-                                                       },
-                                                       {"customer-code": ["Some customer-code"],
-                                                           "co-routing": {
-                                                           "service-identifier-list": [
-                                                               {
-                                                                   "service-identifier": "Some existing-service",
-                                                               }
-                                                           ]
-                                                       }
-                                                       }, "hop-count")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_15_success1_path_computation(self):
+        self.path_computation_input_data["service-name"] = "service 1"
+        self.path_computation_input_data["service-a-end"] = {"service-format": "Ethernet", "service-rate": "100",
+                                                             "clli": "ORANGE2", "node-id": "XPONDER-2-2"}
+        self.path_computation_input_data["service-z-end"] = {"service-format": "Ethernet", "service-rate": "100",
+                                                             "clli": "ORANGE1", "node-id": "XPONDER-1-2"}
+        self.path_computation_input_data["hard-constraints"] = {"customer-code": ["Some customer-code"],
+                                                                "co-routing": {
+                                                                    "service-identifier-list": [{
+                                                                        "service-identifier": "Some existing-service"}]
+        }}
+        self.path_computation_input_data["soft-constraints"] = {"customer-code": ["Some customer-code"],
+                                                                "co-routing": {
+                                                                    "service-identifier-list": [{
+                                                                        "service-identifier": "Some existing-service"}]
+        }}
+        response = test_utils.transportpce_api_rpc_request('transportpce-pce',
+                                                           'path-computation-request',
+                                                           self.path_computation_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Path is calculated',
-                      res['output']['configuration-response-common']['response-message'])
-        time.sleep(5)
+                      response['output']['configuration-response-common']['response-message'])
+
+        time.sleep(4)
 
     # Test2 success path computation with path description
-    def test_19_success2_path_computation(self):
-        response = test_utils.path_computation_request("request 1", "service 1",
-                                                       {"service-rate": "100", "service-format": "Ethernet",
-                                                           "node-id": "XPONDER-1-2", "clli": "ORANGE1"},
-                                                       {"service-rate": "100", "service-format": "Ethernet",
-                                                           "node-id": "XPONDER-3-2", "clli": "ORANGE3"})
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_16_success2_path_computation(self):
+        self.path_computation_input_data["service-a-end"]["node-id"] = "XPONDER-1-2"
+        self.path_computation_input_data["service-a-end"]["clli"] = "ORANGE1"
+        self.path_computation_input_data["service-z-end"]["node-id"] = "XPONDER-3-2"
+        self.path_computation_input_data["service-z-end"]["clli"] = "ORANGE3"
+        del self.path_computation_input_data["hard-constraints"]
+        del self.path_computation_input_data["soft-constraints"]
+        response = test_utils.transportpce_api_rpc_request('transportpce-pce',
+                                                           'path-computation-request',
+                                                           self.path_computation_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Path is calculated',
-                      res['output']['configuration-response-common']['response-message'])
-        self.assertEqual(5, res['output']['response-parameters']['path-description']
+                      response['output']['configuration-response-common']['response-message'])
+        self.assertEqual(5, response['output']['response-parameters']['path-description']
                          ['aToZ-direction']['aToZ-wavelength-number'])
-        self.assertEqual(5, res['output']['response-parameters']['path-description']
+        self.assertEqual(5, response['output']['response-parameters']['path-description']
                          ['zToA-direction']['zToA-wavelength-number'])
-        time.sleep(5)
+        time.sleep(4)
 
     # Test3 success path computation with hard-constraints exclude
-    def test_20_success3_path_computation(self):
-        response = test_utils.path_computation_request("request 1", "service 1",
-                                                       {"service-rate": "100", "service-format": "Ethernet",
-                                                           "node-id": "XPONDER-1-2", "clli": "ORANGE1"},
-                                                       {"service-rate": "100", "service-format": "Ethernet",
-                                                           "node-id": "XPONDER-3-2", "clli": "ORANGE3"},
-                                                       {"exclude": {"node-id": ["OpenROADM-2-1", "OpenROADM-2-2"]}})
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_17_success3_path_computation(self):
+        self.path_computation_input_data["hard-constraints"] = {"exclude":
+                                                                {"node-id": ["OpenROADM-2-1", "OpenROADM-2-2"]}}
+        response = test_utils.transportpce_api_rpc_request('transportpce-pce',
+                                                           'path-computation-request',
+                                                           self.path_computation_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Path is calculated',
-                      res['output']['configuration-response-common']['response-message'])
-        self.assertEqual(9, res['output']['response-parameters']['path-description']
+                      response['output']['configuration-response-common']['response-message'])
+        self.assertEqual(9, response['output']['response-parameters']['path-description']
                          ['aToZ-direction']['aToZ-wavelength-number'])
-        self.assertEqual(9, res['output']['response-parameters']['path-description']
+        self.assertEqual(9, response['output']['response-parameters']['path-description']
                          ['zToA-direction']['zToA-wavelength-number'])
-        time.sleep(5)
+        time.sleep(4)
 
     # Path computation before deleting oms-attribute of the link :openroadm1-3 to openroadm1-2
-    def test_21_path_computation_before_oms_attribute_deletion(self):
-        response = test_utils.path_computation_request("request 1", "service 1",
-                                                       {"service-rate": "100", "service-format": "Ethernet",
-                                                           "node-id": "XPONDER-2-2", "clli": "ORANGE2"},
-                                                       {"service-rate": "100", "service-format": "Ethernet",
-                                                           "node-id": "XPONDER-1-2", "clli": "ORANGE1"})
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_18_path_computation_before_oms_attribute_deletion(self):
+        self.path_computation_input_data["service-a-end"]["node-id"] = "XPONDER-2-2"
+        self.path_computation_input_data["service-a-end"]["clli"] = "ORANGE2"
+        self.path_computation_input_data["service-z-end"]["node-id"] = "XPONDER-1-2"
+        self.path_computation_input_data["service-z-end"]["clli"] = "ORANGE1"
+        del self.path_computation_input_data["hard-constraints"]
+        response = test_utils.transportpce_api_rpc_request('transportpce-pce',
+                                                           'path-computation-request',
+                                                           self.path_computation_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Path is calculated',
-                      res['output']['configuration-response-common']['response-message'])
-        nbElmPath = len(res['output']['response-parameters']['path-description']
-                        ['aToZ-direction']['aToZ'])
-        self.assertEqual(31, nbElmPath)
+                      response['output']['configuration-response-common']['response-message'])
+        path_depth = len(response['output']['response-parameters']['path-description']
+                         ['aToZ-direction']['aToZ'])
+        self.assertEqual(31, path_depth)
         link = {"link-id": "OpenROADM-1-3-DEG2-to-OpenROADM-1-2-DEG2", "state": "inService"}
         find = False
-        for i in range(0, nbElmPath):
-            resource_i = (res['output']['response-parameters']['path-description']['aToZ-direction']['aToZ'][i]
-                             ['resource'])
+        for i in range(0, path_depth):
+            resource_i = (response['output']['response-parameters']['path-description']['aToZ-direction']['aToZ'][i]
+                          ['resource'])
             if resource_i == link:
                 find = True
         self.assertEqual(find, True)
-        time.sleep(5)
+        time.sleep(4)
 
     # Delete oms-attribute in the link :openroadm1-3 to openroadm1-2
-    def test_22_delete_oms_attribute_in_openroadm13toopenroadm12_link(self):
+    def test_19_delete_oms_attribute_in_openroadm13toopenroadm12_link(self):
         response = test_utils.del_oms_attr_request("OpenROADM-1-3-DEG2-to-OpenROADM-1-2-DEG2")
-        self.assertEqual(response.status_code, requests.codes.ok)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
         time.sleep(2)
 
     # Path computation after deleting oms-attribute of the link :openroadm1-3 to openroadm1-2
-    def test_23_path_computation_after_oms_attribute_deletion(self):
-        response = test_utils.path_computation_request("request 1", "service 1",
-                                                       {"service-rate": "100", "service-format": "Ethernet",
-                                                           "node-id": "XPONDER-2-2", "clli": "ORANGE2"},
-                                                       {"service-rate": "100", "service-format": "Ethernet",
-                                                           "node-id": "XPONDER-1-2", "clli": "ORANGE1"})
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+    def test_20_path_computation_after_oms_attribute_deletion(self):
+        response = test_utils.transportpce_api_rpc_request('transportpce-pce',
+                                                           'path-computation-request',
+                                                           self.path_computation_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Path is calculated',
-                      res['output']['configuration-response-common']['response-message'])
-        nbElmPath = len(res['output']['response-parameters']['path-description']
-                        ['aToZ-direction']['aToZ'])
-        self.assertEqual(47, nbElmPath)
+                      response['output']['configuration-response-common']['response-message'])
+        path_depth = len(response['output']['response-parameters']['path-description']
+                         ['aToZ-direction']['aToZ'])
+        self.assertEqual(47, path_depth)
         link = {"link-id": "OpenROADM-1-3-DEG2-to-OpenROADM-1-2-DEG2", "state": "inService"}
         find = False
-        for i in range(0, nbElmPath):
-            resource_i = (res['output']['response-parameters']['path-description']['aToZ-direction']['aToZ'][i]
-                             ['resource'])
+        for i in range(0, path_depth):
+            resource_i = (response['output']['response-parameters']['path-description']['aToZ-direction']['aToZ'][i]
+                          ['resource'])
             if resource_i == link:
                 find = True
         self.assertNotEqual(find, True)
         time.sleep(5)
 
-    # Delete complex topology
-    def test_24_delete_complex_topology(self):
-        response = test_utils.delete_request(test_utils.URL_CONFIG_ORDM_TOPO)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        time.sleep(2)
-
-    # Test deleted complex topology
-    def test_25_test_topology_complex_deleted(self):
-        response = test_utils.get_ordm_topo_request("node/XPONDER-3-2")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-        time.sleep(1)
-
-    # Delete portmapping
-    def test_26_delete_port_mapping(self):
-        response = test_utils.delete_request(test_utils.URL_FULL_PORTMAPPING)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        time.sleep(2)
-
 
 if __name__ == "__main__":
     unittest.main(verbosity=2)
index db4cb4e2915f67dacfa796dccf0ceb604c5b4f39..dbd8e684a24b7e39d98f63c4fa00f0663812a8cd 100644 (file)
@@ -25,6 +25,26 @@ import test_utils  # nopep8
 
 
 class TransportPCE400Gtesting(unittest.TestCase):
+    path_computation_input_data = {
+        "service-name": "service-1",
+        "resource-reserve": "true",
+        "service-handler-header": {
+            "request-id": "request1"
+        },
+        "service-a-end": {
+            "service-rate": "400",
+            "clli": "nodeA",
+            "service-format": "Ethernet",
+            "node-id": "XPDR-A2"
+        },
+        "service-z-end": {
+            "service-rate": "400",
+            "clli": "nodeC",
+            "service-format": "Ethernet",
+            "node-id": "XPDR-C2"
+        },
+        "pce-routing-metric": "hop-count"
+    }
 
     simple_topo_bi_dir_data = None
     port_mapping_data = None
@@ -81,6 +101,10 @@ class TransportPCE400Gtesting(unittest.TestCase):
 
     @classmethod
     def tearDownClass(cls):
+        # clean datastores
+        test_utils.del_portmapping()
+        test_utils.del_ietf_network('openroadm-topology')
+        test_utils.del_ietf_network('otn-topology')
         # pylint: disable=not-an-iterable
         for process in cls.processes:
             test_utils.shutdown_process(process)
@@ -93,182 +117,171 @@ class TransportPCE400Gtesting(unittest.TestCase):
 
     # Load port mapping
     def test_01_load_port_mapping(self):
-        response = test_utils.put_jsonrequest(test_utils.URL_FULL_PORTMAPPING, self.port_mapping_data)
-        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.created))
-        time.sleep(2)
+        response = test_utils.post_portmapping(self.port_mapping_data)
+        self.assertIn(response['status_code'], (requests.codes.created, requests.codes.no_content))
+        time.sleep(1)
 
     # Load openroadm topology
     def test_02_load_openroadm_topology_bi(self):
-        response = test_utils.put_jsonrequest(test_utils.URL_CONFIG_ORDM_TOPO, self.topo_bi_dir_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        time.sleep(2)
+        response = test_utils.put_ietf_network('openroadm-topology', self.topo_bi_dir_data)
+        self.assertIn(response['status_code'], (requests.codes.ok, requests.codes.no_content))
+        time.sleep(1)
 
     # Path Computation success
     def test_03_path_computation_400G_xpdr_bi(self):
-        response = test_utils.path_computation_request("request-1", "service-1",
-                                                       {"node-id": "XPDR-A2", "service-rate": "400",
-                                                           "service-format": "Ethernet", "clli": "nodeA"},
-                                                       {"node-id": "XPDR-C2", "service-rate": "400",
-                                                           "service-format": "Ethernet", "clli": "nodeC"})
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.transportpce_api_rpc_request('transportpce-pce',
+                                                           'path-computation-request',
+                                                           self.path_computation_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Path is calculated',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
 
-        self.assertEqual(1, res['output']['response-parameters']['path-description']
+        self.assertEqual(1, response['output']['response-parameters']['path-description']
                          ['aToZ-direction']['aToZ-wavelength-number'])
-        self.assertEqual(400, res['output']['response-parameters']['path-description']
+        self.assertEqual(400, response['output']['response-parameters']['path-description']
                          ['aToZ-direction']['rate'])
-        self.assertEqual(196.0375, res['output']['response-parameters']['path-description']
-                         ['aToZ-direction']['aToZ-min-frequency'])
-        self.assertEqual(196.12500, res['output']['response-parameters']['path-description']
-                         ['aToZ-direction']['aToZ-max-frequency'])
-        self.assertEqual('dp-qam16', res['output']['response-parameters']['path-description']
+        self.assertEqual(196.0375, float(response['output']['response-parameters']['path-description']
+                         ['aToZ-direction']['aToZ-min-frequency']))
+        self.assertEqual(196.12500, float(response['output']['response-parameters']['path-description']
+                         ['aToZ-direction']['aToZ-max-frequency']))
+        self.assertEqual('dp-qam16', response['output']['response-parameters']['path-description']
                          ['aToZ-direction']['modulation-format'])
 
-        self.assertEqual(1, res['output']['response-parameters']['path-description']
+        self.assertEqual(1, response['output']['response-parameters']['path-description']
                          ['zToA-direction']['zToA-wavelength-number'])
-        self.assertEqual(400, res['output']['response-parameters']['path-description']
+        self.assertEqual(400, response['output']['response-parameters']['path-description']
                          ['zToA-direction']['rate'])
-        self.assertEqual(196.0375, res['output']['response-parameters']['path-description']
-                         ['zToA-direction']['zToA-min-frequency'])
-        self.assertEqual(196.12500, res['output']['response-parameters']['path-description']
-                         ['zToA-direction']['zToA-max-frequency'])
-        self.assertEqual('dp-qam16', res['output']['response-parameters']['path-description']
+        self.assertEqual(196.0375, float(response['output']['response-parameters']['path-description']
+                         ['zToA-direction']['zToA-min-frequency']))
+        self.assertEqual(196.12500, float(response['output']['response-parameters']['path-description']
+                         ['zToA-direction']['zToA-max-frequency']))
+        self.assertEqual('dp-qam16', response['output']['response-parameters']['path-description']
                          ['zToA-direction']['modulation-format'])
-        time.sleep(5)
+        time.sleep(2)
 
     # Load otn topology
     def test_04_load_otn_topology_bi(self):
-        response = test_utils.put_jsonrequest(test_utils.URL_CONFIG_OTN_TOPO, self.otn_topo_bi_dir_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        time.sleep(2)
+        response = test_utils.put_ietf_network('otn-topology', self.otn_topo_bi_dir_data)
+        self.assertIn(response['status_code'], (requests.codes.ok, requests.codes.no_content))
+        time.sleep(1)
 
     # Path Computation success
     def test_05_path_computation_OTUC4_xpdr_bi(self):
-        response = test_utils.path_computation_request("request-1", "service-OTUC4",
-                                                       {"service-rate": "400",
-                                                        "clli": "NodeA",
-                                                        "service-format": "OTU",
-                                                        "node-id": "XPDR-A2",
-                                                        "tx-direction": {"port": {"port-device-name": "XPDR-A2-XPDR2"}}
-                                                        },
-                                                       {"service-rate": "400",
-                                                        "clli": "NodeC",
-                                                        "service-format": "OTU",
-                                                        "node-id": "XPDR-C2",
-                                                        "tx-direction": {"port": {"port-device-name": "XPDR-C2-XPDR2"}}
-                                                        })
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.path_computation_input_data["service-name"] = "service-OTUC4"
+        self.path_computation_input_data["service-a-end"]["service-format"] = "OTU"
+        self.path_computation_input_data["service-a-end"]["tx-direction"] =\
+            {"port": {"port-device-name": "XPDR-A2-XPDR2"}}
+        self.path_computation_input_data["service-z-end"]["service-format"] = "OTU"
+        self.path_computation_input_data["service-z-end"]["tx-direction"] =\
+            {"port": {"port-device-name": "XPDR-C2-XPDR2"}}
+        response = test_utils.transportpce_api_rpc_request('transportpce-pce',
+                                                           'path-computation-request',
+                                                           self.path_computation_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Path is calculated',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
 
-        self.assertEqual(1, res['output']['response-parameters']['path-description']
+        self.assertEqual(1, response['output']['response-parameters']['path-description']
                          ['aToZ-direction']['aToZ-wavelength-number'])
-        self.assertEqual(400, res['output']['response-parameters']['path-description']
+        self.assertEqual(400, response['output']['response-parameters']['path-description']
                          ['aToZ-direction']['rate'])
-        self.assertEqual(196.0375, res['output']['response-parameters']['path-description']
-                         ['aToZ-direction']['aToZ-min-frequency'])
-        self.assertEqual(196.12500, res['output']['response-parameters']['path-description']
-                         ['aToZ-direction']['aToZ-max-frequency'])
-        self.assertEqual('dp-qam16', res['output']['response-parameters']['path-description']
+        self.assertEqual(196.0375, float(response['output']['response-parameters']['path-description']
+                         ['aToZ-direction']['aToZ-min-frequency']))
+        self.assertEqual(196.12500, float(response['output']['response-parameters']['path-description']
+                         ['aToZ-direction']['aToZ-max-frequency']))
+        self.assertEqual('dp-qam16', response['output']['response-parameters']['path-description']
                          ['aToZ-direction']['modulation-format'])
 
-        self.assertEqual(1, res['output']['response-parameters']['path-description']
+        self.assertEqual(1, response['output']['response-parameters']['path-description']
                          ['zToA-direction']['zToA-wavelength-number'])
-        self.assertEqual(400, res['output']['response-parameters']['path-description']
+        self.assertEqual(400, response['output']['response-parameters']['path-description']
                          ['zToA-direction']['rate'])
-        self.assertEqual(196.0375, res['output']['response-parameters']['path-description']
-                         ['zToA-direction']['zToA-min-frequency'])
-        self.assertEqual(196.12500, res['output']['response-parameters']['path-description']
-                         ['zToA-direction']['zToA-max-frequency'])
-        self.assertEqual('dp-qam16', res['output']['response-parameters']['path-description']
+        self.assertEqual(196.0375, float(response['output']['response-parameters']['path-description']
+                         ['zToA-direction']['zToA-min-frequency']))
+        self.assertEqual(196.12500, float(response['output']['response-parameters']['path-description']
+                         ['zToA-direction']['zToA-max-frequency']))
+        self.assertEqual('dp-qam16', response['output']['response-parameters']['path-description']
                          ['zToA-direction']['modulation-format'])
-        time.sleep(5)
+        time.sleep(2)
 
     # Load otn topology with OTUC4 links
     def test_06_load_otuc4_otn_topology_bi(self):
-        response = test_utils.put_jsonrequest(test_utils.URL_CONFIG_OTN_TOPO, self.otuc4_otn_topo_bi_dir_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        time.sleep(2)
+        response = test_utils.put_ietf_network('otn-topology', self.otuc4_otn_topo_bi_dir_data)
+        self.assertIn(response['status_code'], (requests.codes.ok, requests.codes.no_content))
+        time.sleep(1)
 
     # Path Computation success
     def test_07_path_computation_ODUC4_xpdr_bi(self):
-        response = test_utils.path_computation_request("request-1", "service-ODUC4",
-                                                       {"service-rate": "400",
-                                                        "clli": "NodeA",
-                                                        "service-format": "ODU",
-                                                        "node-id": "XPDR-A2",
-                                                        "tx-direction": {"port": {"port-device-name": "XPDR-A2-XPDR2"}}
-                                                        },
-                                                       {"service-rate": "400",
-                                                        "clli": "NodeC",
-                                                        "service-format": "ODU",
-                                                        "node-id": "XPDR-C2",
-                                                        "tx-direction": {"port": {"port-device-name": "XPDR-C2-XPDR2"}}
-                                                        })
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.path_computation_input_data["service-name"] = "service-ODUC4"
+        self.path_computation_input_data["service-a-end"]["service-format"] = "ODU"
+        self.path_computation_input_data["service-a-end"]["tx-direction"] = \
+            {"port": {"port-device-name": "XPDR-A2-XPDR2"}}
+        self.path_computation_input_data["service-z-end"]["service-format"] = "ODU"
+        self.path_computation_input_data["service-z-end"]["tx-direction"] = \
+            {"port": {"port-device-name": "XPDR-C2-XPDR2"}}
+        response = test_utils.transportpce_api_rpc_request('transportpce-pce',
+                                                           'path-computation-request',
+                                                           self.path_computation_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Path is calculated',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
 
-        self.assertEqual(400, res['output']['response-parameters']['path-description']
+        self.assertEqual(400, response['output']['response-parameters']['path-description']
                          ['aToZ-direction']['rate'])
-        self.assertEqual('dp-qam16', res['output']['response-parameters']['path-description']
+        self.assertEqual('dp-qam16', response['output']['response-parameters']['path-description']
                          ['aToZ-direction']['modulation-format'])
 
-        self.assertEqual(400, res['output']['response-parameters']['path-description']
+        self.assertEqual(400, response['output']['response-parameters']['path-description']
                          ['zToA-direction']['rate'])
-        self.assertEqual('dp-qam16', res['output']['response-parameters']['path-description']
+        self.assertEqual('dp-qam16', response['output']['response-parameters']['path-description']
                          ['zToA-direction']['modulation-format'])
-        time.sleep(5)
+        time.sleep(2)
 
     # Load otn topology with OTUC4 links
     def test_08_load_oduc4_otn_topology_bi(self):
-        response = test_utils.put_jsonrequest(test_utils.URL_CONFIG_OTN_TOPO, self.oduc4_otn_topo_bi_dir_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        time.sleep(2)
+        response = test_utils.put_ietf_network('otn-topology', self.oduc4_otn_topo_bi_dir_data)
+        self.assertIn(response['status_code'], (requests.codes.ok, requests.codes.no_content))
+        time.sleep(1)
 
     # Path Computation success
     def test_09_path_computation_100G_xpdr_bi(self):
-        response = test_utils.path_computation_request("request-1", "service-100GE",
-                                                       {"service-rate": "100",
-                                                        "clli": "NodeA",
-                                                        "service-format": "Ethernet",
-                                                        "node-id": "XPDR-A2",
-                                                        "tx-direction": {"port": {"port-device-name": "XPDR-A2-XPDR2",
-                                                                                  "port-name": "XPDR2-CLIENT1"}}},
-                                                       {"service-rate": "100",
-                                                        "clli": "NodeC",
-                                                        "service-format": "Ethernet",
-                                                        "node-id": "XPDR-C2",
-                                                        "tx-direction": {"port": {"port-device-name": "XPDR-C2-XPDR2",
-                                                                                  "port-name": "XPDR2-CLIENT1"}}})
-
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.path_computation_input_data["service-name"] = "service-100GE"
+        self.path_computation_input_data["service-a-end"]["service-rate"] = "100"
+        self.path_computation_input_data["service-a-end"]["service-format"] = "Ethernet"
+        self.path_computation_input_data["service-a-end"]["tx-direction"] = \
+            {"port": {"port-device-name": "XPDR-A2-XPDR2",
+                      "port-name": "XPDR2-CLIENT1"}}
+        self.path_computation_input_data["service-z-end"]["service-rate"] = "100"
+        self.path_computation_input_data["service-z-end"]["service-format"] = "Ethernet"
+        self.path_computation_input_data["service-z-end"]["tx-direction"] = \
+            {"port": {"port-device-name": "XPDR-C2-XPDR2",
+                      "port-name": "XPDR2-CLIENT1"}}
+        self.path_computation_input_data["service-z-end"]["service-format"] = "ODU"
+        response = test_utils.transportpce_api_rpc_request('transportpce-pce',
+                                                           'path-computation-request',
+                                                           self.path_computation_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Path is calculated',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
 
-        self.assertEqual(100, res['output']['response-parameters']['path-description']
+        self.assertEqual(100, response['output']['response-parameters']['path-description']
                          ['aToZ-direction']['rate'])
-        self.assertEqual('1.1', res['output']['response-parameters']['path-description']
+        self.assertEqual('1.1', response['output']['response-parameters']['path-description']
                          ['aToZ-direction']['min-trib-slot'])
-        self.assertEqual('1.20', res['output']['response-parameters']['path-description']
+        self.assertEqual('1.20', response['output']['response-parameters']['path-description']
                          ['aToZ-direction']['max-trib-slot'])
-        self.assertEqual('dp-qpsk', res['output']['response-parameters']['path-description']
+        self.assertEqual('dp-qpsk', response['output']['response-parameters']['path-description']
                          ['aToZ-direction']['modulation-format'])
 
-        self.assertEqual(100, res['output']['response-parameters']['path-description']
+        self.assertEqual(100, response['output']['response-parameters']['path-description']
                          ['zToA-direction']['rate'])
-        self.assertEqual('1.1', res['output']['response-parameters']['path-description']
+        self.assertEqual('1.1', response['output']['response-parameters']['path-description']
                          ['zToA-direction']['min-trib-slot'])
-        self.assertEqual('1.20', res['output']['response-parameters']['path-description']
+        self.assertEqual('1.20', response['output']['response-parameters']['path-description']
                          ['zToA-direction']['max-trib-slot'])
-        self.assertEqual('dp-qpsk', res['output']['response-parameters']['path-description']
+        self.assertEqual('dp-qpsk', response['output']['response-parameters']['path-description']
                          ['zToA-direction']['modulation-format'])
-        time.sleep(5)
+        time.sleep(2)
 
 
 if __name__ == "__main__":
index 5a72ca754511491e8bdc79a984b6e85d4904a4ad..6778604661fe3a4b77080df0db4b17705e23ac74 100644 (file)
@@ -26,6 +26,26 @@ import test_utils  # nopep8
 
 
 class TransportGNPYtesting(unittest.TestCase):
+    path_computation_input_data = {
+        "service-name": "service-1",
+        "resource-reserve": "true",
+        "service-handler-header": {
+            "request-id": "request-1"
+        },
+        "service-a-end": {
+            "service-rate": "100",
+            "clli": "Node1",
+            "service-format": "Ethernet",
+            "node-id": "XPONDER-1"
+        },
+        "service-z-end": {
+            "service-rate": "100",
+            "clli": "Node5",
+            "service-format": "Ethernet",
+            "node-id": "XPONDER-5"
+        },
+        "pce-routing-metric": "hop-count"
+    }
 
     topo_cllinet_data = None
     topo_ordnet_data = None
@@ -79,154 +99,132 @@ class TransportGNPYtesting(unittest.TestCase):
 
     @classmethod
     def tearDownClass(cls):
+        # clean datastores
+        test_utils.del_portmapping()
+        test_utils.del_ietf_network('openroadm-topology')
+        test_utils.del_ietf_network('openroadm-network')
+        test_utils.del_ietf_network('clli-network')
         # pylint: disable=not-an-iterable
         for process in cls.processes:
             test_utils.shutdown_process(process)
         print("all processes killed")
 
     def setUp(self):
-        time.sleep(2)
+        time.sleep(1)
 
      # Load port mapping
     def test_00_load_port_mapping(self):
-        response = test_utils.rawpost_request(test_utils.URL_FULL_PORTMAPPING, self.port_mapping_data)
-        self.assertEqual(response.status_code, requests.codes.no_content)
-        time.sleep(2)
+        response = test_utils.post_portmapping(self.port_mapping_data)
+        self.assertIn(response['status_code'], (requests.codes.created, requests.codes.no_content))
+        time.sleep(1)
 
     # Mount the different topologies
     def test_01_connect_clliNetwork(self):
-        response = test_utils.rawput_request(test_utils.URL_CONFIG_CLLI_NET, self.topo_cllinet_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        time.sleep(3)
+        response = test_utils.put_ietf_network('clli-network', self.topo_cllinet_data)
+        self.assertIn(response['status_code'], (requests.codes.ok, requests.codes.no_content))
+        time.sleep(1)
 
     def test_02_connect_openroadmNetwork(self):
-        response = test_utils.rawput_request(test_utils.URL_CONFIG_ORDM_NET, self.topo_ordnet_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        time.sleep(3)
+        response = test_utils.put_ietf_network('openroadm-network', self.topo_ordnet_data)
+        self.assertIn(response['status_code'], (requests.codes.ok, requests.codes.no_content))
+        time.sleep(1)
 
     def test_03_connect_openroadmTopology(self):
-        response = test_utils.rawput_request(test_utils.URL_CONFIG_ORDM_TOPO, self.topo_ordtopo_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        time.sleep(3)
+        response = test_utils.put_ietf_network('openroadm-topology', self.topo_ordtopo_data)
+        self.assertIn(response['status_code'], (requests.codes.ok, requests.codes.no_content))
+        time.sleep(1)
 
     # Path computed by PCE is feasible according to Gnpy
     def test_04_path_computation_FeasibleWithPCE(self):
-        response = test_utils.path_computation_request("request-1", "service-1",
-                                                       {"node-id": "XPONDER-1", "service-rate": "100",
-                                                           "service-format": "Ethernet", "clli": "Node1"},
-                                                       {"node-id": "XPONDER-5", "service-rate": "100",
-                                                           "service-format": "Ethernet", "clli": "Node5"})
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(res['output']['configuration-response-common'][
-            'response-code'], '200')
-        self.assertEqual(res['output']['configuration-response-common'][
-            'response-message'],
-            'Path is calculated by PCE')
+        response = test_utils.transportpce_api_rpc_request('transportpce-pce',
+                                                           'path-computation-request',
+                                                           self.path_computation_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['output']['configuration-response-common']['response-code'], '200')
+        self.assertEqual(response['output']['configuration-response-common']['response-message'],
+                         'Path is calculated by PCE')
         self.assertIn('A-to-Z',
-                      [res['output']['gnpy-response'][0]['path-dir'],
-                       res['output']['gnpy-response'][1]['path-dir']])
+                      [response['output']['gnpy-response'][0]['path-dir'],
+                       response['output']['gnpy-response'][1]['path-dir']])
         self.assertIn('Z-to-A',
-                      [res['output']['gnpy-response'][0]['path-dir'],
-                       res['output']['gnpy-response'][1]['path-dir']])
-        self.assertEqual(res['output']['gnpy-response'][0]['feasibility'], True)
-        self.assertEqual(res['output']['gnpy-response'][1]['feasibility'], True)
-        time.sleep(5)
+                      [response['output']['gnpy-response'][0]['path-dir'],
+                       response['output']['gnpy-response'][1]['path-dir']])
+        self.assertEqual(response['output']['gnpy-response'][0]['feasibility'], True)
+        self.assertEqual(response['output']['gnpy-response'][1]['feasibility'], True)
+        time.sleep(2)
 
     # Path computed by PCE is not feasible by GNPy and GNPy cannot find
     # another one (low SNR)
     def test_05_path_computation_FoundByPCE_NotFeasibleByGnpy(self):
-        response = test_utils.path_computation_request("request-2", "service-2",
-                                                       {"node-id": "XPONDER-1", "service-rate": "100",
-                                                           "service-format": "Ethernet", "clli": "Node1"},
-                                                       {"node-id": "XPONDER-5", "service-rate": "100",
-                                                           "service-format": "Ethernet", "clli": "Node5"},
-                                                       {"include": {"node-id": [
-                                                           "OpenROADM-2", "OpenROADM-3", "OpenROADM-4"]}})
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(res['output']['configuration-response-common'][
+        self.path_computation_input_data["service-name"] = "service-2"
+        self.path_computation_input_data["service-handler-header"]["request-id"] = "request-2"
+        self.path_computation_input_data["hard-constraints"] =\
+            {"include": {"node-id": ["OpenROADM-2", "OpenROADM-3", "OpenROADM-4"]}}
+        response = test_utils.transportpce_api_rpc_request('transportpce-pce',
+                                                           'path-computation-request',
+                                                           self.path_computation_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['output']['configuration-response-common'][
             'response-code'], '500')
-        self.assertEqual(res['output']['configuration-response-common'][
+        self.assertEqual(response['output']['configuration-response-common'][
             'response-message'],
             'No path available by PCE and GNPy ')
         self.assertIn('A-to-Z',
-                      [res['output']['gnpy-response'][0]['path-dir'],
-                       res['output']['gnpy-response'][1]['path-dir']])
+                      [response['output']['gnpy-response'][0]['path-dir'],
+                       response['output']['gnpy-response'][1]['path-dir']])
         self.assertIn('Z-to-A',
-                      [res['output']['gnpy-response'][0]['path-dir'],
-                       res['output']['gnpy-response'][1]['path-dir']])
-        self.assertEqual(res['output']['gnpy-response'][0]['feasibility'],
+                      [response['output']['gnpy-response'][0]['path-dir'],
+                       response['output']['gnpy-response'][1]['path-dir']])
+        self.assertEqual(response['output']['gnpy-response'][0]['feasibility'],
                          False)
-        self.assertEqual(res['output']['gnpy-response'][1]['feasibility'],
+        self.assertEqual(response['output']['gnpy-response'][1]['feasibility'],
                          False)
-        time.sleep(5)
+        time.sleep(2)
 
     # #PCE cannot find a path while GNPy finds a feasible one
     def test_06_path_computation_NotFoundByPCE_FoundByGNPy(self):
-        response = test_utils.path_computation_request("request-3", "service-3",
-                                                       {"node-id": "XPONDER-1", "service-rate": "100",
-                                                           "service-format": "Ethernet", "clli": "Node1"},
-                                                       {"node-id": "XPONDER-4", "service-rate": "100",
-                                                           "service-format": "Ethernet", "clli": "Node5"},
-                                                       {"include": {"node-id": [
-                                                           "OpenROADM-2", "OpenROADM-3"]}})
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(res['output']['configuration-response-common'][
+        self.path_computation_input_data["service-name"] = "service-3"
+        self.path_computation_input_data["service-handler-header"]["request-id"] = "request-3"
+        self.path_computation_input_data["service-z-end"]["node-id"] = "XPONDER-4"
+        self.path_computation_input_data["hard-constraints"] =\
+            {"include": {"node-id": ["OpenROADM-2", "OpenROADM-3"]}}
+        response = test_utils.transportpce_api_rpc_request('transportpce-pce',
+                                                           'path-computation-request',
+                                                           self.path_computation_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['output']['configuration-response-common'][
             'response-code'], '200')
-        self.assertEqual(res['output']['configuration-response-common'][
+        self.assertEqual(response['output']['configuration-response-common'][
             'response-message'],
             'Path is calculated by GNPy')
         self.assertIn('A-to-Z',
-                      [res['output']['gnpy-response'][0]['path-dir'],
-                       res['output']['gnpy-response'][1]['path-dir']])
+                      [response['output']['gnpy-response'][0]['path-dir'],
+                       response['output']['gnpy-response'][1]['path-dir']])
         self.assertIn('Z-to-A',
-                      [res['output']['gnpy-response'][0]['path-dir'],
-                       res['output']['gnpy-response'][1]['path-dir']])
-        self.assertEqual(res['output']['gnpy-response'][1]['feasibility'], True)
-        self.assertEqual(res['output']['gnpy-response'][0]['feasibility'], True)
-        time.sleep(5)
+                      [response['output']['gnpy-response'][0]['path-dir'],
+                       response['output']['gnpy-response'][1]['path-dir']])
+        self.assertEqual(response['output']['gnpy-response'][1]['feasibility'], True)
+        self.assertEqual(response['output']['gnpy-response'][0]['feasibility'], True)
+        time.sleep(2)
 
     # Not found path by PCE and GNPy cannot find another one
     def test_07_path_computation_FoundByPCE_NotFeasibleByGnpy(self):
-        response = test_utils.path_computation_request("request-4", "service-4",
-                                                       {"node-id": "XPONDER-1", "service-rate": "400",
-                                                           "service-format": "Ethernet", "clli": "Node1"},
-                                                       {"node-id": "XPONDER-4", "service-rate": "400",
-                                                           "service-format": "Ethernet", "clli": "Node4"},
-                                                       {"include": {"node-id": [
-                                                           "OpenROADM-3", "OpenROADM-2",
-                                                           "OpenROADM-5"]}})
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(res['output']['configuration-response-common'][
+        self.path_computation_input_data["service-name"] = "service-4"
+        self.path_computation_input_data["service-handler-header"]["request-id"] = "request-4"
+        self.path_computation_input_data["service-a-end"]["service-rate"] = "400"
+        self.path_computation_input_data["service-z-end"]["service-rate"] = "400"
+        self.path_computation_input_data["service-z-end"]["clli"] = "Node4"
+        self.path_computation_input_data["hard-constraints"] =\
+            {"include": {"node-id": ["OpenROADM-3", "OpenROADM-2", "OpenROADM-5"]}}
+        response = test_utils.transportpce_api_rpc_request('transportpce-pce',
+                                                           'path-computation-request',
+                                                           self.path_computation_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['output']['configuration-response-common'][
             'response-code'], '500')
-        self.assertEqual(res['output']['configuration-response-common'][
+        self.assertEqual(response['output']['configuration-response-common'][
             'response-message'],
             'No path available by PCE and GNPy ')
-        time.sleep(5)
-
-    # Disconnect the different topologies
-    def test_08_disconnect_openroadmTopology(self):
-        response = test_utils.delete_request(test_utils.URL_CONFIG_ORDM_TOPO)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        time.sleep(3)
-
-    def test_09_disconnect_openroadmNetwork(self):
-        response = test_utils.delete_request(test_utils.URL_CONFIG_ORDM_NET)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        time.sleep(3)
-
-    def test_10_disconnect_clliNetwork(self):
-        response = test_utils.delete_request(test_utils.URL_CONFIG_CLLI_NET)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        time.sleep(3)
-
-    # Delete portmapping
-    def test_11_delete_port_mapping(self):
-        response = test_utils.delete_request(test_utils.URL_FULL_PORTMAPPING)
-        self.assertEqual(response.status_code, requests.codes.ok)
         time.sleep(2)
 
 
diff --git a/tests/transportpce_tests/pce/test04_pce_bug_fix.py b/tests/transportpce_tests/pce/test04_pce_bug_fix.py
new file mode 100644 (file)
index 0000000..a8f1764
--- /dev/null
@@ -0,0 +1,136 @@
+#!/usr/bin/env python
+##############################################################################
+# Copyright (c) 2023 Orange, Inc. and others.  All rights reserved.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+# pylint: disable=no-member
+# pylint: disable=too-many-public-methods
+
+import unittest
+import os
+# pylint: disable=wrong-import-order
+import sys
+import time
+import requests
+sys.path.append('transportpce_tests/common/')
+# pylint: disable=wrong-import-position
+# pylint: disable=import-error
+import test_utils  # nopep8
+
+
+class TransportPCEtesting(unittest.TestCase):
+    path_computation_input_data = {
+        "service-name": "service-AB",
+        "resource-reserve": "true",
+        "service-handler-header": {
+            "request-id": "request1"
+        },
+        "service-a-end": {
+            "service-rate": "100",
+            "clli": "NodeA",
+            "service-format": "OC",
+            "node-id": "ROADM-A1"
+        },
+        "service-z-end": {
+            "service-rate": "100",
+            "clli": "NodeB",
+            "service-format": "OC",
+            "node-id": "ROADM-B1"
+        },
+        "pce-routing-metric": "hop-count"
+    }
+
+    openraodm_topo_with_service_BC = None
+    port_mapping_data = None
+    processes = None
+
+    @classmethod
+    def setUpClass(cls):
+        # pylint: disable=bare-except
+        sample_files_parsed = False
+        time.sleep(10)
+        try:
+            TOPO_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                     "..", "..", "sample_configs", "honeynode-topo-3-RDM.json")
+            with open(TOPO_FILE, 'r', encoding='utf-8') as topo:
+                cls.openraodm_topo_with_service_BC = topo.read()
+
+            PORT_MAPPING_FILE = os.path.join(os.path.dirname(os.path.realpath(__file__)),
+                                             "..", "..", "sample_configs", "portmapping-3-RDM-221.json")
+            with open(PORT_MAPPING_FILE, 'r', encoding='utf-8') as port_mapping:
+                cls.port_mapping_data = port_mapping.read()
+            sample_files_parsed = True
+        except PermissionError as err:
+            print("Permission Error when trying to read sample files\n", err)
+            sys.exit(2)
+        except FileNotFoundError as err:
+            print("File Not found Error when trying to read sample files\n", err)
+            sys.exit(2)
+        except:
+            print("Unexpected error when trying to read sample files\n", sys.exc_info()[0])
+            sys.exit(2)
+        finally:
+            if sample_files_parsed:
+                print("sample files content loaded")
+
+        cls.processes = test_utils.start_tpce()
+        time.sleep(5)
+
+    @classmethod
+    def tearDownClass(cls):
+        # clean datastores
+        test_utils.del_portmapping()
+        test_utils.del_ietf_network('openroadm-topology')
+        # pylint: disable=not-an-iterable
+        for process in cls.processes:
+            test_utils.shutdown_process(process)
+        print("all processes killed")
+
+    def setUp(self):
+        time.sleep(1)
+
+    def test_01_load_port_mapping(self):
+        response = test_utils.post_portmapping(self.port_mapping_data)
+        self.assertIn(response['status_code'], (requests.codes.created, requests.codes.no_content))
+        time.sleep(1)
+
+    def test_02_load_openroadm_topology(self):
+        response = test_utils.put_ietf_network('openroadm-topology', self.openraodm_topo_with_service_BC)
+        self.assertIn(response['status_code'], (requests.codes.ok, requests.codes.no_content))
+        time.sleep(1)
+
+    # Path Computation success
+    def test_03_path_computation_AB(self):
+        response = test_utils.transportpce_api_rpc_request('transportpce-pce',
+                                                           'path-computation-request',
+                                                           self.path_computation_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual('Path is calculated by PCE',
+                         response['output']['configuration-response-common']['response-message'])
+        self.assertEqual(
+            2,
+            response['output']['response-parameters']['path-description']['aToZ-direction']['aToZ-wavelength-number'])
+        self.assertEqual(196.025,
+                         float(response['output']['response-parameters']['path-description']['aToZ-direction']
+                               ['aToZ-min-frequency']))
+        self.assertEqual(196.075,
+                         float(response['output']['response-parameters']['path-description']['aToZ-direction']
+                               ['aToZ-max-frequency']))
+        self.assertEqual(
+            2,
+            response['output']['response-parameters']['path-description']['zToA-direction']['zToA-wavelength-number'])
+        self.assertEqual(196.025,
+                         float(response['output']['response-parameters']['path-description']['zToA-direction']
+                               ['zToA-min-frequency']))
+        self.assertEqual(196.075,
+                         float(response['output']['response-parameters']['path-description']['zToA-direction']
+                               ['zToA-max-frequency']))
+
+
+if __name__ == "__main__":
+    unittest.main(verbosity=2)
index f3960b1abc3e518a1b3ab610184a44441678ce35..2a2cec4e84db01434b43bc8f6a5fbfcf64579857 100644 (file)
@@ -34,7 +34,7 @@ class TransportTapitesting(unittest.TestCase):
     processes = None
     WAITING = 20
     NODE_VERSION = '2.2.1'
-    cr_serv_sample_data = {"input": {
+    cr_serv_input_data = {
         "sdnc-request-header": {
             "request-id": "request-1",
             "rpc-action": "service-create",
@@ -126,8 +126,20 @@ class TransportTapitesting(unittest.TestCase):
         "due-date": "2018-06-15T00:00:01Z",
         "operator-contact": "pw1234"
     }
+
+    del_serv_input_data = {
+        "sdnc-request-header": {
+            "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
+            "rpc-action": "service-delete",
+            "request-system-id": "appname",
+            "notification-url": "http://localhost:8585/NotificationServer/notify"},
+        "service-delete-req-info": {
+            "service-name": "TBD",
+            "tail-retention": "no"}
     }
 
+    tapi_topo = {"topology-id": "TBD"}
+
     @classmethod
     def setUpClass(cls):
         cls.init_failed = False
@@ -135,7 +147,7 @@ class TransportTapitesting(unittest.TestCase):
         os.environ['JAVA_MAX_MEM'] = '4096M'
         cls.processes = test_utils.start_tpce()
         # TAPI feature is not installed by default in Karaf
-        if "USE_LIGHTY" not in os.environ or os.environ['USE_LIGHTY'] != 'True':
+        if "NO_ODL_STARTUP" not in os.environ or "USE_LIGHTY" not in os.environ or os.environ['USE_LIGHTY'] != 'True':
             print("installing tapi feature...")
             result = test_utils.install_karaf_feature("odl-transportpce-tapi")
             if result.returncode != 0:
@@ -172,256 +184,204 @@ class TransportTapitesting(unittest.TestCase):
         print("execution of {}".format(self.id().split(".")[-1]))
 
     def test_01_get_tapi_topology_T100G(self):
-        url = "{}/operations/tapi-topology:get-topology-details"
-        data = {
-            "tapi-topology:input": {
-                "tapi-topology:topology-id-or-name": "Transponder 100GE"
-            }
-        }
-        response = test_utils.post_request(url, data)
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        self.assertEqual(len(res["output"]["topology"]["node"]), 1, 'Topology should contain 1 node')
-        self.assertNotIn("link", res["output"]["topology"], 'Topology should contain no link')
-        self.assertNotIn("owned-node-edge-point", res["output"]["topology"]["node"][0],
+        self.tapi_topo["topology-id"] = test_utils.T100GE_UUID
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-topology-details', self.tapi_topo)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response["output"]["topology"]["node"]), 1, 'Topology should contain 1 node')
+        self.assertNotIn("link", response["output"]["topology"], 'Topology should contain no link')
+        self.assertNotIn("owned-node-edge-point", response["output"]["topology"]["node"][0],
                          'Node should contain no owned-node-edge-points')
-        self.assertEqual("Tpdr100g over WDM node", res["output"]["topology"]["node"][0]["name"][0]["value"],
+        self.assertEqual("Tpdr100g over WDM node", response["output"]["topology"]["node"][0]["name"][0]["value"],
                          'node name should be: Tpdr100g over WDM node')
-        self.assertIn("ETH", res["output"]["topology"]["node"][0]["layer-protocol-name"],
+        self.assertIn("ETH", response["output"]["topology"]["node"][0]["layer-protocol-name"],
                       'Node layer protocol should contain ETH')
-        self.assertEqual(1, len(res["output"]["topology"]["node"][0]["node-rule-group"]),
+        self.assertEqual(1, len(response["output"]["topology"]["node"][0]["node-rule-group"]),
                          'node should contain 1 node rule group')
 
     def test_02_get_tapi_topology_T0(self):
-        url = "{}/operations/tapi-topology:get-topology-details"
-        data = {
-            "tapi-topology:input": {
-                "tapi-topology:topology-id-or-name": "T0 - Multi-layer topology"
-            }
-        }
-        response = test_utils.post_request(url, data)
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        self.assertNotIn("node", res["output"]["topology"], 'Topology should contain no node')
-        self.assertNotIn("link", res["output"]["topology"], 'Topology should contain no link')
+        self.tapi_topo["topology-id"] = test_utils.T0_MULTILAYER_TOPO_UUID
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-topology-details', self.tapi_topo)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertNotIn("node", response["output"]["topology"], 'Topology should contain no node')
+        self.assertNotIn("link", response["output"]["topology"], 'Topology should contain no link')
 
     def test_03_connect_rdmb(self):
         response = test_utils.mount_device("ROADM-B1", ('roadmb', self.NODE_VERSION))
         self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
-        time.sleep(10)
 
     def test_04_check_tapi_topos(self):
-        url = "{}/operations/tapi-topology:get-topology-details"
-        data = {
-            "tapi-topology:input": {
-                "tapi-topology:topology-id-or-name": "Transponder 100GE"
-            }
-        }
-        response = test_utils.post_request(url, data)
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        self.assertEqual(len(res["output"]["topology"]["node"]), 1, 'Topology should contain 1 node')
-        self.assertNotIn("link", res["output"]["topology"], 'Topology should contain no link')
-
-        url = "{}/operations/tapi-topology:get-topology-details"
-        data = {
-            "tapi-topology:input": {
-                "tapi-topology:topology-id-or-name": "T0 - Multi-layer topology"
-            }
-        }
-        response = test_utils.post_request(url, data)
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        self.assertEqual(len(res["output"]["topology"]["node"]), 1, 'Topology should contain 1 node')
-        self.assertNotIn("link", res["output"]["topology"], 'Topology should contain no link')
+        self.tapi_topo["topology-id"] = test_utils.T100GE_UUID
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-topology-details', self.tapi_topo)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response["output"]["topology"]["node"]), 1, 'Topology should contain 1 node')
+        self.assertNotIn("link", response["output"]["topology"], 'Topology should contain no link')
+
+        self.tapi_topo["topology-id"] = test_utils.T0_MULTILAYER_TOPO_UUID
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-topology-details', self.tapi_topo)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response["output"]["topology"]["node"]), 1, 'Topology should contain 1 node')
+        self.assertNotIn("link", response["output"]["topology"], 'Topology should contain no link')
 
     def test_05_disconnect_roadmb(self):
         response = test_utils.unmount_device("ROADM-B1")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        time.sleep(5)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_06_connect_xpdra(self):
         response = test_utils.mount_device("XPDR-A1", ('xpdra', self.NODE_VERSION))
         self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
-        time.sleep(10)
 
     def test_07_check_tapi_topos(self):
-        url = "{}/operations/tapi-topology:get-topology-details"
-        data = {
-            "tapi-topology:input": {
-                "tapi-topology:topology-id-or-name": "T0 - Multi-layer topology"
-            }
-        }
-        response = test_utils.post_request(url, data)
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        self.assertNotIn("node", res["output"]["topology"], 'Topology should contain no node')
-        self.assertNotIn("link", res["output"]["topology"], 'Topology should contain no link')
+        self.tapi_topo["topology-id"] = test_utils.T0_MULTILAYER_TOPO_UUID
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-topology-details', self.tapi_topo)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertNotIn("node", response["output"]["topology"], 'Topology should contain no node')
+        self.assertNotIn("link", response["output"]["topology"], 'Topology should contain no link')
 
     def test_08_connect_rdma(self):
         response = test_utils.mount_device("ROADM-A1", ('roadma', self.NODE_VERSION))
         self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
-        time.sleep(10)
 
     def test_09_connect_rdmc(self):
         response = test_utils.mount_device("ROADM-C1", ('roadmc', self.NODE_VERSION))
         self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
-        time.sleep(10)
 
     def test_10_check_tapi_topos(self):
         self.test_01_get_tapi_topology_T100G()
-
-        url = "{}/operations/tapi-topology:get-topology-details"
-        data = {
-            "tapi-topology:input": {
-                "tapi-topology:topology-id-or-name": "T0 - Multi-layer topology"
-            }
-        }
-        response = test_utils.post_request(url, data)
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        self.assertEqual(1, len(res["output"]["topology"]["node"]), 'Topology should contain 1 node')
-        self.assertNotIn("link", res["output"]["topology"], 'Topology should contain no link')
-        self.assertEqual("ROADM-infra", res["output"]["topology"]["node"][0]["name"][0]["value"],
+        self.tapi_topo["topology-id"] = test_utils.T0_MULTILAYER_TOPO_UUID
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-topology-details', self.tapi_topo)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(1, len(response["output"]["topology"]["node"]), 'Topology should contain 1 node')
+        self.assertNotIn("link", response["output"]["topology"], 'Topology should contain no link')
+#        self.assertEqual("ROADM-infra", response["output"]["topology"]["node"][0]["name"][0]["value"],
+#                        'node name should be: ROADM-infra')
+        nodes = response["output"]["topology"]["node"]
+        self.assertEqual("ROADM-infra",
+                         response["output"]["topology"]["node"][0]["name"][count_position_name_from_value_name(
+                             response["output"]["topology"]["node"][0]["name"], "otsi node name")]["value"],
                          'node name should be: ROADM-infra')
-        self.assertIn("PHOTONIC_MEDIA", res["output"]["topology"]["node"][0]["layer-protocol-name"],
+        self.assertEqual(1, count_object_with_double_key(nodes, "name", "value-name", "otsi node name"),
+                         'Topology should contain 1 otsi nodes')
+        self.assertIn("PHOTONIC_MEDIA", response["output"]["topology"]["node"][0]["layer-protocol-name"],
                       'Node layer protocol should contain PHOTONIC_MEDIA')
-        self.assertEqual(1, len(res["output"]["topology"]["node"][0]["node-rule-group"]),
-                         'node should contain 1 node rule group')
-
-    def test_11_connect_xprda_n1_to_roadma_pp1(self):
-        response = test_utils.connect_xpdr_to_rdm_request("XPDR-A1", "1", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully', res["output"]["result"],
+        self.assertNotIn("node-rule-group", response["output"]["topology"]["node"][0],
+                         'Topology should contain no node-rule-group')
+
+    def test_11_connect_xpdra_n1_to_roadma_pp1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDR-A1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"],
                       CREATED_SUCCESSFULLY)
         time.sleep(2)
 
     def test_12_connect_roadma_pp1_to_xpdra_n1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("XPDR-A1", "1", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully', res["output"]["result"],
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDR-A1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"],
                       CREATED_SUCCESSFULLY)
         time.sleep(2)
 
     def test_13_check_tapi_topology_T100G(self):
-        url = "{}/operations/tapi-topology:get-topology-details"
-        data = {
-            "tapi-topology:input": {
-                "tapi-topology:topology-id-or-name": "Transponder 100GE"
-            }
-        }
-        response = test_utils.post_request(url, data)
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        self.assertEqual(1, len(res["output"]["topology"]["node"][0]["owned-node-edge-point"]),
+        self.tapi_topo["topology-id"] = test_utils.T100GE_UUID
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-topology-details', self.tapi_topo)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(1, len(response["output"]["topology"]["node"][0]["owned-node-edge-point"]),
                          'Node should contain 1 owned-node-edge-points')
         self.assertEqual("XPDR-A1-XPDR1+DSR+XPDR1-CLIENT1",
-                         res["output"]["topology"]["node"][0]["owned-node-edge-point"][0]["name"][0]["value"],
+                         response["output"]["topology"]["node"][0]["owned-node-edge-point"][0]["name"][0]["value"],
                          'name of owned-node-edge-points should be XPDR-A1-XPDR1+DSR+XPDR1-CLIENT1')
 
     def test_14_check_tapi_topology_T0(self):
-        url = "{}/operations/tapi-topology:get-topology-details"
-        data = {
-            "tapi-topology:input": {
-                "tapi-topology:topology-id-or-name": "T0 - Multi-layer topology"
-            }
-        }
-        response = test_utils.post_request(url, data)
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        nodes = res["output"]["topology"]["node"]
-        links = res["output"]["topology"]["link"]
-        self.assertEqual(3, len(nodes), 'Topology should contain 3 nodes')
-        self.assertEqual(2, len(links), 'Topology should contain 2 links')
+        self.tapi_topo["topology-id"] = test_utils.T0_MULTILAYER_TOPO_UUID
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-topology-details', self.tapi_topo)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        nodes = response["output"]["topology"]["node"]
+        links = response["output"]["topology"]["link"]
+        self.assertEqual(2, len(nodes), 'Topology should contain 2 nodes')
+        self.assertEqual(1, len(links), 'Topology should contain 1 link')
         self.assertEqual(2, count_object_with_double_key(nodes, "name", "value-name", "otsi node name"),
                          'Topology should contain 2 otsi nodes')
         self.assertEqual(1, count_object_with_double_key(nodes, "name", "value-name", "dsr/odu node name"),
                          'Topology should contain 1 dsr node')
-        self.assertEqual(1, count_object_with_double_key(links, "name", "value-name", "transitional link name"),
-                         'Topology should contain 1 transitional link')
-        self.assertEqual(1, count_object_with_double_key(links, "name", "value-name", "OMS link name"),
-                         'Topology should contain 1 oms link')
+        self.assertEqual(1, count_object_with_double_key(links, "name", "value-name", "OTS link name"),
+                         'Topology should contain 1 ots link')
 
     def test_15_connect_xpdrc(self):
         response = test_utils.mount_device("XPDR-C1", ('xpdrc', self.NODE_VERSION))
         self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
-        time.sleep(10)
-
-    def test_16_connect_xprdc_n1_to_roadmc_pp1(self):
-        response = test_utils.connect_xpdr_to_rdm_request("XPDR-C1", "1", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully', res["output"]["result"],
+
+    def test_16_connect_xpdrc_n1_to_roadmc_pp1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDR-C1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"],
                       CREATED_SUCCESSFULLY)
         time.sleep(2)
 
     def test_17_connect_roadmc_pp1_to_xpdrc_n1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("XPDR-C1", "1", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully', res["output"]["result"],
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDR-C1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"],
                       CREATED_SUCCESSFULLY)
         time.sleep(2)
 
     def test_18_check_tapi_topology_T100G(self):
-        url = "{}/operations/tapi-topology:get-topology-details"
-        data = {
-            "tapi-topology:input": {
-                "tapi-topology:topology-id-or-name": "Transponder 100GE"
-            }
-        }
-        response = test_utils.post_request(url, data)
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        self.assertEqual(2, len(res["output"]["topology"]["node"][0]["owned-node-edge-point"]),
+        self.tapi_topo["topology-id"] = test_utils.T100GE_UUID
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-topology-details', self.tapi_topo)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(2, len(response["output"]["topology"]["node"][0]["owned-node-edge-point"]),
                          'Node should contain 2 owned-node-edge-points')
         self.assertEqual("XPDR-C1-XPDR1+DSR+XPDR1-CLIENT1",
-                         res["output"]["topology"]["node"][0]["owned-node-edge-point"][0]["name"][0]["value"],
+                         response["output"]["topology"]["node"][0]["owned-node-edge-point"][0]["name"][0]["value"],
                          'name of owned-node-edge-points should be XPDR-C1-XPDR1+DSR+XPDR1-CLIENT1')
         self.assertEqual("XPDR-A1-XPDR1+DSR+XPDR1-CLIENT1",
-                         res["output"]["topology"]["node"][0]["owned-node-edge-point"][1]["name"][0]["value"],
+                         response["output"]["topology"]["node"][0]["owned-node-edge-point"][1]["name"][0]["value"],
                          'name of owned-node-edge-points should be XPDR-A1-XPDR1+DSR+XPDR1-CLIENT1')
 
     def test_19_check_tapi_topology_T0(self):
-        url = "{}/operations/tapi-topology:get-topology-details"
-        data = {
-            "tapi-topology:input": {
-                "tapi-topology:topology-id-or-name": "T0 - Multi-layer topology"
-            }
-        }
-        response = test_utils.post_request(url, data)
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        nodes = res["output"]["topology"]["node"]
-        links = res["output"]["topology"]["link"]
-        self.assertEqual(5, len(nodes), 'Topology should contain 5 nodes')
-        self.assertEqual(4, len(links), 'Topology should contain 4 links')
+        self.tapi_topo["topology-id"] = test_utils.T0_MULTILAYER_TOPO_UUID
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-topology-details', self.tapi_topo)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        nodes = response["output"]["topology"]["node"]
+        links = response["output"]["topology"]["link"]
+        self.assertEqual(3, len(nodes), 'Topology should contain 3 nodes')
+        self.assertEqual(2, len(links), 'Topology should contain 2 links')
         self.assertEqual(3, count_object_with_double_key(nodes, "name", "value-name", "otsi node name"),
                          'Topology should contain 3 otsi nodes')
         self.assertEqual(2, count_object_with_double_key(nodes, "name", "value-name", "dsr/odu node name"),
                          'Topology should contain 2 dsr nodes')
-        self.assertEqual(2, count_object_with_double_key(links, "name", "value-name", "transitional link name"),
-                         'Topology should contain 2 transitional links')
-        self.assertEqual(2, count_object_with_double_key(links, "name", "value-name", "OMS link name"),
-                         'Topology should contain 2 oms links')
+        self.assertEqual(2, count_object_with_double_key(links, "name", "value-name", "OTS link name"),
+                         'Topology should contain 2 ots links')
 
     def test_20_connect_spdr_sa1(self):
         response = test_utils.mount_device("SPDR-SA1", ('spdra', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
-        time.sleep(10)
-        # TODO replace connect and disconnect timers with test_utils.wait_until_log_contains
+        self.assertEqual(response.status_code,
+                         requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_21_connect_spdr_sc1(self):
         response = test_utils.mount_device("SPDR-SC1", ('spdrc', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
-        time.sleep(10)
-        # TODO replace connect and disconnect timers with test_utils.wait_until_log_contains
+        self.assertEqual(response.status_code,
+                         requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_22_check_tapi_topology_T100G(self):
         self.test_18_check_tapi_topology_T100G()
@@ -430,38 +390,42 @@ class TransportTapitesting(unittest.TestCase):
         self.test_19_check_tapi_topology_T0()
 
     def test_24_connect_sprda_n1_to_roadma_pp2(self):
-        response = test_utils.connect_xpdr_to_rdm_request("SPDR-SA1", "1", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully', res["output"]["result"],
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'SPDR-SA1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"],
                       CREATED_SUCCESSFULLY)
         time.sleep(2)
 
     def test_25_connect_roadma_pp2_to_spdra_n1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("SPDR-SA1", "1", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully', res["output"]["result"],
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'SPDR-SA1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"],
                       CREATED_SUCCESSFULLY)
         time.sleep(2)
 
     def test_26_connect_sprdc_n1_to_roadmc_pp2(self):
-        response = test_utils.connect_xpdr_to_rdm_request("SPDR-SC1", "1", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully', res["output"]["result"],
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'SPDR-SC1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"],
                       CREATED_SUCCESSFULLY)
         time.sleep(2)
 
     def test_27_connect_roadmc_pp2_to_spdrc_n1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("SPDR-SC1", "1", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP2-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully', res["output"]["result"],
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'SPDR-SC1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP2-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"],
                       CREATED_SUCCESSFULLY)
         time.sleep(2)
 
@@ -469,27 +433,20 @@ class TransportTapitesting(unittest.TestCase):
         self.test_18_check_tapi_topology_T100G()
 
     def test_29_check_tapi_topology_T0(self):
-        url = "{}/operations/tapi-topology:get-topology-details"
-        data = {
-            "tapi-topology:input": {
-                "tapi-topology:topology-id-or-name": "T0 - Multi-layer topology"
-            }
-        }
-        response = test_utils.post_request(url, data)
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        nodes = res["output"]["topology"]["node"]
-        links = res["output"]["topology"]["link"]
-        self.assertEqual(9, len(nodes), 'Topology should contain 9 nodes')
-        self.assertEqual(8, len(links), 'Topology should contain 8 links')
+        self.tapi_topo["topology-id"] = test_utils.T0_MULTILAYER_TOPO_UUID
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-topology-details', self.tapi_topo)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        nodes = response["output"]["topology"]["node"]
+        links = response["output"]["topology"]["link"]
+        self.assertEqual(5, len(nodes), 'Topology should contain 5 nodes')
+        self.assertEqual(4, len(links), 'Topology should contain 4 links')
         self.assertEqual(5, count_object_with_double_key(nodes, "name", "value-name", "otsi node name"),
                          'Topology should contain 5 otsi nodes')
         self.assertEqual(4, count_object_with_double_key(nodes, "name", "value-name", "dsr/odu node name"),
                          'Topology should contain 4 dsr nodes')
-        self.assertEqual(4, count_object_with_double_key(links, "name", "value-name", "transitional link name"),
-                         'Topology should contain 4 transitional links')
-        self.assertEqual(4, count_object_with_double_key(links, "name", "value-name", "OMS link name"),
-                         'Topology should contain 4 oms links')
+        self.assertEqual(4, count_object_with_double_key(links, "name", "value-name", "OTS link name"),
+                         'Topology should contain 4 ots links')
 
     def test_30_add_oms_attributes(self):
         # Config ROADMA-ROADMC oms-attributes
@@ -503,7 +460,8 @@ class TransportTapitesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request("ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request(
+            "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
         # Config ROADMC-ROADMA oms-attributes
         data = {"span": {
@@ -516,80 +474,69 @@ class TransportTapitesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request("ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request(
+            "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
 
     def test_31_create_OCH_OTU4_service(self):
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_32_check_tapi_topology_T0(self):
-        url = "{}/operations/tapi-topology:get-topology-details"
-        data = {
-            "tapi-topology:input": {
-                "tapi-topology:topology-id-or-name": "T0 - Multi-layer topology"
-            }
-        }
-        response = test_utils.post_request(url, data)
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        nodes = res["output"]["topology"]["node"]
-        links = res["output"]["topology"]["link"]
-        self.assertEqual(9, len(nodes), 'Topology should contain 9 nodes')
-        self.assertEqual(9, len(links), 'Topology should contain 9 links')
-        self.assertEqual(4, count_object_with_double_key(links, "name", "value-name", "transitional link name"),
-                         'Topology should contain 4 transitional links')
-        self.assertEqual(4, count_object_with_double_key(links, "name", "value-name", "OMS link name"),
-                         'Topology should contain 4 oms links')
+        self.tapi_topo["topology-id"] = test_utils.T0_MULTILAYER_TOPO_UUID
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-topology-details', self.tapi_topo)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        nodes = response["output"]["topology"]["node"]
+        links = response["output"]["topology"]["link"]
+        self.assertEqual(5, len(nodes), 'Topology should contain 5 nodes')
+        self.assertEqual(5, len(links), 'Topology should contain 5 links')
+        self.assertEqual(4, count_object_with_double_key(links, "name", "value-name", "OTS link name"),
+                         'Topology should contain 4 ots links')
         self.assertEqual(1, count_object_with_double_key(links, "name", "value-name", "otn link name"),
                          'Topology should contain 1 otn link')
         for link in links:
             if link["name"][0]["value"] == "OTU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1":
-                self.assertEqual(100000, link["available-capacity"]["total-size"]["value"],
+                self.assertEqual(100000, int(link["available-capacity"]["total-size"]["value"]),
                                  'OTU4 link should have an available capacity of 100 000 Mbps')
-            elif link["name"][0]["value-name"] == "transitional link name":
-                self.assertEqual(100, link["available-capacity"]["total-size"]["value"],
-                                 'link should have an available capacity of 100 Gbps')
+#            elif link["name"][0]["value-name"] == "transitional link name":
+#                self.assertEqual(100, int(link["available-capacity"]["total-size"]["value"]),
+#                                 'link should have an available capacity of 100 Gbps')
             self.assertEqual(2, len(link["node-edge-point"]), 'link should have 2 neps')
 
     def test_33_create_ODU4_service(self):
-        self.cr_serv_sample_data["input"]["service-name"] = "service1-ODU4"
-        self.cr_serv_sample_data["input"]["service-a-end"]["service-format"] = "ODU"
-        del self.cr_serv_sample_data["input"]["service-a-end"]["otu-service-rate"]
-        self.cr_serv_sample_data["input"]["service-a-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODU4"
-        self.cr_serv_sample_data["input"]["service-z-end"]["service-format"] = "ODU"
-        del self.cr_serv_sample_data["input"]["service-z-end"]["otu-service-rate"]
-        self.cr_serv_sample_data["input"]["service-z-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODU4"
-
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.cr_serv_input_data["service-name"] = "service1-ODU4"
+        self.cr_serv_input_data["service-a-end"]["service-format"] = "ODU"
+        del self.cr_serv_input_data["service-a-end"]["otu-service-rate"]
+        self.cr_serv_input_data["service-a-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODU4"
+        self.cr_serv_input_data["service-z-end"]["service-format"] = "ODU"
+        del self.cr_serv_input_data["service-z-end"]["otu-service-rate"]
+        self.cr_serv_input_data["service-z-end"]["odu-service-rate"] = "org-openroadm-otn-common-types:ODU4"
+
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create',
+            self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_34_check_tapi_topology_T0(self):
-        url = "{}/operations/tapi-topology:get-topology-details"
-        data = {
-            "tapi-topology:input": {
-                "tapi-topology:topology-id-or-name": "T0 - Multi-layer topology"
-            }
-        }
-        response = test_utils.post_request(url, data)
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        nodes = res["output"]["topology"]["node"]
-        links = res["output"]["topology"]["link"]
-        self.assertEqual(9, len(nodes), 'Topology should contain 9 nodes')
-        self.assertEqual(10, len(links), 'Topology should contain 10 links')
-        self.assertEqual(4, count_object_with_double_key(links, "name", "value-name", "transitional link name"),
-                         'Topology should contain 4 transitional links')
-        self.assertEqual(4, count_object_with_double_key(links, "name", "value-name", "OMS link name"),
-                         'Topology should contain 4 oms links')
+        self.tapi_topo["topology-id"] = test_utils.T0_MULTILAYER_TOPO_UUID
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-topology-details', self.tapi_topo)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        nodes = response["output"]["topology"]["node"]
+        links = response["output"]["topology"]["link"]
+        self.assertEqual(5, len(nodes), 'Topology should contain 5 nodes')
+        self.assertEqual(6, len(links), 'Topology should contain 6 links')
+        self.assertEqual(4, count_object_with_double_key(links, "name", "value-name", "OTS link name"),
+                         'Topology should contain 4 ots links')
         self.assertEqual(2, count_object_with_double_key(links, "name", "value-name", "otn link name"),
                          'Topology should contain 2 otn links')
         for link in links:
@@ -597,141 +544,124 @@ class TransportTapitesting(unittest.TestCase):
                 self.assertEqual(0, link["available-capacity"]["total-size"]["value"],
                                  'OTU4 link should have an available capacity of 0 Mbps')
             elif link["name"][0]["value"] == "ODU4-SPDR-SA1-XPDR1-XPDR1-NETWORK1toSPDR-SC1-XPDR1-XPDR1-NETWORK1":
-                self.assertEqual(100000, link["available-capacity"]["total-size"]["value"],
+                self.assertEqual(100000, int(link["available-capacity"]["total-size"]["value"]),
                                  'ODU4 link should have an available capacity of 100 000 Mbps')
-            elif link["name"][0]["value-name"] == "transitional link name":
-                self.assertEqual(100, link["available-capacity"]["total-size"]["value"],
-                                 'link should have an available capacity of 100 Gbps')
+#            elif link["name"][0]["value-name"] == "transitional link name":
+#                self.assertEqual(100, int(link["available-capacity"]["total-size"]["value"]),
+#                                 'link should have an available capacity of 100 Gbps')
             self.assertEqual(2, len(link["node-edge-point"]), 'link should have 2 neps')
 
     def test_35_connect_sprda_2_n2_to_roadma_pp3(self):
-        response = test_utils.connect_xpdr_to_rdm_request("SPDR-SA1", "2", "2",
-                                                          "ROADM-A1", "1", "SRG1-PP3-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully', res["output"]["result"],
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'SPDR-SA1', 'xpdr-num': '2', 'network-num': '2',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP3-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"],
                       CREATED_SUCCESSFULLY)
         time.sleep(2)
 
     def test_36_connect_roadma_pp3_to_spdra_2_n2(self):
-        response = test_utils.connect_rdm_to_xpdr_request("SPDR-SA1", "2", "2",
-                                                          "ROADM-A1", "1", "SRG1-PP3-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully', res["output"]["result"],
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'SPDR-SA1', 'xpdr-num': '2', 'network-num': '2',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP3-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"],
                       CREATED_SUCCESSFULLY)
         time.sleep(2)
 
     def test_37_check_tapi_topology_T0(self):
-        url = "{}/operations/tapi-topology:get-topology-details"
-        data = {
-            "tapi-topology:input": {
-                "tapi-topology:topology-id-or-name": "T0 - Multi-layer topology"
-            }
-        }
-        response = test_utils.post_request(url, data)
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        nodes = res["output"]["topology"]["node"]
-        links = res["output"]["topology"]["link"]
-        self.assertEqual(11, len(nodes), 'Topology should contain 11 nodes')
-        self.assertEqual(12, len(links), 'Topology should contain 12 links')
+        self.tapi_topo["topology-id"] = test_utils.T0_MULTILAYER_TOPO_UUID
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-topology-details', self.tapi_topo)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        nodes = response["output"]["topology"]["node"]
+        links = response["output"]["topology"]["link"]
+        self.assertEqual(6, len(nodes), 'Topology should contain 6 nodes')
+        self.assertEqual(7, len(links), 'Topology should contain 7 links')
         self.assertEqual(6, count_object_with_double_key(nodes, "name", "value-name", "otsi node name"),
                          'Topology should contain 6 otsi nodes')
-        self.assertEqual(5, count_object_with_double_key(nodes, "name", "value-name", "dsr/odu node name"),
-                         'Topology should contain 5 dsr nodes')
-        self.assertEqual(5, count_object_with_double_key(links, "name", "value-name", "transitional link name"),
-                         'Topology should contain 5 transitional links')
-        self.assertEqual(5, count_object_with_double_key(links, "name", "value-name", "OMS link name"),
-                         'Topology should contain 5 oms links')
+        self.assertEqual(5, count_object_with_double_key(links, "name", "value-name", "OTS link name"),
+                         'Topology should contain 5 ots links')
         self.assertEqual(2, count_object_with_double_key(links, "name", "value-name", "otn link name"),
                          'Topology should contain 2 otn links')
+        self.assertEqual(5, count_object_with_double_key(nodes, "name", "value-name", "dsr/odu node name"),
+                         'Topology should contain 5 dsr nodes')
 
     def test_38_delete_ODU4_service(self):
-        response = test_utils.service_delete_request("service1-ODU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service1-ODU4"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
-        time.sleep(20)
+                      response['output']['configuration-response-common']['response-message'])
+        time.sleep(self.WAITING)
 
     def test_39_delete_OCH_OTU4_service(self):
-        response = test_utils.service_delete_request("service1-OCH-OTU4")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service1-OCH-OTU4"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete',
+            self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
-        time.sleep(20)
+                      response['output']['configuration-response-common']['response-message'])
+        time.sleep(self.WAITING)
 
     def test_40_check_tapi_topology_T0(self):
-        url = "{}/operations/tapi-topology:get-topology-details"
-        data = {
-            "tapi-topology:input": {
-                "tapi-topology:topology-id-or-name": "T0 - Multi-layer topology"
-            }
-        }
-        response = test_utils.post_request(url, data)
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        nodes = res["output"]["topology"]["node"]
-        links = res["output"]["topology"]["link"]
-        self.assertEqual(11, len(nodes), 'Topology should contain 11 nodes')
-        self.assertEqual(10, len(links), 'Topology should contain 10 links')
+        self.tapi_topo["topology-id"] = test_utils.T0_MULTILAYER_TOPO_UUID
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-topology-details', self.tapi_topo)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        nodes = response["output"]["topology"]["node"]
+        links = response["output"]["topology"]["link"]
+        self.assertEqual(6, len(nodes), 'Topology should contain 6 nodes')
+        self.assertEqual(5, len(links), 'Topology should contain 5 links')
         self.assertEqual(0, count_object_with_double_key(links, "name", "value-name", "otn link name"),
                          'Topology should contain 0 otn link')
 
     def test_41_disconnect_xponders_from_roadm(self):
-        url = "{}/config/ietf-network:networks/network/openroadm-topology/ietf-network-topology:link/"
-        response = test_utils.get_ordm_topo_request("")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        links = res['network'][0]['ietf-network-topology:link']
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        links = response['network'][0]['ietf-network-topology:link']
         for link in links:
             if link["org-openroadm-common-network:link-type"] in ('XPONDER-OUTPUT', 'XPONDER-INPUT'):
-                link_name = link["link-id"]
-                response = test_utils.delete_request(url+link_name)
-                self.assertEqual(response.status_code, requests.codes.ok)
+                response = test_utils.del_ietf_network_link_request(
+                    'openroadm-topology', link['link-id'], 'config')
+                self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_42_check_tapi_topology_T0(self):
-        url = "{}/operations/tapi-topology:get-topology-details"
-        data = {
-            "tapi-topology:input": {
-                "tapi-topology:topology-id-or-name": "T0 - Multi-layer topology"
-            }
-        }
-        response = test_utils.post_request(url, data)
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        nodes = res["output"]["topology"]["node"]
-        self.assertEqual(1, len(nodes), 'Topology should contain 1 node')
-        self.assertNotIn("link", res["output"]["topology"], 'Topology should contain no link')
-        self.assertEqual("ROADM-infra", res["output"]["topology"]["node"][0]["name"][0]["value"],
+        self.tapi_topo["topology-id"] = test_utils.T0_MULTILAYER_TOPO_UUID
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-topology-details', self.tapi_topo)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(1, len(response["output"]["topology"]["node"]), 'Topology should contain 1 node')
+        self.assertNotIn("link", response["output"]["topology"], 'Topology should contain no link')
+#        self.assertEqual("ROADM-infra", response["output"]["topology"]["node"][0]["name"][0]["value"],
+#                         'node name should be: ROADM-infra')
+        self.assertEqual("ROADM-infra",
+                         response["output"]["topology"]["node"][0]["name"][count_position_name_from_value_name(
+                             response["output"]["topology"]["node"][0]["name"], "otsi node name")]["value"],
                          'node name should be: ROADM-infra')
 
     def test_43_get_tapi_topology_T100G(self):
-        url = "{}/operations/tapi-topology:get-topology-details"
-        data = {
-            "tapi-topology:input": {
-                "tapi-topology:topology-id-or-name": "Transponder 100GE"
-            }
-        }
-        response = test_utils.post_request(url, data)
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        res = response.json()
-        self.assertEqual(len(res["output"]["topology"]["node"]), 1, 'Topology should contain 1 node')
-        self.assertNotIn("link", res["output"]["topology"], 'Topology should contain no link')
-        self.assertNotIn("owned-node-edge-point", res["output"]["topology"]["node"][0],
+        self.tapi_topo["topology-id"] = test_utils.T100GE_UUID
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-topology-details', self.tapi_topo)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response["output"]["topology"]["node"]), 1, 'Topology should contain 1 node')
+        self.assertNotIn("link", response["output"]["topology"], 'Topology should contain no link')
+        self.assertNotIn("owned-node-edge-point", response["output"]["topology"]["node"][0],
                          'Node should contain no owned-node-edge-points')
 
     def test_44_disconnect_roadma(self):
         response = test_utils.unmount_device("ROADM-A1")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        time.sleep(5)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_45_disconnect_roadmc(self):
         response = test_utils.unmount_device("ROADM-C1")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        time.sleep(5)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_46_check_tapi_topos(self):
         self.test_01_get_tapi_topology_T100G()
@@ -739,38 +669,39 @@ class TransportTapitesting(unittest.TestCase):
 
     def test_47_disconnect_xpdra(self):
         response = test_utils.unmount_device("XPDR-A1")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        time.sleep(5)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_48_disconnect_xpdrc(self):
         response = test_utils.unmount_device("XPDR-C1")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        time.sleep(5)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_49_disconnect_spdr_sa1(self):
         response = test_utils.unmount_device("SPDR-SA1")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-        time.sleep(5)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_50_disconnect_spdr_sc1(self):
         response = test_utils.unmount_device("SPDR-SC1")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
-
-
-def find_object_with_key(list_dicts, key, value):
-    for dict_ in list_dicts:
-        if dict_[key] == value:
-            return dict_
-    return None
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
 
 def count_object_with_double_key(list_dicts, key1, key2, value):
     nb = 0
     for dictio in list_dicts:
-        if dictio[key1][0][key2] == value:
-            nb += 1
+        for name in dictio[key1]:
+            if name[key2] == value:
+                nb += 1
     return nb
 
 
+def count_position_name_from_value_name(name, valuename):
+    nb = 0
+    index = 0
+    for names in name:
+        if names["value-name"] == valuename:
+            index = nb
+        nb += 1
+    return index
+
+
 if __name__ == "__main__":
     unittest.main(verbosity=2)
index 910ba2899952b88360e6c4e48cf9cb8857731f07..4da753d11d7901dac3e3d1522f1536466c261cab 100644 (file)
@@ -39,59 +39,96 @@ class TransportPCEtesting(unittest.TestCase):
     WAITING = 20  # nominal value is 300
     NODE_VERSION = '2.2.1'
     uuid_services = UuidServices()
-
-    cr_serv_sample_data = {
-        "input": {
-            "end-point": [
-                {
-                    "layer-protocol-name": "PHOTONIC_MEDIA",
-                    "service-interface-point": {
-                        "service-interface-point-uuid": "b1a0d883-32b8-3b0b-93d6-7ed074f6f107"
-                    },
-                    "administrative-state": "UNLOCKED",
-                    "operational-state": "ENABLED",
-                    "direction": "BIDIRECTIONAL",
-                    "role": "SYMMETRIC",
-                    "protection-role": "WORK",
-                    "local-id": "SPDR-SA1-XPDR1",
-                    "name": [
+    uuidTpAiOTSI = "f4c370be-e307-380d-a31b-7edc2b431e5d"
+    uuidTpZiOTSI = "febb4502-6b27-3701-990b-3aa4941f48c4"
+    uuidTpADSR = "3aca9b37-bc46-335d-b147-2423690dee18"
+    uuidTpZDSR = "709d3595-6d56-3ad6-a3cd-5a4a09ce6f9d"
+#   SIP uuids
+    # SIP+SPDR-SA1-XPDR1+PHOTONIC_MEDIA_OTS+XPDR1-NETWORK1 UUID IS
+    sAOTS = "38d81f55-1798-3520-ba16-08efa56630c4"
+    # SIP+SPDR-SC1-XPDR1+PHOTONIC_MEDIA_OTS+XPDR1-NETWORK1 UUID IS
+    sZOTS = "97d9ba27-0efa-3010-8b98-b4d73240120c"
+    # SIP+SPDR-SA1-XPDR1+eOTSi+XPDR1-NETWORK1 UUID IS
+    sAeOTS = "f4dbce65-6191-3c84-b351-29ccb0629221"
+    # SIP+SPDR-SC1-XPDR1+eOTSi+XPDR1-NETWORK1 UUID IS
+    sZeOTS = "faabebd3-d7af-3389-96a7-261672744591"
+    # SIP+SPDR-SA1-XPDR1+DSR+XPDR1-CLIENT1 UUID IS
+    sADSR = "c14797a0-adcc-3875-a1fe-df8949d1a2d7"
+    # SIP+SPDR-SC1-XPDR1+DSR+XPDR1-CLIENT1 UUID IS
+    sZDSR = "25812ef2-625d-3bf8-af55-5e93946d1c22"
+    # SIP+SPDR-SA1-XPDR1+eODU+XPDR1-CLIENT1 UUID IS
+    sAeODU = "b6421484-531f-3444-adfc-e11c503f1fab"
+    # SIP+SPDR-SC1-XPDR1+eODU+XPDR1-CLIENT1 UUID IS
+    sZeODU = "4511fca7-0cf7-3b27-a128-3b372d5e1fa8"
+    # uuid_A = uuid.UUID(bytes("SPDR-SA1-XPDR1+DSR+eOTSI+XPDR1-NETWORK1", 'utf-8'))
+    # uuid_C = uuid.UUID(bytes("SPDR-SC1-XPDR1+DSR+eOTSI+XPDR1-NETWORK1", 'utf-8'))
+
+    cr_serv_input_data = {
+        "end-point": [
+            {
+                "layer-protocol-name": "PHOTONIC_MEDIA",
+                "service-interface-point": {
+                    "service-interface-point-uuid": "c14797a0-adcc-3875-a1fe-df8949d1a2d7"
+                },
+                "administrative-state": "UNLOCKED",
+                "operational-state": "ENABLED",
+                "direction": "BIDIRECTIONAL",
+                "role": "SYMMETRIC",
+                "protection-role": "WORK",
+                "local-id": "SPDR-SA1-XPDR1",
+                "name": [
                         {
                             "value-name": "OpenROADM node id",
                             "value": "SPDR-SA1-XPDR1"
                         }
-                    ]
+                ]
+            },
+            {
+                "layer-protocol-name": "PHOTONIC_MEDIA",
+                "service-interface-point": {
+                    "service-interface-point-uuid": "25812ef2-625d-3bf8-af55-5e93946d1c22"
                 },
-                {
-                    "layer-protocol-name": "PHOTONIC_MEDIA",
-                    "service-interface-point": {
-                        "service-interface-point-uuid": "d1d6305e-179b-346f-b02d-8260aebe1ce8"
-                    },
-                    "administrative-state": "UNLOCKED",
-                    "operational-state": "ENABLED",
-                    "direction": "BIDIRECTIONAL",
-                    "role": "SYMMETRIC",
-                    "protection-role": "WORK",
-                    "local-id": "SPDR-SC1-XPDR1",
-                    "name": [
+                "administrative-state": "UNLOCKED",
+                "operational-state": "ENABLED",
+                "direction": "BIDIRECTIONAL",
+                "role": "SYMMETRIC",
+                "protection-role": "WORK",
+                "local-id": "SPDR-SC1-XPDR1",
+                "name": [
                         {
                             "value-name": "OpenROADM node id",
                             "value": "SPDR-SC1-XPDR1"
                         }
-                    ]
+                ]
+            }
+        ],
+        "connectivity-constraint": {
+            "service-type": "POINT_TO_POINT_CONNECTIVITY",
+            "service-level": "Some service-level",
+            "requested-capacity": {
+                "total-size": {
+                    "value": "100",
+                    "unit": "tapi-common:CAPACITY_UNIT_GBPS"
                 }
-            ],
-            "connectivity-constraint": {
-                "service-layer": "PHOTONIC_MEDIA",
-                "service-type": "POINT_TO_POINT_CONNECTIVITY",
-                "service-level": "Some service-level",
-                "requested-capacity": {
-                    "total-size": {
-                        "value": "100",
-                        "unit": "GB"
+            }
+        },
+        "topology-constraint": [
+            {
+                "local-id": "localIdTopoConstraint",
+                "name": [
+                    {
+                            "value-name": "Dumb constraint",
+                            "value": "for debug1"
                     }
-                }
-            },
-            "state": "Some state"}}
+                ]
+            }
+        ],
+        "state": "LOCKED",
+        "layer-protocol-name": "PHOTONIC_MEDIA"}
+
+    del_serv_input_data = {"uuid": "TBD"}
+
+    tapi_topo = {"topology-id": "TBD"}
 
     @classmethod
     def setUpClass(cls):
@@ -101,7 +138,7 @@ class TransportPCEtesting(unittest.TestCase):
         os.environ['JAVA_MAX_MEM'] = '4096M'
         cls.processes = test_utils.start_tpce()
         # TAPI feature is not installed by default in Karaf
-        if "USE_LIGHTY" not in os.environ or os.environ['USE_LIGHTY'] != 'True':
+        if "NO_ODL_STARTUP" not in os.environ or "USE_LIGHTY" not in os.environ or os.environ['USE_LIGHTY'] != 'True':
             print("installing tapi feature...")
             result = test_utils.install_karaf_feature("odl-transportpce-tapi")
             if result.returncode != 0:
@@ -129,67 +166,66 @@ class TransportPCEtesting(unittest.TestCase):
         print("all processes killed")
 
     def setUp(self):
-        time.sleep(5)
+        time.sleep(2)
 
     def test_01_connect_spdrA(self):
         print("Connecting SPDRA")
-        response = test_utils.mount_tapi_device("SPDR-SA1", ('spdra', self.NODE_VERSION))
-        self.assertEqual(response.status_code,
-                         requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("SPDR-SA1", ('spdra', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+        time.sleep(2)
 
     def test_02_connect_spdrC(self):
         print("Connecting SPDRC")
-        response = test_utils.mount_tapi_device("SPDR-SC1", ('spdrc', self.NODE_VERSION))
-        self.assertEqual(response.status_code,
-                         requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("SPDR-SC1", ('spdrc', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+        time.sleep(2)
 
     def test_03_connect_rdmA(self):
         print("Connecting ROADMA")
-        response = test_utils.mount_tapi_device("ROADM-A1", ('roadma', self.NODE_VERSION))
-        self.assertEqual(response.status_code,
-                         requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("ROADM-A1", ('roadma', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
         time.sleep(2)
 
     def test_04_connect_rdmC(self):
         print("Connecting ROADMC")
-        response = test_utils.mount_tapi_device("ROADM-C1", ('roadmc', self.NODE_VERSION))
-        self.assertEqual(response.status_code,
-                         requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+        response = test_utils.mount_device("ROADM-C1", ('roadmc', self.NODE_VERSION))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+        time.sleep(2)
 
     def test_05_connect_sprdA_1_N1_to_roadmA_PP1(self):
-        response = test_utils.connect_xpdr_to_rdm_request("SPDR-SA1", "1", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'SPDR-SA1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_06_connect_roadmA_PP1_to_spdrA_1_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("SPDR-SA1", "1", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'SPDR-SA1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_07_connect_sprdC_1_N1_to_roadmC_PP1(self):
-        response = test_utils.connect_xpdr_to_rdm_request("SPDR-SC1", "1", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'SPDR-SC1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_08_connect_roadmC_PP1_to_spdrC_1_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("SPDR-SC1", "1", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully',
-                      res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'SPDR-SC1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_09_add_omsAttributes_ROADMA_ROADMC(self):
@@ -207,7 +243,6 @@ class TransportPCEtesting(unittest.TestCase):
         response = test_utils.add_oms_attr_request(
             "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
-        time.sleep(2)
 
     def test_10_add_omsAttributes_ROADMC_ROADMA(self):
         # Config ROADMC-ROADMA oms-attributes
@@ -224,170 +259,156 @@ class TransportPCEtesting(unittest.TestCase):
         response = test_utils.add_oms_attr_request(
             "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
-        time.sleep(2)
 
     def test_11_check_otn_topology(self):
-        response = test_utils.get_otn_topo_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nbNode = len(res['network'][0]['node'])
-        self.assertEqual(nbNode, 6, 'There should be 6 otn nodes')
-        self.assertNotIn('ietf-network-topology:link', res['network'][0])
-        time.sleep(2)
+        response = test_utils.get_ietf_network_request('otn-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['node']), 6, 'There should be 6 otn nodes')
+        self.assertNotIn('ietf-network-topology:link', response['network'][0])
 
     def test_12_check_openroadm_topology(self):
-        response = test_utils.get_ordm_topo_request("")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nbNode = len(res['network'][0]['node'])
-        nbLink = len(res['network'][0]['ietf-network-topology:link'])
-        self.assertEqual(nbNode, 13, 'There should be 13 openroadm nodes')
-        self.assertEqual(nbLink, 22, 'There should be 22 openroadm links')
-        time.sleep(2)
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['network'][0]['node']), 13, 'There should be 13 openroadm nodes')
+        self.assertEqual(len(response['network'][0]['ietf-network-topology:link']), 22,
+                         'There should be 22 openroadm links')
 
     def test_13_get_tapi_topology_details(self):
-        response = test_utils.tapi_get_topology_details_request(
-            "T0 - Full Multi-layer topology")
-        time.sleep(2)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nbNode = len(res['output']['topology']['node'])
-        nbLink = len(res['output']['topology']['link'])
-        self.assertEqual(nbNode, 14, 'There should be 14 TAPI nodes')
-        self.assertEqual(nbLink, 15, 'There should be 15 TAPI links')
+        self.tapi_topo["topology-id"] = test_utils.T0_FULL_MULTILAYER_TOPO_UUID
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-topology-details', self.tapi_topo)
         time.sleep(2)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(len(response['output']['topology']['node']), 8, 'There should be 8 TAPI nodes')
+        self.assertEqual(len(response['output']['topology']['link']), 3, 'There should be 3 TAPI links')
+        print(response['output']['topology']['node'][0])
+        print(response['output']['topology']['node'][1])
+        print(response['output']['topology']['node'][2])
 
     def test_14_check_sip_details(self):
-        response = test_utils.tapi_get_sip_details_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        nbSip = len(res['output']['sip'])
-        self.assertEqual(nbSip, 60, 'There should be 60 service interface point')
-        time.sleep(2)
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-common', 'get-service-interface-point-list', None)
+        self.assertEqual(len(response['output']['sip']), 72, 'There should be 72 service interface point')
 
 # test create connectivity service from spdrA to spdrC for Photonic_media
     def test_15_create_connectivity_service_PhotonicMedia(self):
-        response = test_utils.tapi_create_connectivity_request(self.cr_serv_sample_data)
+        self.cr_serv_input_data["end-point"][0]["service-interface-point"]["service-interface-point-uuid"] = self.sAOTS
+        self.cr_serv_input_data["end-point"][1]["service-interface-point"]["service-interface-point-uuid"] = self.sZOTS
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-connectivity', 'create-connectivity-service', self.cr_serv_input_data)
         time.sleep(self.WAITING)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.uuid_services.pm = res['output']['service']['uuid']
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.uuid_services.pm = response['output']['service']['uuid']
         # pylint: disable=consider-using-f-string
         print("photonic media service uuid : {}".format(self.uuid_services.pm))
 
         input_dict_1 = {'administrative-state': 'LOCKED',
                         'lifecycle-state': 'PLANNED',
                         'operational-state': 'DISABLED',
-                        'service-type': 'POINT_TO_POINT_CONNECTIVITY',
-                        'service-layer': 'PHOTONIC_MEDIA',
-                        'connectivity-direction': 'BIDIRECTIONAL'
+                        # 'service-type': 'POINT_TO_POINT_CONNECTIVITY',
+                        # 'service-layer': 'PHOTONIC_MEDIA',
+                        'layer-protocol-name': 'PHOTONIC_MEDIA',
+                        # 'connectivity-direction': 'BIDIRECTIONAL'
+                        'direction': 'BIDIRECTIONAL'
                         }
         input_dict_2 = {'value-name': 'OpenROADM node id',
                         'value': 'SPDR-SC1-XPDR1'}
         input_dict_3 = {'value-name': 'OpenROADM node id',
                         'value': 'SPDR-SA1-XPDR1'}
 
-        self.assertDictEqual(dict(input_dict_1, **res['output']['service']),
-                             res['output']['service'])
-        self.assertDictEqual(dict(input_dict_2, **res['output']['service']['end-point'][0]['name'][0]),
-                             res['output']['service']['end-point'][0]['name'][0])
-        self.assertDictEqual(dict(input_dict_3, **res['output']['service']['end-point'][1]['name'][0]),
-                             res['output']['service']['end-point'][1]['name'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['output']['service']),
+                             response['output']['service'])
+        self.assertDictEqual(dict(input_dict_2, **response['output']['service']['end-point'][0]['name'][0]),
+                             response['output']['service']['end-point'][0]['name'][0])
+        self.assertDictEqual(dict(input_dict_3, **response['output']['service']['end-point'][1]['name'][0]),
+                             response['output']['service']['end-point'][1]['name'][0])
         # If the gate fails is because of the waiting time not being enough
-        time.sleep(self.WAITING)
+#        time.sleep(self.WAITING)
 
     def test_16_get_service_PhotonicMedia(self):
-        response = test_utils.get_service_list_request(
-            "services/" + str(self.uuid_services.pm))
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], self.uuid_services.pm)
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'infrastructure')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_attr_request("services", str(self.uuid_services.pm))
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], str(self.uuid_services.pm))
+        self.assertEqual(response['services'][0]['connection-type'], 'infrastructure')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        time.sleep(1)
 
 # test create connectivity service from spdrA to spdrC for odu
     def test_17_create_connectivity_service_ODU(self):
         # pylint: disable=line-too-long
-        self.cr_serv_sample_data["input"]["end-point"][0]["layer-protocol-name"] = "ODU"
-        self.cr_serv_sample_data["input"]["end-point"][0]["service-interface-point"]["service-interface-point-uuid"] = "5efda776-f8de-3e0b-9bbd-2c702e210946"
-        self.cr_serv_sample_data["input"]["end-point"][1]["layer-protocol-name"] = "ODU"
-        self.cr_serv_sample_data["input"]["end-point"][1]["service-interface-point"]["service-interface-point-uuid"] = "8116d0af-39fa-3df5-bed2-dd2cd5e8217d"
-        self.cr_serv_sample_data["input"]["connectivity-constraint"]["service-layer"] = "ODU"
-
-        response = test_utils.tapi_create_connectivity_request(self.cr_serv_sample_data)
+        self.cr_serv_input_data["layer-protocol-name"] = "ODU"
+        self.cr_serv_input_data["end-point"][0]["layer-protocol-name"] = "ODU"
+        self.cr_serv_input_data["end-point"][0]["service-interface-point"]["service-interface-point-uuid"] = self.sAeODU
+        self.cr_serv_input_data["end-point"][1]["layer-protocol-name"] = "ODU"
+        self.cr_serv_input_data["end-point"][1]["service-interface-point"]["service-interface-point-uuid"] = self.sZeODU
+#        self.cr_serv_input_data["connectivity-constraint"]["service-layer"] = "ODU"
+        self.cr_serv_input_data["connectivity-constraint"]["service-level"] = self.uuid_services.pm
+
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-connectivity', 'create-connectivity-service', self.cr_serv_input_data)
         time.sleep(self.WAITING)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.uuid_services.odu = res['output']['service']['uuid']
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.uuid_services.odu = response['output']['service']['uuid']
         # pylint: disable=consider-using-f-string
         print("odu service uuid : {}".format(self.uuid_services.odu))
 
         input_dict_1 = {'administrative-state': 'LOCKED',
                         'lifecycle-state': 'PLANNED',
                         'operational-state': 'DISABLED',
-                        'service-type': 'POINT_TO_POINT_CONNECTIVITY',
-                        'service-layer': 'ODU',
-                        'connectivity-direction': 'BIDIRECTIONAL'
+                        'service-type': 'POINT_TO_POINT_CONNECTIVITY',
+                        'layer-protocol-name': 'ODU',
+                        'direction': 'BIDIRECTIONAL'
                         }
         input_dict_2 = {'value-name': 'OpenROADM node id',
                         'value': 'SPDR-SC1-XPDR1'}
         input_dict_3 = {'value-name': 'OpenROADM node id',
                         'value': 'SPDR-SA1-XPDR1'}
 
-        self.assertDictEqual(dict(input_dict_1, **res['output']['service']),
-                             res['output']['service'])
-        self.assertDictEqual(dict(input_dict_2, **res['output']['service']['end-point'][0]['name'][0]),
-                             res['output']['service']['end-point'][0]['name'][0])
-        self.assertDictEqual(dict(input_dict_3, **res['output']['service']['end-point'][1]['name'][0]),
-                             res['output']['service']['end-point'][1]['name'][0])
+        self.assertDictEqual(dict(input_dict_1, **response['output']['service']),
+                             response['output']['service'])
+        self.assertDictEqual(dict(input_dict_2, **response['output']['service']['end-point'][0]['name'][0]),
+                             response['output']['service']['end-point'][0]['name'][0])
+        self.assertDictEqual(dict(input_dict_3, **response['output']['service']['end-point'][1]['name'][0]),
+                             response['output']['service']['end-point'][1]['name'][0])
         # If the gate fails is because of the waiting time not being enough
-        time.sleep(self.WAITING)
+#        time.sleep(self.WAITING)
 
     def test_18_get_service_ODU(self):
-        response = test_utils.get_service_list_request(
-            "services/" + str(self.uuid_services.odu))
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], self.uuid_services.odu)
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'infrastructure')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_attr_request("services", str(self.uuid_services.odu))
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], str(self.uuid_services.odu))
+        self.assertEqual(response['services'][0]['connection-type'], 'infrastructure')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        time.sleep(1)
 
 # test create connectivity service from spdrA to spdrC for dsr
     def test_19_create_connectivity_service_DSR(self):
         # pylint: disable=line-too-long
-        self.cr_serv_sample_data["input"]["end-point"][0]["layer-protocol-name"] = "DSR"
-        self.cr_serv_sample_data["input"]["end-point"][0]["service-interface-point"]["service-interface-point-uuid"] = "c14797a0-adcc-3875-a1fe-df8949d1a2d7"
-        self.cr_serv_sample_data["input"]["end-point"][1]["layer-protocol-name"] = "DSR"
-        self.cr_serv_sample_data["input"]["end-point"][1]["service-interface-point"]["service-interface-point-uuid"] = "25812ef2-625d-3bf8-af55-5e93946d1c22"
-        self.cr_serv_sample_data["input"]["connectivity-constraint"]["service-layer"] = "DSR"
-        self.cr_serv_sample_data["input"]["connectivity-constraint"]["requested-capacity"]["total-size"]["value"] = "10"
-
-        response = test_utils.tapi_create_connectivity_request(self.cr_serv_sample_data)
+        self.cr_serv_input_data["layer-protocol-name"] = "DSR"
+        self.cr_serv_input_data["end-point"][0]["layer-protocol-name"] = "DSR"
+        self.cr_serv_input_data["end-point"][0]["service-interface-point"]["service-interface-point-uuid"] = self.sADSR
+        self.cr_serv_input_data["end-point"][1]["layer-protocol-name"] = "DSR"
+        self.cr_serv_input_data["end-point"][1]["service-interface-point"]["service-interface-point-uuid"] = self.sZDSR
+#        self.cr_serv_input_data["connectivity-constraint"]["service-layer"] = "DSR"
+        self.cr_serv_input_data["connectivity-constraint"]["requested-capacity"]["total-size"]["value"] = "10"
+        self.cr_serv_input_data["connectivity-constraint"]["service-level"] = self.uuid_services.odu
+
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-connectivity', 'create-connectivity-service', self.cr_serv_input_data)
         time.sleep(self.WAITING)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.uuid_services.dsr = res['output']['service']['uuid']
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.uuid_services.dsr = response['output']['service']['uuid']
         # pylint: disable=consider-using-f-string
         print("dsr service uuid : {}".format(self.uuid_services.dsr))
 
         input_dict_1 = {'administrative-state': 'LOCKED',
                         'lifecycle-state': 'PLANNED',
                         'operational-state': 'DISABLED',
-                        'service-type': 'POINT_TO_POINT_CONNECTIVITY',
-                        'service-layer': 'DSR',
-                        'connectivity-direction': 'BIDIRECTIONAL'
+                        'service-type': 'POINT_TO_POINT_CONNECTIVITY',
+                        'layer-protocol-name': 'DSR',
+                        'direction': 'BIDIRECTIONAL'
                         }
         input_dict_2 = {'value-name': 'OpenROADM node id',
                         'value': 'SPDR-SC1-XPDR1'}
@@ -395,51 +416,48 @@ class TransportPCEtesting(unittest.TestCase):
                         'value': 'SPDR-SA1-XPDR1'}
 
         self.assertDictEqual(dict(input_dict_1,
-                                  **res['output']['service']),
-                             res['output']['service'])
+                                  **response['output']['service']),
+                             response['output']['service'])
         self.assertDictEqual(dict(input_dict_2,
-                                  **res['output']['service']['end-point'][0]['name'][0]),
-                             res['output']['service']['end-point'][0]['name'][0])
+                                  **response['output']['service']['end-point'][0]['name'][0]),
+                             response['output']['service']['end-point'][0]['name'][0])
         self.assertDictEqual(dict(input_dict_3,
-                                  **res['output']['service']['end-point'][1]['name'][0]),
-                             res['output']['service']['end-point'][1]['name'][0])
+                                  **response['output']['service']['end-point'][1]['name'][0]),
+                             response['output']['service']['end-point'][1]['name'][0])
         # The sleep here is okey as the DSR service creation is very fast
-        time.sleep(self.WAITING)
+#        time.sleep(self.WAITING)
 
     def test_20_get_service_DSR(self):
-        response = test_utils.get_service_list_request(
-            "services/" + str(self.uuid_services.dsr))
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], self.uuid_services.dsr)
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'service')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_attr_request("services", str(self.uuid_services.dsr))
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], str(self.uuid_services.dsr))
+        self.assertEqual(response['services'][0]['connection-type'], 'service')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        time.sleep(1)
 
     def test_21_get_connectivity_service_list(self):
-        response = test_utils.tapi_get_service_list_request()
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        liste_service = res['output']['service']
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-connectivity', 'get-connectivity-service-list', None)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        liste_service = response['output']['service']
         for ele in liste_service:
             if ele['uuid'] == self.uuid_services.pm:
                 self.assertEqual(ele['operational-state'], 'ENABLED')
-                self.assertEqual(ele['service-layer'], 'PHOTONIC_MEDIA')
+#                self.assertEqual(ele['service-layer'], 'PHOTONIC_MEDIA')
+                self.assertEqual(ele['layer-protocol-name'], 'PHOTONIC_MEDIA')
                 nbconnection = len(ele['connection'])
                 self.assertEqual(nbconnection, 3, 'There should be 3 connections')
             elif ele['uuid'] == self.uuid_services.odu:
                 self.assertEqual(ele['operational-state'], 'ENABLED')
-                self.assertEqual(ele['service-layer'], 'ODU')
+#                self.assertEqual(ele['service-layer'], 'ODU')
+                self.assertEqual(ele['layer-protocol-name'], 'ODU')
                 nbconnection = len(ele['connection'])
                 self.assertEqual(nbconnection, 1, 'There should be 1 connections')
             elif ele['uuid'] == self.uuid_services.dsr:
                 self.assertEqual(ele['operational-state'], 'ENABLED')
-                self.assertEqual(ele['service-layer'], 'DSR')
+#                self.assertEqual(ele['service-layer'], 'DSR')
+                self.assertEqual(ele['layer-protocol-name'], 'DSR')
                 nbconnection = len(ele['connection'])
                 self.assertEqual(nbconnection, 2, 'There should be 2 connections')
             else:
@@ -447,59 +465,55 @@ class TransportPCEtesting(unittest.TestCase):
         time.sleep(2)
 
     def test_22_delete_connectivity_service_DSR(self):
-        response = test_utils.tapi_delete_connectivity_request(self.uuid_services.dsr)
-        self.assertEqual(response.status_code, requests.codes.no_content)
+        self.del_serv_input_data["uuid"] = str(self.uuid_services.dsr)
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-connectivity', 'delete-connectivity-service', self.del_serv_input_data)
+        self.assertIn(response["status_code"], (requests.codes.ok, requests.codes.no_content))
         time.sleep(self.WAITING)
 
     def test_23_delete_connectivity_service_ODU(self):
-        response = test_utils.tapi_delete_connectivity_request(self.uuid_services.odu)
-        self.assertEqual(response.status_code, requests.codes.no_content)
+        self.del_serv_input_data["uuid"] = str(self.uuid_services.odu)
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-connectivity', 'delete-connectivity-service', self.del_serv_input_data)
+        self.assertIn(response["status_code"], (requests.codes.ok, requests.codes.no_content))
         time.sleep(self.WAITING)
 
     def test_24_delete_connectivity_service_PhotonicMedia(self):
-        response = test_utils.tapi_delete_connectivity_request(self.uuid_services.pm)
-        self.assertEqual(response.status_code, requests.codes.no_content)
+        self.del_serv_input_data["uuid"] = str(self.uuid_services.pm)
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-connectivity', 'delete-connectivity-service', self.del_serv_input_data)
+        self.assertIn(response["status_code"], (requests.codes.ok, requests.codes.no_content))
         time.sleep(self.WAITING)
 
     def test_25_get_no_tapi_services(self):
-        response = test_utils.tapi_get_service_list_request()
-        res = response.json()
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-connectivity', 'get-connectivity-service-list', None)
+        self.assertEqual(response['status_code'], requests.codes.internal_server_error)
         self.assertIn(
             {"error-type": "rpc", "error-tag": "operation-failed",
              "error-message": "No services exist in datastore",
              "error-info": "<severity>error</severity>"},
-            res['errors']['error'])
-        time.sleep(2)
+            response['output']['errors']['error'])
 
     def test_26_get_no_openroadm_services(self):
-        response = test_utils.get_service_list_request("")
-        self.assertEqual(response.status_code, requests.codes.conflict)
-        res = response.json()
-        self.assertIn(
-            {"error-type": "application", "error-tag": "data-missing",
-             "error-message": "Request could not be completed because the relevant data model content does not exist"},
-            res['errors']['error'])
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_request()
+        self.assertEqual(response['status_code'], requests.codes.conflict)
 
     def test_27_disconnect_spdrA(self):
         response = test_utils.unmount_device("SPDR-SA1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_28_disconnect_spdrC(self):
         response = test_utils.unmount_device("SPDR-SC1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_29_disconnect_roadmA(self):
         response = test_utils.unmount_device("ROADM-A1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_30_disconnect_roadmC(self):
         response = test_utils.unmount_device("ROADM-C1")
-        self.assertEqual(response.status_code, requests.codes.ok,
-                         test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
 
 if __name__ == "__main__":
diff --git a/tests/transportpce_tests/tapi/test03_tapi_device_change_notifications.py b/tests/transportpce_tests/tapi/test03_tapi_device_change_notifications.py
new file mode 100644 (file)
index 0000000..f6e78a3
--- /dev/null
@@ -0,0 +1,986 @@
+#!/usr/bin/env python
+##############################################################################
+# Copyright (c) 2021 Orange, Inc. and others.  All rights reserved.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+# pylint: disable=no-member
+# pylint: disable=too-many-public-methods
+import os
+import unittest
+import time
+import requests
+# pylint: disable=wrong-import-order
+import sys
+sys.path.append('transportpce_tests/common/')
+# pylint: disable=wrong-import-position
+# pylint: disable=import-error
+import test_utils  # nopep8
+
+# pylint: disable=too-few-public-methods
+
+
+class UuidServices:
+    def __init__(self):
+        # pylint: disable=invalid-name
+        self.pm = None
+        self.odu = None
+        self.dsr = None
+        self.eth = None
+# XPDR-A1-XPDR1+XPONDER Uuid is:
+# 4378fc29-6408-39ec-8737-5008c3dc49e5
+# XPDR-C1-XPDR1+XPONDER Uuid is:
+# 1770bea4-b1da-3b20-abce-7d182c0ec0df
+# ROADM-A1+PHOTONIC_MEDIA Uuid is:
+# 3b726367-6f2d-3e3f-9033-d99b61459075
+
+
+class TransportPCEFulltesting(unittest.TestCase):
+
+    cr_serv_input_data = {
+        "end-point": [
+            {
+                "layer-protocol-name": "DSR",
+                "service-interface-point": {
+                    "service-interface-point-uuid": "b1f4bd3b-7fa9-367b-a8ab-6e80293238df"
+                },
+                "administrative-state": "UNLOCKED",
+                "operational-state": "ENABLED",
+                "direction": "BIDIRECTIONAL",
+                "role": "SYMMETRIC",
+                "protection-role": "WORK",
+                "local-id": "XPDR-C1-XPDR1",
+                "name": [
+                        {
+                            "value-name": "OpenROADM node id",
+                            "value": "XPDR-C1-XPDR1"
+                        }
+                ]
+            },
+            {
+                "layer-protocol-name": "DSR",
+                "service-interface-point": {
+                    "service-interface-point-uuid": "b5964ce9-274c-3f68-b4d1-83c0b61bc74e"
+                },
+                "administrative-state": "UNLOCKED",
+                "operational-state": "ENABLED",
+                "direction": "BIDIRECTIONAL",
+                "role": "SYMMETRIC",
+                "protection-role": "WORK",
+                "local-id": "XPDR-A1-XPDR1",
+                "name": [
+                        {
+                            "value-name": "OpenROADM node id",
+                            "value": "XPDR-A1-XPDR1"
+                        }
+                ]
+            }
+        ],
+        "connectivity-constraint": {
+            #            "service-layer": "ETH",
+            "service-type": "POINT_TO_POINT_CONNECTIVITY",
+            "service-level": "Some service-level",
+            "requested-capacity": {
+                "total-size": {
+                    "value": "100",
+                    "unit": "tapi-common:CAPACITY_UNIT_GBPS"
+                }
+            }
+        },
+        "topology-constraint": [
+            {
+                "local-id": "localIdTopoConstraint",
+                "name": [
+                    {
+                            "value-name": "Dumb constraint",
+                            "value": "for debug1"
+                    }
+                ]
+            }
+        ],
+        "state": "LOCKED",
+        "layer-protocol-name": "ETH"
+    }
+
+    del_serv_input_data = {"uuid": "TBD"}
+
+    tapi_topo = {"topology-id": "TBD"}
+
+    node_details = {
+        "topology-id": "TBD",
+        "node-id": "TBD"
+    }
+
+    tapi_serv_details = {"uuid": "TBD"}
+
+    processes = []
+    uuid_services = UuidServices()
+    WAITING = 25  # nominal value is 300
+    NODE_VERSION_221 = '2.2.1'
+
+    @classmethod
+    def setUpClass(cls):
+        # pylint: disable=unsubscriptable-object
+        cls.init_failed = False
+        os.environ['JAVA_MIN_MEM'] = '1024M'
+        os.environ['JAVA_MAX_MEM'] = '4096M'
+        cls.processes = test_utils.start_tpce()
+        # TAPI feature is not installed by default in Karaf
+        if "NO_ODL_STARTUP" not in os.environ or "USE_LIGHTY" not in os.environ or os.environ['USE_LIGHTY'] != 'True':
+            print("installing tapi feature...")
+            result = test_utils.install_karaf_feature("odl-transportpce-tapi")
+            if result.returncode != 0:
+                cls.init_failed = True
+            print("Restarting OpenDaylight...")
+            test_utils.shutdown_process(cls.processes[0])
+            cls.processes[0] = test_utils.start_karaf()
+            test_utils.process_list[0] = cls.processes[0]
+            cls.init_failed = not test_utils.wait_until_log_contains(
+                test_utils.KARAF_LOG, test_utils.KARAF_OK_START_MSG, time_to_wait=60)
+        if cls.init_failed:
+            print("tapi installation feature failed...")
+            test_utils.shutdown_process(cls.processes[0])
+            sys.exit(2)
+        cls.processes = test_utils.start_sims([('xpdra', cls.NODE_VERSION_221),
+                                               ('roadma', cls.NODE_VERSION_221),
+                                               ('roadmc', cls.NODE_VERSION_221),
+                                               ('xpdrc', cls.NODE_VERSION_221)])
+
+    @classmethod
+    def tearDownClass(cls):
+        # pylint: disable=not-an-iterable
+        for process in cls.processes:
+            test_utils.shutdown_process(process)
+        print("all processes killed")
+
+    def setUp(self):  # instruction executed before each test method
+        # pylint: disable=consider-using-f-string
+        print("execution of {}".format(self.id().split(".")[-1]))
+        time.sleep(1)
+
+    def test_01_connect_xpdrA(self):
+        response = test_utils.mount_device("XPDR-A1", ('xpdra', self.NODE_VERSION_221))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+
+    def test_02_connect_xpdrC(self):
+        response = test_utils.mount_device("XPDR-C1", ('xpdrc', self.NODE_VERSION_221))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+
+    def test_03_connect_rdmA(self):
+        response = test_utils.mount_device("ROADM-A1", ('roadma', self.NODE_VERSION_221))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+
+    def test_04_connect_rdmC(self):
+        response = test_utils.mount_device("ROADM-C1", ('roadmc', self.NODE_VERSION_221))
+        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+
+    def test_05_connect_xpdrA_N1_to_roadmA_PP1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDR-A1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
+        time.sleep(2)
+
+    def test_06_connect_roadmA_PP1_to_xpdrA_N1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDR-A1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
+        time.sleep(2)
+
+    def test_07_connect_xpdrC_N1_to_roadmC_PP1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDR-C1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
+        time.sleep(2)
+
+    def test_08_connect_roadmC_PP1_to_xpdrC_N1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDR-C1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
+        time.sleep(2)
+
+    def test_09_add_omsAttributes_ROADMA_ROADMC(self):
+        # Config ROADMA-ROADMC oms-attributes
+        data = {"span": {
+            "auto-spanloss": "true",
+            "spanloss-base": 11.4,
+            "spanloss-current": 12,
+            "engineered-spanloss": 12.2,
+            "link-concatenation": [{
+                "SRLG-Id": 0,
+                "fiber-type": "smf",
+                "SRLG-length": 100000,
+                "pmd": 0.5}]}}
+        response = test_utils.add_oms_attr_request(
+            "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX", data)
+        self.assertEqual(response.status_code, requests.codes.created)
+
+    def test_10_add_omsAttributes_ROADMC_ROADMA(self):
+        # Config ROADMC-ROADMA oms-attributes
+        data = {"span": {
+            "auto-spanloss": "true",
+            "spanloss-base": 11.4,
+            "spanloss-current": 12,
+            "engineered-spanloss": 12.2,
+            "link-concatenation": [{
+                "SRLG-Id": 0,
+                "fiber-type": "smf",
+                "SRLG-length": 100000,
+                "pmd": 0.5}]}}
+        response = test_utils.add_oms_attr_request(
+            "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX", data)
+        self.assertEqual(response.status_code, requests.codes.created)
+
+# test service-create for Eth service from xpdr to xpdr
+    def test_11_create_connectivity_service_Ethernet(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-connectivity', 'create-connectivity-service', self.cr_serv_input_data)
+        time.sleep(self.WAITING)
+        self.uuid_services.eth = response['output']['service']['uuid']
+        # pylint: disable=consider-using-f-string
+
+        input_dict_1 = {'administrative-state': 'LOCKED',
+                        'lifecycle-state': 'PLANNED',
+                        'operational-state': 'DISABLED',
+                        # 'service-type': 'POINT_TO_POINT_CONNECTIVITY',
+                        # 'service-layer': 'ETH',
+                        'layer-protocol-name': 'ETH',
+                        # 'connectivity-direction': 'BIDIRECTIONAL'
+                        'direction': 'BIDIRECTIONAL'
+                        }
+        input_dict_2 = {'value-name': 'OpenROADM node id',
+                        'value': 'XPDR-C1-XPDR1'}
+        input_dict_3 = {'value-name': 'OpenROADM node id',
+                        'value': 'XPDR-A1-XPDR1'}
+
+        self.assertDictEqual(dict(input_dict_1, **response['output']['service']),
+                             response['output']['service'])
+        self.assertDictEqual(dict(input_dict_2, **response['output']['service']['end-point'][0]['name'][0]),
+                             response['output']['service']['end-point'][0]['name'][0])
+        self.assertDictEqual(dict(input_dict_3, **response['output']['service']['end-point'][1]['name'][0]),
+                             response['output']['service']['end-point'][1]['name'][0])
+        # If the gate fails is because of the waiting time not being enough
+#        time.sleep(self.WAITING)
+
+    def test_12_get_service_Ethernet(self):
+        response = test_utils.get_ordm_serv_list_attr_request("services", str(self.uuid_services.eth))
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], str(self.uuid_services.eth))
+        self.assertEqual(response['services'][0]['connection-type'], 'service')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        time.sleep(1)
+
+    def test_13_get_connectivity_service_Ethernet(self):
+        self.tapi_serv_details["uuid"] = str(self.uuid_services.eth)
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-connectivity', 'get-connectivity-service-details', self.tapi_serv_details)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['output']['service']['operational-state'], 'ENABLED')
+        self.assertEqual(response['output']['service']['name'][0]['value'], self.uuid_services.eth)
+        self.assertEqual(response['output']['service']['administrative-state'], 'UNLOCKED')
+        self.assertEqual(response['output']['service']['lifecycle-state'], 'INSTALLED')
+
+    def test_14_change_status_line_port_xpdrc(self):
+        self.assertTrue(test_utils.sims_update_cp_port(('xpdrc', self.NODE_VERSION_221), '1/0/1-PLUG-NET', '1',
+                                                       {
+            "port-name": "1",
+            "port-type": "CFP2",
+            "administrative-state": "outOfService",
+            "port-qual": "xpdr-network"
+        }))
+        time.sleep(2)
+
+    def test_15_check_update_portmapping(self):
+        response = test_utils.get_portmapping_node_attr("XPDR-C1", None, None)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        mapping_list = response['nodes'][0]['mapping']
+        for mapping in mapping_list:
+            if mapping['logical-connection-point'] == 'XPDR1-NETWORK1':
+                self.assertEqual(mapping['port-oper-state'], 'OutOfService',
+                                 "Operational State should be 'OutOfService'")
+                self.assertEqual(mapping['port-admin-state'], 'OutOfService',
+                                 "Administrative State should be 'OutOfService'")
+            else:
+                self.assertEqual(mapping['port-oper-state'], 'InService',
+                                 "Operational State should be 'InService'")
+                self.assertEqual(mapping['port-admin-state'], 'InService',
+                                 "Administrative State should be 'InService'")
+        time.sleep(1)
+
+    def test_16_check_update_openroadm_topo(self):
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        node_list = response['network'][0]['node']
+        nb_updated_tp = 0
+        for node in node_list:
+            self.assertEqual(node['org-openroadm-common-network:operational-state'], 'inService')
+            self.assertEqual(node['org-openroadm-common-network:administrative-state'], 'inService')
+            tp_list = node['ietf-network-topology:termination-point']
+            for tp in tp_list:
+                if node['node-id'] == 'XPDR-C1-XPDR1' and tp['tp-id'] == 'XPDR1-NETWORK1':
+                    self.assertEqual(tp['org-openroadm-common-network:operational-state'], 'outOfService')
+                    self.assertEqual(tp['org-openroadm-common-network:administrative-state'], 'outOfService')
+                    nb_updated_tp += 1
+                else:
+                    self.assertEqual(tp['org-openroadm-common-network:operational-state'], 'inService')
+                    self.assertEqual(tp['org-openroadm-common-network:administrative-state'], 'inService')
+        self.assertEqual(nb_updated_tp, 1, "Only one termination-point should have been modified")
+
+        link_list = response['network'][0]['ietf-network-topology:link']
+        updated_links = ['XPDR-C1-XPDR1-XPDR1-NETWORK1toROADM-C1-SRG1-SRG1-PP1-TXRX',
+                         'ROADM-C1-SRG1-SRG1-PP1-TXRXtoXPDR-C1-XPDR1-XPDR1-NETWORK1']
+        nb_updated_link = 0
+        for link in link_list:
+            if link['link-id'] in updated_links:
+                self.assertEqual(link['org-openroadm-common-network:operational-state'], 'outOfService')
+                self.assertEqual(link['org-openroadm-common-network:administrative-state'], 'outOfService')
+                nb_updated_link += 1
+            else:
+                self.assertEqual(link['org-openroadm-common-network:operational-state'], 'inService')
+                self.assertEqual(link['org-openroadm-common-network:administrative-state'], 'inService')
+        self.assertEqual(nb_updated_link, 2, "Only two xponder-output/input links should have been modified")
+        time.sleep(10)
+
+    def test_17_check_update_tapi_neps(self):
+        self.node_details["topology-id"] = test_utils.T0_FULL_MULTILAYER_TOPO_UUID
+#        self.node_details["node-id"] = "XPDR-C1-XPDR1+OTSi"
+        self.node_details["node-id"] = "1770bea4-b1da-3b20-abce-7d182c0ec0df"
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-node-details', self.node_details)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        nep_list = response['output']['node']['owned-node-edge-point']
+        nb_updated_neps = 0
+        for nep in nep_list:
+            if 'XPDR1-NETWORK1' in nep['name'][0]['value']:
+                self.assertEqual(nep['operational-state'], 'DISABLED',
+                                 "Operational State should be 'DISABLED'")
+                self.assertEqual(nep['administrative-state'], 'LOCKED',
+                                 "Administrative State should be 'LOCKED'")
+                nb_updated_neps += 1
+            else:
+                self.assertEqual(nep['operational-state'], 'ENABLED',
+                                 "Operational State should be 'ENABLED'")
+                self.assertEqual(nep['administrative-state'], 'UNLOCKED',
+                                 "Administrative State should be 'UNLOCKED'")
+        self.node_details["node-id"] = "XPDR-C1-XPDR1+DSR"
+#        response = test_utils.transportpce_api_rpc_request(
+#            'tapi-topology', 'get-node-details', self.node_details)
+#        self.assertEqual(response['status_code'], requests.codes.ok)
+#        nep_list = response['output']['node']['owned-node-edge-point']
+#        for nep in nep_list:
+#            if 'XPDR1-NETWORK1' in nep['name'][0]['value']:
+#                self.assertEqual(nep['operational-state'], 'DISABLED',
+#                                 "Operational State should be 'DISABLED'")
+#                self.assertEqual(nep['administrative-state'], 'LOCKED',
+#                                 "Administrative State should be 'LOCKED'")
+#                nb_updated_neps += 1
+#            else:
+#                self.assertEqual(nep['operational-state'], 'ENABLED',
+#                                 "Operational State should be 'ENABLED'")
+#                self.assertEqual(nep['administrative-state'], 'UNLOCKED',
+#                                 "Administrative State should be 'UNLOCKED'")
+        self.assertEqual(nb_updated_neps, 3, "3 xponder neps (OTS, OTSI_MC, eODU) should have been modified")
+        time.sleep(1)
+
+    def test_18_check_update_tapi_links(self):
+        self.tapi_topo["topology-id"] = test_utils.T0_FULL_MULTILAYER_TOPO_UUID
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-topology-details', self.tapi_topo)
+        time.sleep(2)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        link_list = response['output']['topology']['link']
+        nb_updated_link = 0
+        for link in link_list:
+            if all(x in link['name'][0]['value'] for x in ['XPDR-C1-XPDR1', 'XPDR1-NETWORK1']):
+                self.assertEqual(link['operational-state'], 'DISABLED')
+                self.assertEqual(link['administrative-state'], 'LOCKED')
+                nb_updated_link += 1
+            else:
+                self.assertEqual(link['operational-state'], 'ENABLED')
+                self.assertEqual(link['administrative-state'], 'UNLOCKED')
+        self.assertEqual(nb_updated_link, 1,
+                         "Only one xponder-output/input bidirectional link should have been modified")
+        time.sleep(1)
+
+    def test_19_check_update_service_Ethernet(self):
+        response = test_utils.get_ordm_serv_list_attr_request("services", str(self.uuid_services.eth))
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['operational-state'], 'outOfService')
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+
+    def test_20_check_update_connectivity_service_Ethernet(self):
+        self.tapi_serv_details["uuid"] = str(self.uuid_services.eth)
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-connectivity', 'get-connectivity-service-details', self.tapi_serv_details)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['output']['service']['operational-state'], 'DISABLED')
+        self.assertEqual(response['output']['service']['administrative-state'], 'LOCKED')
+        time.sleep(1)
+
+    def test_21_restore_status_line_port_xpdrc(self):
+        self.assertTrue(test_utils.sims_update_cp_port(('xpdrc', self.NODE_VERSION_221), '1/0/1-PLUG-NET', '1',
+                                                       {
+            "port-name": "1",
+            "port-type": "CFP2",
+            "administrative-state": "inService",
+            "port-qual": "xpdr-network"
+        }))
+        time.sleep(2)
+
+    def test_22_check_update_portmapping_ok(self):
+        response = test_utils.get_portmapping_node_attr("XPDR-C1", None, None)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        mapping_list = response['nodes'][0]['mapping']
+        for mapping in mapping_list:
+            self.assertEqual(mapping['port-oper-state'], 'InService',
+                             "Operational State should be 'InService'")
+            self.assertEqual(mapping['port-admin-state'], 'InService',
+                             "Administrative State should be 'InService'")
+        time.sleep(1)
+
+    def test_23_check_update_openroadm_topo_ok(self):
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        node_list = response['network'][0]['node']
+        for node in node_list:
+            self.assertEqual(node['org-openroadm-common-network:operational-state'], 'inService')
+            self.assertEqual(node['org-openroadm-common-network:administrative-state'], 'inService')
+            tp_list = node['ietf-network-topology:termination-point']
+            for tp in tp_list:
+                self.assertEqual(tp['org-openroadm-common-network:operational-state'], 'inService')
+                self.assertEqual(tp['org-openroadm-common-network:administrative-state'], 'inService')
+
+        link_list = response['network'][0]['ietf-network-topology:link']
+        for link in link_list:
+            self.assertEqual(link['org-openroadm-common-network:operational-state'], 'inService')
+            self.assertEqual(link['org-openroadm-common-network:administrative-state'], 'inService')
+        time.sleep(1)
+
+    def test_24_check_update_tapi_neps_ok(self):
+        self.node_details["topology-id"] = test_utils.T0_FULL_MULTILAYER_TOPO_UUID
+#        self.node_details["node-id"] = "XPDR-C1-XPDR1+OTSi"
+        self.node_details["node-id"] = "1770bea4-b1da-3b20-abce-7d182c0ec0df"
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-node-details', self.node_details)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        nep_list = response['output']['node']['owned-node-edge-point']
+        for nep in nep_list:
+            self.assertEqual(nep['operational-state'], 'ENABLED',
+                             "Operational State should be 'ENABLED'")
+            self.assertEqual(nep['administrative-state'], 'UNLOCKED',
+                             "Administrative State should be 'UNLOCKED'")
+
+#        self.node_details["node-id"] = "XPDR-C1-XPDR1+DSR"
+#        response = test_utils.transportpce_api_rpc_request(
+#            'tapi-topology', 'get-node-details', self.node_details)
+#        self.assertEqual(response['status_code'], requests.codes.ok)
+#        nep_list = response['output']['node']['owned-node-edge-point']
+#        for nep in nep_list:
+#            self.assertEqual(nep['operational-state'], 'ENABLED',
+#                             "Operational State should be 'ENABLED'")
+#            self.assertEqual(nep['administrative-state'], 'UNLOCKED',
+#                             "Administrative State should be 'UNLOCKED'")
+        time.sleep(1)
+
+    def test_25_check_update_tapi_links_ok(self):
+        self.tapi_topo["topology-id"] = test_utils.T0_FULL_MULTILAYER_TOPO_UUID
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-topology-details', self.tapi_topo)
+        time.sleep(2)
+        link_list = response['output']['topology']['link']
+        for link in link_list:
+            self.assertEqual(link['operational-state'], 'ENABLED')
+            self.assertEqual(link['administrative-state'], 'UNLOCKED')
+        time.sleep(1)
+
+    def test_26_check_update_service1_ok(self):
+        self.test_12_get_service_Ethernet()
+
+    def test_27_check_update_connectivity_service_Ethernet_ok(self):
+        self.test_13_get_connectivity_service_Ethernet()
+
+    def test_28_change_status_port_roadma_srg(self):
+        self.assertTrue(test_utils.sims_update_cp_port(('roadma', self.NODE_VERSION_221), '3/0', 'C1',
+                                                       {
+            "port-name": "C1",
+            "logical-connection-point": "SRG1-PP1",
+            "port-type": "client",
+            "circuit-id": "SRG1",
+            "administrative-state": "outOfService",
+            "port-qual": "roadm-external"
+        }))
+        time.sleep(2)
+
+    def test_29_check_update_portmapping(self):
+        response = test_utils.get_portmapping_node_attr("ROADM-A1", None, None)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        mapping_list = response['nodes'][0]['mapping']
+        for mapping in mapping_list:
+            if mapping['logical-connection-point'] == 'SRG1-PP1-TXRX':
+                self.assertEqual(mapping['port-oper-state'], 'OutOfService',
+                                 "Operational State should be 'OutOfService'")
+                self.assertEqual(mapping['port-admin-state'], 'OutOfService',
+                                 "Administrative State should be 'OutOfService'")
+            else:
+                self.assertEqual(mapping['port-oper-state'], 'InService',
+                                 "Operational State should be 'InService'")
+                self.assertEqual(mapping['port-admin-state'], 'InService',
+                                 "Administrative State should be 'InService'")
+        time.sleep(1)
+
+    def test_30_check_update_openroadm_topo(self):
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        node_list = response['network'][0]['node']
+        nb_updated_tp = 0
+        for node in node_list:
+            self.assertEqual(node['org-openroadm-common-network:operational-state'], 'inService')
+            self.assertEqual(node['org-openroadm-common-network:administrative-state'], 'inService')
+            tp_list = node['ietf-network-topology:termination-point']
+            for tp in tp_list:
+                if node['node-id'] == 'ROADM-A1-SRG1' and tp['tp-id'] == 'SRG1-PP1-TXRX':
+                    self.assertEqual(tp['org-openroadm-common-network:operational-state'], 'outOfService')
+                    self.assertEqual(tp['org-openroadm-common-network:administrative-state'], 'outOfService')
+                    nb_updated_tp += 1
+                else:
+                    self.assertEqual(tp['org-openroadm-common-network:operational-state'], 'inService')
+                    self.assertEqual(tp['org-openroadm-common-network:administrative-state'], 'inService')
+        self.assertEqual(nb_updated_tp, 1, "Only one termination-point should have been modified")
+
+        link_list = response['network'][0]['ietf-network-topology:link']
+        updated_links = ['XPDR-A1-XPDR1-XPDR1-NETWORK1toROADM-A1-SRG1-SRG1-PP1-TXRX',
+                         'ROADM-A1-SRG1-SRG1-PP1-TXRXtoXPDR-A1-XPDR1-XPDR1-NETWORK1']
+        nb_updated_link = 0
+        for link in link_list:
+            if link['link-id'] in updated_links:
+                self.assertEqual(link['org-openroadm-common-network:operational-state'], 'outOfService')
+                self.assertEqual(link['org-openroadm-common-network:administrative-state'], 'outOfService')
+                nb_updated_link += 1
+            else:
+                self.assertEqual(link['org-openroadm-common-network:operational-state'], 'inService')
+                self.assertEqual(link['org-openroadm-common-network:administrative-state'], 'inService')
+        self.assertEqual(nb_updated_link, 2, "Only two xponder-output/input links should have been modified")
+        time.sleep(1)
+
+    def test_31_check_update_tapi_neps(self):
+        self.node_details["topology-id"] = test_utils.T0_FULL_MULTILAYER_TOPO_UUID
+#        self.node_details["node-id"] = "ROADM-A1+PHOTONIC_MEDIA"
+        self.node_details["node-id"] = "3b726367-6f2d-3e3f-9033-d99b61459075"
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-node-details', self.node_details)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        nep_list = response['output']['node']['owned-node-edge-point']
+        nb_updated_neps = 0
+        for nep in nep_list:
+            if 'SRG1-PP1-TXRX' in nep['name'][0]['value']:
+                self.assertEqual(nep['operational-state'], 'DISABLED',
+                                 "Operational State should be 'DISABLED'")
+                self.assertEqual(nep['administrative-state'], 'LOCKED',
+                                 "Administrative State should be 'LOCKED'")
+                nb_updated_neps += 1
+            else:
+                self.assertEqual(nep['operational-state'], 'ENABLED',
+                                 "Operational State should be 'ENABLED'")
+                self.assertEqual(nep['administrative-state'], 'UNLOCKED',
+                                 "Administrative State should be 'UNLOCKED'")
+        self.assertEqual(nb_updated_neps, 2, "Only 2 roadm SRG-PP nep (OTS/MC)should have been modified")
+        time.sleep(1)
+
+    def test_32_check_update_tapi_links(self):
+        self.tapi_topo["topology-id"] = test_utils.T0_FULL_MULTILAYER_TOPO_UUID
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-topology-details', self.tapi_topo)
+        time.sleep(2)
+        link_list = response['output']['topology']['link']
+        nb_updated_link = 0
+        for link in link_list:
+            if all(x in link['name'][0]['value'] for x in ['ROADM-A1', 'SRG1-PP1-TXRX']):
+                self.assertEqual(link['operational-state'], 'DISABLED')
+                self.assertEqual(link['administrative-state'], 'LOCKED')
+                nb_updated_link += 1
+            else:
+                self.assertEqual(link['operational-state'], 'ENABLED')
+                self.assertEqual(link['administrative-state'], 'UNLOCKED')
+        self.assertEqual(nb_updated_link, 1,
+                         "Only one xponder-output/input link should have been modified")
+        time.sleep(1)
+
+    def test_33_check_update_service_Ethernet(self):
+        self.test_19_check_update_service_Ethernet()
+
+    def test_34_check_update_connectivity_service_Ethernet(self):
+        self.test_20_check_update_connectivity_service_Ethernet()
+
+    def test_35_restore_status_port_roadma_srg(self):
+        self.assertTrue(test_utils.sims_update_cp_port(('roadma', self.NODE_VERSION_221), '3/0', 'C1',
+                                                       {
+            "port-name": "C1",
+            "logical-connection-point": "SRG1-PP1",
+            "port-type": "client",
+            "circuit-id": "SRG1",
+            "administrative-state": "inService",
+            "port-qual": "roadm-external"
+        }))
+        time.sleep(2)
+
+    def test_36_check_update_portmapping_ok(self):
+        response = test_utils.get_portmapping_node_attr("ROADM-A1", None, None)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        mapping_list = response['nodes'][0]['mapping']
+        for mapping in mapping_list:
+            self.assertEqual(mapping['port-oper-state'], 'InService',
+                             "Operational State should be 'InService'")
+            self.assertEqual(mapping['port-admin-state'], 'InService',
+                             "Administrative State should be 'InService'")
+        time.sleep(1)
+
+    def test_37_check_update_openroadm_topo_ok(self):
+        self.test_23_check_update_openroadm_topo_ok()
+
+    def test_38_check_update_tapi_neps_ok(self):
+        self.node_details["topology-id"] = test_utils.T0_FULL_MULTILAYER_TOPO_UUID
+#        self.node_details["node-id"] = "ROADM-A1+PHOTONIC_MEDIA"
+        self.node_details["node-id"] = "3b726367-6f2d-3e3f-9033-d99b61459075"
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-node-details', self.node_details)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        nep_list = response['output']['node']['owned-node-edge-point']
+        for nep in nep_list:
+            self.assertEqual(nep['operational-state'], 'ENABLED',
+                             "Operational State should be 'ENABLED'")
+            self.assertEqual(nep['administrative-state'], 'UNLOCKED',
+                             "Administrative State should be 'UNLOCKED'")
+
+        time.sleep(1)
+
+    def test_39_check_update_tapi_links_ok(self):
+        self.test_25_check_update_tapi_links_ok()
+
+    def test_40_check_update_service1_ok(self):
+        self.test_12_get_service_Ethernet()
+
+    def test_41_check_update_connectivity_service_Ethernet_ok(self):
+        self.test_13_get_connectivity_service_Ethernet()
+
+    def test_42_change_status_line_port_roadma_deg(self):
+        self.assertTrue(test_utils.sims_update_cp_port(('roadma', self.NODE_VERSION_221), '2/0', 'L1',
+                                                       {
+            "port-name": "L1",
+            "logical-connection-point": "DEG2-TTP-TXRX",
+            "port-type": "LINE",
+            "circuit-id": "1",
+            "administrative-state": "outOfService",
+            "port-qual": "roadm-external"
+        }))
+        time.sleep(2)
+
+    def test_43_check_update_portmapping(self):
+        response = test_utils.get_portmapping_node_attr("ROADM-A1", None, None)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        mapping_list = response['nodes'][0]['mapping']
+        for mapping in mapping_list:
+            if mapping['logical-connection-point'] == 'DEG2-TTP-TXRX':
+                self.assertEqual(mapping['port-oper-state'], 'OutOfService',
+                                 "Operational State should be 'OutOfService'")
+                self.assertEqual(mapping['port-admin-state'], 'OutOfService',
+                                 "Administrative State should be 'OutOfService'")
+            else:
+                self.assertEqual(mapping['port-oper-state'], 'InService',
+                                 "Operational State should be 'InService'")
+                self.assertEqual(mapping['port-admin-state'], 'InService',
+                                 "Administrative State should be 'InService'")
+        time.sleep(1)
+
+    def test_44_check_update_openroadm_topo(self):
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        node_list = response['network'][0]['node']
+        nb_updated_tp = 0
+        for node in node_list:
+            self.assertEqual(node['org-openroadm-common-network:operational-state'], 'inService')
+            self.assertEqual(node['org-openroadm-common-network:administrative-state'], 'inService')
+            tp_list = node['ietf-network-topology:termination-point']
+            for tp in tp_list:
+                if node['node-id'] == 'ROADM-A1-DEG2' and tp['tp-id'] == 'DEG2-TTP-TXRX':
+                    self.assertEqual(tp['org-openroadm-common-network:operational-state'], 'outOfService')
+                    self.assertEqual(tp['org-openroadm-common-network:administrative-state'], 'outOfService')
+                    nb_updated_tp += 1
+                else:
+                    self.assertEqual(tp['org-openroadm-common-network:operational-state'], 'inService')
+                    self.assertEqual(tp['org-openroadm-common-network:administrative-state'], 'inService')
+        self.assertEqual(nb_updated_tp, 1, "Only one termination-point should have been modified")
+
+        link_list = response['network'][0]['ietf-network-topology:link']
+        updated_links = ['ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX',
+                         'ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX']
+        nb_updated_link = 0
+        for link in link_list:
+            if link['link-id'] in updated_links:
+                self.assertEqual(link['org-openroadm-common-network:operational-state'], 'outOfService')
+                self.assertEqual(link['org-openroadm-common-network:administrative-state'], 'outOfService')
+                nb_updated_link += 1
+            else:
+                self.assertEqual(link['org-openroadm-common-network:operational-state'], 'inService')
+                self.assertEqual(link['org-openroadm-common-network:administrative-state'], 'inService')
+        self.assertEqual(nb_updated_link, 2, "Only two xponder-output/input links should have been modified")
+        time.sleep(1)
+
+    def test_45_check_update_tapi_neps(self):
+        self.node_details["topology-id"] = test_utils.T0_FULL_MULTILAYER_TOPO_UUID
+#        self.node_details["node-id"] = "ROADM-A1+PHOTONIC_MEDIA"
+        self.node_details["node-id"] = "3b726367-6f2d-3e3f-9033-d99b61459075"
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-node-details', self.node_details)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        nep_list = response['output']['node']['owned-node-edge-point']
+        nb_updated_neps = 0
+        for nep in nep_list:
+            if 'DEG2-TTP-TXRX' in nep['name'][0]['value']:
+                self.assertEqual(nep['operational-state'], 'DISABLED',
+                                 "Operational State should be 'DISABLED'")
+                self.assertEqual(nep['administrative-state'], 'LOCKED',
+                                 "Administrative State should be 'LOCKED'")
+                nb_updated_neps += 1
+            else:
+                self.assertEqual(nep['operational-state'], 'ENABLED',
+                                 "Operational State should be 'ENABLED'")
+                self.assertEqual(nep['administrative-state'], 'UNLOCKED',
+                                 "Administrative State should be 'UNLOCKED'")
+        self.assertEqual(nb_updated_neps, 4, "4 roadm NEPS should have been modified (OTS/OMS/MC/OTSI_MC")
+        time.sleep(1)
+
+    def test_46_check_update_tapi_links(self):
+        self.tapi_topo["topology-id"] = test_utils.T0_FULL_MULTILAYER_TOPO_UUID
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-topology-details', self.tapi_topo)
+        time.sleep(2)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        link_list = response['output']['topology']['link']
+        nb_updated_link = 0
+        for link in link_list:
+            if all(x in link['name'][0]['value'] for x in ['ROADM-A1', 'DEG2-TTP-TXRX']):
+                self.assertEqual(link['operational-state'], 'DISABLED')
+                self.assertEqual(link['administrative-state'], 'LOCKED')
+                nb_updated_link += 1
+            else:
+                self.assertEqual(link['operational-state'], 'ENABLED')
+                self.assertEqual(link['administrative-state'], 'UNLOCKED')
+        self.assertEqual(nb_updated_link, 1,
+                         "Only one rdm-rdm link should have been modified")
+        time.sleep(1)
+
+    def test_47_check_update_service_Ethernet(self):
+        self.test_19_check_update_service_Ethernet()
+
+    def test_48_check_update_connectivity_service_Ethernet(self):
+        self.test_20_check_update_connectivity_service_Ethernet()
+
+    def test_49_restore_status_line_port_roadma_deg(self):
+        self.assertTrue(test_utils.sims_update_cp_port(('roadma', self.NODE_VERSION_221), '2/0', 'L1',
+                                                       {
+            "port-name": "L1",
+            "logical-connection-point": "DEG2-TTP-TXRX",
+            "port-type": "LINE",
+            "circuit-id": "1",
+            "administrative-state": "inService",
+            "port-qual": "roadm-external"
+        }))
+        time.sleep(2)
+
+    def test_50_check_update_portmapping_ok(self):
+        self.test_36_check_update_portmapping_ok()
+
+    def test_51_check_update_openroadm_topo_ok(self):
+        self.test_23_check_update_openroadm_topo_ok()
+
+    def test_52_check_update_tapi_neps_ok(self):
+        self.test_38_check_update_tapi_neps_ok()
+
+    def test_53_check_update_tapi_links_ok(self):
+        self.test_25_check_update_tapi_links_ok()
+
+    def test_54_check_update_service1_ok(self):
+        self.test_12_get_service_Ethernet()
+
+    def test_55_check_update_connectivity_service_Ethernet_ok(self):
+        self.test_13_get_connectivity_service_Ethernet()
+
+    def test_56_change_status_port_roadma_srg(self):
+        self.assertTrue(test_utils.sims_update_cp_port(('roadma', self.NODE_VERSION_221), '3/0', 'C2',
+                                                       {
+            "port-name": "C2",
+            "logical-connection-point": "SRG1-PP2",
+            "port-type": "client",
+            "circuit-id": "SRG1",
+            "administrative-state": "outOfService",
+            "port-qual": "roadm-external"
+        }))
+        time.sleep(2)
+
+    def test_57_check_update_portmapping(self):
+        response = test_utils.get_portmapping_node_attr("ROADM-A1", None, None)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        mapping_list = response['nodes'][0]['mapping']
+        for mapping in mapping_list:
+            if mapping['logical-connection-point'] == 'SRG1-PP2-TXRX':
+                self.assertEqual(mapping['port-oper-state'], 'OutOfService',
+                                 "Operational State should be 'OutOfService'")
+                self.assertEqual(mapping['port-admin-state'], 'OutOfService',
+                                 "Administrative State should be 'OutOfService'")
+            else:
+                self.assertEqual(mapping['port-oper-state'], 'InService',
+                                 "Operational State should be 'InService'")
+                self.assertEqual(mapping['port-admin-state'], 'InService',
+                                 "Administrative State should be 'InService'")
+        time.sleep(1)
+
+    def test_58_check_update_openroadm_topo(self):
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        node_list = response['network'][0]['node']
+        nb_updated_tp = 0
+        for node in node_list:
+            self.assertEqual(node['org-openroadm-common-network:operational-state'], 'inService')
+            self.assertEqual(node['org-openroadm-common-network:administrative-state'], 'inService')
+            tp_list = node['ietf-network-topology:termination-point']
+            for tp in tp_list:
+                if node['node-id'] == 'ROADM-A1-SRG1' and tp['tp-id'] == 'SRG1-PP2-TXRX':
+                    self.assertEqual(tp['org-openroadm-common-network:operational-state'], 'outOfService')
+                    self.assertEqual(tp['org-openroadm-common-network:administrative-state'], 'outOfService')
+                    nb_updated_tp += 1
+                else:
+                    self.assertEqual(tp['org-openroadm-common-network:operational-state'], 'inService')
+                    self.assertEqual(tp['org-openroadm-common-network:administrative-state'], 'inService')
+        self.assertEqual(nb_updated_tp, 1, "Only one termination-point should have been modified")
+
+        link_list = response['network'][0]['ietf-network-topology:link']
+        nb_updated_link = 0
+        for link in link_list:
+            self.assertEqual(link['org-openroadm-common-network:operational-state'], 'inService')
+            self.assertEqual(link['org-openroadm-common-network:administrative-state'], 'inService')
+        self.assertEqual(nb_updated_link, 0, "No link should have been modified")
+        time.sleep(1)
+
+    def test_59_check_update_tapi_neps(self):
+        self.node_details["topology-id"] = test_utils.T0_FULL_MULTILAYER_TOPO_UUID
+#        self.node_details["node-id"] = uuid.UUID(bytes="ROADM-A1+PHOTONIC_MEDIA".bytes)
+        self.node_details["node-id"] = "3b726367-6f2d-3e3f-9033-d99b61459075"
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-node-details', self.node_details)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        nep_list = response['output']['node']['owned-node-edge-point']
+        nb_updated_neps = 0
+        for nep in nep_list:
+            if 'SRG1-PP2-TXRX' in nep['name'][0]['value']:
+                self.assertEqual(nep['operational-state'], 'DISABLED',
+                                 "Operational State should be 'DISABLED'")
+                self.assertEqual(nep['administrative-state'], 'LOCKED',
+                                 "Administrative State should be 'LOCKED'")
+                nb_updated_neps += 1
+            else:
+                self.assertEqual(nep['operational-state'], 'ENABLED',
+                                 "Operational State should be 'ENABLED'")
+                self.assertEqual(nep['administrative-state'], 'UNLOCKED',
+                                 "Administrative State should be 'UNLOCKED'")
+        self.assertEqual(nb_updated_neps, 1, "Only 1 roadm neps OTS should have been modified for SRG2PP")
+        time.sleep(1)
+
+    def test_60_check_update_tapi_links(self):
+        self.tapi_topo["topology-id"] = test_utils.T0_FULL_MULTILAYER_TOPO_UUID
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-topology', 'get-topology-details', self.tapi_topo)
+        time.sleep(2)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        link_list = response['output']['topology']['link']
+        nb_updated_link = 0
+        for link in link_list:
+            if all(x in link['name'][0]['value'] for x in ['ROADM-A1', 'SRG1-PP2-TXRX']):
+                self.assertEqual(link['operational-state'], 'DISABLED')
+                self.assertEqual(link['administrative-state'], 'LOCKED')
+                nb_updated_link += 1
+            else:
+                self.assertEqual(link['operational-state'], 'ENABLED')
+                self.assertEqual(link['administrative-state'], 'UNLOCKED')
+        self.assertEqual(nb_updated_link, 0,
+                         "No link should have been modified")
+        time.sleep(1)
+
+    def test_61_check_update_service1_ok(self):
+        self.test_12_get_service_Ethernet()
+
+    def test_62_check_update_connectivity_service_Ethernet_ok(self):
+        self.test_13_get_connectivity_service_Ethernet()
+
+    def test_63_delete_connectivity_service_Ethernet(self):
+        self.del_serv_input_data["uuid"] = str(self.uuid_services.eth)
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-connectivity', 'delete-connectivity-service', self.del_serv_input_data)
+        self.assertIn(response['status_code'], (requests.codes.ok, requests.codes.no_content))
+        time.sleep(self.WAITING)
+
+    def test_64_disconnect_xponders_from_roadm(self):
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        links = response['network'][0]['ietf-network-topology:link']
+        for link in links:
+            if link["org-openroadm-common-network:link-type"] in ('XPONDER-OUTPUT', 'XPONDER-INPUT'):
+                response = test_utils.del_ietf_network_link_request(
+                    'openroadm-topology', link['link-id'], 'config')
+                self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
+
+    def test_65_disconnect_XPDRA(self):
+        response = test_utils.unmount_device("XPDR-A1")
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
+
+    def test_66_disconnect_XPDRC(self):
+        response = test_utils.unmount_device("XPDR-C1")
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
+
+    def test_67_disconnect_ROADMA(self):
+        response = test_utils.unmount_device("ROADM-A1")
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
+
+    def test_68_disconnect_ROADMC(self):
+        response = test_utils.unmount_device("ROADM-C1")
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
+
+    def test_69_restore_status_port_roadma_srg(self):
+        self.assertTrue(test_utils.sims_update_cp_port(('roadma', self.NODE_VERSION_221), '3/0', 'C2',
+                                                       {
+            "port-name": "C2",
+            "logical-connection-point": "SRG1-PP2",
+            "port-type": "client",
+            "circuit-id": "SRG1",
+            "administrative-state": "inService",
+            "port-qual": "roadm-external"
+        }))
+        time.sleep(2)
+
+    def test_70_clean_openroadm_topology(self):
+        response = test_utils.get_ietf_network_request('openroadm-topology', 'config')
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        links = response['network'][0]['ietf-network-topology:link']
+        for link in links:
+            if link["org-openroadm-common-network:link-type"] in ('XPONDER-OUTPUT', 'XPONDER-INPUT', 'ROADM-TO-ROADM'):
+                response = test_utils.del_ietf_network_link_request('openroadm-topology', link['link-id'], 'config')
+                self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
+
+
+if __name__ == "__main__":
+    unittest.main(verbosity=2)
index c1436658fb98a7870cc6bb932de792cebb7fbf8e..053b16b5ca7b985b5342e57690c7eb486df4f143 100644 (file)
@@ -12,7 +12,6 @@
 # pylint: disable=too-many-public-methods
 
 import os
-import json
 # pylint: disable=wrong-import-order
 import sys
 import unittest
@@ -26,7 +25,7 @@ import test_utils  # nopep8
 
 class TransportNbiNotificationstesting(unittest.TestCase):
     processes = []
-    cr_serv_sample_data = {"input": {
+    cr_serv_input_data = {
         "sdnc-request-header": {
             "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
             "rpc-action": "service-create",
@@ -57,6 +56,22 @@ class TransportNbiNotificationstesting(unittest.TestCase):
         "due-date": "2016-11-28T00:00:01Z",
         "operator-contact": "pw1234"
     }
+
+    del_serv_input_data = {
+        "sdnc-request-header": {
+            "request-id": "e3028bae-a90f-4ddd-a83f-cf224eba0e58",
+            "rpc-action": "service-delete",
+            "request-system-id": "appname",
+            "notification-url": "http://localhost:8585/NotificationServer/notify"},
+        "service-delete-req-info": {
+            "service-name": "TBD",
+            "tail-retention": "no"}
+    }
+
+    nbi_notif_input_data = {
+        "connection-type": "service",
+        "id-consumer": "consumer",
+        "group-id": "transportpceTest"
     }
 
     WAITING = 20  # nominal value is 300
@@ -69,17 +84,11 @@ class TransportNbiNotificationstesting(unittest.TestCase):
         cls.init_failed = False
         cls.processes = test_utils.start_tpce()
         # NBI notification feature is not installed by default in Karaf
-        if "USE_LIGHTY" not in os.environ or os.environ['USE_LIGHTY'] != 'True':
+        if "NO_ODL_STARTUP" not in os.environ or "USE_LIGHTY" not in os.environ or os.environ['USE_LIGHTY'] != 'True':
             print("installing NBI notification feature...")
             result = test_utils.install_karaf_feature("odl-transportpce-nbinotifications")
             if result.returncode != 0:
                 cls.init_failed = True
-            print("Restarting OpenDaylight...")
-            test_utils.shutdown_process(cls.processes[0])
-            cls.processes[0] = test_utils.start_karaf()
-            test_utils.process_list[0] = cls.processes[0]
-            cls.init_failed = not test_utils.wait_until_log_contains(
-                test_utils.KARAF_LOG, test_utils.KARAF_OK_START_MSG, time_to_wait=60)
         if cls.init_failed:
             print("NBI notification installation feature failed...")
             test_utils.shutdown_process(cls.processes[0])
@@ -102,89 +111,84 @@ class TransportNbiNotificationstesting(unittest.TestCase):
 
     def test_01_connect_xpdrA(self):
         response = test_utils.mount_device("XPDR-A1", ('xpdra', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+        self.assertEqual(response.status_code,
+                         requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_02_connect_xpdrC(self):
         response = test_utils.mount_device("XPDR-C1", ('xpdrc', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+        self.assertEqual(response.status_code,
+                         requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_03_connect_rdmA(self):
         response = test_utils.mount_device("ROADM-A1", ('roadma', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+        self.assertEqual(response.status_code,
+                         requests.codes.created, test_utils.CODE_SHOULD_BE_201)
 
     def test_04_connect_rdmC(self):
         response = test_utils.mount_device("ROADM-C1", ('roadmc', self.NODE_VERSION))
-        self.assertEqual(response.status_code, requests.codes.created, test_utils.CODE_SHOULD_BE_201)
-
-    def test_05_connect_xprdA_N1_to_roadmA_PP1(self):
-        response = test_utils.connect_xpdr_to_rdm_request("XPDR-A1", "1", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully', res["output"]["result"])
+        self.assertEqual(response.status_code,
+                         requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+
+    def test_05_connect_xpdrA_N1_to_roadmA_PP1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDR-A1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_06_connect_roadmA_PP1_to_xpdrA_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("XPDR-A1", "1", "1",
-                                                          "ROADM-A1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully', res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDR-A1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
         time.sleep(2)
 
-    def test_07_connect_xprdC_N1_to_roadmC_PP1(self):
-        response = test_utils.connect_xpdr_to_rdm_request("XPDR-C1", "1", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Xponder Roadm Link created successfully', res["output"]["result"])
+    def test_07_connect_xpdrC_N1_to_roadmC_PP1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDR-C1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_08_connect_roadmC_PP1_to_xpdrC_N1(self):
-        response = test_utils.connect_rdm_to_xpdr_request("XPDR-C1", "1", "1",
-                                                          "ROADM-C1", "1", "SRG1-PP1-TXRX")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertIn('Roadm Xponder links created successfully', res["output"]["result"])
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDR-C1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
         time.sleep(2)
 
     def test_09_get_notifications_service1(self):
-        data = {
-            "input": {
-                "connection-type": "service",
-                "id-consumer": "consumer",
-                "group-id": "transportpceTest"
-            }
-        }
-        response = test_utils.get_notifications_process_service_request(data)
-        self.assertEqual(response.status_code, requests.codes.no_content)
+        response = test_utils.transportpce_api_rpc_request(
+            'nbi-notifications', 'get-notifications-process-service', self.nbi_notif_input_data)
+        self.assertEqual(response['status_code'], requests.codes.no_content)
         time.sleep(2)
 
     def test_10_create_eth_service1(self):
-        self.cr_serv_sample_data["input"]["service-name"] = "service1"
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.cr_serv_input_data["service-name"] = "service1"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create', self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_11_get_notifications_service1(self):
-        data = {
-            "input": {
-                "connection-type": "service",
-                "id-consumer": "consumer",
-                "group-id": "transportpceTest"
-            }
-        }
-        response = test_utils.get_notifications_process_service_request(data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(res['output']['notifications-process-service'][-1]['service-name'], 'service1')
-        self.assertEqual(res['output']['notifications-process-service'][-1]['connection-type'], 'service')
-        self.assertEqual(res['output']['notifications-process-service'][-1]['message'],
+        response = test_utils.transportpce_api_rpc_request(
+            'nbi-notifications', 'get-notifications-process-service', self.nbi_notif_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['output']['notifications-process-service'][-1]['service-name'], 'service1')
+        self.assertEqual(response['output']['notifications-process-service'][-1]['connection-type'], 'service')
+        self.assertEqual(response['output']['notifications-process-service'][-1]['message'],
                          'ServiceCreate request failed ...')
-        self.assertEqual(res['output']['notifications-process-service'][-1]['response-failed'],
+        self.assertEqual(response['output']['notifications-process-service'][-1]['response-failed'],
                          'PCE path computation failed !')
         time.sleep(2)
 
@@ -200,7 +204,8 @@ class TransportNbiNotificationstesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request("ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request(
+            "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
 
     def test_13_add_omsAttributes_ROADMC_ROADMA(self):
@@ -215,155 +220,116 @@ class TransportNbiNotificationstesting(unittest.TestCase):
                 "fiber-type": "smf",
                 "SRLG-length": 100000,
                 "pmd": 0.5}]}}
-        response = test_utils.add_oms_attr_request("ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX", data)
+        response = test_utils.add_oms_attr_request(
+            "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX", data)
         self.assertEqual(response.status_code, requests.codes.created)
 
     # test service-create for Eth service from xpdr to xpdr
     def test_14_create_eth_service1(self):
-        self.cr_serv_sample_data["input"]["service-name"] = "service1"
-        response = test_utils.service_create_request(self.cr_serv_sample_data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.cr_serv_input_data["service-name"] = "service1"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-create', self.cr_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('PCE calculation in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(self.WAITING)
 
     def test_15_get_eth_service1(self):
-        response = test_utils.get_service_list_request("services/service1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(
-            res['services'][0]['administrative-state'], 'inService')
-        self.assertEqual(
-            res['services'][0]['service-name'], 'service1')
-        self.assertEqual(
-            res['services'][0]['connection-type'], 'service')
-        self.assertEqual(
-            res['services'][0]['lifecycle-state'], 'planned')
-        time.sleep(2)
+        response = test_utils.get_ordm_serv_list_attr_request("services", "service1")
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], 'service1')
+        self.assertEqual(response['services'][0]['connection-type'], 'service')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
 
     def test_16_get_notifications_service1(self):
-        data = {
-            "input": {
-                "connection-type": "service",
-                "id-consumer": "consumer",
-                "group-id": "transportpceTest"
-            }
-        }
-        response = test_utils.get_notifications_process_service_request(data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(res['output']['notifications-process-service'][-1]['service-name'], 'service1')
-        self.assertEqual(res['output']['notifications-process-service'][-1]['connection-type'], 'service')
-        self.assertEqual(res['output']['notifications-process-service'][-1]['message'], 'Service implemented !')
-        time.sleep(2)
+        response = test_utils.transportpce_api_rpc_request(
+            'nbi-notifications', 'get-notifications-process-service', self.nbi_notif_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['output']['notifications-process-service'][-1]['service-name'], 'service1')
+        self.assertEqual(response['output']['notifications-process-service'][-1]['connection-type'], 'service')
+        self.assertEqual(response['output']['notifications-process-service'][-1]['message'], 'Service implemented !')
 
     def test_17_get_notifications_alarm_service1(self):
-        data = {
-            "input": {
-                "connection-type": "service",
-                "id-consumer": "consumer",
-                "group-id": "transportpceTest"
-            }
-        }
-        response = test_utils.get_notifications_alarm_service_request(data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(res['output']['notifications-alarm-service'][-1]['service-name'], 'service1')
-        self.assertEqual(res['output']['notifications-alarm-service'][-1]['connection-type'], 'service')
-        self.assertEqual(res['output']['notifications-alarm-service'][-1]['operational-state'], 'inService')
-        self.assertEqual(res['output']['notifications-alarm-service'][-1]['message'], 'The service is now inService')
-        time.sleep(2)
+        response = test_utils.transportpce_api_rpc_request(
+            'nbi-notifications', 'get-notifications-alarm-service', self.nbi_notif_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['output']['notifications-alarm-service'][-1]['service-name'], 'service1')
+        self.assertEqual(response['output']['notifications-alarm-service'][-1]['connection-type'], 'service')
+        self.assertEqual(response['output']['notifications-alarm-service'][-1]['operational-state'], 'inService')
+        self.assertEqual(response['output']['notifications-alarm-service'][-1]['message'],
+                         'The service is now inService')
 
     def test_18_change_status_port_roadma_srg(self):
-        url = "{}/config/org-openroadm-device:org-openroadm-device/circuit-packs/3%2F0/ports/C1"
-        body = {"ports": [{
+        self.assertTrue(test_utils.sims_update_cp_port(('roadma', self.NODE_VERSION), '3/0', 'C1',
+                                                       {
             "port-name": "C1",
             "logical-connection-point": "SRG1-PP1",
             "port-type": "client",
             "circuit-id": "SRG1",
             "administrative-state": "outOfService",
-            "port-qual": "roadm-external"}]}
-        response = requests.request("PUT", url.format("http://127.0.0.1:8141/restconf"),
-                                    data=json.dumps(body), headers=test_utils.TYPE_APPLICATION_JSON,
-                                    auth=(test_utils.ODL_LOGIN, test_utils.ODL_PWD))
-        self.assertEqual(response.status_code, requests.codes.ok)
-        time.sleep(2)
+            "port-qual": "roadm-external"
+        }))
+        time.sleep(5)
 
     def test_19_get_notifications_alarm_service1(self):
-        data = {
-            "input": {
-                "connection-type": "service",
-                "id-consumer": "consumer",
-                "group-id": "transportpceTest"
-            }
-        }
-        response = test_utils.get_notifications_alarm_service_request(data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(res['output']['notifications-alarm-service'][-1]['service-name'], 'service1')
-        self.assertEqual(res['output']['notifications-alarm-service'][-1]['connection-type'], 'service')
-        self.assertEqual(res['output']['notifications-alarm-service'][-1]['operational-state'], 'outOfService')
-        self.assertEqual(res['output']['notifications-alarm-service'][-1]['message'], 'The service is now outOfService')
-        time.sleep(2)
+        response = test_utils.transportpce_api_rpc_request(
+            'nbi-notifications', 'get-notifications-alarm-service', self.nbi_notif_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['output']['notifications-alarm-service'][-1]['service-name'], 'service1')
+        self.assertEqual(response['output']['notifications-alarm-service'][-1]['connection-type'], 'service')
+        self.assertEqual(response['output']['notifications-alarm-service'][-1]['operational-state'], 'outOfService')
+        self.assertEqual(response['output']['notifications-alarm-service'][-1]['message'],
+                         'The service is now outOfService')
 
     def test_20_restore_status_port_roadma_srg(self):
-        url = "{}/config/org-openroadm-device:org-openroadm-device/circuit-packs/3%2F0/ports/C1"
-        body = {"ports": [{
+        self.assertTrue(test_utils.sims_update_cp_port(('roadma', self.NODE_VERSION), '3/0', 'C1',
+                                                       {
             "port-name": "C1",
             "logical-connection-point": "SRG1-PP1",
             "port-type": "client",
             "circuit-id": "SRG1",
             "administrative-state": "inService",
-            "port-qual": "roadm-external"}]}
-        response = requests.request("PUT", url.format("http://127.0.0.1:8141/restconf"),
-                                    data=json.dumps(body), headers=test_utils.TYPE_APPLICATION_JSON,
-                                    auth=(test_utils.ODL_LOGIN, test_utils.ODL_PWD))
-        self.assertEqual(response.status_code, requests.codes.ok)
-        time.sleep(2)
+            "port-qual": "roadm-external"
+        }))
+        time.sleep(5)
 
     def test_21_get_notifications_alarm_service1(self):
         self.test_17_get_notifications_alarm_service1()
 
     def test_22_delete_eth_service1(self):
-        response = test_utils.service_delete_request("service1")
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
+        self.del_serv_input_data["service-delete-req-info"]["service-name"] = "service1"
+        response = test_utils.transportpce_api_rpc_request(
+            'org-openroadm-service', 'service-delete', self.del_serv_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
         self.assertIn('Renderer service delete in progress',
-                      res['output']['configuration-response-common']['response-message'])
+                      response['output']['configuration-response-common']['response-message'])
         time.sleep(20)
 
     def test_23_get_notifications_service1(self):
-        data = {
-            "input": {
-                "connection-type": "service",
-                "id-consumer": "consumer",
-                "group-id": "transportpceTest"
-            }
-        }
-        response = test_utils.get_notifications_process_service_request(data)
-        self.assertEqual(response.status_code, requests.codes.ok)
-        res = response.json()
-        self.assertEqual(res['output']['notifications-process-service'][-1]['service-name'], 'service1')
-        self.assertEqual(res['output']['notifications-process-service'][-1]['connection-type'], 'service')
-        self.assertEqual(res['output']['notifications-process-service'][-1]['message'], 'Service deleted !')
+        response = test_utils.transportpce_api_rpc_request(
+            'nbi-notifications', 'get-notifications-process-service', self.nbi_notif_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['output']['notifications-process-service'][-1]['service-name'], 'service1')
+        self.assertEqual(response['output']['notifications-process-service'][-1]['connection-type'], 'service')
+        self.assertEqual(response['output']['notifications-process-service'][-1]['message'], 'Service deleted !')
         time.sleep(2)
 
     def test_24_disconnect_XPDRA(self):
         response = test_utils.unmount_device("XPDR-A1")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_25_disconnect_XPDRC(self):
         response = test_utils.unmount_device("XPDR-C1")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_26_disconnect_ROADMA(self):
         response = test_utils.unmount_device("ROADM-A1")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
     def test_27_disconnect_ROADMC(self):
         response = test_utils.unmount_device("ROADM-C1")
-        self.assertEqual(response.status_code, requests.codes.ok, test_utils.CODE_SHOULD_BE_200)
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
 
 
 if __name__ == "__main__":
diff --git a/tests/transportpce_tests/with_docker/test03_tapi_nbinotifications.py b/tests/transportpce_tests/with_docker/test03_tapi_nbinotifications.py
new file mode 100644 (file)
index 0000000..10b84a6
--- /dev/null
@@ -0,0 +1,407 @@
+#!/usr/bin/env python
+##############################################################################
+# Copyright (c) 2020 Orange, Inc. and others.  All rights reserved.
+#
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Apache License, Version 2.0
+# which accompanies this distribution, and is available at
+# http://www.apache.org/licenses/LICENSE-2.0
+##############################################################################
+
+# pylint: disable=no-member
+# pylint: disable=too-many-public-methods
+
+import os
+# pylint: disable=wrong-import-order
+import sys
+import unittest
+import time
+import requests
+sys.path.append('transportpce_tests/common/')
+# pylint: disable=wrong-import-position
+# pylint: disable=import-error
+import test_utils  # nopep8
+
+
+# pylint: disable=too-few-public-methods
+class UuidServices:
+
+    def __init__(self):
+        # pylint: disable=invalid-name
+        self.pm = None
+        self.odu = None
+        self.dsr = None
+        self.eth = None
+
+
+# pylint: disable=too-few-public-methods
+class UuidSubscriptions:
+
+    def __init__(self):
+        # pylint: disable=invalid-name
+        self.pm = None
+        self.odu = None
+        self.dsr = None
+        self.eth = None
+
+
+class TransportNbiNotificationstesting(unittest.TestCase):
+    cr_serv_input_data = {
+        "end-point": [
+            {
+                "layer-protocol-name": "DSR",
+                "service-interface-point": {
+                    "service-interface-point-uuid": "b1f4bd3b-7fa9-367b-a8ab-6e80293238df"
+                },
+                "administrative-state": "UNLOCKED",
+                "operational-state": "ENABLED",
+                "direction": "BIDIRECTIONAL",
+                "role": "SYMMETRIC",
+                "protection-role": "WORK",
+                "local-id": "XPDR-C1-XPDR1",
+                "name": [
+                        {
+                            "value-name": "OpenROADM node id",
+                            "value": "XPDR-C1-XPDR1"
+                        }
+                ]
+            },
+            {
+                "layer-protocol-name": "DSR",
+                "service-interface-point": {
+                    "service-interface-point-uuid": "b5964ce9-274c-3f68-b4d1-83c0b61bc74e"
+                },
+                "administrative-state": "UNLOCKED",
+                "operational-state": "ENABLED",
+                "direction": "BIDIRECTIONAL",
+                "role": "SYMMETRIC",
+                "protection-role": "WORK",
+                "local-id": "XPDR-A1-XPDR1",
+                "name": [
+                        {
+                            "value-name": "OpenROADM node id",
+                            "value": "XPDR-A1-XPDR1"
+                        }
+                ]
+            }
+        ],
+        "connectivity-constraint": {
+            "service-type": "POINT_TO_POINT_CONNECTIVITY",
+            "service-level": "Some service-level",
+            "requested-capacity": {
+                "total-size": {
+                    "value": "100",
+                    "unit": "tapi-common:CAPACITY_UNIT_GBPS"
+                }
+            }
+        },
+        "state": "LOCKED",
+        "layer-protocol-name": "ETH"
+    }
+
+    tapi_serv_details = {"uuid": "TBD"}
+
+    cr_notif_subs_input_data = {
+        "subscription-filter": {
+            "requested-notification-types": [
+                "NOTIFICATION_TYPE_ATTRIBUTE_VALUE_CHANGE"
+            ],
+            "requested-layer-protocols": [
+                "ETH"
+            ],
+            "requested-object-identifier": [
+                "76d8f07b-ead5-4132-8eb8-cf3fdef7e079"
+            ],
+            "include-content": True,
+            "local-id": "localId",
+            "name": [
+                {
+                        "value-name": "Subscription name",
+                        "value": "test subscription"
+                }
+            ]
+        },
+        "subscription-state": "ACTIVE"
+    }
+
+    cr_get_notif_list_input_data = {
+        "subscription-id": "c07e7fd1-0377-4fbf-8928-36c17b0d0d68",
+    }
+
+    processes = []
+    uuid_services = UuidServices()
+    uuid_subscriptions = UuidSubscriptions()
+    WAITING = 20  # nominal value is 300
+    NODE_VERSION_221 = '2.2.1'
+
+    @classmethod
+    def setUpClass(cls):
+        # pylint: disable=unsubscriptable-object
+        # TODO: for lighty manage the activation of NBI notification feature
+        cls.init_failed_nbi = False
+        cls.init_failed_tapi = False
+        os.environ['JAVA_MIN_MEM'] = '1024M'
+        os.environ['JAVA_MAX_MEM'] = '4096M'
+        cls.processes = test_utils.start_tpce()
+        # NBI notification feature is not installed by default in Karaf
+        if "NO_ODL_STARTUP" not in os.environ or "USE_LIGHTY" not in os.environ or os.environ['USE_LIGHTY'] != 'True':
+            print("installing NBI notification feature...")
+            result = test_utils.install_karaf_feature("odl-transportpce-nbinotifications")
+            if result.returncode != 0:
+                cls.init_failed_nbi = True
+            print("installing tapi feature...")
+            result = test_utils.install_karaf_feature("odl-transportpce-tapi")
+            if result.returncode != 0:
+                cls.init_failed_tapi = True
+        if cls.init_failed_nbi:
+            print("NBI notification installation feature failed...")
+            test_utils.shutdown_process(cls.processes[0])
+            sys.exit(2)
+        if cls.init_failed_tapi:
+            print("tapi installation feature failed...")
+            test_utils.shutdown_process(cls.processes[0])
+            sys.exit(2)
+        cls.processes = test_utils.start_sims([('xpdra', cls.NODE_VERSION_221),
+                                               ('roadma', cls.NODE_VERSION_221),
+                                               ('roadmc', cls.NODE_VERSION_221),
+                                               ('xpdrc', cls.NODE_VERSION_221)])
+
+    @classmethod
+    def tearDownClass(cls):
+        # pylint: disable=not-an-iterable
+        for process in cls.processes:
+            test_utils.shutdown_process(process)
+        print("all processes killed")
+
+    def setUp(self):  # instruction executed before each test method
+        print(f'execution of {self.id().split(".")[-1]}')
+
+    def test_01_connect_xpdrA(self):
+        response = test_utils.mount_device("XPDR-A1", ('xpdra', self.NODE_VERSION_221))
+        self.assertEqual(response.status_code,
+                         requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+
+    def test_02_connect_xpdrC(self):
+        response = test_utils.mount_device("XPDR-C1", ('xpdrc', self.NODE_VERSION_221))
+        self.assertEqual(response.status_code,
+                         requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+
+    def test_03_connect_rdmA(self):
+        response = test_utils.mount_device("ROADM-A1", ('roadma', self.NODE_VERSION_221))
+        self.assertEqual(response.status_code,
+                         requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+
+    def test_04_connect_rdmC(self):
+        response = test_utils.mount_device("ROADM-C1", ('roadmc', self.NODE_VERSION_221))
+        self.assertEqual(response.status_code,
+                         requests.codes.created, test_utils.CODE_SHOULD_BE_201)
+
+    def test_05_connect_xpdrA_N1_to_roadmA_PP1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDR-A1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
+        time.sleep(2)
+
+    def test_06_connect_roadmA_PP1_to_xpdrA_N1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDR-A1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-A1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
+        time.sleep(2)
+
+    def test_07_connect_xpdrC_N1_to_roadmC_PP1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-xpdr-rdm-links',
+            {'links-input': {'xpdr-node': 'XPDR-C1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Xponder Roadm Link created successfully', response["output"]["result"])
+        time.sleep(2)
+
+    def test_08_connect_roadmC_PP1_to_xpdrC_N1(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'transportpce-networkutils', 'init-rdm-xpdr-links',
+            {'links-input': {'xpdr-node': 'XPDR-C1', 'xpdr-num': '1', 'network-num': '1',
+                             'rdm-node': 'ROADM-C1', 'srg-num': '1', 'termination-point-num': 'SRG1-PP1-TXRX'}})
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertIn('Roadm Xponder links created successfully', response["output"]["result"])
+        time.sleep(2)
+
+    def test_09_add_omsAttributes_ROADMA_ROADMC(self):
+        # Config ROADMA-ROADMC oms-attributes
+        data = {"span": {
+            "auto-spanloss": "true",
+            "spanloss-base": 11.4,
+            "spanloss-current": 12,
+            "engineered-spanloss": 12.2,
+            "link-concatenation": [{
+                "SRLG-Id": 0,
+                "fiber-type": "smf",
+                "SRLG-length": 100000,
+                "pmd": 0.5}]}}
+        response = test_utils.add_oms_attr_request(
+            "ROADM-A1-DEG2-DEG2-TTP-TXRXtoROADM-C1-DEG1-DEG1-TTP-TXRX", data)
+        self.assertEqual(response.status_code, requests.codes.created)
+
+    def test_10_add_omsAttributes_ROADMC_ROADMA(self):
+        # Config ROADMC-ROADMA oms-attributes
+        data = {"span": {
+            "auto-spanloss": "true",
+            "spanloss-base": 11.4,
+            "spanloss-current": 12,
+            "engineered-spanloss": 12.2,
+            "link-concatenation": [{
+                "SRLG-Id": 0,
+                "fiber-type": "smf",
+                "SRLG-length": 100000,
+                "pmd": 0.5}]}}
+        response = test_utils.add_oms_attr_request(
+            "ROADM-C1-DEG1-DEG1-TTP-TXRXtoROADM-A1-DEG2-DEG2-TTP-TXRX", data)
+        self.assertEqual(response.status_code, requests.codes.created)
+
+    # test service-create for Eth service from xpdr to xpdr
+    def test_11_create_connectivity_service_Ethernet(self):
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-connectivity', 'create-connectivity-service', self.cr_serv_input_data)
+        time.sleep(self.WAITING)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.uuid_services.eth = response['output']['service']['uuid']
+        # pylint: disable=consider-using-f-string
+
+        input_dict_1 = {'administrative-state': 'LOCKED',
+                        'lifecycle-state': 'PLANNED',
+                        'operational-state': 'DISABLED',
+                        }
+        input_dict_2 = {'value-name': 'OpenROADM node id',
+                        'value': 'XPDR-C1-XPDR1'}
+        input_dict_3 = {'value-name': 'OpenROADM node id',
+                        'value': 'XPDR-A1-XPDR1'}
+
+        self.assertDictEqual(dict(input_dict_1, **response['output']['service']),
+                             response['output']['service'])
+        self.assertDictEqual(dict(input_dict_2, **response['output']['service']['end-point'][0]['name'][0]),
+                             response['output']['service']['end-point'][0]['name'][0])
+        self.assertDictEqual(dict(input_dict_3, **response['output']['service']['end-point'][1]['name'][0]),
+                             response['output']['service']['end-point'][1]['name'][0])
+
+    def test_12_get_service_Ethernet(self):
+        response = test_utils.get_ordm_serv_list_attr_request("services", str(self.uuid_services.eth))
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['services'][0]['administrative-state'], 'inService')
+        self.assertEqual(response['services'][0]['service-name'], str(self.uuid_services.eth))
+        self.assertEqual(response['services'][0]['connection-type'], 'service')
+        self.assertEqual(response['services'][0]['lifecycle-state'], 'planned')
+        time.sleep(1)
+
+    def test_13_get_connectivity_service_Ethernet(self):
+        self.tapi_serv_details["uuid"] = str(self.uuid_services.eth)
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-connectivity', 'get-connectivity-service-details', self.tapi_serv_details)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['output']['service']['operational-state'], 'ENABLED')
+        self.assertEqual(response['output']['service']['name'][0]['value'], self.uuid_services.eth)
+        self.assertEqual(response['output']['service']['administrative-state'], 'UNLOCKED')
+        self.assertEqual(response['output']['service']['lifecycle-state'], 'INSTALLED')
+
+    def test_14_create_notifications_subscription_service(self):
+        self.cr_notif_subs_input_data["subscription-filter"]["requested-object-identifier"][0] =\
+            str(self.uuid_services.eth)
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-notification', 'create-notification-subscription-service', self.cr_notif_subs_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.uuid_subscriptions.eth = response['output']['subscription-service']['uuid']
+        self.assertEqual(response['output']['subscription-service']['subscription-filter'][0]
+                         ['requested-notification-types'][0],
+                         'tapi-notification:NOTIFICATION_TYPE_ATTRIBUTE_VALUE_CHANGE')
+        self.assertEqual(response['output']['subscription-service']['subscription-filter'][0]
+                         ['requested-object-identifier'][0], str(self.uuid_services.eth))
+        time.sleep(2)
+
+    def test_15_change_status_port_roadma_srg(self):
+        self.assertTrue(test_utils.sims_update_cp_port(('roadma', self.NODE_VERSION_221), '3/0', 'C1',
+                                                       {
+            "port-name": "C1",
+            "logical-connection-point": "SRG1-PP1",
+            "port-type": "client",
+            "circuit-id": "SRG1",
+            "administrative-state": "outOfService",
+            "port-qual": "roadm-external"
+        }))
+        time.sleep(5)
+
+    def test_16_get_tapi_notifications_connectivity_service_Ethernet(self):
+        self.cr_get_notif_list_input_data["subscription-id"] = str(self.uuid_subscriptions.eth)
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-notification', 'get-notification-list', self.cr_get_notif_list_input_data)
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(response['output']['notification'][0]['target-object-identifier'], str(self.uuid_services.eth))
+        self.assertEqual(response['output']['notification'][0]['changed-attributes'][0]['old-value'], 'UNLOCKED')
+        self.assertEqual(response['output']['notification'][0]['changed-attributes'][0]['new-value'], 'LOCKED')
+        self.assertEqual(response['output']['notification'][0]['changed-attributes'][1]['value-name'],
+                         'operationalState')
+        self.assertEqual(response['output']['notification'][0]['changed-attributes'][1]['old-value'], 'ENABLED')
+        self.assertEqual(response['output']['notification'][0]['changed-attributes'][1]['new-value'], 'DISABLED')
+        time.sleep(2)
+
+    def test_17_restore_status_port_roadma_srg(self):
+        self.assertTrue(test_utils.sims_update_cp_port(('roadma', self.NODE_VERSION_221), '3/0', 'C1',
+                                                       {
+            "port-name": "C1",
+            "logical-connection-point": "SRG1-PP1",
+            "port-type": "client",
+            "circuit-id": "SRG1",
+            "administrative-state": "inService",
+            "port-qual": "roadm-external"
+        }))
+        time.sleep(5)
+
+    def test_18_get_tapi_notifications_connectivity_service_Ethernet(self):
+        self.cr_get_notif_list_input_data["subscription-id"] = str(self.uuid_subscriptions.eth)
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-notification', 'get-notification-list', self.cr_get_notif_list_input_data)
+        if response['output']['notification'][0]['event-time-stamp'] >\
+                response['output']['notification'][1]['event-time-stamp']:
+            new_notif = response['output']['notification'][0]
+        else:
+            new_notif = response['output']['notification'][1]
+        self.assertEqual(response['status_code'], requests.codes.ok)
+        self.assertEqual(new_notif['target-object-identifier'], str(self.uuid_services.eth))
+        self.assertEqual(new_notif['changed-attributes'][0]['value-name'], 'administrativeState')
+        self.assertEqual(new_notif['changed-attributes'][0]['old-value'], 'LOCKED')
+        self.assertEqual(new_notif['changed-attributes'][0]['new-value'], 'UNLOCKED')
+        self.assertEqual(new_notif['changed-attributes'][1]['value-name'], 'operationalState')
+        self.assertEqual(new_notif['changed-attributes'][1]['old-value'], 'DISABLED')
+        self.assertEqual(new_notif['changed-attributes'][1]['new-value'], 'ENABLED')
+        time.sleep(2)
+
+    def test_19_delete_connectivity_service_Ethernet(self):
+        self.tapi_serv_details["uuid"] = str(self.uuid_services.eth)
+        response = test_utils.transportpce_api_rpc_request(
+            'tapi-connectivity', 'delete-connectivity-service', self.tapi_serv_details)
+        self.assertIn(response['status_code'], (requests.codes.ok, requests.codes.no_content))
+        time.sleep(self.WAITING)
+
+    def test_20_disconnect_XPDRA(self):
+        response = test_utils.unmount_device("XPDR-A1")
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
+
+    def test_21_disconnect_XPDRC(self):
+        response = test_utils.unmount_device("XPDR-C1")
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
+
+    def test_22_disconnect_ROADMA(self):
+        response = test_utils.unmount_device("ROADM-A1")
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
+
+    def test_23_disconnect_ROADMC(self):
+        response = test_utils.unmount_device("ROADM-C1")
+        self.assertIn(response.status_code, (requests.codes.ok, requests.codes.no_content))
+
+
+if __name__ == "__main__":
+    unittest.main(verbosity=2)
diff --git a/tox.ini b/tox.ini
index d2936ac2b4d4324119a67dfc9a6748b815633468..73f3460ee563f51e23f57e900dcf715b554608d7 100644 (file)
--- a/tox.ini
+++ b/tox.ini
@@ -1,23 +1,43 @@
 [tox]
 minversion = 3.7.0
-envlist = buildcontroller,testsPCE,
-    sims121,build_karaf_tests121,tests121,
-    sims221,build_karaf_tests221,tests221,tests_tapi,
-    sims71,build_karaf_tests71,tests71,
-    build_karaf_tests_hybrid,tests_hybrid,
-    docs
-    docs-linkcheck
-    checkbashisms
-    pre-commit
-    gitlint
-    pylint
+envlist = buildcontroller
+     testsPCE
+     sims121
+     build_karaf_tests121
+     tests121
+     sims221
+     build_karaf_tests221
+     tests_tapi
+     tests221
+     sims71
+     build_karaf_tests71
+     tests71
+     build_karaf_tests_hybrid
+     tests_hybrid
+     buildlighty
+     docs
+     docs-linkcheck
+     checkbashisms
+     pre-commit
+     pylint
 skipsdist = true
 setupdir = tests/
 
 [testenv]
-passenv = USE_LIGHTY http_proxy HTTP_PROXY https_proxy HTTPS_PROXY no_proxy NO_PROXY OLM_TIMER1 OLM_TIMER2
+passenv = LAUNCHER
+     USE_LIGHTY
+     USE_SIMS
+     NO_ODL_STARTUP
+     http_proxy
+     HTTP_PROXY
+     https_proxy
+     HTTPS_PROXY
+     no_proxy
+     NO_PROXY
+     OLM_TIMER1
+     OLM_TIMER2
 setenv =
-#    USE_LIGHTY=True
+#    USE_LIGHTY=True,
     OLM_TIMER1=3000
     OLM_TIMER2=2000
 
@@ -31,53 +51,73 @@ changedir = {toxinidir}/tests
 parallel_show_output = true
 
 [testenv:buildcontroller]
-whitelist_externals = build_controller.sh
+allowlist_externals = build_controller.sh
 commands =
   ./build_controller.sh
 
+[testenv:buildlighty]
+allowlist_externals = build.sh
+depends = buildcontroller,tests_hybrid
+changedir = {toxinidir}/lighty
+commands =
+  - ./build.sh
+
+[testenv:sims]
+passenv = USE_SIMS
+allowlist_externals = install_lightynode.sh
+depends = buildcontroller
+commands =
+  ./install_lightynode.sh {posargs:}
+
 [testenv:sims121]
-whitelist_externals = install_honeynode.sh
+passenv = USE_SIMS
+allowlist_externals = install_sims.sh
 depends = buildcontroller
 # sims profiles does not strictly depends on buildcontroller
 # but this dependency avoids race condition in the gate
 commands =
-  ./install_honeynode.sh 1.2.1
+  ./install_sims.sh 1.2.1
 
 [testenv:sims221]
-whitelist_externals = install_honeynode.sh
+passenv = USE_SIMS
+allowlist_externals = install_sims.sh
 depends = buildcontroller
 commands =
-  ./install_honeynode.sh 2.2.1
+  ./install_sims.sh 2.2.1
 
 [testenv:sims71]
-whitelist_externals = install_honeynode.sh
+passenv = USE_SIMS
+allowlist_externals = install_sims.sh
 depends = buildcontroller
 commands =
-  ./install_honeynode.sh 7.1
+  ./install_sims.sh 7.1
 
 [testenv:testsPCE]
 depends = buildcontroller
 #the following lines retrieve unofficial package of GNPy with REST support from Orange opensource Gitlab repo
 setenv =
-  PIP_EXTRA_INDEX_URL = https://gitlab.com/api/v4/projects/33090323/packages/pypi/simple
+    PIP_EXTRA_INDEX_URL = https://gitlab.com/api/v4/projects/33090323/packages/pypi/simple
+#    USE_LIGHTY=True
+#    USE_ODL_RESTCONF_VERSION=draft-bierman02
 deps =
   -r{toxinidir}/tests/requirements.txt
   -r{toxinidir}/tests/test-requirements.txt
   setuptools>=7.0
-  gnpy4tpce==2.4.3
-whitelist_externals = launch_tests.sh
-passenv = LAUNCHER USE_LIGHTY USE_ODL_RESTCONF_VERSION
-basepython = python3.8
-#setenv =
-#    USE_LIGHTY=True
+  gnpy4tpce==2.4.7
+allowlist_externals = launch_tests.sh
+passenv = LAUNCHER
+    USE_LIGHTY
+    NO_ODL_STARTUP
+    USE_ODL_RESTCONF_VERSION
+basepython = python3
 commands =
   ./launch_tests.sh pce {posargs:}
 
 [testenv:build_karaf_tests121]
 depends = buildcontroller
 # testsPCE dependency is only here to chain tests in the gate and avoid resources starvation
-whitelist_externals = launch_tests.sh
-passenv = LAUNCHER USE_LIGHTY
+allowlist_externals = launch_tests.sh
+passenv = USE_LIGHTY
 setenv =
 #    USE_LIGHTY=True
     USE_ODL_ALT_KARAF_ENV=./karaf121.env
@@ -88,8 +128,11 @@ commands =
 [testenv:tests121]
 depends = buildcontroller,build_karaf_tests121,sims121,testsPCE
 # testsPCE dependency is only here to chain tests in the gate and avoid resources starvation
-whitelist_externals = launch_tests.sh
-passenv = LAUNCHER USE_LIGHTY USE_ODL_RESTCONF_VERSION
+allowlist_externals = launch_tests.sh
+passenv = LAUNCHER
+    USE_LIGHTY
+    USE_SIMS
+    USE_ODL_RESTCONF_VERSION
 setenv =
 #    USE_LIGHTY=True
 #    USE_ODL_RESTCONF_VERSION=draft-bierman02
@@ -109,8 +152,8 @@ commands =
 [testenv:build_karaf_tests221]
 depends = buildcontroller
 # testsPCE dependency is only here to chain tests in the gate and avoid resources starvation
-whitelist_externals = launch_tests.sh
-passenv = LAUNCHER USE_LIGHTY
+allowlist_externals = launch_tests.sh
+passenv = USE_LIGHTY
 setenv =
 #    USE_LIGHTY=True
     USE_ODL_ALT_KARAF_ENV=./karaf221.env
@@ -118,11 +161,32 @@ setenv =
 commands =
   ./build_karaf_for_tests.sh
 
+[testenv:launch]
+depends = buildcontroller,build_karaf_tests221,sims,tests71
+# tests71 dependency is only here to chain tests in the gate and avoid ressources starvation
+allowlist_externals = launch.sh
+passenv = LAUNCHER
+    USE_LIGHTY
+    NO_ODL_STARTUP
+    USE_ODL_RESTCONF_VERSION
+setenv =
+#    USE_LIGHTY=True
+#    USE_ODL_RESTCONF_VERSION=draft-bierman02
+    USE_ODL_ALT_KARAF_ENV=./karaf221.env
+    USE_ODL_ALT_KARAF_INSTALL_DIR=karaf221
+commands =
+  ./launch.sh
+
+
 [testenv:tests221]
 depends = buildcontroller,build_karaf_tests221,sims221,tests71
 # tests71 dependency is only here to chain tests in the gate and avoid ressources starvation
-whitelist_externals = launch_tests.sh
-passenv = LAUNCHER USE_LIGHTY USE_ODL_RESTCONF_VERSION
+allowlist_externals = launch_tests.sh
+passenv = LAUNCHER
+    USE_LIGHTY
+    USE_SIMS
+    NO_ODL_STARTUP
+    USE_ODL_RESTCONF_VERSION
 setenv =
 #    USE_LIGHTY=True
 #    USE_ODL_RESTCONF_VERSION=draft-bierman02
@@ -134,8 +198,8 @@ commands =
 [testenv:build_karaf_tests71]
 depends = buildcontroller
 # testsPCE dependency is only here to chain tests in the gate and avoid resources starvation
-whitelist_externals = launch_tests.sh
-passenv = LAUNCHER USE_LIGHTY
+allowlist_externals = launch_tests.sh
+passenv = USE_LIGHTY
 setenv =
 #    USE_LIGHTY=True
     USE_ODL_ALT_KARAF_ENV=./karaf71.env
@@ -145,11 +209,15 @@ commands =
 
 [testenv:tests71]
 depends = buildcontroller,build_karaf_tests71,sims71,tests_tapi
-whitelist_externals = launch_tests.sh
-passenv = LAUNCHER USE_LIGHTY USE_ODL_RESTCONF_VERSION
+allowlist_externals = launch_tests.sh
+passenv = LAUNCHER
+    USE_LIGHTY
+    USE_SIMS
+    NO_ODL_STARTUP
+    USE_ODL_RESTCONF_VERSION
 setenv =
 #    USE_LIGHTY=True
-    USE_ODL_RESTCONF_VERSION=draft-bierman02
+#    USE_ODL_RESTCONF_VERSION=draft-bierman02
     USE_ODL_ALT_KARAF_ENV=./karaf71.env
     USE_ODL_ALT_KARAF_INSTALL_DIR=karaf71
 commands =
@@ -157,9 +225,8 @@ commands =
 
 [testenv:build_karaf_tests_hybrid]
 depends = buildcontroller
-# testsPCE dependency is only here to chain tests in the gate and avoid resources starvation
-whitelist_externals = launch_tests.sh
-passenv = LAUNCHER USE_LIGHTY
+allowlist_externals = launch_tests.sh
+passenv = USE_LIGHTY
 setenv =
 #    USE_LIGHTY=True
     USE_ODL_ALT_KARAF_ENV=./karaf121.env
@@ -170,10 +237,15 @@ commands =
 [testenv:tests_hybrid]
 depends = buildcontroller,build_karaf_tests_hybrid,sims121,sims221,sims71,tests121,tests221,tests71
 #the last dependency is to avoid temporarily concurrent ressources problem in parallel mode
-whitelist_externals = launch_tests.sh
-passenv = LAUNCHER USE_LIGHTY USE_ODL_RESTCONF_VERSION
+allowlist_externals = launch_tests.sh
+passenv = LAUNCHER
+    USE_LIGHTY
+    USE_SIMS
+    NO_ODL_STARTUP
+    USE_ODL_RESTCONF_VERSION
 setenv =
 #    USE_LIGHTY=True
+#    USE_ODL_RESTCONF_VERSION=draft-bierman02
     USE_ODL_ALT_KARAF_ENV=./karaf121.env
     USE_ODL_ALT_KARAF_INSTALL_DIR=karaf_hybrid
 commands =
@@ -182,11 +254,18 @@ commands =
 
 [testenv:tests_tapi]
 depends = buildcontroller,build_karaf_tests221,sims221
-whitelist_externals = launch_tests.sh
-passenv = LAUNCHER USE_LIGHTY OLM_TIMER1 OLM_TIMER2 USE_ODL_RESTCONF_VERSION
+allowlist_externals = launch_tests.sh
+#                      add_tapi_feature_to_tests221.sh
+passenv = LAUNCHER
+    USE_LIGHTY
+    USE_SIMS
+    NO_ODL_STARTUP
+    OLM_TIMER1
+    OLM_TIMER2
+    USE_ODL_RESTCONF_VERSION
 setenv =
-#   USE_LIGHTY=True
-    USE_ODL_RESTCONF_VERSION=draft-bierman02
+#    USE_LIGHTY=True
+#    USE_ODL_RESTCONF_VERSION=draft-bierman02
     USE_ODL_ALT_KARAF_ENV=./karaf221.env
     USE_ODL_ALT_KARAF_INSTALL_DIR=karaf221
     INSTALL_TAPI=True
@@ -194,44 +273,65 @@ setenv =
     OLM_TIMER2=2000
 
 commands =
+#  ./add_tapi_feature_to_tests221.sh
   ./launch_tests.sh tapi {posargs:}
 
-[testenv:nbinotifications]
+[testenv:with_docker]
 depends = buildcontroller,sims221
-whitelist_externals = launch_tests.sh
-                      dockercmd.sh
-passenv = LAUNCHER USE_LIGHTY USE_ODL_RESTCONF_VERSION OLM_TIMER1 OLM_TIMER2
+allowlist_externals = launch_tests.sh dockercmd.sh
+passenv = LAUNCHER
+    USE_LIGHTY
+    USE_SIMS
+    NO_ODL_STARTUP
+    USE_ODL_RESTCONF_VERSION
+#    OLM_TIMER1
+#    OLM_TIMER2
 setenv =
     OLM_TIMER1=3000
     OLM_TIMER2=2000
+    INSTALL_TAPI=True
     INSTALL_NBINOTIFICATIONS=True
+#    USE_ODL_RESTCONF_VERSION=draft-bierman02
 
 commands =
   ./dockercmd.sh run -d -p 2181:2181 -p 9092:9092 --env ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 --name tpce_kafka1 teivah/kafka:2.0.0
-  ./launch_tests.sh with_docker nbinotifications
+  ./launch_tests.sh with_docker {posargs:}
   ./dockercmd.sh container rm -f tpce_kafka1
 
 [testenv:docs]
-passenv = http_proxy HTTP_PROXY https_proxy HTTPS_PROXY no_proxy NO_PROXY
+passenv = http_proxy
+    HTTP_PROXY
+    https_proxy
+    HTTPS_PROXY
+    no_proxy
+    NO_PROXY
 basepython = python3
 deps = -rdocs/requirements.txt
 commands =
     sphinx-build -q -W --keep-going -b html -n -d {envtmpdir}/doctrees ../docs/ {toxinidir}/docs/_build/html
 
 [testenv:docs-linkcheck]
-passenv = http_proxy HTTP_PROXY https_proxy HTTPS_PROXY no_proxy NO_PROXY
+passenv = http_proxy
+    HTTP_PROXY
+    https_proxy
+    HTTPS_PROXY
+    no_proxy
+    NO_PROXY
 basepython = python3
 deps = -rdocs/requirements.txt
 commands = sphinx-build -q -b linkcheck -d {envtmpdir}/doctrees ../docs/ {toxinidir}/docs/_build/linkcheck
 
 [testenv:checkbashisms]
 deps =
-whitelist_externals = sh
+allowlist_externals = sh
                       checkbashisms
                       sudo
                       find
 commands =
-    sh -c 'command checkbashisms>/dev/null || sudo yum install devscripts-minimal || (echo "checkbashisms command not found - please install it (e.g. sudo apt-get install devscripts | yum install devscripts-minimal )" >&2 && exit 1)'
+    sh -c 'command checkbashisms>/dev/null || sudo yum install -y devscripts-checkbashisms || sudo yum install -y devscripts-minimal || sudo yum install -y devscripts \
+        || sudo yum install -y https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/31/Everything/x86_64/os/Packages/d/devscripts-checkbashisms-2.19.6-2.fc31.x86_64.rpm \
+        || (echo "checkbashisms command not found - please install it \
+             (e.g. sudo apt-get install devscripts | yum install devscripts-minimal )" >&2 && exit 1)'
     find . -not -path '*/\.*' -name *.sh -exec checkbashisms -f  \{\} +
 
 [testenv:spelling]
@@ -251,21 +351,21 @@ commands =
 [testenv:pylint_full]
 basepython = python3
 deps = pylint>=2.6.0
-whitelist_externals = find
+allowlist_externals = find
 commands =
     find transportpce_tests/ -name *.py -exec pylint --fail-under=9.22 --max-line-length=120 --disable=missing-docstring --module-rgx="([a-z0-9_]+$)|([0-9.]{1,30}$)" --method-rgx="(([a-z_][a-zA-Z0-9_]{2,})|(_[a-z0-9_]*)|(__[a-zA-Z][a-zA-Z0-9_]+__))$" --variable-rgx="[a-zA-Z_][a-zA-Z0-9_]{1,30}$" --reports=y --score=y  --output-format=colorized  \{\} +
 
 [testenv:pylint]
 basepython = python3
 deps = pylint>=2.6.0
-whitelist_externals = find
+allowlist_externals = find
 commands =
-    find transportpce_tests/ -name *.py -exec pylint --fail-under=10 --max-line-length=120 --disable=missing-docstring --disable=fixme --disable=duplicate-code --module-rgx="([a-z0-9_]+$)|([0-9.]{1,30}$)" --method-rgx="(([a-z_][a-zA-Z0-9_]{2,})|(_[a-z0-9_]*)|(__[a-zA-Z][a-zA-Z0-9_]+__))$" --variable-rgx="[a-zA-Z_][a-zA-Z0-9_]{1,30}$" \{\} +
+    find transportpce_tests/ -name *.py -exec pylint --fail-under=10 --max-line-length=120 --disable=missing-docstring,import-error --disable=fixme --disable=duplicate-code --module-rgx="([a-z0-9_]+$)|([0-9.]{1,30}$)" --method-rgx="(([a-z_][a-zA-Z0-9_]{2,})|(_[a-z0-9_]*)|(__[a-zA-Z][a-zA-Z0-9_]+__))$" --variable-rgx="[a-zA-Z_][a-zA-Z0-9_]{1,30}$" \{\} +
 
 [testenv:pyang]
 basepython = python3
 deps = pyang
-whitelist_externals = find
+allowlist_externals = find
 commands =
     pyang --version
     find ../api/ -name target -prune -o -name *.yang -exec pyang --lint --canonical --max-line-length=120 -p../api/src/main/yang/:../ordmodels/common/src/main/yang/:../ordmodels/service/src/main/yang/:../tapimodels/src/main/yang/ \{\} +
@@ -274,7 +374,7 @@ commands =
 [testenv:pyangformat]
 basepython = python3
 deps = pyang
-whitelist_externals = sh
+allowlist_externals = sh
 commands =
     pyang --version
     sh -c 'find ../api/ -name target -prune -o -name *.yang -print | while read -r fname; do pyang -f yang --yang-canonical --yang-remove-unused-imports --max-line-length=120 --keep-comments -p../api/src/main/yang/:../ordmodels/common/src/main/yang/:../ordmodels/service/src/main/yang/:../tapimodels/src/main/yang/ "$fname"  -o /tmp/tmpfile.$$ && mv /tmp/tmpfile.$$ "$fname";done'
@@ -303,14 +403,16 @@ commands =
 basepython = python3
 deps = pre-commit
 passenv = HOME
+allowlist_externals = sh
+                      cpan
+                      sudo
+                      which
 commands =
+    sh -c 'which cpan || sudo yum install -y perl-CPAN  \
+        || (echo "cpan command not found - please install it \
+             (e.g. sudo apt-get install perl-modules | yum install perl-CPAN )" >&2 && exit 1)'
     pre-commit run --all-files --show-diff-on-failure
-    pre-commit run gitlint --hook-stage commit-msg --commit-msg-filename .git/COMMIT_EDITMSG
-    # Gitlint only proposes a pre-commit configuration for the commit-msg stage but none for the commit stage.
-    # Its default arguments --passed and --msg-filename are different from CI recommandations.
-    # As a result, the line above is always skipped in jenkins CI since there cannot be a .git/COMMIT_EDITMSG file.
-    # A dedicated gitlint profile for CI is proposed below. Also to behave fine locally, this profile must have access
-    # to the HOME variable so that Gitlint can retrieve Git user settings.
+    pre-commit run gitlint-ci --hook-stage manual
 
 [testenv:gitlint]
 basepython = python3
@@ -318,3 +420,20 @@ deps = gitlint
 commands =
     gitlint --config ../.gitlint
 
+[testenv:allure-report-init]
+basepython = python3
+deps = allure-pytest>=2.10.0
+# allure is under Apache License 2.0
+allowlist_externals =
+    mkdir
+    sed
+commands =
+    mkdir -p allure-report
+    sed -i_ '$a\allure-pytest # Apache License 2.0' ./test-requirements.txt
+
+[testenv:allure-report-serve]
+basepython = python3
+allowlist_externals =
+    allure
+commands =
+    allure serve "allure-report"